diff --git a/pkg/config/config.go b/pkg/config/config.go index d84772d2b..bb28d3935 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -617,6 +617,12 @@ func LoadConfig(path string) (*Config, error) { cfg.ModelList = ConvertProvidersToModelList(cfg) } + // If model_list is still empty and no legacy providers, use default model list + // This ensures new users get a working config template on first run + if len(cfg.ModelList) == 0 && !cfg.HasProvidersConfig() { + cfg.ModelList = GetDefaultModelList() + } + // Validate model_list for uniqueness and required fields if err := cfg.ValidateModelList(); err != nil { return nil, err diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index ebb924859..898ad8fdb 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -134,160 +134,10 @@ func DefaultConfig() *Config { Providers: ProvidersConfig{ OpenAI: OpenAIProviderConfig{WebSearch: true}, }, - ModelList: []ModelConfig{ - // ============================================ - // Add your API key to the model you want to use - // ============================================ - - // Zhipu AI (智谱) - https://open.bigmodel.cn/usercenter/apikeys - { - ModelName: "glm-4.7", - Model: "zhipu/glm-4.7", - APIBase: "https://open.bigmodel.cn/api/paas/v4", - APIKey: "", - }, - - // OpenAI - https://platform.openai.com/api-keys - { - ModelName: "gpt-5.2", - Model: "openai/gpt-5.2", - APIBase: "https://api.openai.com/v1", - APIKey: "", - }, - - // Anthropic Claude - https://console.anthropic.com/settings/keys - { - ModelName: "claude-sonnet-4.6", - Model: "anthropic/claude-sonnet-4.6", - APIBase: "https://api.anthropic.com/v1", - APIKey: "", - }, - - // DeepSeek - https://platform.deepseek.com/ - { - ModelName: "deepseek-chat", - Model: "deepseek/deepseek-chat", - APIBase: "https://api.deepseek.com/v1", - APIKey: "", - }, - - // Google Gemini - https://ai.google.dev/ - { - ModelName: "gemini-2.0-flash", - Model: "gemini/gemini-2.0-flash-exp", - APIBase: "https://generativelanguage.googleapis.com/v1beta", - APIKey: "", - }, - - // Qwen (通义千问) - https://dashscope.console.aliyun.com/apiKey - { - ModelName: "qwen-plus", - Model: "qwen/qwen-plus", - APIBase: "https://dashscope.aliyuncs.com/compatible-mode/v1", - APIKey: "", - }, - - // Moonshot (月之暗面) - https://platform.moonshot.cn/console/api-keys - { - ModelName: "moonshot-v1-8k", - Model: "moonshot/moonshot-v1-8k", - APIBase: "https://api.moonshot.cn/v1", - APIKey: "", - }, - - // Groq - https://console.groq.com/keys - { - ModelName: "llama-3.3-70b", - Model: "groq/llama-3.3-70b-versatile", - APIBase: "https://api.groq.com/openai/v1", - APIKey: "", - }, - - // OpenRouter (100+ models) - https://openrouter.ai/keys - { - ModelName: "openrouter-auto", - Model: "openrouter/auto", - APIBase: "https://openrouter.ai/api/v1", - APIKey: "", - }, - { - ModelName: "openrouter-gpt-5.2", - Model: "openrouter/openai/gpt-5.2", - APIBase: "https://openrouter.ai/api/v1", - APIKey: "", - }, - - // NVIDIA - https://build.nvidia.com/ - { - ModelName: "nemotron-4-340b", - Model: "nvidia/nemotron-4-340b-instruct", - APIBase: "https://integrate.api.nvidia.com/v1", - APIKey: "", - }, - - // Cerebras - https://inference.cerebras.ai/ - { - ModelName: "cerebras-llama-3.3-70b", - Model: "cerebras/llama-3.3-70b", - APIBase: "https://api.cerebras.ai/v1", - APIKey: "", - }, - - // Volcengine (火山引擎) - https://console.volcengine.com/ark - { - ModelName: "doubao-pro", - Model: "volcengine/doubao-pro-32k", - APIBase: "https://ark.cn-beijing.volces.com/api/v3", - APIKey: "", - }, - - // ShengsuanYun (神算云) - { - ModelName: "deepseek-v3", - Model: "shengsuanyun/deepseek-v3", - APIBase: "https://api.shengsuanyun.com/v1", - APIKey: "", - }, - - // Antigravity (Google Cloud Code Assist) - OAuth only - { - ModelName: "gemini-flash", - Model: "antigravity/gemini-3-flash", - AuthMethod: "oauth", - }, - - // GitHub Copilot - https://github.com/settings/tokens - { - ModelName: "copilot-gpt-5.2", - Model: "github-copilot/gpt-5.2", - APIBase: "http://localhost:4321", - AuthMethod: "oauth", - }, - - // Ollama (local) - https://ollama.com - { - ModelName: "llama3", - Model: "ollama/llama3", - APIBase: "http://localhost:11434/v1", - APIKey: "ollama", - }, - - // Mistral AI - https://console.mistral.ai/api-keys - { - ModelName: "mistral-small", - Model: "mistral/mistral-small-latest", - APIBase: "https://api.mistral.ai/v1", - APIKey: "", - }, - - // VLLM (local) - http://localhost:8000 - { - ModelName: "local-model", - Model: "vllm/custom-model", - APIBase: "http://localhost:8000/v1", - APIKey: "", - }, - }, + // NOTE: ModelList is intentionally nil here to avoid inheriting default values + // when users provide partial config. The actual default model list is applied + // in LoadConfig when both ModelList and legacy providers are empty. + ModelList: nil, Gateway: GatewayConfig{ Host: "127.0.0.1", Port: 18790, @@ -345,3 +195,163 @@ func DefaultConfig() *Config { }, } } + +// GetDefaultModelList returns the default model list template for first-time users. +// This is separate from DefaultConfig to avoid the JSON parser inheriting default values +// when users provide partial configuration (issue #680). +func GetDefaultModelList() []ModelConfig { + return []ModelConfig{ + // ============================================ + // Add your API key to the model you want to use + // ============================================ + + // Zhipu AI (智谱) - https://open.bigmodel.cn/usercenter/apikeys + { + ModelName: "glm-4.7", + Model: "zhipu/glm-4.7", + APIBase: "https://open.bigmodel.cn/api/paas/v4", + APIKey: "", + }, + + // OpenAI - https://platform.openai.com/api-keys + { + ModelName: "gpt-5.2", + Model: "openai/gpt-5.2", + APIBase: "https://api.openai.com/v1", + APIKey: "", + }, + + // Anthropic Claude - https://console.anthropic.com/settings/keys + { + ModelName: "claude-sonnet-4.6", + Model: "anthropic/claude-sonnet-4.6", + APIBase: "https://api.anthropic.com/v1", + APIKey: "", + }, + + // DeepSeek - https://platform.deepseek.com/ + { + ModelName: "deepseek-chat", + Model: "deepseek/deepseek-chat", + APIBase: "https://api.deepseek.com/v1", + APIKey: "", + }, + + // Google Gemini - https://ai.google.dev/ + { + ModelName: "gemini-2.0-flash", + Model: "gemini/gemini-2.0-flash-exp", + APIBase: "https://generativelanguage.googleapis.com/v1beta", + APIKey: "", + }, + + // Qwen (通义千问) - https://dashscope.console.aliyun.com/apiKey + { + ModelName: "qwen-plus", + Model: "qwen/qwen-plus", + APIBase: "https://dashscope.aliyuncs.com/compatible-mode/v1", + APIKey: "", + }, + + // Moonshot (月之暗面) - https://platform.moonshot.cn/console/api-keys + { + ModelName: "moonshot-v1-8k", + Model: "moonshot/moonshot-v1-8k", + APIBase: "https://api.moonshot.cn/v1", + APIKey: "", + }, + + // Groq - https://console.groq.com/keys + { + ModelName: "llama-3.3-70b", + Model: "groq/llama-3.3-70b-versatile", + APIBase: "https://api.groq.com/openai/v1", + APIKey: "", + }, + + // OpenRouter (100+ models) - https://openrouter.ai/keys + { + ModelName: "openrouter-auto", + Model: "openrouter/auto", + APIBase: "https://openrouter.ai/api/v1", + APIKey: "", + }, + { + ModelName: "openrouter-gpt-5.2", + Model: "openrouter/openai/gpt-5.2", + APIBase: "https://openrouter.ai/api/v1", + APIKey: "", + }, + + // NVIDIA - https://build.nvidia.com/ + { + ModelName: "nemotron-4-340b", + Model: "nvidia/nemotron-4-340b-instruct", + APIBase: "https://integrate.api.nvidia.com/v1", + APIKey: "", + }, + + // Cerebras - https://inference.cerebras.ai/ + { + ModelName: "cerebras-llama-3.3-70b", + Model: "cerebras/llama-3.3-70b", + APIBase: "https://api.cerebras.ai/v1", + APIKey: "", + }, + + // Volcengine (火山引擎) - https://console.volcengine.com/ark + { + ModelName: "doubao-pro", + Model: "volcengine/doubao-pro-32k", + APIBase: "https://ark.cn-beijing.volces.com/api/v3", + APIKey: "", + }, + + // ShengsuanYun (神算云) + { + ModelName: "deepseek-v3", + Model: "shengsuanyun/deepseek-v3", + APIBase: "https://api.shengsuanyun.com/v1", + APIKey: "", + }, + + // Antigravity (Google Cloud Code Assist) - OAuth only + { + ModelName: "gemini-flash", + Model: "antigravity/gemini-3-flash", + AuthMethod: "oauth", + }, + + // GitHub Copilot - https://github.com/settings/tokens + { + ModelName: "copilot-gpt-5.2", + Model: "github-copilot/gpt-5.2", + APIBase: "http://localhost:4321", + AuthMethod: "oauth", + }, + + // Ollama (local) - https://ollama.com + { + ModelName: "llama3", + Model: "ollama/llama3", + APIBase: "http://localhost:11434/v1", + APIKey: "ollama", + }, + + // Mistral AI - https://console.mistral.ai/api-keys + { + ModelName: "mistral-small", + Model: "mistral/mistral-small-latest", + APIBase: "https://api.mistral.ai/v1", + APIKey: "", + }, + + // VLLM (local) - http://localhost:8000 + { + ModelName: "local-model", + Model: "vllm/custom-model", + APIBase: "http://localhost:8000/v1", + APIKey: "", + }, + } +}