@lsfcy/pi-composer-predictions
Next-message ghost-text predictions for Pi's terminal editor
Package details
Install @lsfcy/pi-composer-predictions from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@lsfcy/pi-composer-predictions- Package
@lsfcy/pi-composer-predictions- Version
0.2.1- Published
- Nov 11, 2026
- Downloads
- 314/mo · 55/wk
- Author
- lsfcy
- License
- MIT
- Types
- extension
- Size
- 44.8 KB
- Dependencies
- 0 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
Pi Composer Predictions
给 Pi 的终端输入框增加「下一句预测」。普通终端和 Pi Console 共用同一个扩展,不修改 Pi 或 Console。
一轮成功结束后,空输入框内显示灰字,例如:
补一下 src/parser.ts 的边界测试。
- Tab:填入可编辑草稿。仍须自行按 Enter 才会发送。
- Esc:忽略预测。有预测时只消耗这一次 Esc;之后恢复 Pi 原有行为。
- 输入、粘贴或浏览历史:立即忽略,并取消尚未完成的预测。
- 输入框已有内容时,不生成、不覆盖草稿。
预测只是建议,不代表用户意图、事实确认或操作授权。
要求
- Pi 1.4.0 或更新版本;目前在 1.4.0 验证。
- Node.js 22.19 或更新版本。
- Pi 的交互式 TUI。支持 regular / fullscreen,不支持 RPC、JSON 和 print 模式。
安装
通过 npm 安装:
pi install npm:@lsfcy/pi-composer-predictions
然后在正在运行的 Pi 中执行 /reload,或新开会话。只想临时试用、且不写入安装配置时,可运行 pi -e npm:@lsfcy/pi-composer-predictions。
插件清单包含 pi-package 关键词,具备被 Pi 官方包目录 发现的资格;收录可能有延迟。包目录不是另一个上传目标。
本地开发
在本目录中试用一次,不改 Pi 安装配置:
pi -e ./index.ts
长期使用时,在本目录安装:
pi install "$PWD"
然后在正在运行的 Pi 中执行 /reload,或新开会话。Pi Console 内同样执行 /reload,不需要 Console 专用适配。
安装扩展会启用额外的模型请求。 默认只在当前 provider 内选模型;如不想自动选择,可在对话前固定模型。
配置
/predictions
/predictions status
/predictions off
/predictions on
/predictions model provider/model-id
/predictions model auto
例如模型 ID 本身包含斜杠时,使用完整的 provider/vendor/model-id;只在第一处斜杠分隔 provider。使用前可通过 Pi 的 /model 确认可用模型。
配置保存在 Pi agent 目录的 composer-predictions.json,默认位置为 ~/.pi/agent/composer-predictions.json。遵循 PI_CODING_AGENT_DIR:
{
"enabled": true,
"model": null
}
enabled:是否预测,默认true。model:完整模型名;null表示自动选择。thinkingLevel:可选,支持off、minimal、low、medium、high、xhigh、max。省略时仍使用模型最低支持档;模型不支持指定档位时停止预测,不偷偷降档。此项只影响预测,不改变主会话。删除此项即可恢复默认行为。model与thinkingLevel与pi-auto-session-name的auto-session-name.json同名同格式(provider/id、同一档位枚举、null表示自动)。- 自动选择只限当前 provider;如设置了
enabledModels或--models,还会遵循该范围。明确指定模型可以跨 provider、超出该范围。 - 按目录价格的
3 × input + output估算成本,不按模型名字猜。零价格可能表示未知,不视为「最便宜」;没有已知价格时使用当前模型。 - 模型选择不会改变主会话模型。明确指定的模型不可用时,停止预测,不偷偷换模型。
- 配置错误时停止预测,并提示检查文件,不回退为默认开启。
- 当前进程的命令立即生效;其他进程在下一次轮次结束或
/reload时重新读取配置。不添加文件监听器。
例如固定某个模型并降低思考档,编辑上述配置文件后执行 /reload:
{
"enabled": true,
"model": "provider/model-id",
"thinkingLevel": "low"
}
/predictions 基于当前分支已有问答,立即请求一次预测;可以在跳过、失败、超时或忽略建议后,对同一对话快照再次手动请求。仍可能返回无建议,不保证每次都有内容。
/predictions status 只查看状态,不触发模型请求。它显示最近状态、模型、本进程请求与接受次数,以及已返回的 token / 目录估算费用。不保存或上传使用统计。
- 仅在插件已开启、Pi 空闲、没有排队消息、输入框为空且最后一条助手回复正常结束时执行;不满足时说明原因,不暗中开启插件或覆盖草稿。
- 沿用当前预测模型、输入范围、10 秒超时和取消规则;不启动主问答,不改配置或会话历史,不自动重试。
- 已有预测请求仍在进行时不重复发起。输入或取消仍会中止预测;每次实际发出的手动请求都可能额外计费。
- 结果仍是灰字建议,Tab 接受为草稿,再由你按 Enter 发送。
预测策略
目标是预测用户已有意图的自然延续,不是替用户安排一个看似合理的新任务:
- 优先考虑对当前产物的精确修改、按使用场景重新排版、补齐用户已要求的内容,或针对用户指出的缺陷重试。必须有用户目的或此前反应作为依据。
- 最新纠正、否定和范围限制优先于旧要求;助手自己的可选建议不是用户意图或授权。
- 只要对话仍可延续,就给出最可能的下一句;仅当摘录不可用、所有候选都违反安全规则,或用户明确结束对话时返回
SKIP。不因上下文不完整或多个方向同样合理而放弃预测,也不默认追加测试、文档、重构、评审或提交。
上下文仍是裁剪后的原文,不做模型总结或跨会话检索:
- 只看当前分支最近最多 6 个用户轮次,每轮最多保留一个成功结束的助手最终回复。助手中途的进度消息不占历史名额。
- 最新用户请求最多 2400 字符,最新最终回复最多 1600 字符;长用户文本保留开头和结尾,避免只留开头而丢掉末尾约束。
- 剩余预算先在较早的用户请求之间分配,每条最多 1600 字符;有余量才补对应的助手最终回复,每条最多 400 字符。最后按原时间顺序排列。
- 总量仍不超过 12 条、6000 Unicode 字符,包含角色标记和分隔符。不把会话第一条永久固定为当前目标;窗口外或文本中间的约束仍可能丢失。缺乏依据时应不预测,而不是猜测遗漏内容。
此策略替代原来的「按最近消息倒序塞满预算」,不增加模型请求、长期记忆、缓存或配置开关。实际质量仍需人工验证;效果差可用 /predictions off 停用。
隐私、成本与边界
每轮最多自动发起一次独立预测;显式执行 /predictions 可额外请求一次:
- 监听
agent_settled,而非可能继续重试的agent_end。 - 自动触发要求交互式用户输入启动、未中止、无排队输入、输入框为空,且最终 assistant 正常结束。手动重试可以使用已恢复会话中的完整问答。
- 读取 Pi 当前分支的 session projection,遵循压缩和持久化的
context_edit,不复活已移除的内容。 - 只取
user/assistant正文。按上述意图优先策略裁剪最近最多 6 个用户轮次;最多 12 条、6000 Unicode 字符,优先保留用户请求、纠正和当前最终产物。 - 不发送系统提示、工具参数与输出、思考块、图片、自定义消息、分支摘要或压缩摘要。
- 默认使用最低支持的思考档,可通过
thinkingLevel指定。输出预算最多 512 token,预测最多 160 字符。10 秒超时,不自动重试。 - 新输入、切换、重载、退出、模型变化或上下文变化时取消或丢弃结果。即使 provider 不响应取消,过期结果也不会填入输入框。
注意:
- 近期对话正文仍可能包含敏感信息。不要在不允许额外模型调用的会话中开启预测。
- 扩展写成
user角色的历史消息无法可靠区分真人来源;角色筛选不是身份认证。 - 主请求临时
context钩子的修改不一定持久化,因此不等同于这里的 session projection。敏感会话应关闭预测。 - 同一对话快照不重复自动请求;只有显式执行
/predictions才允许再次请求。没有跨进程、跨会话或磁盘缓存。 - 取消和超时只能保证本地丢弃;服务端已经处理的请求仍可能计费。
- 预测及用量不写入会话历史。预测成本不会出现在 Pi / Console 的会话用量统计里;服务商账单才是实际费用依据。
- 独立请求复用 Pi 已有模型和认证,不保存凭据,不创建 HTTP 服务、IPC、后台守护进程或遥测。
- 不具备长期记忆、检索或个性化画像;质量依赖所选模型。
自定义编辑器兼容性
Pi 目前只有一个自定义编辑器工厂槽位。本扩展使用 CustomEditor,保留 Pi 原有快捷键、自动补全、草稿、撤销和光标定位机制。
重载或首次开启时,从当前 session projection 恢复对话输入历史;不恢复已经压缩掉的输入、非持久命令历史或旧撤销栈。
已有 Vim 等编辑器扩展时,本扩展不覆盖,并给出提示。后加载的扩展若替换编辑器,本扩展停止预测,不争抢。首版不承诺多个编辑器插件可叠加。
停用与卸载
临时关闭:
/predictions off
npm 安装的版本使用包名卸载:
pi remove npm:@lsfcy/pi-composer-predictions
本地开发安装则在安装时使用的子包目录执行 pi remove "$PWD"。随后在仍运行的 Pi 中执行 /reload。不要同时启用 npm 版和本地源码版,以免重复加载。
不需要的 composer-predictions.json 可以删除。只有这一个扩展自有配置文件;没有会话迁移或缓存清理。
开发与验证
npm ci --ignore-scripts
npm run check
npm run test:tui
npm pack --dry-run
check:strict TypeScript、纯逻辑、真实编辑器组件和事件集成测试。覆盖不自动发送、不覆盖草稿、取消竞态、编辑器冲突、模式边界、上下文编辑和费用边界。转录回归覆盖进度消息不挤占用户意图、长用户消息末尾约束、历史预算分配、六轮窗口、成功最终回复配对及 Unicode 上限;提示词契约测试只检查规则存在,不证明模型会遵循规则。test:tui:需要 Python 3 和可执行的 Pi(可用PI_BIN指定绝对路径)。真实 PTY、临时 agent 目录、离线假模型;验证 regular/dark 和 fullscreen/light、硬件光标、Tab/Esc、草稿、取消、开关、重载、状态命令不发请求及手动重试不启动主问答。不使用真实凭据或付费模型。- CI 执行同样的检查。失败直接指向测试、文件和提交;不自动重试失败来掩盖问题。
- 真实模型的预测质量、时延和费用需要人工试用;离线测试不证明预测准确。人工验收可固定 10–20 个对话截点,在模型不变的情况下比较新旧结果:是否延续已有意图、是否具体有用、任务结束或依据不足时是否保持沉默;不把建议出现率或字面命中下一句当成质量证明。
- 已验证真实 Pi 交互,未包含 Electron / Pi Console 专项自动化回归。
源码只有配置、转录、选模、取消状态、编辑器和宿主事件六个模块。Pi SDK 是 host peer,不打包第二份 Pi;无构建产物或运行时第三方依赖。
维护者负责检查真实采纳质量与额外成本;效果差时关闭或卸载。若上游提供同等原生预测功能,应由维护者删除本扩展,而不是长期保留两套实现。该方案替代每个 GUI 各写一套输入框预测的负担,不新增通用插件平台或监控循环。
致谢与许可证
交互思路来自 dsh-composer-predictions,并针对 Pi 的生命周期和终端编辑器独立实现。预测目标参考 Codex 历史提示词 中对用户目的、当前产物和交付物的约束;本扩展不复制其线程 fork 或继承工具的机制,也不代表当前 Codex App 的内部实现。
MIT。