ExtensionContext@piex-dev/btw

btw — 不被记住的临时提问

导语

/btw 让你用满上下文问一个临时问题,问答完全不进入会话——就像会议里压低声音问旁边人一句。

简介

经典困境:你想问一个跟当前任务有关、但又不想它「当真」的问题。比如 debug 时顺手问「这个项目的 Docker 基镜像是哪个?」——直接发消息会被理解成任务上下文,之后每次推理都掂量「用户问过 Docker」,导致回答发散。@piex-dev/btw 的回答:问题压根不发给 agent。扩展自己拿一份会话快照,旁路调一次模型,答案弹给你看。session 里什么都不会留下。

技术原理

核心机制:旁路调用。扩展绕开 agent loop,用 pi-ai 的 completeSimple 直接对模型发一次性请求。因为问答从不进入 session,「防污染」从运行时过滤变成架构保证:没有东西需要被滤掉。

flow
/btw 命令 → 解析模型与凭据 → 构建会话快照(≤40K 字符)
→ completeSimple(model, { systemPrompt, messages })
→ 答案渲染进 Markdown pager(可滚动、可中断)
→ session 中无任何写入

会话快照是压缩摘要(只取 user/assistant 消息,toolCall 保留 name(args),超 40K 字符从头部截断)。可配专用模型(~/.pi/piex-dev/btw/btw.json),临时提问通常不需要旗舰模型。等待期是 BorderedLoader(Esc 中断),答案用自制 Markdown pager(j/k 滚动、PgUp/PgDn、Home/End、进度百分比)。

使用说明

安装

bash
pi install npm:@piex-dev/btw

仓库源码:extensions/btw

用法

bash
/btw 这个项目的 Docker 基镜像是哪个?

答案在 pager 中显示,关闭后 session 不留痕迹。

配置

~/.pi/piex-dev/btw/btw.json

json
{ "model": "anthropic/claude-haiku-4-5", "thinkingLevel": "low" }

未配置时回退当前会话模型。配置每次提问重读,无需 /reload

验证

bash
pi -e ./extensions/btw/src/btw.ts -p "what is 1+1" --no-session

实现方案

约 700 行单文件。核心模块:/btw 命令、loadCompleteSimple(兼容 pi-ai 0.79 根导出与 0.80 /compat 子路径)、resolveBtwModel(设置→当前模型回退链 + 凭据校验)、buildConversationContext(压缩快照)、completeSideQuestion(AbortSignal)、BtwAnswerPager(Markdown 滚动阅读器)。

omp btwbtw (piex)
引擎级旁路completeSimple 旁路调用
完全不在 session 写入同样不写入(架构保证)
Bun 运行时Node.js (pi)

设计参考

项目机制piex 取舍
pi-extensions pi-btwcompleteSimple 旁路 + 会话快照 + settings 文件 + loader/pager UI采纳整体架构,保留 piex 的无参交互输入;pi-ai 0.79/0.80 兼容加载直接复用

迭代记录

路线图

方向打算
快照不含 system prompt 与工具结果全文按问题相关性选择性携带(如始终保留最后一个 toolResult 全文)
无多轮追问pager 里加输入行,追问时携带上一轮回合(仍不写入 session)
模型配置热更新/btw model 快捷配置命令

版本记录

版本日期变更
0.1.02026-07-19注入 + 过滤架构:[BTW] 问题注入主 agent loop,靠 prompt 禁工具,事后用 context 钩子按「跳过下一条 assistant」推断过滤
0.2.02026-07-21旁路调用架构:completeSimple 一次性请求 + ≤40K 会话快照,问答不写入 session;新增 btw.json 独立模型/thinking level、可中断 loader、Markdown pager

0.1.0 教训:「先污染、后治理」在异步消息流里很难做严——assistant 回复夹带 toolCall 序列时过滤推断错位漏滤,agent 忙时消息排队会让 btw 标记盖到错误的 turn。0.2.0 换成「不产生污染」,整类边界随之消失。