@lingjingai/scriptctl 0.66.21 → 0.66.23

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 CHANGED
@@ -82,7 +82,7 @@ Gemini 接收左侧带时间戳、行锚点的亚洲格式剧本正文,以及
82
82
 
83
83
  剧本旁 `.review/asr/episode-N/` 保存按音频 SHA-256 复用的成功 ASR 响应,以及每次对比的 `script.txt`、`asr.txt`、`prompt.txt`、逐模型逐次响应和 `report.json`(含前后时间、台词、缺漏线索)。当前剧本每次重新对比,不缓存对比结论。
84
84
 
85
- 视频和纯剧本审核使用 `review-agent`,文本和漫画使用 `review-text`、`review-comic`;主 Agent 的每次模型请求独立以 50% 概率选择 MSUICODE 或 NNYYAI 优先(均为 `gemini-3.8-flash`):MSUICODE 优先时按 Vertex → GCP → T3 → NNYYAI;NNYYAI 优先时按 NNYYAI → MSUICODE Vertex → GCP → T3。全部 Gemini 渠道耗尽后进入 LiteLLM `grok-4.7-packy` → `grok-4.6-packy` → `grok-4.5-packy`。分配按请求进行,重试不重新抽选;长期首选比例约为 50/50,不保证每两次各一次。MSUICODE 地址为 `http://15.204.107.123:3000`,三个来源分别读取 `MSUICODE_VERTEX_API_KEY`、`MSUICODE_GCP_API_KEY`、`MSUICODE_T3_API_KEY`;NNYYAI 读取 `NNYYAI_API_KEY`。主渠道密钥必需,额外渠道仅在配置对应密钥时参与。Grok 读取 `PROJECT_LITELLM_GATEWAY_BASE_URL` 和 `PROJECT_LITELLM_GATEWAY_API_KEY`。普通服务错误按配置顺序切换;Gemini 返回明确的内容拦截时,本轮 Agent 跳过所有剩余 Gemini 渠道,直接进入 Grok;这一状态只作用于当前 Agent 会话。各模型沿用 provider 的 `maxAttempts`,内置最多三次。模型切换发生在当前调用内,保留成功的工具操作;用量记录实际渠道和模型,Gemini 思考签名只在生成它的渠道内复用。自定义 profile 同时以这两个渠道的 Gemini 3.8 为主链时也按上述策略分配,其他 profile 的 `fallbacks` 按声明顺序执行。`--no-fallback` 或 `SCRIPTCTL_REVIEW_SINGLE_MODEL=1` 仅使用选定模型。
85
+ 视频和纯剧本审核使用 `review-agent`,文本和漫画使用 `review-text`、`review-comic`;主 Agent 每次模型请求按 MSUICODE Vertex → GCP → T3 → 兔子(`TUZI_API_KEY`,`https://api.tu-zi.com`)→ 豆包 Seed 2.1 Pro(`ARK_API_KEY`)的顺序使用,Gemini 渠道均为 `gemini-3.8-flash`。NNYYAI 不参与 Agent 工具调用:它会把并行函数调用拆成两段,并丢失工具循环的函数结果历史。Grok 也不在默认链中:长审核历史下它只回复计划而不调用工具。MSUICODE 地址为 `http://15.204.107.123:3000`,三个来源分别读取 `MSUICODE_VERTEX_API_KEY`、`MSUICODE_GCP_API_KEY`、`MSUICODE_T3_API_KEY`。主渠道密钥必需,额外渠道仅在配置对应密钥时参与。普通服务错误按顺序切换;Gemini 返回明确的内容拦截时,当前这一步跳过剩余 Gemini 渠道交给豆包,下一步重新从 Vertex 开始。各模型沿用 provider 的 `maxAttempts`,内置最多三次。模型切换发生在当前调用内,保留成功的工具操作;用量记录实际渠道和模型,Gemini 思考签名只在生成它的渠道内复用。逐集与全剧审核都要求成功调用 validate 后才结束;模型只回复计划而没有收口时会被要求继续,全部渠道都失败时直接结束。`--no-fallback` 或 `SCRIPTCTL_REVIEW_SINGLE_MODEL=1` 仅使用选定模型。
86
86
 
87
87
  独立的 ASR JSON 比对和原片视频核验使用 `review-media`:NNYYAI Gemini 3.8 → 3.7 → 3.6 Flash → 豆包,凭据为 `NNYYAI_API_KEY`、`ARK_API_KEY`,`ARK_MODEL` 可指定豆包端点。显式 `--model` 或自定义配置仍决定媒体主渠道。豆包 Flash ASR 继续读取 `SD_AUDIO_APIKEY`。
88
88
 
@@ -96,12 +96,33 @@ Gemini 接收左侧带时间戳、行锚点的亚洲格式剧本正文,以及
96
96
 
97
97
  `scriptctl review -p <workspace/script.json> -s <漫画 ingest 工作区>` 对照原 PDF 逐话审核并修正。也可以把 `-s` 指向原 PDF 或 PDF 目录,此时 `manifest.json` 必须位于剧本旁。来源通过 `document_id` 和 manifest 中的 PDF SHA-256 匹配,不按文件名重新配话;文件移动或改名后可以显式传入内容相同的 PDF。`--episodes 1,3` 只要求所选话的来源可用。缺少 manifest、来源映射或原文件内容变化时停止并报错。
98
98
 
99
- 漫画使用独立的 `review-comic` profile,默认采用上述 MSUICODE / NNYYAI 均分首选、再接 Grok 的主 Agent 渠道链。自定义 LLM 配置需要定义该 profile,或用 `--model` 选择有显式服务地址的 profile。视频和纯剧本仍使用 `review-agent`。
99
+ 漫画使用独立的 `review-comic` profile,默认采用上述主 Agent 渠道链。自定义 LLM 配置需要定义该 profile,或用 `--model` 选择有显式服务地址的 profile。视频和纯剧本仍使用 `review-agent`。
100
100
 
101
101
  漫画 Agent 逐页看原稿并反向核对 action,使用 `source` 定位、`pages` 看完整原页、`region` 看清晰局部,核对遗漏、重复、文字、人物、心声类型及阅读顺序。需要 Poppler(`pdftoppm`);局部图按显示页的 CropBox/旋转归一化坐标渲染。正文修改保留来源;插入遗漏内容必须同时提供 `extend.scriptctl.source` 页码及区域。跨页内容使用同一条 action 的多个来源区域,不添加时间戳。
102
102
 
103
103
  `.review/comic/episode-N.json` 保存逐话 findings、用量和原页加载记录,`global.json` 保存最后的全剧收敛结果。`viewed_pages` 仅表示整页图片已加载,不代表内容正确或小字已看清;未加载完全部页时报告未解决项。图片证据保存在剧本旁的 `review-pages/`。漫画不执行 ASR、校时或视频媒体预算;`--max-steps` 和 `--episode-timeout-ms` 限制审核运行。逐话结果在剧本与报告落盘后才发出,未提供 `-s` 仍是纯剧本审核。
104
104
 
105
+ ## 审核失败单元的类型
106
+
107
+ `review` 的进程退出码 0 只表示正常跑完;每个 `episode` / `global` 事件的 `state` 才是该单元结果。`state = "failed"` 时带 `failure_kind` 和 `retry`:
108
+
109
+ | `failure_kind` | `retry` | 含义 |
110
+ |---|---|---|
111
+ | `dialogue_cross_language` | `ours` | 剧本台词与原声语言不同(拉片把译文字幕当成了台词) |
112
+ | `dialogue_mismatch` | `caller` | 台词与原声差异超过 50%,多为视频与集对应错误 |
113
+ | `asr_config` | `caller` | 缺少 `SD_AUDIO_APIKEY` |
114
+ | `video_missing` | `caller` | 该集没有传视频 |
115
+ | `credentials` | `caller` | 模型渠道拒绝凭据(401/403) |
116
+ | `asr_failed` | `retry` | ASR 或比对模型暂时不可用 |
117
+ | `timeout` | `retry` | 单元超时 |
118
+ | `model_unavailable` | `retry` | 所有模型渠道都失败 |
119
+ | `timeline_unresolved` | `retry_once` | 审核后时间轴仍有冲突 |
120
+ | `converge_incomplete` | `retry_once` | 全剧收敛单元未正常收口 |
121
+ | `source_unread` | `retry_once` | 文本或漫画审核未读完本集原稿 |
122
+ | `unknown` | `ours` | 其他 |
123
+
124
+ 重试时用同一条命令加 `--resume-log <之前的日志>`,已完成的单元会跳过。
125
+
105
126
  ## 退出码
106
127
 
107
128
  | 码 | 含义 |
@@ -119,7 +140,8 @@ Gemini 接收左侧带时间戳、行锚点的亚洲格式剧本正文,以及
119
140
  | `PROJECT_LITELLM_GATEWAY_API_KEY` | 内置 LLM 配置引用的 gateway key |
120
141
  | `PROJECT_LITELLM_GATEWAY_BASE_URL` | 内置配置的 gateway endpoint;OpenAI-compatible synopsis 必须配置 |
121
142
  | `SCRIPTCTL_LLM_CONFIG` | LLM 路由 YAML;优先级低于 `--llm-config` |
122
- | `NNYYAI_API_KEY` | 内置视频与漫画拉片、独立媒体核验及 Agent 的 NNYYAI 渠道密钥 |
143
+ | `NNYYAI_API_KEY` | 内置视频与漫画拉片、ASR 比对与独立媒体核验的 NNYYAI 渠道密钥 |
144
+ | `TUZI_API_KEY` | 审核 Agent 的兔子 Gemini 渠道密钥 |
123
145
  | `MSUICODE_VERTEX_API_KEY` | 默认审核 Agent 的 MSUICODE Vertex 主渠道密钥 |
124
146
  | `MSUICODE_GCP_API_KEY` / `MSUICODE_T3_API_KEY` | 审核 Agent 的 MSUICODE GCP / T3 后续渠道密钥 |
125
147
  | `GRSAI_API_KEY` | 视频拉片及显式选择 GrsAI profile 时使用的渠道密钥 |
@@ -154,7 +176,7 @@ Gemini provider 可设置 `videoResponseSchemaField: responseSchema`,用于 GR
154
176
  从 `NNYYAI_API_KEY` 读取密钥,使用 base64 视频或 PDF 输入(Schema 字段为 `responseSchema`)。设置密钥后直接运行
155
177
  `scriptctl ingest -s <视频或PDF文件或目录> -w <workspace>`。
156
178
  视频请求先尝试配置的主模型,再在主渠道按 Gemini 3.8 / 3.7 / 3.6 Flash 补齐未试型号,随后使用 GrsAI(`https://grsai.dakka.com.cn`)的同三个型号,最后进入火山方舟豆包。GrsAI 使用独立的 `GRSAI_API_KEY`、base64 视频与 `responseSchema`,每个型号最多尝试 3 次;未配置密钥或主渠道已为该 GrsAI 地址时跳过此段。主渠道视频上传失败时,从 GrsAI 开始使用本地视频继续请求。豆包需要 `ARK_API_KEY`,`ARK_MODEL` 可覆盖默认端点。
157
- PDF 的 Gemini 型号切换使用同一主渠道,随后由已配置的豆包兜底。`review-agent` 主循环默认使用 MSUICODE / NNYYAI 均分首选、再接 LiteLLM Grok 的审核链;文本任务按各自 profile 路由。
179
+ PDF 的 Gemini 型号切换使用同一主渠道,随后由已配置的豆包兜底。`review-agent` 主循环默认使用上述 MSUICODE → 兔子 → 豆包审核链;文本任务按各自 profile 路由。
158
180
  显式 LLM 配置决定主渠道和模型,支持 GrsAI、Google Vertex 等 provider;视频同样按主渠道 → GrsAI → 豆包的顺序恢复。显式选择豆包时只调用豆包。
159
181
 
160
182
  Gemini provider 的 `videoUploadMode: base64` 可指定视频默认传输方式;未设置时为 `file-api`,
@@ -238,6 +260,6 @@ scriptctl ingest --source-path ./video.mp4 --video-provider gemini
238
260
 
239
261
  The built-in official Gemini provider uses `google-vertex` with Google Application Default Credentials (ADC). Set `GOOGLE_CLOUD_PROJECT` and configure ADC on each execution machine; tokens refresh automatically. Video requests send inline media; text requests use the Vertex OpenAI-compatible API. A custom provider can declare `protocol: google-vertex`, `timeoutMs` and `maxAttempts` without an `apiKey` field. To use a Vertex API key, add `apiKey: { env: GOOGLE_API_KEY }` to that provider and set the named environment variable. Select the provider through the task profile in your LLM configuration. The project reads `VERTEX_PROJECT_ID`, falling back to `GOOGLE_CLOUD_PROJECT`; the location reads `VERTEX_LOCATION`, then `GOOGLE_CLOUD_LOCATION`, defaulting to `global`. Custom Gemini gateways retain the `google-gemini` protocol and their own credentials.
240
262
 
241
- ### 已授权的跨语言台词检查
263
+ ### 台词与原声门禁
242
264
 
243
- 仅在已核实并授权的跨语言审核任务中设置 `SCRIPTCTL_ALLOW_DIALOGUE_MISMATCH=1`。该开关只允许超过10%的字符差异继续进入ASR校时和模型审核,仍写入原始差异报告,不修改剧本;未设置时保留硬拦截。它不跳过梗概必填检查或模型审核。
265
+ 有原视频的审核先比对整集剧本台词与 ASR 文字。字符差异超过 50%(视频绑错或台词凭空编造)或剧本与 ASR 文字体系不同(例如英文原声配中文字幕被当成台词)时,本集失败并写入差异报告,NDJSON 的 message 分别为“台词与原声差异过大”“台词与原声语言不同”;10%–50% 的差异照常审核,并作为待核对线索交给 Agent。被拦的集不影响其余集的全剧收敛。仅在已核实并授权的跨语言审核任务中设置 `SCRIPTCTL_ALLOW_DIALOGUE_MISMATCH=1`,放行被拦的集,仍写入原始差异报告。
@@ -0,0 +1,20 @@
1
+ # 0.66.22
2
+
3
+ ## Added
4
+ - None.
5
+
6
+ ## Changed
7
+ - 审核 Agent 渠道按 MSUICODE Vertex → GCP → T3 → 兔子 → 豆包顺序使用,不再 50% 抽选 NNYYAI,也不再降级到 Grok;Gemini 内容拦截只跳过当前一步的其余 Gemini 渠道。
8
+ - 台词门禁硬拦截阈值由 10% 提高到 50%,新增跨语言判定;10%–50% 的差异作为线索交给 Agent。被拦的集不再阻止其余集的全剧收敛。
9
+ - 整秒时间戳与毫秒时间戳相差不到一秒不再视为倒序。
10
+ - 提示词引导同一轮并行发出互不依赖的工具调用,同一称呼的正式名替换一次批量完成。
11
+ - 每个审核单元逐步写入 `.review/<剧本>/trace/<单元>-<时间>.jsonl`,记录工具调用、参数、结果、用量和耗时。
12
+
13
+ - 视频审核的全剧收敛改为:确定性规则(无引用的同名空壳、同名造型)→ 逐集交接项、每集登记检查、全剧重复与误登记检查各一次结构化调用 → 每个资产一次带代表帧的描述核对;只有这些调用无法确定的事项交给范围限定的 agent,不再为每个资产启动完整 agent。每次调用记录在 `.review/<剧本>/trace/converge-calls.jsonl`。
14
+ - 资产单元留下的未解决事项(例如原片证明正文写错了实物)在全部资产单元结束后交给一个身份范围的 agent,可改正文、资产名、绑定或合并资产;NDJSON 中以 `asset: "asset-escalation"` 的 global 单元报告。
15
+
16
+ ## Fixed
17
+ - 逐集审核也要求 validate 收口,模型只回复计划时会继续执行,不再被记为完成。
18
+
19
+ ## Breaking
20
+ - None.
@@ -0,0 +1,13 @@
1
+ # 0.66.23
2
+
3
+ ## Added
4
+ - `scriptctl review` 的 `episode` / `global` 失败单元带结构化字段 `failure_kind`(失败类型)和 `retry`(`caller` 接入方处理、`retry` 可自动重试、`retry_once` 重试一次、`ours` 交给 scriptctl 维护方);完成的单元不带这两个字段。
5
+
6
+ ## Changed
7
+ - None.
8
+
9
+ ## Fixed
10
+ - None.
11
+
12
+ ## Breaking
13
+ - None.
package/dist/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{b as s}from"./chunk-FPG54CMI.js";import{Console as r}from"node:console";var o=new r({stdout:process.stderr,stderr:process.stderr});console.debug=o.debug.bind(o);console.info=o.info.bind(o);console.log=o.log.bind(o);s(process.argv.slice(2)).then(e=>{process.exitCode=e}).catch(e=>{console.error(e),process.exitCode=70});
2
+ import{b as s}from"./chunk-ULPQQNUV.js";import{Console as r}from"node:console";var o=new r({stdout:process.stderr,stderr:process.stderr});console.debug=o.debug.bind(o);console.info=o.info.bind(o);console.log=o.log.bind(o);s(process.argv.slice(2)).then(e=>{process.exitCode=e}).catch(e=>{console.error(e),process.exitCode=70});