@coze/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +408 -45
- package/bin/postinstall.js +77 -0
- package/lib/cli.js +3 -3
- package/lib/fetch-client-CgQGE-CR.js +1 -0
- package/lib/index-DN7-Fdfx.js +1 -0
- package/lib/send-message.worker.js +1 -1
- package/lib/session-task-refresh.worker.js +1 -1
- package/lib/task-worker-Bt8hYeP2.js +1 -0
- package/package.json +13 -8
- package/skills/manifest.json +25 -0
- package/skills/using-coze-cli/SKILL.md +447 -0
- package/skills/using-coze-cli/coze-claw/MODULE.md +189 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-agent-routing.md +45 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-artifacts.md +52 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-async-followup.md +266 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-message.md +176 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-podcast.md +73 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-ppt.md +78 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-progress.md +112 -0
- package/skills/using-coze-cli/coze-claw/references/coze-claw-session.md +144 -0
- package/skills/using-coze-cli/coze-code/MODULE.md +326 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-db.md +544 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-deploy.md +258 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-domain.md +73 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-env.md +82 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-git.md +189 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-message.md +240 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-model.md +51 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-preview.md +33 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-project.md +222 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-repo.md +296 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-skill.md +121 -0
- package/skills/using-coze-cli/coze-code/references/coze-code-tools.md +47 -0
- package/skills/using-coze-cli/coze-file/MODULE.md +46 -0
- package/skills/using-coze-cli/coze-file/references/coze-file-upload.md +59 -0
- package/skills/using-coze-cli/coze-generate/MODULE.md +84 -0
- package/skills/using-coze-cli/coze-generate/references/coze-generate-audio.md +105 -0
- package/skills/using-coze-cli/coze-generate/references/coze-generate-image.md +80 -0
- package/skills/using-coze-cli/coze-generate/references/coze-generate-video.md +124 -0
- package/lib/fetch-client-CWYDGe9Z.js +0 -1
- package/lib/index-BC9PFu7i.js +0 -1
- package/lib/task-worker-CxZeBKqU.js +0 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coze-claw
|
|
3
|
+
version: 0.2.0-alpha.740728
|
|
4
|
+
description: "Coze Claw Session 会话工作流:创建/找回 claw session、发送 session message、监听回复、查询后台 progress、处理文件/PPT/播客产物。当用户需要使用 coze session * 任意命令时触发。"
|
|
5
|
+
metadata:
|
|
6
|
+
requires:
|
|
7
|
+
bins: ["coze"]
|
|
8
|
+
cliHelp: "coze session --help"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Coze Claw Session 工作流
|
|
12
|
+
|
|
13
|
+
> **前置条件:** 先阅读 [`../SKILL.md`](../SKILL.md) 了解认证、全局参数、输出格式和错误处理。
|
|
14
|
+
> **上下文说明:** `coze session *` 跳过 org/space check,不要求先执行 `coze org use` 或 `coze space use`。只需确保 token 有效,并通过 `coze session status` 解析当前 claw。
|
|
15
|
+
> **执行前必做:** 从下方命令分组定位 reference,并先阅读对应 reference。涉及长任务 follow-up 时,再读 [`coze-claw-async-followup.md`](references/coze-claw-async-followup.md)。
|
|
16
|
+
|
|
17
|
+
## 核心概念
|
|
18
|
+
|
|
19
|
+
- **claw_id**:当前账号可用的 claw 实例,通常由 `coze session status` 解析并缓存。
|
|
20
|
+
- **session_id**:一条 claw chat 会话,CLI 会把最近一次成功使用的 session 持久化到本地,供后续 message/watch/replies/podcast/ppt edit 默认复用。
|
|
21
|
+
- **message_id**:用户提交的请求消息 ID,用于 `replies` 补偿查询。
|
|
22
|
+
- **answer_message_id**:assistant 回复消息 ID,用于对齐流式回复和最终回复。
|
|
23
|
+
- **progress_id**:claw 后台任务 ID,用于 progress 查询/监听。
|
|
24
|
+
- **file_uri**:平台内部文件引用,不能直接下载。
|
|
25
|
+
- **file_url**:可下载或可直接交付的文件 URL。
|
|
26
|
+
|
|
27
|
+
## Agent 快速执行顺序
|
|
28
|
+
|
|
29
|
+
1. **检查认证/claw**:`coze session status --format json`。
|
|
30
|
+
2. **优先复用本地默认 session**:除非用户明确要求“新建话题/新增话题/开新会话”,否则先执行 `coze session current --format json` 读取本地默认 `session_id`。
|
|
31
|
+
3. **检查指定 session runtime**:已有 `session_id` 时执行 `coze session status -s <session_id> --format json`。
|
|
32
|
+
4. **找回 / 切换 session,再决定是否创建**:如果本地没有可用的默认 `session_id`,先 `list` 找最近一个可复用 session,并用 `coze session use <session_id> --format json` 切换;只有用户明确要求新开话题,或确实没有可复用 session 时才 `create`。
|
|
33
|
+
5. **发送消息**:短任务用 `message --wait`;长任务用 `message` 无 `--wait` 获取 `message_id`,再 `watch/replies`。
|
|
34
|
+
6. **后台任务**:出现 `progress_id` 后,立即把它视为长任务句柄;如果 CLI 已返回 `task_id`,优先转 `session task show/refresh/watch`,并同时保留 `session_id`、`message_id`、`progress_id`。
|
|
35
|
+
7. **产物处理**:普通文件走 `file`;PPT 走 `ppt`;播客先查 voice,再用 `podcast message`。
|
|
36
|
+
|
|
37
|
+
## 用户回传闭环
|
|
38
|
+
|
|
39
|
+
- `message_id`、`progress_id`、`task_id`、`status=finished` 都只是恢复和编排主键,不是最终要回给用户的内容。
|
|
40
|
+
- 短任务:读取 `reply_completed.content/files` 后,必须把正文或文件链接回给用户。
|
|
41
|
+
- 长任务前置回复:如果同一轮在转入 `progress/task` 之前,已经通过 `reply_update` 或 `reply_completed` 产出了明确的说明性回复,必须先把这段内容回给用户,再继续后台跟进。
|
|
42
|
+
- 不要只保留 `progress_id` / `task_id` 而丢掉这段首条回复。
|
|
43
|
+
- 长任务:`task/progress` 进入终态后,必须再取最终 reply。
|
|
44
|
+
- 推荐:`coze session replies <message_id> -s <session_id> --format json`
|
|
45
|
+
- 兜底:读取终态 `session task` 快照里的 `reply_content`、`artifacts`
|
|
46
|
+
- 禁止只回复“已发送”“已完成”“耗时 xx s”而不附带实际 reply。
|
|
47
|
+
|
|
48
|
+
## Session 复用原则
|
|
49
|
+
|
|
50
|
+
- 默认复用最近一次成功使用的 `session_id`。
|
|
51
|
+
- 可用 `coze session current --format json` 查看当前本地默认 session。
|
|
52
|
+
- 可用 `coze session use <session_id> --format json` 显式切换默认 session。
|
|
53
|
+
- 只有用户明确说“新建话题”“新增话题”“开一个新会话”“不要沿用之前上下文”时,才主动创建新 session。
|
|
54
|
+
- 如果最近 `session_id` 不可用,再退回 `coze session list --limit 20 --format json` 找最近一个可复用 session。
|
|
55
|
+
- 只有“用户明确要求新建”或“确实找不到可复用 session”这两种情况,才执行 `coze session create --format json`。
|
|
56
|
+
|
|
57
|
+
## 长任务 follow-up 原则
|
|
58
|
+
|
|
59
|
+
- 命中 `task_id` / `progress_id` 后,不要把“继续盯结果”绑定在当前 agent 进程上。
|
|
60
|
+
- 如果当前宿主支持 schedule/job/workflow,并且 Agent 能直接调用,必须在同一回合自动创建独立的 follow-up 定时任务去轮询 `coze session task refresh/show`,直到任务进入终态。
|
|
61
|
+
- 如果当前宿主不支持,或 Agent 当前无法真正创建 follow-up 定时任务,必须在同一回合明确告知用户“当前还没有创建后台 follow-up 任务”,并给出下一步选项。
|
|
62
|
+
- follow-up task 至少要保存:
|
|
63
|
+
- `taskId`
|
|
64
|
+
- `replyTarget`
|
|
65
|
+
- `sessionId`、`messageId`、`progressId` 这类 Coze task 元数据,优先在 follow-up 执行时通过 `task show/refresh` 现查,不要重复持久化。
|
|
66
|
+
- `dedupeKey`、`notifiedAt`、`notifyStatus` 只在宿主没有现成幂等/状态能力时才额外保存。
|
|
67
|
+
- 终态后必须在原消息上下文回复用户,而不是换一个新地方通知。
|
|
68
|
+
- 禁止在没有真正创建 follow-up task 的情况下,对用户说“我继续盯着”“完成后自动回你”“我会持续跟进到结束”。
|
|
69
|
+
- 如果没有创建 follow-up task,可提供的下一步至少包括:
|
|
70
|
+
- 当前回合继续前台代查
|
|
71
|
+
- 提醒用户当前可以创建后台定时轮询任务(如果宿主支持后续补建)
|
|
72
|
+
- 具体数据契约、轮询规则、原地回复策略见 [`coze-claw-async-followup.md`](references/coze-claw-async-followup.md)。
|
|
73
|
+
|
|
74
|
+
## 标准工作流
|
|
75
|
+
|
|
76
|
+
### 短任务:同步等待当前 turn
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
coze session create --format json
|
|
80
|
+
|
|
81
|
+
coze session message "请分析这份需求" \
|
|
82
|
+
-s <session_id> \
|
|
83
|
+
--wait \
|
|
84
|
+
--timeout 120000 \
|
|
85
|
+
--format json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`message --wait --format json` 是事件流,必须按事件/行解析。
|
|
89
|
+
|
|
90
|
+
### 长任务:提交与监听分离
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
coze session message "执行这个长任务" -s <session_id> --format json
|
|
94
|
+
coze session watch -s <session_id> --timeout 120000 --format json
|
|
95
|
+
coze session replies <message_id> -s <session_id> --format json
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
优先记录 `session_id` 和 `message_id`,这是恢复流程的主键。
|
|
99
|
+
|
|
100
|
+
## 意图 → 命令索引
|
|
101
|
+
|
|
102
|
+
| 意图 | 推荐命令 | Reference |
|
|
103
|
+
|------|---------|-----------|
|
|
104
|
+
| 检查 token/claw | `coze session status` | [session](references/coze-claw-session.md) |
|
|
105
|
+
| 查看当前默认 session | `coze session current` | [session](references/coze-claw-session.md) |
|
|
106
|
+
| 切换当前默认 session | `coze session use <session_id>` | [session](references/coze-claw-session.md) |
|
|
107
|
+
| 检查指定 session runtime | `coze session status -s <session_id>` | [session](references/coze-claw-session.md) |
|
|
108
|
+
| 新建 claw session | `coze session create` | [session](references/coze-claw-session.md) |
|
|
109
|
+
| 找回已有 session | `coze session list` | [session](references/coze-claw-session.md) |
|
|
110
|
+
| 发送消息并等待回复 | `coze session message --wait` | [message](references/coze-claw-message.md) |
|
|
111
|
+
| 长任务提交与监听分离 | `coze session message` + `coze session watch` | [message](references/coze-claw-message.md) |
|
|
112
|
+
| 超时/断线后补偿查询 | `coze session replies <message_id>` | [message](references/coze-claw-message.md) |
|
|
113
|
+
| 查询本地可恢复长任务 | `coze session task list/show/refresh/watch` | [progress](references/coze-claw-progress.md) |
|
|
114
|
+
| 查询后台任务 | `coze session progress list/show/poll/watch` | [progress](references/coze-claw-progress.md) |
|
|
115
|
+
| 下载回复文件 | `coze session file download <file_url>` | [artifacts](references/coze-claw-artifacts.md) |
|
|
116
|
+
| 处理 PPT 产物 | `coze session ppt *` | [ppt](references/coze-claw-ppt.md) |
|
|
117
|
+
| 选择播客 voice | `coze session podcast voice list` | [podcast](references/coze-claw-podcast.md) |
|
|
118
|
+
| 发送播客消息 | `coze session podcast message` | [podcast](references/coze-claw-podcast.md) |
|
|
119
|
+
|
|
120
|
+
## 命令分组
|
|
121
|
+
|
|
122
|
+
| 命令分组 | 说明 | Reference |
|
|
123
|
+
|----------|------|-----------|
|
|
124
|
+
| `session status/create/current/use/list` | claw 状态、本地默认 session 与 session 生命周期 | [coze-claw-session.md](references/coze-claw-session.md) |
|
|
125
|
+
| `message/watch/replies` | 消息发送、流式监听、补偿查询 | [coze-claw-message.md](references/coze-claw-message.md) |
|
|
126
|
+
| `task list/show/refresh/watch/gc` | 本地可恢复长任务查询、刷新与清理 | [coze-claw-progress.md](references/coze-claw-progress.md) |
|
|
127
|
+
| `progress list/show/poll/watch` | claw 后台任务查询和监听 | [coze-claw-progress.md](references/coze-claw-progress.md) |
|
|
128
|
+
| `async follow-up` | 长任务登记、定时轮询、原地回复、幂等与 fallback | [coze-claw-async-followup.md](references/coze-claw-async-followup.md) |
|
|
129
|
+
| `file download` | 普通文件产物下载与交付 | [coze-claw-artifacts.md](references/coze-claw-artifacts.md) |
|
|
130
|
+
| `ppt info/pages/export/edit/share` | PPT 产物处理 | [coze-claw-ppt.md](references/coze-claw-ppt.md) |
|
|
131
|
+
| `podcast voice/message` | 播客 voice 查询与播客消息发送 | [coze-claw-podcast.md](references/coze-claw-podcast.md) |
|
|
132
|
+
| `agent routing` | `/coze-cli`、`/coze` 前缀路由、strip 规则、验收样例 | [coze-claw-agent-routing.md](references/coze-claw-agent-routing.md) |
|
|
133
|
+
|
|
134
|
+
## 长耗时任务处理
|
|
135
|
+
|
|
136
|
+
| 命令 | 默认行为 | 等待/超时建议 | 恢复命令 |
|
|
137
|
+
|------|----------|---------------|----------|
|
|
138
|
+
| `coze session message` | 提交后返回 `message_id` | 推荐 Agent 默认使用 | `replies <message_id>` / `watch` |
|
|
139
|
+
| `coze session message --wait` | 阻塞并输出事件流 | 必须加 `--timeout` | 有 `message_id` 则 `replies`,否则 `watch/status/list` |
|
|
140
|
+
| `coze session watch` | 持续监听 websocket | 必须加 `--timeout` | 再次 `watch` 或查 `progress list` |
|
|
141
|
+
| `coze session task watch` | 持续观察本地 task 快照 | 必须加 `--timeout` | `task refresh <task_id>` / `replies <message_id>` |
|
|
142
|
+
| `coze session progress watch` | 持续监听 progress | 必须加 `--timeout` | `progress poll <progress_id>` |
|
|
143
|
+
| `coze session progress poll` | 单次查询 | 适合脚本循环 | 查不到按 `finished` 处理 |
|
|
144
|
+
|
|
145
|
+
补充规则:
|
|
146
|
+
|
|
147
|
+
- `message --wait` 一旦返回 `progress_id`,就不要把它继续当作“同一条同步回复”处理。
|
|
148
|
+
- 对 Agent 而言,`progress_id` 就是当前版本最稳定的长任务句柄。
|
|
149
|
+
- 如果 `message --wait` 同时返回了 `task_id`,优先改走:
|
|
150
|
+
- `coze session task show <task_id> --format json`
|
|
151
|
+
- `coze session task refresh <task_id> --format json`
|
|
152
|
+
- `coze session task watch <task_id> --timeout <ms> --format json`
|
|
153
|
+
- `task_id` 是 CLI 本地恢复点,`progress_id` 仍然是服务端长任务句柄;两者都要保留。
|
|
154
|
+
- `task` 进入终态后,再用 `replies <message_id>` 回查最终回复或产物;至少也要读取 task 快照里的 `reply_content` / `artifacts` 并回给用户。
|
|
155
|
+
|
|
156
|
+
## 常见错误速查(Claw 专用)
|
|
157
|
+
|
|
158
|
+
| 症状/误用 | 一句话修复 |
|
|
159
|
+
|----------|------------|
|
|
160
|
+
| token 失效或未登录 | 先 `coze auth status`,必要时登录;多步处理见“恢复策略速查”。 |
|
|
161
|
+
| 未记录 `session_id` | 先 `current` 看本地默认;没有再 `list` 找回,必要时 `use` 切换。 |
|
|
162
|
+
| `message --wait` 超时 | 有 `message_id` 走 `replies`;否则看“恢复策略速查”。 |
|
|
163
|
+
| 对事件流整段 `JSON.parse()` | 改为按行/事件处理。 |
|
|
164
|
+
| `progress_id` 查不到 | 用 `progress poll` 缺失即 finished 的语义,再回查结果。 |
|
|
165
|
+
| 把 `file_uri` 当 `file_url` 下载 | 先解析为 `file_url`;PPT 走 `ppt info/export/share`。 |
|
|
166
|
+
| 监听命令没有 `--timeout` | 补 `--timeout`,避免 Agent 挂死。 |
|
|
167
|
+
|
|
168
|
+
## 恢复策略速查
|
|
169
|
+
|
|
170
|
+
| 场景 | Agent 执行步骤 |
|
|
171
|
+
|------|----------------|
|
|
172
|
+
| token 不可用 | 先 `coze auth status`;未登录或过期时引导 `coze auth login`;成功后重试 session 命令。 |
|
|
173
|
+
| 没有 `session_id` | 先 `coze session current --format json`;无默认时执行 `coze session list --limit 20 --format json` 找回,必要时 `coze session use <session_id>`;只有确实没有可复用 session 时才 `create`。 |
|
|
174
|
+
| 只知道历史上下文但没有 session | 执行 `coze session list --format json`,必要时用 `--offset` 分页找回。 |
|
|
175
|
+
| `message --wait` 超时 | 如果已记录 `message_id`,执行 `coze session replies <message_id> -s <session_id> --format json`;否则执行 `watch -s <session_id>` 或 `status -s <session_id>`。 |
|
|
176
|
+
| `watch` 超时但 session 仍 working | 再次执行 `watch -s <session_id> --timeout <ms>`;或查 `progress list` 判断是否转为后台任务。 |
|
|
177
|
+
| 有 `task_id` | 优先 `task show/refresh/watch`;必要时再退回 `progress poll/watch` 与 `replies`。 |
|
|
178
|
+
| 有 `progress_id` 没有最终产物 | 视为长任务恢复流程:优先 `task refresh/watch` 或 `progress poll/watch` 到 finished,再用 `replies <message_id>` 回查。 |
|
|
179
|
+
| 有 `file_url` | 直接 `coze session file download <file_url>`,或把 `file_url` 作为在线链接交付。 |
|
|
180
|
+
| 只有 `file_uri` | 不能直接下载;用对应能力解析。PPT 使用 `ppt info/export/share`。 |
|
|
181
|
+
| 监听输出解析困难 | 改用非监听命令:`message` 无 `--wait`、`replies`、`progress poll/show`。 |
|
|
182
|
+
|
|
183
|
+
## Agent 禁止行为
|
|
184
|
+
|
|
185
|
+
- 不要对 `message --wait`、`watch`、`progress watch` 的输出整段 `JSON.parse()`。
|
|
186
|
+
- 不要执行监听命令但不设置 `--timeout`。
|
|
187
|
+
- 不要丢失 `session_id`、`message_id`、`progress_id`。
|
|
188
|
+
- 不要把 `file_uri` 当作 `file_url` 下载。
|
|
189
|
+
- 不要只返回本地下载路径作为最终交付,除非用户明确只要本机路径。
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Agent routing contract
|
|
2
|
+
|
|
3
|
+
## 路由目标
|
|
4
|
+
|
|
5
|
+
- `/coze-cli`:显式命中 Coze CLI skill
|
|
6
|
+
- `/coze`:`/coze-cli` 的短别名,行为完全一致
|
|
7
|
+
|
|
8
|
+
## 适用范围
|
|
9
|
+
|
|
10
|
+
- 此规则适用于所有 Claw 子模块,不只限于 `session message`
|
|
11
|
+
- 只要最终会把用户正文转发到 Claw,会消费同一份规范化结果的链路都应遵守
|
|
12
|
+
- 当前至少覆盖:
|
|
13
|
+
- 普通消息链路:[`coze-claw-message.md`](coze-claw-message.md)
|
|
14
|
+
- PPT 场景:[`coze-claw-ppt.md`](coze-claw-ppt.md)
|
|
15
|
+
- 播客场景:[`coze-claw-podcast.md`](coze-claw-podcast.md)
|
|
16
|
+
|
|
17
|
+
## 规范化规则
|
|
18
|
+
|
|
19
|
+
1. 只移除首个路由 token
|
|
20
|
+
2. 保留剩余正文中的所有业务 token
|
|
21
|
+
3. 不改写正文中的中间 `/coze-cli`
|
|
22
|
+
4. 不吞掉 `@PPT`、`@播客`、文件引用、引号和换行
|
|
23
|
+
|
|
24
|
+
## 正例
|
|
25
|
+
|
|
26
|
+
- 输入:`/coze-cli 制作一个介绍潮汕美食的 PPT`
|
|
27
|
+
输出正文:`制作一个介绍潮汕美食的 PPT`
|
|
28
|
+
- 输入:`/coze-cli @PPT 制作介绍海南美食的 PPT`
|
|
29
|
+
输出正文:`@PPT 制作介绍海南美食的 PPT`
|
|
30
|
+
- 输入:`/coze 制作一个冒泡排序 markdown`
|
|
31
|
+
输出正文:`制作一个冒泡排序 markdown`
|
|
32
|
+
|
|
33
|
+
## 反例
|
|
34
|
+
|
|
35
|
+
- 错误:把 `/coze-cli` 原样发给 `coze session message`
|
|
36
|
+
- 错误:移除 `@PPT`
|
|
37
|
+
- 错误:移除 `@播客`
|
|
38
|
+
- 错误:把正文里的 `/coze-cli` 全局替换掉
|
|
39
|
+
|
|
40
|
+
## 最小验收样例
|
|
41
|
+
|
|
42
|
+
1. 不带前缀的自然语言,允许模型自行命中 skill,但不保证确定性
|
|
43
|
+
2. 带 `/coze-cli` 的请求,必须命中 skill
|
|
44
|
+
3. 命中后真正发给 Claw 的 message 不包含 `/coze-cli`
|
|
45
|
+
4. 同一规则适用于 `@PPT`、`@播客` 等子模块入口
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# claw artifact commands
|
|
2
|
+
|
|
3
|
+
> **前置条件:** 先阅读 [`../../SKILL.md`](../../SKILL.md) 和 [`coze-claw-message.md`](coze-claw-message.md)。
|
|
4
|
+
|
|
5
|
+
本文档覆盖普通 session 产物处理。PPT 产物见 [`coze-claw-ppt.md`](coze-claw-ppt.md)。
|
|
6
|
+
|
|
7
|
+
## 核心区别
|
|
8
|
+
|
|
9
|
+
| 字段 | 含义 | 处理方式 |
|
|
10
|
+
|------|------|----------|
|
|
11
|
+
| `file_url` | 可下载或可直接交付的 URL | 可传给 `file download` |
|
|
12
|
+
| `file_uri` | 平台内部文件引用 | 不能直接下载,需要先解析 |
|
|
13
|
+
|
|
14
|
+
Agent 不要猜测 `file_uri` 的公网 URL。
|
|
15
|
+
|
|
16
|
+
## file download
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
coze session file download "<file_url>" --format json
|
|
20
|
+
coze session file download "<file_url>" --output-path ./downloads/result.md --format json
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
关键输出:
|
|
24
|
+
|
|
25
|
+
| 字段 | 含义 |
|
|
26
|
+
|------|------|
|
|
27
|
+
| `status` | `saved` |
|
|
28
|
+
| `path` | 本地保存路径 |
|
|
29
|
+
| `filename` | 文件名 |
|
|
30
|
+
| `size` | 文件大小 |
|
|
31
|
+
| `url` | 原始下载 URL |
|
|
32
|
+
|
|
33
|
+
如果用户需要在线链接,已有 `file_url` 时可直接返回它。不要只返回本地路径,除非用户明确只需要本机文件。
|
|
34
|
+
|
|
35
|
+
## 普通文件链路
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
reply_completed.files[].file_url
|
|
39
|
+
-> coze session file download <file_url>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
如果回复中只有 `file_uri`:
|
|
43
|
+
|
|
44
|
+
- 普通回复产物需要先通过 session 文件 URL 解析逻辑或后续命令拿到 `file_url`。
|
|
45
|
+
- PPT 类 `file_uri` 交给 [`coze-claw-ppt.md`](coze-claw-ppt.md)。
|
|
46
|
+
- 不要直接把 `file_uri` 拼成 URL。
|
|
47
|
+
|
|
48
|
+
## 上传和下载边界
|
|
49
|
+
|
|
50
|
+
- 上传本地输入文件给 session message:使用 `coze session message --file` 或正文 `@<path>`。
|
|
51
|
+
- 下载 session 回复产物:使用 `coze session file download <file_url>`。
|
|
52
|
+
- 对用户交付产物:优先返回在线 `file_url`;如果需要本地落盘,再给出下载后的 `path`。
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# claw async follow-up
|
|
2
|
+
|
|
3
|
+
> **前置条件:** 先阅读 [`coze-claw-message.md`](coze-claw-message.md) 和 [`coze-claw-progress.md`](coze-claw-progress.md)。
|
|
4
|
+
|
|
5
|
+
当 `coze session message --wait` 或 `coze session message` 命中长任务后,Agent 不应依赖“当前这次对话进程还在”去等待终态。优先做法是登记一个独立的 follow-up 定时任务,周期刷新 `session task` 状态,任务完成后再在原消息上下文回复用户。
|
|
6
|
+
|
|
7
|
+
## 适用场景
|
|
8
|
+
|
|
9
|
+
- OpenClaw + 飞书:用户在飞书里发消息,长任务完成后仍然回飞书原位置
|
|
10
|
+
- 宿主支持 cron / delayed job / background workflow / schedule
|
|
11
|
+
- 当前回合只适合先 ACK,再后台继续跟进
|
|
12
|
+
|
|
13
|
+
## 核心原则
|
|
14
|
+
|
|
15
|
+
1. **ACK 和 follow-up 分离**
|
|
16
|
+
- 当前回合负责快速确认“已接单/已转后台处理”
|
|
17
|
+
- 后续通知由独立 follow-up task 负责
|
|
18
|
+
|
|
19
|
+
2. **回复位置必须持久化**
|
|
20
|
+
- `session_id` 只能恢复 Coze 任务
|
|
21
|
+
- `reply_target` 才决定最后把结果回到哪里
|
|
22
|
+
|
|
23
|
+
3. **在哪里收到,就在哪里回复**
|
|
24
|
+
- 飞书 DM 回 DM
|
|
25
|
+
- 飞书群消息回原群
|
|
26
|
+
- 飞书 topic/thread 回原 thread
|
|
27
|
+
- 飞书消息卡片优先更新原卡片
|
|
28
|
+
- 飞书 Drive 评论必须 reply comment
|
|
29
|
+
|
|
30
|
+
4. **必须防重**
|
|
31
|
+
- follow-up task 重试时不能重复通知用户
|
|
32
|
+
- 如果宿主已有任务幂等、去重或回执能力,优先复用,不要重复维护一套平行状态
|
|
33
|
+
|
|
34
|
+
5. **创建结果必须说实话**
|
|
35
|
+
- 真正创建了 follow-up task,才可以对用户说“已转后台持续跟进/完成后自动回你”
|
|
36
|
+
- 如果当前没有创建成功,必须在同一回合明确告知“当前还没有创建后台 follow-up 任务”
|
|
37
|
+
- 禁止把“我准备创建”“理论上可以创建”表述成“我已经在后台盯着”
|
|
38
|
+
|
|
39
|
+
## 执行分支
|
|
40
|
+
|
|
41
|
+
命中长任务后,Agent 必须先判断当前宿主是否真的支持并允许创建 follow-up 定时任务:
|
|
42
|
+
|
|
43
|
+
### 分支 A:当前就能创建
|
|
44
|
+
|
|
45
|
+
- 直接创建,不要把“要不要创建定时任务”再抛回给用户做默认选择题
|
|
46
|
+
- 当前回合应明确告诉用户:
|
|
47
|
+
- 已创建后台 follow-up 定时任务
|
|
48
|
+
- 结果会回到原消息上下文
|
|
49
|
+
- 当前这条回复只是 ACK,不是最终结果
|
|
50
|
+
|
|
51
|
+
### 分支 B:当前不能创建
|
|
52
|
+
|
|
53
|
+
- 必须在同一回合明确告诉用户:
|
|
54
|
+
- 当前还没有创建后台 follow-up 定时任务
|
|
55
|
+
- 原因是当前宿主不支持、权限不允许,或本轮无法实际调用该能力
|
|
56
|
+
- 必须立即给出下一步,而不是停在“我继续盯着”
|
|
57
|
+
- 可给出的下一步至少包括:
|
|
58
|
+
- 当前回合继续前台代查,查到终态再回复
|
|
59
|
+
- 如果宿主支持后续补建,提醒用户当前可以创建一个后台定时轮询任务
|
|
60
|
+
- 没有真正创建 follow-up task 时,禁止说“完成后自动回你”“我会持续盯到结束”
|
|
61
|
+
|
|
62
|
+
## 最小数据契约
|
|
63
|
+
|
|
64
|
+
建议在宿主侧登记一条尽量轻量的 follow-up 记录。`coze session task show/refresh --format json` 已经能按 `task_id` 反查 `session_id`、`message_id`、`progress_id`、`status`、`reply_content`、`artifacts`,所以不要把这些 Coze task 元数据再重复存一份。
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
type FollowUpJob = {
|
|
68
|
+
taskId: string;
|
|
69
|
+
replyTarget: ReplyTarget;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
type FollowUpJobWithHostState = FollowUpJob & {
|
|
73
|
+
notifyPolicy?: NotifyPolicy;
|
|
74
|
+
dedupeKey?: string;
|
|
75
|
+
notifiedAt?: number;
|
|
76
|
+
notifyStatus?: "pending" | "sent" | "failed";
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
type ReplyTarget = {
|
|
80
|
+
source:
|
|
81
|
+
| "feishu_dm"
|
|
82
|
+
| "feishu_group"
|
|
83
|
+
| "feishu_thread"
|
|
84
|
+
| "feishu_card"
|
|
85
|
+
| "feishu_drive_comment";
|
|
86
|
+
accountId?: string;
|
|
87
|
+
chatId?: string;
|
|
88
|
+
threadId?: string;
|
|
89
|
+
topicId?: string;
|
|
90
|
+
messageId?: string;
|
|
91
|
+
commentId?: string;
|
|
92
|
+
replyMode:
|
|
93
|
+
| "reply"
|
|
94
|
+
| "thread_reply"
|
|
95
|
+
| "update_card"
|
|
96
|
+
| "reply_comment";
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
type NotifyPolicy = {
|
|
100
|
+
pollIntervalSec: number;
|
|
101
|
+
maxWaitSec: number;
|
|
102
|
+
maxAttempts: number;
|
|
103
|
+
backoff: "fixed" | "linear" | "exponential";
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
必填约束:
|
|
108
|
+
|
|
109
|
+
- `taskId` 必须保留
|
|
110
|
+
- `replyTarget` 必须在当前回合就确定
|
|
111
|
+
|
|
112
|
+
可选宿主字段:
|
|
113
|
+
|
|
114
|
+
- 如果宿主没有内建幂等或任务状态,可使用 `FollowUpJobWithHostState` 额外保存 `dedupeKey`、`notifiedAt`、`notifyStatus`
|
|
115
|
+
- 如果宿主调度器需要显式参数,也可在 `FollowUpJobWithHostState` 中补 `notifyPolicy`
|
|
116
|
+
- 如果宿主本身已经有 cron/workflow 元数据、重试策略、任务状态机,就不要在 follow-up 记录里再镜像保存一套
|
|
117
|
+
|
|
118
|
+
恢复说明:
|
|
119
|
+
|
|
120
|
+
- `taskId` 足够恢复 Coze 长任务
|
|
121
|
+
- follow-up 执行时,如需 `session_id`、`message_id`、`progress_id`,先执行:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
coze session task refresh <task_id> --format json
|
|
125
|
+
coze session task show <task_id> --format json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
- 只有 `replyTarget` 这类“Coze CLI 无法帮你恢复的宿主上下文”才值得持久化
|
|
129
|
+
|
|
130
|
+
## 标准流程
|
|
131
|
+
|
|
132
|
+
### 1. 当前回合 ACK
|
|
133
|
+
|
|
134
|
+
当前回合只做三件事:
|
|
135
|
+
|
|
136
|
+
1. 把前置回复回给用户
|
|
137
|
+
2. 说明 follow-up 是否已经创建成功
|
|
138
|
+
3. 创建成功则登记 follow-up task;未创建成功则明确给出下一步选项
|
|
139
|
+
|
|
140
|
+
只有真正创建成功,才可以明确说“已登记后台跟进任务”。
|
|
141
|
+
|
|
142
|
+
### 2. 创建 follow-up task
|
|
143
|
+
|
|
144
|
+
follow-up task 至少要能执行:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
coze session task refresh <task_id> --format json
|
|
148
|
+
coze session task show <task_id> --format json
|
|
149
|
+
# message_id 和 session_id 从上一步 task refresh/show 输出中获取
|
|
150
|
+
coze session replies <message_id> -s <session_id> --format json
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
推荐顺序:
|
|
154
|
+
|
|
155
|
+
1. 先 `task refresh`
|
|
156
|
+
2. 从输出里读取 `status`,并按需取 `session_id`、`message_id`
|
|
157
|
+
3. 如果仍是 `running`,按宿主自己的 schedule/workflow 策略继续下一次调度
|
|
158
|
+
4. 如果是 `finished/failed/cancelled`,进入终态回复流程
|
|
159
|
+
|
|
160
|
+
### 3. 终态回复流程
|
|
161
|
+
|
|
162
|
+
优先级:
|
|
163
|
+
|
|
164
|
+
1. 如果 `task show/refresh` 已带 `reply_content` 或 `artifacts`,直接用它
|
|
165
|
+
2. 否则调用 `replies <message_id>`
|
|
166
|
+
3. 整理为最终用户可见结果
|
|
167
|
+
4. 通过 `replyTarget` 回复到原上下文
|
|
168
|
+
|
|
169
|
+
### 4. 回复成功后收口
|
|
170
|
+
|
|
171
|
+
- 如果宿主使用 `FollowUpJobWithHostState`,写入 `notifiedAt`
|
|
172
|
+
- 如果宿主使用 `FollowUpJobWithHostState`,写入 `notifyStatus=sent`
|
|
173
|
+
- 后续轮询不再重复发送
|
|
174
|
+
|
|
175
|
+
如果宿主已有任务完成回执或幂等键,也可以不额外维护这两个字段,只要能保证“同一终态结果只通知一次”即可。
|
|
176
|
+
|
|
177
|
+
## 飞书优先级规则
|
|
178
|
+
|
|
179
|
+
OpenClaw + 飞书场景,建议按这个顺序回复:
|
|
180
|
+
|
|
181
|
+
1. `feishu_drive_comment`
|
|
182
|
+
- 必须 `reply_comment`
|
|
183
|
+
2. `feishu_card`
|
|
184
|
+
- 优先 `update_card`
|
|
185
|
+
- 更新失败时退回 `thread_reply` 或普通 `reply`
|
|
186
|
+
3. `feishu_thread`
|
|
187
|
+
- 优先回原 thread/topic
|
|
188
|
+
4. `feishu_group`
|
|
189
|
+
- 回原群消息上下文
|
|
190
|
+
5. `feishu_dm`
|
|
191
|
+
- 回原 DM
|
|
192
|
+
|
|
193
|
+
禁止:
|
|
194
|
+
|
|
195
|
+
- 在飞书收到,最后却发到另一个渠道
|
|
196
|
+
- 原线程还能回复,却新开一条无关联消息
|
|
197
|
+
- 当前回合和 follow-up task 各发一次终态结果
|
|
198
|
+
|
|
199
|
+
## 轮询与重试建议
|
|
200
|
+
|
|
201
|
+
默认轮询建议:
|
|
202
|
+
|
|
203
|
+
- `pollIntervalSec`: 30
|
|
204
|
+
- `maxWaitSec`: 1800
|
|
205
|
+
- `maxAttempts`: 60
|
|
206
|
+
- `backoff`: `fixed`
|
|
207
|
+
|
|
208
|
+
这是一组调度建议,不要求一定落成 `FollowUpJob` 字段。能复用宿主自己的 cron / delayed job / workflow 配置时,优先复用。
|
|
209
|
+
|
|
210
|
+
更长任务可用:
|
|
211
|
+
|
|
212
|
+
- 前 600 秒(10 分钟)每 30 秒
|
|
213
|
+
- 之后每 120 秒(2 分钟)
|
|
214
|
+
|
|
215
|
+
如果宿主调度成本高,可改成:
|
|
216
|
+
|
|
217
|
+
- 前 3 次 15 秒
|
|
218
|
+
- 之后 60 秒固定间隔
|
|
219
|
+
|
|
220
|
+
## 幂等与 fallback
|
|
221
|
+
|
|
222
|
+
### 幂等
|
|
223
|
+
|
|
224
|
+
- 每次发送前先检查 `notifiedAt`
|
|
225
|
+
- 如果宿主已有幂等键,优先用宿主能力;否则可用 `dedupeKey=<source>:<taskId>:terminal`
|
|
226
|
+
- 如果发送 API 超时但结果未知,也不要立即重发全文;应先查发送结果或写入待人工确认状态
|
|
227
|
+
|
|
228
|
+
### fallback
|
|
229
|
+
|
|
230
|
+
如果原上下文失效,按这个顺序退化:
|
|
231
|
+
|
|
232
|
+
1. 原 thread/topic 不可用,退回同一 chat 的普通 reply
|
|
233
|
+
2. 原 card 无法更新,退回同一 thread reply
|
|
234
|
+
3. 原 comment 无法 reply,退回同一文档或同一会话中的普通通知
|
|
235
|
+
4. 仍失败时,记录 `notifyStatus=failed` 并保留人工补发所需上下文
|
|
236
|
+
|
|
237
|
+
禁止直接静默丢失通知。
|
|
238
|
+
|
|
239
|
+
## 推荐示例
|
|
240
|
+
|
|
241
|
+
### 示例 1:普通长任务
|
|
242
|
+
|
|
243
|
+
1. 当前回合收到 `task_id`
|
|
244
|
+
2. 先回复“任务已转后台处理,完成后我会在这里回复你”
|
|
245
|
+
3. 保存 `replyTarget=feishu_dm`
|
|
246
|
+
4. 创建 follow-up task
|
|
247
|
+
5. follow-up `task refresh`
|
|
248
|
+
6. 终态后读取 `reply_content`
|
|
249
|
+
7. 回原 DM
|
|
250
|
+
|
|
251
|
+
### 示例 2:PPT 长任务
|
|
252
|
+
|
|
253
|
+
1. 当前回合先回前置回复
|
|
254
|
+
2. 命中 `task_id`
|
|
255
|
+
3. 保存 `replyTarget=feishu_group` 或 `feishu_thread`
|
|
256
|
+
4. follow-up 定时轮询
|
|
257
|
+
5. 终态后读取 `artifacts`
|
|
258
|
+
6. 把 PPT 链接或导出产物回原消息位置
|
|
259
|
+
|
|
260
|
+
### 示例 3:飞书评论触发
|
|
261
|
+
|
|
262
|
+
1. 用户在文档评论区触发任务
|
|
263
|
+
2. 保存 `replyTarget=feishu_drive_comment`
|
|
264
|
+
3. follow-up 轮询 `task`
|
|
265
|
+
4. 终态后用评论回复接口回结果
|
|
266
|
+
5. 不再额外发一条普通 IM 消息
|