From 16db87983b85edbe48881550e78d133ab4c6af2a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 18 Feb 2026 19:16:04 +0000 Subject: [PATCH] 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 --- .github/workflows/deploy-hostinger.yml | 12 ++++++------ deploy/hostinger/full-deploy.sh | 4 ++-- pkg/providers/http_provider.go | 24 +++++++++++++++--------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/.github/workflows/deploy-hostinger.yml b/.github/workflows/deploy-hostinger.yml index 5244a5d0e..2f15a9b76 100644 --- a/.github/workflows/deploy-hostinger.yml +++ b/.github/workflows/deploy-hostinger.yml @@ -106,14 +106,14 @@ jobs: echo "WARNING: PICOCLAW_TELEGRAM_BOT_TOKEN secret is empty - Telegram will not start" fi - # Z.AI (Zhipu GLM) API Key + # Z.AI API Key ZAI_KEY="${{ secrets.PICOCLAW_ZAI_API_KEY }}" if [ -n "\$ZAI_KEY" ]; then - set_env_var "PICOCLAW_PROVIDERS_ZHIPU_API_KEY" "\$ZAI_KEY" - set_env_var "PICOCLAW_PROVIDERS_ZHIPU_API_BASE" "https://api.z.ai/api/paas/v4" - set_env_var "PICOCLAW_AGENTS_DEFAULTS_PROVIDER" "zhipu" + set_env_var "PICOCLAW_ZAI_API_KEY" "\$ZAI_KEY" + set_env_var "PICOCLAW_ZAI_API_BASE" "https://api.z.ai/api/paas/v4" + set_env_var "PICOCLAW_AGENTS_DEFAULTS_PROVIDER" "zai" 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 echo "WARNING: PICOCLAW_ZAI_API_KEY secret is empty" fi @@ -133,7 +133,7 @@ jobs: 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 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 "==================================" EOF diff --git a/deploy/hostinger/full-deploy.sh b/deploy/hostinger/full-deploy.sh index e7a7232e5..37c888938 100755 --- a/deploy/hostinger/full-deploy.sh +++ b/deploy/hostinger/full-deploy.sh @@ -434,7 +434,7 @@ if [ "${SKIP_CONFIG}" = false ]; then openai) DEFAULT_MODEL="gpt-4o" ;; openrouter) DEFAULT_MODEL="anthropic/claude-sonnet-4" ;; 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" ;; ollama) DEFAULT_MODEL="llama3.2" ;; *) DEFAULT_MODEL="claude-sonnet-4-20250514" ;; @@ -446,7 +446,7 @@ if [ "${SKIP_CONFIG}" = false ]; then openai) ENV_KEY_NAME="OPENAI_API_KEY" ;; openrouter) ENV_KEY_NAME="OPENROUTER_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" ;; ollama) ENV_KEY_NAME="" ;; *) ENV_KEY_NAME="${LLM_PROVIDER^^}_API_KEY" ;; diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 5b29de1aa..e5f663eeb 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -335,6 +335,10 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { if apiBase == "" { 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 != "" { apiKey = cfg.Providers.Moonshot.APIKey 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/")): - // Kimi/Moonshot models: prefer Zai, fallback to legacy Moonshot config - if cfg.Providers.Zai.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 != "" { + // Kimi/Moonshot models: prefer legacy Moonshot config, fallback to Zai with model swap + if cfg.Providers.Moonshot.APIKey != "" { apiKey = cfg.Providers.Moonshot.APIKey apiBase = cfg.Providers.Moonshot.APIBase proxy = cfg.Providers.Moonshot.Proxy if apiBase == "" { 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/"):