from contextlib import asynccontextmanager from fastapi import FastAPI from app.agent.graph import run_agent from app.config import get_settings from app.db.postgres import close_pool, open_pool from app.db.neo4j import verify_connectivity, close_driver from app.schemas.request import ChatRequest from app.schemas.response import ChatResponse from app.memory.redis_checkpointer import get_checkpointer, close_checkpointer from app.agent.graph import build_agent settings = get_settings() @asynccontextmanager async def lifespan(app: FastAPI): await open_pool() await verify_connectivity() checkpointer = await get_checkpointer() build_agent(checkpointer) yield await close_pool() await close_driver() await close_checkpointer() app = FastAPI(title="chat-service", version="0.1.0", lifespan=lifespan) @app.get("/health") def health() -> dict: return {"status": "ok"} @app.post("/chat", response_model=ChatResponse) async def chat(payload: ChatRequest) -> ChatResponse: """ Milestone 2: routes through the LangGraph ReAct agent, which can call sql_query_tool to answer questions grounded in the analyzed-articles DB. """ result = await run_agent( message=payload.message, session_id=payload.session_id, user_id=payload.user_id, ) return ChatResponse( session_id=payload.session_id, answer=result["answer"], sources=result["sources"], )