from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_core.messages import HumanMessage, ToolMessage

load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
calculator = load_tools(["llm-math"], llm=llm)[0]   # 01 과 같은 빌트인 계산기

# (1) 정답 — 도구를 LLM 에 알린다
llm_with_tools = llm.bind_tools([calculator])

# (2) 정답 — 계산이 필요한 질문 → LLM 이 '도구를 쓰기로' 판단 (tool_calls 채워짐)
q = "53 * 7 + 2 는 얼마야?"
resp = llm_with_tools.invoke(q)
print("도구 호출 결정:", resp.tool_calls)

# (3) 정답 — 결정한 도구를 실제로 실행 → 결과(ToolMessage)를 다시 LLM 에 → 최종답
messages = [HumanMessage(q), resp]
for call in resp.tool_calls:
    result = calculator.invoke(call["args"])
    messages.append(ToolMessage(content=str(result), tool_call_id=call["id"]))
# 최종 답은 도구 없는 llm 으로 합성한다 (도구 바인딩된 걸로 하면 또 도구를 부르려 할 수 있음)
print("최종 답변:", llm.invoke(messages).content)

# (참고) 계산이 필요 없는 질문이면 도구를 안 쓴다 (tool_calls 가 빔 → 바로 답)
print("인사 질문 tool_calls:", llm_with_tools.invoke("안녕?").tool_calls)
