Repository navigation
Conversation
API tools 只剩 agent_finalize、tool_search、tools_execute;主人专属和随发言者变化的工具目录、规则、契约和预算挪到历史之后,主人和群友交替说话时前缀逐字相同。tool_search 支持 names 和 query,tools_load 保留为别名;按需工具参数合法就直接执行,不必先加载。
媒体索引按内存短期上下文排除窗口内消息,把窗口里刚发的图也列进来,每来一张图就变;条目也没在身份隐私代理里登记,一部分真实消息 ID 发给了模型。现在按实际渲染的历史窗口过滤、逐条登记别名,并移到历史之前跟着前缀缓存走。跨群记忆常驻上限 4 改 6,并提示模型更多的用 chat_history 跨群搜。
生产上 6.6% 的轮次因正文带真实换行被打回重写,约九成纯文本回答被要求用 agent_finalize 原样重发,每次多一轮约 4 万 token 且不命中缓存。换行在发送层本就等同 [diana-line],纯文本也只在空文本或整段括号动作描述时才需要补试。
回放里「纯文本即结束、只有静默才调收尾工具」让静默翻倍;合成一个 send、只调 send 才收尾、和其他工具同步时作中途发言后,静默和工具调用都不变差。silent/silent_reason 字段去掉,say 改成 Config.Interim 回调。
回复形式规则、提及与引用说明、@ 规则、能力权限、记忆时间规则、工具执行状态说明、Skills 目录和联网调研要求在同群相邻两轮 100% 相同却每轮重算。挪到历史前后 DeepSeek 实测命中 87.0% 升到 89.4%,gpt-6.1-sol 回放行为不变。
经 sub2api 的 gpt 只在 instructions+工具末尾和上一次完整请求末尾复用缓存,逐轮重新组装的请求只能命中开头约 1.8 万 token。续接后同群连续 8 轮实测 gpt-6.1-sol 47.4% 升到 90.9%,deepseek-flash 72.2% 升到 91.2%;按配置档开关,默认关。
SuInk
force-pushed
the
claude/presentation-rules-head
branch
3 times, most recently
from
October 27, 2026 15:32
b6ee0cc to
10615ca
Compare
Owner
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
新增配置档开关「只追加上下文」(
append_only_context,默认关)。打开后,主回复不再每轮重新组装请求,而是接在上一轮实际发给模型的请求后面继续发,只追加这期间的新群消息、尾部里变了的行和当前消息。同群连续 8 轮实测,gpt-6.1-sol 命中率从 47.4% 升到 90.9%,deepseek-flash 从 72.2% 升到 91.2%;用 gpt-6.1-sol 回放 15 个轮次,没有出现回错消息。叠在 #1228(尾部逐字不变的说明挪到历史之前)上,那边合并后改基到 main。
Why
gpt、swe 主回复的缓存命中率只有 31%~55%,DeepSeek 是 85%。查下来不是切换账号造成的:同一账号、5 分钟内的连续请求,命中也只有约 21%。原因在上游的缓存方式。
经 sub2api 转发的 gpt(上游是 ChatGPT Codex)只在两个位置复用缓存:instructions 加工具定义的末尾,以及上一次完整请求的末尾。用一条 4.7 万 token 的生产请求实测:
现在每轮都会重新组装请求:尾部每轮都在变,上一轮的当前消息也被改写成历史行,所以新请求从来不是上一条的纯追加。生产上同一会话的连续请求,每条都恰好只命中 18432。DeepSeek 能复用到任意 128 token 的前缀,但历史窗口一往前滑,命中照样会断。
pi-agent 和 DeepSeek Harness 都是只追加的单循环。DSH 遇到系统提示变化时也是把新版追加到已缓存的历史后面,而不是重写开头。
改了什么
model/agent/continuation.go和runner.go:Request.Continuation带上一轮的前缀、本轮要追加的消息和校验键。校验键是系统提示、历史前契约段和工具定义的指纹;对得上就在前缀后接着发,Runner 自己的逐轮消息照旧插在当前消息之前,对不上就按Messages完整组装。Response.Transcript是本轮最后一次实际发出的请求(经过hooks.prepare,包含每步临时插入的工具执行状态),接上模型的回复,每个工具调用都配一条结果,作为下一轮的前缀。model/assistant/append_context.go和runtime.go:每个(配置档, 会话)在内存里存一份记录。以缓存断点为界:withToolResultReminder:往回找时遇到 user 消息就停。否则续接时会越过当前消息,找到上一轮 send 的结果,误加「刚执行过工具」的提醒。docs/group-prompt-cache.md新增「只追加上下文」一节。影响
验证
缓存实测:10-27 生产同群连续 8 轮,现布局和只追加各加随机前缀冷启动,不计第一轮:
行为回放(gpt-6.1-sol):3 个群各取第 3~7 轮共 15 个轮次,现布局和只追加各生成一次真实回复,逐条对照当前消息。15 轮都回的是当前消息,动作一致(要表情包的 3 轮都调了 sticker,查资料的那轮两边都去搜索),没有重复上一轮的话。
单元测试:
TestRunnerContinuationIsPureAppend:第二轮请求逐条以第一轮记录开头。TestRunnerContinuationFallsBackOnKeyMismatch:校验键对不上时退回完整组装。TestAppendContextAppendsOnlyNewHistoryAndChangedTail、TestAppendContextRestartsWhenHeadChangesOrGrowsTooLong。TestReplyTurnsContinueAppendOnly:整条回复链路连发两轮,第二次请求以第一次请求加 send 开头,当前消息在最后。前端:
vue-tsc --noEmit、npm test(282 项)通过;demo 模式下确认开关显示在「上下文 → 每轮带什么」,能正常打开。gofmt -l、git diff --check干净;./model/agent测试通过。