68 lines
1.6 KiB
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
|
|
}
|