Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 104 additions & 6 deletions ccm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,12 @@ CLAUDE_API_KEY=your-claude-api-key
# OpenRouter
OPENROUTER_API_KEY=your-openrouter-api-key

# SiliconFlow (硅基流动)
SILICONFLOW_API_KEY=your-siliconflow-api-key

# Xiaomi MiMo (小米)
MIMO_API_KEY=your-mimo-api-key

# —— 可选:模型ID覆盖(不设置则使用下方默认)——
DEEPSEEK_MODEL=deepseek-chat
KIMI_MODEL=kimi-k2.5
Expand All @@ -185,6 +191,8 @@ HAIKU_MODEL=claude-haiku-4-5-20251001
MINIMAX_MODEL=MiniMax-M2.5
SEED_MODEL=ark-code-latest
STEPFUN_MODEL=step-3.5-flash
SILICONFLOW_MODEL=Pro/deepseek-ai/DeepSeek-V3.2
MIMO_MODEL=mimo-v2-flash

EOF
echo -e "${YELLOW}⚠️ $(t 'config_created'): $CONFIG_FILE${NC}" >&2
Expand Down Expand Up @@ -283,6 +291,12 @@ CLAUDE_API_KEY=your-claude-api-key
# OpenRouter
OPENROUTER_API_KEY=your-openrouter-api-key

# SiliconFlow (硅基流动)
SILICONFLOW_API_KEY=your-siliconflow-api-key

# Xiaomi MiMo (小米)
MIMO_API_KEY=your-mimo-api-key

# —— 可选:模型ID覆盖(不设置则使用下方默认)——
DEEPSEEK_MODEL=deepseek-chat
KIMI_MODEL=kimi-k2.5
Expand All @@ -295,6 +309,8 @@ HAIKU_MODEL=claude-haiku-4-5-20251001
MINIMAX_MODEL=MiniMax-M2.5
SEED_MODEL=ark-code-latest
STEPFUN_MODEL=step-3.5-flash
SILICONFLOW_MODEL=Pro/deepseek-ai/DeepSeek-V3.2
MIMO_MODEL=mimo-v2-flash

EOF
echo -e "${YELLOW}⚠️ $(t 'config_created'): $CONFIG_FILE${NC}" >&2
Expand Down Expand Up @@ -548,6 +564,8 @@ project_show_usage() {
echo " qwen [global|china] - Qwen" >&2
echo " minimax [global|china] - MiniMax" >&2
echo " seed - Doubao/Seed" >&2
echo " siliconflow, sf - SiliconFlow (硅基流动)" >&2
echo " mimo, xiaomi - Xiaomi MiMo (小米)" >&2
echo " claude - Claude (official)" >&2
echo "" >&2
echo "Examples:" >&2
Expand Down Expand Up @@ -667,6 +685,24 @@ get_provider_config() {
config_model="${CLAUDE_MODEL:-claude-sonnet-4-5-20250929}"
config_base_url="https://api.anthropic.com/"
;;
"siliconflow"|"sf")
if ! is_effectively_set "$SILICONFLOW_API_KEY"; then
echo -e "${RED}❌ Please configure SILICONFLOW_API_KEY first${NC}" >&2
return 1
fi
config_token_var="SILICONFLOW_API_KEY"
config_model="${SILICONFLOW_MODEL:-Pro/deepseek-ai/DeepSeek-V3.2}"
config_base_url="https://api.siliconflow.cn/"
;;
"mimo"|"xiaomi")
if ! is_effectively_set "$MIMO_API_KEY"; then
echo -e "${RED}❌ Please configure MIMO_API_KEY first${NC}" >&2
return 1
fi
config_token_var="MIMO_API_KEY"
config_model="${MIMO_MODEL:-mimo-v2-flash}"
config_base_url="https://api.xiaomimimo.com/anthropic"
;;
*)
echo -e "${RED}❌ Unknown provider: $provider${NC}" >&2
return 1
Expand Down Expand Up @@ -845,6 +881,8 @@ user_show_usage() {
echo " qwen [global|china] - Qwen" >&2
echo " minimax [global|china] - MiniMax" >&2
echo " seed - Doubao/Seed" >&2
echo " siliconflow, sf - SiliconFlow (硅基流动)" >&2
echo " mimo, xiaomi - Xiaomi MiMo (小米)" >&2
echo " claude - Claude (official)" >&2
echo "" >&2
echo "Examples:" >&2
Expand Down Expand Up @@ -1456,6 +1494,8 @@ show_status() {
echo " Provider: $(t 'openrouter_provider_stepfun')"
[[ "$ANTHROPIC_MODEL" == *":free" ]] && echo -e " ${GREEN}🆓 Free Tier${NC}"
;;
*siliconflow*) echo " Provider: $(t 'openrouter_provider_siliconflow')" ;;
*mimo*|*xiaomi*) echo " Provider: $(t 'openrouter_provider_mimo')" ;;
*claude*|*anthropic*) echo " Provider: $(t 'openrouter_provider_claude')" ;;
*) echo " Provider: $(t 'openrouter_provider_unknown') ${ANTHROPIC_MODEL})" ;;
esac
Expand Down Expand Up @@ -1485,6 +1525,8 @@ show_status() {
echo " ARK_API_KEY: $(mask_presence ARK_API_KEY)"
echo " QWEN_API_KEY: $(mask_presence QWEN_API_KEY)"
echo " STEPFUN_API_KEY: $(mask_presence STEPFUN_API_KEY)"
echo " SILICONFLOW_API_KEY: $(mask_presence SILICONFLOW_API_KEY)"
echo " MIMO_API_KEY: $(mask_presence MIMO_API_KEY)"
echo " OPENROUTER_API_KEY: $(mask_presence OPENROUTER_API_KEY)"
echo ""
}
Expand Down Expand Up @@ -1772,18 +1814,20 @@ show_help() {
echo " minimax [global|china] - env minimax (default: global)"
echo " seed [doubao|glm|deepseek|kimi] - env 豆包 Seed-Code"
echo " stepfun - env StepFun"
echo " siliconflow, sf - env SiliconFlow (硅基流动)"
echo " mimo, xiaomi - env Xiaomi MiMo (小米)"
echo " claude, sonnet, s - env claude (official)"
echo " open <provider> - env OpenRouter (run 'ccm open' for help)"
echo ""
echo -e "${YELLOW}User-level Settings (highest priority):${NC}"
echo " user <provider> [region] - write to ~/.claude/settings.json"
echo " user reset - remove ccm settings, restore env var control"
echo " Providers: glm, deepseek, kimi, qwen, minimax, seed, stepfun, claude"
echo " Providers: glm, deepseek, kimi, qwen, minimax, seed, stepfun, siliconflow, mimo, claude"
echo ""
echo -e "${YELLOW}Project-level Settings:${NC}"
echo " project <provider> [region] - write .claude/settings.local.json (project-only)"
echo " project reset - remove project override"
echo " Providers: glm, deepseek, kimi, qwen, minimax, seed, claude"
echo " Providers: glm, deepseek, kimi, qwen, minimax, seed, siliconflow, mimo, claude"
echo ""
echo -e "${YELLOW}Claude Pro Account Management:${NC}"
echo " save-account <name> - Save current Claude Pro account"
Expand All @@ -1805,6 +1849,8 @@ show_help() {
echo " eval \"\$(ccm kimi china)\" # Kimi CN"
echo " eval \"\$(ccm qwen global)\" # Qwen global (Coding Plan)"
echo " eval \"\$(ccm seed kimi)\" # 豆包 Seed-Code (kimi)"
echo " eval \"\$(ccm siliconflow)\" # SiliconFlow"
echo " eval \"\$(ccm mimo)\" # Xiaomi MiMo"
echo " eval \"\$(ccm open kimi)\" # OpenRouter kimi"
echo ""
echo " ccm user glm global # Set GLM as default (highest priority)"
Expand All @@ -1821,6 +1867,8 @@ show_help() {
echo " 🎯 MiniMax - MiniMax-M2.5 (api.minimax.io / api.minimaxi.com)"
echo " 🐪 Qwen - qwen3-max-2026-01-23 / qwen3-coder-plus (Coding Plan)"
echo " 🇨🇳 GLM - glm-5 (api.z.ai / open.bigmodel.cn)"
echo " 🔮 SiliconFlow - Pro/deepseek-ai/DeepSeek-V3.2 (api.siliconflow.cn)"
echo " 📱 Xiaomi MiMo - mimo-v2-flash (api.xiaomimimo.com/anthropic)"
echo " 🧠 Claude Sonnet 4.5 - claude-sonnet-4-5-20250929"
}

Expand All @@ -1838,6 +1886,8 @@ ensure_model_override_defaults() {
"CLAUDE_MODEL=claude-sonnet-4-5-20250929"
"OPUS_MODEL=claude-opus-4-6"
"HAIKU_MODEL=claude-haiku-4-5-20251001"
"SILICONFLOW_MODEL=Pro/deepseek-ai/DeepSeek-V3.2"
"MIMO_MODEL=mimo-v2-flash"
)
local added_header=0
for pair in "${pairs[@]}"; do
Expand Down Expand Up @@ -1953,7 +2003,7 @@ show_open_help() {
echo " ccm open <provider>"
echo ""
echo -e "${YELLOW}Supported providers:${NC}"
echo " claude (default), deepseek, kimi, glm, qwen, minimax, stepfun"
echo " claude (default), deepseek, kimi, glm, qwen, minimax, stepfun, siliconflow, mimo"
echo ""
echo -e "${YELLOW}Free tier:${NC}"
echo " stepfun-free (sf-free) - stepfun/step-3.5-flash:free"
Expand Down Expand Up @@ -2041,6 +2091,20 @@ emit_openrouter_exports() {
default_opus="$model"
default_haiku="$model"
;;
"siliconflow")
model="siliconflow/Pro/deepseek-ai/DeepSeek-V3.2"
small="siliconflow/Pro/deepseek-ai/DeepSeek-V3.2"
default_sonnet="$model"
default_opus="$model"
default_haiku="$model"
;;
"mimo"|"xiaomi")
model="xiaomi/mimo-v2-flash"
small="xiaomi/mimo-v2-flash"
default_sonnet="$model"
default_opus="$model"
default_haiku="$model"
;;
*)
echo -e "${RED}❌ $(t 'unknown_option'): open $provider${NC}" >&2
show_open_help >&2
Expand Down Expand Up @@ -2259,6 +2323,34 @@ emit_env_exports() {
emit_default_models "$stepfun_model" "$stepfun_model" "$stepfun_model"
emit_subagent_model "$stepfun_model"
;;
"siliconflow"|"sf")
if ! is_effectively_set "$SILICONFLOW_API_KEY"; then
echo -e "${RED}❌ Please configure SILICONFLOW_API_KEY${NC}" >&2
return 1
fi
echo "$prelude"
echo "export ANTHROPIC_BASE_URL='https://api.siliconflow.cn/'"
echo "if [ -f \"\$HOME/.ccm_config\" ]; then . \"\$HOME/.ccm_config\" >/dev/null 2>&1; fi"
echo "export ANTHROPIC_AUTH_TOKEN=\"\${SILICONFLOW_API_KEY}\""
local sf_model="${SILICONFLOW_MODEL:-Pro/deepseek-ai/DeepSeek-V3.2}"
echo "export ANTHROPIC_MODEL='${sf_model}'"
emit_default_models "$sf_model" "$sf_model" "$sf_model"
emit_subagent_model "$sf_model"
;;
"mimo"|"xiaomi")
if ! is_effectively_set "$MIMO_API_KEY"; then
echo -e "${RED}❌ Please configure MIMO_API_KEY${NC}" >&2
return 1
fi
echo "$prelude"
echo "export ANTHROPIC_BASE_URL='https://api.xiaomimimo.com/anthropic'"
echo "if [ -f \"\$HOME/.ccm_config\" ]; then . \"\$HOME/.ccm_config\" >/dev/null 2>&1; fi"
echo "export ANTHROPIC_AUTH_TOKEN=\"\${MIMO_API_KEY}\""
local mimo_model="${MIMO_MODEL:-mimo-v2-flash}"
echo "export ANTHROPIC_MODEL='${mimo_model}'"
emit_default_models "$mimo_model" "$mimo_model" "$mimo_model"
emit_subagent_model "$mimo_model"
;;
"claude"|"sonnet"|"s")
echo "$prelude"
# 官方 Anthropic 网关
Expand All @@ -2277,7 +2369,7 @@ emit_env_exports() {
emit_subagent_model "$claude_model"
;;
*)
echo "# $(t 'usage'): $(basename "$0") env [deepseek|kimi|qwen|glm|minimax|seed|stepfun|claude|open]" 1>&2
echo "# $(t 'usage'): $(basename "$0") env [deepseek|kimi|qwen|glm|minimax|seed|stepfun|siliconflow|mimo|claude|open]" 1>&2
return 1
;;
esac
Expand Down Expand Up @@ -2359,6 +2451,12 @@ main() {
"stepfun")
emit_env_exports stepfun
;;
"siliconflow"|"sf")
emit_env_exports siliconflow
;;
"mimo"|"xiaomi")
emit_env_exports mimo
;;
"claude"|"sonnet"|"s")
emit_env_exports claude
;;
Expand All @@ -2373,7 +2471,7 @@ main() {
shift
local project_action="${1:-}"
case "$project_action" in
"glm"|"deepseek"|"ds"|"kimi"|"kimi2"|"qwen"|"minimax"|"mm"|"seed"|"doubao"|"claude"|"sonnet"|"s")
"glm"|"deepseek"|"ds"|"kimi"|"kimi2"|"qwen"|"minimax"|"mm"|"seed"|"doubao"|"siliconflow"|"sf"|"mimo"|"xiaomi"|"claude"|"sonnet"|"s")
project_write_settings "$project_action" "${2:-}"
;;
"reset")
Expand All @@ -2393,7 +2491,7 @@ main() {
shift
local user_action="${1:-}"
case "$user_action" in
"glm"|"deepseek"|"ds"|"kimi"|"kimi2"|"qwen"|"minimax"|"mm"|"seed"|"doubao"|"stepfun"|"claude"|"sonnet"|"s")
"glm"|"deepseek"|"ds"|"kimi"|"kimi2"|"qwen"|"minimax"|"mm"|"seed"|"doubao"|"stepfun"|"siliconflow"|"sf"|"mimo"|"xiaomi"|"claude"|"sonnet"|"s")
user_write_settings "$user_action" "${2:-}"
;;
"reset")
Expand Down
8 changes: 2 additions & 6 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -480,8 +480,7 @@ fi
exec "$CCM_SH" "$@"
EOF
else
local content
content="$(cat <<'EOF'
IFS= read -r -d '' content <<'EOF' || true
#!/usr/bin/env bash
set -euo pipefail
CCM_SH="__DATA_DIR__/ccm.sh"
Expand All @@ -491,7 +490,6 @@ if [[ ! -f "$CCM_SH" ]]; then
fi
exec "$CCM_SH" "$@"
EOF
)"
content="${content//__DATA_DIR__/$data_dir}"
printf '%s\n' "$content" > "$target"
fi
Expand Down Expand Up @@ -630,8 +628,7 @@ else
fi
EOF
else
local content
content="$(cat <<'EOF'
IFS= read -r -d '' content <<'EOF' || true
#!/usr/bin/env bash
set -euo pipefail
CCM="__DATA_DIR__/ccm.sh"
Expand Down Expand Up @@ -751,7 +748,6 @@ else
exec claude "${claude_args[@]}"
fi
EOF
)"
content="${content//__DATA_DIR__/$data_dir}"
printf '%s\n' "$content" > "$target"
fi
Expand Down
2 changes: 2 additions & 0 deletions lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@
"openrouter_provider_minimax": "MiniMax (via OpenRouter)",
"openrouter_provider_qwen": "Qwen (via OpenRouter)",
"openrouter_provider_stepfun": "StepFun (via OpenRouter)",
"openrouter_provider_siliconflow": "SiliconFlow (via OpenRouter)",
"openrouter_provider_mimo": "Xiaomi MiMo (via OpenRouter)",
"openrouter_provider_claude": "Claude (via OpenRouter)",
"openrouter_provider_unknown": "Unknown (model:"
}
2 changes: 2 additions & 0 deletions lang/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@
"openrouter_provider_minimax": "MiniMax (通过 OpenRouter)",
"openrouter_provider_qwen": "Qwen (通过 OpenRouter)",
"openrouter_provider_stepfun": "StepFun (通过 OpenRouter)",
"openrouter_provider_siliconflow": "SiliconFlow (通过 OpenRouter)",
"openrouter_provider_mimo": "小米 MiMo (通过 OpenRouter)",
"openrouter_provider_claude": "Claude (通过 OpenRouter)",
"openrouter_provider_unknown": "未知 (模型:"
}