Skip to content

[Bug] Tier 2/3 nudge 建议单个全量压缩范围,大会话必超 summary 上限导致卡死 #256

Description

@miaomiaozii

问题描述

Tier 2/3 触发时,nudge 文本硬编码建议单个压缩范围(dist/index.jsCompress range: content: [{ startId: "b{first}", endId: "b{last}", summary: "..." }]),把所有目标块塞进一次 compress 调用。

当 T1 块很多时(大项目/长会话),单次 summary 必然超过 maxSummaryLengthHard(默认 20000 字符),模型照做就会反复失败/卡死。

复现数据(真实会话)

  • 会话 ses_04cd74960ffeqRBoCWAAkVbLwy.json:74 个活跃 T1 块,摘要共 97200 字符
  • 一次全量压缩:97200 字符输入,按 TIER2_DISTILL_RULES(每块 50-150 token)估算输出约 32400 字符 @3x 压缩 → 超过 20000 硬上限,compress 必然报 "Summary too long"

分批方案验证(已测试)

批次大小 批数 每批输入字符 输出@3x 状态
8 块 10 ~10512 ~3500 OK
10 块 8 ~12150 ~4050 OK
15 块 5 ~19440 ~6480 OK
74 块(现状) 1 97200 32400 超限失败

所有批次(8-15 块/批)均满足 minCompressRange(≥5000 字符)和 maxSummaryLengthHard(≤20000 字符)约束。

建议修复

  1. nudge 生成时按主题自动切片(相邻块 topic 相同合并),批次大小 8-15 块
  2. 输出多个 content 条目(schema 已支持数组):content: [{startId, endId, topic, summary}, ...]
  3. 尾批不足 8 块时并入前一批(避免低于 minCompressRange 报 "Range too small")
  4. 可选:content 数组条目数建议上限(避免一次调用几十条)

附:本地临时 patch(供参考)

我已在本机 dist/index.js 打了临时补丁实现上述分批逻辑(源码见 https://github.com/ranxianglei/opencode-acp 对应位置),但插件更新会被覆盖,希望官方在 nudge 生成逻辑中支持分批。

另外建议:Tier nudge 文本目前是硬编码的,不在 PROMPT_DEFINITIONS(customPrompts)可编辑范围内,建议把 tier trigger 提示词也纳入 customPrompts 机制,方便用户自定义。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions