@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.
- package/dist/cjs/agent/engine.d.ts +5 -1
- package/dist/cjs/agent/engine.d.ts.map +1 -1
- package/dist/cjs/agent/engine.js +78 -49
- package/dist/cjs/agent/engine.js.map +1 -1
- package/dist/cjs/agent/history-manager.d.ts.map +1 -1
- package/dist/cjs/agent/history-manager.js +17 -2
- package/dist/cjs/agent/history-manager.js.map +1 -1
- package/dist/cjs/agent/llm-caller.d.ts +2 -9
- package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
- package/dist/cjs/agent/llm-caller.js +69 -123
- package/dist/cjs/agent/llm-caller.js.map +1 -1
- package/dist/cjs/agent/tool-executor.d.ts +9 -6
- package/dist/cjs/agent/tool-executor.d.ts.map +1 -1
- package/dist/cjs/agent/tool-executor.js +53 -59
- package/dist/cjs/agent/tool-executor.js.map +1 -1
- package/dist/cjs/agent/types.d.ts +50 -0
- package/dist/cjs/agent/types.d.ts.map +1 -1
- package/dist/cjs/agent/types.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/runtime/run-registry-interface.d.ts +5 -5
- package/dist/cjs/runtime/run-registry-interface.d.ts.map +1 -1
- package/dist/cjs/runtime/run-registry.d.ts +15 -2
- package/dist/cjs/runtime/run-registry.d.ts.map +1 -1
- package/dist/cjs/runtime/run-registry.js +87 -25
- package/dist/cjs/runtime/run-registry.js.map +1 -1
- package/dist/cjs/utils/dsml-parser.d.ts +89 -0
- package/dist/cjs/utils/dsml-parser.d.ts.map +1 -0
- package/dist/cjs/utils/dsml-parser.js +289 -0
- package/dist/cjs/utils/dsml-parser.js.map +1 -0
- package/dist/cjs/utils/token-counter.d.ts.map +1 -1
- package/dist/cjs/utils/token-counter.js +20 -4
- package/dist/cjs/utils/token-counter.js.map +1 -1
- package/dist/esm/agent/engine.d.ts +5 -1
- package/dist/esm/agent/engine.d.ts.map +1 -1
- package/dist/esm/agent/engine.js +78 -49
- package/dist/esm/agent/engine.js.map +1 -1
- package/dist/esm/agent/history-manager.d.ts.map +1 -1
- package/dist/esm/agent/history-manager.js +17 -2
- package/dist/esm/agent/history-manager.js.map +1 -1
- package/dist/esm/agent/llm-caller.d.ts +2 -9
- package/dist/esm/agent/llm-caller.d.ts.map +1 -1
- package/dist/esm/agent/llm-caller.js +69 -123
- package/dist/esm/agent/llm-caller.js.map +1 -1
- package/dist/esm/agent/tool-executor.d.ts +9 -6
- package/dist/esm/agent/tool-executor.d.ts.map +1 -1
- package/dist/esm/agent/tool-executor.js +53 -59
- package/dist/esm/agent/tool-executor.js.map +1 -1
- package/dist/esm/agent/types.d.ts +50 -0
- package/dist/esm/agent/types.d.ts.map +1 -1
- package/dist/esm/agent/types.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/runtime/run-registry-interface.d.ts +5 -5
- package/dist/esm/runtime/run-registry-interface.d.ts.map +1 -1
- package/dist/esm/runtime/run-registry.d.ts +15 -2
- package/dist/esm/runtime/run-registry.d.ts.map +1 -1
- package/dist/esm/runtime/run-registry.js +87 -25
- package/dist/esm/runtime/run-registry.js.map +1 -1
- package/dist/esm/utils/dsml-parser.d.ts +89 -0
- package/dist/esm/utils/dsml-parser.d.ts.map +1 -0
- package/dist/esm/utils/dsml-parser.js +283 -0
- package/dist/esm/utils/dsml-parser.js.map +1 -0
- package/dist/esm/utils/token-counter.d.ts.map +1 -1
- package/dist/esm/utils/token-counter.js +20 -4
- package/dist/esm/utils/token-counter.js.map +1 -1
- 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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 >
|
|
276
|
-
console.warn(`[RunRegistry] Idle timeout (${idleDuration}ms > ${
|
|
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.
|
|
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
|