Version: 0.9.75.dev.260505
后端: 1.收口阶段 6 agent 结构迁移,将 newAgent 内核与 agentsvc 编排层迁入 services/agent - 切换 Agent 启动装配与 HTTP handler 直连 agent sv,移除旧 service agent bridge - 补齐 Agent 对 memory、task、task-class、schedule 的 RPC 适配与契约字段 - 扩展 schedule、task、task-class RPC/contract 支撑 Agent 查询、写入与 provider 切流 - 更新迁移文档、README 与相关注释,明确 agent 当前切流点和剩余 memory 迁移面
This commit is contained in:
37
backend/services/agent/stream/sse_adapter.go
Normal file
37
backend/services/agent/stream/sse_adapter.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package agentstream
|
||||
|
||||
import "log"
|
||||
|
||||
// NewSSEPayloadEmitter 创建将 chunk 事件写入 outChan 的 emitter。
|
||||
//
|
||||
// 职责边界:
|
||||
// 1. 接收 outChan(SSE 输出通道),返回 PayloadEmitter 函数;
|
||||
// 2. 只把原始 JSON payload 写入通道,不添加 "data: " 前缀和 "\n\n" 后缀;
|
||||
// 3. SSE 格式化("data: " + payload + "\n\n")由 API 层的 writeSSEData 统一处理;
|
||||
// 4. 通道满时静默丢弃并返回 nil,让图继续完成状态持久化,避免因客户端超时而丢失快照。
|
||||
//
|
||||
// 使用示例:
|
||||
//
|
||||
// emitter := NewSSEPayloadEmitter(outChan)
|
||||
// chunkEmitter := NewChunkEmitter(emitter, requestID, modelName, created)
|
||||
// chunkEmitter.EmitAssistantText("", "", "hello", true)
|
||||
func NewSSEPayloadEmitter(outChan chan<- string) PayloadEmitter {
|
||||
return func(payload string) error {
|
||||
if outChan == nil {
|
||||
return nil
|
||||
}
|
||||
if payload == "" {
|
||||
return nil
|
||||
}
|
||||
select {
|
||||
case outChan <- payload:
|
||||
return nil
|
||||
default:
|
||||
// 通道已满:客户端可能已断开或消费过慢。
|
||||
// 静默丢弃此 chunk,让图继续执行并完成状态持久化。
|
||||
// 客户端重连后可从 Redis 快照恢复,不需要这条消息。
|
||||
log.Printf("[WARN] SSE outChan full, dropping payload (len=%d)", len(payload))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user