feat: add DeepSeek provider support for claude-code-router

- Add DeepSeek provider config with Together.ai and official API support
- Configure deepseek and enhancetool transformers for reliable tool calling
- Add DEEPSEEK_API_KEY and DEEPSEEK_API_BASE env vars to docker-compose
- Update shannon CLI to recognize DeepSeek as valid router provider
This commit is contained in:
ajmallesh
2026-01-15 15:16:05 -08:00
parent df06dadaff
commit 7303326188
4 changed files with 32 additions and 10 deletions

View File

@@ -23,11 +23,22 @@ ANTHROPIC_API_KEY=your-api-key-here
# ROUTER_DEFAULT=openai,gpt-4o # ROUTER_DEFAULT=openai,gpt-4o
# --- Google Gemini --- # --- Google Gemini ---
GEMINI_API_KEY=your-gemini-key # GEMINI_API_KEY=your-gemini-key
ROUTER_DEFAULT=gemini,gemini-2.5-pro # ROUTER_DEFAULT=gemini,gemini-2.5-pro
# --- DeepSeek (cheapest option) ---
# DEEPSEEK_API_KEY=your-together-or-deepseek-key
# DEEPSEEK_API_BASE=https://api.together.xyz/v1/chat/completions # Default: Together.ai
# ROUTER_DEFAULT=deepseek,deepseek-ai/DeepSeek-V3
#
# To use DeepSeek's official API instead:
# DEEPSEEK_API_BASE=https://api.deepseek.com/chat/completions
# ROUTER_DEFAULT=deepseek,deepseek-chat
# ============================================================================= # =============================================================================
# Available Models # Available Models
# ============================================================================= # =============================================================================
# OpenAI: gpt-4o, gpt-4o-mini # OpenAI: gpt-4o, gpt-4o-mini
# Gemini: gemini-2.5-pro, gemini-2.5-flash # 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

View File

@@ -23,6 +23,15 @@
"transformer": { "transformer": {
"use": ["gemini"] "use": ["gemini"]
} }
},
{
"name": "deepseek",
"api_base_url": "$DEEPSEEK_API_BASE",
"api_key": "$DEEPSEEK_API_KEY",
"models": ["deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-R1", "deepseek-chat", "deepseek-reasoner"],
"transformer": {
"use": ["deepseek", "enhancetool"]
}
} }
], ],
"Router": { "Router": {

View File

@@ -58,6 +58,8 @@ services:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
- OPENAI_API_KEY=${OPENAI_API_KEY:-} - OPENAI_API_KEY=${OPENAI_API_KEY:-}
- GEMINI_API_KEY=${GEMINI_API_KEY:-} - 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}
- ROUTER_DEFAULT=${ROUTER_DEFAULT:-openai,gpt-4o} - ROUTER_DEFAULT=${ROUTER_DEFAULT:-openai,gpt-4o}
healthcheck: 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))"] test: ["CMD", "node", "-e", "require('http').get('http://localhost:3456/health', r => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"]

12
shannon
View File

@@ -123,14 +123,14 @@ cmd_start() {
exit 1 exit 1
fi fi
# Check for API key (router mode can use OPENAI_API_KEY or GEMINI_API_KEY instead) # Check for API key (router mode can use alternative provider API keys)
if [ -z "$ANTHROPIC_API_KEY" ] && [ -z "$CLAUDE_CODE_OAUTH_TOKEN" ]; then if [ -z "$ANTHROPIC_API_KEY" ] && [ -z "$CLAUDE_CODE_OAUTH_TOKEN" ]; then
if [ "$ROUTER" = "true" ] && { [ -n "$OPENAI_API_KEY" ] || [ -n "$GEMINI_API_KEY" ]; }; then if [ "$ROUTER" = "true" ] && { [ -n "$OPENAI_API_KEY" ] || [ -n "$GEMINI_API_KEY" ] || [ -n "$DEEPSEEK_API_KEY" ]; }; then
# Router mode with alternative provider - set a placeholder for SDK init # Router mode with alternative provider - set a placeholder for SDK init
export ANTHROPIC_API_KEY="router-mode" export ANTHROPIC_API_KEY="router-mode"
else else
echo "ERROR: Set ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN in .env" echo "ERROR: Set ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN in .env"
echo " (or use ROUTER=true with OPENAI_API_KEY or GEMINI_API_KEY)" echo " (or use ROUTER=true with OPENAI_API_KEY, GEMINI_API_KEY, or DEEPSEEK_API_KEY)"
exit 1 exit 1
fi fi
fi fi
@@ -165,9 +165,9 @@ cmd_start() {
else else
echo "Starting claude-code-router..." echo "Starting claude-code-router..."
# Check for OpenAI API key # Check for provider API keys
if [ -z "$OPENAI_API_KEY" ] && [ -z "$GEMINI_API_KEY" ]; then if [ -z "$OPENAI_API_KEY" ] && [ -z "$GEMINI_API_KEY" ] && [ -z "$DEEPSEEK_API_KEY" ]; then
echo "WARNING: Neither OPENAI_API_KEY nor GEMINI_API_KEY set. Router may not work." echo "WARNING: No provider API key set (OPENAI_API_KEY, GEMINI_API_KEY, or DEEPSEEK_API_KEY). Router may not work."
fi fi
# Start router with profile # Start router with profile