btw — 不被记住的临时提问
导语
/btw 让你用满上下文问一个临时问题,问答完全不进入会话——就像会议里压低声音问旁边人一句。
简介
经典困境:你想问一个跟当前任务有关、但又不想它「当真」的问题。比如 debug 时顺手问「这个项目的 Docker 基镜像是哪个?」——直接发消息会被理解成任务上下文,之后每次推理都掂量「用户问过 Docker」,导致回答发散。@piex-dev/btw 的回答:问题压根不发给 agent。扩展自己拿一份会话快照,旁路调一次模型,答案弹给你看。session 里什么都不会留下。
技术原理
核心机制:旁路调用。扩展绕开 agent loop,用 pi-ai 的 completeSimple 直接对模型发一次性请求。因为问答从不进入 session,「防污染」从运行时过滤变成架构保证:没有东西需要被滤掉。
/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、进度百分比)。
使用说明
安装
pi install npm:@piex-dev/btw仓库源码:extensions/btw
用法
/btw 这个项目的 Docker 基镜像是哪个?答案在 pager 中显示,关闭后 session 不留痕迹。
配置
~/.pi/piex-dev/btw/btw.json:
{ "model": "anthropic/claude-haiku-4-5", "thinkingLevel": "low" }未配置时回退当前会话模型。配置每次提问重读,无需 /reload。
验证
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 btw | btw (piex) |
|---|---|
| 引擎级旁路 | completeSimple 旁路调用 |
| 完全不在 session 写入 | 同样不写入(架构保证) |
| Bun 运行时 | Node.js (pi) |
设计参考
| 项目 | 机制 | piex 取舍 |
|---|---|---|
| pi-extensions pi-btw | completeSimple 旁路 + 会话快照 + settings 文件 + loader/pager UI | 采纳整体架构,保留 piex 的无参交互输入;pi-ai 0.79/0.80 兼容加载直接复用 |
迭代记录
路线图
| 方向 | 打算 |
|---|---|
| 快照不含 system prompt 与工具结果全文 | 按问题相关性选择性携带(如始终保留最后一个 toolResult 全文) |
| 无多轮追问 | pager 里加输入行,追问时携带上一轮回合(仍不写入 session) |
| 模型配置热更新 | 补 /btw model 快捷配置命令 |
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.1.0 | 2026-07-19 | 注入 + 过滤架构:[BTW] 问题注入主 agent loop,靠 prompt 禁工具,事后用 context 钩子按「跳过下一条 assistant」推断过滤 |
| 0.2.0 | 2026-07-21 | 旁路调用架构:completeSimple 一次性请求 + ≤40K 会话快照,问答不写入 session;新增 btw.json 独立模型/thinking level、可中断 loader、Markdown pager |
0.1.0 教训:「先污染、后治理」在异步消息流里很难做严——assistant 回复夹带 toolCall 序列时过滤推断错位漏滤,agent 忙时消息排队会让 btw 标记盖到错误的 turn。0.2.0 换成「不产生污染」,整类边界随之消失。
源稿 Markdown:docs/packages/btw.md