You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Feedback] Noticed during testing that Zcode doesn't seem to trigger compression very often. | [反馈]在测试途中发现Zcode好像不怎么会触发压缩 #4344
changed the title [-][反馈]在测试途中发现Zcode好像不怎么会触发压缩[/-][+][Feedback] Noticed during testing that Zcode doesn't seem to trigger compression very often. | [反馈]在测试途中发现Zcode好像不怎么会触发压缩[/+]on Oct 22, 2026
四、一个可能的改进(供项目方参考,非当前必做)
这类情况目前是“静默”的——模型不理提醒,用户只能翻日志才发现。可以考虑让 bili 在面板上加个提示:当“模型连续多次收到压缩提醒却一次都没执行”时,明确提示“你的模型可能不支持/未响应压缩工具”,这样小白用户不用翻日志就能定位。这是我建议的一个后续改进点,是否立项由项目方定;如果你也需要,我可以单独开一个跟进项。
四、一个可能的改进(供项目方参考,非当前必做) 这类情况目前是“静默”的——模型不理提醒,用户只能翻日志才发现。可以考虑让 bili 在面板上加个提示:当“模型连续多次收到压缩提醒却一次都没执行”时,明确提示“你的模型可能不支持/未响应压缩工具”,这样小白用户不用翻日志就能定位。这是我建议的一个后续改进点,是否立项由项目方定;如果你也需要,我可以单独开一个跟进项。
Activity
[-][反馈]在测试途中发现Zcode好像不怎么会触发压缩[/-][+][Feedback] Noticed during testing that Zcode doesn't seem to trigger compression very often. | [反馈]在测试途中发现Zcode好像不怎么会触发压缩[/+]ranxianglei commentedon Oct 22, 2026
(ai: vllm-qwen/qwen3.8-27b)
你好!先说结论:查重:不重复(仓库里没有其它 issue 反馈「ZCode 少触发压缩」这件事,现有的 zcode 相关 issue 都是看门狗恢复/自隧道/签名/启动崩溃那一类,跟这个不是一个问题)。
标签:bug / zcode / scope/wiring / p2 —— 这是个功能缺陷报告,只涉及 zcode 车道,问题落在宿主接线层(会话标识/工具面/nudge),目前判断是"能用但明显有问题"级别(p2);等信息齐了我可能会调整严重度。
下面用大白话解释一下,然后列几个我需要你提供的信息来定位。
一、bili 是怎么"触发压缩"的(关键概念)
bili 的压缩不是"到时间自动压",而是"推着模型自己去决定压":
compress工具把前面旧的内容折叠掉";compress这个工具可用时,才会真正去压一次。所以"触发得勤不勤"取决于两件事:(a) 你的对话是不是真的在同一个压缩会话里一直往下累积;(b) 模型有没有响应提醒并调用 compress 工具。这两件任何一件出问题,都会表现为"很少/基本不触发"。
二、为什么 ZCode 看起来比 DSH / Opencode 少(几个候选原因,需确认)
你拿 DSH 和 Opencode 做对照,但它们仨的机制其实不太一样:
x-bili-plugin:zcode标记,没有带稳定的会话标识头。代码里有一个已知且被明确记录过的故障类别正好对得上:当一个客户端每轮都重新发整段历史、又不带稳定会话标识时,bili 会把每一轮都当成"新会话",于是"压缩状态永远累积不起来 → 提醒看到的 token 数一直是 0 → 哪怕上下文已经快满了也不压"。这和你说的"很少触发、有时基本不触发"高度吻合。 另一个可能是 ZCode 用的模型对这种提醒没那么敏感,或者 MCP 里的 compress 工具名带了前缀、模型不太好找。但我现在还不能确定到底是你这台上是哪一种,所以需要下面的信息来定位(这也是排查的第一步,不用你先动手改任何东西)。
三、请提供这几项(第 1 项最关键)
bili --version把结果贴给我(不同版本这块逻辑差异挺大,必须先定版本再看)。bili zcode那套,推荐)/② 证书代理(GUI 里 Settings→Network 装证书那种)/③ URL 前缀(地址加/bili/)。~/.local/state/billion-context/下),把含nudge、processTurn、surface=off、[acp-usage]的那几行贴给我;补充一句:你贴的那张截图我这边没能正常打开,麻烦把面板上的关键数字(上下文占用%、块数)直接打字告诉我,或方便的话重发一张。
拿到这些信息我就能判断到底是"会话没累积起来"还是"模型没响应提醒",然后再决定怎么修。到时候我会继续在这个帖子里更新进展。
noname-nikke commentedon Oct 22, 2026
ranxianglei commentedon Oct 22, 2026
(ai: vllm-qwen/qwen3.8-27b)
面板我打开看了,数字都在,谢谢!这下基本能定位了——不是坏了,是你的用法刚好落在 bili「触发压缩」的盲区里。说下为什么,以及怎么让它压起来。
一、你这张面板说明的事
二、根本原因
bili 决定“要不要让模型去压”主要看两点:
你这两条现在都不满足:
结果就是:会话热起来之后,bili 基本不再主动让模型去压 → 全程没有折叠。
对比一下就清楚:DSH / Opencode 的历史是一路往上涨的(它们不自己截断),所以反复跨过那条线、看着一直在压;DSH 还自带自己的压缩器。ZCode 把自己摁在 ~200K,正好落进上面的盲区。
再叠一层:你这个会话的上游是 infistar.cc(一个中转),bili 是按中转报出来的 750K 当窗口算的,可你实际每次只发 ~200K。“窗口被算大了 + 内容又不长”两头夹着,占比就一直上不去。
三、怎么让它压起来(大概率改个配置就行,不用动代码)
核心思路:别让 bili 用中转报的 750K,改成按你真实的用量来算窗口。把 bili 用的“上下文窗口”调到你实际的量级(你最大看到 ~220K),设成 ~250K–256K 左右,这样 ~200K 就变成占 ~80%,会直接进“高压模式”,bili 就会主动压了。
对应的配置项是
compress.modelContextLimit(或者按模型写models.<模型名>.context)。为了把数值和放在哪一层定准(你是原生 MCP 接入,放错位置不生效),麻烦回我两个问题:
回完我给你一段可以直接粘进去的配置。
四、还有次要一层,想顺手确认一下
就算 bili 提醒了模型,也得模型真的去调用那个 compress 工具才会真正压。你这 46 次一次都没成,除了上面的“触发盲区”,也可能叠加了“模型没响应提醒”。
面板上有 「查看该会话的日志」 入口,麻烦点开后,把里面含
nudge的那几行贴给我(重点看有没有类似growth … < floor …或max compressible … < threshold …的字样)。有这几行我就能 100% 分清到底是“压根没触发”还是“触发了但模型没动手”。标签维持 bug / zcode / scope/wiring / p2 不变(能用、只是该压不压,属于明显问题但不至于不能用)。
noname-nikke commentedon Oct 22, 2026
日志内容太多,我无法准确的找到该日志
billion-context-full-log.txt
billion-context-report-session_b6e8398e08b85861812aaed0b77a21f8.md
ranxianglei commentedon Oct 22, 2026
(ai: vllm-qwen/qwen3.8-27b)
日志和报告我都逐行对了(46 次请求全部对上)。先纠正我上一条回复里的一个判断:我上次归因到“触发盲区”,其实不完全对——真正的卡点在别处。用日志说话:
一、日志证明的事实
blocked: T1 (cadence)、ready: T1 1xx K——含义是“可压的内容有一大堆(十几万 token),只是按节奏等上下文再多涨一点再提醒”。所以触发机制本身是正常的。所以结论修正为:不是“没触发”,而是“触发了,但你这个模型不响应”。这也正好解释为什么 DSH / Opencode 看着一直在压——它们的宿主要么自己主动驱动压缩、要么自带压缩器,而不是单纯指望模型自觉。
二、为什么模型不响应(两种可能,需要你确认一下就能定死)
mcp__bili__compress(带 bili 前缀)的名字暴露给模型。如果 ZCode 这边没把它正确挂进模型的可用工具列表,模型想压也无从下手。怎么区分(你只需看一眼):在 ZCode 里看一下当前会话模型可用工具列表中,有没有一个叫
compress或mcp__bili__compress(或带 bili 字样)的工具?三、顺带收回我上条的一个建议:我之前说“把窗口调小就能让它压”——在你这儿没用。因为真正的卡点是“模型不调工具”,不是“触发阈值没到”;就算把窗口调小让 bili 每轮都提醒,模型照样不理,还是压不了。所以先不用动窗口配置。
标签维持 bug / zcode / scope/wiring / p2 不变(等你确认完可能是模型行为的话,我再调整)。麻烦你先回我第二点那个“工具列表里有没有 compress”,我就能定死是接线问题还是模型问题,再给你对应的准确修法。
noname-nikke commentedon Oct 23, 2026
zcode没有地方可以查看当前会话的模型可用工具列表,但是我mcp是加载了bili的,安装也是默认的,url地址http://127.0.0.1:18788/bili/https://infistar.cc/v1是这个
ranxianglei commentedon Oct 23, 2026
(ai: vllm-qwen/qwen3.8-27b)
谢谢,两张截图很有用——我据此把整条链路都核对了,现在给你一个确定的结论。
一、你的安装完全正常(已确认,接线没问题)
从截图看:bili 的 MCP 服务是「stdio」类型、状态已连接(绿点)+ 开启。我又翻了 bili 代码确认:这个 MCP 服务会把 bili 的压缩工具
compress原样提供给模型;而你日志里出现的[plugin]标记也证明启动时工具清单校验是通过的。所以——compress 工具确实送到了你模型手上,之前怀疑的“工具没挂上”可以彻底排除。二、真正的结论:工具送到了、也提醒了,但你的模型就是没去调用它
把日志和代码合起来看,事实链很清晰:
一句话:不是没触发、也不是没给工具,而是你这个模型(deepseek-v4.1-flash,经 infistar.cc 中转)没有理会压缩提醒。 不同模型对这种“管理自己上下文”的指令执行差别很大——DSH / Opencode 看着一直在压,是因为它们的宿主要么主动驱动压缩、要么自带压缩器,不单纯指望模型自觉;ZCode 走 MCP 这条路则完全依赖模型自愿响应。
三、你能怎么做(实际有效的办法)
四、一个可能的改进(供项目方参考,非当前必做)
这类情况目前是“静默”的——模型不理提醒,用户只能翻日志才发现。可以考虑让 bili 在面板上加个提示:当“模型连续多次收到压缩提醒却一次都没执行”时,明确提示“你的模型可能不支持/未响应压缩工具”,这样小白用户不用翻日志就能定位。这是我建议的一个后续改进点,是否立项由项目方定;如果你也需要,我可以单独开一个跟进项。
标签我把领域从
scope/wiring(接线)改成了scope/other——因为接线已确认是好的,根因在模型行为,不属于接线问题;bug / zcode / p2维持不变。noname-nikke commentedon Oct 23, 2026
但是同样的配置、同样的模型,在 Opencode 和 DSH 当中是可以实现由bili压缩的
ranxianglei commentedon Oct 23, 2026
(ai: vllm-qwen/qwen3.8-27b)
谢谢,这条信息很关键——它推翻了我上一条的一个说法。你说得对:同一个模型在 Opencode / DSH 能压、在 ZCode 不压,就说明不是这个模型天生不会压。我重新翻了三个客户端各自的压缩接入代码,差异确实存在,而且能说清楚:
一、三个客户端“怎么把压缩交给模型”根本不一样(已核对代码)
compactsClientSide)。它的压缩是 DSH 自己做的,压根不依赖模型去调工具。所以无论什么模型都能压——这也是它最稳的原因。compress注册成原生工具(native tool),直接挂进 opencode 自己的 agent 循环里,并且带一个稳定的会话 id。模型在这套深度集成的环境里调工具非常顺。所以你这个模型在 Opencode 里能压。compress只是作为一个 MCP 工具暴露给模型;既没有像 Opencode 那样的原生工具集成和稳定会话 id,也没有像 DSH 那样的自带压缩器。它完全依赖模型“自愿”去调那个 MCP compress 工具。deepseek-v4.1-flash(经中转)在这种“松耦合 MCP 工具 + 泛用系统提示”的组合下,就是不太会主动去调它。二、所以准确的结论
不是你的错,也不是配置写错了,而是:ZCode 这条车道的压缩接入比 Opencode / DSH 更“松”,恰好你这个模型只在更紧的集成下才肯动手。 我上一条把“换模型”说成唯一解法,这个说法收回——换模型是一个有效办法,但根子在于 zcode 车道的接入方式较松。
三、你能怎么做
四、跟进
标签维持 bug / zcode / p2,领域保持
scope/other(本质是“客户端接入方式 + 模型交互”的差异,不是某行代码写错)。要不要我把「ZCode 车道压缩可靠性弱于 Opencode/DSH」单独立成一个改进项来跟踪?你和项目方点头我就开;不点头就留在这个反馈帖里作结论。noname-nikke commentedon Oct 23, 2026
我觉得可以
ranxianglei commentedon Oct 23, 2026
ework不要胡说 直觉之zcode看不到压缩工具或者看不到注入了 检查并复现这一个 http 代理模式
ranxianglei commentedon Oct 23, 2026
(ai: vllm-qwen/qwen3.8-27b)
按你说的复现了 http 代理模式。你说得对,我收回上一条“模型不听话”的判断——根因是接线:zcode 默认(native/MCP)安装下,模型根本收不到 compress 工具,却仍被注入“去调用 compress”的提示。所以它压不了。
一、复现结果(真实 bili,等价你跑的 v0.1.204)
用真实代理 + 假上游抓出站请求,两组对比:
compress, decompress, search_context, acp_status, acp_cache, acp_read_original_image(6 个)[](0 个工具)代码根因:
src/server/prepare-openai.ts:89injectTools = shouldInject && !pluginMode—— 只要判成 plugin 模式就无条件不在线上注入工具;而 nudge / 系统提示走的是另一条判定(lane-decisions.compressSurfaceOn,对 zcode=true),照样注入。两条判定脱节 → 提示让模型调 compress,线上却没有 compress。二、确认用户那次就是 B 模式(不是猜)
他日志里该会话的窗口行是
[window] model=deepseek-v4.1-flash agent=zcode …(v0.1.204,会话起始时刻)——agent=zcode只有在请求带x-bili-plugin: zcode头时才会填上;且每个 turn 的用量行都带[plugin]前缀(只由 src/plugin.ts 的插件执行路径打,非插件路径 relay.ts:2027 没有)。两条独立证据 → 确定是 plugin 模式 = tools=[]。所以那次模型确实没拿到 compress 工具。三、为什么同一模型 DSH/Opencode 能压、ZCode 不能
mcp__bili__compress。这条最弱:要么 ZCode 没把 MCP 工具挂进模型 function list,要么模型没把提示里的 “compress” 对应到 “mcp__bili__compress”。结果就是“提示让压、手里没工具”。四、修复方向(动的是压缩管线 / 线上 wire 形状,属人审范围,我不擅自改,等你拍板)
我的建议:方案1(+可选方案2) —— 让 zcode 像 opencode/dsh 一样“模型手里一定有能用的 compress”,别把宝押在 MCP 一定送达。
影响面 / 回归(按选项)
标签:根因明确后我把 scope 从 scope/other 改回 scope/wiring(工具注入与提示脱节,属接线),bug/p2/zcode 不变。若你觉得“zcode 默认安装压缩完全失效”够 p1,说一声我把严重度提上去。
你定个方向(1/2/3 或组合),我就开修 + 补测试 + 提 PR。
noname-nikke commentedon Oct 23, 2026
大佬觉得应该怎么修复呢?
ranxianglei commentedon Oct 23, 2026
(ai: vllm-qwen/qwen3.8-27b)
简单说,修法我已经想清楚了,给你我的判断(最终由维护者拍板,因为这动的是压缩管线):
问题一句话:zcode 默认装法下,bili 把发给模型的
compress工具弄丢了(tools 变成空的),却还留着“去调用 compress”的提示——提示在、工具没了,模型手里没工具,自然压不了。我推荐的修法(方案1):让 bili 在这种情况下别把工具丢光——只要模型那边没声明可用的 compress(既没有裸
compress、也没有mcp__bili__compress),就把裸compress重新注回请求里。这样:为什么不选别的:只是把提示里的名字改成
mcp__bili__compress(方案2)属于治标——它的前提是 ZCode 真的把 MCP 工具给了模型,而这恰恰是当前没发生的。所以要以方案1为主,最多配方案2做补强。现状:这是管线级改动,按项目规矩要维护者确认方向后我才动手(实现 + 双向测试 + 提 PR)。你这条反馈其实已经把根因钉死了——你那份日志正好证明那次就是“工具被丢”的模式,很关键。等维护者定了我马上开修。
眼下想先能用上的话:最实际的临时办法是改用 Opencode / DSH 跑(它们不踩这个坑),或者换一个对 MCP 工具响应更积极的模型试试。
ranxianglei commentedon Oct 23, 2026
@noname-nikke 争取今天发布 修复中 ework说的不对 我需要诊断根本原因
noname-nikke commentedon Oct 23, 2026
ranxianglei commentedon Oct 23, 2026
(ai: vllm-qwen/qwen3.8-27b)
收到。我把已核实的硬事实和还悬着的关键问题分开列给你,方便你直接定位(不重复我之前的结论):
已核实(可当事实用)
agent=字段就是pluginAgentHeader(req.headers)(src/server/handle.ts:697)。所以agent=zcode确定代表该请求带了x-bili-plugin: zcode头 → bili 判成 plugin 模式。x-bili-plugin:zcode时出站tools=[];不带时tools=[compress, decompress, search_context, acp_status, acp_cache, acp_read_original_image]。即 plugin 模式下线上工具被抑制(src/server/prepare-openai.ts:89injectTools = shouldInject && !pluginMode)。compress(kernel 提示词通篇是 “callcompress”);而 zcode 在 plugin 模式下线上没有裸 compress,唯一可能的入口是 MCP 的mcp__bili__compress—— 存在名字错位。还悬着的关键问题(决定根因走向)
ZCode 到底有没有把
mcp__bili__compress挂进模型的 function list?我能马上跑的定向实验(你点哪个就跑哪个)
你今天发版、我配合诊断,方向你来定。
ranxianglei commentedon Oct 23, 2026
(ai: zhipuai-lb/glm-5.3)
修复 PR:#4372 #4344)
按 issue 里 owner 的直觉走了「检查注入 + 工具可见性」这条线,结论和复现一致,是三个缺口叠加:
mcp__bili__compress视而不见(lane-decisions 观察层只匹配字面compress);compress,但 zcode 的 MCP 桥给的是mcp__bili__compress,弱模型(deepseek-v4.1-flash)对不上号就一直不调。修复方向采纳了 thread 里 方案2 的思路(提示侧名字映射),不采用方案1(注入裸名 compress):插件模式响应是原样透传的(relay.ts 里注释明确写了 model-emitted compress call must reach the plugin untouched),代理模式的服务端拦截(loop/core.ts isProxyToolFor)在插件会话上不运行 —— 注入裸名后模型一调就会在 zcode 里撞未知工具,等于换个方式坏。
PR 关键点:
mcp__bili__compress算声明了 compress,任何 lane 通用);surface=off(no-tools)可确诊,不再宣传一个模型调不到的工具;一个诚实的保留:报告日志没记工具名,报告者当时是「桥断」还是「名字对不上」不能 100% 断定(degraded 行指向桥断概率大)。修复对两种形态都正确,发布后复测看日志(
surface=off(no-tools)vs 带映射注记的提示面)即可确诊。另:桥断的根因(native routing inactive / cert-MITM)是环境侧,bili 只能做到不撒谎,恢复压缩需要把桥修好。ranxianglei commentedon Oct 23, 2026
(ai: vllm-qwen/qwen3.8-27b)
先认账:我上一轮提的「往 plugin 模式线上重新注入裸
compress」(方案1)是错的,owner 说得对。plugin 模式下宿主自己拥有工具面、响应是逐字透传的(relay.ts:1467/plugin.ts:2198),proxy-loop 的服务端拦截对 plugin 会话不生效——注入一个裸compress,模型真去调它,在 zcode 侧就是个没人认领的未知工具。正确方向是提示侧的名字映射,也就是 #4372 走的路线。根因我独立从当前 master 逐环核过一遍(本地 checkout,v0.1.203),确认是三层叠加的接线缺陷,不是单点:
src/host-profiles.ts:70的 profile 表只有 dsh/pi/omp/opencode,没有 zcode → zcode 落到 ANONYMOUS 默认(toolsHostScopedByDefault:false,认为工具天然可见);src/server/lane-decisions.ts:245的可达性判定因上一条而无条件为真 → bili 永远向模型广播"调 compress"(系统提示 + nudge),不管模型手里到底有没有这个工具;session-self-heal.ts:246)只认裸名compress,不认mcp__bili__compress,而 zcode 经 MCP 桥暴露的恰恰是后者。净效果:模型被要求调
compress,但它工具表里要么是mcp__bili__compress(弱模型如 deepseek-v4.1-flash 对不上号),要么什么都没有(MCP 桥 degraded/idle 时是空工具列表,mcp-entry.ts:173)。于是 nudge 一直挂、折叠恒为 0。DSH 正常(自带客户端压缩器)、Opencode 正常(把 compress 注册成可见原生工具)——所以只有 zcode 中招。执行链路本身没问题:e2e-plugin-grow-compress.test.ts全程走mcp__bili__compress→/__bili/plugin/tool能折叠成功。标签: bug/zcode/scope/wiring/p2 —— 确认 scope/wiring(lane-decisions 接线缺陷)。「默认安装核心能力整体失效」其实够得着 p1 边缘,但代理仍可用、有绕行、仅 zcode 车道,维持 p2;owner 若要按严重度上调可自改。
PR #4372 独立复审(八问):
compress,但模型手里没有这个工具。mcp__bili__*)。mcp__bili__compress、提示面追加静态映射注记("调mcp__bili__compress不是compress")。并正确否决了方案1(理由见上)。surface=off(no-tools)日志(更诚实)。测试:新增
tests/issue4344-mcp-dialect.test.ts(双向断言齐全:该触发才触发、不该触发不触发 + 真实 startServer 链:带桥/无桥/pi 对照),矩阵 86→91 行。CI 当前 gate 全绿/排队中、e2e 车道跳过(env 门控,正常),未见红。一处诚实残留(PR 自己也标了):报告者日志没记工具名,无法 100% 断定他当时是"桥断了"还是"名字对不上"(degraded 日志指向桥断更可能)。修复对两种形态都正确——发布后看日志即可确诊:出现
surface=off(no-tools)= 桥没起来(要修桥);提示面带映射注记 = 桥通了、名字已对齐(应当开始折叠)。相邻遗留(超本 issue 范围,建议后续单独开):claude-code/kimi 同样缺 profile 条目,存在同类"无条件放行"潜在缺陷;#4372 只给了它们映射注记、没加 profile。已有 session-self-heal 兜底,不急。
结论:根因成立、修法对症、无实质回归、测试有牙 → 可合入(待 CI 全绿)。今天发布可行。
fix(zcode): observe MCP-dialect compress reachability, map tool names…
fix(ranxianglei#2155): keep the nudge/self-heal probe armed on header…
fix(test): pass mcpDialectNote positionally so ranxianglei#4305's bou…