diff --git a/main.py b/main.py index 770317e..1553d77 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,7 @@ """ Main entry point for the agent with memory and human‑in‑the‑loop confirmation. -The agent is built on top of LangChain's `create_agent` API. It uses a +The agent is built on top of LangChain's `create_tool_calling_agent` API. It uses a `MemorySaver` checkpoint to keep conversation history across calls, and it is configured with `interrupt_before=["tools"]` so that the agent pauses just before invoking any tool. The pause allows us to ask the user for explicit @@ -24,13 +24,13 @@ from __future__ import annotations import os import json -from typing import Any, Dict, Iterable, Tuple +from typing import Any, Dict from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from langgraph.checkpoint.memory import MemorySaver from langgraph.types import Command -from langchain.agents import create_agent +from langchain.agents import create_tool_calling_agent from langchain.tools import tool from rich.console import Console @@ -69,11 +69,11 @@ async def get_price(query: Dict[str, Any]) -> str: return f"The price of {product} is 42.00 {currency}." # --------------------------------------------------------------------------- -# Agent definition using create_agent (LangChain) +# Agent definition using create_tool_calling_agent (LangChain) # --------------------------------------------------------------------------- memory = MemorySaver() -agent = create_agent( +agent = create_tool_calling_agent( llm=llm, tools=[get_price], system_prompt="You are a helpful assistant that can query prices.", @@ -81,9 +81,6 @@ agent = create_agent( interrupt_before=["tools"], # pause before any tool call ) -# Compile the agent into a graph with checkpointing. -graph = agent.compile(checkpointer=memory, interrupt_before=["tools"]) - # --------------------------------------------------------------------------- # Helper to run the agent and pause before each tool call. # --------------------------------------------------------------------------- @@ -98,10 +95,10 @@ async def ask_and_run(user_input: Dict[str, Any], config: Dict[str, Any]): Configuration dictionary that must contain ``configurable`` with ``thread_id``. """ - async for chunk in graph.stream(user_input, config=config, stream_mode=["messages", "updates"]): + async for chunk in agent.stream(user_input, config=config, stream_mode=["messages", "updates"]): # ``chunk`` is a tuple (type, data). chunk_type, chunk_data = chunk - state = graph.get_state(config) + state = agent.get_state(config) if chunk_type == "messages": # Stream token by token. @@ -120,7 +117,7 @@ async def ask_and_run(user_input: Dict[str, Any], config: Dict[str, Any]): console.print("[red]Action cancelled by user.[/]") break # Resume from the same state. - await graph.ainvoke(Command(resume=None), config=config) + await agent.ainvoke(Command(resume=None), config=config) # --------------------------------------------------------------------------- # Main loop – three examples as requested.