agent 需要凭据时向人要一次,明文不进模型上下文。
QWENPAW PLUGIN · ONE-TIME REF · EGRESS SCRUB
QwenPaw 后端插件。agent 执行到一半需要凭据(推代码、调 API、签请求)时调用 request_secret,人在私有卡片里输入,模型只收到一个一次性 ref。明文保存在插件内存中,secret_exec 在进程内完成替换,工具输出里出现的原值被替换成 ***。
模型 ──request_secret(label, reason)──► 私有卡片 (overlay / 独立答页) │ 人输入明文 ▼ 插件内存 · 不落盘 · 有 TTL │ 模型 ◄── {"status":"saved","ref":"sr_…"} ───┘ 模型 ──secret_exec(ref, cmd)──► 确认卡:完整命令 + cwd ──批准──► 进程内替换 {{secret}} 执行 │ ▼ 出站中间件:原值 → *** 模型 ──secret_export(ref, env_key)──► 确认卡:env 名 ──批准──► 宿主加密 env 存储 后续 shell 用 $ENV_KEY 拒绝 / 超时 / 取消 ──► ref 不消费,仍可用于其他动作
四个 HTTP 端点挂在 /api/secret-input 下,只接受 loopback 或已认证调用方。卡片有两种渲染:阻塞时的 overlay,和一个自包含答页。
request_secret 阻塞等人并返回一次性 ref。secret_exec 在进程内替换占位符后执行命令。secret_export 把值写入宿主加密 env 存储。
一道中间件在工具结果进入 transcript、记忆和磁盘卸载路径之前改写它,作用于所有工具的结果。
花掉 ref 之前弹确认卡,显示完整命令、工作目录或 env 名。控制字符转义显示,超过 4000 字符的命令在开卡前拒绝。
QwenPaw 2.2.2 上实测 secret_exec 执行时宿主审批列表为空,宿主不拦插件工具,所以这道闸在插件里。
确认卡提供知情与可见性,不构成沙箱:同机 loopback 进程可以读取待确认项并自行批准。短于 8 字符的值不做出站擦洗。
宿主版本窗口为 QwenPaw 2.1.0 到 2.99.0 之前,使用宿主自带的 Python 3.12。三个工具安装后默认 disabled,要在 agent 设置里启用。