refactor: 实现 ConversionEngine 协议转换引擎,替代旧 protocol 包
引入 Canonical Model 和 ProtocolAdapter 架构,支持 OpenAI/Anthropic 协议间 无缝转换,统一 ProxyHandler 替代分散的 OpenAI/Anthropic Handler,简化 ProviderClient 为协议无关的 HTTP 发送器,Provider 新增 protocol 字段。
This commit is contained in:
107
backend/internal/conversion/stream.go
Normal file
107
backend/internal/conversion/stream.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package conversion
|
||||
|
||||
import "nex/backend/internal/conversion/canonical"
|
||||
|
||||
// StreamDecoder 流式解码器接口
|
||||
type StreamDecoder interface {
|
||||
ProcessChunk(rawChunk []byte) []canonical.CanonicalStreamEvent
|
||||
Flush() []canonical.CanonicalStreamEvent
|
||||
}
|
||||
|
||||
// StreamEncoder 流式编码器接口
|
||||
type StreamEncoder interface {
|
||||
EncodeEvent(event canonical.CanonicalStreamEvent) [][]byte
|
||||
Flush() [][]byte
|
||||
}
|
||||
|
||||
// StreamConverter 流式转换器接口
|
||||
type StreamConverter interface {
|
||||
ProcessChunk(rawChunk []byte) [][]byte
|
||||
Flush() [][]byte
|
||||
}
|
||||
|
||||
// PassthroughStreamConverter 同协议透传流式转换器
|
||||
type PassthroughStreamConverter struct{}
|
||||
|
||||
// NewPassthroughStreamConverter 创建透传流式转换器
|
||||
func NewPassthroughStreamConverter() *PassthroughStreamConverter {
|
||||
return &PassthroughStreamConverter{}
|
||||
}
|
||||
|
||||
// ProcessChunk 直接传递原始字节
|
||||
func (c *PassthroughStreamConverter) ProcessChunk(rawChunk []byte) [][]byte {
|
||||
return [][]byte{rawChunk}
|
||||
}
|
||||
|
||||
// Flush 无缓冲数据
|
||||
func (c *PassthroughStreamConverter) Flush() [][]byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
// CanonicalStreamConverter 跨协议规范流式转换器
|
||||
type CanonicalStreamConverter struct {
|
||||
decoder StreamDecoder
|
||||
encoder StreamEncoder
|
||||
chain *MiddlewareChain
|
||||
ctx ConversionContext
|
||||
clientProtocol string
|
||||
providerProtocol string
|
||||
}
|
||||
|
||||
// NewCanonicalStreamConverter 创建规范流式转换器
|
||||
func NewCanonicalStreamConverter(decoder StreamDecoder, encoder StreamEncoder) *CanonicalStreamConverter {
|
||||
return &CanonicalStreamConverter{
|
||||
decoder: decoder,
|
||||
encoder: encoder,
|
||||
}
|
||||
}
|
||||
|
||||
// NewCanonicalStreamConverterWithMiddleware 创建带中间件的规范流式转换器
|
||||
func NewCanonicalStreamConverterWithMiddleware(decoder StreamDecoder, encoder StreamEncoder, chain *MiddlewareChain, ctx ConversionContext, clientProtocol, providerProtocol string) *CanonicalStreamConverter {
|
||||
return &CanonicalStreamConverter{
|
||||
decoder: decoder,
|
||||
encoder: encoder,
|
||||
chain: chain,
|
||||
ctx: ctx,
|
||||
clientProtocol: clientProtocol,
|
||||
providerProtocol: providerProtocol,
|
||||
}
|
||||
}
|
||||
|
||||
// ProcessChunk 解码 → 中间件 → 编码管道
|
||||
func (c *CanonicalStreamConverter) ProcessChunk(rawChunk []byte) [][]byte {
|
||||
events := c.decoder.ProcessChunk(rawChunk)
|
||||
var result [][]byte
|
||||
for i := range events {
|
||||
if c.chain != nil {
|
||||
processed, err := c.chain.ApplyStreamEvent(&events[i], c.clientProtocol, c.providerProtocol, &c.ctx)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
events[i] = *processed
|
||||
}
|
||||
chunks := c.encoder.EncodeEvent(events[i])
|
||||
result = append(result, chunks...)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// Flush 刷新解码器和编码器缓冲区
|
||||
func (c *CanonicalStreamConverter) Flush() [][]byte {
|
||||
events := c.decoder.Flush()
|
||||
var result [][]byte
|
||||
for i := range events {
|
||||
if c.chain != nil {
|
||||
processed, err := c.chain.ApplyStreamEvent(&events[i], c.clientProtocol, c.providerProtocol, &c.ctx)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
events[i] = *processed
|
||||
}
|
||||
chunks := c.encoder.EncodeEvent(events[i])
|
||||
result = append(result, chunks...)
|
||||
}
|
||||
encoderChunks := c.encoder.Flush()
|
||||
result = append(result, encoderChunks...)
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user