Files
copilotkit__copilotkit/examples/integrations/claude-sdk-python/docker-compose.test.yml
Tyler Slaton 36020b061f feat(examples): add Claude Agent SDK starters (Python + TypeScript)
Two clonable starter templates showing CopilotKit driving a Claude Agent SDK
agent over AG-UI, mirroring the langgraph-python showcase (todos canvas, charts,
flight cards, dynamic dashboards, HITL, theme, threads drawer).

Each agent is a thin, idiomatic layer on the official ag-ui-claude-sdk /
@ag-ui/claude-agent-sdk adapters: three backend tools (query_data, search_flights,
generate_a2ui) live in per-tool modules and are wired into ClaudeAgentAdapter,
while the shared todo board is driven by the adapter's built-in ag_ui_update_state
tool. The default model is claude-sonnet-5 and local dev uses a real
ANTHROPIC_API_KEY (matching the official AG-UI dojo). Both instances are
registered in the _parity manifest so their frontends stay synced with the
langgraph-python north-star.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:27:28 -07:00

52 lines
1.6 KiB
YAML

# Docker Compose stack for a no-key build + boot smoke.
#
# Builds and starts the Next.js frontend + the Claude Agent SDK (FastAPI/uvicorn)
# agent and checks both are healthy. This does NOT exercise the LLM: the Claude
# Agent SDK drives Claude via the bundled Claude Code CLI, which can't be mocked
# — running an actual turn requires a real ANTHROPIC_API_KEY.
#
# Usage: docker compose -f docker-compose.test.yml up --build --wait
services:
agent:
build:
context: ./agent
dockerfile: ../docker/Dockerfile.agent
environment:
# A real key is only needed to run a turn; the build + /health check don't
# call the LLM. Pass ANTHROPIC_API_KEY in the environment to try a real turn.
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-placeholder}
healthcheck:
test:
[
"CMD",
"python",
"-c",
"import urllib.request; urllib.request.urlopen('http://localhost:8000/health')",
]
interval: 5s
timeout: 5s
retries: 30
start_period: 30s
app:
build:
context: .
dockerfile: docker/Dockerfile.app
environment:
- AGENT_URL=http://agent:8000
depends_on:
agent:
condition: service_healthy
healthcheck:
test:
[
"CMD",
"node",
"-e",
"const http = require('http'); const req = http.get('http://localhost:3000/', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); }); req.on('error', () => process.exit(1)); req.setTimeout(2000, () => { req.destroy(); process.exit(1); });",
]
interval: 5s
timeout: 10s
retries: 30
start_period: 60s