Files
ttstd-infinite-canvas/backend/internal/provider/registry.go

68 lines
1.6 KiB
Go

package provider
import (
"sync"
)
// Registry 插件注册中心
type Registry struct {
mu sync.RWMutex
providers []ModelCatalogPlugin
}
var globalRegistry = &Registry{}
// Register 注册插件
func Register(discovery ModelCatalogPlugin) {
globalRegistry.mu.Lock()
defer globalRegistry.mu.Unlock()
id := discovery.GetProviderID()
for index, registered := range globalRegistry.providers {
if registered.GetProviderID() == id {
globalRegistry.providers[index] = discovery
return
}
}
globalRegistry.providers = append(globalRegistry.providers, discovery)
}
// GetProvider 根据 ID 获取插件
func GetProvider(id string) (ModelCatalogPlugin, bool) {
globalRegistry.mu.RLock()
defer globalRegistry.mu.RUnlock()
for _, registered := range globalRegistry.providers {
if registered.GetProviderID() == id {
return registered, true
}
}
return nil, false
}
// MatchProvider 根据配置匹配插件
func MatchProvider(baseURL string, headers map[string]string) ModelCatalogPlugin {
globalRegistry.mu.RLock()
defer globalRegistry.mu.RUnlock()
// 按注册顺序匹配,避免 map 遍历导致多个厂商规则命中时结果不稳定。
for _, registered := range globalRegistry.providers {
if registered.Match(baseURL, headers) {
return registered
}
}
return nil
}
// ListProviders 列出所有已注册插件
func ListProviders() []ProviderMetadata {
globalRegistry.mu.RLock()
defer globalRegistry.mu.RUnlock()
result := make([]ProviderMetadata, 0, len(globalRegistry.providers))
for _, registered := range globalRegistry.providers {
result = append(result, registered.GetMetadata())
}
return result
}