dsh-deepseek-web-login 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,276 @@
1
+ <svg data-theme="light" width="1088" height="668" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1088 668" role="img" lang="zh-CN" aria-labelledby="archify-diagram-title archify-diagram-description" data-preset="classic" data-quality-profile="showcase">
2
+ <style>
3
+ <![CDATA[
4
+ svg {
5
+
6
+ --bg: #f8fafc;
7
+ --grid: #e2e8f0;
8
+ --text: #0f172a;
9
+ --text-muted: #64748b;
10
+ --text-dim: #94a3b8;
11
+ --text-faint: #64748b;
12
+
13
+ --panel: #ffffff;
14
+ --panel-border: #e2e8f0;
15
+ --lane-fill: rgba(248, 250, 252, 0.65);
16
+ --lane-stroke: #cbd5e1;
17
+
18
+ --arrow: #94a3b8;
19
+ --arrow-emphasis: #059669;
20
+
21
+ --mask: #ffffff;
22
+
23
+ --frontend-fill: rgba(34, 211, 238, 0.15);
24
+ --frontend-stroke: #0891b2;
25
+ --backend-fill: rgba(52, 211, 153, 0.18);
26
+ --backend-stroke: #059669;
27
+ --database-fill: rgba(167, 139, 250, 0.2);
28
+ --database-stroke: #7c3aed;
29
+ --cloud-fill: rgba(251, 191, 36, 0.18);
30
+ --cloud-stroke: #d97706;
31
+ --security-fill: rgba(251, 113, 133, 0.15);
32
+ --security-stroke: #e11d48;
33
+ --messagebus-fill: rgba(251, 146, 60, 0.15);
34
+ --messagebus-stroke:#ea580c;
35
+ --external-fill: rgba(148, 163, 184, 0.18);
36
+ --external-stroke: #64748b;
37
+
38
+ --toolbar-bg: rgba(255, 255, 255, 0.92);
39
+ --toolbar-border: #cbd5e1;
40
+ --toolbar-text: #334155;
41
+ --toolbar-hover: #ffffff;
42
+ --toolbar-menu-bg: #ffffff;
43
+ }
44
+ svg .archify-export-bg { fill: var(--bg); }
45
+ /* ========================================================== SVG SEMANTIC CLASSES — use these instead of inline fill/stroke ========================================================== */ .c-grid { stroke: var(--grid); fill: none; }
46
+ .c-mask { fill: var(--mask); stroke: none; }
47
+ .c-backend { fill: var(--backend-fill); stroke: var(--backend-stroke); }
48
+ .c-security { fill: var(--security-fill); stroke: var(--security-stroke); }
49
+ .c-messagebus { fill: var(--messagebus-fill); stroke: var(--messagebus-stroke); }
50
+ .c-external { fill: var(--external-fill); stroke: var(--external-stroke); }
51
+ /* Text helpers */ .t-primary { fill: var(--text); }
52
+ .t-muted { fill: var(--text-muted); }
53
+ .t-dim { fill: var(--text-dim); }
54
+ .t-backend { fill: var(--backend-stroke); }
55
+ .t-security { fill: var(--security-stroke); }
56
+ .t-messagebus { fill: var(--messagebus-stroke); }
57
+ .t-external { fill: var(--external-stroke); }
58
+ /* Semantic Sigils are small authored role stamps, not icons from a brand pack and not viewer controls. Prefix selectors with svg so the canonical export's SVG-only stylesheet collector keeps them automatically. */ svg .semantic-sigil { fill: none; stroke: currentColor; stroke-width: 1.35; stroke-linecap: round; stroke-linejoin: round; opacity: 0.76; pointer-events: none; }
59
+ svg .semantic-sigil > * { vector-effect: non-scaling-stroke; }
60
+ svg .semantic-sigil .sigil-fill { fill: currentColor; stroke: none; }
61
+ svg .s-backend { color: var(--backend-stroke); }
62
+ svg .s-security { color: var(--security-stroke); }
63
+ svg .s-messagebus { color: var(--messagebus-stroke); }
64
+ svg .s-external { color: var(--external-stroke); }
65
+ /* Arrows */ .a-default { stroke: var(--arrow); fill: none; }
66
+ .a-emphasis { stroke: var(--arrow-emphasis); fill: none; }
67
+ .a-security { stroke: var(--security-stroke); fill: none; stroke-dasharray: 5,5; }
68
+ .a-dashed { stroke: var(--database-stroke); fill: none; stroke-dasharray: 4,4; }
69
+ /* Arrowhead markers reference these */ .m-default { fill: var(--arrow); }
70
+ .m-emphasis { fill: var(--arrow-emphasis); }
71
+ .m-security { fill: var(--security-stroke); }
72
+ .m-dashed { fill: var(--database-stroke); }
73
+ /* Dashed boundary variants */ .c-security-group { fill: transparent; stroke: var(--security-stroke); stroke-dasharray: 4,4; }
74
+ .c-lane { fill: var(--lane-fill); stroke: var(--lane-stroke); stroke-dasharray: 6,6; }
75
+ ]]>
76
+ </style>
77
+ <rect width="100%" height="100%" class="archify-export-bg"/>
78
+
79
+ <title id="archify-diagram-title">工具调用协议桥:从模型流到真实工具执行</title>
80
+ <desc id="archify-diagram-description">由 Archify 生成的工作流图。</desc>
81
+ <!-- Definitions -->
82
+ <defs>
83
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
84
+ <polygon points="0 0, 10 3.5, 0 7" class="m-default" />
85
+ </marker>
86
+ <marker id="arrowhead-emphasis" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
87
+ <polygon points="0 0, 10 3.5, 0 7" class="m-emphasis" />
88
+ </marker>
89
+ <marker id="arrowhead-security" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
90
+ <polygon points="0 0, 10 3.5, 0 7" class="m-security" />
91
+ </marker>
92
+ <marker id="arrowhead-dashed" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
93
+ <polygon points="0 0, 10 3.5, 0 7" class="m-dashed" />
94
+ </marker>
95
+ <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
96
+ <path d="M 40 0 L 0 0 0 40" class="c-grid" stroke-width="0.5"/>
97
+ </pattern>
98
+ </defs>
99
+
100
+ <!-- Background Grid -->
101
+ <rect width="100%" height="100%" fill="url(#grid)" />
102
+
103
+ <!-- Swimlanes -->
104
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-0" x="40" y="52" width="1032" height="106" rx="10" class="c-lane" stroke-width="1"/>
105
+ <text x="54" y="74" class="t-dim" font-size="10" font-weight="600">01 / 模型输出</text>
106
+
107
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-1" x="40" y="178" width="1032" height="106" rx="10" class="c-lane" stroke-width="1"/>
108
+ <text x="54" y="200" class="t-dim" font-size="10" font-weight="600">02 / 适配器管线</text>
109
+
110
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-2" x="40" y="304" width="1032" height="106" rx="10" class="c-lane" stroke-width="1"/>
111
+ <text x="54" y="326" class="t-dim" font-size="10" font-weight="600">03 / DSH 运行时</text>
112
+
113
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-3" x="40" y="430" width="1032" height="114" rx="10" class="c-lane" stroke-width="1"/>
114
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="exception-lane" data-composition-frame-id="lane-3-exception" x="46" y="436" width="1020" height="102" rx="8" class="c-security-group" stroke-width="1"/>
115
+ <text x="54" y="452" class="t-security" font-size="10" font-weight="600">EX / 修复与降级</text>
116
+
117
+ <!-- Phase headers -->
118
+ <line x1="80" y1="35" x2="292" y2="35" class="a-default" stroke-width="1.1"/>
119
+ <rect x="80" y="27" width="212" height="16" rx="4" class="c-mask"/>
120
+ <text x="186" y="39" class="t-muted" font-size="8" font-weight="600" text-anchor="middle">约束与接收</text>
121
+ <line x1="320" y1="35" x2="648.4" y2="35" class="a-emphasis" stroke-width="1.1"/>
122
+ <rect x="320" y="27" width="328.4" height="16" rx="4" class="c-mask"/>
123
+ <text x="484.2" y="39" class="t-backend" font-size="8" font-weight="600" text-anchor="middle">识别与修复</text>
124
+ <line x1="810" y1="35" x2="1022" y2="35" class="a-dashed" stroke-width="1.1"/>
125
+ <rect x="810" y="27" width="212" height="16" rx="4" class="c-mask"/>
126
+ <text x="916" y="39" class="t-messagebus" font-size="8" font-weight="600" text-anchor="middle">合成与交接</text>
127
+
128
+ <!-- Workflow groups -->
129
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="group" data-composition-frame-id="group-0" x="774" y="468" width="164" height="72" rx="9" class="c-security-group" stroke-width="1"/>
130
+ <text x="784" y="466" class="t-security" font-size="7" font-weight="600">解析失败时</text>
131
+
132
+ <!-- Edge paths -->
133
+ <path data-edge-from="filter" data-edge-to="repair" data-edge-label="JSON 解析失败" data-edge-key="0" data-edge-id="filter-to-repair" data-composition-points="444,246;524.4,246" d="M 444 246 L 524.4 246" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
134
+ <path data-edge-from="prompt_guard" data-edge-to="model_stream" data-edge-label="写入系统提示" data-edge-key="1" data-edge-id="guard-to-model" data-composition-points="126,280;126,300;239,300;239,154" d="M 126 280 L 126 300 L 239 300 L 239 154" class="a-security" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
135
+ <path data-edge-from="repair" data-edge-to="fallback" data-edge-label="解析不出" data-edge-key="2" data-edge-id="repair-to-fallback" data-composition-points="602.4,280;602.4,505;778,505" d="M 602.4 280 L 602.4 505 L 778 505" class="a-security" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
136
+ <path data-edge-from="repair" data-edge-to="synthesize" data-edge-label="逐字还原参数" data-edge-key="3" data-edge-id="repair-to-synth" data-composition-points="680.4,246;756,246" d="M 680.4 246 L 756 246" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
137
+ <path data-edge-from="model_stream" data-edge-to="filter" data-edge-label="原始分块" data-edge-key="4" data-edge-id="stream-to-filter" data-composition-points="246,154;246,300;366,300;366,280" d="M 246 154 L 246 300 L 366 300 L 366 280" class="a-emphasis" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
138
+ <path data-edge-from="synthesize" data-edge-to="tool_exec" data-edge-label="tool-call 块" data-edge-key="5" data-edge-id="synth-to-tool" data-composition-points="856,280;856,426;976,426;976,398" d="M 856 280 L 856 426 L 976 426 L 976 398" class="a-emphasis" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
139
+
140
+ <!-- Nodes -->
141
+ <g id="node-model_stream" data-node-id="model_stream" data-node-label="模型流式输出" tabindex="0" role="button" aria-label="聚焦模型流式输出,分块到达, 模型输出 › 约束与接收" aria-pressed="false" data-node-kind="external" data-node-sublabel="分块到达" data-node-tag="JSON 或 XML/DSML" data-node-context="模型输出 › 约束与接收">
142
+ <title>模型流式输出 · 分块到达 · 模型输出 › 约束与接收 · JSON 或 XML/DSML</title>
143
+ <rect x="168" y="86" width="156" height="68" rx="6" class="c-mask"/>
144
+ <rect x="168" y="86" width="156" height="68" rx="6" class="c-external" stroke-width="1.5"/>
145
+ <g aria-hidden="true" data-semantic-sigil="external" class="semantic-sigil s-external" transform="translate(174 92) scale(0.6875)">
146
+ <rect x="2.5" y="5" width="8.5" height="8" rx="1.5"/>
147
+ <path d="M8 2.5h5.5V8M13.5 2.5 7.5 8.5"/>
148
+ </g>
149
+ <text data-node-label="" data-detail-anchor="" x="246" y="107" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">模型流式输出</text>
150
+ <text data-detail="context" x="246" y="124" class="t-muted" font-size="8" text-anchor="middle">分块到达</text>
151
+ <text data-detail="fine" x="246" y="142" class="t-external" font-size="7" text-anchor="middle">JSON 或 XML/DSML</text>
152
+ </g>
153
+
154
+ <g id="node-prompt_guard" data-node-id="prompt_guard" data-node-label="指令层劝阻" tabindex="0" role="button" aria-label="聚焦指令层劝阻,显式禁止 XML/DSML, 适配器管线 › 约束与接收" aria-pressed="false" data-node-kind="security" data-node-sublabel="显式禁止 XML/DSML" data-node-tag="说明后果" data-node-context="适配器管线 › 约束与接收">
155
+ <title>指令层劝阻 · 显式禁止 XML/DSML · 适配器管线 › 约束与接收 · 说明后果</title>
156
+ <rect x="48" y="212" width="156" height="68" rx="6" class="c-mask"/>
157
+ <rect x="48" y="212" width="156" height="68" rx="6" class="c-security" stroke-width="1.5"/>
158
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(54 218) scale(0.6875)">
159
+ <path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
160
+ <path d="m5.8 8 1.5 1.5 3-3"/>
161
+ </g>
162
+ <text data-node-label="" data-detail-anchor="" x="126" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">指令层劝阻</text>
163
+ <text data-detail="context" x="126" y="250" class="t-muted" font-size="8" text-anchor="middle">显式禁止 XML/DSML</text>
164
+ <text data-detail="fine" x="126" y="268" class="t-security" font-size="7" text-anchor="middle">说明后果</text>
165
+ </g>
166
+
167
+ <g id="node-filter" data-node-id="filter" data-node-label="流式过滤器" tabindex="0" role="button" aria-label="聚焦流式过滤器,跨包标记 hold-back, 适配器管线 › 识别与修复" aria-pressed="false" data-node-kind="backend" data-node-sublabel="跨包标记 hold-back" data-node-tag="围栏 · 多调用" data-node-context="适配器管线 › 识别与修复">
168
+ <title>流式过滤器 · 跨包标记 hold-back · 适配器管线 › 识别与修复 · 围栏 · 多调用</title>
169
+ <rect x="288" y="212" width="156" height="68" rx="6" class="c-mask"/>
170
+ <rect x="288" y="212" width="156" height="68" rx="6" class="c-backend" stroke-width="1.5"/>
171
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(294 218) scale(0.6875)">
172
+ <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
173
+ </g>
174
+ <text data-node-label="" data-detail-anchor="" x="366" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">流式过滤器</text>
175
+ <text data-detail="context" x="366" y="250" class="t-muted" font-size="8" text-anchor="middle">跨包标记 hold-back</text>
176
+ <text data-detail="fine" x="366" y="268" class="t-backend" font-size="7" text-anchor="middle">围栏 · 多调用</text>
177
+ </g>
178
+
179
+ <g id="node-repair" data-node-id="repair" data-node-label="宽容修复" tabindex="0" role="button" aria-label="聚焦宽容修复,非法 JSON, 适配器管线 › 识别与修复" aria-pressed="false" data-node-kind="backend" data-node-sublabel="非法 JSON" data-node-tag="单反斜杠路径" data-node-context="适配器管线 › 识别与修复">
180
+ <title>宽容修复 · 非法 JSON · 适配器管线 › 识别与修复 · 单反斜杠路径</title>
181
+ <rect x="524.4" y="212" width="156" height="68" rx="6" class="c-mask"/>
182
+ <rect x="524.4" y="212" width="156" height="68" rx="6" class="c-backend" stroke-width="1.5"/>
183
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(530.4 218) scale(0.6875)">
184
+ <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
185
+ </g>
186
+ <text data-node-label="" data-detail-anchor="" x="602.4" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">宽容修复</text>
187
+ <text data-detail="context" x="602.4" y="250" class="t-muted" font-size="8" text-anchor="middle">非法 JSON</text>
188
+ <text data-detail="fine" x="602.4" y="268" class="t-backend" font-size="7" text-anchor="middle">单反斜杠路径</text>
189
+ </g>
190
+
191
+ <g id="node-synthesize" data-node-id="synthesize" data-node-label="合成 tool-call 块" tabindex="0" role="button" aria-label="聚焦合成 tool-call 块,block-start / delta / block-end, 适配器管线 › 合成与交接" aria-pressed="false" data-node-kind="messagebus" data-node-sublabel="block-start / delta / block-end" data-node-tag="finish: tool-calls" data-node-context="适配器管线 › 合成与交接">
192
+ <title>合成 tool-call 块 · block-start / delta / block-end · 适配器管线 › 合成与交接 · finish: tool-calls</title>
193
+ <rect x="756" y="212" width="200" height="68" rx="6" class="c-mask"/>
194
+ <rect x="756" y="212" width="200" height="68" rx="6" class="c-messagebus" stroke-width="1.5"/>
195
+ <g aria-hidden="true" data-semantic-sigil="messagebus" class="semantic-sigil s-messagebus" transform="translate(762 218) scale(0.6875)">
196
+ <path d="M2.5 4.5h11M2.5 8h11M2.5 11.5h11"/>
197
+ <circle cx="5" cy="4.5" r="1" class="sigil-fill"/>
198
+ <circle cx="10.5" cy="8" r="1" class="sigil-fill"/>
199
+ <circle cx="7" cy="11.5" r="1" class="sigil-fill"/>
200
+ </g>
201
+ <text data-node-label="" data-detail-anchor="" x="856" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">合成 tool-call 块</text>
202
+ <text data-detail="context" x="856" y="250" class="t-muted" font-size="8" text-anchor="middle">block-start / delta / block-end</text>
203
+ <text data-detail="fine" x="856" y="268" class="t-messagebus" font-size="7" text-anchor="middle">finish: tool-calls</text>
204
+ </g>
205
+
206
+ <g id="node-tool_exec" data-node-id="tool_exec" data-node-label="DSH 执行真实工具" tabindex="0" role="button" aria-label="聚焦DSH 执行真实工具,结果回灌下一轮, DSH 运行时 › 合成与交接" aria-pressed="false" data-node-kind="backend" data-node-sublabel="结果回灌下一轮" data-node-context="DSH 运行时 › 合成与交接">
207
+ <title>DSH 执行真实工具 · 结果回灌下一轮 · DSH 运行时 › 合成与交接</title>
208
+ <rect x="888" y="346" width="176" height="52" rx="6" class="c-mask"/>
209
+ <rect x="888" y="346" width="176" height="52" rx="6" class="c-backend" stroke-width="1.5"/>
210
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(894 352) scale(0.6875)">
211
+ <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
212
+ </g>
213
+ <text data-node-label="" data-detail-anchor="" x="976" y="367" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">DSH 执行真实工具</text>
214
+ <text data-detail="context" x="976" y="384" class="t-muted" font-size="8" text-anchor="middle">结果回灌下一轮</text>
215
+ </g>
216
+
217
+ <g id="node-fallback" data-node-id="fallback" data-node-label="降级为正文" tabindex="0" role="button" aria-label="聚焦降级为正文,绝不静默丢内容, 修复与降级 › 解析失败时 › 合成与交接" aria-pressed="false" data-node-kind="security" data-node-sublabel="绝不静默丢内容" data-node-tag="用户可见" data-node-context="修复与降级 › 解析失败时 › 合成与交接">
218
+ <title>降级为正文 · 绝不静默丢内容 · 修复与降级 › 解析失败时 › 合成与交接 · 用户可见</title>
219
+ <rect x="778" y="471" width="156" height="68" rx="6" class="c-mask"/>
220
+ <rect x="778" y="471" width="156" height="68" rx="6" class="c-security" stroke-width="1.5"/>
221
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(784 477) scale(0.6875)">
222
+ <path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
223
+ <path d="m5.8 8 1.5 1.5 3-3"/>
224
+ </g>
225
+ <text data-node-label="" data-detail-anchor="" x="856" y="492" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">降级为正文</text>
226
+ <text data-detail="context" x="856" y="509" class="t-muted" font-size="8" text-anchor="middle">绝不静默丢内容</text>
227
+ <text data-detail="fine" x="856" y="527" class="t-security" font-size="7" text-anchor="middle">用户可见</text>
228
+ </g>
229
+
230
+ <!-- Edge labels -->
231
+ <g data-detail="context" data-edge-from="filter" data-edge-to="repair" data-edge-label="JSON 解析失败" data-edge-key="0" data-edge-id="filter-to-repair">
232
+ <rect x="448" y="226" width="72.4" height="14" rx="3" class="c-mask"/>
233
+ <text x="484.2" y="236" class="t-muted" font-size="8" text-anchor="middle">JSON 解析失败</text>
234
+ </g>
235
+ <g data-detail="context" data-edge-from="prompt_guard" data-edge-to="model_stream" data-edge-label="写入系统提示" data-edge-key="1" data-edge-id="guard-to-model">
236
+ <rect x="148.7" y="280" width="67.6" height="14" rx="3" class="c-mask"/>
237
+ <text x="182.5" y="290" class="t-security" font-size="8" text-anchor="middle">写入系统提示</text>
238
+ </g>
239
+ <g data-detail="context" data-edge-from="repair" data-edge-to="fallback" data-edge-label="解析不出" data-edge-key="2" data-edge-id="repair-to-fallback">
240
+ <rect x="666" y="485" width="48.4" height="14" rx="3" class="c-mask"/>
241
+ <text x="690.2" y="495" class="t-security" font-size="8" text-anchor="middle">解析不出</text>
242
+ </g>
243
+ <g data-detail="context" data-edge-from="repair" data-edge-to="synthesize" data-edge-label="逐字还原参数" data-edge-key="3" data-edge-id="repair-to-synth">
244
+ <rect x="684.4000000000001" y="226" width="67.6" height="14" rx="3" class="c-mask"/>
245
+ <text x="718.2" y="236" class="t-muted" font-size="8" text-anchor="middle">逐字还原参数</text>
246
+ </g>
247
+ <g data-detail="context" data-edge-from="model_stream" data-edge-to="filter" data-edge-label="原始分块" data-edge-key="4" data-edge-id="stream-to-filter">
248
+ <rect x="281.8" y="280" width="48.4" height="14" rx="3" class="c-mask"/>
249
+ <text x="306" y="290" class="t-backend" font-size="8" text-anchor="middle">原始分块</text>
250
+ </g>
251
+ <g data-detail="context" data-edge-from="synthesize" data-edge-to="tool_exec" data-edge-label="tool-call 块" data-edge-key="5" data-edge-id="synth-to-tool">
252
+ <rect x="882.2" y="406" width="67.6" height="14" rx="3" class="c-mask"/>
253
+ <text x="916" y="416" class="t-backend" font-size="8" text-anchor="middle">tool-call 块</text>
254
+ </g>
255
+
256
+ <!-- Legend -->
257
+ <g data-legend="" data-legend-bridge="">
258
+ <text x="20" y="568" class="t-primary" font-size="12" font-weight="650">图例</text>
259
+ <g data-legend-semantic-kind="backend" data-legend-kind="backend" data-legend-label="Agent 逻辑" data-legend-x="20" data-legend-baseline="588" data-legend-width="87">
260
+ <rect x="20" y="580" width="14" height="9" rx="2" class="c-backend" stroke-width="1"/>
261
+ <text x="42" y="588" class="t-muted" font-size="7.5" font-weight="500">Agent 逻辑</text>
262
+ </g>
263
+ <g data-legend-semantic-kind="security" data-legend-kind="security" data-legend-label="策略" data-legend-x="114" data-legend-baseline="588" data-legend-width="61">
264
+ <rect x="114" y="580" width="14" height="9" rx="2" class="c-security" stroke-width="1"/>
265
+ <text x="136" y="588" class="t-muted" font-size="7.5" font-weight="500">策略</text>
266
+ </g>
267
+ <g data-legend-semantic-kind="messagebus" data-legend-kind="messagebus" data-legend-label="工具操作" data-legend-x="182" data-legend-baseline="588" data-legend-width="78">
268
+ <rect x="182" y="580" width="14" height="9" rx="2" class="c-messagebus" stroke-width="1"/>
269
+ <text x="204" y="588" class="t-muted" font-size="7.5" font-weight="500">工具操作</text>
270
+ </g>
271
+ <g data-legend-semantic-kind="external" data-legend-kind="external" data-legend-label="外部系统" data-legend-x="267" data-legend-baseline="588" data-legend-width="78">
272
+ <rect x="267" y="580" width="14" height="9" rx="2" class="c-external" stroke-width="1"/>
273
+ <text x="289" y="588" class="t-muted" font-size="7.5" font-weight="500">外部系统</text>
274
+ </g>
275
+ </g>
276
+ </svg>