From 7450e7014aea8565dfc7626cf31b0a8d1e2b2a47 Mon Sep 17 00:00:00 2001 From: viettranx Date: Sat, 28 Feb 2026 11:46:59 +0700 Subject: [PATCH] fix: Correct provider type seeding and add missing env vars for all channels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix seedManagedData() hardcoding openai_compat for all non-Anthropic providers; now uses resolveProviderType() mapping to correct store constants (gemini_native, minimax_native, etc.) — fixes model listing in web UI for Gemini - Rename GOCLAW_FEISHU_* env vars to GOCLAW_LARK_* (Lark is the global brand) - Add WhatsApp env override (GOCLAW_WHATSAPP_BRIDGE_URL) and auto-enable - Add missing env vars to docker-compose.yml (Cohere, Perplexity, Lark, Zalo, WhatsApp) - Update .env.example with all providers/channels, remove unnecessary GOCLAW_PROVIDER - Add Cohere and Perplexity to prepare-env.sh provider detection Co-Authored-By: Claude Opus 4.6 --- .env.example | 20 +++++++++++++++++--- cmd/onboard_managed.go | 33 +++++++++++++++++++++++++++++---- docker-compose.yml | 8 ++++++++ internal/config/config_load.go | 12 ++++++++---- prepare-env.sh | 3 ++- 5 files changed, 64 insertions(+), 12 deletions(-) diff --git a/.env.example b/.env.example index 43d03e0e..a856c712 100644 --- a/.env.example +++ b/.env.example @@ -4,12 +4,20 @@ # Required: at least one LLM provider API key. # Auto-generated by prepare-env.sh: GOCLAW_GATEWAY_TOKEN, GOCLAW_ENCRYPTION_KEY. -# --- LLM Provider (at least one required) --- -GOCLAW_PROVIDER= -GOCLAW_MODEL= +# --- LLM Provider (at least one API key required) --- +# Provider is auto-detected from API keys. Default model is chosen per provider. +# GOCLAW_MODEL= # Optional: override default model GOCLAW_OPENROUTER_API_KEY= GOCLAW_ANTHROPIC_API_KEY= +GOCLAW_OPENAI_API_KEY= GOCLAW_MINIMAX_API_KEY= +GOCLAW_GROQ_API_KEY= +GOCLAW_DEEPSEEK_API_KEY= +GOCLAW_GEMINI_API_KEY= +GOCLAW_MISTRAL_API_KEY= +GOCLAW_XAI_API_KEY= +GOCLAW_COHERE_API_KEY= +GOCLAW_PERPLEXITY_API_KEY= # --- Gateway --- GOCLAW_GATEWAY_TOKEN= @@ -18,6 +26,12 @@ GOCLAW_ENCRYPTION_KEY= # --- Channels (optional) --- GOCLAW_TELEGRAM_TOKEN= GOCLAW_DISCORD_TOKEN= +GOCLAW_LARK_APP_ID= +GOCLAW_LARK_APP_SECRET= +# GOCLAW_LARK_ENCRYPT_KEY= +# GOCLAW_LARK_VERIFICATION_TOKEN= +GOCLAW_ZALO_TOKEN= +# GOCLAW_WHATSAPP_BRIDGE_URL= # --- Database (only for non-Docker deployments) --- # Docker Compose auto-builds this from POSTGRES_USER/PASSWORD/DB. diff --git a/cmd/onboard_managed.go b/cmd/onboard_managed.go index fc18455c..80f4b8c6 100644 --- a/cmd/onboard_managed.go +++ b/cmd/onboard_managed.go @@ -66,10 +66,7 @@ func seedManagedData(dsn string, cfg *config.Config) error { continue } - providerType := "openai_compat" - if name == "anthropic" { - providerType = "anthropic_native" - } + providerType := resolveProviderType(name) p := &store.LLMProviderData{ Name: name, @@ -314,6 +311,34 @@ func resolveProviderAPIKey(cfg *config.Config, providerName string) string { } } +// resolveProviderType maps a provider name to its store.Provider* type constant. +func resolveProviderType(name string) string { + switch name { + case "anthropic": + return store.ProviderAnthropicNative + case "gemini": + return store.ProviderGeminiNative + case "minimax": + return store.ProviderMiniMax + case "openrouter": + return store.ProviderOpenRouter + case "groq": + return store.ProviderGroq + case "deepseek": + return store.ProviderDeepSeek + case "mistral": + return store.ProviderMistral + case "xai": + return store.ProviderXAI + case "cohere": + return store.ProviderCohere + case "perplexity": + return store.ProviderPerplexity + default: + return store.ProviderOpenAICompat + } +} + // resolveProviderAPIBase returns the default API base URL for known providers. func resolveProviderAPIBase(providerName string) string { switch providerName { diff --git a/docker-compose.yml b/docker-compose.yml index 29e60f35..6eb19bc7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,9 +40,17 @@ services: - GOCLAW_GEMINI_API_KEY=${GOCLAW_GEMINI_API_KEY:-} - GOCLAW_MISTRAL_API_KEY=${GOCLAW_MISTRAL_API_KEY:-} - GOCLAW_XAI_API_KEY=${GOCLAW_XAI_API_KEY:-} + - GOCLAW_COHERE_API_KEY=${GOCLAW_COHERE_API_KEY:-} + - GOCLAW_PERPLEXITY_API_KEY=${GOCLAW_PERPLEXITY_API_KEY:-} # Channels - GOCLAW_TELEGRAM_TOKEN=${GOCLAW_TELEGRAM_TOKEN:-} - GOCLAW_DISCORD_TOKEN=${GOCLAW_DISCORD_TOKEN:-} + - GOCLAW_LARK_APP_ID=${GOCLAW_LARK_APP_ID:-} + - GOCLAW_LARK_APP_SECRET=${GOCLAW_LARK_APP_SECRET:-} + - GOCLAW_LARK_ENCRYPT_KEY=${GOCLAW_LARK_ENCRYPT_KEY:-} + - GOCLAW_LARK_VERIFICATION_TOKEN=${GOCLAW_LARK_VERIFICATION_TOKEN:-} + - GOCLAW_ZALO_TOKEN=${GOCLAW_ZALO_TOKEN:-} + - GOCLAW_WHATSAPP_BRIDGE_URL=${GOCLAW_WHATSAPP_BRIDGE_URL:-} # Debug - GOCLAW_TRACE_VERBOSE=${GOCLAW_TRACE_VERBOSE:-0} volumes: diff --git a/internal/config/config_load.go b/internal/config/config_load.go index c3bf0416..9cf1a297 100644 --- a/internal/config/config_load.go +++ b/internal/config/config_load.go @@ -108,10 +108,11 @@ func (c *Config) applyEnvOverrides() { envStr("GOCLAW_TELEGRAM_TOKEN", &c.Channels.Telegram.Token) envStr("GOCLAW_DISCORD_TOKEN", &c.Channels.Discord.Token) envStr("GOCLAW_ZALO_TOKEN", &c.Channels.Zalo.Token) - envStr("GOCLAW_FEISHU_APP_ID", &c.Channels.Feishu.AppID) - envStr("GOCLAW_FEISHU_APP_SECRET", &c.Channels.Feishu.AppSecret) - envStr("GOCLAW_FEISHU_ENCRYPT_KEY", &c.Channels.Feishu.EncryptKey) - envStr("GOCLAW_FEISHU_VERIFICATION_TOKEN", &c.Channels.Feishu.VerificationToken) + envStr("GOCLAW_LARK_APP_ID", &c.Channels.Feishu.AppID) + envStr("GOCLAW_LARK_APP_SECRET", &c.Channels.Feishu.AppSecret) + envStr("GOCLAW_LARK_ENCRYPT_KEY", &c.Channels.Feishu.EncryptKey) + envStr("GOCLAW_LARK_VERIFICATION_TOKEN", &c.Channels.Feishu.VerificationToken) + envStr("GOCLAW_WHATSAPP_BRIDGE_URL", &c.Channels.WhatsApp.BridgeURL) // TTS secrets envStr("GOCLAW_TTS_OPENAI_API_KEY", &c.Tts.OpenAI.APIKey) @@ -132,6 +133,9 @@ func (c *Config) applyEnvOverrides() { if c.Channels.Feishu.AppID != "" && c.Channels.Feishu.AppSecret != "" { c.Channels.Feishu.Enabled = true } + if c.Channels.WhatsApp.BridgeURL != "" { + c.Channels.WhatsApp.Enabled = true + } // Allow overriding default provider/model envStr("GOCLAW_PROVIDER", &c.Agents.Defaults.Provider) diff --git a/prepare-env.sh b/prepare-env.sh index 81de9446..81fc26d3 100755 --- a/prepare-env.sh +++ b/prepare-env.sh @@ -85,7 +85,8 @@ fi has_provider=false for key in GOCLAW_OPENROUTER_API_KEY GOCLAW_ANTHROPIC_API_KEY GOCLAW_OPENAI_API_KEY \ GOCLAW_MINIMAX_API_KEY GOCLAW_GROQ_API_KEY GOCLAW_DEEPSEEK_API_KEY \ - GOCLAW_GEMINI_API_KEY GOCLAW_MISTRAL_API_KEY GOCLAW_XAI_API_KEY; do + GOCLAW_GEMINI_API_KEY GOCLAW_MISTRAL_API_KEY GOCLAW_XAI_API_KEY \ + GOCLAW_COHERE_API_KEY GOCLAW_PERPLEXITY_API_KEY; do val="$(get_env_val "$key")" if [ -n "$val" ]; then has_provider=true