-
v1.3.7 — 长尾对冲与裸生成时间 Stable
released this
2026-09-11 03:19:44 +08:00 | 0 commits to main since this release给 chat 链路加了一条默认关闭的长尾对冲(issue #24):一次尝试挂起超过阈值时,并发向另一个等价源再发一次,先回者赢、输家取消。另给
CallStats追加三个字段,其中generation_ms(裸生成时间)对四条链路全部生效,与是否开启对冲无关。关于对冲,请先读这三句
# 承诺 展开 1 默认关闭,开启即用配额换延迟 不配 {SCOPE}__HEDGE__AFTER_S时行为逐字等于 1.3.6(默认关闭回归门: 既有 unit/contracts 全套件一行断言未改)。开启后触发窗口内 in-flight 翻倍——两路各自走完整准入(配额闸/熔断门/pacer),拿不到配额静默放弃、原请求继续等,饱和期不添乱2 输家可能已被上游计费,取消止不住 输家落既有取消路径按 est 保留预扣(闸内保守记账,不是上游真实计费的计量);取消能止住等待,止不住上游已经烧掉的钱。对账靠遥测: 输家 attempt 行 error="hedge_cancelled",与赢家行共享同一logical_call_id可 join3 对冲只对 chat 生效 EmbeddingClient/OcrClient不加对冲参数;它们本版的收益是CallStats.generation_ms计时(见下)触发语义
调用形态 触发判据 流式 已过 hedge_after_s且首 token 未至——慢生成不会被误对冲非流式 已过 hedge_after_s,纯总时长阈值。非流式无中途信号,「挂起 vs 慢生成」物理不可分,只能靠阈值取值控制误对冲(建议取源 p50 的数倍)输家取消不喂熔断/健康分(挂起 ≠ 源死亡);两路都失败才进既有重试循环且只计一次重试预算(对冲是一次尝试的加速形态,不是两次独立尝试;两路皆 429 时按既有规则免预算并退 stall 账,一路 429 一路真失败则计一次不退还)。
CallStats 三新字段(全带默认值,1.3.6 的构造方式不炸)
字段 口径 generation_ms: int = 0裸生成时间: 赢家/成功那次 transport 调用的墙钟,排除 admission 排队、重试退避、对冲触发前等待与清理遥测;与 total_latency_ms的差值即「在等不在生成」的波动开销。结构化重问取最后一轮(覆盖),embedding 为各批 transport 之和(累加),缓存命中恒 0(未产生 transport 调用,0 是实测)hedges: int = 0实际并发发出的对冲路数(触发但准入失败静默不计);未启用对冲恒 0 hedge_won: bool = False赢家是否为对冲路;无对冲恒 False 与
call_deadline_s的关系两者正交、可独立配置: deadline 让长尾更早失败,hedge 让调用更快成功。组合时装配守卫强制
hedge_after_s < call_deadline_s(违反即ValueError);hedge_after_s ≥ min(源 timeout_s)同样装配期报错(对冲永不可能触发);hedge_after_s ≥ min(已设 ttft_timeout_s)与单源 scope 设阈值降为装配期 warning(流式档已被看门狗先行切断 / 运行期自然静默)。per-callchat(call_deadline_s=X)使 X < 对冲阈值时该次调用对冲不触发,属合法语义不告警。配置面
键 值域 缺省 {SCOPE}__HEDGE__AFTER_S有限正数秒(复用期限同款值域校验) 未设 = 关闭 {SCOPE}__HEDGE__MAX_EXTRAint ∈ [1,3] 1;v1 仅单路对冲生效,>1 接受但装配期 warning(梯次追加为预留) GatewayClient(...)直传两 keyword-only 参数(hedge_after_s/hedge_max_extra)走同一份装配守卫;from_settings/from_env照常透传。embedding/OCR 的 settings 嵌GatewaySettings故守卫照常跑,但对冲键对这两条链路不生效。Downloads