Spaces:
Sleeping
Sleeping
import uuid | |
import os | |
import json | |
from langchain_core.messages import HumanMessage, AIMessage, AIMessageChunk | |
from langchain.schema.runnable.config import RunnableConfig | |
import chainlit as cl | |
import sys | |
from pathlib import Path | |
# Add the project root to the Python path | |
project_root = str(Path(__file__).parent.parent.parent) | |
if project_root not in sys.path: | |
sys.path.append(project_root) | |
from agent import create_agent_graph, get_checkpointer | |
from agent.utils.state import AgentState | |
SHORT_TERM_MEMORY_DB_PATH = "data/short_term.db" | |
os.makedirs(os.path.dirname(SHORT_TERM_MEMORY_DB_PATH), exist_ok=True) | |
async def on_chat_start(): | |
"""Initialize the chat session""" | |
try: | |
# Generate and store a session ID | |
session_id = str(uuid.uuid4()) | |
cl.user_session.set("session_id", session_id) | |
welcome_message = cl.Message( | |
content="Hello! I'm your chief joy officer, here to help you with finding fun things to do in London!", | |
author="Assistant" | |
) | |
await welcome_message.send() | |
except Exception as e: | |
print(f"Error in chat initialization: {str(e)}") | |
await cl.Message( | |
content="I apologize, but I encountered an error during initialization. Please try refreshing the page.", | |
author="System" | |
).send() | |
async def on_message(message: cl.Message): | |
"""Handle incoming messages and stream responses""" | |
# Initialize response message | |
msg = cl.Message(content="") | |
try: | |
async with cl.Step(type="run"): | |
async with get_checkpointer(SHORT_TERM_MEMORY_DB_PATH) as saver: | |
# Create graph with memory | |
graph = await create_agent_graph(saver) | |
# Get session ID | |
session_id = cl.user_session.get("session_id") | |
# Process through graph with current message | |
async for chunk in graph.astream( | |
{"messages": [HumanMessage(content=message.content)]}, | |
{"configurable": {"thread_id": session_id}}, | |
stream_mode="messages" | |
): | |
if chunk[1]["langgraph_node"] == "agent" and isinstance( | |
chunk[0], (AIMessageChunk, AIMessage) | |
): | |
await msg.stream_token(chunk[0].content) | |
# Get final state | |
final_state = await graph.aget_state( | |
config={"configurable": {"thread_id": session_id}} | |
) | |
# Send the final message | |
await msg.send() | |
except Exception as e: | |
print(f"Error in message handler: {str(e)}") | |
await cl.Message( | |
content="I apologize, but I encountered an error processing your message. Please try again.", | |
author="System" | |
).send() |