mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
c5695baf2d
The claude-sdk-python agent :8000 wedges under D6/LLM load: two synchronous anthropic.Anthropic().messages.create() calls run directly on the uvicorn asyncio event loop, freezing it for the full LLM round-trip so /health stops responding. The watchdog counts 3 consecutive failures (~90s) and kill-restarts the container, dropping active sessions. Root cause (sync-in-async), all in integrations/claude-sdk-python/: - src/agents/agent.py: _execute_tool's generate_a2ui branch builds a sync anthropic.Anthropic() and calls messages.create() synchronously; invoked on the loop from run_agent's agentic loop AND from the Claude-Agent-SDK MCP tool handler in claude_agent_sdk_adapter.py. - src/agents/a2ui_dynamic.py: _generate_a2ui, same sync pattern, invoked on the loop from the run_a2ui_dynamic_agent generator. Fix: wrap every async call site in `await asyncio.to_thread(...)` (lowest blast radius — the sync functions and the shared ExecuteTool callback type are unchanged, and the whole tool-dispatch path is fixed uniformly, not just generate_a2ui): - agent.py run_agent call site - claude_agent_sdk_adapter.py MCP tool handler - a2ui_dynamic.py secondary call site Blast radius: claude-sdk-python only. a2ui_dynamic.py is per-integration (each framework has its own copy); every other claude-sdk-python agent already uses AsyncAnthropic. The `tools` symlink to shared/python was not touched. entrypoint.sh: drop the Slack alert from the :8000 agent watchdog branch (keep the kill-restart — it self-heals silently now that the root cause is fixed); keep the LOUD #oss-alerts page on the public $PORT /api/health branch. Adds showcase/tests/repro/async-wedge/ — a faithful RED/GREEN harness driving the real anthropic sync client against a controllable slow endpoint, plus a mutation guard on the real _generate_a2ui.
6.9 KiB
Executable File
6.9 KiB
Executable File