Skip to content

PI 0.1.4(pi 1.3.0)· 设备桥 v2

Choose a tag to compare

@heikeyangle-code heikeyangle-code released this 19 Oct 11:10

引擎:@earendil-works/pi-coding-agent 1.3.0(与上一包相同,不含引擎升级)。

从 v0.1.3(313309f)到这里共 17 笔提交。这一版的主线是设备桥重做——工具面从 26 个砍到 7 个,四组能力被删掉,动作开始自带反馈。


设备桥 v2:26 个工具 → 7 个

原来那份工具面的问题很具体:26 个工具的描述合计 1.2 万字(≈4k token/轮),而其中大半是同一个能力的别名——ui / ui_dump / tap / swipe / input / key / screenshot 七个工具讲的是同一块屏幕,io / fs / files / files_list / download 五个讲的是同一批文件。

现在是一个工具一个闭集 action:

工具 action
android_status (无,常驻)
android_screen look / tap / type / swipe / key / wait / shot / steps
android_app list / launch / stop
android_files dirs / list / read / write / download / import / export
android_shell (无)
android_comm clipboard / notify / toast / vibrate / share / open / tts
android_device battery / torch / location / sensors / sensor

省下来的正是每轮都要付的那份钱:以前每个别名都各带一份 description + promptSnippet + promptGuidelines + 完整参数 schema,现在一个端点只付一次。合并丢掉的参数精校由每个 action 自己的 [BAD_PARAM] 补回来。

结果是提示词大幅变短,而能力一点没少。

动作即反馈:点一下就告诉你变了没有

这是这一版真正的加强点。以前「点一下输入框再打字」要三次工具调用(tap → dump → input),模型在两次调用之间看不到任何反馈,点错了也不知道。

现在 tap / type / swipe / key 执行后立刻做一次界面 diff,同一份结果里给出:

{
  "changed": true,
  "screen": "com.tencent.mm",
  "added": ["发送"], "removed": [], "updated": ["输入框"],
  "text": "1 个节点出现:发送"
}
  • 界面真变了 → 列出新增/消失/变化的节点;
  • 界面没变 → changed: false,并明说「界面没变,可能没点中」,模型可以直接重试,而不是接着往下错;
  • 没有上一屏可比 → changed: null,如实说「还没有上一屏可对比」,不编一个结论。

steps:一次调用连做八步

{ "action": "steps", "steps": [
  { "action": "tap", "text": "搜索框" },
  { "action": "type", "text": "天气" },
  { "action": "key", "key": "enter" }
] }

每一步先校验 action 再动手,逐步带自己的 diff,遇错即停并说清停在第几步。上限 8 步。这样一段确定的操作序列不用再来回四次。

删掉四组能力

VPN / 输入法 / 投屏 / 自动化规则 —— 整组删除,连同它们的服务类、清单项、提示词段落、技能正文与文档条目一起清干净:

  • PiVpnService.kt、PiInputMethodService.kt、PiCaptureService.kt、PiScreenCapture.kt、PiAutomation.kt 全部移除
  • pi_input_method.xml 移除
  • 最后两处 allows / android_say 残留清掉

升级后这四项不可用,是设计决定,不是回归。

设备能力屏:1303 行 → 148 行

用户原话是「说明文字太多了」。现在收成四个状态点 + 三行开关 + 一个高级折叠,删掉 allows 字段。整个文件的净变化是 −1147 行。

权限闸门

  • danger.ts 的级别表对齐 7 个工具
  • 「按调用才危险」的两处改由新的 approvalRuleFor 判:android_shell 的 7 条不可逆命令,以及 android_app(action="stop")
  • 记住的粒度是规则 id,不是工具名
  • ShellPolicyMirrorCheck 的两条集合判据仍成立(工具名 7 = 7,硬黑名单两侧都是空)

模型可见文字统一英文

  • description 每条 ≤60 字符,只写「是什么 + action 列表」
  • promptSnippet ≤20 字符,不与 description 重复
  • promptGuidelines 只留 3 条安全规则(stop 会丢未保存内容、shell 受策略守卫、不可逆动作会二次确认)
  • 工具返回的正文仍是中文——那是给工具卡上的人看的

技能按能力组裁剪

SKILL.md(23 行)+ references/ui.md + references/env.md,正文合计 52 行。只开 basic 时不写 ui.md、索引里也没有屏幕那一行;全关时不写并删目录。上一版写过、这一版不再有的附件在写新文件前主动 rm——pi 只按目录扫盘。

diff 卡:折叠态对齐工具卡

  • 删掉折叠态的第二行(「新增 N 行 · 删除 M 行」+ 一个不可点的"展开/收起"死标签)——前者把头行的 +N/−M 用中文复述一遍,零新信息
  • 去掉描边:工具卡早就不带描边了,diff 卡留着就成了并排时的唯一异类
  • 圆角 10 → 8(复用 TOOL_CARD_SHAPE),内边距改为工具卡同一套(横 10 / 纵 7),工具名加粗与头行一致

折叠态现在只有一行:工具名 + 路径 + +N + −M + chevron。

文档与 CI

  • 新增 docs/device-bridge-v2.md:v2 工具面与屏幕重构的设计契约(工具表、动作即反馈的返回形状、技能裁剪规则)
  • 工具表、技能表格、包列表、模型提示里的旧工具名全部同步到 v2 的 7 个
  • CI 触发收紧:纯 markdown / 截图 / 标志图改动不再触发完整构建(两个 targetSdk 变体 + ~65 MB 运行时装配)

构建信息

引擎 @earendil-works/pi-coding-agent 1.3.0(未变)
变体 sideload28(targetSdk 28,默认选这个)
架构 arm64
安装包 142,126,674 字节(135.5 MiB)
sha256 281a16dfe897487ff4ff185556599b08fad6e3e6a217373f7452a8fa289773d4
来源 CI run #427,commit 005dea49

同一密钥签名,可以覆盖安装,升级不丢数据。
注意:这一版删除了 VPN / 输入法 / 投屏 / 自动化规则四组能力,升级后不可恢复(回退需装回旧包)。