# ============================================================
# [실습] 도구 호출 — LLM이 도구를 쓸지 스스로 판단한다 (bind_tools)
#
# 02 의 계산기를 LLM 에 '알려주면'(bind_tools), LLM 이 질문을 보고 도구를 쓸지/말지 정한다.
# 쓰기로 하면 → 실제로 실행 → 결과를 다시 줘서 → 최종 답을 받는다 (도구 호출 한 사이클).
#
# 아래 항목을 직접 구현하세요:
#  1) llm.bind_tools([calculator]) 로 도구를 LLM 에 알린다.
#  2) 계산 질문을 invoke → 응답의 tool_calls(도구 호출 결정)를 확인한다.
#  3) 결정된 도구를 invoke 로 실행 → ToolMessage 로 붙여 다시 invoke → 최종 답을 받는다.
# ============================================================

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]   # 02 와 같은 빌트인 계산기

# 1) 여기에 코드를 작성하세요 (llm_with_tools = llm.bind_tools([calculator]))


q = "53 * 7 + 2 는 얼마야?"

# 2) 여기에 코드를 작성하세요 (resp = llm_with_tools.invoke(q) → resp.tool_calls 출력)


# 3) 여기에 코드를 작성하세요
#    (messages 에 HumanMessage(q), resp 넣고 → 각 tool_call 실행해 ToolMessage 붙이기
#     → 최종 답은 도구 없는 llm.invoke(messages).content 로 합성해 출력)


# (참고) 계산이 필요 없는 질문이면 tool_calls 가 빈다 → llm_with_tools.invoke("안녕?").tool_calls
