fix(overflow): cap output-headroom reservation at a fraction of the window (closes #207) - #301
Conversation
📦 Built Extension ArtifactBranch: Option A — Install from npm PR tag (recommended)pi install npm:billion-context-pi@pr-301Each push to this PR publishes a new version under the Option B — Download artifact
tar xzf billion-context-pi-pr301.tgz
pi install ./packageThis comment is automatically updated on each push. |
[bot] 🏷 收到 PR,开始独立验证:已拉取分支 |
[bot] 🏷 独立验证完成,LGTM ✅(PR b1b1273,单 commit,基于 master cbb753a) 查重无重复。#207 是原始 bug 报告(open),本 PR 是其指定修复;open 的 issue/PR 列表中无其他涉及 output headroom 封顶的条目(相关但不同的:#215 overflow arm、#269 nudge 被忽略,均非同一问题)。 Triage 复核(我独立验证的部分)
代码审查
两个非阻塞小点:① 验证结果(PR 分支实测)
结论:可以合并。 |
|
冲突解决一下 |
# Conflicts: # CHANGELOG.md # src/config.ts # src/index.ts
[bot] 🏷 冲突已解决并推送到 PR 分支(merge commit 冲突点(3 个文件)
合并时发现的一个语义问题(已处理):master 的 #267 修复新增了 处理:
验证: PR 现在 |
问题
reserveOutputHeadroom按模型注册表的最大输出能力(ctx.model.maxTokens)全额预留输出预算。maxTokens 占窗口比例大的模型(qwen3.8-27b:262144 窗口 / 131072 maxTokens)输入预算被砍半,kernel 的 75% 强制压缩带在完整窗口 ~37% 处触发,而 host pct 显示 ~34%——两个口径不同,表现为「才 30% 就强制压缩」(#207)。验证结论(triage)
src/index.tscontext transform →reserveOutputHeadroom(config.modelContextLimit, ctx.model.maxTokens)→ kerneldecideNudge(usage = tokenCount / modelContextLimit,maxContextLimitPct=0.75)。qwen3.8-27b 算例:limit=131072 → 98304 tokens 即触发,= 完整窗口的 37.5%,与 issue 日志一致。ctx.model.maxTokens就是 pi 实际使用的值(registry 或 models.json override),两者恒等,取 min 无意义;变更
src/overflow-selfheal.ts:reserveOutputHeadroom(window, maxOutput, capPct = 1)—— reserved = min(maxOutput, capPct × window)。capPct 语义:0=禁用预留、(0,1)=封顶、≥1/non-finite=旧全额行为(向后兼容,原两参调用不变)。新增导出DEFAULT_OUTPUT_HEADROOM_MAX_PCT = 0.25src/config.ts+src/user-config.ts:新配置键outputHeadroomMaxPct(acp.json,number 或 "N%",默认 0.25)src/index.ts:context transform 传入 cap;output-headroom事件日志新增cap字段;[turn]日志新增fullWindow字段(仅当 limit 被预留削减时出现,= 本轮 recenter 后的完整窗口),消除 pct(完整窗口口径)vs limit(预留后口径)混淆效果(qwen3.8-27b)
小预留不受影响(int4 版 32K/256K 保持原样);超出预留的超长回复溢出一次后由既有 overflow self-heal(learned window + armed emergency)下一轮恢复。需要旧行为的用户可设
"outputHeadroomMaxPct": 1。验证
npm run typecheck✓ ·npm test466 pass / 0 fail ✓ ·npm run build✓