# ============================================================
# [공용 헬퍼] 에이전트 thinking 출력
#
# 에이전트를 stream 으로 실행하며 '생각→행동 / 관찰 / 답변' 을 단계별로 출력한다.
# (옛 AgentExecutor(verbose=True) 처럼 진행 과정이 착착 보이도록)
#   - stream_mode="updates": 한 단계(노드)가 끝날 때마다 그 결과만 흘려보낸다.
# ============================================================


def run_agent(agent, question, config=None):
    """agent 를 실행하며 ReAct 흐름(생각 → 행동 → 관찰 → 최종답)을 단계별로 출력한다.

    - [생각] : 모델이 도구를 쓰기 전에 말로 남긴 이유 (시스템 프롬프트로 유도하면 나온다)
    - [행동] : 어떤 도구를 어떤 인자로 호출하는지
    - [관찰] : 도구 실행 결과
    - [답변] : 최종 답변
    """
    print(f"[질문] {question}")
    for update in agent.stream(
        {"messages": [("user", question)]}, config=config, stream_mode="updates"
    ):
        for node_output in update.values():
            for m in node_output["messages"]:
                if m.type == "ai" and m.tool_calls:       # 도구를 쓰기로 판단한 단계
                    if m.content:                         # 모델이 본문에 이유를 적었으면
                        print(f"[생각] {m.content}")
                    for tc in m.tool_calls:
                        args = dict(tc["args"])
                        # 도구에 thought 인자가 있으면 '왜 쓰는지'가 반드시 채워진다 → 생각으로 출력
                        thought = args.pop("thought", None)
                        if thought:
                            print(f"[생각] {thought}")
                        print(f"[행동] {tc['name']}({args}) 호출")
                elif m.type == "tool":                    # 도구 실행 결과(관찰)
                    print(f"[관찰] {m.content}")
                elif m.type == "ai" and m.content:        # 최종 답변
                    print(f"[답변] {m.content}")
