claude-rt
v0.1.0
Published
Transparent proxy for Claude Code — Anthropic passthrough, OpenAI transform, per-subagent routing
Maintainers
Readme
claude-rt
Transparent proxy for Claude Code. Anthropic traffic passes through unchanged, gpt-* models get routed to OpenAI.
Architecture
graph LR
subgraph Claude Code Agents
O["Orchestrator<br/><small>Claude Opus</small>"]
S1["SubAgent<br/><small>Claude Haiku</small>"]
S2["SubAgent<br/><small>GPT-5</small>"]
T["Team Member<br/><small>GPT-5</small>"]
end
RT["<b>claude-rt</b><br/><small>:8787</small>"]
A["Anthropic API<br/><small>passthrough</small>"]
OA["OpenAI API<br/><small>transform</small>"]
O --> RT
S1 --> RT
S2 --> RT
T --> RT
RT -->|raw bytes| A
RT -->|format convert| OATypical setup: Opus orchestrates, subagents and team members run on cheaper/specialized models to cut cost.
Per-agent routing is controlled via routing rules (model pattern match) or MODEL_ROUTE magic (system prompt override).
Quick Start
# Docker (recommended)
docker run -d --name claude-rt \
-p 8787:8787 \
-e OPENAI_API_KEY=sk-... \
ghcr.io/soju06/claude-rt:latest# Local
cp .env.example .env # add your OPENAI_API_KEY
bun install && bun run devThen connect Claude Code:
ANTHROPIC_BASE_URL=http://127.0.0.1:8787 claudeTo make this permanent, add to ~/.claude/settings.json:
{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8787"
}
}Examples
Local
Create config/runtime.local.json:
{
"providers": [
{
"id": "anthropic-main",
"type": "anthropic",
"baseUrl": "https://api.anthropic.com",
"mode": "passthrough"
},
{
"id": "openai-main",
"type": "openai",
"baseUrl": "https://api.openai.com/v1",
"apiKey": "sk-...",
"mode": "transform"
}
],
"routing": {
"version": 1,
"defaultProvider": "anthropic-main",
"routes": [
{ "id": "gpt-to-openai", "modelPattern": "^gpt-", "providers": ["openai-main"] }
]
}
}CONFIG_FILE=config/runtime.local.json bun run devDocker
Mount your config file into the container:
docker run -d --name claude-rt \
-p 8787:8787 \
-v $(pwd)/config/runtime.local.json:/app/config/runtime.local.json \
-e CONFIG_FILE=config/runtime.local.json \
ghcr.io/soju06/claude-rt:latestClaude models → Anthropic (passthrough), gpt-* models → OpenAI (transform). Routes are regex, first-match-wins.
Subagent Routing
Claude Code subagents can target a specific provider/model by adding a magic line as the first line of their system prompt:
[MODEL_ROUTE provider=openai-main model=gpt-5.3-codex]The proxy strips this line before forwarding. See .claude/agents/ for examples.
Configuration
Runtime config: config/runtime.example.json (copy to runtime.local.json for local overrides)
{
"providers": [
{ "id": "anthropic-main", "type": "anthropic", "baseUrl": "https://api.anthropic.com" },
{ "id": "openai-main", "type": "openai", "baseUrl": "https://api.openai.com/v1", "authEnv": "OPENAI_API_KEY" }
],
"routing": {
"defaultProvider": "anthropic-main",
"routes": [
{ "id": "gpt-to-openai", "modelPattern": "^gpt-", "providers": ["openai-main"] }
]
}
}| Variable | Description |
|---|---|
| PORT | Listen port (default 8787) |
| CONFIG_FILE | Runtime config path |
| OPENAI_API_KEY | OpenAI API key for gpt-* routing |
| ROUTE_MODEL_ALLOWLIST | Comma-separated allowlist for MODEL_ROUTE targets |
Development
bun run dev # dev server (port 8787)
bun run check # typecheck + all tests
bun run test:e2e # E2E tests (replay)
bun run test:e2e:live # E2E against live OpenAI
docker compose watch # Docker watch mode