Spaces:
Running
Running
| import os | |
| from dotenv import load_dotenv | |
| from langchain_core.messages import AIMessage, HumanMessage | |
| from langchain_openai import ChatOpenAI | |
| from langgraph.prebuilt import create_react_agent | |
| from app.state.state import GraphState | |
| from app.tools.tools import check_book_availability_in_district | |
| load_dotenv() | |
| os.environ.setdefault("OPENAI_API_KEY", os.getenv("OPENAI_API_KEY", "")) | |
| tools = [check_book_availability_in_district] | |
| llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) | |
| system_prompt = """λΉμ μ λμκ΄ μ± μΆμ² νλ μ΄ν°μ λλ€. | |
| [μ μ°¨] | |
| 1. μΆμ² λμ 3κΆ κ°κ°μ λν΄ check_book_availability_in_district λꡬλ₯Ό νΈμΆνμΈμ. | |
| - district_name: μ¬μ©μ μ§μ ꡬ μ΄λ¦ (μ: κ°λ¨κ΅¬) | |
| - isbn13: κ° λμμ ISBN | |
| 2. λꡬ κ²°κ³Όλ₯Ό λ°νμΌλ‘ μλ μΆλ ₯ νμμ λ§κ² λ΅λ³μ μμ±νμΈμ. | |
| [μΆλ ₯ νμ - λ°λμ μ§ν¬ κ²] | |
| μΆμ² λμλ§λ€ μλ νμμΌλ‘ μμ±νμΈμ. | |
| --- | |
| π {μ± μ λͺ©} | {μ μ} | |
|  | |
| π μ± μκ° | |
| (μ λ¬λ°μ μ± μκ°λ₯Ό κ·Έλλ‘ μμ±) | |
| βοΈ μΆμ² μ΄μ | |
| (μ λ¬λ°μ μΆμ² μ΄μ λ₯Ό κ·Έλλ‘ μμ±) | |
| π λμΆ κ°λ₯ μ¬λΆ | |
| - (λμκ΄ μ΄λ¦): (λμΆ κ°λ₯) or (λμΆ μ€) or (λ―Έμμ₯) or (νμΈ λΆκ°) | |
| --- | |
| [μ£Όμμ¬ν] | |
| - μΆμ² λμ λͺ©λ‘μ 3κΆμ λ°λμ λͺ¨λ μ νμμΌλ‘ μΆλ ₯νμΈμ. μμΈλ μμ΅λλ€. | |
| - λμΆ κ°λ₯ μ¬λΆμ κ΄κ³μμ΄ 3κΆ μ λΆ μΆλ ₯νμΈμ. | |
| - νμ§ μ΄λ―Έμ§λ [μΆμ² λμ] λͺ©λ‘μ μ 곡λ cover_urlμ κ·Έλλ‘ μ¬μ©νμΈμ. λκ΅¬λ‘ κ°μ Έμ€μ§ μμ΅λλ€. | |
| - cover_urlμ΄ λΉμ΄ μμΌλ©΄ μ΄λ―Έμ§ λΌμΈμ μλ΅νμΈμ. | |
| - μ± μ μ κ±°νκ±°λ λ€λ₯Έ μ± μΌλ‘ λ체νλ κ²μ μ λ κΈμ§μ λλ€. | |
| - λμΆ μ 보λ λ°λμ λꡬ νΈμΆ κ²°κ³Όλ§ μ¬μ©νμΈμ. μ λ μ§μ΄λ΄μ§ λ§μΈμ. | |
| """ | |
| agent_executor = create_react_agent(llm, tools, prompt=system_prompt) | |
| def api_tool_calling_node(state: GraphState) -> dict: | |
| recommendations = state.get("recommendations", []) | |
| summary = state.get("summary", "") | |
| district = "μ€κ΅¬" | |
| if not recommendations: | |
| msg = "κ²μλ λμκ° μμ΄ μΆμ²μ μ 곡ν μ μμ΅λλ€." | |
| return {"messages": [AIMessage(content=msg)]} | |
| # retrieved_booksμμ ISBN κΈ°μ€μΌλ‘ μλ³Έ book_intro μ‘°ν (rag_llm_nodeμ 300μ μλ¦Ό μ°ν) | |
| retrieved_index = {b.get("isbn", ""): b for b in state.get("retrieved_books", [])} | |
| if isinstance(recommendations, str): | |
| rec_text = recommendations | |
| else: | |
| rec_text = "\n".join([ | |
| f"- μ λͺ©: {r['title']}, μ μ: {r['author']}, ISBN: {r['isbn']}, cover_url: {r.get('cover_url', '')}, " | |
| f"μ± μκ°: {retrieved_index.get(r['isbn'], {}).get('book_intro', r.get('book_intro', ''))}, " | |
| f"μΆμ² μ΄μ : {r['reason']}" | |
| for r in recommendations | |
| ]) | |
| query = f""" | |
| μλ μΆμ² λμ 3κΆμ {district} λμκ΄ λμΆ κ°λ₯ μ¬λΆλ₯Ό νμΈν΄μ μ΅μ’ μΆμ² λ΅λ³μ λ§λ€μ΄μ€. | |
| νμ§ μ΄λ―Έμ§λ κ° λμμ cover_urlμ κ·Έλλ‘ μ¬μ©ν΄. | |
| [μΆμ² λμ] | |
| {rec_text} | |
| [μ¬μ©μ νλ‘νμΌ] | |
| {summary} | |
| """ | |
| result = agent_executor.invoke({"messages": [HumanMessage(content=query)]}) | |
| return {"messages": [result["messages"][-1]]} | |