diff --git a/.gitea/workflows/build-push-agent.yaml b/.gitea/workflows/build-push-agent.yaml index 0f3e600..4525a0f 100644 --- a/.gitea/workflows/build-push-agent.yaml +++ b/.gitea/workflows/build-push-agent.yaml @@ -22,15 +22,12 @@ jobs: username: ${{ gitea.actor }} password: ${{ secrets.ACTIONS_PUSH_TOKEN }} - - name: Install uv - run: | - curl -LsSf https://astral.sh/uv/install.sh | sh - echo "$HOME/.local/bin" >> $GITHUB_PATH + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Build with langgraph - working-directory: ./web/agent - run: | - uv run langgraph build -t git.seaturtle.pw/cavepedia/cavepediav2-agent:latest - - - name: Push image - run: docker push git.seaturtle.pw/cavepedia/cavepediav2-agent:latest + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: ./web/agent + push: true + tags: git.seaturtle.pw/cavepedia/cavepediav2-agent:latest diff --git a/web/agent/pyproject.toml b/web/agent/pyproject.toml index 39d5173..d12980c 100644 --- a/web/agent/pyproject.toml +++ b/web/agent/pyproject.toml @@ -16,5 +16,4 @@ dependencies = [ "docstring-parser>=0.17.0", "jsonschema>=4.25.1", "copilotkit>=0.1.0", - "ag-ui-langgraph>=0.0.4", ] diff --git a/web/agent/server.py b/web/agent/server.py index 5c1d7b1..939935c 100644 --- a/web/agent/server.py +++ b/web/agent/server.py @@ -1,5 +1,5 @@ """ -Self-hosted LangGraph agent server using CopilotKit's AG-UI protocol. +Self-hosted LangGraph agent server using CopilotKit. """ import os @@ -7,23 +7,36 @@ from fastapi import FastAPI import uvicorn from dotenv import load_dotenv -from copilotkit import LangGraphAGUIAgent -from ag_ui_langgraph import add_langgraph_fastapi_endpoint +from copilotkit import CopilotKitRemoteEndpoint, LangGraphAgent +from copilotkit.integrations.fastapi import add_fastapi_endpoint from main import graph load_dotenv() app = FastAPI(title="Cavepedia Agent") -add_langgraph_fastapi_endpoint( - app=app, - agent=LangGraphAGUIAgent( - name="vpi_1000", - description="AI assistant with access to cave-related information through the Cavepedia MCP server", - graph=graph, - ), - path="/", -) + +def build_agents(context): + """Build agents with auth context from frontend.""" + user_roles = context.get("properties", {}).get("auth0_user_roles", []) + return [ + LangGraphAgent( + name="vpi_1000", + description="AI assistant with access to cave-related information through the Cavepedia MCP server", + graph=graph, + langgraph_config={ + "configurable": { + "context": { + "auth0_user_roles": user_roles, + } + } + }, + ) + ] + + +sdk = CopilotKitRemoteEndpoint(agents=build_agents) +add_fastapi_endpoint(app, sdk, "/copilotkit") @app.get("/health") diff --git a/web/agent/uv.lock b/web/agent/uv.lock index 4cb73d9..0bde7b9 100644 --- a/web/agent/uv.lock +++ b/web/agent/uv.lock @@ -1006,7 +1006,6 @@ name = "vpi-1000" version = "1.0.0" source = { virtual = "." } dependencies = [ - { name = "ag-ui-langgraph" }, { name = "anthropic" }, { name = "copilotkit" }, { name = "docstring-parser" }, @@ -1023,7 +1022,6 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "ag-ui-langgraph", specifier = ">=0.0.4" }, { name = "anthropic", specifier = ">=0.40.0" }, { name = "copilotkit", specifier = ">=0.1.0" }, { name = "docstring-parser", specifier = ">=0.17.0" }, diff --git a/web/src/app/api/copilotkit/route.ts b/web/src/app/api/copilotkit/route.ts index 3ab95f5..ae3baeb 100644 --- a/web/src/app/api/copilotkit/route.ts +++ b/web/src/app/api/copilotkit/route.ts @@ -2,7 +2,6 @@ import { CopilotRuntime, ExperimentalEmptyAdapter, copilotRuntimeNextJSAppRouterEndpoint, - LangGraphHttpAgent, } from "@copilotkit/runtime"; import { NextRequest } from "next/server"; @@ -23,13 +22,17 @@ export const POST = async (req: NextRequest) => { console.log("[copilotkit] session exists:", !!session); console.log("[copilotkit] userRoles:", userRoles); - // 2. Create the CopilotRuntime instance with self-hosted agent + // 2. Create the CopilotRuntime instance with remote endpoint const runtime = new CopilotRuntime({ - agents: { - "vpi_1000": new LangGraphHttpAgent({ - url: process.env.LANGGRAPH_DEPLOYMENT_URL || "http://localhost:8000", - }), - } + remoteEndpoints: [ + { + url: `${process.env.LANGGRAPH_DEPLOYMENT_URL || "http://localhost:8000"}/copilotkit`, + }, + ], + // Pass auth context as properties to the remote endpoint + properties: { + auth0_user_roles: userRoles, + }, }); const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({