diff --git a/.gitea/workflows/build-push-agent.yaml b/.gitea/workflows/build-push-agent.yaml index 4525a0f..0f3e600 100644 --- a/.gitea/workflows/build-push-agent.yaml +++ b/.gitea/workflows/build-push-agent.yaml @@ -22,12 +22,15 @@ jobs: username: ${{ gitea.actor }} password: ${{ secrets.ACTIONS_PUSH_TOKEN }} - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + - name: Install uv + run: | + curl -LsSf https://astral.sh/uv/install.sh | sh + echo "$HOME/.local/bin" >> $GITHUB_PATH - - name: Build and push - uses: docker/build-push-action@v6 - with: - context: ./web/agent - push: true - tags: git.seaturtle.pw/cavepedia/cavepediav2-agent:latest + - 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 diff --git a/web/README.md b/web/README.md index 00028d9..ffce657 100644 --- a/web/README.md +++ b/web/README.md @@ -61,12 +61,12 @@ docker build -t cavepediav2-agent . ### Running in production -The agent requires PostgreSQL and Redis for persistence and pub/sub: +The agent requires PostgreSQL and Valkey for persistence and pub/sub: ```bash docker run \ -p 8123:8000 \ - -e REDIS_URI="redis://redis:6379" \ + -e REDIS_URI="redis://valkey:6379" \ -e DATABASE_URI="postgres://user:pass@postgres:5432/langgraph" \ -e GOOGLE_API_KEY="your-key" \ -e LANGSMITH_API_KEY="your-key" \ @@ -77,8 +77,8 @@ Or use Docker Compose with the required services: ```yaml services: - redis: - image: redis:7 + valkey: + image: valkey/valkey:9 postgres: image: postgres:16 @@ -92,11 +92,11 @@ services: ports: - "8123:8000" environment: - REDIS_URI: redis://redis:6379 + REDIS_URI: redis://valkey:6379 DATABASE_URI: postgres://langgraph:langgraph@postgres:5432/langgraph GOOGLE_API_KEY: ${GOOGLE_API_KEY} depends_on: - - redis + - valkey - postgres ``` @@ -104,6 +104,59 @@ services: The agent image is automatically built and pushed to `git.seaturtle.pw/cavepedia/cavepediav2-agent:latest` on push to `main` via Gitea Actions. +## Web Deployment + +### Environment Variables + +| Variable | Required | Default | Description | +|----------|----------|---------|-------------| +| `LANGGRAPH_DEPLOYMENT_URL` | Yes | `http://localhost:8123` | URL to the LangGraph agent | +| `AUTH0_SECRET` | Yes | - | Session encryption key (`openssl rand -hex 32`) | +| `AUTH0_DOMAIN` | Yes | - | Auth0 tenant domain | +| `AUTH0_CLIENT_ID` | Yes | - | Auth0 application client ID | +| `AUTH0_CLIENT_SECRET` | Yes | - | Auth0 application client secret | +| `APP_BASE_URL` | Yes | - | Public URL of the app | +| `LANGSMITH_API_KEY` | No | - | LangSmith API key for tracing | + +### Docker Compose (Full Stack) + +```yaml +services: + web: + image: git.seaturtle.pw/cavepedia/cavepediav2-web:latest + ports: + - "3000:3000" + environment: + LANGGRAPH_DEPLOYMENT_URL: http://agent:8000 + AUTH0_SECRET: ${AUTH0_SECRET} + AUTH0_DOMAIN: ${AUTH0_DOMAIN} + AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID} + AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET} + APP_BASE_URL: ${APP_BASE_URL} + depends_on: + - agent + + agent: + image: git.seaturtle.pw/cavepedia/cavepediav2-agent:latest + environment: + REDIS_URI: redis://valkey:6379 + DATABASE_URI: postgres://langgraph:langgraph@postgres:5432/langgraph + GOOGLE_API_KEY: ${GOOGLE_API_KEY} + depends_on: + - valkey + - postgres + + valkey: + image: valkey/valkey:9 + + postgres: + image: postgres:16 + environment: + POSTGRES_DB: langgraph + POSTGRES_USER: langgraph + POSTGRES_PASSWORD: langgraph +``` + ## Available Scripts - `dev` - Start both UI and agent servers diff --git a/web/agent/Dockerfile b/web/agent/Dockerfile deleted file mode 100644 index 3c8ee0b..0000000 --- a/web/agent/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM python:3.13-slim - -WORKDIR /app - -# Install uv for fast dependency management -COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ - -# Copy dependency files -COPY pyproject.toml uv.lock ./ - -# Install dependencies -RUN uv sync --frozen --no-dev --no-install-project - -# Copy application code -COPY main.py langgraph.json ./ - -# LangGraph API server port -EXPOSE 8000 - -# Run LangGraph server -CMD ["uv", "run", "langgraph", "up", "--host", "0.0.0.0", "--port", "8000"] diff --git a/web/agent/langgraph.json b/web/agent/langgraph.json index 5d0cf52..86a34ac 100644 --- a/web/agent/langgraph.json +++ b/web/agent/langgraph.json @@ -1,10 +1,7 @@ { - "python_version": "3.12", - "dockerfile_lines": [], + "python_version": "3.13", "dependencies": ["."], - "package_manager": "uv", "graphs": { "vpi_1000": "./main.py:graph" - }, - "env": ".env" + } } diff --git a/web/src/app/api/copilotkit/route.ts b/web/src/app/api/copilotkit/route.ts index e2da359..0a16a06 100644 --- a/web/src/app/api/copilotkit/route.ts +++ b/web/src/app/api/copilotkit/route.ts @@ -26,9 +26,9 @@ export const POST = async (req: NextRequest) => { // 2. Create the CopilotRuntime instance with Auth0 configuration const runtime = new CopilotRuntime({ agents: { - "sample_agent": new LangGraphAgent({ + "vpi_1000": new LangGraphAgent({ deploymentUrl: process.env.LANGGRAPH_DEPLOYMENT_URL || "http://localhost:8123", - graphId: "sample_agent", + graphId: "vpi_1000", langsmithApiKey: process.env.LANGSMITH_API_KEY || "", assistantConfig: { context: { diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index 19c3b59..a05ecb9 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -19,7 +19,7 @@ export default function RootLayout({