Spotify 的 shunt 插件怎么拦住 Claude 去读大文件

Spotify 工程博客 2026 年 9 月:Portal 的 bulk-reader 模式加 Claude Code 插件 shunt,大文件均值大约省 90% 进入 Claude 的 token。编辑和排错不能委托。

Spotify 的 shunt 插件怎么拦住 Claude 去读大文件

Spotify 工程博客在 2026 年 9 月发了一篇 Portal 用法:作者 Dimitri Mazmanov 认为编程 Agent 的大量 token 花在读写,而不是推理。他用 Portal 里两个声明式 mode,加上 Claude Code 插件 shunt,把大文件阅读委托给更便宜的模型。文中对 Java monorepo 四组场景的测量是:bulk-read 相对「让 Claude 自己读文件」,均值大约省 90%。这就是 claude code 大文件省 token 的一条已公开路径。它和本站写过的 Oh My Portal 不是同一个产品。

作者CodePass 技术编辑

两个 mode 各干什么

mode 是 Portal 上的短生命周期 Agent:写指令、选模型、设温度、可挂 MCP,用 CLI 或 API 调用。例子里两个 mode 都用 gemini-2.5-flash,温度 0.2,你也可以换成自己 Portal 里已配置的模型。

bulk-reader 负责「为了回答一个问题要读很多大文件」。指令要求只输出结构化要点,每条带上名字、类型或行号,不要开场白。code-writer 负责测试、配置骨架、类型声明这类能对照现有文件仿写的输出,并且要求只输出代码。作者强调后一条:若工人模型用 Markdown 围栏和解释把代码包起来,Claude 还得再解析一遍,省下的 token 会漏回去。

早期他把路由写进 CLAUDE.md,Claude 可以不遵守,而且每个仓库得复制一份。现行方案是插件 shunt,通过 Portal CLI 的动作注册表调用,因此换 Portal 实例不用改插件逻辑。

Hook 先挡,脚本再转发

shunt 注册两个 PreToolUse hook。check-file-size 拦每一次 Read:行数超过阈值(默认 350)就拒绝,并让 Claude 改走 /bulk-reader。带 offset/limit 的定点读取放行。check-bash-read 拦对大文件的 catheadtaillessmore;已经接了管道的 cat file | grep 放行,因为那是定点查找。

阈值用环境变量 SHUNT_MIN_LINES,可放在 shell 或 .claude/settings.jsonenv 里。作者示例是 "SHUNT_MIN_LINES": "500"

bulk-read 把文件包进 XML 再送给 bulk-reader,一次调用不在服务端留状态,追问要重新送文件,但这些 token 进的是工人模型,不进 Claude 的上下文。code-write 必须带参考文件,否则工人模型会写出和仓库无关的代码;它还可以直接写到 --target,Claude 看不到生成结果。

bulk-read --question "这个服务做什么" --paths src/Service.java src/Handler.java
code-write --spec "为 UserService 写测试" --reference tests/OrderTest.java --target tests/UserTest.java

Hook 在技能说明没被读到时仍然会拦截大 Read,所以路由不单靠模型自觉。

不能委托的两类,以及延迟

作者写了失败边界。不能委托修改:工人模型的摘要没有可靠行号,Claude 要改代码时仍须自己读那一段,hook 因此放行带范围的 Read。不能委托推理:他的测试里工人模型漏掉一个线程安全问题,Claude 在拿到摘要后几秒内看出来。路由明确排除调试、架构决定和安全相关代码。

每次委托是一次网络往返,响应常见 10 到 30 秒,Portal 对单次调用封顶 30 秒,很大的生成要拆开。小文件上,往返比省下的 token 更亏,所以才有行数阈值。

安装顺序

博客给出的安装是 Claude Code 插件市场:

claude plugin marketplace add spotify/portal-ai-plugins
claude plugin install portal@portal
claude plugin install shunt@portal

新会话里跑 /portal:setup,把 Portal CLI 登录到你的实例。bulk-readercode-writer 作者称已经公开,不必自建。若要换工人模型或指令,在 Portal 里 fork,自己的同名 mode 会优先于公开版。

90% 是他在自己的 Java 仓库上、用「Claude 直接读」做对照的均值,不是对所有语言的保证。code-write 更难用同一口径衡量,因为不走 shunt 时 Claude 既读参考文件又生成输出 token,走 shunt 时代码直接落盘。

参考资料