diff --git a/main.py b/main.py index 524ad89..8c1684d 100644 --- a/main.py +++ b/main.py @@ -4,8 +4,9 @@ from langchain.agents import create_agent from langchain.agents.middleware import HumanInTheLoopMiddleware from langgraph.checkpoint.memory import MemorySaver from langgraph.types import Command +from langchain.tools import tool -# LLM setup +# LLM configuration llm = ChatOpenAI( model="openai/gpt-oss-20b:free", base_url="https://openrouter.ai/api/v1", @@ -13,19 +14,15 @@ llm = ChatOpenAI( temperature=0.0, ) -# Simple tool: get_weather -from langchain.tools import tool - +# Simple weather tool @tool def get_weather(city: str, date: str = "сегодня") -> str: - """Return a mock weather description for the given city and date.""" - # In a real scenario, call an API. Here we return a placeholder. + """Return a mock weather description for a city and date.""" return f"Погода в {city} на {date}: солнечно, 25°C." -# Memory for middleware +# Agent with HumanInTheLoopMiddleware memory = MemorySaver() -# Agent with HumanInTheLoopMiddleware agent = create_agent( model=llm, tools=[get_weather], @@ -33,7 +30,7 @@ agent = create_agent( middleware=[ HumanInTheLoopMiddleware( interrupt_on={ - "get_weather": True, # allow approve, edit, reject + "get_weather": True, }, description_prefix="Подтвердите вызов инструмента", ), @@ -42,13 +39,12 @@ agent = create_agent( ) # Helper to process interrupt and get decisions - def handle_interrupt(interrupt_value): action_requests = interrupt_value["action_requests"] decisions = [] for idx, action in enumerate(action_requests, 1): name = action.get("name") - args = action.get("args") + args = action.get("args", {}) description = action.get("description", "") print(f"\n--- Подтверждение {idx} ---") print(f"Инструмент: {name}") @@ -61,7 +57,7 @@ def handle_interrupt(interrupt_value): decisions.append({"type": "approve"}) break elif choice == "r": - msg = input("Причина отказа: ") + msg = input("Сообщение для агента (причина отказа): ") decisions.append({"type": "reject", "message": msg}) break else: @@ -72,10 +68,10 @@ def handle_interrupt(interrupt_value): if __name__ == "__main__": config = {"configurable": {"thread_id": "сессия-1"}} while True: - user_input = input("Вы: ") + user_input = input("\nВы: ") if not user_input: continue - # Initial invoke + # First invoke result = agent.invoke( {"messages": [{"role": "human", "content": user_input}]}, config=config, @@ -85,10 +81,9 @@ if __name__ == "__main__": interrupt = result["__interrupt__"][0].value decisions = handle_interrupt(interrupt) result = agent.invoke(Command(resume={"decisions": decisions}), config=config) - # Final answer + # Output final answer if result.get("messages"): - answer = result["messages"][-1].content - print(f"\nАгент: {answer}\n") + print("\nАгент:", result["messages"][-1].content) else: - print("\nАгент не ответил.\n") + print("\nАгент не ответил.") # Continue loop for next user query