diff --git a/.env.example b/.env.example index 27bc16d..8f865f1 100644 --- a/.env.example +++ b/.env.example @@ -23,11 +23,22 @@ ANTHROPIC_API_KEY=your-api-key-here # ROUTER_DEFAULT=openai,gpt-4o # --- Google Gemini --- -GEMINI_API_KEY=your-gemini-key -ROUTER_DEFAULT=gemini,gemini-2.5-pro +# GEMINI_API_KEY=your-gemini-key +# 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 # ============================================================================= -# OpenAI: gpt-4o, gpt-4o-mini -# Gemini: gemini-2.5-pro, gemini-2.5-flash +# OpenAI: gpt-4o, gpt-4o-mini +# 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 diff --git a/configs/router-config.json b/configs/router-config.json index 8d043e4..6d5213d 100644 --- a/configs/router-config.json +++ b/configs/router-config.json @@ -23,6 +23,15 @@ "transformer": { "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": { diff --git a/docker-compose.yml b/docker-compose.yml index afb7d3d..664e3b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,6 +58,8 @@ services: - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - OPENAI_API_KEY=${OPENAI_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} 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 c979d76..3719a40 100755 --- a/shannon +++ b/shannon @@ -123,14 +123,14 @@ cmd_start() { exit 1 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 [ "$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 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 or GEMINI_API_KEY)" + echo " (or use ROUTER=true with OPENAI_API_KEY, GEMINI_API_KEY, or DEEPSEEK_API_KEY)" exit 1 fi fi @@ -165,9 +165,9 @@ cmd_start() { else echo "Starting claude-code-router..." - # Check for OpenAI API key - if [ -z "$OPENAI_API_KEY" ] && [ -z "$GEMINI_API_KEY" ]; then - echo "WARNING: Neither OPENAI_API_KEY nor GEMINI_API_KEY set. Router may not work." + # 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." fi # Start router with profile