From 86ff42b4fae734181119ca66a6bd5617b5ab9618 Mon Sep 17 00:00:00 2001 From: cuandada Date: Thu, 19 Feb 2026 15:01:32 +0800 Subject: [PATCH] This PR adds support for custom OpenAI-compatible endpoints, allowing users to connect to any OpenAI-compatible API such as LM Studio, llama.cpp, vLLM, Ollama, and more. - **Configuration** (`pkg/config/config.go`) - Added `Custom` field to `ProvidersConfig` struct - Initialized `Custom` default value in `DefaultConfig()` function - **Provider Factory** (`pkg/providers/factory.go`) - Added explicit `"custom"` provider configuration support in `resolveProviderSelection` function - Added custom provider auto-detection in fallback logic Add the following to your configuration file: ```json { "agents": { "defaults": { "provider": "custom", "model": "your-model-name" } }, "providers": { "custom": { "api_key": "your-api-key", "api_base": "https://api.your-provider.com/v1", "proxy": "" } } } ``` --- pkg/config/config.go | 2 ++ pkg/providers/factory.go | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/pkg/config/config.go b/pkg/config/config.go index 682996bd6..19bd474bf 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -263,6 +263,7 @@ type ProvidersConfig struct { ShengSuanYun ProviderConfig `json:"shengsuanyun"` DeepSeek ProviderConfig `json:"deepseek"` GitHubCopilot ProviderConfig `json:"github_copilot"` + Custom ProviderConfig `json:"custom"` } type ProviderConfig struct { @@ -411,6 +412,7 @@ func DefaultConfig() *Config { Nvidia: ProviderConfig{}, Moonshot: ProviderConfig{}, ShengSuanYun: ProviderConfig{}, + Custom: ProviderConfig{}, }, Gateway: GatewayConfig{ Host: "0.0.0.0", diff --git a/pkg/providers/factory.go b/pkg/providers/factory.go index e39cfe32b..c18980b7c 100644 --- a/pkg/providers/factory.go +++ b/pkg/providers/factory.go @@ -75,6 +75,12 @@ func resolveProviderSelection(cfg *config.Config) (providerSelection, error) { // First, prefer explicit provider configuration. if providerName != "" { switch providerName { + case "custom": + if cfg.Providers.Custom.APIBase != "" { + sel.apiKey = cfg.Providers.Custom.APIKey + sel.apiBase = cfg.Providers.Custom.APIBase + sel.proxy = cfg.Providers.Custom.Proxy + } case "groq": if cfg.Providers.Groq.APIKey != "" { sel.apiKey = cfg.Providers.Groq.APIKey @@ -214,6 +220,10 @@ func resolveProviderSelection(cfg *config.Config) (providerSelection, error) { // Fallback: infer provider from model and configured keys. if sel.apiKey == "" && sel.apiBase == "" { switch { + case cfg.Providers.Custom.APIBase != "": + sel.apiKey = cfg.Providers.Custom.APIKey + sel.apiBase = cfg.Providers.Custom.APIBase + sel.proxy = cfg.Providers.Custom.Proxy case (strings.Contains(lowerModel, "kimi") || strings.Contains(lowerModel, "moonshot") || strings.HasPrefix(model, "moonshot/")) && cfg.Providers.Moonshot.APIKey != "": sel.apiKey = cfg.Providers.Moonshot.APIKey sel.apiBase = cfg.Providers.Moonshot.APIBase