/** * 全局速率限制 + 并发控制管理器(单例) */ declare class RateLimitManager { /** 是否正在冷却中 */ private cooldown; /** 冷却结束时间(ms 时间戳) */ private cooldownUntil; /** 连续 429 计数(同一冷却周期内累计) */ private count429; /** 最近一次 429 发生的时间戳(用于跨主会话生命周期的计数保留) */ private last429Ts; /** 冷却周期数(每次触发冷却递增,用于指数退避) */ private cooldownCycles; /** 冷却恢复定时器,避免重复冷却定时器交叉恢复状态 */ private cooldownTimer; /** * 每个主会话的子 Agent 并发状态。全局 429 冷却仍保留(见 cooldown 系列字段, * 因为 429 是 LLM Provider 层面、所有 Engine 共享的限制),但「同时运行的子 Agent 数」 * 按主会话隔离,使一个会话触发冷却/排队不会拖垮其它租户会话。 */ private sessionConcurrency; /** 已注册但尚未释放的子会话集合(防止重复释放) */ private activeSubSessionSet; /** 子会话 ID → 父会话 ID */ private parentMap; /** 主会话 ID → AbortController(用于在多轮冷却失败时终止主会话) */ private mainSessionControllers; /** 已终止的主会话 ID(防止重复 abort) */ private abortedSessions; /** 获取(懒创建)某主会话的 per-session 并发状态 */ private getConcurrency; /** 所有主会话的子 Agent 并发总数(仅用于诊断,不做全局门控) */ private getTotalActive; /** * 注册主会话。由 AgentEngine.run() 在开始时调用。 * * @param sessionId 主会话 ID * @param controller 引擎内部 AbortController,RateLimitManager 在多轮冷却失败时 * 可调用 controller.abort() 终止主会话 */ registerMainSession(sessionId: string, controller: AbortController): void; /** * 注销主会话。由 AgentEngine.run() 在 finally 中调用。 * 清理该主会话下的所有子会话映射并唤醒等待队列。 */ unregisterMainSession(sessionId: string): void; /** * 注册子会话。由 AgentEngine.linkChildSession() 调用。 * * 注意:此方法仅建立父子映射,不增加并发计数。 * 并发计数在 acquireSubSessionSlot() 中完成。 */ registerSubSession(childId: string, parentId: string): void; /** * 注销子会话。由 AgentEngine.unlinkChildSession() 调用。 * 同时释放并发槽位并唤醒等待队列。 */ unregisterSubSession(childId: string): void; /** * 获取子 Agent 执行槽位(并发控制)。 * * 在 delegate_task 工具执行前调用,确保同时运行的子 Agent 不超过上限。 * - 冷却期内自动等待冷却结束 * - 并发槽位满时排队等待,超时则拒绝 * * 注意:本方法会增加对应主会话的 per-session 并发计数。调用方在子 Agent 结束后 * 必须调用 releaseSubSessionSlot() 或 unregisterSubSession() 释放槽位。 * * @param sessionId 子会话 ID(用于在父会话 abort 时提前退出等待) * @returns true 表示获得槽位可以执行,false 表示超时或被拒绝 */ acquireSubSessionSlot(sessionId?: string): Promise; /** * 释放子 Agent 执行槽位。 * * 由 delegate_task 工具执行结束(无论成功或失败)后调用。 * 唤醒等待队列中的下一个子 Agent。 */ releaseSubSessionSlot(sessionId?: string): void; /** * 处理 429 速率限制事件。 * * 由 LLMCaller 在捕获 429 错误时调用。 * * 三级递进策略: * 1. 容忍期(< 阈值):仅记录,让 LLM 层重试/降级自行处理 * 2. 冷却期(≥ 阈值):触发指数退避冷却,新子 Agent 排队等待 * 3. 终止期(冷却周期超过上限):终止整个主会话 */ handleRateLimited(sessionId: string): void; /** 是否处于冷却期 */ isCooling(): boolean; /** 是否已达到并发上限或正在冷却(用于快速拒绝新请求) */ isRateLimitedOrSaturated(): boolean; /** 获取当前状态快照(诊断用) */ getStats(): { cooldown: boolean; cooldownRemainingMs: number; count429: number; cooldownCycles: number; activeSubSessions: number; maxConcurrent: number; queueLength: number; }; /** 所有主会话等待队列长度之和(诊断用) */ private getTotalQueueLength; /** 启动速率限制冷却期(指数退避) */ private startCooldown; /** 获取当前冷却时长(指数退避:30s → 60s → 120s) */ private getCooldownDuration; /** 终止指定主会话 */ private abortMainSession; /** 等待冷却期结束 */ private waitCooldown; /** 等待并发槽位(带超时,per-session 队列) */ private waitForSlot; /** 唤醒某主会话排队中的子 Agent,直到并发槽位用尽或队列空 */ private drainQueue; /** 检查指定子会话的父主会话是否已被 abort */ private isParentAborted; /** * 重置全局限流状态(无活跃主会话时调用)。 * * 注意:如果最近 COUNT_429_DECAY_MS 内发生过 429(TPM 窗口 ~60s + 余量), * 保留 count429 / cooldownCycles / last429Ts,使快速重试的新请求能累积计数 * 触发冷却。否则完全重置。这解决了「每次 run 只产生 2 个 429(primary + * fallback),run 结束后计数清零 → 阈值 3 永远无法达到 → 冷却永不触发」的问题。 */ private resetGlobal; /** 重置指定主会话相关的限流状态 */ private resetForSession; /** * 完全重置所有限流与并发状态(测试用)。 * * 与 `resetGlobal()` 不同:此方法无条件清空全部状态(包括 429 计数、 * 冷却周期、per-session 并发等),并清理冷却定时器, * 确保测试间完全隔离。 */ reset(): void; } /** 全局单例(跨所有 AgentEngine 实例共享) */ export declare const rateLimitManager: RateLimitManager; /** 导出类用于测试或自定义实例化 */ export { RateLimitManager }; /** 导出常量供外部读取(不可修改) */ export declare const RATE_LIMIT_CONFIG: { readonly RATE_LIMIT_THRESHOLD: 3; readonly COOLDOWN_BASE_MS: 30000; readonly MAX_COOLDOWN_CYCLES: 3; readonly MAX_CONCURRENT_SUB_SESSIONS: 3; readonly SUB_SESSION_WAIT_TIMEOUT: 120000; readonly COUNT_429_DECAY_MS: 90000; }; //# sourceMappingURL=rate-limit-manager.d.ts.map