From 429b74cff95fa8fcc0c668ad2efb9636fb318c77 Mon Sep 17 00:00:00 2001 From: ajmallesh Date: Thu, 15 Jan 2026 15:21:34 -0800 Subject: [PATCH] feat: add OpenRouter provider support for claude-code-router --- .env.example | 6 ++++++ configs/router-config.json | 14 ++++++++++++++ docker-compose.yml | 1 + shannon | 8 ++++---- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 8f865f1..bcdd021 100644 --- a/.env.example +++ b/.env.example @@ -35,6 +35,10 @@ ANTHROPIC_API_KEY=your-api-key-here # DEEPSEEK_API_BASE=https://api.deepseek.com/chat/completions # ROUTER_DEFAULT=deepseek,deepseek-chat +# --- OpenRouter (access 100+ models via single API) --- +# OPENROUTER_API_KEY=sk-or-your-openrouter-key +# ROUTER_DEFAULT=openrouter,anthropic/claude-sonnet-4 + # ============================================================================= # Available Models # ============================================================================= @@ -42,3 +46,5 @@ ANTHROPIC_API_KEY=your-api-key-here # Gemini: gemini-2.5-pro, gemini-2.5-flash # DeepSeek: (Together.ai) deepseek-ai/DeepSeek-V3, deepseek-ai/DeepSeek-R1 # (Official) deepseek-chat, deepseek-reasoner +# OpenRouter: anthropic/claude-sonnet-4, google/gemini-2.5-pro-preview, +# openai/gpt-4o, meta-llama/llama-3.3-70b-instruct (100+ more) diff --git a/configs/router-config.json b/configs/router-config.json index 6d5213d..dd3fc47 100644 --- a/configs/router-config.json +++ b/configs/router-config.json @@ -32,6 +32,20 @@ "transformer": { "use": ["deepseek", "enhancetool"] } + }, + { + "name": "openrouter", + "api_base_url": "https://openrouter.ai/api/v1/chat/completions", + "api_key": "$OPENROUTER_API_KEY", + "models": [ + "anthropic/claude-sonnet-4", + "google/gemini-2.5-pro-preview", + "openai/gpt-4o", + "meta-llama/llama-3.3-70b-instruct" + ], + "transformer": { + "use": ["openrouter"] + } } ], "Router": { diff --git a/docker-compose.yml b/docker-compose.yml index 664e3b6..0f55219 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -60,6 +60,7 @@ services: - GEMINI_API_KEY=${GEMINI_API_KEY:-} - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} - DEEPSEEK_API_BASE=${DEEPSEEK_API_BASE:-https://api.together.xyz/v1/chat/completions} + - OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-} - ROUTER_DEFAULT=${ROUTER_DEFAULT:-openai,gpt-4o} healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://localhost:3456/health', r => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"] diff --git a/shannon b/shannon index 3719a40..760b0b1 100755 --- a/shannon +++ b/shannon @@ -125,12 +125,12 @@ cmd_start() { # Check for API key (router mode can use alternative provider API keys) if [ -z "$ANTHROPIC_API_KEY" ] && [ -z "$CLAUDE_CODE_OAUTH_TOKEN" ]; then - if [ "$ROUTER" = "true" ] && { [ -n "$OPENAI_API_KEY" ] || [ -n "$GEMINI_API_KEY" ] || [ -n "$DEEPSEEK_API_KEY" ]; }; then + if [ "$ROUTER" = "true" ] && { [ -n "$OPENAI_API_KEY" ] || [ -n "$GEMINI_API_KEY" ] || [ -n "$DEEPSEEK_API_KEY" ] || [ -n "$OPENROUTER_API_KEY" ]; }; then # Router mode with alternative provider - set a placeholder for SDK init export ANTHROPIC_API_KEY="router-mode" else echo "ERROR: Set ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN in .env" - echo " (or use ROUTER=true with OPENAI_API_KEY, GEMINI_API_KEY, or DEEPSEEK_API_KEY)" + echo " (or use ROUTER=true with OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, or OPENROUTER_API_KEY)" exit 1 fi fi @@ -166,8 +166,8 @@ cmd_start() { echo "Starting claude-code-router..." # Check for provider API keys - if [ -z "$OPENAI_API_KEY" ] && [ -z "$GEMINI_API_KEY" ] && [ -z "$DEEPSEEK_API_KEY" ]; then - echo "WARNING: No provider API key set (OPENAI_API_KEY, GEMINI_API_KEY, or DEEPSEEK_API_KEY). Router may not work." + if [ -z "$OPENAI_API_KEY" ] && [ -z "$GEMINI_API_KEY" ] && [ -z "$DEEPSEEK_API_KEY" ] && [ -z "$OPENROUTER_API_KEY" ]; then + echo "WARNING: No provider API key set (OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, or OPENROUTER_API_KEY). Router may not work." fi # Start router with profile