| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -euo pipefail |
|
|
| |
| |
| |
| CCMR_CONFIG_FILE="${CCMR_CONFIG_FILE:-/root/.env.d/ccmr.env}" |
|
|
| if [[ -f "$CCMR_CONFIG_FILE" ]]; then |
| echo "[CCMR-SETUP] Loading configuration from: $CCMR_CONFIG_FILE" |
| |
| source "$CCMR_CONFIG_FILE" |
| else |
| echo "[CCMR-SETUP] No config file at $CCMR_CONFIG_FILE, using env vars only" |
| echo "[CCMR-SETUP] To use file-based config, create: $CCMR_CONFIG_FILE" |
| fi |
|
|
| CCMR_CONFIG_DIR="${CCMR_CONFIG_DIR:-$HOME/.ccmr}" |
| mkdir -p "$CCMR_CONFIG_DIR" |
|
|
| echo "[CCMR-SETUP] Generating configuration in: $CCMR_CONFIG_DIR" |
|
|
| |
| |
| |
| ENV_FILE="$CCMR_CONFIG_DIR/.env" |
|
|
| |
| declare -A API_KEY_MAP=( |
| ["CCMR_DEEPSEEK_API_KEY"]="DEEPSEEK_API_KEY" |
| ["CCMR_QWEN_API_KEY"]="QWEN_API_KEY" |
| ["CCMR_KIMI_API_KEY"]="KIMI_API_KEY" |
| ["CCMR_GLM_API_KEY"]="GLM_API_KEY" |
| ["CCMR_MINIMAX_API_KEY"]="MINIMAX_API_KEY" |
| ["CCMR_MINIMAX_GLOBAL_API_KEY"]="MINIMAX_GLOBAL_API_KEY" |
| ["CCMR_MIMO_API_KEY"]="MIMO_API_KEY" |
| ["CCMR_MIMO_TOKEN_CN_API_KEY"]="MIMO_TOKEN_CN_API_KEY" |
| ["CCMR_MIMO_TOKEN_AMS_API_KEY"]="MIMO_TOKEN_AMS_API_KEY" |
| ["CCMR_MIMO_PAYG_API_KEY"]="MIMO_PAYG_API_KEY" |
| ) |
|
|
| |
| { |
| echo "# ============================================================" |
| echo "# Claude Code Model Router - 自动生成的配置" |
| echo "# ============================================================" |
| echo "" |
|
|
| has_any_key=false |
| for ccmr_var in "${!API_KEY_MAP[@]}"; do |
| env_key="${API_KEY_MAP[$ccmr_var]}" |
| env_value="${!ccmr_var:-}" |
| if [[ -n "$env_value" ]]; then |
| echo "${env_key}=${env_value}" |
| has_any_key=true |
| fi |
| done |
|
|
| if [[ "$has_any_key" == "false" ]]; then |
| echo "# 未检测到 API Key 环境变量" |
| echo "# 请设置环境变量后重新运行,例如:" |
| echo "# CCMR_DEEPSEEK_API_KEY=sk-xxx" |
| echo "# 支持的 Key 列表:" |
| for ccmr_var in "${!API_KEY_MAP[@]}"; do |
| env_key="${API_KEY_MAP[$ccmr_var]}" |
| echo "# ${ccmr_var}=xxx -> ${env_key}=xxx" |
| done |
| fi |
| } > "$ENV_FILE" |
|
|
| echo "[CCMR-SETUP] ✓ .env written with $([ "$has_any_key" == "true" ] && echo "$(grep -c '=' "$ENV_FILE") key(s) configured" || echo "no API keys (template mode)")" |
|
|
| |
| |
| |
| MODELS_FILE="$CCMR_CONFIG_DIR/models.yaml" |
|
|
| if [[ ! -f "$MODELS_FILE" ]]; then |
| echo "[CCMR-SETUP] Creating default models.yaml..." |
| cat > "$MODELS_FILE" << 'YAMLEOF' |
| |
| |
| |
|
|
| providers: |
| deepseek: |
| base_url: "https://api.deepseek.com" |
| api_key_env: "DEEPSEEK_API_KEY" |
| variants: |
| deepseek-v4-pro: |
| model: "deepseek-chat" |
| context_window: 65536 |
| max_tokens: 8192 |
| aliases: |
| - deepseek |
| - deepseek-pro |
| deepseek-v4-flash: |
| model: "deepseek-chat" |
| context_window: 65536 |
| max_tokens: 8192 |
| aliases: |
| - deepseek-flash |
| - ds-flash |
|
|
| qwen: |
| base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1" |
| api_key_env: "QWEN_API_KEY" |
| variants: |
| qwen3.5-plus: |
| model: "qwen-plus" |
| context_window: 131072 |
| max_tokens: 8192 |
| aliases: |
| - qwen |
| - qwen-plus |
| qwen3.5-flash: |
| model: "qwen-turbo" |
| context_window: 131072 |
| max_tokens: 8192 |
| aliases: |
| - qwen-flash |
| - qw-turbo |
| qwen3-max: |
| model: "qwen-max" |
| context_window: 32768 |
| max_tokens: 8192 |
| aliases: |
| - qwen-max |
|
|
| kimi: |
| base_url: "https://api.moonshot.cn/v1" |
| api_key_env: "KIMI_API_KEY" |
| variants: |
| kimi-k2.6: |
| model: "moonshot-v1-8k" |
| context_window: 8192 |
| max_tokens: 4096 |
| aliases: |
| - kimi |
| - moonshot |
|
|
| glm: |
| base_url: "https://open.bigmodel.cn/api/paas/v4" |
| api_key_env: "GLM_API_KEY" |
| variants: |
| glm-5.1: |
| model: "glm-4" |
| context_window: 131072 |
| max_tokens: 4096 |
| aliases: |
| - glm |
| - glm4 |
| glm-5.1-flash: |
| model: "glm-4-flash" |
| context_window: 131072 |
| max_tokens: 4096 |
| aliases: |
| - glm-flash |
|
|
| minimax: |
| base_url: "https://api.minimax.chat/v1" |
| api_key_env: "MINIMAX_API_KEY" |
| variants: |
| minimax-m2.7: |
| model: "minimax-m2.7" |
| context_window: 131072 |
| max_tokens: 8192 |
| aliases: |
| - minimax |
| - mmax |
|
|
| minimax_global: |
| base_url: "https://api.minimax.io/v1" |
| api_key_env: "MINIMAX_GLOBAL_API_KEY" |
| variants: |
| minimax-global-m2.7: |
| model: "minimax-m2.7" |
| context_window: 131072 |
| max_tokens: 8192 |
| aliases: |
| - minimax-global |
| - mmax-global |
|
|
| mimo: |
| base_url: "https://api.miMo.com/v1" |
| api_key_env: "MIMO_API_KEY" |
| variants: |
| mimo-v2.5-pro: |
| model: "mimo-v2.5-pro" |
| context_window: 131072 |
| max_tokens: 8192 |
| aliases: |
| - mimo |
| - mimo-pro |
| YAMLEOF |
| echo "[CCMR-SETUP] ✓ models.yaml created" |
| else |
| echo "[CCMR-SETUP] → models.yaml already exists, skipping" |
| fi |
|
|
| |
| |
| |
| echo "[CCMR-SETUP] Config directory: $CCMR_CONFIG_DIR" |
| echo "[CCMR-SETUP] Files:" |
| ls -la "$CCMR_CONFIG_DIR/" |
| echo "[CCMR-SETUP] Setup complete!" |
|
|