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/registry.go
2026-03-02 09:58:38 +00:00

110 lines
3.0 KiB
Go

package providers
import (
"fmt"
"sync"
)
// registry holds all registered providers.
var (
registry = make(map[string]Provider)
mu sync.RWMutex
)
// Register adds a provider to the registry.
func Register(p Provider) {
mu.Lock()
defer mu.Unlock()
registry[p.ID()] = p
}
// Get returns a provider by ID.
func Get(id string) (Provider, error) {
mu.RLock()
defer mu.RUnlock()
p, ok := registry[id]
if !ok {
return nil, fmt.Errorf("unknown provider: %s", id)
}
return p, nil
}
// List returns all registered provider IDs.
func List() []string {
mu.RLock()
defer mu.RUnlock()
ids := make([]string, 0, len(registry))
for id := range registry {
ids = append(ids, id)
}
return ids
}
// ── Provider Type Metadata ──────────────────
// ProviderTypeMeta describes a registered provider type for the admin API.
type ProviderTypeMeta struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
DefaultEndpoint string `json:"default_endpoint"`
ProfileSchema ProfileSchema `json:"profile_schema"`
}
var providerTypes = map[string]ProviderTypeMeta{}
// RegisterType adds a provider type with its metadata to the type registry.
// Called by Init() for built-in types. External types can be registered at startup.
func RegisterType(meta ProviderTypeMeta, p Provider) {
mu.Lock()
defer mu.Unlock()
registry[meta.ID] = p
providerTypes[meta.ID] = meta
}
// ListTypes returns metadata for all registered provider types.
func ListTypes() []ProviderTypeMeta {
mu.RLock()
defer mu.RUnlock()
out := make([]ProviderTypeMeta, 0, len(providerTypes))
for _, m := range providerTypes {
out = append(out, m)
}
return out
}
// Init registers all built-in providers.
func Init() {
RegisterType(ProviderTypeMeta{
ID: "openai",
Name: "OpenAI",
Description: "OpenAI and any OpenAI-compatible API (Ollama, LiteLLM, etc.)",
DefaultEndpoint: "https://api.openai.com/v1",
ProfileSchema: GetProfileSchema("openai"),
}, &OpenAIProvider{})
RegisterType(ProviderTypeMeta{
ID: "anthropic",
Name: "Anthropic",
Description: "Anthropic Messages API (Claude models)",
DefaultEndpoint: "https://api.anthropic.com",
ProfileSchema: GetProfileSchema("anthropic"),
}, &AnthropicProvider{})
RegisterType(ProviderTypeMeta{
ID: "venice",
Name: "Venice",
Description: "Venice.ai — privacy-focused, OpenAI-compatible with extensions",
DefaultEndpoint: "https://api.venice.ai/api/v1",
ProfileSchema: GetProfileSchema("venice"),
}, &VeniceProvider{})
RegisterType(ProviderTypeMeta{
ID: "openrouter",
Name: "OpenRouter",
Description: "OpenRouter — unified API for 300+ models with per-model pricing",
DefaultEndpoint: "https://openrouter.ai/api/v1",
ProfileSchema: GetProfileSchema("openrouter"),
}, &OpenRouterProvider{})
}