fix: Correct provider type seeding and add missing env vars for all channels

- 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 <noreply@anthropic.com>
This commit is contained in:
viettranxandClaude Opus 4.6 committed 2026-02-28 11:46:59 +07:00
1 parent fcaf3531ba
commit 7450e7014a
5 files changed
+64 -12

No files matched your search

+17 -3
View File
@@ -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.
+29 -4
View File
@@ -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 {
+8
View File
@@ -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:
+8 -4
View File
@@ -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)
+2 -1
View File
@@ -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