refactor: 实现 ConversionEngine 协议转换引擎,替代旧 protocol 包
引入 Canonical Model 和 ProtocolAdapter 架构,支持 OpenAI/Anthropic 协议间 无缝转换,统一 ProxyHandler 替代分散的 OpenAI/Anthropic Handler,简化 ProviderClient 为协议无关的 HTTP 发送器,Provider 新增 protocol 字段。
This commit is contained in:
100
backend/internal/conversion/adapter.go
Normal file
100
backend/internal/conversion/adapter.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package conversion
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"nex/backend/internal/conversion/canonical"
|
||||
)
|
||||
|
||||
// ProtocolAdapter 协议适配器接口
|
||||
type ProtocolAdapter interface {
|
||||
ProtocolName() string
|
||||
ProtocolVersion() string
|
||||
SupportsPassthrough() bool
|
||||
|
||||
DetectInterfaceType(nativePath string) InterfaceType
|
||||
BuildUrl(nativePath string, interfaceType InterfaceType) string
|
||||
BuildHeaders(provider *TargetProvider) map[string]string
|
||||
SupportsInterface(interfaceType InterfaceType) bool
|
||||
|
||||
DecodeRequest(raw []byte) (*canonical.CanonicalRequest, error)
|
||||
EncodeRequest(req *canonical.CanonicalRequest, provider *TargetProvider) ([]byte, error)
|
||||
DecodeResponse(raw []byte) (*canonical.CanonicalResponse, error)
|
||||
EncodeResponse(resp *canonical.CanonicalResponse) ([]byte, error)
|
||||
|
||||
CreateStreamDecoder() StreamDecoder
|
||||
CreateStreamEncoder() StreamEncoder
|
||||
|
||||
EncodeError(err *ConversionError) ([]byte, int)
|
||||
|
||||
DecodeModelsResponse(raw []byte) (*canonical.CanonicalModelList, error)
|
||||
EncodeModelsResponse(list *canonical.CanonicalModelList) ([]byte, error)
|
||||
DecodeModelInfoResponse(raw []byte) (*canonical.CanonicalModelInfo, error)
|
||||
EncodeModelInfoResponse(info *canonical.CanonicalModelInfo) ([]byte, error)
|
||||
DecodeEmbeddingRequest(raw []byte) (*canonical.CanonicalEmbeddingRequest, error)
|
||||
EncodeEmbeddingRequest(req *canonical.CanonicalEmbeddingRequest, provider *TargetProvider) ([]byte, error)
|
||||
DecodeEmbeddingResponse(raw []byte) (*canonical.CanonicalEmbeddingResponse, error)
|
||||
EncodeEmbeddingResponse(resp *canonical.CanonicalEmbeddingResponse) ([]byte, error)
|
||||
DecodeRerankRequest(raw []byte) (*canonical.CanonicalRerankRequest, error)
|
||||
EncodeRerankRequest(req *canonical.CanonicalRerankRequest, provider *TargetProvider) ([]byte, error)
|
||||
DecodeRerankResponse(raw []byte) (*canonical.CanonicalRerankResponse, error)
|
||||
EncodeRerankResponse(resp *canonical.CanonicalRerankResponse) ([]byte, error)
|
||||
}
|
||||
|
||||
// AdapterRegistry 适配器注册表接口
|
||||
type AdapterRegistry interface {
|
||||
Register(adapter ProtocolAdapter) error
|
||||
Get(protocolName string) (ProtocolAdapter, error)
|
||||
ListProtocols() []string
|
||||
}
|
||||
|
||||
// memoryRegistry 基于内存的适配器注册表
|
||||
type memoryRegistry struct {
|
||||
mu sync.RWMutex
|
||||
adapters map[string]ProtocolAdapter
|
||||
}
|
||||
|
||||
// NewMemoryRegistry 创建内存注册表
|
||||
func NewMemoryRegistry() AdapterRegistry {
|
||||
return &memoryRegistry{
|
||||
adapters: make(map[string]ProtocolAdapter),
|
||||
}
|
||||
}
|
||||
|
||||
// Register 注册适配器
|
||||
func (r *memoryRegistry) Register(adapter ProtocolAdapter) error {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
|
||||
name := adapter.ProtocolName()
|
||||
if _, exists := r.adapters[name]; exists {
|
||||
return fmt.Errorf("适配器已注册: %s", name)
|
||||
}
|
||||
r.adapters[name] = adapter
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get 获取适配器
|
||||
func (r *memoryRegistry) Get(protocolName string) (ProtocolAdapter, error) {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
|
||||
adapter, ok := r.adapters[protocolName]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("未找到适配器: %s", protocolName)
|
||||
}
|
||||
return adapter, nil
|
||||
}
|
||||
|
||||
// ListProtocols 列出所有已注册协议
|
||||
func (r *memoryRegistry) ListProtocols() []string {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
|
||||
protocols := make([]string, 0, len(r.adapters))
|
||||
for name := range r.adapters {
|
||||
protocols = append(protocols, name)
|
||||
}
|
||||
return protocols
|
||||
}
|
||||
Reference in New Issue
Block a user