@cicctencent/agent-core 0.1.26 → 0.1.28

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.
Files changed (71) hide show
  1. package/dist/cjs/agent/engine.d.ts +5 -1
  2. package/dist/cjs/agent/engine.d.ts.map +1 -1
  3. package/dist/cjs/agent/engine.js +78 -49
  4. package/dist/cjs/agent/engine.js.map +1 -1
  5. package/dist/cjs/agent/history-manager.d.ts.map +1 -1
  6. package/dist/cjs/agent/history-manager.js +17 -2
  7. package/dist/cjs/agent/history-manager.js.map +1 -1
  8. package/dist/cjs/agent/llm-caller.d.ts +2 -9
  9. package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
  10. package/dist/cjs/agent/llm-caller.js +69 -123
  11. package/dist/cjs/agent/llm-caller.js.map +1 -1
  12. package/dist/cjs/agent/tool-executor.d.ts +9 -6
  13. package/dist/cjs/agent/tool-executor.d.ts.map +1 -1
  14. package/dist/cjs/agent/tool-executor.js +53 -59
  15. package/dist/cjs/agent/tool-executor.js.map +1 -1
  16. package/dist/cjs/agent/types.d.ts +50 -0
  17. package/dist/cjs/agent/types.d.ts.map +1 -1
  18. package/dist/cjs/agent/types.js.map +1 -1
  19. package/dist/cjs/index.d.ts +3 -1
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/index.js +5 -1
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/runtime/run-registry-interface.d.ts +5 -5
  24. package/dist/cjs/runtime/run-registry-interface.d.ts.map +1 -1
  25. package/dist/cjs/runtime/run-registry.d.ts +15 -2
  26. package/dist/cjs/runtime/run-registry.d.ts.map +1 -1
  27. package/dist/cjs/runtime/run-registry.js +87 -25
  28. package/dist/cjs/runtime/run-registry.js.map +1 -1
  29. package/dist/cjs/utils/dsml-parser.d.ts +89 -0
  30. package/dist/cjs/utils/dsml-parser.d.ts.map +1 -0
  31. package/dist/cjs/utils/dsml-parser.js +289 -0
  32. package/dist/cjs/utils/dsml-parser.js.map +1 -0
  33. package/dist/cjs/utils/token-counter.d.ts.map +1 -1
  34. package/dist/cjs/utils/token-counter.js +20 -4
  35. package/dist/cjs/utils/token-counter.js.map +1 -1
  36. package/dist/esm/agent/engine.d.ts +5 -1
  37. package/dist/esm/agent/engine.d.ts.map +1 -1
  38. package/dist/esm/agent/engine.js +78 -49
  39. package/dist/esm/agent/engine.js.map +1 -1
  40. package/dist/esm/agent/history-manager.d.ts.map +1 -1
  41. package/dist/esm/agent/history-manager.js +17 -2
  42. package/dist/esm/agent/history-manager.js.map +1 -1
  43. package/dist/esm/agent/llm-caller.d.ts +2 -9
  44. package/dist/esm/agent/llm-caller.d.ts.map +1 -1
  45. package/dist/esm/agent/llm-caller.js +69 -123
  46. package/dist/esm/agent/llm-caller.js.map +1 -1
  47. package/dist/esm/agent/tool-executor.d.ts +9 -6
  48. package/dist/esm/agent/tool-executor.d.ts.map +1 -1
  49. package/dist/esm/agent/tool-executor.js +53 -59
  50. package/dist/esm/agent/tool-executor.js.map +1 -1
  51. package/dist/esm/agent/types.d.ts +50 -0
  52. package/dist/esm/agent/types.d.ts.map +1 -1
  53. package/dist/esm/agent/types.js.map +1 -1
  54. package/dist/esm/index.d.ts +3 -1
  55. package/dist/esm/index.d.ts.map +1 -1
  56. package/dist/esm/index.js +1 -0
  57. package/dist/esm/index.js.map +1 -1
  58. package/dist/esm/runtime/run-registry-interface.d.ts +5 -5
  59. package/dist/esm/runtime/run-registry-interface.d.ts.map +1 -1
  60. package/dist/esm/runtime/run-registry.d.ts +15 -2
  61. package/dist/esm/runtime/run-registry.d.ts.map +1 -1
  62. package/dist/esm/runtime/run-registry.js +87 -25
  63. package/dist/esm/runtime/run-registry.js.map +1 -1
  64. package/dist/esm/utils/dsml-parser.d.ts +89 -0
  65. package/dist/esm/utils/dsml-parser.d.ts.map +1 -0
  66. package/dist/esm/utils/dsml-parser.js +283 -0
  67. package/dist/esm/utils/dsml-parser.js.map +1 -0
  68. package/dist/esm/utils/token-counter.d.ts.map +1 -1
  69. package/dist/esm/utils/token-counter.js +20 -4
  70. package/dist/esm/utils/token-counter.js.map +1 -1
  71. package/package.json +2 -1
@@ -3,21 +3,34 @@
3
3
  // 解耦 Engine 执行与传输层,支持事件缓冲、订阅和断线重连
4
4
  // ============================================================
5
5
  import { logEvent } from "../observability/logger.js";
6
- /** 内存实现(默认) */
6
+ /** 最大快照保留数 */
7
+ const MAX_SNAPSHOTS = 200;
8
+ /** 内存实现(默认)— 使用 Map 实现 O(1) upsert/remove */
7
9
  export class InMemoryRunStateStore {
8
- snapshots = [];
10
+ snapshots = new Map();
9
11
  list() {
10
- return [...this.snapshots];
12
+ return [...this.snapshots.values()]
13
+ .sort((a, b) => b.updatedAt - a.updatedAt)
14
+ .slice(0, MAX_SNAPSHOTS);
11
15
  }
12
16
  upsert(snapshot) {
13
- this.snapshots = this.snapshots
14
- .filter(item => item.threadId !== snapshot.threadId)
15
- .concat(snapshot)
16
- .sort((a, b) => b.updatedAt - a.updatedAt)
17
- .slice(0, 200);
17
+ this.snapshots.set(snapshot.threadId, snapshot);
18
+ // 淘汰最旧的快照,防止无界增长
19
+ if (this.snapshots.size > MAX_SNAPSHOTS) {
20
+ let oldestKey;
21
+ let oldestTime = Infinity;
22
+ for (const [key, val] of this.snapshots) {
23
+ if (val.updatedAt < oldestTime) {
24
+ oldestTime = val.updatedAt;
25
+ oldestKey = key;
26
+ }
27
+ }
28
+ if (oldestKey !== undefined)
29
+ this.snapshots.delete(oldestKey);
30
+ }
18
31
  }
19
32
  remove(threadId) {
20
- this.snapshots = this.snapshots.filter(item => item.threadId !== threadId);
33
+ this.snapshots.delete(threadId);
21
34
  }
22
35
  }
23
36
  // ---- 配置 ----
@@ -25,23 +38,31 @@ const CLEANUP_MAX_AGE = 30 * 60 * 1000;
25
38
  const CLEANUP_INTERVAL = 5 * 60 * 1000;
26
39
  /** 无订阅者时运行自动中止的空闲超时(10 分钟) */
27
40
  const IDLE_TIMEOUT_MS = 10 * 60 * 1000;
41
+ /** 事件缓冲区上限(超出后移除最旧事件,防止无界增长) */
42
+ const MAX_EVENT_BUFFER = 500;
43
+ /** 批量持久化间隔(毫秒)— 脏标记模式下定期 flush */
44
+ const PERSIST_INTERVAL = 1000;
28
45
  export class RunRegistry {
29
46
  runs = new Map();
30
47
  runStateStore;
31
48
  cleanupTimer = null;
49
+ /** 批量持久化定时器(脏标记模式下定期 flush) */
50
+ persistTimer = null;
51
+ /** 脏 run 集合(标记后由 persistTimer 批量写入) */
52
+ dirtyRuns = new Set();
32
53
  /** 空闲超时回调(上层注入,用于中止 Engine) */
33
54
  onIdleTimeout;
34
55
  /** 是否启用空闲超时检测 */
35
56
  idleTimeoutEnabled;
57
+ /** 空闲超时阈值(毫秒) */
58
+ idleTimeoutMs;
36
59
  constructor(store, options) {
37
60
  this.runStateStore = store || new InMemoryRunStateStore();
38
61
  this.onIdleTimeout = options?.onIdleTimeout;
39
62
  this.idleTimeoutEnabled = options?.enableIdleTimeout ?? true;
40
- if (options?.idleTimeoutMs) {
41
- // 覆盖默认空闲超时
42
- this._idleTimeoutMs = options.idleTimeoutMs;
43
- }
63
+ this.idleTimeoutMs = options?.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
44
64
  this.startCleanup();
65
+ this.startPersistTimer();
45
66
  }
46
67
  /** 设置空闲超时回调 */
47
68
  setIdleTimeoutHandler(handler) {
@@ -58,7 +79,7 @@ export class RunRegistry {
58
79
  existing.status = 'error';
59
80
  existing.error = 'Superseded by new run';
60
81
  this.notifySubscribers(existing, { event: 'error', data: { error: '被新的对话覆盖' } });
61
- this.persistRun(existing);
82
+ this.flushRun(existing);
62
83
  }
63
84
  const run = {
64
85
  threadId,
@@ -79,7 +100,7 @@ export class RunRegistry {
79
100
  lastFlushAt: Date.now(),
80
101
  };
81
102
  this.runs.set(threadId, run);
82
- this.persistRun(run);
103
+ this.flushRun(run);
83
104
  logEvent({ event: 'run.start', sessionId, data: { threadId } });
84
105
  return run;
85
106
  }
@@ -97,8 +118,14 @@ export class RunRegistry {
97
118
  return;
98
119
  const buffered = { event, data };
99
120
  run.eventBuffer.push(buffered);
121
+ // P0 #2: 事件缓冲区上限保护,超出后移除最旧事件防止无界增长
122
+ if (run.eventBuffer.length > MAX_EVENT_BUFFER) {
123
+ run.eventBuffer.splice(0, run.eventBuffer.length - MAX_EVENT_BUFFER);
124
+ }
100
125
  switch (event) {
101
126
  case 'content':
127
+ // V8 ConsString/rope 优化使 += 接近 O(1) amortized;
128
+ // 真正的 O(n) flatten 只在 persistRun(批量,每秒一次)时发生
102
129
  run.fullContent += (typeof data === 'string' ? data : '');
103
130
  break;
104
131
  case 'reasoning':
@@ -133,7 +160,9 @@ export class RunRegistry {
133
160
  }
134
161
  break;
135
162
  }
136
- this.persistRun(run);
163
+ run.lastFlushAt = Date.now();
164
+ // P0 #1: 标记为脏,由 persistTimer 批量持久化(而非每事件即写)
165
+ this.markDirty(run);
137
166
  this.notifySubscribers(run, buffered);
138
167
  }
139
168
  finishRun(threadId, status, error) {
@@ -143,7 +172,8 @@ export class RunRegistry {
143
172
  run.status = status;
144
173
  if (error)
145
174
  run.error = error;
146
- this.persistRun(run);
175
+ // 完成时立即持久化(不等待批量定时器)
176
+ this.flushRun(run);
147
177
  logEvent({
148
178
  event: 'run.finish',
149
179
  level: status === 'error' ? 'error' : 'info',
@@ -159,14 +189,14 @@ export class RunRegistry {
159
189
  const run = this.runs.get(threadId);
160
190
  if (run) {
161
191
  run.stepCount = count;
162
- this.persistRun(run);
192
+ this.markDirty(run);
163
193
  }
164
194
  }
165
195
  setMessageId(threadId, messageId) {
166
196
  const run = this.runs.get(threadId);
167
197
  if (run) {
168
198
  run.messageId = messageId;
169
- this.persistRun(run);
199
+ this.markDirty(run);
170
200
  }
171
201
  }
172
202
  subscribe(threadId, callback) {
@@ -204,7 +234,7 @@ export class RunRegistry {
204
234
  const run = this.runs.get(threadId);
205
235
  if (run) {
206
236
  run.lastFailedStage = stageId;
207
- this.persistRun(run);
237
+ this.markDirty(run);
208
238
  }
209
239
  }
210
240
  removeRun(threadId) {
@@ -224,10 +254,16 @@ export class RunRegistry {
224
254
  return ids;
225
255
  }
226
256
  destroy() {
257
+ // 销毁前 flush 所有脏 run
258
+ this.flushDirtyRuns();
227
259
  if (this.cleanupTimer) {
228
260
  clearInterval(this.cleanupTimer);
229
261
  this.cleanupTimer = null;
230
262
  }
263
+ if (this.persistTimer) {
264
+ clearInterval(this.persistTimer);
265
+ this.persistTimer = null;
266
+ }
231
267
  for (const [threadId] of this.runs) {
232
268
  this.removeRun(threadId);
233
269
  }
@@ -254,15 +290,41 @@ export class RunRegistry {
254
290
  const { subscribers: _subscribers, ...serializable } = run;
255
291
  return { ...serializable, updatedAt: Date.now() };
256
292
  }
257
- persistRun(run) {
293
+ /** P0 #1: 标记 run 为脏,由 persistTimer 批量持久化 */
294
+ markDirty(run) {
295
+ this.dirtyRuns.add(run);
296
+ }
297
+ /** 立即持久化单个 run(用于 finishRun 等关键节点) */
298
+ flushRun(run) {
299
+ this.dirtyRuns.delete(run);
258
300
  this.runStateStore.upsert(this.toSnapshot(run));
259
301
  }
302
+ /** P0 #1: 批量持久化所有脏 run(由 persistTimer 定期调用) */
303
+ flushDirtyRuns() {
304
+ if (this.dirtyRuns.size === 0)
305
+ return;
306
+ for (const run of this.dirtyRuns) {
307
+ try {
308
+ this.runStateStore.upsert(this.toSnapshot(run));
309
+ }
310
+ catch { /* 持久化失败不影响运行 */ }
311
+ }
312
+ this.dirtyRuns.clear();
313
+ }
314
+ /** 启动批量持久化定时器 */
315
+ startPersistTimer() {
316
+ if (this.persistTimer)
317
+ return;
318
+ this.persistTimer = setInterval(() => this.flushDirtyRuns(), PERSIST_INTERVAL);
319
+ if (this.persistTimer && typeof this.persistTimer === 'object' && 'unref' in this.persistTimer) {
320
+ this.persistTimer.unref();
321
+ }
322
+ }
260
323
  startCleanup() {
261
324
  if (this.cleanupTimer)
262
325
  return;
263
326
  this.cleanupTimer = setInterval(() => {
264
327
  const now = Date.now();
265
- const idleTimeout = this._idleTimeoutMs || IDLE_TIMEOUT_MS;
266
328
  for (const [threadId, run] of this.runs) {
267
329
  // 清理过期的已完成运行
268
330
  if (run.status !== 'running' && (now - run.createdAt) > CLEANUP_MAX_AGE) {
@@ -272,12 +334,12 @@ export class RunRegistry {
272
334
  // 空闲超时检测:运行中但无订阅者超过 idleTimeout
273
335
  if (this.idleTimeoutEnabled && run.status === 'running' && run.subscribers.size === 0) {
274
336
  const idleDuration = now - run.lastFlushAt;
275
- if (idleDuration > idleTimeout) {
276
- console.warn(`[RunRegistry] Idle timeout (${idleDuration}ms > ${idleTimeout}ms) for thread ${threadId}, aborting`);
337
+ if (idleDuration > this.idleTimeoutMs) {
338
+ console.warn(`[RunRegistry] Idle timeout (${idleDuration}ms > ${this.idleTimeoutMs}ms) for thread ${threadId}, aborting`);
277
339
  // 标记为 error
278
340
  run.status = 'error';
279
341
  run.error = `Idle timeout: no subscribers for ${Math.round(idleDuration / 1000)}s`;
280
- this.persistRun(run);
342
+ this.flushRun(run);
281
343
  this.notifySubscribers(run, { event: 'error', data: { error: run.error } });
282
344
  // 触发上层中止回调
283
345
  if (this.onIdleTimeout) {
@@ -1 +1 @@
1
- {"version":3,"file":"run-registry.js","sourceRoot":"","sources":["../../../src/runtime/run-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-registry.js","sourceRoot":"","sources":["../../../src/runtime/run-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * DSML Parser — 解析 DeepSeek 的 DSML 格式工具调用
3
+ *
4
+ * DeepSeek-V4-Flash 等模型在未走标准 OpenAI tool_calls 通道时,会以 DSML
5
+ * (DeepSeek Markup Language)格式在正文流中输出工具调用。DSML 使用全角竖线
6
+ * `|`(U+FF5C)作为标记分隔,本解析器同时容错半角竖线 `|`(U+007C)。
7
+ *
8
+ * 格式示例:
9
+ * <|DSML|tool_calls>
10
+ * <|DSML|invoke name="create_report">
11
+ * <|DSML|parameter name="title" string="true">国泰海通...</|DSML|parameter>
12
+ * ...
13
+ * </|DSML|invoke>
14
+ * </|DSML|tool_calls>
15
+ *
16
+ * 实现要点:
17
+ * - 用状态机扫描而非正则,支持参数值中包含 `<`、换行、普通 XML 标签等内容。
18
+ * - 参数 `string="false"` 时尝试 JSON.parse,失败则保留原始字符串并告警。
19
+ * - 工具调用 id 使用全局单调计数器 + crypto.randomUUID,避免流式场景重复。
20
+ *
21
+ * 限制:DSML 格式本身无转义机制,参数值不能包含完整的闭合标记字面量
22
+ * (如 `</|DSML|parameter>`、`</|DSML|invoke>`),否则会与真闭合标记歧义。
23
+ *
24
+ * @see https://blog.csdn.net/gitblog_00855/article/details/152146045 DSML 格式说明
25
+ */
26
+ import type { ToolCall } from '../types.js';
27
+ /** DSML 工具调用解析结果 */
28
+ export interface DSMLParseResult {
29
+ toolCalls: ToolCall[];
30
+ /** 解析后的剩余文本(非工具调用部分) */
31
+ remainingText: string;
32
+ }
33
+ /**
34
+ * 解析 DSML 格式的工具调用
35
+ *
36
+ * @param text 可能包含 DSML 格式的文本
37
+ * @returns 解析结果,包含工具调用列表和剩余文本
38
+ */
39
+ export declare function parseDSML(text: string): DSMLParseResult;
40
+ /**
41
+ * 流式 DSML 解析器状态
42
+ *
43
+ * 用于处理流式输出,累积文本并检测 DSML 工具调用的开始/结束。
44
+ * 关键设计:
45
+ * - 始终先累积到 buffer,再尝试提取完整 DSML 块。
46
+ * - 当 buffer 末尾是某个 DSML 标记的可能前缀(如 `<`、`<|DSML|tool`)时,
47
+ * 暂留该前缀不作为文本增量发出,等待后续 chunk 确认。
48
+ * - 仅当检测到完整的 `<|DSML|tool_calls>...</|DSML|tool_calls>` 块时才解析。
49
+ */
50
+ export declare class StreamingDSMLParser {
51
+ private buffer;
52
+ /**
53
+ * 计算 buffer 末尾「是某个 DSML 标记前缀」的长度。
54
+ * 例如 buffer 末尾为 `<|DSML|tool`,它是 `<|DSML|tool_calls>` 的前缀,
55
+ * 返回该前缀长度,调用方据此暂留尾部、只发出前段文本。
56
+ */
57
+ private trailingMarkerPrefixLen;
58
+ /**
59
+ * 从 buffer 中提取完整 DSML 块并解析,返回可安全发出的文本增量与已完成的工具调用。
60
+ */
61
+ private drain;
62
+ /**
63
+ * 处理流式文本片段
64
+ *
65
+ * @param chunk 流式文本片段
66
+ * @returns 解析结果,包含增量文本和已完成的工具调用
67
+ */
68
+ process(chunk: string): {
69
+ textDelta: string;
70
+ completedToolCalls: ToolCall[];
71
+ };
72
+ /** 获取当前累积的缓冲区内容 */
73
+ getBuffer(): string;
74
+ /** 重置解析器状态 */
75
+ reset(): void;
76
+ /**
77
+ * 强制结束解析(用于流结束时处理未完成的 DSML)。
78
+ * 对残留 buffer 调用 parseDSML:完整块会被解析,未闭合块原样作为文本返回。
79
+ */
80
+ flush(): {
81
+ textDelta: string;
82
+ completedToolCalls: ToolCall[];
83
+ };
84
+ }
85
+ /**
86
+ * 检查文本是否包含 DSML 工具调用标记
87
+ */
88
+ export declare function containsDSML(text: string): boolean;
89
+ //# sourceMappingURL=dsml-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsml-parser.d.ts","sourceRoot":"","sources":["../../../src/utils/dsml-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,oBAAoB;AACpB,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAyHD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CA4BvD;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAc;IAE5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,OAAO,CAAC,KAAK;IAgCb;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAA;KAAE;IAK7E,mBAAmB;IACnB,SAAS,IAAI,MAAM;IAInB,cAAc;IACd,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,KAAK,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAA;KAAE;CAS/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * DSML Parser — 解析 DeepSeek 的 DSML 格式工具调用
3
+ *
4
+ * DeepSeek-V4-Flash 等模型在未走标准 OpenAI tool_calls 通道时,会以 DSML
5
+ * (DeepSeek Markup Language)格式在正文流中输出工具调用。DSML 使用全角竖线
6
+ * `|`(U+FF5C)作为标记分隔,本解析器同时容错半角竖线 `|`(U+007C)。
7
+ *
8
+ * 格式示例:
9
+ * <|DSML|tool_calls>
10
+ * <|DSML|invoke name="create_report">
11
+ * <|DSML|parameter name="title" string="true">国泰海通...</|DSML|parameter>
12
+ * ...
13
+ * </|DSML|invoke>
14
+ * </|DSML|tool_calls>
15
+ *
16
+ * 实现要点:
17
+ * - 用状态机扫描而非正则,支持参数值中包含 `<`、换行、普通 XML 标签等内容。
18
+ * - 参数 `string="false"` 时尝试 JSON.parse,失败则保留原始字符串并告警。
19
+ * - 工具调用 id 使用全局单调计数器 + crypto.randomUUID,避免流式场景重复。
20
+ *
21
+ * 限制:DSML 格式本身无转义机制,参数值不能包含完整的闭合标记字面量
22
+ * (如 `</|DSML|parameter>`、`</|DSML|invoke>`),否则会与真闭合标记歧义。
23
+ *
24
+ * @see https://blog.csdn.net/gitblog_00855/article/details/152146045 DSML 格式说明
25
+ */
26
+ // ---- DSML 标记常量(统一使用全角竖线 U+FF5C)----
27
+ const OPEN_TOOL_CALLS = '<|DSML|tool_calls>';
28
+ const CLOSE_TOOL_CALLS = '</|DSML|tool_calls>';
29
+ const OPEN_INVOKE = '<|DSML|invoke';
30
+ const CLOSE_INVOKE = '</|DSML|invoke>';
31
+ const OPEN_PARAMETER = '<|DSML|parameter';
32
+ const CLOSE_PARAMETER = '</|DSML|parameter>';
33
+ /** 所有 DSML 标记(含开/闭),用于流式前缀保留判断 */
34
+ const ALL_MARKERS = [
35
+ OPEN_TOOL_CALLS, CLOSE_TOOL_CALLS,
36
+ OPEN_INVOKE, CLOSE_INVOKE,
37
+ OPEN_PARAMETER, CLOSE_PARAMETER,
38
+ ];
39
+ /** 全角竖线 U+FF5C 与半角竖线 U+007C 的匹配正则 */
40
+ const BAR_RE = /[||]/g;
41
+ /**
42
+ * 在 text 中查找 marker 的位置。
43
+ * marker 使用全角竖线;text 中的竖线可为全角或半角,均能命中。
44
+ * 返回原始 text 中的索引(非归一化后),未命中返回 -1。
45
+ */
46
+ function indexOfMarker(text, marker, from = 0) {
47
+ // 1:1 替换竖线为 \x00,长度不变,索引保持一致
48
+ const nt = text.replace(BAR_RE, '\x00');
49
+ const nm = marker.replace(BAR_RE, '\x00');
50
+ return nt.indexOf(nm, from);
51
+ }
52
+ /** 全局单调计数器,保证同毫秒内 id 不重复 */
53
+ let dsmlIdCounter = 0;
54
+ /** 生成唯一工具调用 id */
55
+ function nextDSMLId() {
56
+ const g = globalThis;
57
+ if (g.crypto?.randomUUID) {
58
+ return `dsml_${g.crypto.randomUUID()}`;
59
+ }
60
+ dsmlIdCounter = (dsmlIdCounter + 1) % Number.MAX_SAFE_INTEGER;
61
+ return `dsml_${Date.now()}_${dsmlIdCounter}`;
62
+ }
63
+ /** 解析单个参数值:string=true 原样返回,否则尝试 JSON.parse */
64
+ function decodeValue(raw, isString, paramName) {
65
+ if (isString)
66
+ return raw;
67
+ const trimmed = raw.trim();
68
+ if (trimmed === '')
69
+ return raw;
70
+ try {
71
+ return JSON.parse(trimmed);
72
+ }
73
+ catch {
74
+ console.warn(`[DSML] Failed to JSON.parse parameter "${paramName}", keeping raw string`);
75
+ return raw;
76
+ }
77
+ }
78
+ /** 从开标签文本中提取属性值,如 name="x" → x;属性顺序无关 */
79
+ function getAttr(openTag, attr) {
80
+ const re = new RegExp(`${attr}\\s*=\\s*"([^"]*)"`);
81
+ const m = openTag.match(re);
82
+ return m ? m[1] : null;
83
+ }
84
+ /**
85
+ * 解析 invoke 块内容,提取参数并构造 ToolCall,追加到 out。
86
+ * @param block invoke 标签之间的内容(不含 invoke 开闭标签本身)
87
+ */
88
+ function parseInvokesInBlock(block, out) {
89
+ let i = 0;
90
+ while (i < block.length) {
91
+ const s = indexOfMarker(block, OPEN_INVOKE, i);
92
+ if (s === -1)
93
+ break;
94
+ // invoke 开标签可能带属性,找到其结束 '>'
95
+ const tagEnd = block.indexOf('>', s);
96
+ if (tagEnd === -1)
97
+ break;
98
+ const openTag = block.slice(s, tagEnd + 1);
99
+ const toolName = getAttr(openTag, 'name') ?? '';
100
+ const afterOpen = tagEnd + 1;
101
+ const e = indexOfMarker(block, CLOSE_INVOKE, afterOpen);
102
+ if (e === -1)
103
+ break; // 未闭合 invoke,跳过
104
+ const paramsBlock = block.slice(afterOpen, e);
105
+ const args = parseParamsInBlock(paramsBlock);
106
+ out.push({
107
+ id: nextDSMLId(),
108
+ type: 'function',
109
+ function: { name: toolName, arguments: JSON.stringify(args) },
110
+ });
111
+ i = e + CLOSE_INVOKE.length;
112
+ }
113
+ }
114
+ /**
115
+ * 解析 parameter 块内容,返回参数键值对。
116
+ * 参数值用精确闭合标记切片,可包含 `<`、换行、子串等任意内容。
117
+ */
118
+ function parseParamsInBlock(paramsBlock) {
119
+ const args = {};
120
+ let i = 0;
121
+ while (i < paramsBlock.length) {
122
+ const s = indexOfMarker(paramsBlock, OPEN_PARAMETER, i);
123
+ if (s === -1)
124
+ break;
125
+ const tagEnd = paramsBlock.indexOf('>', s);
126
+ if (tagEnd === -1)
127
+ break;
128
+ const openTag = paramsBlock.slice(s, tagEnd + 1);
129
+ const paramName = getAttr(openTag, 'name') ?? '';
130
+ const stringAttr = getAttr(openTag, 'string');
131
+ const isString = stringAttr === null ? true : stringAttr === 'true';
132
+ const afterOpen = tagEnd + 1;
133
+ const e = indexOfMarker(paramsBlock, CLOSE_PARAMETER, afterOpen);
134
+ if (e === -1)
135
+ break; // 未闭合 parameter,跳过
136
+ const rawValue = paramsBlock.slice(afterOpen, e);
137
+ if (paramName) {
138
+ args[paramName] = decodeValue(rawValue, isString, paramName);
139
+ }
140
+ i = e + CLOSE_PARAMETER.length;
141
+ }
142
+ return args;
143
+ }
144
+ /**
145
+ * 解析 DSML 格式的工具调用
146
+ *
147
+ * @param text 可能包含 DSML 格式的文本
148
+ * @returns 解析结果,包含工具调用列表和剩余文本
149
+ */
150
+ export function parseDSML(text) {
151
+ const toolCalls = [];
152
+ const remainingPieces = [];
153
+ let i = 0;
154
+ while (i < text.length) {
155
+ const openIdx = indexOfMarker(text, OPEN_TOOL_CALLS, i);
156
+ if (openIdx === -1) {
157
+ // 剩余无 DSML 工具调用块,全部作为剩余文本
158
+ remainingPieces.push(text.slice(i));
159
+ break;
160
+ }
161
+ // 开标记之前的文本保留
162
+ if (openIdx > i)
163
+ remainingPieces.push(text.slice(i, openIdx));
164
+ const afterOpen = openIdx + OPEN_TOOL_CALLS.length;
165
+ const closeIdx = indexOfMarker(text, CLOSE_TOOL_CALLS, afterOpen);
166
+ if (closeIdx === -1) {
167
+ // 未闭合的 tool_calls 块:保留原样作为剩余文本(避免丢字,由调用方决定处理)
168
+ remainingPieces.push(text.slice(openIdx));
169
+ break;
170
+ }
171
+ const block = text.slice(afterOpen, closeIdx);
172
+ parseInvokesInBlock(block, toolCalls);
173
+ i = closeIdx + CLOSE_TOOL_CALLS.length;
174
+ }
175
+ const remainingText = remainingPieces.join('').trim();
176
+ return { toolCalls, remainingText };
177
+ }
178
+ /**
179
+ * 流式 DSML 解析器状态
180
+ *
181
+ * 用于处理流式输出,累积文本并检测 DSML 工具调用的开始/结束。
182
+ * 关键设计:
183
+ * - 始终先累积到 buffer,再尝试提取完整 DSML 块。
184
+ * - 当 buffer 末尾是某个 DSML 标记的可能前缀(如 `<`、`<|DSML|tool`)时,
185
+ * 暂留该前缀不作为文本增量发出,等待后续 chunk 确认。
186
+ * - 仅当检测到完整的 `<|DSML|tool_calls>...</|DSML|tool_calls>` 块时才解析。
187
+ */
188
+ export class StreamingDSMLParser {
189
+ buffer = '';
190
+ /**
191
+ * 计算 buffer 末尾「是某个 DSML 标记前缀」的长度。
192
+ * 例如 buffer 末尾为 `<|DSML|tool`,它是 `<|DSML|tool_calls>` 的前缀,
193
+ * 返回该前缀长度,调用方据此暂留尾部、只发出前段文本。
194
+ */
195
+ trailingMarkerPrefixLen(buf) {
196
+ const lastLt = buf.lastIndexOf('<');
197
+ if (lastLt === -1)
198
+ return 0;
199
+ const tail = buf.slice(lastLt);
200
+ const normTail = tail.replace(BAR_RE, '|');
201
+ let best = 0;
202
+ for (const m of ALL_MARKERS) {
203
+ // normTail 必须严格短于 m,且是 m 的前缀
204
+ if (normTail.length < m.length && m.startsWith(normTail)) {
205
+ best = Math.max(best, tail.length);
206
+ }
207
+ }
208
+ return best;
209
+ }
210
+ /**
211
+ * 从 buffer 中提取完整 DSML 块并解析,返回可安全发出的文本增量与已完成的工具调用。
212
+ */
213
+ drain() {
214
+ const completedToolCalls = [];
215
+ const textPieces = [];
216
+ let buf = this.buffer;
217
+ for (;;) {
218
+ const openIdx = indexOfMarker(buf, OPEN_TOOL_CALLS);
219
+ if (openIdx === -1) {
220
+ // 无 DSML 开始标记:保留末尾可能的标记前缀,其余作为文本发出
221
+ const keep = this.trailingMarkerPrefixLen(buf);
222
+ const emitLen = buf.length - keep;
223
+ if (emitLen > 0)
224
+ textPieces.push(buf.slice(0, emitLen));
225
+ this.buffer = keep > 0 ? buf.slice(emitLen) : '';
226
+ return { textDelta: textPieces.join(''), completedToolCalls };
227
+ }
228
+ // 开标记之前的文本(确定非 DSML)直接发出
229
+ if (openIdx > 0)
230
+ textPieces.push(buf.slice(0, openIdx));
231
+ const afterOpen = openIdx + OPEN_TOOL_CALLS.length;
232
+ const closeIdx = indexOfMarker(buf, CLOSE_TOOL_CALLS, afterOpen);
233
+ if (closeIdx === -1) {
234
+ // 开始标记已出现但未闭合:从开标记起暂留 buffer,等待后续 chunk
235
+ this.buffer = buf.slice(openIdx);
236
+ return { textDelta: textPieces.join(''), completedToolCalls };
237
+ }
238
+ // 完整块:解析其中的 invoke
239
+ const block = buf.slice(afterOpen, closeIdx);
240
+ parseInvokesInBlock(block, completedToolCalls);
241
+ buf = buf.slice(closeIdx + CLOSE_TOOL_CALLS.length);
242
+ // 继续循环,处理 buf 中可能存在的下一个 DSML 块
243
+ }
244
+ }
245
+ /**
246
+ * 处理流式文本片段
247
+ *
248
+ * @param chunk 流式文本片段
249
+ * @returns 解析结果,包含增量文本和已完成的工具调用
250
+ */
251
+ process(chunk) {
252
+ this.buffer += chunk;
253
+ return this.drain();
254
+ }
255
+ /** 获取当前累积的缓冲区内容 */
256
+ getBuffer() {
257
+ return this.buffer;
258
+ }
259
+ /** 重置解析器状态 */
260
+ reset() {
261
+ this.buffer = '';
262
+ }
263
+ /**
264
+ * 强制结束解析(用于流结束时处理未完成的 DSML)。
265
+ * 对残留 buffer 调用 parseDSML:完整块会被解析,未闭合块原样作为文本返回。
266
+ */
267
+ flush() {
268
+ if (this.buffer.length === 0) {
269
+ this.reset();
270
+ return { textDelta: '', completedToolCalls: [] };
271
+ }
272
+ const result = parseDSML(this.buffer);
273
+ this.reset();
274
+ return { textDelta: result.remainingText, completedToolCalls: result.toolCalls };
275
+ }
276
+ }
277
+ /**
278
+ * 检查文本是否包含 DSML 工具调用标记
279
+ */
280
+ export function containsDSML(text) {
281
+ return indexOfMarker(text, OPEN_TOOL_CALLS) !== -1;
282
+ }
283
+ //# sourceMappingURL=dsml-parser.js.map