Skip to content

Claude Code Providers

AiCore ships two LLM providers built on the Claude Agents Python SDK that allow you to route completions through your Claude subscription without an Anthropic API key.


ClaudeCodeBase

Both providers inherit from ClaudeCodeBase, a shared abstract base in aicore/llm/providers/claude_code/local.py. It provides:

MethodDescription
_to_prompt_string()Flattens str, BaseModel, RootModel, and list inputs into a single string
_extract_stream_delta()Extracts text_delta text from a StreamEvent
_extract_text_and_usage()Iterates collected messages and returns (text, input_tokens, output_tokens, cost, session_id)
_process_message()Processes a single SDK message — fires tool_callback, emits TOOL_CALL_START_TOKEN / TOOL_CALL_END_TOKEN, and streams text deltas
connect_to_mcp()No-op — MCP servers are passed directly to ClaudeAgentOptions
validate_config()No-op — auth is external

ClaudeCodeLlm

File: aicore/llm/providers/claude_code/local.pyProvider name: "claude_code"

Drives the Claude Code CLI directly via claude-agent-sdk's query() function. Each call is stateless — a fresh SDK session is created per acomplete() call; multi-turn behaviour is handled internally via max_turns.

How a call works

Key behaviour

  • CLAUDECODE and CLAUDE_CODE_ENTRYPOINT env vars are temporarily unset during the call to prevent recursive CLI invocations.
  • Cost is taken from ResultMessage.total_cost_usd rather than a pricing table.
  • If cli_path is set it overrides the claude binary on PATH.

RemoteClaudeCodeLlm

File: aicore/llm/providers/claude_code/remote.pyProvider name: "remote_claude_code"

Connects to a running aicore-proxy-server over HTTP SSE, reconstructing the SDK message stream locally. The call path is identical to ClaudeCodeLlm from the caller's perspective.

How a call works

SSE event types

Event typeSDK type reconstructed
stream_eventStreamEvent
assistant_messageAssistantMessage
user_messageUserMessage
result_messageResultMessage
system_messageSystemMessage
errorraises RuntimeError

Health check

On initialisation RemoteClaudeCodeLlm performs a GET /health check against the proxy. Disable it with skip_health_check: true in the config when you know the server is up.


Proxy Server (aicore-proxy-server)

File: aicore/scripts/claude_code_proxy_server.pyEntry point: aicore-proxy-server (registered via setup.py console_scripts)

A FastAPI SSE server that wraps claude-agent-sdk.query(). It handles bearer token auth, optional tunnel setup, CWD whitelisting, and active-stream tracking.

See the full proxy server reference for CLI options, tunnel modes, and API endpoints.


Package layout

aicore/
├── llm/
│   └── providers/
│       └── claude_code/
│           ├── __init__.py   ← re-exports ClaudeCodeLlm, RemoteClaudeCodeLlm, ClaudeCodeBase
│           ├── local.py      ← ClaudeCodeBase + ClaudeCodeLlm
│           └── remote.py     ← RemoteClaudeCodeLlm
└── scripts/
    └── claude_code_proxy_server.py   ← aicore-proxy-server entry point

Released under the MIT License.