# ai-assistant-chat > Build self-hosted AI chat assistants using CopilotKit + LangGraph. Use when implementing conversational AI interfaces with agentic backends, streaming responses, shared state between frontend and backend, or generative UI. This pattern uses NO hosted services - both CopilotKit runtime and LangGraph agent run on your own infrastructure. Triggers on requests to build chat interfaces, AI assistants, conversational agents, or integrate LangGraph with React frontends. - Author: Anthony Agnone - Repository: aagnone3/agui-langgraph - Version: 20260112165027 - Stars: 1 - Forks: 1 - Last Updated: 2026-02-07 - Source: https://github.com/aagnone3/agui-langgraph - Web: https://mule.run/skillshub/@@aagnone3/agui-langgraph~ai-assistant-chat:20260112165027 --- --- name: ai-assistant-chat description: Build self-hosted AI chat assistants using CopilotKit + LangGraph. Use when implementing conversational AI interfaces with agentic backends, streaming responses, shared state between frontend and backend, or generative UI. This pattern uses NO hosted services - both CopilotKit runtime and LangGraph agent run on your own infrastructure. Triggers on requests to build chat interfaces, AI assistants, conversational agents, or integrate LangGraph with React frontends. --- # Self-Hosted AI Assistant Chat (CopilotKit + LangGraph) Build production-ready AI chat interfaces with full infrastructure control. This pattern connects a Next.js frontend (CopilotKit) to a Python backend (LangGraph) without relying on any hosted AI orchestration services. ## What This Pattern Is NOT - **NOT Hosted CopilotKit**: No `cloud.copilotkit.ai` - the CopilotKit runtime runs in your Next.js API route - **NOT Hosted LangGraph**: No LangSmith Cloud or LangGraph Platform - the agent runs on a self-hosted FastAPI server - **NOT SaaS Dependencies**: Full control over data flow, no external orchestration services ## Architecture Overview ``` Browser ↓ (HTTP/SSE) Next.js Frontend (port 3000) ├── React UI (CopilotKit components) └── /api/copilotkit (CopilotRuntime bridge) ↓ (HTTP POST) FastAPI Backend (port 8123) ├── LangGraph Agent (state machine) └── Tool Execution (backend + frontend actions) ``` For detailed architecture diagrams and data flow: See [references/architecture.md](references/architecture.md) ## Quick Start ### 1. Frontend Setup (Next.js + CopilotKit) Install CopilotKit packages: ```bash pnpm add @copilotkit/react-core @copilotkit/react-ui @copilotkit/runtime ``` Wrap app with CopilotKit provider pointing to local runtime: ```tsx // layout.tsx import { CopilotKit } from "@copilotkit/react-core"; export default function Layout({ children }) { return ( {children} ); } ``` Create the runtime bridge (this is the self-hosted runtime): ```ts // app/api/copilotkit/route.ts import { CopilotRuntime, ExperimentalEmptyAdapter } from "@copilotkit/runtime"; import { LangGraphHttpAgent } from "@copilotkit/runtime/agents"; const AGENT_URL = process.env.AGENT_URL || "http://localhost:8123"; export async function POST(req: Request) { const agent = new LangGraphHttpAgent({ name: "my_agent", url: AGENT_URL, agentId: "my_agent", }); const runtime = new CopilotRuntime({ agents: [agent], modelAdapter: new ExperimentalEmptyAdapter(), }); return runtime.streamHttpServerResponse(req, req.headers); } ``` For complete frontend setup: See [references/frontend-setup.md](references/frontend-setup.md) ### 2. Backend Setup (FastAPI + LangGraph) Install Python dependencies: ```bash pip install langgraph langchain-openai copilotkit ag-ui-langgraph fastapi uvicorn ``` Create the LangGraph agent: ```python # agent/src/agent.py from langgraph.graph import StateGraph, END from copilotkit import CopilotKitState class AgentState(CopilotKitState): # Add custom state fields synced with frontend custom_data: list[str] = [] def chat_node(state: AgentState, config): model = ChatOpenAI(model="gpt-4o") # Bind tools from CopilotKit state model_with_tools = model.bind_tools(state.copilotkit.tools) response = model_with_tools.invoke(state.messages, config) return {"messages": [response]} # Build graph workflow = StateGraph(AgentState) workflow.add_node("chat", chat_node) workflow.set_entry_point("chat") graph = workflow.compile(checkpointer=MemorySaver()) ``` Create FastAPI server: ```python # agent/main.py from fastapi import FastAPI from ag_ui.langgraph import LangGraphAGUIAgent app = FastAPI() agent = LangGraphAGUIAgent(graph=graph, config={"configurable": {"thread_id": "1"}}) @app.post("/") async def run_agent(request: Request): return agent.run(request) ``` For complete backend setup: See [references/backend-setup.md](references/backend-setup.md) ## Key Integration Points ### Shared State State defined in `AgentState` automatically syncs between frontend and backend: ```tsx // Frontend: Access shared state const { state } = useCoAgent(); console.log(state.custom_data); ``` ```python # Backend: Modify shared state def my_node(state: AgentState): return {"custom_data": state.custom_data + ["new item"]} ``` ### Frontend Actions (Generative UI) Define actions in React that the backend can invoke: ```tsx useCopilotAction({ name: "render_weather", description: "Display weather card", parameters: [{ name: "location", type: "string" }], renderAndWaitForResponse: ({ args }) => , }); ``` The agent can call `render_weather` and receive user responses. ### Backend Tools Define tools that execute server-side: ```python @tool def search_database(query: str) -> str: """Search the internal database.""" return db.search(query) # Add to model binding model.bind_tools([search_database] + state.copilotkit.tools) ```