1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//! StreamChunk — Data Plane 数据面事件。
//!
//! 高频、数据透传、无嵌套包装。
//! 与控制面 RuntimeEvent 分离,避免高频数据事件撑爆控制事件通道。
//!
//! 设计原则:只承载"需要实时展示给用户的内容",不混入状态变更等低频数据。
//! StreamChunk 携带 Execution View(展示内容),不是 Message。
//! State 保存完整 Message。两者永不互相引用。
use Duration;
// ─── ToolPhase ────────────────────────────────────────────────
/// 工具执行生命周期阶段。
///
/// 与 LangGraph (`on_tool_start`/`on_tool_end`)、
/// OpenAI Agents SDK (`tool_call_started`/`tool_call_finished`)、
/// Claude Desktop (`tool_use`/`tool_result`) 一致。
// ─── StreamChunk ──────────────────────────────────────────────
/// 数据面事件 — 高频、数据透传。
///
/// 统一流式协议,所有 Node(LLM、Tool、MCP、Workflow)共享。
///
/// **Tool 并发 emit 协议:**
/// - Start 保证顺序 — 严格按照 ToolCall 顺序发射(A, B, C)
/// - End 允许乱序 — 并发执行完成后按实际顺序发射(B, A, C),通过 call_id 关联