File size: 9,027 Bytes
62f6d9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#!/usr/bin/env bash
# ============================================================
# CCMR (Claude Code Model Router) 配置自动生成脚本
#
# 功能说明:
#   读取 CCMR_* 环境变量,生成 CCMR 网关所需的 .env 和 models.yaml
#   支持两种配置方式,优先级:文件 > Docker/HF Spaces 环境变量
#
# 方式1 - 配置文件(推荐):
#   创建 /root/.env.d/ccmr.env,填入以下变量即可
#   修改后立即生效,无需重启容器(由 ccmr-wrapper.sh 监控热加载)
#
# 方式2 - Docker/HF Spaces 环境变量:
#   在 docker run -e 或 HF Spaces Secrets 中设置 CCMR_* 变量
#
# 运行原理:
#   1. 检测 /root/.env.d/ccmr.env 是否存在,存在则 source 加载
#   2. 读取当前 Shell 中所有 CCMR_* 环境变量(来自文件或 Docker)
#   3. 将 CCMR_DEEPSEEK_API_KEY -> DEEPSEEK_API_KEY 映射写入 .env
#   4. 如果 /root/.ccmr/models.yaml 不存在,生成默认模型配置
#
# ============================================================
# 所有支持的环境变量(共 10 个 API Key + 3 个系统设置)
# ============================================================
#
# 系统设置:
#   CCMR_ENABLED            - 是否启用 CCMR (true/false, 默认 false)
#   CCMR_PORT               - 网关监听端口 (默认 8080)
#   CCMR_CONFIG_DIR         - 配置存放目录 (默认 ~/.ccmr)
#
# API Key 列表(按平台分组):
#
# 1) DeepSeek(https://platform.deepseek.com/)
#   CCMR_DEEPSEEK_API_KEY=sk-xxx
#   支持模型: deepseek-v4-pro, deepseek-v4-flash
#   可用别名: deepseek, deepseek-pro, deepseek-flash, ds-flash
#
# 2) 通义千问 / Qwen(https://dashscope.console.aliyun.com/)
#   CCMR_QWEN_API_KEY=sk-xxx
#   支持模型: qwen3.5-plus, qwen3.5-flash, qwen3-max
#   可用别名: qwen, qwen-plus, qwen-flash, qw-turbo, qwen-max
#
# 3) Kimi / Moonshot(https://platform.kimi.ai/)
#   CCMR_KIMI_API_KEY=sk-xxx
#   支持模型: kimi-k2.6
#   可用别名: kimi, moonshot
#
# 4) 智谱 GLM(https://open.bigmodel.cn/)
#   CCMR_GLM_API_KEY=xxx
#   支持模型: glm-5.1, glm-5.1-flash
#   可用别名: glm, glm4, glm-flash
#
# 5) MiniMax CN(https://platform.minimaxi.com/)
#   CCMR_MINIMAX_API_KEY=xxx
#   支持模型: minimax-m2.7
#   可用别名: minimax, mmax
#
# 6) MiniMax Global(https://platform.minimax.io/)
#   CCMR_MINIMAX_GLOBAL_API_KEY=xxx
#   支持模型: minimax-global-m2.7
#   可用别名: minimax-global, mmax-global
#
# 7) MiMo Token Plan SGP 集群(https://platform.xiaomimimo.com/)
#   CCMR_MIMO_API_KEY=tp-xxx
#   支持模型: mimo-v2.5-pro - SGP 集群 (Singapore)
#   可用别名: mimo, mimo-pro
#
# 8) MiMo Token Plan CN 集群
#   CCMR_MIMO_TOKEN_CN_API_KEY=tp-xxx
#   支持模型: mimo-v2.5-pro - CN 集群
#
# 9) MiMo Token Plan AMS 集群
#   CCMR_MIMO_TOKEN_AMS_API_KEY=tp-xxx
#   支持模型: mimo-v2.5-pro - AMS 集群 (Amsterdam)
#
# 10) MiMo 按量付费(https://platform.xiaomimimo.com/)
#   CCMR_MIMO_PAYG_API_KEY=sk-xxx
#   支持模型: mimo-v2.5-pro - Pay-as-you-go
#
# ============================================================

set -euo pipefail

# ============================================================
# 从文件加载 CCMR 环境变量
# ============================================================
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"
  # shellcheck source=/dev/null
  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 文件
# ============================================================
ENV_FILE="$CCMR_CONFIG_DIR/.env"

# API Key 映射表: CCMR_xxx -> .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"
)

# 创建 .env 文件
{
  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.yaml 配置文件
# ============================================================
MODELS_FILE="$CCMR_CONFIG_DIR/models.yaml"

if [[ ! -f "$MODELS_FILE" ]]; then
  echo "[CCMR-SETUP] Creating default models.yaml..."
  cat > "$MODELS_FILE" << 'YAMLEOF'
# ============================================================
# Claude Code Model Router - 模型配置
# ============================================================

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!"