@lingjingai/scriptctl 0.55.0 → 0.57.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/changes/0.56.0.md +13 -0
- package/changes/0.57.0.md +14 -0
- package/dist/cli/register-workflows.js +8 -0
- package/dist/cli/register-workflows.js.map +1 -1
- package/dist/domain/ingest/video-context.d.ts +2 -0
- package/dist/domain/ingest/video-context.js +8 -1
- package/dist/domain/ingest/video-context.js.map +1 -1
- package/dist/failures.d.ts +58 -0
- package/dist/failures.js +96 -0
- package/dist/failures.js.map +1 -0
- package/dist/infra/ingest/workspace-lock.d.ts +1 -0
- package/dist/infra/ingest/workspace-lock.js +32 -0
- package/dist/infra/ingest/workspace-lock.js.map +1 -0
- package/dist/infra/llm/doubao-video-model.js +25 -24
- package/dist/infra/llm/doubao-video-model.js.map +1 -1
- package/dist/infra/llm/failure-mapping.d.ts +6 -0
- package/dist/infra/llm/failure-mapping.js +146 -0
- package/dist/infra/llm/failure-mapping.js.map +1 -0
- package/dist/infra/llm/gemini-upload.js +14 -9
- package/dist/infra/llm/gemini-upload.js.map +1 -1
- package/dist/infra/llm/gemini-video-model.d.ts +4 -7
- package/dist/infra/llm/gemini-video-model.js +130 -38
- package/dist/infra/llm/gemini-video-model.js.map +1 -1
- package/dist/llm/router.js +37 -9
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/types.d.ts +14 -7
- package/dist/llm/types.js +26 -0
- package/dist/llm/types.js.map +1 -1
- package/dist/usecases/ingest/command.js +5 -0
- package/dist/usecases/ingest/command.js.map +1 -1
- package/dist/usecases/ingest/failure.d.ts +26 -0
- package/dist/usecases/ingest/failure.js +149 -0
- package/dist/usecases/ingest/failure.js.map +1 -0
- package/dist/usecases/ingest/skip-video-episode.d.ts +4 -0
- package/dist/usecases/ingest/skip-video-episode.js +112 -0
- package/dist/usecases/ingest/skip-video-episode.js.map +1 -0
- package/dist/usecases/ingest/status.d.ts +21 -5
- package/dist/usecases/ingest/status.js +100 -21
- package/dist/usecases/ingest/status.js.map +1 -1
- package/dist/usecases/ingest/video-pipeline.d.ts +38 -0
- package/dist/usecases/ingest/video-pipeline.js +78 -47
- package/dist/usecases/ingest/video-pipeline.js.map +1 -1
- package/dist/usecases/ingest/video-skip-state.d.ts +29 -0
- package/dist/usecases/ingest/video-skip-state.js +148 -0
- package/dist/usecases/ingest/video-skip-state.js.map +1 -0
- package/package.json +1 -1
- package/skills/scriptctl/SKILL.md +2 -2
- package/skills/scriptctl/references/ingest-workflow.md +36 -5
|
@@ -53,7 +53,23 @@ scriptctl ingest -s uploads/正片/ -w workspaces/正片 --step
|
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
JSON 输出包含 `completed`、`remaining`、`complete` 和 `next_episode`。完成后再次调用是
|
|
56
|
-
`processed=0` 的幂等 no-op。集与集之间依赖累计 context
|
|
56
|
+
`processed=0` 的幂等 no-op。集与集之间依赖累计 context,因此只能解析或人工跳过当前
|
|
57
|
+
`next_episode`,不能越过它处理后面的集。
|
|
58
|
+
|
|
59
|
+
### 手动跳过失败视频集
|
|
60
|
+
|
|
61
|
+
某集已经产生 typed `ep/ep_NNN.error.json`,确认继续重试也无法解析时,可以把当前
|
|
62
|
+
`next_episode` 人工接受为空集:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
scriptctl ingest skip -w workspaces/正片 --episode 7 --reason "多模型均被合规拦截"
|
|
66
|
+
scriptctl ingest -s uploads/正片/ -w workspaces/正片
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
跳过记录写入 `skipped.json`,其中保留原因、源视频哈希和原始 typed failure;`script.json`
|
|
70
|
+
对应集的 `scenes` 为空,并在 `extend.scriptctl.ingest` 标记 `outcome=skipped`。后续集 context
|
|
71
|
+
会明确提示该集剧情未知。命令只接受当前失败集,重复执行为幂等 no-op;`--force` 重建会清空
|
|
72
|
+
跳过记录。
|
|
57
73
|
|
|
58
74
|
### 视频上传与 provider
|
|
59
75
|
|
|
@@ -77,7 +93,7 @@ scriptctl ingest -s uploads/正片/ -w workspaces/正片 \
|
|
|
77
93
|
- `--fps <n>`:视频采样帧率(>1 解锁亚秒级时间码)。默认 3。
|
|
78
94
|
- `--step`:视频每次只处理下一个未完成集。
|
|
79
95
|
- `--upload-mode <file-api|base64>`:视频媒体传输方式,默认 `file-api`。
|
|
80
|
-
- `--force`:当前视频 pipeline
|
|
96
|
+
- `--force`:当前视频 pipeline 的**同源**工作区可清掉产物和人工跳过记录重跑(**不能换源,也不能升级旧 pipeline workspace**)。
|
|
81
97
|
|
|
82
98
|
管线(了解即可,产物都在 `workspace/`):
|
|
83
99
|
- **文本**:正文起点定位 → 切块 → 生产化归一 → 合并组装 `body.json` → 串行资产/身份/state 治理 → V3 中间校验 → 稳定 V4 身份分配 → V4 校验与生产规范 warning → `script.json`。
|
|
@@ -112,7 +128,7 @@ scriptctl ingest -s uploads/正片/ -w workspaces/正片 \
|
|
|
112
128
|
|
|
113
129
|
```bash
|
|
114
130
|
scriptctl ingest status # 人读:kind / state / 各 pass 进度(transcribe 40/57 (2 failed) ...)
|
|
115
|
-
scriptctl ingest status -j
|
|
131
|
+
scriptctl ingest status -j # 机器输出含 failure_summary / errors[];视频另含 completed / parsed / skipped / skipped_episodes / complete / next_episode
|
|
116
132
|
scriptctl view # 生成 workspace/review.html(视频版可点击定位到画面)
|
|
117
133
|
scriptctl view --watch [--port N]# 实时监听面板:分阶段进度条 + 逐集 context/决策 + 产物树,自动刷新(跑中也能开)。🔴 仅本地用,**沙箱内不要用**(起阻塞服务+开浏览器,会挂住;沙箱看进度用 `ingest status`)
|
|
118
134
|
scriptctl summary -p workspace/script.json # 抽完当普通剧本读
|
|
@@ -120,9 +136,22 @@ scriptctl summary -p workspace/script.json # 抽完当普通剧本读
|
|
|
120
136
|
|
|
121
137
|
`state`:`empty`(没开始)/ `incomplete`(在跑、中断或只完成连续前缀)/ `failed`(有失败单元或校验没过)/ `ready`(全部 source units 完成,且 `script.json` 的 v4 结构校验通过)。文本与视频 ingest 的 `validation.json` 包含结构校验和 production warning。进度从工作区真实文件推导;它报的是管线事实,资产合并结论和源素材一致性仍由复核完成门确认。
|
|
122
138
|
|
|
139
|
+
失败时 `status -j` 的 `errors[]` 按 `failure_type` / `failure_code` 给出稳定分类,并显式给出
|
|
140
|
+
`retryable`。网络错误可含 `system_code`,HTTP 错误可含 `http_status`;Gemini 合规拦截可含
|
|
141
|
+
`provider_source`、`provider_reason` 和 `safety_ratings`;模型 fallback 全部失败时,`attempts[]`
|
|
142
|
+
保留每个实际调用的 provider、model 和失败原因。`failure_summary` 汇总 retryable / terminal
|
|
143
|
+
数量和 `by_type`。`state` 仍只表示管线生命周期,合规拦截表现为
|
|
144
|
+
`state=failed` + `failure_type=policy`。
|
|
145
|
+
|
|
146
|
+
人工跳过后,该集从活动 `errors[]` 移入 `skips[]`;全部集都已解析或跳过时仍可为
|
|
147
|
+
`state=ready` / `complete=true`,同时 `has_skips=true`。消费方据此区分“管线已完成”和
|
|
148
|
+
“内容是否完整”。
|
|
149
|
+
|
|
123
150
|
## 四、🔴 抖动与重跑(大规模转剧本的常态)
|
|
124
151
|
|
|
125
|
-
模型抖动 / 限流 / 单集超时 / 偶发解析失败在几十集体量下**是正常现象,不是 bug
|
|
152
|
+
模型抖动 / 限流 / 单集超时 / 偶发解析失败在几十集体量下**是正常现象,不是 bug**。先看
|
|
153
|
+
`errors[].retryable`:retryable 失败直接续跑;terminal 失败按错误类型处理,合规拦截不应对同一
|
|
154
|
+
素材反复空跑。护栏与恢复:
|
|
126
155
|
|
|
127
156
|
| 报错 | 含义 | 怎么办 |
|
|
128
157
|
|---|---|---|
|
|
@@ -132,10 +161,12 @@ scriptctl summary -p workspace/script.json # 抽完当普通剧本读
|
|
|
132
161
|
| `INGEST_SOURCE_MISMATCH` | 工作区是别的 source,或已接受的视频分集前缀发生变化 | 恢复原分集前缀;确实要换源时使用新的 `-w`,**别 `--force` 硬覆盖** |
|
|
133
162
|
| `INGEST_VIDEO_SEQUENCE` | 视频集号没有组成从 1 开始的连续序列 | 补齐缺集或修正文件名后重跑 |
|
|
134
163
|
| `INGEST_VIDEO_INLINE_TOO_LARGE` | 自动转码后的文件达到 Gemini inline base64 上限 | 改用 `--upload-mode file-api` |
|
|
164
|
+
| `INGEST_SKIP_*` | 手动跳过目标不是当前失败集,或 workspace / sidecar / ledger 不满足要求 | 读取 `ingest status -j`,只对 `next_episode` 且已有 typed error sidecar 的视频集执行 `ingest skip` |
|
|
135
165
|
| `INGEST_VALIDATION_FAILED` | 最终校验没过 | 看 `workspace/validation.json` 的具体报错,修复后再 `publish` |
|
|
136
166
|
| 持续 401/403/404 / 模型路由错 | 网关/密钥/模型环境问题(不是抖动,重跑也不好) | 如实告诉用户,别反复空跑、别编造成功。视频需 `GEMINI_API_KEY` |
|
|
137
167
|
|
|
138
|
-
🔴 **绝不**:清工作区、删 checkpoint
|
|
168
|
+
🔴 **绝不**:清工作区、删 checkpoint、手塞/手改中间文件来绕过失败。retryable 失败使用同源
|
|
169
|
+
重跑;确认无法解析的当前视频集使用 `ingest skip`,由命令原子维护 ledger、context 和空集产物。
|
|
139
170
|
|
|
140
171
|
## 五、入库 `publish`
|
|
141
172
|
|