1
0
Files
nex/backend/internal/conversion/adapter.go
lanyuanxiaoyao 1dac347d3b refactor: 实现 ConversionEngine 协议转换引擎,替代旧 protocol 包
引入 Canonical Model 和 ProtocolAdapter 架构,支持 OpenAI/Anthropic 协议间
无缝转换,统一 ProxyHandler 替代分散的 OpenAI/Anthropic Handler,简化
ProviderClient 为协议无关的 HTTP 发送器,Provider 新增 protocol 字段。
2026-04-20 00:36:27 +08:00

101 lines
3.2 KiB
Go

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
}