feat(observability): 执行可视化 — 节点级实时轨迹(运行·观测)
把任务执行做成可观测:Dispatcher 在每个节点/阶段发结构化 ExecEvent, 经独立 NATS 通道回流,前端逐节点点亮(状态/耗时/工具入参产出)。 - shared: contract.ExecEvent + ExecSubject(sundynix.exec.<id>,与 Token 流分流); bus.PublishExec/CompleteExec/SubscribeExec(core NATS,复用结束头) - dispatcher: execTracer(自增 Seq 保序 + span 自动计耗时); Orchestrator 加 ExecSink;通用图(init 召回 / 各 tool 入参→产出 / prompt / model 首token+token数)与报告编排(规划大纲 / 各章并行 start-end / 渲染)全程埋点 - gateway: SubscribeExec + GET /tasks/:id/exec SSE(与 token 流并行) - desktop: streamExec + deriveNodes(按 node 归并 start/end/error/info); 复用组件 ExecTrace(竖向轨道,按 kind 着色,运行中脉冲灯); 新 RunsView(运行·观测:轨迹+输出双栏);BottomDrawer 轨迹/工具调用 tab 接真实数据; ReportView 加执行轨迹栏;左导航「运行」置就绪 实测: - 报告任务 /exec:规划(2680ms,4章) → 4 章并行(seq 交错,各~7-8s 重叠=真并行, 每章带 docs 知识库检索预览+成稿字数) → 渲染(docx 落盘) - 通用图 /exec:tool:kb_search(678ms,入参→Milvus 产出) → prompt(2消息) → model(首token 860ms / 4 tokens) - 浏览器(Preview):报告页执行轨迹逐节点点亮、章节带耗时/字数/检索片段,完成后下载 Word Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -134,6 +134,37 @@ func (b *Bus) SubscribeTokens(taskID string, onToken func([]byte), onDone func()
|
||||
return sub.Unsubscribe, nil
|
||||
}
|
||||
|
||||
// ---- 执行可视化事件(core NATS,与 Token 流分流)----
|
||||
|
||||
// PublishExec 把一条执行事件(JSON)发到 sundynix.exec.<taskID>。
|
||||
func (b *Bus) PublishExec(taskID string, data []byte) error {
|
||||
return b.nc.Publish(contract.ExecSubject(taskID), data)
|
||||
}
|
||||
|
||||
// CompleteExec 发送执行事件流结束信号(空体 + 结束头)。
|
||||
func (b *Bus) CompleteExec(taskID string) error {
|
||||
msg := nats.NewMsg(contract.ExecSubject(taskID))
|
||||
msg.Header.Set(contract.HeaderStreamEnd, "1")
|
||||
return b.nc.PublishMsg(msg)
|
||||
}
|
||||
|
||||
// SubscribeExec 订阅某 task 的执行事件流。每条事件触发 onEvent;结束触发 onDone。
|
||||
func (b *Bus) SubscribeExec(taskID string, onEvent func([]byte), onDone func()) (unsub func() error, err error) {
|
||||
sub, err := b.nc.Subscribe(contract.ExecSubject(taskID), func(m *nats.Msg) {
|
||||
if m.Header.Get(contract.HeaderStreamEnd) == "1" {
|
||||
onDone()
|
||||
return
|
||||
}
|
||||
data := make([]byte, len(m.Data))
|
||||
copy(data, m.Data)
|
||||
onEvent(data)
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("subscribe exec: %w", err)
|
||||
}
|
||||
return sub.Unsubscribe, nil
|
||||
}
|
||||
|
||||
// ---- MCP 工具调用(core NATS request-reply)----
|
||||
|
||||
// CallTool 同步调用一个 MCP 工具:发到 subject,阻塞等待应答。
|
||||
|
||||
Reference in New Issue
Block a user