fix: deploy uses wrong env vars and kimi model sent to Z.ai API

Root cause of "kimi-k2.5 is not a valid model ID" error:

1. deploy-hostinger.yml set PICOCLAW_PROVIDERS_ZHIPU_API_KEY which
   was never read (broken {{.Name}} env tags). Changed to
   PICOCLAW_ZAI_API_KEY which loadProviderEnvVars() reads correctly.

2. deploy-hostinger.yml set provider to "zhipu" instead of "zai".

3. When kimi model names (kimi-k2.5) were routed to Z.ai due to
   missing Moonshot key, the incompatible model name was sent as-is.
   Now swaps to "glm-4.7" when kimi models fallback to Z.ai.

4. full-deploy.sh: added "zai" provider case with glm-4.7 default,
   updated zhipu ENV_KEY_NAME to ZAI_API_KEY.

https://claude.ai/code/session_01MYemTMPtHrcgidWs8UdjcG
This commit is contained in:
Claude 2026-02-18 19:16:04 +00:00
parent 9ca165451e
commit 16db87983b
No known key found for this signature in database
3 changed files with 23 additions and 17 deletions

View file

@ -106,14 +106,14 @@ jobs:
echo "WARNING: PICOCLAW_TELEGRAM_BOT_TOKEN secret is empty - Telegram will not start" echo "WARNING: PICOCLAW_TELEGRAM_BOT_TOKEN secret is empty - Telegram will not start"
fi fi
# Z.AI (Zhipu GLM) API Key # Z.AI API Key
ZAI_KEY="${{ secrets.PICOCLAW_ZAI_API_KEY }}" ZAI_KEY="${{ secrets.PICOCLAW_ZAI_API_KEY }}"
if [ -n "\$ZAI_KEY" ]; then if [ -n "\$ZAI_KEY" ]; then
set_env_var "PICOCLAW_PROVIDERS_ZHIPU_API_KEY" "\$ZAI_KEY" set_env_var "PICOCLAW_ZAI_API_KEY" "\$ZAI_KEY"
set_env_var "PICOCLAW_PROVIDERS_ZHIPU_API_BASE" "https://api.z.ai/api/paas/v4" set_env_var "PICOCLAW_ZAI_API_BASE" "https://api.z.ai/api/paas/v4"
set_env_var "PICOCLAW_AGENTS_DEFAULTS_PROVIDER" "zhipu" set_env_var "PICOCLAW_AGENTS_DEFAULTS_PROVIDER" "zai"
set_env_var "PICOCLAW_AGENTS_DEFAULTS_MODEL" "glm-4.7" set_env_var "PICOCLAW_AGENTS_DEFAULTS_MODEL" "glm-4.7"
echo "Z.AI/Zhipu: API key and default model configured" echo "Z.ai: API key and default model configured"
else else
echo "WARNING: PICOCLAW_ZAI_API_KEY secret is empty" echo "WARNING: PICOCLAW_ZAI_API_KEY secret is empty"
fi fi
@ -133,7 +133,7 @@ jobs:
echo "Config file exists: \$(test -f "\$CONFIG_FILE" && echo YES || echo NO)" echo "Config file exists: \$(test -f "\$CONFIG_FILE" && echo YES || echo NO)"
echo "Telegram enabled: \$(grep -c 'PICOCLAW_CHANNELS_TELEGRAM_ENABLED=true' "\$ENV_FILE" 2>/dev/null || echo 0)" echo "Telegram enabled: \$(grep -c 'PICOCLAW_CHANNELS_TELEGRAM_ENABLED=true' "\$ENV_FILE" 2>/dev/null || echo 0)"
echo "Telegram token set: \$(grep -c 'PICOCLAW_CHANNELS_TELEGRAM_TOKEN=' "\$ENV_FILE" 2>/dev/null || echo 0)" echo "Telegram token set: \$(grep -c 'PICOCLAW_CHANNELS_TELEGRAM_TOKEN=' "\$ENV_FILE" 2>/dev/null || echo 0)"
echo "Z.AI key set: \$(grep -c 'PICOCLAW_PROVIDERS_ZHIPU_API_KEY=' "\$ENV_FILE" 2>/dev/null || echo 0)" echo "Z.AI key set: \$(grep -c 'PICOCLAW_ZAI_API_KEY=' "\$ENV_FILE" 2>/dev/null || echo 0)"
echo "==================================" echo "=================================="
EOF EOF

View file

@ -434,7 +434,7 @@ if [ "${SKIP_CONFIG}" = false ]; then
openai) DEFAULT_MODEL="gpt-4o" ;; openai) DEFAULT_MODEL="gpt-4o" ;;
openrouter) DEFAULT_MODEL="anthropic/claude-sonnet-4" ;; openrouter) DEFAULT_MODEL="anthropic/claude-sonnet-4" ;;
gemini) DEFAULT_MODEL="gemini-2.0-flash" ;; gemini) DEFAULT_MODEL="gemini-2.0-flash" ;;
zhipu) DEFAULT_MODEL="glm-4" ;; zai|zhipu) DEFAULT_MODEL="glm-4.7" ;;
groq) DEFAULT_MODEL="llama-3.3-70b-versatile" ;; groq) DEFAULT_MODEL="llama-3.3-70b-versatile" ;;
ollama) DEFAULT_MODEL="llama3.2" ;; ollama) DEFAULT_MODEL="llama3.2" ;;
*) DEFAULT_MODEL="claude-sonnet-4-20250514" ;; *) DEFAULT_MODEL="claude-sonnet-4-20250514" ;;
@ -446,7 +446,7 @@ if [ "${SKIP_CONFIG}" = false ]; then
openai) ENV_KEY_NAME="OPENAI_API_KEY" ;; openai) ENV_KEY_NAME="OPENAI_API_KEY" ;;
openrouter) ENV_KEY_NAME="OPENROUTER_API_KEY" ;; openrouter) ENV_KEY_NAME="OPENROUTER_API_KEY" ;;
gemini) ENV_KEY_NAME="GEMINI_API_KEY" ;; gemini) ENV_KEY_NAME="GEMINI_API_KEY" ;;
zhipu) ENV_KEY_NAME="ZHIPU_API_KEY" ;; zai|zhipu) ENV_KEY_NAME="ZAI_API_KEY" ;;
groq) ENV_KEY_NAME="GROQ_API_KEY" ;; groq) ENV_KEY_NAME="GROQ_API_KEY" ;;
ollama) ENV_KEY_NAME="" ;; ollama) ENV_KEY_NAME="" ;;
*) ENV_KEY_NAME="${LLM_PROVIDER^^}_API_KEY" ;; *) ENV_KEY_NAME="${LLM_PROVIDER^^}_API_KEY" ;;

View file

@ -335,6 +335,10 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) {
if apiBase == "" { if apiBase == "" {
apiBase = "https://api.z.ai/api/paas/v4" apiBase = "https://api.z.ai/api/paas/v4"
} }
// Swap incompatible kimi model names when routing to Z.ai
if strings.Contains(lowerModel, "kimi") || strings.Contains(lowerModel, "moonshot") {
model = "glm-4.7"
}
} else if cfg.Providers.Moonshot.APIKey != "" { } else if cfg.Providers.Moonshot.APIKey != "" {
apiKey = cfg.Providers.Moonshot.APIKey apiKey = cfg.Providers.Moonshot.APIKey
apiBase = cfg.Providers.Moonshot.APIBase apiBase = cfg.Providers.Moonshot.APIBase
@ -367,21 +371,23 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) {
} }
case (strings.Contains(lowerModel, "kimi") || strings.Contains(lowerModel, "moonshot") || strings.HasPrefix(model, "moonshot/")): case (strings.Contains(lowerModel, "kimi") || strings.Contains(lowerModel, "moonshot") || strings.HasPrefix(model, "moonshot/")):
// Kimi/Moonshot models: prefer Zai, fallback to legacy Moonshot config // Kimi/Moonshot models: prefer legacy Moonshot config, fallback to Zai with model swap
if cfg.Providers.Zai.APIKey != "" { if cfg.Providers.Moonshot.APIKey != "" {
apiKey = cfg.Providers.Zai.APIKey
apiBase = cfg.Providers.Zai.APIBase
proxy = cfg.Providers.Zai.Proxy
if apiBase == "" {
apiBase = "https://api.z.ai/api/paas/v4"
}
} else if cfg.Providers.Moonshot.APIKey != "" {
apiKey = cfg.Providers.Moonshot.APIKey apiKey = cfg.Providers.Moonshot.APIKey
apiBase = cfg.Providers.Moonshot.APIBase apiBase = cfg.Providers.Moonshot.APIBase
proxy = cfg.Providers.Moonshot.Proxy proxy = cfg.Providers.Moonshot.Proxy
if apiBase == "" { if apiBase == "" {
apiBase = "https://api.moonshot.cn/v1" apiBase = "https://api.moonshot.cn/v1"
} }
} else if cfg.Providers.Zai.APIKey != "" {
// Kimi model names are not valid on Z.ai - use default GLM model
apiKey = cfg.Providers.Zai.APIKey
apiBase = cfg.Providers.Zai.APIBase
proxy = cfg.Providers.Zai.Proxy
model = "glm-4.7"
if apiBase == "" {
apiBase = "https://api.z.ai/api/paas/v4"
}
} }
case strings.HasPrefix(model, "openrouter/") || strings.HasPrefix(model, "anthropic/") || strings.HasPrefix(model, "openai/") || strings.HasPrefix(model, "meta-llama/") || strings.HasPrefix(model, "deepseek/") || strings.HasPrefix(model, "google/"): case strings.HasPrefix(model, "openrouter/") || strings.HasPrefix(model, "anthropic/") || strings.HasPrefix(model, "openai/") || strings.HasPrefix(model, "meta-llama/") || strings.HasPrefix(model, "deepseek/") || strings.HasPrefix(model, "google/"):