2026 2026年10月29日 31 min · 9.0k chars by yxc023
GitHub 调研周报 2026-10-29
扫描窗口:2026-09-08T09:23:29Z → 2026-10-29T00:30:00Z(共 50.6 天)| 基准来源:上次报告 2026-10-28
2026-10-29 GitHub 调研周报
扫描窗口:2026-09-08T09:23:29Z → 2026-10-29T00:30:00Z(共 50.6 天)| 基准来源:上次报告 2026-10-28 本期新增内容全部落在 2026-10-28T00:30:00Z 之后的约 24 小时(上次报告生成时间)
本期速览
-
opencode 的 v1 发布线重新抢回「Latest release」,代价是同一个生态里出现了两个 latest 标签。 v1.19.5 于 2026-10-28 06:17 发布,GitHub
releases/latest现在指向它;npm 上opencode-ai的latest= 1.19.5,而@opencode/cli的latest= 2.2.0。v1.19.5 内容极少——只有一条修复:TUI worker 请求失败时返回错误而不是让调用方永久挂起(#54936,作者 @Nowaker,是本期唯一一条社区贡献进 v1 release 的修复)。上一期记录的「双发布线」从权宜之计变成了默认状态,且 v1 线仍在被修复、仍在收到用户报错(#60056、#59975)。 -
opencode 的 process-daemon v0.3.2 发布说明宣称「已发布到 npm」,但 npm 上根本没有这个版本。 GitHub release
process-daemon-v0.3.2(2026-10-28 16:05)正文只有一句:opencode-pty 0.3.2(protocol 7),发布为 npm 包@opencode/pty@0.3.2。实测 npm registry 上@opencode/pty只有0.0.0与0.0.0-stage两个占位版本,8 个平台包(@opencode/pty-darwin-arm64等)同样停在0.0.0;仓库里packages/process-daemon/npm/package.json的 version 字段确实写着0.3.2。与此同时,未合并的 PR #59969 标题正是「fix(process-daemon): publish the GitHub release after npm and release 0.3.3」。发布顺序问题从上一期的app-update.yml缺失延续到了「先发 GitHub release、后发 npm」这一步,而 release notes 已经宣称 npm 上有。 -
opencode 桌面端 2.2.0 出现一批彼此独立但都指向「新特性未收尾」的故障,其中三个可量化。 #60050:
/api/experimental/generate在 12.8 KB prompt 上从 2.1.4 的 18–42 s 变成 200–223 s(两次超过 300 s),同一模型直连 provider 只需 2.5 s——慢在宿主侧,不在模型;#60017:v2 二进制在 x86-64-v1 CPU(Intel Core 2 Quad Q9400)上启动即 SIGILL,因为 Bun 的 baseline 构建仍有 Nehalem 硬底线(SSE4.2 + POPCNT);#60059:桌面每次重连都会让常驻 service 再拉起一整套本地 MCP server 子进程且不回收,两次重启后两代共 3 个 MCP server 同时存活(约 440 MB 进程),子进程被杀后也不重启。此外 #60014(Code Mode 目录漏掉内置工具,tools.shell报 Unknown tool shell)、#60030(后台 shell 变成杀不掉的僵尸条目且跨重启存活)、#60004(plugin.list()无 location 时把$HOME变成永久 location,启动所有全局插件)、#60005(插件 server 重启后卡在 loading,事件流反复请求http://127.0.0.1:0)全部指向同一个来源:v2.2.0 的桌面插件体系(#55246 起)在本期被至少 6 个 issue 指名。 -
opencode 连续第三期出现「费用显示不可信」,本期的新形态是桌面恒显示 0,00 USD。 #60052:桌面右上角一直显示
0,00 USD,真实费用只出现在 Console > Activity 里。上一期已记录同一面板上并存 10⁶ 倍高估、6 倍低估与归零三种故障。成本面板已经连续三期被用户当作不可信数据源。 -
免费模型问题从「提示文案」升级为「模型选择器把免费模型藏起来」,当天即修。 #59971「Desktop no longer supports free models」、#59967「Free usage limit reached」、#59983「Limit reached」继续把界面提示原样当标题提交。根因是桌面模型选择器的
visible()规则:超过 6 个月、或同族有更新的免费模型就被隐藏——Big Pickle(2025-10-17 发布)因此既不出现在选择器里、又在 Settings > Models 中默认关闭。修复 PR #60047 改为「所有 OpenCode 免费模型默认可见,用户手动隐藏的仍隐藏」。免费额度是本期唯一被当天闭环的产品问题。 -
opencode 同期做了两件「让 agent 自己长期跑」的事:定时任务与目标(
/goal)。 #59401 feat(core): scheduled tasks storage and time triggers(experimental)——会话可挂一次性 / 定点 / 每 N 分钟 / cron 的计划(when+ends+ prompt),由 server 端一个定时循环驱动(最长睡 30 s),承诺每次触发恰好送达一次,宕机或停机期间到期的会补发一次并标记为 late;本期只落存储与定时器,agent 与 app 的创建入口在下一个 PR。#59437 feat(core): add /goal with a client-side done check——/goal <objective>让会话持续工作直到评审者认为目标达成,不新增 server 事件,客户端用已同步的数据自行判定「done」,桌面端是一个内建 GUI 插件(走 SDK 的ComposerPill注册表),它是 #58508(session.settled)的替代方案。两者都在把「一轮一问」改造成「一轮接一轮直到某个条件成立」。 -
pi 的 Chord v2 一夜之间推进两个 slice,并被自查发现「实现跑在设计前面」。 commit
6eb99ad(slice 8:registries 与host.root)与14b4c56(slice 6b:Durable 与 jobs 落到 store 上)落地;slice 8 带来defineRegistry/host.serve(R, …)/self.contribute(R, value)/self.registry(R)/host.registry(R, ctx)与RegistryValue.observe、按插件名排序的惰性组合表、helperskeyedEntries/orderedEntries、新的 onError 分类registry_conflict/registry_failed/contribution_failed/contribution_refused、self.writable(initial)、self.retryOn(...sources),以及在对象之外运行代码的host.root(fn, context, { principal? })。同时 commit391e83f明确写着「Chord v2 follows its design where the audit of slices 1-6a found it did not」——一次针对已实现 slice 的设计审计,随后是 30 余个docs(chord)提交逐条修正文档。这是连续第四期同一主题(watch / observer / report → failure → 状态快照 → 设计对齐)。 -
pi 的用户侧本期出现三个可复算的「缓存经济账」问题,全部当天关闭。 #11529:
getCurrentTools()按注册顺序返回工具,被移除再加回的工具会排到 Map 末尾,于是 MCP 重连、tool_search加载、扩展延迟注册都会改变最终顺序——同样的工具集合、不同的字节、在不支持supportsMidConvoToolChanges的 provider(Bedrock)上就是一次完整缓存重写;#11528:Bedrock 上的 Claude 模型没有promptCache标注,cache-warmer 因此从不在 Bedrock 上运行;#11527:bedrock-converse-stream.ts在stream()内部new BedrockRuntimeClient(config),每次调用都新建凭证提供器与 HTTP/2 会话——作者实测每次调用多 2 次 TLS 握手约 0.35 s(0.24 s SSO + 0.11 s TLS),且留下 29 条空闲连接。对应修复:#11514(保持工具顺序)、#11513(union / 多行 codemode 输出类型改为摘要)。 -
hindsight 本期把三处「静默丢弃」改成「显式失败或显式保留」。 #6153 fix(refresh): bound the delta gate per refresh; a late failure keeps its memory——此前刷新闸门一次性为每条记忆发一个 decision 请求,其中任何一个失败就丢弃整批(#6103);#6158 fix(embed): keep the user’s HINDSIGHT_API_DATABASE_URL instead of replacing it with pg0——Windows zh-CN 下内置 pg0 报「stream did not contain valid UTF-8」且用户的库地址被忽略(#6065);#6162 fix(docker,helm): give the API 60s to hand back in-flight tasks on shutdown,配合 #6092 不再等待长时间维护任务——此前 entrypoint 在 SIGTERM 后 30 s 就 SIGKILL 掉 API(#6068)。另一条 #6154 让 trace 与 recall 日志能指名是哪一个 reranker 成员在服务(#6072)。「先回答再校验」正在被逐个替换成「先校验再回答」。
-
ACP 单日合并数从上一期的 69 降到 17,但内容全部落在「生命周期语义」上;社区侧仍是零 issue、零讨论。 #2579 定义 v2 会话生命周期(retention:会话自
session/new存在直到 Agent 丢弃,session/list/session/resume只看得到保留的会话,恢复被丢弃的会话返回-32002;active:自session/new/session/resume成功起、到session/close或连接结束止);#2575 让session/close幂等(重复关闭应成功,客户端应把-32002当作成功);#2586 让session/delete像 archive 一样先关闭活跃会话;#2582 定义「拒绝权限请求」——cancelled现在也覆盖用户关闭弹窗与客户端按策略拒绝(包括没有 reject 选项时),此后 Agent MUST NOT 继续;#2588 定义 stdio 关闭语义(客户端关 stdin 即结束连接)并删掉空的「Streamable HTTP — draft proposal in progress」占位段。规范在补「会话什么时候算活着、什么时候算结束」这个此前含糊的底层。 -
pi-web 连续第 9 天零提交,并且第一次出现了「是不是不维护了」的公开质疑。 最后一次 push 仍是 2026-10-20T16:53:57Z;本期 7 个新 issue、2 个新 PR 全部零回复,其中 #1435 的标题就是两个字:「停更了?」。另有 #1438 提出直接放弃追版本——从用户已装的 pi 里解析 SDK,而不是像现在这样精确 pin(
package.json里 7 个@earendil-works/*包仍精确 pin 在 1.2.0,上游已到 1.4.0)。#1441 则指出前端对所有 >1 MB 图片硬编码缩到最长边 1024px / JPEG 85,导致试卷、文档等文字类图片不可用。
各仓库详情
anomalyco/opencode
开源 coding agent(终端 TUI + 桌面 app + web),TypeScript / Bun 内核,多 provider 架构 | stars: 222756(+378) | open issues: 3919(+59) | 默认分支: dev | 最近 push: 2026-10-29T00:17:32Z | 主页: https://opencode.ai
近 N 周 release 重点:
- v1.19.5(2026-10-28 06:17)— v1 线修复版,现为 GitHub
releases/latest- 失败的 TUI worker 请求现在返回错误,而不是让调用方无限等待(#54936,@Nowaker,社区贡献)
- 完整 release notes: https://github.com/anomalyco/opencode/releases/tag/v1.19.5
- process-daemon-v0.3.2(2026-10-28 16:05)— opencode-pty 0.3.2(protocol 7)
- release notes 声称发布为 npm 包
@opencode/pty@0.3.2,但 npm registry 实测只有0.0.0与0.0.0-stage;8 个平台包同样停在0.0.0 - 未合并的 #59969 计划「先发 npm 再发 GitHub release」并做 0.3.3
- release notes 声称发布为 npm 包
- v2.2.0(2026-10-27 09:04)— 上一期已详述,本期无补充;npm
@opencode/cli的latest仍是 2.2.0 - 版本标签现状:npm
opencode-ai= 1.19.5、npm@opencode/cli= 2.2.0、GitHub Latest release = v1.19.5
其他重要 commits / PRs(按重要性挑选 5–10 条):
- #59401 feat(core): scheduled tasks storage and time triggers (experimental) (@kitlangton, 10-28)——会话级计划(
when: in/at/every/cron + 可选时区;ends: after/at/times)+ prompt;server 一个定时循环最多睡 30 s;每次触发恰好送达一次,宕机期间到期的补发一次并标 late;开关experimental.schedules,关闭时创建直接失败、计时器永不触发 - #59437 feat(core): add /goal with a client-side done check (@neriousy, 10-29)——
/goal <objective>,靠新的 sessionidle插件 hook 判断「真的空闲」,不新增 server 事件(客户端用已同步数据判定 done),不向 compaction 摘要注入 note;桌面端是内建 GUI 插件;是 #58508(session.settled)的替代方案,二者只能合一个 - #59977 refactor(ai): remove fal, Black Forest Labs, Replicate and Stability (@rekram1-node, 10-28)——
packages/ai移除 4 个媒体 provider 及其协议、测试与录制夹具;理由是 core 不接线、models.dev 里也没有,而 FLUX / SD 仍可通过 Vercel AI Gateway、OpenRouter、Cloudflare Workers AI 触达 - #59963 feat(ai): freeform tools (@rekram1-node, 10-28)——OpenAI 风格 custom tool:只有一个必填 string 参数的工具可设
freeform(lark/text/regex语法),模型以原始文本而非 JSON args 写入;编码在 OpenAI Responses / Chat Completions 一侧,因此 Azure、Bedrock Mantle、Vercel、OpenRouter、Cloudflare AI Gateway、DigitalOcean、Venice 及 xAI / Meta / Alibaba 的 Responses 自动获得;Anthropic、Gemini、Bedrock Converse 仍发普通 JSON tool,且没有 fallback - #59934 fix(core): leave headroom when fitting output to the context window (@neriousy, 10-28)——本地 token 计数低于 provider(chat template、tool schema),会把
max_tokens顶到窗口边界导致严格 provider 拒绝(Kimi K2.6 经 OpenRouter 报「requested about 262223」);修复后在拟合输出预算时留 1% 窗口不用(Kimi 约 2.6 k,1M 模型约 10 k) - #60047 fix(app): always list OpenCode free models in the model picker (@Hona, 10-28)——选择器
visible()规则改为默认列出所有免费 OpenCode 模型;Big Pickle(2025-10-17)此前被隐藏且默认关闭 - #60045 fix(core): tell agents they can message running subagents (@rekram1-node, 10-28) / #59496 feat(app): show a background shell’s output from the pill
- #59072 refactor(client): group experimental SDK methods under client.experimental (@rekram1-node, 10-28) / #59991 feat(ai): Responses routes for OpenRouter, DigitalOcean and Venice / #59929 feat(ai): add MiniMax image generation / #59947 请求内联图片字节改为默认
- #59996 feat(theme): lay out migrated V1 themes on opencode2 steps under new designs (@jlongster, 10-28) / #60016 fix(theme): give migrated V1 dialogs an opaque background (@jlongster, 10-29)
- #60024 fix(codemode): run extension before hooks before the host call (@rekram1-node, 10-28) / #59981 fix(codemode): let search be awaited or chained like a Promise / #59948 feat(codemode): let extension globals return Effects
- 未合并但值得记的:#60054 feat(core): subscribe to MCP resources and wake sessions(PatrickLaflamme)、#60025 feat(core): configure session warming per provider and model、#60028 feat(core): let a Code Mode check decide when a schedule fires、#60041/#60039/#60035 feat(mcp): per-server TLS trust for remote MCP servers(karup,同一主题三份)、#60057 fix(core): stop merging credential metadata into model settings
社区讨论 / 行业方向:
- OpenCode 官方 changelog: v2.2.0 条目仍是官方口径的变更清单(桌面插件、experimental image/decision 生成 API、keyed session instructions、per-provider prompt cache TTL,以及三条 breaking change)
- opencode.asia 变更摘要: 第三方整理版,标注「Reviewed as of October 28, 2026」,把 8 月以来 20+ tag 归为「性能与稳定性 / 认证 / 兼容」三类,并强调 v1.18.x 系列大量围绕 provider 认证、Cloudflare AI Gateway、compaction 与重试加固
- AInnect 追踪页: 记录 stars 222,214(+432/日)、90 天 15 个 release、open issues 3,861;同页把 Pi 列为 v1.4.0、Codex 为 rust-v0.166.0-alpha.2
- 讨论区无(该仓库 Discussions 已禁用,API 返回 410)
信号观察:
- 24 小时内 56 个 commit、60 个合并 PR、146 个新 issue、139 个新 PR;合并作者集中在 rekram1-node、jlongster、Hona、karup、arvsrn
- 发布线的混乱从「双轨」变成「双标签」:GitHub Latest release 指向 v1.19.5,npm
@opencode/clilatest 是 2.2.0,npmopencode-ailatest 是 1.19.5——同一仓库的三个「最新版」指向两个不同的产品 - 发布说明与实际产物脱节:process-daemon v0.3.2 的 release notes 宣称 npm 已发布,实际 npm 上不存在该版本;修这个顺序的 PR 仍开着
- v2.2.0 的桌面插件体系是本期故障集中区:至少 6 个 issue(#60059 / #60005 / #60004 / #60023 / #59995 / #60013)指向它,且多数是「进程/端口/资源不回收」而非「功能不对」
- 免费模型的修法是「默认显示 + 用户可隐藏」,而不是「按新鲜度启发式隐藏」——启发式可见性规则在上线半年后被认定为主要故障源
- 成本面板连续第三期不可信(本期形态:桌面恒显示 0,00 USD,真实值只在 Console)
- 两个「让会话长期自己跑」的实验(schedules、/goal)都带明确的 opt-in 开关,且都刻意不新增 server 事件
earendil-works/pi
AI agent 工具箱:统一 LLM API、agent loop、TUI、coding agent CLI,TypeScript monorepo | stars: 118537(+248) | open issues: 350(−30) | 默认分支: main | 最近 push: 2026-10-28T23:16:29Z | 主页: github.com/earendil-works/pi
近 N 周 release 重点:
- 本期(24 小时)无新 release。npm
@earendil-works/pi-coding-agentlatest 仍为 1.4.0(2026-10-21),pi-ai同为 1.4.0——已停滞 8 天 packages/chord/CHANGELOG.md的 [Unreleased] 段继续整包 Breaking Changes,本期又扩:traceIn(options, fn, context)把 context 移到末尾- watch 监听器收一个 change 对象:
WatchChange<T>={ value, ops, retired },NativeWatchChange<T>={ value };帧单独投递时按来源原样送达 - 退休从「结束」降级为「标志」:
WatchEnd去掉retired,Watch.retire(context)被移除;来源用advance({ value, ops, retired: true }, context)报告退休,watch 继续存在,下一次调用带retired: true并与其余待投递帧折叠 - 失败也是一种 watch 调用:
WatchCall<T>={ kind: "value", … }或{ kind: "failed", error };失败后watch.value保持上次值,下一个值以[["r", value]]到达 WatchEnd用kind而非reason:{ kind: "stopped" | "aborted" | "ended" }/{ kind: "listener_error", error }/{ kind: "failed", error };获取 context 被 abort 时结束为aborted而非cancelledSqliteExecutor.runCounted(sql, …params)执行一条语句并 resolve 被影响行数(按 SQLitechanges()计,不含索引写与触发器改动);Durable Object 驱动读SELECT changes()- 新增:
defineRegistry/host.serve/self.contribute/self.registry(R)/host.registry(R, ctx)/RegistryValue.observe/self.writable(initial)/self.retryOn(...sources)/host.root(fn, context, { principal? });新增 onError 分类registry_conflict/registry_failed/contribution_failed/contribution_refused;新增unavailable/undeclared失败原因
其他重要 commits / PRs(按重要性挑选 5–10 条):
6eb99adfeat(chord): Chord v2 slice 8, registries and host.root (10-28)——registry 贡献表按插件名排序、惰性组合(load的 setups 结束后一次,之后在读取或被 follow 时组合);读取方self.registry(R)是声明式依赖:registry 有值即激活,没人服务时以unavailable/undeclared失败14b4c56feat(chord,durable): Chord v2 slice 6b, Durable and jobs on the store (10-28)391e83ffix(chord): Chord v2 follows its design where the audit of slices 1-6a found it did not (10-28)——一次针对已实现 slice 的设计审计,随后 30 余个docs(chord)提交逐条修文档(97553d1设计文本、cc41246审计决策、6975eb1/e613c74路由与重试语义、9ae3d88seal fence、790a98bcompose failure helper 命名等)556860adocs(chord): no client providers for now (10-28)- #11368 feat(ai): refactor provider definitions (@mitsuhiko, 10-28)——用每个内建 provider 一个
defineProvider()文件 + 共享模型族规则(Claude / GPT / DeepSeek / Kimi / Google)+ 来源适配器替换generate-models.ts,models.dev 改走 v2 API;输出与 CLI 参数不变 - #11546 fix(coding-agent): cap pi.exec output at 256 MiB (@christianklotz, 10-28)——
ExecOptions.maxBuffer默认取 256 MiB 与运行时字符串上限的较小者;超限时终止命令并返回truncated: true/killed: true与非零退出码;关闭输出管道以免写入的后代进程让调用一直挂起;丢弃不完整的 UTF-8 尾巴;ExecResult.truncated变成必填字段 - #11544 fix(env): kill the daemon’s commands when it is terminated (@petrroll, 10-28)——
Connection.close()发 SIGTERM 而 daemon 未处理,命令被 reparent 到 init(ppid 1)继续跑,与docs/protocol.md的承诺矛盾;修复在启动任何线程前阻塞 SIGTERM/SIGINT/SIGHUP - #11513 fix(coding-agent): summarize union and multi-line codemode output types in tool descriptions (@robopipi[bot], 10-28) / #11514 fix(coding-agent): keep active tool order when the same tools are set again (@robopipi[bot], 10-28)
- #11540 fix(env): fail exec and pty with spawn_error when a helper thread cannot start (@robopipi[bot], 10-28) / #11543 fix(coding-agent): strip private-parameter CSI sequences in stripAnsi (@petrroll, 10-28) / #11548 fix(coding-agent): report a deleted working directory instead of crashing on startup
- #11467 fix(coding-agent): default openai provider to gpt-6.1-sol / #11471 feat(coding-agent): let inline ctx.ui.custom() components report blocked program status / #11494 fix(ai): detect LiteLLM ContextWindowExceededError as context overflow
- 未合并:#11499 feat(compaction): prefix-preserving summarization calls(上一期已提,仍未合并)
社区讨论 / 行业方向:
- #11500 Compaction/summarization requests share no prefix with live turns — every compaction pays a full prefill(上一期,本期 PR 仍未合并)
- #11529 Tool order depends on registration order, so the same tools can bust the prompt cache(@DiegoGBrisa,10-28,1 条评论)——
getCurrentTools()按插入序返回,被移除再加回的工具排到 Map 末尾;MCP 重连、tool_search加载、扩展延迟注册都会改变最终顺序,同样的工具集合产生不同的请求字节,在 Bedrock 这类不支持supportsMidConvoToolChanges的 provider 上就是一次完整缓存重写 - #11528 Cache warming never runs on Bedrock because its Claude models have no promptCache(@DiegoGBrisa,10-28)——
cache-warmer.ts只在model.promptCache存在时预热,而 catalog 只给直连 Anthropic 标注;Bedrock 并非代理,用同样的 cache point 与 5 分钟 TTL,Claude 4.5+ 接受ttl: "1h" - #11527 Bedrock: a new BedrockRuntimeClient is created for every request(@DiegoGBrisa,10-28)——实测每次调用 2 次新 TLS 握手约 0.35 s(0.24 s SSO + 0.11 s TLS,eu-west-1),一次 run 约 35 次调用,且留下 29 条到
portal.sso的空闲连接 - #11501 codemode:
describeOutputprints the full type for union output schemas, so one tool adds about 8k characters to every request(@colinperel,10-28)——union(anyOf)输出 schema 下describeFields返回undefined,describeOutput回退到整个类型字符串并压成一行 - #11517 OpenRouter Kimi K3.1 Pro requests an oversized default output budget, causing HTTP 402(@Lu1sDV,10-28,2 条评论)——报错「You requested up to 933349 tokens, but can only afford 931145」,页脚却显示仅用了 1.8% 上下文:缓存后的输出容量被当成了默认输出预算
- #11539 MCP OAuth drops Bearer metadata when WWW-Authenticate contains multiple challenges(@XLi-hub,10-28)——
parseWwwAuthenticate()对Basic后接Bearer的合法头返回{},丢失 metadata URL 与 step-up scope,且会跨 challenge 读参数(Bearer realm="mcp", Basic realm="gateway", scope="basic-only"误取 Basic 的 scope) - #11537 GLM (Zhipu) HTTP 429 code 1308 (5-hour usage cap) is retried instead of failing fast / #11536
pi update --extensionsreports success without upgrading / #11535 pi installed using bun, pi still looking node and npm / #11533 Git package ports collide: install B keeps A, remove B deletes A - 讨论区无新增讨论(最新讨论仍停留在 2025-12)
信号观察:
- 24 小时内 78 个 commit、15 个合并 PR、36 个新 issue、11 个新 PR;commit 数是上一期(27)的近三倍,而合并 PR 数持平——增量几乎全部是 Chord v2 的实现与文档对齐
- 「同一语义一个来源」进入第四期:本期从「事件 vs 状态」推进到「实现 vs 设计」——
391e83f承认已实现的 slice 偏离了设计文档,随后用三十余个提交逐条回填 - watch API 的破坏性变更继续加码:本期把「退休」从终态降级为标志、把「失败」变成一种 watch 调用、给
WatchEnd换kind标签——一个 watch 概念现在有三种状态表达(value / failed / retired)和四种结束原因 - 缓存经济账成为本期 pi 用户侧的主线,且三个问题都附带实测数字(0.35 s、29 条连接、缓存重写),不再是主观感受
- provider 层被重写:模型目录从单文件生成器改为 per-provider 定义 + models.dev v2 API,工具链从「脚本生成」转向「声明式定义」
- npm latest 停在 1.4.0 已 8 天,main 上积压整包 Breaking Changes——发布节奏落后于 API 演进的连续第 N 期
agegr/pi-web
pi coding agent 的本地 Web UI(Next.js / TypeScript),读同一套本地 session 文件 | stars: 7881(+34) | open issues: 87(+9) | 默认分支: main | 最近 push: 2026-10-20T16:53:57Z(连续 9 天未变) | 主页: 无
近 N 周 release 重点:
- 本期无新 release。GitHub Release 最新仍为 v0.12.2(2026-10-15),npm
@agegr/pi-weblatest 同为 0.12.2(2026-10-15)。 - 仍需区分:npm 上未加 scope 的
pi-web(latest 0.15.3)属于另一个项目(ravshansbox/pi-web)。
其他重要 commits / PRs(按重要性挑选 5–10 条):
- 本期 0 个 commit、0 个合并 PR。
main分支最后一次提交仍是 2026-10-20 的e533d9b。 - #1437 修复:整组子代理及主代理最终回复结束后再发送完成通知 (@tossp, 10-28,未合并,0 评论)
- #1440 feat(agents): 在三行列表中显示子代理实际模型和思考深度 (@tossp, 10-28,未合并,0 评论)
- #1435 停更了? (@kissstrike, 10-28,0 评论)——正文只有「如题」两个字,是本期最直接的一句质疑
- #1441 前端硬编码压缩图片至 1024px / JPEG 85,导致试卷、文档等文字类图片不可用 (@xiaqii, 10-28)——所有 >1 MB 的非 GIF 图片在浏览器端被 canvas 缩到最长边 1024px、JPEG 质量 85
- #1438 Resolve pi SDK from the user’s installed pi instead of exact-pinning (like jmfederico/pi-web does)? (@xwh5, 10-28)——针对 #1393(把 pin 从 1.2.0 提到 1.4.0)提出另一条路:直接从用户已装的 pi 里加载 SDK,从而不必每次 pi 发版都跟一个 pi-web 发版
- #1439 功能建议:在 Agents 列表三行布局内显示子代理实际模型和思考深度 (@tossp, 10-28) / #1434 修复:有后台子代理未结束时,主会话不应提前发送完成通知 (@tossp, 10-28)
- #1433 kimi 在 pi-web 中无法使用,但在终端中使用 pi 没问题 (@hyx07, 10-28) / #1436 使用 pi-web 启动后浏览器页面显示 offline,要过 30s 左右才能正常显示界面 (@kissstrike, 10-28)
- 仍未合并的旧 PR 继续堆积:#1429 / #1427 / #1426 / #1425 / #1423 / #1421 / #1420 / #1418 / #1417 / #1414 / #1409 / #1408 / #1405 / #1398 / #1396 / #1392 / #1391 / #1389
社区讨论 / 行业方向:
- 讨论区无新增讨论;最新一条仍是 2026-08-29 的「Pi Usage:在 pi-web 中查看模型余额和配额」(Show and tell)
- 同类替代实现继续 proliferate:npm 上同时存在
@hyperdreamer/pi-webui、@youweichen/pi-web-ui、@chainingintention/pi-web-cn等多个 pi Web UI 实现;#1438 提到的jmfederico/pi-web则走「不 pin、跟随用户已装 pi」的路线
信号观察:
- 连续 9 天零提交;本期 7 个新 issue、2 个新 PR 全部零回复,外部贡献与维护响应之间的分界没有移动
- 第一次出现「是否已停止维护」的公开质疑(#1435),且紧跟着出现「干脆别追版本、从用户已装的 pi 里解析 SDK」的方案提议(#1438)
package.json里 7 个@earendil-works/*包仍精确 pin 在 1.2.0,而上游 pi-coding-agent / pi-ai 已到 1.4.0(两版之差)- 前端存在未经讨论的破坏性行为:>1 MB 图片一律压到 1024px / JPEG 85,直接让文字类图片不可用(#1441)
- 报告类功能(子代理模型与思考深度、完成通知时机、用量明细)成为本期 issue 的主要来源——用户对 Web UI 的期待已经超过「能跑起来」
- 包名
pi-web仍被另一个项目占用并持续发布(0.15.3),本仓库只能用 scope 区分
vectorize-io/hindsight
Agent memory 平台(Hindsight:Agent Memory That Learns),Python 后端 + 控制面 | stars: 55511(+1081) | open issues: 177(+2) | 默认分支: main | 最近 push: 2026-10-28T20:27:54Z | 主页: https://hindsight.vectorize.io/
近 N 周 release 重点:
- 本期无新 release。GitHub Release 最新仍为 v1.1.0(2026-10-21),v1.0.0(2026-10-13)已宣告 GA。
- 官网博客目录
hindsight-docs/blog/最新一篇仍是 2026-10-27 的《What’s New in Hindsight Cloud: The API Is a Promise Now》(上一期已详述),本期无新博客。 - Hindsight Cloud What’s New 页 仍以「October 13, 2026 · Hindsight 1.0」为头条;博客 tag 页另有 Memlake 的《Introducing Hindsight Memlake: serving 100M Memories at <100ms p99 on object storage》
其他重要 commits / PRs(按重要性挑选 5–10 条):
- #6153 fix(refresh): bound the delta gate per refresh; a late failure keeps its memory (@nicoloboschi, 10-28)——每次刷新为每条记忆发一个 decision 请求,且其中任何一个失败就丢弃整批(#6103);修复后单次刷新有界、迟到的失败保留其记忆
- #6158 fix(embed): keep the user’s HINDSIGHT_API_DATABASE_URL instead of replacing it with pg0 (@nicoloboschi, 10-28)——Windows zh-CN 下内置 pg0 报「stream did not contain valid UTF-8」,且用户的库地址被忽略(#6065)
- #6162 fix(docker,helm): give the API 60s to hand back in-flight tasks on shutdown (@nicoloboschi, 10-28)——此前 entrypoint 在 SIGTERM 后 30 s 即 SIGKILL API,in-flight 任务全丢(#6068)
- #6092 fix(worker): shutdown no longer waits out a long maintenance job (@cdbartholomew, 10-28)
- #6154 feat(recall): name the serving reranker in the trace (opt-in) and tag recall log lines with one id (@nicoloboschi, 10-28)——trace 与日志能指名哪一个 reranker 成员在服务(#6072)
- #6159 docs(dev): light start-docs that compiles pages on first visit (~1 GB instead of ~3.5 GB) (@nicoloboschi, 10-28)
- #6142 fix(audit): an MCP tool call writes one audit row, not two (@nicoloboschi, 10-27) / #6143 fix(recall): break BM25 score ties on id so repeated recalls return the same list / #6133 fix(retain): store the ‘where’ dimension and fail instead of dropping an unsplittable chunk
- #6131 feat(recall): prune flag for the decision-model reranker / #6130 chore(reranker): deprecate the typesafe reranker provider in favour of the shared decision model——reranker 提供方收敛到一条路线(上一期已述)
社区讨论 / 行业方向:
- #6165 import-bank fails with CardinalityViolationError when a bank has legacy (pre-#4244) and new chunk ids for the same chunk (@alfindigital, 10-29 00:07——本期最新一条 issue)
- #6157 Hermes plugin: operational noise becomes memory facts, and retain has no content filter (@TeaShaman-cyber, 10-28) / #6156 feat(hermes): pre-retain quality gate to skip low-value turns (cut LLM extraction calls and bank noise) (@mwielgosz-esky, 10-28)——噪音进记忆库的问题同时被提出与被提案解决
- #6140 Mental-model refresh: a reranker socket timeout pauses automatic refresh (not treated as temporary)(@kobgec1993,10-27)——超时被当成永久失败,自动刷新从此停摆
- #6132 recall: a date or ‘now’ in the question barely changes the ranking (±10% boosts on the cross-encoder score) (@nicoloboschi, 10-27)——时间语义对排序几乎不起作用
- #6163 Pluggable asyncpg connect hook so the pool picks up rotated database credentials (@rgillinlz, 10-28)——数据库凭证轮换要靠改代码
- #6152 coding-agents: add Command Code (cmdc) as a supported agent / #6151 coding-agents README: autoUpdate scope is unstated / #6135 auto-update never runs on npm 12 —
npm view --jsonreturns an array, check fails as “unparsable npm output” - 讨论区无新增讨论(最新讨论仍停留在 2026-01)
信号观察:
- 24 小时内 6 个 commit、6 个合并 PR、6 个新 issue、9 个新 PR;合并作者几乎全为 nicoloboschi(4)与 cdbartholomew(2)
- 本期主题是「不要静默丢东西」:刷新闸门的整批丢弃、‘where’ 维度不可切分时的静默丢弃、停机时的 in-flight 任务丢失、recall 日志说不清是哪个 reranker——四处分别用「有界 + 保留」「显式失败」「宽限 60 s」「指名 + 统一 id」修掉
- recall 的确定性在继续收紧:BM25 同分按 id 打破(#6143)之外,本期又把服务中的 reranker 成员写进 trace(#6154)——「结果可复现」正在扩展到「结果可归因」
- 时间语义与排序脱节(#6132)是一个新暴露的建模问题:检索层对「now」「最近」几乎不给权重
- Hermes 插件同时被报「噪音进记忆」与被提「pre-retain 质量闸门」,记忆写入端正在补内容过滤
- stars 24 小时 +1,081,是本期五个仓库里唯一显著增长的(其余 +248 / +378 / +34 / +2)
agentclientprotocol/agent-client-protocol
「让任意编辑器接任意 agent」的协议规范 + Rust crate + schema | stars: 4528(+2) | open issues: 31(±0) | 默认分支: main | 最近 push: 2026-10-28T22:11:55Z | 主页: https://agentclientprotocol.com
近 N 周 release 重点:
- 本期(24 小时)无新 release。最新三个版本仍是 2026-10-27 21:56 发布的 Rust Crate v1.13.0 / Schema v1.27.0 / Schema v2.0.0-alpha.10(上一期已详述)。
其他重要 commits / PRs(按重要性挑选 5–10 条):
- #2579 docs(protocol): define the v2 session lifecycle (@benbrandt, 10-28)——retention:会话自
session/new起存在直到 Agent 丢弃它(Agent 可跳过从未 prompt 过的会话、过期旧的、或session/delete),session/list与session/resume只看得到保留的会话,恢复被丢弃的会话返回-32002,Agent SHOULD NOT 丢弃活跃会话;active:自session/new/session/resume成功起、到session/close或连接结束止 - #2588 docs(protocol): define stdio shutdown and drop the HTTP placeholder (@benbrandt, 10-28)——客户端关闭 Agent 的 stdin 即结束连接,Agent 的会话不再活跃,SHOULD 在工作结束或停止后退出,不退出时客户端 MAY 先 SIGTERM 再 SIGKILL;连接结束时双方都把自己未获响应的请求视为失败;同时删掉空的「Streamable HTTP — draft proposal in progress」段,指向远程传输 RFD
- #2585 docs(protocol): make setup-response config options and commands authoritative (@benbrandt, 10-28)——setup 响应里的
configOptions/availableCommands都是完整当前列表,省略或[]表示没有、null非法;响应到达时客户端整体替换自己持有的列表(含响应之前收到的更新);此后每次config_option_update/available_commands_update通知同样整体替换(v2 only) - #2586 docs(protocol): close active sessions on delete like archive (@benbrandt, 10-28)——删除活跃会话时 Agent MUST 像
session/close一样取消工作并释放资源再删除;此后对已删除会话的任何请求(不只是 resume)返回-32002 - #2582 docs(schema): define declining a permission request and unknown option IDs (@benbrandt, 10-28)——
cancelled现在也覆盖用户关闭弹窗与客户端按策略拒绝(包括没有提供 reject 选项时),此后 Agent MUST NOT 继续;若selected的optionId与提供的选项不匹配,Agent MUST 视为未批准;optionId在一个请求内 MUST 唯一 - #2575 docs(protocol): make session/close idempotent (@benbrandt, 10-28)——关闭不存在或已不活跃的会话(含重复 close)SHOULD 返回空结果成功,与
session/delete一致;客户端 SHOULD 把-32002当作成功关闭 - #2576 docs(schema): let cancelled cover stops the user chose through the Agent (@benbrandt, 10-28)——用户在 Agent 提供的交互里选择停止(如用「不,继续规划」拒绝计划审批)也是用户取消,报告为
error是错的;Agent 自身原因停止仍用max_tokens/max_turn_requests/refusal/error - #2580 docs(protocol): define what v2 history replay includes / #2581 in-progress updates on resume aren’t history replay / #2577 apply other terminal_update fields when the output snapshot is invalid / #2578 allow Clients to tolerate a/ and b/ prefixes on relative git_patch paths
- #2571 fix(schema): mark SessionInfo.additionalDirectories as default-on-null (@benbrandt, 10-28) / 其余 8 个
docs: update registry agents由 acp-release-bot[bot] 自动合并(#2572 / #2574 / #2583 / #2587)
社区讨论 / 行业方向:
- 讨论区无新增讨论,最近的讨论仍是 2025 年的旧帖(#37 等)
- acpserver.org(中文独立生态指南):仍写「线上协议 v1 稳定 / 下一个大版本 v2 草案」,并强调远程 HTTP / WebSocket 传输仍在标准化——与本期 #2588 删除 HTTP 占位段、指向远程传输 RFD 相互印证
- safeguard.sh 的协议解读(2026-10-24):把 ACP / MCP / A2A / LSP 并列为互补而非竞争
- 第三方实现侧仍在推进 v2 握手:claude-agent-acp PR #1217 提供 opt-in 的实验性 ACP v2 握手,v1 保持默认
信号观察:
- 单日 17 个合并 PR(benbrandt 16、bot 1),比上一期的 69 个骤降——上一期是发版冲刺,本期回到语义收口节奏
- 本期 17 个合并 PR 全部是协议语义,无一处代码实现:会话生命周期、关闭幂等、删除先关闭、stdio 关闭、setup 响应权威性、拒绝权限请求、cancelled 的语义边界、历史回放范围
- 「会话什么时候算活着」此前在规范里是含糊的,本期用 retention / active 两个概念补齐,并连带修好 close / delete / resume 的失败码一致性
- 「拒绝」终于有了线上语义:
cancelled覆盖策略性拒绝与用户关闭弹窗,且 Agent MUST NOT 继续——与上一期 security.mdx 的「权限请求只是建议」形成闭环 - 仍然是 0 个 issue、0 条新讨论(该仓库 issue 区长期为空),规范推进与社区反馈之间的落差本期未变
yxc023/yxc023.github.io
本调研报告的发布载体(个人博客仓库)| stars: 1 | open issues: 27 | 默认分支: master | 最近 push: 2026-10-28T01:03:39Z | 主页: 无
近 N 周 release 重点:
- 无 release。本期 2 个 commit,均为自动同步:
8245b95与d3ec2ed「auto(reports): 同步 daily-research 2026-10-28」(2026-10-28 01:02 与 01:03,同一天两次同步)。
其他重要 commits / PRs(按重要性挑选 5–10 条):
- 本期 0 个新 issue、0 个新 PR;仓库内容仅为每日报告同步产物,无人工变更。
社区讨论 / 行业方向:
- 无。
信号观察:
- 仓库保持单一职责:只承载报告同步产物;连续两天的推送时间(00:36 → 01:02)显示调度时点略有漂移。
跨项目观察
-
「发布说明与实际产物不一致」在同一个仓库内连出两处,而且都能被外部验证。 opencode 的 v1.19.5 release 宣称只有一条社区贡献修复,而 process-daemon v0.3.2 的 release notes 宣称「published to npm as
@opencode/pty@0.3.2」——npm 上该包只有0.0.0与0.0.0-stage,8 个平台包同样如此,而修发布顺序的 PR 还开着。同时同一个仓库的三个「latest」(GitHub Latest release = v1.19.5、npmopencode-ai= 1.19.5、npm@opencode/cli= 2.2.0)指向两个产品。发版流水线的问题已经从「产物格式」(上一期的app-update.yml)下沉到「发布声明与事实不符」。 -
「同一语义只应有一个来源」这条原则本期在四个仓库同时落地,但形态各异。 pi 把 watch 的状态表达从「三种原因」重整为「value / failed / retired 三类调用 + 四种
kind结束」;opencode 把「免费模型是否可见」的判定从「新鲜度启发式」改成「免费即默认可见、用户可显式隐藏」;ACP 把 setup 响应的configOptions/availableCommands定义为「完整当前列表、整体替换」;hindsight 把「哪个 reranker 在服务」写进 trace 与日志 id。四者都在消灭「同一含义有两份定义 / 两种推导」的结构性缺陷。 -
缓存与前缀的经济账同时出现在两个 agent 框架,且都从「用户体感」升级为「可复算的数字」。 pi 侧:工具注册顺序决定请求字节从而在 Bedrock 上触发完整缓存重写(#11529)、Bedrock 从不做 cache warming(#11528)、每次调用新建
BedrockRuntimeClient多付 0.35 s 与 29 条空闲连接(#11527);opencode 侧:拟合输出预算时必须留 1% 窗口否则严格 provider 直接拒绝(#59934,Kimi K2.6 经 OpenRouter 报错),以及 v2.2.0 引入的 per-provider prompt cache TTL。「省 token」在 2026 年 10 月同时是账单问题、延迟问题和正确性问题——这一判断与上一期一致,且本期证据更硬。 -
「agent 自己算的钱 / 算的 token」仍然不可信,且本期出现了新形态。 opencode 桌面恒显示
0,00 USD(#60052),上一期已有 10⁶ 倍高估与 6 倍低估;pi 侧 OpenRouter 因「把缓存后的输出容量当作默认输出预算」而直接返回 402(#11517),而页脚只显示用了 1.8% 上下文。错误不只是算错,还会让请求直接失败。 -
「静默丢弃」正在被系统性清除,且三家清理的是同一类东西。 pi:超出
inlineBudget的 codemode 工具连名字都不出现(上一期 #11473)、union 输出 schema 把 8 k 字符打进每次请求(#11501,本期已修);hindsight:刷新闸门一批失败整批丢弃(#6103,本期已修为有界 + 保留)、‘where’ 维度不可切分时 chunk 被静默丢弃(#6133);ACP:本期规定cancelled必须覆盖用户关闭弹窗与策略性拒绝,此后 Agent MUST NOT 继续(#2582)。「用户看不见的丢弃」正在从各家 issue 里的个案,被协议与实现同时收口。 -
协作形态的分化在本期出现一个方向性变化:ACP 的单人节奏开始回落,pi-web 的沉默开始被质疑。 ACP 单日合并从 69 降到 17(但 17 个全是协议语义,仍由 benbrandt 一人承担,社区零 issue 零讨论);pi-web 连续 9 天零提交、9 个新 issue 与 PR 全部零回复,且首次出现「停更了?」的公开质疑与「放弃追版本、从用户已装的 pi 解析 SDK」的替代方案(#1438)。一边是「一个人把规范写完」,另一边是「社区提交无人接」——两端的差距本期都没有缩小,但 pi-web 端第一次出现了问题本身的公开表述。
-
三家同时在做「让会话脱离单轮问答」的尝试,但都刻意不加新的 server 事件。 opencode 的
/goal用客户端已有的同步数据判定「done」(不引入session.settled),scheduled tasks 只落存储与定时器;pi 的 Chord v2 slice 8 用host.root(fn, context, { principal? })提供在对象之外运行代码的入口,slice 6b 把 Durable 与 jobs 落到 store 上。「长时运行」的公共基础设施正在成形,且实现方都倾向于用已有机制组合而非新增协议面。
元信息
- 报告生成时间: 2026-10-29T00:30:00Z
- 基准时间: 2026-09-08T09:23:29Z(按 spec 读取自上次报告
reports/latest.md的基准时间:字段,自 2026-09-08 起连续 18 期未变) - 扫描窗口: 2026-09-08T09:23:29Z → 2026-10-29T00:30:00Z(约 50.6 天);本期新增内容全部落在 2026-10-28T00:30:00Z 之后的约 24 小时
- 数据源: GitHub API(gh CLI + Search API)+ mmx web search + npm registry + 仓库内 CHANGELOG / package.json 校验
- API rate limit 剩余: 4975 / 5000(core,抓取完成后查询)
- 抓取结果: 6 / 6 仓库 × 4 endpoint 全部成功(opencode 的 Discussions endpoint 返回 410「Discussions are disabled for this repo」,已跳过);本期增量统计口径为
created:>=2026-10-28T00:30:00Z/merged:>=2026-10-28T00:30:00Z的 Search API 计数(opencode:56 commit、60 合并 PR、146 新 issue、139 新 PR;pi:78 commit、15 合并 PR、36 新 issue、11 新 PR;pi-web:0 commit、0 合并 PR、7 新 issue、2 新 PR;hindsight:6 commit、6 合并 PR、6 新 issue、9 新 PR;ACP:17 commit、17 合并 PR、0 新 issue、17 新 PR;blog:2 commit);opencode 的 release notes 取自 GitHub Release v1.19.5 与 process-daemon-v0.3.2、npm registry(opencode-ai、@opencode/cli、@opencode/pty及 8 个平台包)与packages/process-daemon/npm/package.json;pi 的 release notes 取自 GitHub Release v1.4.0 与packages/chord/CHANGELOG.md的 [Unreleased] 段;hindsight 无根级 CHANGELOG.md,release notes 取自 GitHub Release v1.1.0 与hindsight-docs/blog/目录;ACP 取自 Rust Crate v1.13.0、Schema v1.27.0 与 Schema v2.0.0-alpha.10
评论