# Visual Agent Phase 0 PoC

验证 "截屏 → 火山 VLM → 解析 → nut.js 点击/粘贴 → 发送" 端到端链路在微信 4.x 文件传输助手能不能跑通。

## 用什么模型

读取 `netaclaw_model_channel` id=2 的火山引擎配置(`doubao-seed-2-0-pro-260215`,2026-02 多模态)。

> 当前火山 channel **未配置 doubao-1.5-ui-tars-250428**。如果 Seed 2.0 Pro 成功率 ≥ 80%,直接进 Phase A;若 < 80%,先去火山控制台开 UI-TARS 模型,再用 `MODEL_NAME=doubao-1.5-ui-tars-250428` 环境变量重跑。

## 准备

1. **打开 PC 微信** 4.x 并登录
2. 在微信里**打开"文件传输助手"对话**(主窗口可见,不要最小化到托盘)
3. 让微信窗口在屏幕上**清晰可见**,最好最大化或大窗口
4. **关闭其他可能弹窗的程序**(防止抢前台)
5. 确保**仓库已 `pnpm install`** 过(backend 依赖已就绪,需要 `node-screenshots` / `@nut-tree-fork/nut-js` / `clipboardy` / `koffi` / `openai`)

## 安装 PoC 需要的额外依赖

PoC 用的几个原生模块当前不在 backend deps 里,先装上:

```bash
cd packages/backend
pnpm add node-screenshots @nut-tree-fork/nut-js clipboardy koffi
```

(这一步等于 plan v2 的 Task 1 — 提前做也无所谓,反正后续要装。)

## 跑 PoC

```bash
# 在仓库根目录
pnpm --filter @neta/backend exec tsx ../../tools/visual_agent_probe/run-once.ts 3
```

- 参数 `3` = 跑 3 次(快速验证用)
- 完整门禁验证应跑 `20`

启动后:
- 控制台打印环境信息和窗口句柄
- **倒计时 3 秒,期间不要碰键盘鼠标**
- 之后每次自动:Ctrl+1(聊天 tab)→ Ctrl+F(搜索)→ 输入"文件传输助手"→ 回车 → 截图 + VLM 验证已进群 → 粘贴 `[probe-i-ts]` → 回车 → 截图 + VLM 验证消息已发送
- 两次 VLM 调用 / 条
- 每条间 cooldown 3 秒

## 看什么

控制台最后会输出 Summary:

```
Summary
  total runs:        3
  successes:         3
  success rate:      100.0%
  ...
```

**门禁标准**:
- ✅ `success rate >= 80%` → 可进 Phase A,把脚本里录到的 VLM raw 输出转成 Task 3 的测试 fixtures
- ❌ `success rate < 80%` → STOP,讨论:
  - 换 `doubao-1.5-ui-tars-250428` 试一次(在火山控制台先开通)
  - 或换 Claude Sonnet 4.6 vision
  - 或调整 prompt
  - 或放弃视觉路线

## 原始报告

完整 raw results(含每次的动作 trace 和 VLM 原始输出)落盘到:
`docs/superpowers/followups/2026-05-14-visual-agent-poc-raw.json`

这份文件后续用来:
- 生成 Phase A Task 3 的 50+ fixture 测试用例
- 校验 spec §7.3 的成本估算表
- 失败模式分析

## 失败排查

| 失败状态 | 含义 | 怎么办 |
|---|---|---|
| `window-missing` | 没找到微信进程 | 确保微信已打开,窗口未最小化到托盘 |
| `verify-failed` (step 4) | Ctrl+F 搜索没生效 / 未进入文件传输助手 | 手动验一遍快捷键是否被微信支持;不行则改路线(直接点击) |
| `verify-failed` (step 7) | 消息确实没发出去 / VLM 没看到 | 看 trace 里 vlm-2 的 raw 输出,可能是 prompt 太严 |
| `model-failed` | VLM API 调用失败 | 检查 apiKey + baseUrl 是否对,网络是否能通火山 |
| `exception` | 截屏/键鼠/koffi 异常 | 看 error 字段 |
| `action-failed` | 模型输出无法解析 | 看 raw 输出,可能不是合法 JSON |
