@optima-chat/optima-agent 0.9.14 → 0.9.16

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.
@@ -277,3 +277,51 @@ gen task get <task_id> # 查看任务详情
277
277
  gen task cancel <task_id> # 取消任务
278
278
  gen task retry <task_id> # 重试失败的任务
279
279
  ```
280
+
281
+ ## 错误处理(重要)
282
+
283
+ 所有 `gen` 命令在失败时会返回结构化错误。**不要把原始 `error_message`(可能是中文报错)直接抛给用户**——根据 `error_code` 字段决定应对策略。
284
+
285
+ ### 失败响应示例
286
+
287
+ ```json
288
+ {
289
+ "success": true,
290
+ "data": {
291
+ "task_id": "abc-123",
292
+ "status": "failed",
293
+ "error_code": "UPSTREAM_MAINTENANCE",
294
+ "retryable": true,
295
+ "error_message": "上游生成服务正在维护中,请稍后再试"
296
+ }
297
+ }
298
+ ```
299
+
300
+ 注意:`success: true` + `status: "failed"` 是任务执行完成但生成失败;`success: false` 才是 CLI 调用本身失败。两者都要按 `error_code` 处理。
301
+
302
+ ### 处理对照表
303
+
304
+ | `error_code` | 你应该做的 | 给用户的话术(参考) |
305
+ |---|---|---|
306
+ | `UPSTREAM_MAINTENANCE` | **不立即重试**。告知用户服务维护中,建议 5-10 分钟后再试 | "图片生成服务正在维护,建议 5-10 分钟后我再帮您试一次" |
307
+ | `CONTENT_POLICY_VIOLATION` | **改写 prompt** 去掉敏感/违规元素,自动重试**最多 1 次**。仍失败再交给用户 | "您的描述触发了内容审核,我换个说法重试:……" |
308
+ | `UPSTREAM_TIMEOUT` | 立即重试 1 次(静默) | (重试成功就别提;连续失败再说) |
309
+ | `UPSTREAM_RATE_LIMITED` | 等 30 秒后重试 1 次 | "请求频率过高,稍等几十秒再试" |
310
+ | `UPSTREAM_NETWORK` | 立即重试 1 次(静默) | (同 timeout) |
311
+ | `PROVIDER_INSUFFICIENT_CREDITS` | **不重试**。明确告诉用户问题不在他、不在他的余额 | "生成服务后端额度不足(与您账户余额无关),已记录" |
312
+ | `UPSTREAM_UNKNOWN` 或字段缺失 | **不重试**。把 `error_message` 透传给用户 | "图片生成失败:{error_message}" |
313
+
314
+ ### 通用规则
315
+
316
+ 1. **`retryable: true`** 的失败:自动重试**最多 1 次**,不要循环
317
+ 2. **`retryable: false`**:永远不重试,立即给用户结果
318
+ 3. 改写 prompt 重试时,**告诉用户你做了什么改动**(透明)
319
+ 4. `success: false`(CLI 本身报错)直接报给用户,不重试
320
+ 5. 没有 `error_code` 字段的旧版响应:当作 `UPSTREAM_UNKNOWN` 处理
321
+
322
+ ### 反面示例(不要这样做)
323
+
324
+ ❌ 把 `"维护中"` 三个字直接砸给用户
325
+ ❌ 任何失败都自动 retry 三五次造成账单浪费
326
+ ❌ `CONTENT_POLICY_VIOLATION` 时换汤不换药地原 prompt 重试
327
+ ❌ `PROVIDER_INSUFFICIENT_CREDITS` 时让用户去充值(这跟用户余额无关)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: video-edit
3
- description: "剪辑用户【已有的】口播视频——去除卡顿停顿让视频更流畅紧凑。
3
+ description: "剪辑用户【已有的】口播视频——去除卡顿停顿、NG 重拍、口头禅让视频更流畅紧凑。
4
4
 
5
5
  必备前提:用户已经有视频文件(拍好的、上传的、或给出文件路径)。
6
6
 
@@ -26,30 +26,50 @@ description: "剪辑用户【已有的】口播视频——去除卡顿停顿让
26
26
  只有当用户提到平台但**没说目标时长**时(如"剪成 TikTok"无时长),才追问"目标多长?"。
27
27
  其他情况**直接动手**,不要废话。
28
28
 
29
- ## 核心原则:一键出片,不满意再调
29
+ ## 核心原则:你是语义剪辑器
30
30
 
31
- 用户说"剪一下",你**直接出成片**,不要中途停下来问确认。像开拍 app 一样:上传 → 自动出片 → 不满意再调。
31
+ cut 工具**只能删静音**(>=0.25s 的停顿),它**永远删不了**这些:
32
+ - NG 重拍(重新说一遍同一句)
33
+ - 重复字("我我我",发声不停顿)
34
+ - 口头禅("嗯"/"啊"/"那个"/"就是")
35
+ - 跑题片段(语法完整但内容废)
32
36
 
33
- **不满意时的调整**:用户看完成片说"第X段不该删"/"XX那句话留着",你编辑 `cut_proposal.md`(去掉/加上 `#` 注释),重跑 `cut` + `subtitle`,几秒出新版。
37
+ **所以你必须自己审一遍 proposal**——你就是这个流程的语义剪辑器。如果跳过审片直接出片,成片会有大量 NG/口头禅/重复,用户会觉得"非常多卡顿"
34
38
 
35
39
  ## 你的内部流程
36
40
 
37
41
  ### 默认剪辑(剪 + 字幕,最常见)
38
42
 
39
- 一步到位,不要分步等确认:
43
+ 四步走:
44
+
45
+ ```bash
46
+ video-edit analyze <video>
47
+ ```
48
+
49
+ 读 `<video>.work/cut_proposal.md`。每行是一个短语,看每行决定保留还是删除:
50
+
51
+ - **删(行首加 `#`)**:
52
+ - 单独的口头禅 phrase:"嗯"/"啊"/"呃"/"那个"/"就是"/"对吧"/"然后那个"
53
+ - NG 重拍:相邻两行说同一件事但措辞稍变("我们要做的就是——我们要做的是"),**留最后一遍**(通常最干净)
54
+ - 字面重复:"我我我"/"那那那"
55
+ - 跑题/废话:与主题无关的旁白、自语、笑场
56
+ - 太短的连接词单独成行(如只有"那"/"嗯啊")
57
+ - **留**:所有有信息量的句子
58
+
59
+ 按上述规则编辑 proposal,保存。然后:
60
+
40
61
  ```bash
41
- video-edit both <video>
62
+ video-edit cut <video>
42
63
  video-edit subtitle <video>
43
64
  ```
44
65
 
45
- `both` = analyze + cut,一口气完成转写、静音检测、生成 proposal、执行剪辑。
46
- `subtitle` 从原始转写推算字幕时间轴(不会重新调 whisper),烧录输出 `<原片>_subbed.mp4`。
66
+ `cut` 按你标注的 proposal 剪辑,`subtitle` 对成片重新转写并烧字幕。
47
67
 
48
68
  ### 用户要求调整时
49
69
 
50
70
  用户看完成片说某段不对:
51
- 1. `<video>.work/cut_proposal.md`
52
- 2. 编辑对应行(`#` 注释 = 删除,去掉 `#` = 保留)
71
+ 1. 重新读 `<video>.work/cut_proposal.md`
72
+ 2. 调整对应行(`#` 注释 = 删除,去掉 `#` = 保留)
53
73
  3. 删除 `<video>.work/subs.ass`(让 subtitle 重新生成)
54
74
  4. 重跑:
55
75
  ```bash
@@ -61,22 +81,10 @@ video-edit subtitle <video>
61
81
 
62
82
  ### 限时长精剪(用户给了目标时长)
63
83
 
64
- ```bash
65
- video-edit analyze <video>
66
- ```
67
-
68
- 读 `<video>.work/cut_proposal.md`,**你自己**做这些判断:
84
+ `analyze` → 审 proposal 时**额外做这些**:
69
85
  - 找钩子句放最前
70
- - 删跑题、删 NG、删填充词
71
- - 压到目标时长
72
- - 把要删的行首加 `#`,保存
73
- - 删除 `<video>.work/subs.ass`
74
-
75
- 然后:
76
- ```bash
77
- video-edit cut <video>
78
- video-edit subtitle <video>
79
- ```
86
+ - 压到目标时长(更激进地删)
87
+ - 其余流程同上
80
88
 
81
89
  ### 仅字幕(用户明确说不剪)
82
90
 
@@ -89,11 +97,24 @@ video-edit subtitle <video>
89
97
  ### 无字幕版(用户明确说不要字幕)
90
98
 
91
99
  ```bash
92
- video-edit both <video>
100
+ video-edit analyze <video>
101
+ # 审 proposal 标 #
102
+ video-edit cut <video>
93
103
  ```
94
104
 
95
105
  交付 `<原片>_edited.mp4`,不跑 subtitle。
96
106
 
107
+ ## 审片心法
108
+
109
+ 读 proposal 时**不要逐行纠结**——每行 1 秒判断,按这个决策树:
110
+
111
+ 1. 这行只有口头禅/单字 → `#`
112
+ 2. 这行跟前一行/后一行说同一件事 → 留信息量最高的那遍
113
+ 3. 这行内容跟主题无关 → `#`
114
+ 4. 其他 → 留
115
+
116
+ **追求"看着不卡",不追求 100% 完美**。删多了用户会说"这句要留",你再调;删少了成片很卡,用户体验更差。**宁可激进一点**。
117
+
97
118
  ## 交付怎么说
98
119
 
99
120
  简洁,**只说结果**:
@@ -101,13 +122,13 @@ video-edit both <video>
101
122
  - ✅ "剪好了,xxx_subbed.mp4,时长 23 秒"
102
123
  - ✅ "无字幕版剪好了,xxx_edited.mp4,时长 23 秒"
103
124
  - ❌ "我用了 video-edit analyze,然后编辑了 cut_proposal.md..."
104
- - ❌ "review 显示 3 个 WARN,但都不影响..."
125
+ - ❌ "审片删了 8 NG..."
105
126
 
106
127
  ## 不要做的事
107
128
 
108
- - ❌ 用户说"剪一下"就追问平台/钩子/时长——直接 `both` + `subtitle`
129
+ - ❌ 跳过审 proposal 直接 `both` 出片——必有大量卡顿
130
+ - ❌ 用户说"剪一下"就追问平台/钩子/时长——按默认流程动手
109
131
  - ❌ 用户说"剪一下"只交付 `_edited.mp4` 不烧字幕——**默认带字幕**
110
- - ❌ 剪之前停下来展示方案等确认——**直接出片**,不满意再调
111
132
  - ❌ 把命令名、cut_proposal.md 路径暴露给用户——内部实现细节
112
133
  - ❌ 编造命令(仅 5 个:both / analyze / cut / review / subtitle)
113
134
  - ❌ 用户说"剪掉前 X 秒"/"剪掉中间一段"——定点裁剪不是去卡顿,告诉用户"我擅长去卡顿停顿,定点裁剪请用别的方式"
@@ -116,8 +137,8 @@ video-edit both <video>
116
137
 
117
138
  | 命令 | 用途 |
118
139
  |---|---|
119
- | `video-edit both <video>` | **默认用这个**:analyze + cut 一步到位 |
120
- | `video-edit analyze <video>` | 仅转写 + 生成 proposal(限时长精剪时用) |
140
+ | `video-edit analyze <video>` | 转写 + 生成 proposal(**默认入口**,审完后跑 cut |
121
141
  | `video-edit cut <video>` | 按 proposal 剪辑,生成 `_edited.mp4` |
142
+ | `video-edit subtitle <video>` | 对成片重新转写 + 烧字幕,输出 `<原片>_subbed.mp4` |
143
+ | `video-edit both <video>` | analyze + cut 一步到位(**已弃用**:跳过审片质量差) |
122
144
  | `video-edit review <video>` | 诊断用:检查 `_edited.mp4`,输出 review_report.md |
123
- | `video-edit subtitle <video>` | 烧字幕。传**原片路径**,自动找 `_edited.mp4` 做输入,输出 `<原片>_subbed.mp4` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/optima-agent",
3
- "version": "0.9.14",
3
+ "version": "0.9.16",
4
4
  "description": "基于 Claude Agent SDK 的电商运营 AI 助手",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",