This repository has been archived on 2026-04-03. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
core/server/providers/profile.go
2026-03-04 10:44:42 +00:00

155 lines
5.1 KiB
Go

package providers
// ProfileSchema describes the available settings for a provider type.
// Used by the admin UI to render forms and by validation on save.
type ProfileSchema struct {
// Fields lists the configurable settings in display order.
Fields []ProfileField `json:"fields"`
}
// ProfileField describes a single setting within a provider profile.
type ProfileField struct {
Key string `json:"key"` // settings JSON key
Label string `json:"label"` // human-readable name
Description string `json:"description,omitempty"` // help text
Type string `json:"type"` // "bool", "int", "string", "enum", "float"
Default interface{} `json:"default,omitempty"` // default value
EnumValues []string `json:"enum_values,omitempty"` // valid values when Type="enum"
Min *int `json:"min,omitempty"` // min for int/float
Max *int `json:"max,omitempty"` // max for int/float
DependsOn string `json:"depends_on,omitempty"` // only show when this key is truthy
ProviderOnly bool `json:"provider_only,omitempty"` // not overridable at persona level
}
// ── Built-in Profile Schemas ────────────────
// intPtr is a helper for literal pointers in struct init.
func intPtr(v int) *int { return &v }
var profileSchemas = map[string]ProfileSchema{
"openai": {
Fields: []ProfileField{
{
Key: "system_prompt_prefix",
Label: "System Prompt Prefix",
Description: "Prepended to every system prompt sent to this provider.",
Type: "string",
},
{
Key: "frequency_penalty",
Label: "Frequency Penalty",
Description: "Penalizes repeated tokens. Range: -2.0 to 2.0.",
Type: "float",
},
{
Key: "presence_penalty",
Label: "Presence Penalty",
Description: "Penalizes tokens already present. Range: -2.0 to 2.0.",
Type: "float",
},
},
},
"anthropic": {
Fields: []ProfileField{
{
Key: "system_prompt_prefix",
Label: "System Prompt Prefix",
Description: "Prepended to every system prompt sent to this provider.",
Type: "string",
},
{
Key: "extended_thinking",
Label: "Extended Thinking",
Description: "Enable Anthropic extended thinking mode. Sends thinking.type=enabled with budget_tokens.",
Type: "bool",
Default: false,
},
{
Key: "thinking_budget",
Label: "Thinking Budget (tokens)",
Description: "Max tokens for the thinking phase. Only used when extended_thinking is enabled.",
Type: "int",
Default: 10000,
Min: intPtr(1024),
Max: intPtr(128000),
DependsOn: "extended_thinking",
},
},
},
"venice": {
Fields: []ProfileField{
{
Key: "system_prompt_prefix",
Label: "System Prompt Prefix",
Description: "Prepended to every system prompt. Venice also injects its own character prompt.",
Type: "string",
},
{
Key: "enable_thinking",
Label: "Enable Thinking",
Description: "Send venice_parameters.include_venice_system_prompt=false and enable thinking output.",
Type: "bool",
Default: false,
},
{
Key: "enable_web_search",
Label: "Enable Web Search",
Description: "Allow Venice to search the web for context (venice_parameters.enable_web_search).",
Type: "bool",
Default: false,
},
{
Key: "include_venice_system_prompt",
Label: "Include Venice System Prompt",
Description: "Include Venice's built-in character system prompt.",
Type: "bool",
Default: true,
},
},
},
"openrouter": {
Fields: []ProfileField{
{
Key: "system_prompt_prefix",
Label: "System Prompt Prefix",
Description: "Prepended to every system prompt sent through OpenRouter.",
Type: "string",
},
{
Key: "route",
Label: "Routing Strategy",
Description: "How OpenRouter selects the underlying provider for a model.",
Type: "enum",
Default: "auto",
EnumValues: []string{"auto", "fallback"},
ProviderOnly: true,
},
{
Key: "require_parameters",
Label: "Require Parameters Support",
Description: "Only route to providers that support the requested parameters (tools, temperature, etc.).",
Type: "bool",
Default: true,
},
},
},
}
// GetProfileSchema returns the profile schema for a provider type.
// Falls back to the openai schema for unknown types (OpenAI-compatible).
func GetProfileSchema(providerType string) ProfileSchema {
if s, ok := profileSchemas[providerType]; ok {
return s
}
return profileSchemas["openai"]
}
// RegisterProfileSchema adds or replaces a profile schema for a provider type.
// Used for testing and future plugin support.
func RegisterProfileSchema(providerType string, schema ProfileSchema) {
profileSchemas[providerType] = schema
}