refactor: 实现 ConversionEngine 协议转换引擎,替代旧 protocol 包
引入 Canonical Model 和 ProtocolAdapter 架构,支持 OpenAI/Anthropic 协议间 无缝转换,统一 ProxyHandler 替代分散的 OpenAI/Anthropic Handler,简化 ProviderClient 为协议无关的 HTTP 发送器,Provider 新增 protocol 字段。
This commit is contained in:
76
backend/internal/conversion/middleware.go
Normal file
76
backend/internal/conversion/middleware.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package conversion
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"nex/backend/internal/conversion/canonical"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// ConversionMiddleware 转换中间件接口
|
||||
type ConversionMiddleware interface {
|
||||
Intercept(req *canonical.CanonicalRequest, clientProtocol, providerProtocol string, ctx *ConversionContext) (*canonical.CanonicalRequest, error)
|
||||
InterceptStreamEvent(event *canonical.CanonicalStreamEvent, clientProtocol, providerProtocol string, ctx *ConversionContext) (*canonical.CanonicalStreamEvent, error)
|
||||
}
|
||||
|
||||
// ConversionContext 转换上下文
|
||||
type ConversionContext struct {
|
||||
ConversionID string
|
||||
InterfaceType InterfaceType
|
||||
Timestamp time.Time
|
||||
Metadata map[string]any
|
||||
}
|
||||
|
||||
// NewConversionContext 创建转换上下文
|
||||
func NewConversionContext(ifaceType InterfaceType) *ConversionContext {
|
||||
return &ConversionContext{
|
||||
ConversionID: uuid.New().String(),
|
||||
InterfaceType: ifaceType,
|
||||
Timestamp: time.Now().UTC(),
|
||||
Metadata: make(map[string]any),
|
||||
}
|
||||
}
|
||||
|
||||
// MiddlewareChain 中间件链
|
||||
type MiddlewareChain struct {
|
||||
middlewares []ConversionMiddleware
|
||||
}
|
||||
|
||||
// NewMiddlewareChain 创建中间件链
|
||||
func NewMiddlewareChain() *MiddlewareChain {
|
||||
return &MiddlewareChain{
|
||||
middlewares: make([]ConversionMiddleware, 0),
|
||||
}
|
||||
}
|
||||
|
||||
// Use 添加中间件
|
||||
func (c *MiddlewareChain) Use(mw ConversionMiddleware) {
|
||||
c.middlewares = append(c.middlewares, mw)
|
||||
}
|
||||
|
||||
// Apply 对请求按顺序执行所有中间件
|
||||
func (c *MiddlewareChain) Apply(req *canonical.CanonicalRequest, clientProtocol, providerProtocol string, ctx *ConversionContext) (*canonical.CanonicalRequest, error) {
|
||||
result := req
|
||||
for _, mw := range c.middlewares {
|
||||
var err error
|
||||
result, err = mw.Intercept(result, clientProtocol, providerProtocol, ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// ApplyStreamEvent 对流式事件按顺序执行所有中间件
|
||||
func (c *MiddlewareChain) ApplyStreamEvent(event *canonical.CanonicalStreamEvent, clientProtocol, providerProtocol string, ctx *ConversionContext) (*canonical.CanonicalStreamEvent, error) {
|
||||
result := event
|
||||
for _, mw := range c.middlewares {
|
||||
var err error
|
||||
result, err = mw.InterceptStreamEvent(result, clientProtocol, providerProtocol, ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
Reference in New Issue
Block a user