模型:qwen3.8-27b (vllm)
问题
reserveOutputHeadroom 按模型注册表登记的最大输出能力(ctx.model.maxTokens)全额预留输出预算,而不是按请求实际配置/使用的 max_tokens。当 maxTokens 占窗口比例大时,有效输入预算被大幅砍掉,kernel 的 75% 强制压缩阈值相对完整窗口在很低的位置就触发。
复现 / 证据
会话 01a02d90-17b6-7ca7-b22a-a5170c2f9098,模型 qwen3.8-27b(contextWindow=262144,models.json maxTokens=131072):
[overflow-selfheal] event=output-headroom before=262144 after=131072 maxOutput=131072
[turn] tokens=98900 pct=34.42 limit=131072 nudge=active nudgeReason=OVER-LIMIT T1: max effective pending 65437, usage 75%
[nudge-injected] voice=emergency ... text=⚠️ Context limit reached — compress now
- 有效 limit = 262144 − 131072 = 131072(砍半)
- kernel usage = 98900/131072 = 75.45% ≥ 0.75(
maxContextLimitPct)→ 强制 nudge
- 用户看到的 pct = 90222/262144 = 34.4%(相对完整窗口)—— 两个口径不同,所以看起来"才 30% 就强制压缩"
代码位置
影响
- qwen3.8-27b:256K 窗口只剩 128K 输入预算,75% 阈值在完整窗口 ~34% 处触发
- 同窗口 int4 版(maxTokens=32K)只砍 12.5% —— 行为随模型配置差异巨大
- 实际回复很少用到 128K 输出,全额预留偏保守
可能的方向
- 预留量取
min(model.maxTokens, 请求实际配置的 max_tokens),或设一个上限(如窗口的 25%)
maxContextLimitPct 相对完整窗口计算,而不是砍过后的 limit
- 至少在 nudge 文案里说明有效 limit 已被输出预留砍过,避免误导模型/用户
问题
reserveOutputHeadroom按模型注册表登记的最大输出能力(ctx.model.maxTokens)全额预留输出预算,而不是按请求实际配置/使用的 max_tokens。当 maxTokens 占窗口比例大时,有效输入预算被大幅砍掉,kernel 的 75% 强制压缩阈值相对完整窗口在很低的位置就触发。复现 / 证据
会话
01a02d90-17b6-7ca7-b22a-a5170c2f9098,模型 qwen3.8-27b(contextWindow=262144,models.json maxTokens=131072):maxContextLimitPct)→ 强制 nudge代码位置
src/overflow-selfheal.ts:reserveOutputHeadroom(window, maxOutput)(0<maxOutput<window 时返回 window−maxOutput)、shouldReserveOutputHeadroom(api)(跳过 anthropic-messages)src/index.ts:165-171:maxOutput = ctx.model.maxTokens(模型注册表里的最大输出能力,非实际配置值)影响
可能的方向
min(model.maxTokens, 请求实际配置的 max_tokens),或设一个上限(如窗口的 25%)maxContextLimitPct相对完整窗口计算,而不是砍过后的 limit