feat: Introduce core configuration management with an example file and a provider factory.
This commit is contained in:
parent
1945436dd4
commit
06efabf2de
3 changed files with 32 additions and 4 deletions
|
|
@ -46,6 +46,14 @@
|
|||
"model": "openai/gpt-5.2",
|
||||
"api_key": "sk-key2",
|
||||
"api_base": "https://api2.example.com/v1"
|
||||
},
|
||||
{
|
||||
"_comment": "Cloudflare AI example: use 'provider' field when model name contains special characters like @cf/",
|
||||
"model_name": "cf_qwen",
|
||||
"model": "@cf/qwen/qwen3-30b-a3b-fp8",
|
||||
"provider": "own",
|
||||
"api_key": "YOUR_CLOUDFLARE_API_TOKEN",
|
||||
"api_base": "https://api.cloudflare.com/client/v4/accounts/[YOUR_ACCOUNT_ID]/ai/v1"
|
||||
}
|
||||
],
|
||||
"channels": {
|
||||
|
|
|
|||
|
|
@ -501,10 +501,16 @@ type OpenAIProviderConfig struct {
|
|||
// The model field uses protocol prefix format: [protocol/]model-identifier
|
||||
// Supported protocols: openai, anthropic, antigravity, claude-cli, codex-cli, github-copilot
|
||||
// Default protocol is "openai" if no prefix is specified.
|
||||
//
|
||||
// The optional Provider field explicitly sets the protocol/provider, overriding the
|
||||
// prefix parsed from the Model field. This is useful when the model identifier
|
||||
// itself contains slashes that would be misinterpreted as a protocol prefix
|
||||
// (e.g. Cloudflare AI models like "@cf/qwen/qwen3-30b-a3b-fp8").
|
||||
type ModelConfig struct {
|
||||
// Required fields
|
||||
ModelName string `json:"model_name"` // User-facing alias for the model
|
||||
Model string `json:"model"` // Protocol/model-identifier (e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4.6")
|
||||
Model string `json:"model"` // Model identifier, optionally prefixed with protocol (e.g., "openai/gpt-4o")
|
||||
Provider string `json:"provider,omitempty"` // Explicit protocol/provider override (e.g., "openai", "anthropic", "cloudflare", "own")
|
||||
|
||||
// HTTP-based providers
|
||||
APIBase string `json:"api_base,omitempty"` // API endpoint URL
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ func createCodexAuthProvider() (LLMProvider, error) {
|
|||
// - "openai/gpt-4o" -> ("openai", "gpt-4o")
|
||||
// - "anthropic/claude-sonnet-4.6" -> ("anthropic", "claude-sonnet-4.6")
|
||||
// - "gpt-4o" -> ("openai", "gpt-4o") // default protocol
|
||||
//
|
||||
// Note: use CreateProviderFromConfig when a ModelConfig is available, as it
|
||||
// respects the explicit Provider override field (needed for models whose
|
||||
// identifiers contain slashes, e.g. Cloudflare "@cf/qwen/qwen3-30b-a3b-fp8").
|
||||
func ExtractProtocol(model string) (protocol, modelID string) {
|
||||
model = strings.TrimSpace(model)
|
||||
protocol, modelID, found := strings.Cut(model, "/")
|
||||
|
|
@ -64,7 +68,17 @@ func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, err
|
|||
return nil, "", fmt.Errorf("model is required")
|
||||
}
|
||||
|
||||
protocol, modelID := ExtractProtocol(cfg.Model)
|
||||
// If Provider is explicitly set, use it as the protocol and treat the entire
|
||||
// Model string as the model identifier (no prefix stripping). This handles
|
||||
// models whose names contain slashes that would otherwise be misinterpreted
|
||||
// as a protocol prefix (e.g. Cloudflare AI: "@cf/qwen/qwen3-30b-a3b-fp8").
|
||||
var protocol, modelID string
|
||||
if cfg.Provider != "" {
|
||||
protocol = strings.ToLower(strings.TrimSpace(cfg.Provider))
|
||||
modelID = cfg.Model
|
||||
} else {
|
||||
protocol, modelID = ExtractProtocol(cfg.Model)
|
||||
}
|
||||
|
||||
switch protocol {
|
||||
case "openai":
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue