@cicctencent/agent-core 0.1.28 → 0.1.31

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 (75) hide show
  1. package/dist/cjs/a2a/rest-runner.d.ts +16 -0
  2. package/dist/cjs/a2a/rest-runner.d.ts.map +1 -1
  3. package/dist/cjs/a2a/rest-runner.js +71 -4
  4. package/dist/cjs/a2a/rest-runner.js.map +1 -1
  5. package/dist/cjs/agent/engine.d.ts +57 -0
  6. package/dist/cjs/agent/engine.d.ts.map +1 -1
  7. package/dist/cjs/agent/engine.js +191 -1
  8. package/dist/cjs/agent/engine.js.map +1 -1
  9. package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
  10. package/dist/cjs/agent/llm-caller.js +8 -0
  11. package/dist/cjs/agent/llm-caller.js.map +1 -1
  12. package/dist/cjs/agent/rate-limit-manager.d.ts +127 -0
  13. package/dist/cjs/agent/rate-limit-manager.d.ts.map +1 -0
  14. package/dist/cjs/agent/rate-limit-manager.js +465 -0
  15. package/dist/cjs/agent/rate-limit-manager.js.map +1 -0
  16. package/dist/cjs/agent/tool-executor.d.ts +11 -0
  17. package/dist/cjs/agent/tool-executor.d.ts.map +1 -1
  18. package/dist/cjs/agent/tool-executor.js +95 -4
  19. package/dist/cjs/agent/tool-executor.js.map +1 -1
  20. package/dist/cjs/agent/types.d.ts +59 -0
  21. package/dist/cjs/agent/types.d.ts.map +1 -1
  22. package/dist/cjs/agent/types.js.map +1 -1
  23. package/dist/cjs/index.d.ts +3 -2
  24. package/dist/cjs/index.d.ts.map +1 -1
  25. package/dist/cjs/index.js +7 -3
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/runtime/run-registry.d.ts +2 -0
  28. package/dist/cjs/runtime/run-registry.d.ts.map +1 -1
  29. package/dist/cjs/runtime/run-registry.js +24 -1
  30. package/dist/cjs/runtime/run-registry.js.map +1 -1
  31. package/dist/cjs/tool/delegate.d.ts +9 -0
  32. package/dist/cjs/tool/delegate.d.ts.map +1 -1
  33. package/dist/cjs/tool/delegate.js.map +1 -1
  34. package/dist/cjs/utils/dsml-parser.d.ts +1 -1
  35. package/dist/cjs/utils/dsml-parser.d.ts.map +1 -1
  36. package/dist/cjs/utils/dsml-parser.js +16 -3
  37. package/dist/cjs/utils/dsml-parser.js.map +1 -1
  38. package/dist/esm/a2a/rest-runner.d.ts +16 -0
  39. package/dist/esm/a2a/rest-runner.d.ts.map +1 -1
  40. package/dist/esm/a2a/rest-runner.js +71 -4
  41. package/dist/esm/a2a/rest-runner.js.map +1 -1
  42. package/dist/esm/agent/engine.d.ts +57 -0
  43. package/dist/esm/agent/engine.d.ts.map +1 -1
  44. package/dist/esm/agent/engine.js +191 -1
  45. package/dist/esm/agent/engine.js.map +1 -1
  46. package/dist/esm/agent/llm-caller.d.ts.map +1 -1
  47. package/dist/esm/agent/llm-caller.js +8 -0
  48. package/dist/esm/agent/llm-caller.js.map +1 -1
  49. package/dist/esm/agent/rate-limit-manager.d.ts +127 -0
  50. package/dist/esm/agent/rate-limit-manager.d.ts.map +1 -0
  51. package/dist/esm/agent/rate-limit-manager.js +463 -0
  52. package/dist/esm/agent/rate-limit-manager.js.map +1 -0
  53. package/dist/esm/agent/tool-executor.d.ts +11 -0
  54. package/dist/esm/agent/tool-executor.d.ts.map +1 -1
  55. package/dist/esm/agent/tool-executor.js +95 -4
  56. package/dist/esm/agent/tool-executor.js.map +1 -1
  57. package/dist/esm/agent/types.d.ts +59 -0
  58. package/dist/esm/agent/types.d.ts.map +1 -1
  59. package/dist/esm/agent/types.js.map +1 -1
  60. package/dist/esm/index.d.ts +3 -2
  61. package/dist/esm/index.d.ts.map +1 -1
  62. package/dist/esm/index.js +1 -0
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/runtime/run-registry.d.ts +2 -0
  65. package/dist/esm/runtime/run-registry.d.ts.map +1 -1
  66. package/dist/esm/runtime/run-registry.js +24 -1
  67. package/dist/esm/runtime/run-registry.js.map +1 -1
  68. package/dist/esm/tool/delegate.d.ts +9 -0
  69. package/dist/esm/tool/delegate.d.ts.map +1 -1
  70. package/dist/esm/tool/delegate.js.map +1 -1
  71. package/dist/esm/utils/dsml-parser.d.ts +1 -1
  72. package/dist/esm/utils/dsml-parser.d.ts.map +1 -1
  73. package/dist/esm/utils/dsml-parser.js +16 -3
  74. package/dist/esm/utils/dsml-parser.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,465 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // RateLimitManager — 全局速率限制 + 子 Agent 并发控制
4
+ // ============================================================
5
+ //
6
+ // 解决 delegate_task 并发风暴导致的 LLM API TPM 限流(429)问题。
7
+ //
8
+ // 三级递进策略(与 omniinsight-bi AgentService 中的实现等价):
9
+ // 1. 容忍期:短时间内收到少量 429 时仅记录,让 LLM 层重试/降级自行处理
10
+ // 2. 冷却期:达到阈值后进入指数退避冷却(30s → 60s → 120s),
11
+ // 期间新建子 Agent 排队等待,已有子 Agent 继续运行
12
+ // 3. 终止期:冷却周期超过上限后终止整个主会话(避免无限循环)
13
+ //
14
+ // 并发控制:
15
+ // - MAX_CONCURRENT_SUB_SESSIONS 限制同时运行的子 Agent 数量
16
+ // - 超出上限时新请求进入等待队列,超时则拒绝
17
+ //
18
+ // 生命周期追踪:
19
+ // - registerMainSession / unregisterMainSession:由 AgentEngine.run() 调用
20
+ // - registerSubSession / unregisterSubSession:由 AgentEngine.linkChildSession() 调用
21
+ // - 子 Agent 完成时通过 releaseSubSessionSlot 释放槽位并唤醒队列
22
+ //
23
+ // 注意:本模块为进程级单例,跨所有 AgentEngine 实例共享状态,
24
+ // 因为 TPM 限制是 LLM API 层面的,所有 Engine 共享同一个 LLMProvider。
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.RATE_LIMIT_CONFIG = exports.RateLimitManager = exports.rateLimitManager = void 0;
27
+ const logger_ts_1 = require("../observability/logger.js");
28
+ /** 速率限制触发阈值:在短时间内收到这么多 429 即触发冷却 */
29
+ const RATE_LIMIT_THRESHOLD = 3;
30
+ /** 初始冷却时长(ms),后续每次翻倍 */
31
+ const COOLDOWN_BASE_MS = 30_000;
32
+ /** 最大冷却周期数:超过此值后终止整个主会话 */
33
+ const MAX_COOLDOWN_CYCLES = 3;
34
+ /** 最大并发子 Agent 数 */
35
+ const MAX_CONCURRENT_SUB_SESSIONS = 3;
36
+ /** 子 Agent 排队最大等待时间(ms),超时则拒绝 */
37
+ const SUB_SESSION_WAIT_TIMEOUT = 120_000;
38
+ /**
39
+ * 全局速率限制 + 并发控制管理器(单例)
40
+ */
41
+ class RateLimitManager {
42
+ // ══════ 限流状态 ══════
43
+ /** 是否正在冷却中 */
44
+ cooldown = false;
45
+ /** 冷却结束时间(ms 时间戳) */
46
+ cooldownUntil = 0;
47
+ /** 连续 429 计数(同一冷却周期内累计) */
48
+ count429 = 0;
49
+ /** 冷却周期数(每次触发冷却递增,用于指数退避) */
50
+ cooldownCycles = 0;
51
+ // ══════ 并发控制 ══════
52
+ /** 当前活跃的子 Agent 数量 */
53
+ activeSubSessionCount = 0;
54
+ /** 已注册但尚未释放的子会话集合(防止重复释放) */
55
+ activeSubSessionSet = new Set();
56
+ /** 并发控制等待队列 */
57
+ waitQueue = [];
58
+ // ══════ 父子会话映射 ══════
59
+ /** 子会话 ID → 父会话 ID */
60
+ parentMap = new Map();
61
+ /** 主会话 ID → AbortController(用于在多轮冷却失败时终止主会话) */
62
+ mainSessionControllers = new Map();
63
+ /** 已终止的主会话 ID(防止重复 abort) */
64
+ abortedSessions = new Set();
65
+ // ───────── 主会话生命周期 ─────────
66
+ /**
67
+ * 注册主会话。由 AgentEngine.run() 在开始时调用。
68
+ *
69
+ * @param sessionId 主会话 ID
70
+ * @param controller 引擎内部 AbortController,RateLimitManager 在多轮冷却失败时
71
+ * 可调用 controller.abort() 终止主会话
72
+ */
73
+ registerMainSession(sessionId, controller) {
74
+ this.mainSessionControllers.set(sessionId, controller);
75
+ }
76
+ /**
77
+ * 注销主会话。由 AgentEngine.run() 在 finally 中调用。
78
+ * 清理该主会话下的所有子会话映射并唤醒等待队列。
79
+ */
80
+ unregisterMainSession(sessionId) {
81
+ this.mainSessionControllers.delete(sessionId);
82
+ this.abortedSessions.delete(sessionId);
83
+ // 清理该主会话下的所有子会话映射(sessionId 作为 parent)
84
+ for (const [subId, parentId] of this.parentMap) {
85
+ if (parentId === sessionId) {
86
+ this.parentMap.delete(subId);
87
+ // 子会话可能仍在活跃集合中(异常退出未正常释放)
88
+ if (this.activeSubSessionSet.has(subId)) {
89
+ this.activeSubSessionSet.delete(subId);
90
+ if (this.activeSubSessionCount > 0)
91
+ this.activeSubSessionCount--;
92
+ }
93
+ }
94
+ }
95
+ // 兜底:清理 sessionId 作为 child 的条目(子 engine run() 结束时自动清理自身映射)
96
+ // 注意:不递减 activeSubSessionCount,因为并发槽位由 tool-executor 的
97
+ // releaseSubSessionSlot 管理(使用临时 subslot ID,不是实际的 sessionId)
98
+ this.parentMap.delete(sessionId);
99
+ this.activeSubSessionSet.delete(sessionId);
100
+ // 如果已经没有任何活跃主会话,重置全局限流状态
101
+ if (this.mainSessionControllers.size === 0) {
102
+ this.resetGlobal();
103
+ }
104
+ else {
105
+ // 仍有其他主会话在运行,尝试唤醒排队
106
+ this.drainQueue();
107
+ }
108
+ }
109
+ // ───────── 子会话生命周期 ─────────
110
+ /**
111
+ * 注册子会话。由 AgentEngine.linkChildSession() 调用。
112
+ *
113
+ * 注意:此方法仅建立父子映射,不增加并发计数。
114
+ * 并发计数在 acquireSubSessionSlot() 中完成。
115
+ */
116
+ registerSubSession(childId, parentId) {
117
+ this.parentMap.set(childId, parentId);
118
+ }
119
+ /**
120
+ * 注销子会话。由 AgentEngine.unlinkChildSession() 调用。
121
+ * 同时释放并发槽位并唤醒等待队列。
122
+ */
123
+ unregisterSubSession(childId) {
124
+ const wasActive = this.activeSubSessionSet.has(childId);
125
+ this.activeSubSessionSet.delete(childId);
126
+ this.parentMap.delete(childId);
127
+ if (wasActive) {
128
+ if (this.activeSubSessionCount > 0)
129
+ this.activeSubSessionCount--;
130
+ this.drainQueue();
131
+ }
132
+ }
133
+ // ───────── 并发槽位 ─────────
134
+ /**
135
+ * 获取子 Agent 执行槽位(并发控制)。
136
+ *
137
+ * 在 delegate_task 工具执行前调用,确保同时运行的子 Agent 不超过上限。
138
+ * - 冷却期内自动等待冷却结束
139
+ * - 并发槽位满时排队等待,超时则拒绝
140
+ *
141
+ * 注意:本方法会增加 activeSubSessionCount。调用方在子 Agent 结束后
142
+ * 必须调用 releaseSubSessionSlot() 或 unregisterSubSession() 释放槽位。
143
+ *
144
+ * @param sessionId 子会话 ID(用于在父会话 abort 时提前退出等待)
145
+ * @returns true 表示获得槽位可以执行,false 表示超时或被拒绝
146
+ */
147
+ async acquireSubSessionSlot(sessionId) {
148
+ // ① 如果处于冷却期,等待冷却结束
149
+ if (this.cooldown) {
150
+ const remaining = Math.max(0, this.cooldownUntil - Date.now());
151
+ if (remaining > 0) {
152
+ if (remaining > SUB_SESSION_WAIT_TIMEOUT) {
153
+ (0, logger_ts_1.logEvent)({
154
+ event: 'rate_limit.cooldown_too_long',
155
+ level: 'warn',
156
+ sessionId,
157
+ data: { remaining, max: SUB_SESSION_WAIT_TIMEOUT },
158
+ });
159
+ return false;
160
+ }
161
+ await this.waitCooldown(remaining, sessionId);
162
+ // 等待期间父会话可能已 abort
163
+ if (sessionId && this.isParentAborted(sessionId)) {
164
+ return false;
165
+ }
166
+ }
167
+ }
168
+ // ② 检查并发槽位
169
+ if (this.activeSubSessionCount >= MAX_CONCURRENT_SUB_SESSIONS) {
170
+ const granted = await this.waitForSlot(sessionId);
171
+ if (!granted)
172
+ return false;
173
+ // 等待期间父会话可能已 abort
174
+ if (sessionId && this.isParentAborted(sessionId)) {
175
+ // 释放刚刚获得的槽位
176
+ this.releaseSubSessionSlot();
177
+ return false;
178
+ }
179
+ }
180
+ // ③ 获得槽位
181
+ this.activeSubSessionCount++;
182
+ if (sessionId)
183
+ this.activeSubSessionSet.add(sessionId);
184
+ return true;
185
+ }
186
+ /**
187
+ * 释放子 Agent 执行槽位。
188
+ *
189
+ * 由 delegate_task 工具执行结束(无论成功或失败)后调用。
190
+ * 唤醒等待队列中的下一个子 Agent。
191
+ */
192
+ releaseSubSessionSlot(sessionId) {
193
+ if (sessionId)
194
+ this.activeSubSessionSet.delete(sessionId);
195
+ if (this.activeSubSessionCount > 0)
196
+ this.activeSubSessionCount--;
197
+ this.drainQueue();
198
+ }
199
+ // ───────── 429 速率限制处理 ─────────
200
+ /**
201
+ * 处理 429 速率限制事件。
202
+ *
203
+ * 由 LLMCaller 在捕获 429 错误时调用。
204
+ *
205
+ * 三级递进策略:
206
+ * 1. 容忍期(< 阈值):仅记录,让 LLM 层重试/降级自行处理
207
+ * 2. 冷却期(≥ 阈值):触发指数退避冷却,新子 Agent 排队等待
208
+ * 3. 终止期(冷却周期超过上限):终止整个主会话
209
+ */
210
+ handleRateLimited(sessionId) {
211
+ this.count429++;
212
+ // 解析父主会话 ID
213
+ const parentSessionId = this.parentMap.get(sessionId) || sessionId;
214
+ // 已处于冷却期:仅记录,让冷却计时自然结束
215
+ if (this.cooldown) {
216
+ (0, logger_ts_1.logEvent)({
217
+ event: 'rate_limit.429_during_cooldown',
218
+ level: 'warn',
219
+ sessionId,
220
+ data: {
221
+ count429: this.count429,
222
+ cooldownRemaining: Math.max(0, this.cooldownUntil - Date.now()),
223
+ parentSessionId,
224
+ },
225
+ });
226
+ return;
227
+ }
228
+ // 未冷却:检查是否达到触发阈值
229
+ if (this.count429 >= RATE_LIMIT_THRESHOLD) {
230
+ this.startCooldown();
231
+ // 检查冷却周期是否超过上限 → 终止主会话
232
+ if (this.cooldownCycles >= MAX_COOLDOWN_CYCLES) {
233
+ this.abortMainSession(parentSessionId);
234
+ this.resetForSession(parentSessionId);
235
+ }
236
+ else {
237
+ (0, logger_ts_1.logEvent)({
238
+ event: 'rate_limit.cooldown_started',
239
+ level: 'warn',
240
+ sessionId,
241
+ data: {
242
+ cycle: this.cooldownCycles,
243
+ durationMs: this.getCooldownDuration(),
244
+ count429: this.count429,
245
+ activeSubSessions: this.activeSubSessionCount,
246
+ },
247
+ });
248
+ }
249
+ }
250
+ else {
251
+ // 未达到阈值,仅记录
252
+ (0, logger_ts_1.logEvent)({
253
+ event: 'rate_limit.429_observed',
254
+ level: 'warn',
255
+ sessionId,
256
+ data: { count429: this.count429, threshold: RATE_LIMIT_THRESHOLD },
257
+ });
258
+ }
259
+ }
260
+ // ───────── 查询 API ─────────
261
+ /** 是否处于冷却期 */
262
+ isCooling() {
263
+ return this.cooldown;
264
+ }
265
+ /** 是否已达到并发上限或正在冷却(用于快速拒绝新请求) */
266
+ isRateLimitedOrSaturated() {
267
+ return this.cooldown || this.activeSubSessionCount >= MAX_CONCURRENT_SUB_SESSIONS;
268
+ }
269
+ /** 获取当前状态快照(诊断用) */
270
+ getStats() {
271
+ return {
272
+ cooldown: this.cooldown,
273
+ cooldownRemainingMs: Math.max(0, this.cooldownUntil - Date.now()),
274
+ count429: this.count429,
275
+ cooldownCycles: this.cooldownCycles,
276
+ activeSubSessions: this.activeSubSessionCount,
277
+ maxConcurrent: MAX_CONCURRENT_SUB_SESSIONS,
278
+ queueLength: this.waitQueue.length,
279
+ };
280
+ }
281
+ // ───────── 内部实现 ─────────
282
+ /** 启动速率限制冷却期(指数退避) */
283
+ startCooldown() {
284
+ this.cooldown = true;
285
+ this.cooldownCycles++;
286
+ const duration = this.getCooldownDuration();
287
+ this.cooldownUntil = Date.now() + duration;
288
+ setTimeout(() => {
289
+ this.cooldown = false;
290
+ this.count429 = 0;
291
+ (0, logger_ts_1.logEvent)({
292
+ event: 'rate_limit.cooldown_ended',
293
+ level: 'info',
294
+ data: { cycle: this.cooldownCycles },
295
+ });
296
+ // 唤醒排队中的子 Agent
297
+ this.drainQueue();
298
+ }, duration);
299
+ }
300
+ /** 获取当前冷却时长(指数退避:30s → 60s → 120s) */
301
+ getCooldownDuration() {
302
+ return COOLDOWN_BASE_MS * Math.pow(2, this.cooldownCycles - 1);
303
+ }
304
+ /** 终止指定主会话 */
305
+ abortMainSession(sessionId) {
306
+ if (this.abortedSessions.has(sessionId))
307
+ return;
308
+ this.abortedSessions.add(sessionId);
309
+ const controller = this.mainSessionControllers.get(sessionId);
310
+ if (controller && !controller.signal.aborted) {
311
+ controller.abort(new Error(`TPM rate limit — ${this.cooldownCycles} cooldown cycles exhausted`));
312
+ (0, logger_ts_1.logEvent)({
313
+ event: 'rate_limit.main_session_aborted',
314
+ level: 'error',
315
+ sessionId,
316
+ data: {
317
+ cooldownCycles: this.cooldownCycles,
318
+ count429: this.count429,
319
+ },
320
+ });
321
+ }
322
+ }
323
+ /** 等待冷却期结束 */
324
+ waitCooldown(remainingMs, sessionId) {
325
+ return new Promise(resolve => {
326
+ const timer = setTimeout(resolve, remainingMs);
327
+ // 主会话被 abort 时提前退出等待
328
+ if (sessionId) {
329
+ const parentId = this.parentMap.get(sessionId) || sessionId;
330
+ const controller = this.mainSessionControllers.get(parentId);
331
+ if (controller && !controller.signal.aborted) {
332
+ const onAbort = () => {
333
+ clearTimeout(timer);
334
+ resolve();
335
+ };
336
+ controller.signal.addEventListener('abort', onAbort, { once: true });
337
+ }
338
+ }
339
+ });
340
+ }
341
+ /** 等待并发槽位(带超时) */
342
+ waitForSlot(sessionId) {
343
+ return new Promise(resolve => {
344
+ const item = { resolve, sessionId };
345
+ // 排队超时
346
+ item.timeoutId = setTimeout(() => {
347
+ const idx = this.waitQueue.indexOf(item);
348
+ if (idx !== -1)
349
+ this.waitQueue.splice(idx, 1);
350
+ (0, logger_ts_1.logEvent)({
351
+ event: 'rate_limit.slot_wait_timeout',
352
+ level: 'warn',
353
+ sessionId,
354
+ data: { timeout: SUB_SESSION_WAIT_TIMEOUT },
355
+ });
356
+ resolve(false);
357
+ }, SUB_SESSION_WAIT_TIMEOUT);
358
+ // 主会话被 abort 时立即退出等待
359
+ if (sessionId) {
360
+ const parentId = this.parentMap.get(sessionId) || sessionId;
361
+ const controller = this.mainSessionControllers.get(parentId);
362
+ if (controller && !controller.signal.aborted) {
363
+ item.abortListener = () => {
364
+ if (item.timeoutId)
365
+ clearTimeout(item.timeoutId);
366
+ const idx = this.waitQueue.indexOf(item);
367
+ if (idx !== -1)
368
+ this.waitQueue.splice(idx, 1);
369
+ resolve(false);
370
+ };
371
+ controller.signal.addEventListener('abort', item.abortListener, { once: true });
372
+ }
373
+ }
374
+ this.waitQueue.push(item);
375
+ });
376
+ }
377
+ /** 唤醒排队中的子 Agent,直到并发槽位用尽或队列空 */
378
+ drainQueue() {
379
+ while (this.activeSubSessionCount < MAX_CONCURRENT_SUB_SESSIONS &&
380
+ this.waitQueue.length > 0 &&
381
+ !this.cooldown) {
382
+ const item = this.waitQueue.shift();
383
+ if (!item)
384
+ continue;
385
+ // 清理定时器和 abort 监听器
386
+ if (item.timeoutId)
387
+ clearTimeout(item.timeoutId);
388
+ if (item.abortListener && item.sessionId) {
389
+ const parentId = this.parentMap.get(item.sessionId) || item.sessionId;
390
+ const controller = this.mainSessionControllers.get(parentId);
391
+ if (controller) {
392
+ controller.signal.removeEventListener('abort', item.abortListener);
393
+ }
394
+ }
395
+ try {
396
+ item.resolve(true);
397
+ }
398
+ catch {
399
+ // ignore
400
+ }
401
+ }
402
+ }
403
+ /** 检查指定子会话的父主会话是否已被 abort */
404
+ isParentAborted(sessionId) {
405
+ const parentId = this.parentMap.get(sessionId) || sessionId;
406
+ const controller = this.mainSessionControllers.get(parentId);
407
+ return !!controller?.signal.aborted;
408
+ }
409
+ /** 重置全局限流状态(无活跃主会话时调用) */
410
+ resetGlobal() {
411
+ this.cooldown = false;
412
+ this.cooldownUntil = 0;
413
+ this.count429 = 0;
414
+ this.cooldownCycles = 0;
415
+ this.activeSubSessionCount = 0;
416
+ this.activeSubSessionSet.clear();
417
+ this.parentMap.clear();
418
+ this.abortedSessions.clear();
419
+ // 唤醒所有排队项(拒绝,因为已无主会话)
420
+ const queue = this.waitQueue;
421
+ this.waitQueue = [];
422
+ for (const item of queue) {
423
+ if (item.timeoutId)
424
+ clearTimeout(item.timeoutId);
425
+ try {
426
+ item.resolve(false);
427
+ }
428
+ catch {
429
+ // ignore
430
+ }
431
+ }
432
+ }
433
+ /** 重置指定主会话相关的限流状态 */
434
+ resetForSession(sessionId) {
435
+ this.cooldown = false;
436
+ this.cooldownUntil = 0;
437
+ this.count429 = 0;
438
+ this.cooldownCycles = 0;
439
+ // 唤醒所有排队项(主会话被终止,全部拒绝)
440
+ const queue = this.waitQueue;
441
+ this.waitQueue = [];
442
+ for (const item of queue) {
443
+ if (item.timeoutId)
444
+ clearTimeout(item.timeoutId);
445
+ try {
446
+ item.resolve(false);
447
+ }
448
+ catch {
449
+ // ignore
450
+ }
451
+ }
452
+ }
453
+ }
454
+ exports.RateLimitManager = RateLimitManager;
455
+ /** 全局单例(跨所有 AgentEngine 实例共享) */
456
+ exports.rateLimitManager = new RateLimitManager();
457
+ /** 导出常量供外部读取(不可修改) */
458
+ exports.RATE_LIMIT_CONFIG = {
459
+ RATE_LIMIT_THRESHOLD,
460
+ COOLDOWN_BASE_MS,
461
+ MAX_COOLDOWN_CYCLES,
462
+ MAX_CONCURRENT_SUB_SESSIONS,
463
+ SUB_SESSION_WAIT_TIMEOUT,
464
+ };
465
+ //# sourceMappingURL=rate-limit-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-manager.js","sourceRoot":"","sources":["../../../src/agent/rate-limit-manager.ts"],"names":[],"mappings":"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"}
@@ -74,6 +74,17 @@ export declare class AgentToolExecutor {
74
74
  private executeOneToolCall;
75
75
  /** 带超时的工具执行 */
76
76
  private runWithTimeout;
77
+ /**
78
+ * 执行非 delegate_task 工具(带超时),从 runWithTimeout 抽取以保持逻辑清晰
79
+ */
80
+ private executeToolWithTimeout;
81
+ /**
82
+ * 执行 delegate_task(带超时 + 子 Agent AbortController)
83
+ *
84
+ * 与普通工具不同,delegate_task 的超时会同时 abort 子 Agent,
85
+ * 防止子 Agent 在父级超时后继续运行导致资源泄漏。
86
+ */
87
+ private executeDelegateWithTimeout;
77
88
  private emitUnavailableToolResult;
78
89
  /** 检查工具是否被熔断 */
79
90
  private isCircuitBroken;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../../src/agent/tool-executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAa,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,aAAa;AACb,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,oBAAoB;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,sBAAsB,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3G,YAAY;IACZ,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY;IACZ,aAAa,EAAE,MAAM,UAAU,EAAE,GAAG,SAAS,CAAC;CAC/C;AAQD,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,eAAe,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAqB;IAEnC,8CAA8C;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAK;IAEtD,4BAA4B;IAC5B,OAAO,CAAC,cAAc,CAAc;gBAExB,MAAM,EAAE,kBAAkB;IAKtC,+BAA+B;IACxB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC;IAmBhG;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAmDtB,2BAA2B;IAC3B,OAAO,CAAC,kBAAkB;IA0B1B,2BAA2B;YACZ,wBAAwB;IAsDvC,gCAAgC;YACjB,kBAAkB;IAkPjC,eAAe;YACD,cAAc;YA4Db,yBAAyB;IAsBxC,gBAAgB;IAChB,OAAO,CAAC,eAAe;IAIvB,iBAAiB;IACjB,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA6C3B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAoD9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAyC5B"}
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../../src/agent/tool-executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAa,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,aAAa;AACb,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,oBAAoB;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,sBAAsB,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3G,YAAY;IACZ,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY;IACZ,aAAa,EAAE,MAAM,UAAU,EAAE,GAAG,SAAS,CAAC;CAC/C;AAQD,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,eAAe,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAqB;IAEnC,8CAA8C;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAK;IAEtD,4BAA4B;IAC5B,OAAO,CAAC,cAAc,CAAc;gBAExB,MAAM,EAAE,kBAAkB;IAKtC,+BAA+B;IACxB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC;IAmBhG;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAmDtB,2BAA2B;IAC3B,OAAO,CAAC,kBAAkB;IA0B1B,2BAA2B;YACZ,wBAAwB;IAsDvC,gCAAgC;YACjB,kBAAkB;IAkPjC,eAAe;YACD,cAAc;IA6C5B;;OAEG;YACW,sBAAsB;IAsDpC;;;;;OAKG;YACW,0BAA0B;YA0DzB,yBAAyB;IAsBxC,gBAAgB;IAChB,OAAO,CAAC,eAAe;IAIvB,iBAAiB;IACjB,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA6C3B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAoD9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAyC5B"}
@@ -4,6 +4,7 @@
4
4
  // ============================================================
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AgentToolExecutor = void 0;
7
+ const rate_limit_manager_ts_1 = require("./rate-limit-manager.js");
7
8
  /**
8
9
  * 工具执行管理器
9
10
  *
@@ -344,6 +345,99 @@ class AgentToolExecutor {
344
345
  ? Math.max(this.config.toolTimeout * 30, 900000)
345
346
  : this.config.toolTimeout;
346
347
  const start = Date.now();
348
+ // delegate_task 并发控制:在执行前获取限流/并发槽位
349
+ // 解决 delegate_task 并发风暴导致 LLM API TPM 限流(429)问题
350
+ if (isDelegate) {
351
+ // 为子 Agent 生成临时 sessionId,用于在限流冷却期等待时定位父会话
352
+ const tempSubSessionId = `subslot_${call.id}_${Date.now()}`;
353
+ const parentSessionId = state.sessionId;
354
+ // 临时建立父子映射,使 RateLimitManager 能在父会话 abort 时唤醒等待
355
+ rate_limit_manager_ts_1.rateLimitManager.registerSubSession(tempSubSessionId, parentSessionId);
356
+ const granted = await rate_limit_manager_ts_1.rateLimitManager.acquireSubSessionSlot(tempSubSessionId);
357
+ if (!granted) {
358
+ rate_limit_manager_ts_1.rateLimitManager.unregisterSubSession(tempSubSessionId);
359
+ const stats = rate_limit_manager_ts_1.rateLimitManager.getStats();
360
+ const reason = stats.cooldown
361
+ ? `Rate limit cooldown active (remaining ${stats.cooldownRemainingMs}ms)`
362
+ : `Sub-session concurrency limit reached (max ${stats.maxConcurrent}, queue timeout)`;
363
+ return {
364
+ result: `Error: Sub-agent execution rejected due to rate limiting. ${reason}. Please retry later or reduce parallel delegation.`,
365
+ isError: true,
366
+ actualArgs: args,
367
+ duration: Date.now() - start,
368
+ call,
369
+ };
370
+ }
371
+ try {
372
+ const result = await this.executeDelegateWithTimeout(state, call, args, timeout, start, tempSubSessionId);
373
+ return result;
374
+ }
375
+ finally {
376
+ // 释放并发槽位并清理临时映射
377
+ rate_limit_manager_ts_1.rateLimitManager.releaseSubSessionSlot(tempSubSessionId);
378
+ rate_limit_manager_ts_1.rateLimitManager.unregisterSubSession(tempSubSessionId);
379
+ }
380
+ }
381
+ return this.executeToolWithTimeout(state, call, args, timeout, start);
382
+ }
383
+ /**
384
+ * 执行非 delegate_task 工具(带超时),从 runWithTimeout 抽取以保持逻辑清晰
385
+ */
386
+ async executeToolWithTimeout(state, call, args, timeout, start) {
387
+ // 为工具创建子 AbortController:超时或父级 abort 时能中止
388
+ const childAbort = new AbortController();
389
+ const parentSignal = state.toolContext.abortSignal;
390
+ const onParentAbort = () => childAbort.abort();
391
+ if (parentSignal?.aborted) {
392
+ childAbort.abort();
393
+ }
394
+ else if (parentSignal) {
395
+ parentSignal.addEventListener('abort', onParentAbort, { once: true });
396
+ }
397
+ let timeoutId;
398
+ const timeoutPromise = new Promise((_, reject) => {
399
+ timeoutId = setTimeout(() => {
400
+ reject(new Error(`Tool execution timeout (${timeout}ms)`));
401
+ }, timeout);
402
+ });
403
+ const ctxWithCallId = {
404
+ ...state.toolContext,
405
+ currentToolCallId: call.id,
406
+ abortSignal: childAbort.signal,
407
+ };
408
+ try {
409
+ const rawResult = await Promise.race([
410
+ this.config.toolRegistry.execute(call.function.name, args, ctxWithCallId),
411
+ timeoutPromise,
412
+ ]);
413
+ clearTimeout(timeoutId);
414
+ const result = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
415
+ return { result, isError: false, actualArgs: args, duration: Date.now() - start, call };
416
+ }
417
+ catch (err) {
418
+ clearTimeout(timeoutId);
419
+ const errorMsg = `Error: ${err.message || err}`;
420
+ await this.config.runHooks('on_error', {
421
+ sessionId: state.sessionId,
422
+ iteration: state.iteration,
423
+ tool: call.function.name,
424
+ error: err.message || String(err),
425
+ recoverable: true,
426
+ });
427
+ return { result: errorMsg, isError: true, actualArgs: args, duration: Date.now() - start, call };
428
+ }
429
+ finally {
430
+ if (parentSignal)
431
+ parentSignal.removeEventListener('abort', onParentAbort);
432
+ }
433
+ }
434
+ /**
435
+ * 执行 delegate_task(带超时 + 子 Agent AbortController)
436
+ *
437
+ * 与普通工具不同,delegate_task 的超时会同时 abort 子 Agent,
438
+ * 防止子 Agent 在父级超时后继续运行导致资源泄漏。
439
+ */
440
+ async executeDelegateWithTimeout(state, call, args, timeout, start, _tempSubSessionId) {
347
441
  // 为 delegate_task 创建子 AbortController:超时或父级 abort 时能中止子 Agent
348
442
  const childAbort = new AbortController();
349
443
  const parentSignal = state.toolContext.abortSignal;
@@ -373,16 +467,13 @@ class AgentToolExecutor {
373
467
  timeoutPromise,
374
468
  ]);
375
469
  clearTimeout(timeoutId);
376
- // 确保结果为字符串(工具可能返回对象)
377
470
  const result = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
378
471
  return { result, isError: false, actualArgs: args, duration: Date.now() - start, call };
379
472
  }
380
473
  catch (err) {
381
474
  clearTimeout(timeoutId);
382
475
  const errorMsg = `Error: ${err.message || err}`;
383
- if (isDelegate) {
384
- console.error(`[ToolExecutor] delegate_task failed after ${Date.now() - start}ms: ${err.message || err}`);
385
- }
476
+ console.error(`[ToolExecutor] delegate_task failed after ${Date.now() - start}ms: ${err.message || err}`);
386
477
  await this.config.runHooks('on_error', {
387
478
  sessionId: state.sessionId,
388
479
  iteration: state.iteration,