---
name: drowup
description: DrowUp 官方 Agent Skill。覆盖画布、产品库、员工上品；浏览器驱动来自官方指纹插件。用户请求安装或使用 DrowUp 时加载本技能。
---

# DrowUp

DrowUp 官方能力包。云端基址为 **`https://api.drowup.com`**。Agent 优先用本包 `{baseDir}/bin/drowup.exe`；CLI 没有的命令直接 HTTP 调云端（接口表见 `references/http.md`）。

命令风格：`projects create` / `node create -t --left --run`。建产品、建指纹环境在网页完成。请求头 **`x-token`**。

**原则：用户已经说了要做什么，就立刻做。不要先 `doctor`，不要先全量 `projects list` / `products list`，不要问先试哪件。**

## 主链路（按用户目标走最短路径）

用户没点名的步骤直接跳过。图生成完就在画布上，不要再走「收尾」。

```text
1 登录      立刻 `drowup login`（官网 OAuth）。Desktop 已头像登录则可复用 oauth.json
            用户说本地 → 先 set-base-url http://localhost:8888
2 画布      要新画布 → projects create <名> --json，立刻把 projectUrl 给用户（已绑定当前目录）
            点名已有画布 → project use <uuid>，立刻给 projectUrl
            不要先 projects list
3 建图      有个人工作流模板 → workflow apply <模板名>（不要走 product/openInCanvas）
            没有模板 → node create <名> -t image [--left 上游] [--prompt …] [--run]
            模型：-s <modelKey> 显式指定；不写就带 isDefault。
            写入的 modelId 不能是 0。返回 JSON 里核对 model.modelId > 0
            `--run` 会重读画布并把 model/modelId 带上 /runs，不要拆成「先 create 再 run」来规避计价报错
4 产品      用户已给产品 id → products get；不要把产品全文读进上下文
            上架不要手写 input.json
5 上架      Desktop 员工会话：每个环境一次 Host 工具 drowup_listing_run
            （env / products / skill=mock-listing|dianxiaomi-tiktok-listing / 默认草稿 params；续跑 resume: true）
            无 Desktop / Codex 调试：过渡 CLI invoke。默认草稿。禁止先 env start，禁止按产品循环
```

每步失败先查下方「报错对照」。**不要读源码**；CLI 没有的能力用 HTTP 直调，见 `references/http.md`。

## 报错对照（先看这里，别绕）

| 报错 / 现象 | 真实原因 | 处置 |
| --- | --- | --- |
| 不要粘贴密钥 | 登录改为官网 OAuth | 运行 `drowup login`，把终端里的授权链接发给用户打开；Desktop 已登录可直接复用 |
| 找不到 playwright-core（浏览器驱动） | 未装官方指纹插件，或插件未写出 path | 安装 `@drowup/dsh-fingerprint`（装上架员工会自动拉取）；或设 `DROWUP_PLAYWRIGHT_PATH` 指向 playwright-core 目录 |
| 节点「X」未指定模型 | 节点没有 model/modelId，或 modelId 是 0 | `node <名> -s model=<模型>` 重查目录；不要把 modelId 写成 0 |
| 该模型在当前套餐下尚未配置积分价格 | 一步式 `--run` 曾在图快照读到空 modelId 时去计价（服务端把「没模型」说成「没配价」）；或节点真没模型；或该模型确实没配价 | 先 `projects get` 看 `data.modelId` 是否 >0。有模型就 `node run <nodeId>`。仍报错才是真没配价 |
| 找不到模型「X」。可用：… | -s 传了不存在的 key | 按可用清单或 `model search` 结果重传 |
| 有 N 个同名节点「X」，请改用节点 id | 展示名重复 | 用 `projects get` 里的节点 id |
| -p/--project 缺少值 | 没给画布 UUID | `project use <uuid>` 绑定当前目录，或管道传上一个 `--run` 的 JSON |
| 访问密钥无效但刚 login 成功 | oauth.json 过期或 refresh 失败 | 重新 `drowup login`；升级 CLI。已登录后优先读 oauth.json |
| 环境已打开但 automation=false | 旧 Electron 队列残留；现已改走指纹插件 | Desktop 再跑同一条 `drowup_listing_run`；无 Desktop 才用过渡 CLI invoke |
| env start 报「请提供 --id」 | 没给名称或 profileId | Desktop 上品用 `drowup_listing_run` 的 env，不必先 start |
| 找不到环境 / 多个同名环境 | `--env` 对不上或命中多条 | `env list` 让用户点名；同名时改用 profileId |
| --params 后跟多个参数报「缺少值」 | 老语法只认一个 key=value | 写成 `--params a=1 b=2` |
| JSON.parse 报 `'\uFEFF'` | PowerShell 写文件带了 BOM | 用 pwsh 的 `>` 或 `Out-File -Encoding utf8NoBOM` |
| 桌面客户端没开 | 画布/产品不受影响 | 只有 env start/stop 和上架脚本需要客户端；提示用户打开 |

## 文档地图

先读本页主链路与报错对照。具体命令按表去对应文件，不要自己发明子命令。

| 文档 | 何时读 |
| --- | --- |
| `commands/login.md` | 登录、换 Key、改云端基址 |
| `commands/doctor.md` | 环境坏了才跑；不是开工门禁 |
| `commands/projects.md` | 新建个人画布、列画布、读节点与边、绑定目录 |
| `commands/workflow.md` | `drowup workflow list/apply` 套个人工作流模板 |
| `commands/node.md` | `drowup node create` 与 `node <名>` |
| `commands/group.md` | 普通分组 |
| `commands/model.md` | 选图/视频/文本/音频模型 |
| `commands/upload.md` | 上传参考图 |
| `commands/products.md` | 产品库 list/get |
| `commands/ai.md` | `ai ask` |
| `commands/env.md` | 指纹环境；Desktop 上品不要先 start |
| `commands/invoke.md` | 过渡 CLI：无 Desktop / Codex 调试才 invoke |
| `node-types/` | `-t text\|image\|video\|audio` |
| `examples/workflow/` | 登录、套模板、生图、上架（Desktop：`drowup_listing_run`） |
| `install/install.md` | 安装与更新；更新必须整目录先删再解压 |
| `references/canvas.md` | 画布命令摘要与节点数据契约 |
| `references/workflow-templates.md` | 工作流模板 = graphJson；productSlot / inputBinding |
| `references/skill-runner.md` | 员工市场上品 |
| `references/skill-authoring.md` | 团队自己写员工包技能 |
| `references/http.md` | HTTP 直调接口表与禁止清单 |

CLI 没有的命令：`session *`、`run`、`env create`。网页完成，或按 `references/http.md` HTTP 直调。`projects create` 与 `download` 可用。

## 安装

用户请求安装时自己做完，中间不要反复提问。装好后第一件事是登录；用户已经交代任务就登录完立刻做。

1. 下载官方 zip（URL 不含密钥），解压后顶层目录必须名为 `drowup`。
   - 装到**当前这个 Agent 实际加载本 skill 的目录**，也就是这份 `SKILL.md` 所在的 `{baseDir}`。不要按产品各装一份。
   - 本仓库开发环境的 `{baseDir}` 是仓库里的 `skills/drowup/`，那是源码树，不是用户安装目录，更新时不要删它。
2. 确认 `{baseDir}/bin/drowup.exe` 存在。浏览器驱动来自官方指纹插件，不随 CLI 分发。
3. 登录（官网 OAuth；禁止粘贴 API Key）：
   ```powershell
   "{baseDir}/bin/drowup.exe" login
   ```
   把终端打印的授权链接发给用户打开。若 Desktop 已用头像登录，命令会直接复用 `%APPDATA%\drowup\oauth.json`，不必再授权。不要弹出输入框，不要让用户贴 Key。
4. 用户已经说了要生成 / 上架 / 打开某画布 → **立刻按「最短路径」做**，不要再跑 doctor，不要列三张全表。

欢迎语只在用户**只要求安装、还没说任务**时用一句：已经装好并登录。把商品名、参考图、环境名或目标平台发我就开始。

## 更新

覆盖解压只会改同名文件，旧版独有文件会留下。更新必须按 `install/install.md`：**先删再解压** 整个 `drowup` 技能包目录。

1. 读 `https://static.drowup.com/skills/drowup-skill.json`（OSS CDN，和官网 `/cli` 同一清单），取 `skill` 字段，不要手拼旧 zip 路径。
2. 把 zip 下到临时目录。
3. 删除当前 `{baseDir}` 这个 `drowup` 文件夹，再解压到它的父目录（zip 带 `drowup/` 前缀）。用户没点名就不要动其它 Agent 里的副本。
4. 确认 `bin/drowup.exe` 还在。上架前确认已装官方指纹插件；怀疑环境坏了再 `doctor --json`。

登录态在 `%APPDATA%\drowup\`（`oauth.json`），不在技能包里，整目录替换不会掉登录。不要在技能包目录内部执行删除。只替换当前 `{baseDir}`。不要动本仓库开发用的 `skills/drowup/`。

## 登录

```powershell
"{baseDir}/bin/drowup.exe" login
"{baseDir}/bin/drowup.exe" set-base-url "https://api.drowup.com"
```

用户说本地：

```powershell
"{baseDir}/bin/drowup.exe" set-base-url "http://localhost:8888"
```

登录走官网 OAuth（`drowup login`）。stdout 仅为 `{"saved":true,"path":"...","via":"desktop"|"oauth"}`，不要复述 token。已登录后只认 `%APPDATA%\drowup\oauth.json`；Desktop 头像登录会写入同一份文件。不要生成或粘贴 API Key。

## 最短路径

新画布（不要 `projects list`；建完立刻给链接）：

```powershell
"{baseDir}/bin/drowup.exe" projects create 裂变主图 --json
"{baseDir}/bin/drowup.exe" workflow apply 印尼工作流 --json
"{baseDir}/bin/drowup.exe" node create 主图 -t image -s gpt-image-2 --prompt "白底主图" --run --json
```

有现成工作流模板时用 `workflow apply`，不要走 `product/openInCanvas`。套完再改产品白底图 URL、对生成节点 `node run`。没有模板时才 `node create`。

`projects create` 内部 POST `/assetCanvas/workspace/save`，返回 `projectUrl` 并绑定当前目录。本地网页 origin 是 `http://localhost:8080`。

已有画布：点名或 `project use` 后，有模板就 `workflow apply`，没有再 `node create`。返回 JSON 的 `model.modelId` 必须大于 0，不能是 0。

上架（Desktop 员工会话主路径：每个环境一条 Host 工具 `drowup_listing_run`，可并行，同一环境不要并发抢浏览器。参数名以目标技能说明书为准：店小秘上品用 `填完之后=草稿`，模拟上品用 `上架后状态=草稿`）：

```text
drowup_listing_run
  env: 环境名
  products: 5
  skill: mock-listing | dianxiaomi-tiktok-listing
  params: 上架后状态=草稿 或 填完之后=草稿
  resume: true   # 需要续跑时
```

无 Desktop / Codex 调试才用过渡 CLI（不要当 Desktop 员工主路径）：

```powershell
"{baseDir}/bin/drowup.exe" invoke scripts/index.cjs --env 环境名 --products 5 --params 填完之后=草稿 --json
```

只要开窗、不跑技能：

```powershell
"{baseDir}/bin/drowup.exe" env start --name 环境名 --wait --json
"{baseDir}/bin/drowup.exe" env stop --name 环境名 --json
```

其它：

```powershell
"{baseDir}/bin/drowup.exe" products get PRODUCT_ID --json
"{baseDir}/bin/drowup.exe" download -n 主图 --out ./out --json
"{baseDir}/bin/drowup.exe" ai ask "给商品属性「材质」填一个合理短值，只输出值本身"
```

细节分别见 `commands/` 与 `examples/workflow/`。

## 约束

- 优先 `drowup.exe`；CLI 没有对应命令时按 `references/http.md` 用 HTTP 直调
- 桌面客户端未运行时，画布、产品库仍可用；进店上架要先请用户打开桌面客户端
- Desktop 员工会话：用户点名环境后每个环境一条 `drowup_listing_run`（env / products / skill）。工具会自己开窗并复用已开窗口。不要先 `env start`，不要向用户要 CDP，不要扫描端口
- 禁止按产品循环调用。单个用 `productId` / `--product <id>`，批量用 `products` N 或 `all`
- 多个环境：每个环境一条 `drowup_listing_run`，不要「产品数 × 环境数」
- 无 Desktop / Codex 调试才用过渡 CLI invoke
- 建/改代理、建/改/删指纹环境在网页环境页完成，CLI 只 list/start/stop/status
- 不要把 access token 写入任何对外文本
- 未经用户确认不要正式提交商品；默认草稿 params
- 生成型节点禁止写入 `modelId=0`
