/** * v5.8.5 Provider 延迟+错误率追踪 * * 接 openclaw 的 `model_call_ended` hook:每次 LLM 调用完成时记一次样本, * 按 provider 维护滑动窗口(最近 50 样本 / 1h 内),计算 P50/P95/errRate, * 节流写回 ModelRouteConfig.speedTracking 给 selectProvider speed mode 用。 * * 红线: * - 内存优先,磁盘 IO 节流(debounce 60s 或攒 10+ 新样本) * - 只读 hook event,不改 model 选择(5.8.3 的 before_model_resolve 单独管路由) * - 不用 child_process / 不阻塞 hook 返回 */ import type { ModelRouteConfig, SpeedSample } from "./model-route-config.js"; interface BanEntry { providerId: string; reason: string; bannedAt: number; expireAt: number; /** 触发的关键词或 status code,便于诊断 */ trigger: string; } /** v6.1.5: 立刻 ban 一个 model(quota-exhausted 等硬错时调用) */ export declare function banModel(providerId: string, reason: string, trigger: string, ttlMs?: number): void; /** 查询某 model 是否在 ban 期。过期会自动清理。 */ export declare function isModelBanned(providerId: string): BanEntry | null; /** 手动解除 ban(enhance_model_route_unban 工具调用)*/ export declare function unbanModel(providerId: string): boolean; /** 列出当前所有 active ban(自动清理过期)*/ export declare function listBannedModels(): BanEntry[]; /** * v6.1.5: 记一次错误样本,并检测是否是 quota-exhausted 类硬错——是的话立刻 banModel。 * 跟 recordSample 互补:recordSample 累积 errRate 用于 circuit breaker(5+ 样本), * recordError 单次硬错就立刻 ban(不等积累)。可同时调用。 * * 返回是否触发了 ban。 */ export declare function recordError(providerId: string, errorMessage: string, httpStatus: number | null, ttlMs?: number): { banned: boolean; trigger: string; }; /** * 记一次 LLM 调用样本。从 model_call_ended hook 调用。 * * 调用内不写盘——只更新内存,由 schedulePersist 节流。 */ export declare function recordSample(providerId: string, latencyMs: number, errored: boolean): void; /** * 把所有 provider 当前 stats 计算后 inject 进 config.speedTracking 并 saveConfig。 * * 由 schedulePersist 节流调用。直接调用立即写。 */ export declare function flushTracking(config: ModelRouteConfig): void; /** * 决定是否要触发 persist(节流策略)。从 hook 调用,廉价。 */ export declare function schedulePersist(config: ModelRouteConfig): void; /** * 返回当前所有 provider 的内存状态(diagnostic / status 工具用)。 */ /** * v6.1.4: 给 model-router circuit breaker 用——返回某 provider 当前实时 SpeedSample * (p50/p95/errRate/samples),数据不足返回 null。纯内存计算,零 IO。 */ export declare function getProviderSpeedSample(providerId: string): SpeedSample | null; export declare function snapshotStats(): Record; /** * 测试 / 重置用——清空所有内存状态。 */ export declare function resetTracker(): void; export {};