- Implement Config class with YAML loading and environment variable support - Implement Provider interface and factory pattern - Implement SiliconFlow provider as example - Implement Translator core class with prompt management - Create CLI entry point - Add configuration template and unit tests - Update changelog and discussion records Version: 0.0.2
100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package provider
|
||
|
||
import (
|
||
"fmt"
|
||
"sync"
|
||
)
|
||
|
||
// ProviderFactory 厂商工厂
|
||
type ProviderFactory struct {
|
||
providers map[string]func(ProviderConfig) (Provider, error)
|
||
mu sync.RWMutex
|
||
}
|
||
|
||
// NewProviderFactory 创建工厂实例
|
||
func NewProviderFactory() *ProviderFactory {
|
||
factory := &ProviderFactory{
|
||
providers: make(map[string]func(ProviderConfig) (Provider, error)),
|
||
}
|
||
|
||
// 注册所有厂商(延迟注册,避免循环依赖)
|
||
// 实际注册在init()函数中完成
|
||
|
||
return factory
|
||
}
|
||
|
||
// Register 注册厂商构造函数
|
||
func (f *ProviderFactory) Register(name string, creator func(ProviderConfig) (Provider, error)) {
|
||
f.mu.Lock()
|
||
defer f.mu.Unlock()
|
||
f.providers[name] = creator
|
||
}
|
||
|
||
// Create 创建厂商实例
|
||
func (f *ProviderFactory) Create(name string, config ProviderConfig) (Provider, error) {
|
||
f.mu.RLock()
|
||
creator, exists := f.providers[name]
|
||
f.mu.RUnlock()
|
||
|
||
if !exists {
|
||
return nil, fmt.Errorf("不支持的厂商: %s", name)
|
||
}
|
||
|
||
provider, err := creator(config)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("创建厂商实例失败: %w", err)
|
||
}
|
||
|
||
if err := provider.Validate(); err != nil {
|
||
return nil, fmt.Errorf("厂商配置验证失败: %w", err)
|
||
}
|
||
|
||
return provider, nil
|
||
}
|
||
|
||
// HasProvider 检查是否支持指定厂商
|
||
func (f *ProviderFactory) HasProvider(name string) bool {
|
||
f.mu.RLock()
|
||
defer f.mu.RUnlock()
|
||
_, exists := f.providers[name]
|
||
return exists
|
||
}
|
||
|
||
// GetSupportedProviders 获取所有支持的厂商
|
||
func (f *ProviderFactory) GetSupportedProviders() []string {
|
||
f.mu.RLock()
|
||
defer f.mu.RUnlock()
|
||
|
||
providers := make([]string, 0, len(f.providers))
|
||
for name := range f.providers {
|
||
providers = append(providers, name)
|
||
}
|
||
return providers
|
||
}
|
||
|
||
// 全局工厂实例
|
||
var defaultFactory *ProviderFactory
|
||
|
||
// init 初始化默认工厂
|
||
func init() {
|
||
defaultFactory = NewProviderFactory()
|
||
|
||
// 这里可以注册厂商,但由于循环依赖,实际注册会在各厂商的init()中完成
|
||
// 或者在main包中手动注册
|
||
}
|
||
|
||
// GetDefaultFactory 获取默认工厂
|
||
func GetDefaultFactory() *ProviderFactory {
|
||
return defaultFactory
|
||
}
|
||
|
||
// CreateProvider 使用默认工厂创建厂商
|
||
func CreateProvider(name string, config ProviderConfig) (Provider, error) {
|
||
return defaultFactory.Create(name, config)
|
||
}
|
||
|
||
// RegisterProvider 注册厂商到默认工厂
|
||
func RegisterProvider(name string, creator func(ProviderConfig) (Provider, error)) {
|
||
defaultFactory.Register(name, creator)
|
||
}
|