from langchain_anthropic import ChatAnthropic from langchain_openai.chat_models import ChatOpenAI from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.prompts import ChatPromptTemplate from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables import Runnable, RunnableConfig from langgraph.checkpoint.sqlite import SqliteSaver from erp_core.state_definer import State import time from datetime import datetime import getpass class Assistant: """ Assistant class to handle the conversation with the user. """ def __init__(self, runnable: Runnable): self.runnable = runnable def __call__(self, state: State, config: RunnableConfig): while True: result = self.runnable.invoke(state) if not result.tool_calls and ( not result.content or isinstance(result.content, list) and not result.content[0].get("text") ): messages = state["messages"] + [("user", "Respond with a real output.")] state = {**state, "messages": messages} messages = state["messages"] + [("user", "Respond with a real output.")] state = {**state, "messages": messages} else: break return {"messages": result} class CompleteOrEscalate(BaseModel): """A tool to mark the current task as completed and/or to escalate control of the dialog to the main assistant, who can re-route the dialog based on the user's needs.""" cancel: bool = True reason: str class Config: schema_extra = { "example": { "cancel": True, "reason": "User changed their mind about the current task.", }, "example 2": { "cancel": True, "reason": "I have fully completed the task.", }, "example 3": { "cancel": False, "reason": "I need to search the user's emails or calendar for more information.", }, }