# HTTP 直调

优先用 `drowup.exe`；**CLI 没有的命令直接用 HTTP 调当前基址**（云端 `https://api.drowup.com`，本地先 `set-base-url http://localhost:8888`）。用户需求多种多样，不可能每条都做成 CLI。下面就是真实接口表，按需直调。

请求头（两种都行，CLI 两个都发）：

- `x-token: <access token>`（主推，来自 `drowup login` / Desktop oauth.json）
- `Authorization: Bearer <access token>`（兼容）
- `accept: application/json`
- 有 JSON 体时加 `content-type: application/json`

调用示例（PowerShell，**中文 JSON 不要用 `ConvertTo-Json` + `Invoke-RestMethod` 直接发**，编码会乱；优先 `drowup.exe`，或把 UTF-8 字节当 body）：

```powershell
Invoke-RestMethod -Uri "https://api.drowup.com/assetCanvas/product/update" -Method Post `
  -Headers @{ "x-token" = "<access token>"; "content-type" = "application/json; charset=utf-8" } `
  -Body ([System.IO.File]::ReadAllBytes("body.json"))
```

响应统一为 `{code:0, data:...}`；`code!=0` 时看 `msg`。不要向用户解释端口，不要打印密钥、代理密码、指纹配置。

网页 Network 里出现 `https://app.drowup.com/api/assetCanvas/...` 是前端 `VITE_BASE_API=/api` 的同源代理，Nginx 会剥掉 `/api`。CLI 打 `https://api.drowup.com/assetCanvas/...`，**不要再加 `/api`**。

## 云端真实接口一览

| 路径 | 方法 | 用途 | CLI 对应 |
| --- | --- | --- | --- |
| `/assetCanvas/workspaces` | GET | 画布列表 | `projects list` |
| `/assetCanvas/workspace/detail?id=` | GET | 画布详情（nodes/edges/version） | `projects get` |
| `/assetCanvas/templates?scope=` | GET | 工作流模板列表。`mine`/`personal`=我的；`public`/`system`/空=公共。个人列表常无完整 graphJson | `workflow list` |
| `/assetCanvas/template/graph?id=` | GET | 模板完整图谱（graphJson） | `workflow apply` 内部 |
| `/assetCanvas/nodes/batch` | POST | 节点/边批量写入。套模板用 `nodes.upsert` + `connections.upsert`，body 带 `projectUuid`/`version`/`requestId` | `node create/delete`；`workflow apply` |
| `/assetCanvas/runs` | POST | 触发生成 | `node run` |
| `/assetCanvas/runs` | GET | 运行列表 | `runs list` |
| `/assetCanvas/runs/{id}` | GET/POST cancel | 运行详情/取消 | `runs get/cancel` |
| `/assetCanvas/billing/summary` | GET | 画布用量/账单 | `billing summary` |
| `/aiModel/available?modality=` | GET | 模型目录（含 isDefault） | `model search` |
| `/assetCanvas/products` | GET | 产品列表 | `products list` |
| `/assetCanvas/product/detail?id=` | GET | 产品详情 | `products get` |
| `/assetCanvas/workspace/save` | POST | 新建画布。body `{ "name", "space": "personal" }`。拿到 `data.id` 立刻给用户画布链接 | `projects create` |
| `/assetCanvas/product/create` / `update` / `delete` | POST | 产品建/改/删 | 网页产品库 |
| `/assetCanvas/product/generate` / `workflows` / `openInCanvas` / `classifications` | POST/GET | **产品驱动**生成/打开画布（强制 productId）。画布级套个人模板不要走这里，用 `workflow apply` | 网页产品库 |
| `/agentWorkspace/getEnvironmentPool` | GET | 指纹环境池（脱敏后列表） | `env list` |
| `/agentWorkspace/bulkUpsertBrowserProfiles` | POST | 建/改指纹环境 | 网页环境页 |
| `/agentWorkspace/updateBrowserEnvironment` | PUT | 更新环境 | 网页环境页 |
| `/agentWorkspace/deleteBrowserEnvironment` | DELETE | 删除环境 | 网页环境页 |
| `/agentWorkspace/getEnvironmentGroups` 等 | GET/POST | 环境分组/移动 | 网页环境页 |
| `/material/upload` | POST(form) | 素材上传 | `upload` |

指纹窗口的打开/关闭不走云端：Host 工具 `drowup_listing_run`（及过渡 CLI）打 Desktop 上 `@drowup/dsh-fingerprint` 的环境 start|stop。Agent 上架不要单独调 `env start`，把 `env` 交给 `drowup_listing_run`。

上品 `ctx.ai` 打 Desktop 自己的模型或指纹插件本机 complete，用 DSH 已配置的模型。需要 Desktop 在跑。

`drowup_listing_run` 的 `products` 拉详情：工具在 Host 内用登录态 x-token 直打产品库，注入 `ctx.input`，不进员工对话。`products list` 预览仍直打云端 `/assetCanvas/products`。无 Desktop 的过渡 CLI invoke 才回退 CLI 拉品。

## 不要调用

- `/assetCanvas/cli/tokens`（产品 UI 已停用生成 Key；登录走 `drowup login`）
- `/agentWorkspace/getBrowserEnvironmentDefinition`（明文代理，禁止打到 stdout）
- 支付下单、后台管理、模拟登录
- 历史 OpenAPI session 一类接口（已废弃的旧路径，别再用那套 session API）
- 本机 `POST /skill/run`
- 扫描本机端口或拼接调试地址给用户
