1
0
Files
nex/backend/internal/conversion/middleware.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

77 lines
2.2 KiB
Go

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
}