pi-subagent-feather
Pi subagent with bounded parent receipts, persistent child sessions and minimal prompt injection.
Package details
Install pi-subagent-feather from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-subagent-feather- Package
pi-subagent-feather- Version
0.2.0- Published
- Oct 1, 2026
- Downloads
- 560/mo · 560/wk
- Author
- pagey
- License
- MIT
- Types
- extension
- Size
- 62.2 KB
- Dependencies
- 0 dependencies · 5 peers
Pi manifest JSON
{
"extensions": [
"extensions/subagent/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-subagent-feather
基于 @eggmasonvalue/pi-subagent 2.0.1 的独立 MIT 派生版。
npm 包名 pi-subagent-feather,本地目录 D:\Work\pi-subagent-lite。
版本 0.2.0。MIT 授权,见 LICENSE / NOTICE。
目标:保留独立上下文、子会话存档、resume、并行、超时与实时进度;减少父会话重复数据和额外提示词。
改了什么
| 项目 | 上游 2.0.1 | Lite |
|---|---|---|
| 父会话 details | 全部 messages/toolActivity/args/stderr,另有 task 副本 | 小型回执;不含答案、任务、过程、参数、思考、图片和 stderr |
| 模型可见答案 | 最大 50KiB / 2000 行 | 默认答案正文 8KiB / 200 行,另外附短状态与 session 路径 |
| 运行时收集器 | 收集完整过程 | 只保留最近答案、当前部分答案、有界 stderr 和标量统计 |
| 父代理 promptGuidelines | 4 条 | 无 |
| promptSnippet | 2 条 | 无 |
| 子代理附加系统提示词 | 每次追加指导语 | 不追加 |
| 模型清单 | 描述、benchmark 与解释字段 | 按需返回 ID、levels、默认值和短用户备注,不重复存 details |
| 子会话 JSONL / resume metadata | 保留 | 保留,是完整过程的唯一插件存档来源 |
不是“零 token”:工具 schema、任务、答案、Pi 本身系统提示词、用户 AGENTS 和项目资源仍会消耗 token。 没有自动摘要模型调用,没有新增检索工具,没有静默删旧会话。 去掉隐藏 details 的重复内容主要节省父会话磁盘/内存;它本来不送给模型,不应算成模型 token 节省。
实测
Windows / Node 24.18.1 / Pi 0.99.1:
- 两个工具的声明 JSON(含 schema 和原来的额外提示词字段)UTF-8 体积 3238 → 1513 字节,减少 53.3%。 这是声明字节数,不是特定提供商的精确 token 数,更不是整段会话的 token 节省率。
- 真实 DeepSeek 新子会话 + resume:两次
details分别 602 / 616 字节;答案只出现在content一次。 - 多 MB 工具参数/输出、图片、思考块不会进入父会话回执。
父会话内容形式仍很简单:
[status=done session=C:\...\child.jsonl]
子代理答案
长答案会有 [Truncated; full text is in the child session.]。用已有 read/bash 按需查看 JSONL,或 resume 要求返回所需部分。
不另外创建一份全文输出日志。
启用与冲突
与原插件使用相同工具名:subagent 和 subagent_models,因此不能同时加载两版。
本机路径:D:\Work\pi-subagent-lite。
正式切换时,把 ~/.pi/agent/settings.json 的 packages 中:
"npm:@eggmasonvalue/pi-subagent"
替换为:
"D:\\Work\\pi-subagent-lite"
其余配置与包顺序不变;所有窗口 /reload 或重启。不要只添加新路径而保留旧插件一起加载。
这是替换加载源,不是修改第三方 node_modules。回退时恢复旧的 packages 项并 reload。
项目创建过程没有执行上述切换。
接口与使用
subagent({ task: "自包含任务和预期结果", model: "deepseek/deepseek-flash", thinking: "low", tools: ["read", "bash"] })
subagent({ task: "继续指令", resume: "C:\\...\\child.jsonl" })
subagent_models({})
tools未指定:继承父代理当前活动工具,排除 subagent/subagent_models;[]:无工具。- 要允许递归,在 tools 里明确加入 subagent。并行调用是普通并行工具调用;子代理写不同文件。
model/thinking/tools/cwd只用于新子会话,不能与 resume 同时指定。- timeout / cancellation 会停止子进程树,保留已写入的子会话供 resume。
- 超时后如何检查进度/继续,由父代理和用户决定,不再自动注入固定监督流程。
- 进度最多每100ms更新一次,最后一批数据即使没有后续 stdout 也会发布;只显示短进度/当前工具名与数量。
- 展开父工具结果显示答案与统计,不再展开完整中间轨迹;完整过程看子会话。
session_shutdown(含 reload/会话替换)会取消并等待活动子代理。执行器不在扩展工厂中启动资源。
模型策略与旧会话
沿用现有 ~/.pi/agent/pi-subagent/models-allowlist.json,无需重写模型白名单。
PI_CODING_AGENT_DIR 改变 agent-dir 基路径。默认模型、thinking、支持等级和 resume 策略仍会校验。
模型清单保留短用户 description,省略 AA / DeepSWE benchmark 输出;policy 文件内容不被改写。
新会话在 <agent-dir>/sessions/subagent-lite/<run-id>/ 下。
继续使用上游 version 2 的 .jsonl.subagent.json metadata;可 resume 上游正常保存的旧子会话。
旧父会话已保存的重复详情不会被这版自动清除;需要新会话或核心存储优化才能甩掉旧历史。
若 metadata 缺失/损坏、模型被白名单撤销、thinking 不再允许,会明确拒绝恢复,不擅自换模型。
大小预算
可选配置:<agent-dir>/pi-subagent-feather/config.json。每次调用读取,缺省无需文件。
{
"resultBytes": 8192,
"resultLines": 200,
"progressBytes": 2048,
"stderrBytes": 4096,
"eventBytes": 1048576
}
- result 上限作用于答案正文,状态/路径/错误说明占少量额外空间;长答案仍完整存在子会话。
- 支持多字节 Unicode;截断不切断代理对,有界子串会脱离巨大原字符串的 backing store。
- stdout 单个 JSON 事件超过 eventBytes 会丢弃该事件并在下一行恢复;子 JSONL 不受此限制。 极大最终事件被丢弃时,使用已流出的有界正文,并标记截断;统计可能仅有已流出 usage。
- 所有预算必须是正整数;最大 resultBytes 51200 / resultLines 2000 / eventBytes 64MiB。
- stderr 是运行期最多4KiB的尾部,失败且没有正文时供模型看;不保存在 details。
其他可选键(同一 config.json,未知键直接报错防拼写):
"offlineChildren": true:子进程附加--offline,跳过启动时的模型目录网络刷新(更快)。适合 API key 型 provider;OAuth 型子代理凭证过期时可能需要先在主会话刷新凭证。"defaultTimeoutMs": 30000:调用未传timeoutMs时的兜底超时,防失控子进程。"resultKeep": "tail":完成的答案超预算时保留结尾(结论常在末尾);默认"head"。流式进度始终保留头部。eventBytes默认已降为 1MiB(真实子进程事件被 Pi 自身截断在 50KiB/2000 行内,1MiB 足够),单事件超限仍丢弃并在下一行恢复。- 收集器解析前按事件类型做廉价预过滤,不关注的事件类型跳过 JSON.parse。
/subagents 命令
/subagents 列出最近的子会话(时间、大小、模型、路径),纯人看界面,不进入模型上下文、零 token。
有 UI 时可选择一条并复制其 resume 路径;无 UI(或 RPC 降级)时以通知列出。
开发 / 验证
npm install --legacy-peer-deps
npm run typecheck
npm test
node --experimental-strip-types scripts/measure-prompts.mjs <upstream-index.ts>
普通测试不调用模型/网络/麦克风,使用自己的临时目录和假子进程;覆盖大量输出、UTF-8、输出预算、metadata、 resume、timeout、abort、并行、流事件恢复、usage、生命周期清理、schema 和宽窄 TUI。
npm run smoke
smoke 会用现有 DeepSeek 认证发起两次极小请求,验证真实 Pi 加载/新会话/resume; 认证和 models 只复制到私有临时目录,测试后删除,不打印凭证、不改主设置、不使用 Codex/火山额度。 没有 DeepSeek 认证时不要运行此项。
插件没有 runtime dependencies,宿主模块仅声明 peerDependencies;开发依赖用于类型检查和离线测试。
npm audit --omit=dev 为零告警。固定 Pi 0.99.1 的开发依赖树目前有 brace-expansion 的已知告警,
不会随本插件打包,且不应通过修改用户全局 Pi 来消除本仓库的开发依赖告警。
保留上游 MIT 授权与出处,见 LICENSE / NOTICE。