后端: 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 迁移面
38 lines
1.3 KiB
Go
38 lines
1.3 KiB
Go
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
|
||
}
|
||
}
|
||
}
|