2.1.9 breaks SDK subprocess initialization - 'Control request timeout: initialize'

Resolved 💬 3 comments Opened Jan 16, 2026 by banddude Closed Jan 20, 2026

Environment

  • claude-agent-sdk version: 0.1.18
  • Claude Code CLI version: 2.1.9 (broken), 2.1.7 (works)
  • Python: 3.10.13
  • OS: macOS (Darwin)
  • Auth: CLAUDE_CODE_OAUTH_TOKEN (subscription-based)

Summary

Upgrading from Claude Code 2.1.7 to 2.1.9 breaks the Python SDK's ability to initialize the subprocess. Downgrading to 2.1.7 immediately fixes the issue.

Timeline

  • Jan 15, 2026 at 18:18 - Claude Code auto-updated to 2.1.9
  • Jan 15, 2026 at 18:20 - SDK connections started failing with "Control request timeout: initialize"
  • Jan 16, 2026 at 12:05 - Downgraded to 2.1.7, SDK works again immediately

Symptoms

  1. await client.connect() times out after 60s with "Control request timeout: initialize"
  2. Zombie processes accumulate: claude --output-format stream-json --verbose ... (60-70% CPU each)
  3. CLI works perfectly when called directly: echo "hi" | claude --print --model opus
  4. After killing zombie processes and downgrading to 2.1.7, everything works

Reproduction

from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
import asyncio

async def test():
    options = ClaudeAgentOptions(
        cwd="/path/to/dir",
        permission_mode="bypassPermissions"
    )
    client = ClaudeSDKClient(options=options)
    await client.connect()  # Times out on 2.1.9, works on 2.1.7

asyncio.run(test())

Workaround

Downgrade to 2.1.7:

ln -sf ~/.local/share/claude/versions/2.1.7 ~/.local/bin/claude

Related

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗