@lingjingai/scriptctl 0.44.0 → 0.47.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.45.0.md +39 -0
- package/dist/domain/ingest/serial-context.d.ts +15 -27
- package/dist/domain/ingest/serial-context.js +106 -57
- package/dist/domain/ingest/serial-context.js.map +1 -1
- package/dist/infra/ingest/review-renderer.js +11 -2
- package/dist/infra/ingest/review-renderer.js.map +1 -1
- package/dist/infra/ingest/video-transcode.js +16 -3
- package/dist/infra/ingest/video-transcode.js.map +1 -1
- package/dist/infra/llm/anthropic-model.js +21 -2
- package/dist/infra/llm/anthropic-model.js.map +1 -1
- package/dist/infra/llm/gemini-video-model.d.ts +3 -0
- package/dist/infra/llm/gemini-video-model.js +26 -9
- package/dist/infra/llm/gemini-video-model.js.map +1 -1
- package/dist/infra/llm/openai-compatible-model.js +31 -2
- package/dist/infra/llm/openai-compatible-model.js.map +1 -1
- package/dist/llm/config.js +5 -1
- package/dist/llm/config.js.map +1 -1
- package/dist/llm/registry.d.ts +1 -0
- package/dist/llm/registry.js +10 -4
- package/dist/llm/registry.js.map +1 -1
- package/dist/llm/router.d.ts +1 -0
- package/dist/llm/router.js +0 -0
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/tasks/ingest/episode-assets.d.ts +3 -2
- package/dist/llm/tasks/ingest/episode-assets.js +119 -25
- package/dist/llm/tasks/ingest/episode-assets.js.map +1 -1
- package/dist/llm/tasks/ingest/name-fix.d.ts +9 -0
- package/dist/llm/tasks/ingest/name-fix.js +64 -0
- package/dist/llm/tasks/ingest/name-fix.js.map +1 -0
- package/dist/llm/tasks/ingest/video-serial.d.ts +2 -1
- package/dist/llm/tasks/ingest/video-serial.js +184 -85
- package/dist/llm/tasks/ingest/video-serial.js.map +1 -1
- package/dist/llm/tasks/schemas.d.ts +3 -0
- package/dist/llm/tasks/schemas.js +240 -0
- package/dist/llm/tasks/schemas.js.map +1 -1
- package/dist/llm/types.d.ts +14 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/usecases/ingest/pipeline.js +17 -2
- package/dist/usecases/ingest/pipeline.js.map +1 -1
- package/dist/usecases/ingest/serial-govern.d.ts +4 -0
- package/dist/usecases/ingest/serial-govern.js +211 -40
- package/dist/usecases/ingest/serial-govern.js.map +1 -1
- package/dist/usecases/ingest/status.js +3 -3
- package/dist/usecases/ingest/status.js.map +1 -1
- package/dist/usecases/ingest/usage-report.d.ts +17 -0
- package/dist/usecases/ingest/usage-report.js +51 -0
- package/dist/usecases/ingest/usage-report.js.map +1 -0
- package/dist/usecases/ingest/video-pipeline.js +5 -0
- package/dist/usecases/ingest/video-pipeline.js.map +1 -1
- package/dist/usecases/ingest/view-server.d.ts +22 -0
- package/dist/usecases/ingest/view-server.js +39 -2
- package/dist/usecases/ingest/view-server.js.map +1 -1
- package/package.json +1 -1
- package/skills/scriptctl/SKILL.md +13 -2
- package/skills/scriptctl/references/atomic-write-workflow.md +45 -16
- package/dist/domain/ingest/asset-state-md-parser.d.ts +0 -2
- package/dist/domain/ingest/asset-state-md-parser.js +0 -133
- package/dist/domain/ingest/asset-state-md-parser.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// ingest.name-fix task (§ serial repair). After the serial pass, some names appear
|
|
2
|
+
// in the body but resolve to NO registry entity — the model missed a merge. Rather
|
|
3
|
+
// than mint ghost assets, we ask once: for each such name, is it another叫法 of an
|
|
4
|
+
// already-registered entity (→ merge), or a genuinely new entity (→ newEntity)?
|
|
5
|
+
// Output is a Delta with only newEntities + merges (no looks/scenes). Tool mode.
|
|
6
|
+
import { emptyDelta } from "../../../domain/ingest/serial-context.js";
|
|
7
|
+
import { NAME_FIX_SCHEMA } from "../schemas.js";
|
|
8
|
+
export const NAME_FIX_SYSTEM = [
|
|
9
|
+
"你是剧本实体归一修复器。【已知设定】是已建立的实体登记(register)。下面【待归一名字】是正文里出现、但还没能对应到 register 里任何实体的名字。",
|
|
10
|
+
"对**每一个**待归一名字,判断它是不是 register 里某个已登记实体的另一种叫法:",
|
|
11
|
+
" · **是**(字面变体如 大骨=大骨头、苏若雪=若雪;或剧情/身份能确定是同一个,如前世名/化名/全名短名)→ 放进 `merges`:{from: 这个名字, into: 已登记实体的 canonical}。",
|
|
12
|
+
" · **不是**(它确实是 register 里从没登记过的一个新实体)→ 放进 `newEntities`:{kind, name(纯 canonical), description(一句话身份), aliases}。",
|
|
13
|
+
"**不同角色绝不互相当别名**。拿不准是哪一个已有实体时,宁可当新实体登记,也不要 merge 错人。",
|
|
14
|
+
"地点同理:同一个地方的不同写法(带不带平台/区域前缀、『车轮旁』=『矿车车轮旁』)merge 到已有那条;确实是新地方才 newEntity。",
|
|
15
|
+
"只输出 merges 和 newEntities 两项,覆盖**每一个**待归一名字。",
|
|
16
|
+
].join("\n");
|
|
17
|
+
export function buildNameFixUser(contextMd, names) {
|
|
18
|
+
return [
|
|
19
|
+
"【已知设定】(已登记的实体)",
|
|
20
|
+
contextMd.trim() || "(空)",
|
|
21
|
+
"",
|
|
22
|
+
"【待归一名字】(正文里出现但未对应到任何已登记实体,逐个处理)",
|
|
23
|
+
names.map((n) => `- ${n}`).join("\n"),
|
|
24
|
+
].join("\n");
|
|
25
|
+
}
|
|
26
|
+
// Runs the fix and returns a Delta carrying only its newEntities + merges.
|
|
27
|
+
export async function runNameFix(executor, contextMd, names, signal) {
|
|
28
|
+
const response = await executor.generateTool("ingest.name-fix", {
|
|
29
|
+
system: NAME_FIX_SYSTEM,
|
|
30
|
+
user: buildNameFixUser(contextMd, names),
|
|
31
|
+
tool: { name: "emit_fix", description: "把待归一名字 merge 到已有或登记为新实体", inputSchema: NAME_FIX_SCHEMA },
|
|
32
|
+
...(signal ? { signal } : {}),
|
|
33
|
+
});
|
|
34
|
+
return { delta: nameFixToDelta(response.input), raw: JSON.stringify(response.input) };
|
|
35
|
+
}
|
|
36
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
37
|
+
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
38
|
+
const str = (v) => (typeof v === "string" ? v.trim() : "");
|
|
39
|
+
const KIND = new Set(["actor", "location", "prop"]);
|
|
40
|
+
export function nameFixToDelta(input) {
|
|
41
|
+
const d = emptyDelta();
|
|
42
|
+
if (!isObj(input))
|
|
43
|
+
return d;
|
|
44
|
+
for (const m of arr(input.merges)) {
|
|
45
|
+
if (!isObj(m))
|
|
46
|
+
continue;
|
|
47
|
+
const from = str(m.from);
|
|
48
|
+
const into = str(m.into);
|
|
49
|
+
if (from && into && from !== into)
|
|
50
|
+
d.merges.push({ from, into });
|
|
51
|
+
}
|
|
52
|
+
for (const e of arr(input.newEntities)) {
|
|
53
|
+
if (!isObj(e))
|
|
54
|
+
continue;
|
|
55
|
+
const kind = str(e.kind);
|
|
56
|
+
const name = str(e.name);
|
|
57
|
+
if (!KIND.has(kind) || !name)
|
|
58
|
+
continue;
|
|
59
|
+
const aliases = [...new Set(arr(e.aliases).map(str).filter((a) => a && a !== name))];
|
|
60
|
+
d.newEntities.push({ name, kind: kind, description: str(e.description), aliases });
|
|
61
|
+
}
|
|
62
|
+
return d;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=name-fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name-fix.js","sourceRoot":"","sources":["../../../../src/llm/tasks/ingest/name-fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { SerialOutput } from "../../../domain/ingest/video-serial-md.js";
|
|
2
2
|
import type { TaskVideoPort, VideoFileHandle } from "../../types.js";
|
|
3
3
|
export type { SerialOutput, SerialScene, SerialEntity } from "../../../domain/ingest/video-serial-md.js";
|
|
4
4
|
export declare const VIDEO_SERIAL_SYSTEM: string;
|
|
5
5
|
export declare function buildSerialUser(episodeNo: number, contextText: string): string;
|
|
6
|
+
export declare function toSerialOutput(input: unknown): SerialOutput;
|
|
6
7
|
export declare function runVideoSerial(port: TaskVideoPort, file: VideoFileHandle, episodeNo: number, contextText: string, fps: number, signal?: AbortSignal): Promise<{
|
|
7
8
|
md: string;
|
|
8
9
|
output: SerialOutput;
|
|
@@ -1,94 +1,33 @@
|
|
|
1
1
|
// ingest.video-serial task (§10.2). The single Gemini pass of the serial video
|
|
2
2
|
// pipeline: it watches ONE episode's video WITH the running cross-episode context
|
|
3
|
-
// (registry + plot digest + open threads) and
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// (
|
|
7
|
-
// the
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
3
|
+
// (registry + plot digest + open threads) and returns ONE structured JSON object
|
|
4
|
+
// (responseMimeType application/json + VIDEO_SERIAL_SCHEMA) carrying both (a) the
|
|
5
|
+
// episode's high-fidelity screenplay (scenes → per-shot anchors) and (b) incremental
|
|
6
|
+
// registry maintenance (new_entities / enrich / resolve) + open threads. This
|
|
7
|
+
// replaces the old "emit markdown → parseSerialMd" contract: structured output
|
|
8
|
+
// removes a whole fragile text-parsing layer and lets the schema forbid the outfit-
|
|
9
|
+
// name pollution (parens/slashes) at the source. Because it parses in order with
|
|
10
|
+
// full plot context, identity is resolved by story — reusing canonical names,
|
|
11
|
+
// registering anchored provisionals for unknowns, and issuing a `还原` once a later
|
|
12
|
+
// episode reveals a provisional's real identity.
|
|
13
13
|
import { CliError, EXIT_RUNTIME } from "../../../common.js";
|
|
14
|
-
import {
|
|
14
|
+
import { VIDEO_SERIAL_SCHEMA } from "../schemas.js";
|
|
15
15
|
export const VIDEO_SERIAL_SYSTEM = "你是短剧视频转剧本的串行解析器。输入是**某一集**竖屏短剧视频(1-2 分钟)+ 一份到上一集为止累积的**已知设定**(人物花名册/剧情进展/未闭合线索)。" +
|
|
16
|
-
"
|
|
16
|
+
"你要输出**一个结构化 JSON 对象**(严格符合系统给定的输出 schema),同时包含:①这一集**逐镜头、高保真**的剧本(scenes);②对已知设定的**增量维护**(registry_delta:人物花名册带状态标注、身份还原)+ 剧情线索(open_threads)。**只输出该 JSON,不要任何额外文字、解释或代码块包裹。**\n" +
|
|
17
17
|
"核心要求:不漏镜头、动作/对白/实体准确、不脑补、时间戳对齐画面。\n" +
|
|
18
18
|
"【身份归属——本任务重点】带着已知设定看这一集:\n" +
|
|
19
19
|
"- 出现的人先判断**是不是花名册里已有的某个人**(比对锚点:发型/眼镜/脸型/体型/年龄段 + 剧情关系)。是 ⇒ 直接沿用其**规范名**,不要另起新名。\n" +
|
|
20
|
-
"- 认不出、也没听到本名的人 ⇒
|
|
21
|
-
"- 已知设定里标了 ·待定 的 provisional 人物,若这一集剧情让你看清了他是谁 ⇒ 在
|
|
20
|
+
"- 认不出、也没听到本名的人 ⇒ **不要硬猜、不要编带姓的假名**。用不含姓氏的描述名(如「湿发中年男」),status 标 `provisional`,写清锚点与作用。\n" +
|
|
21
|
+
"- 已知设定里标了 ·待定 的 provisional 人物,若这一集剧情让你看清了他是谁 ⇒ 在 registry_delta.resolve 里写 {provisional_name, canonical_name, reason}。\n" +
|
|
22
22
|
"【说话人——用剧情锁定,别只看脸】短剧常有几个长相相似的中老年男性高管,单帧人脸会认错。先从台词内容、彼此称呼(谁叫谁「哥」「X总」)、场景关系(谁求谁、谁训谁、谁下跪)推断这场在场是谁、谁对谁说,再定说话人。剧情锁定优先于外貌。\n" +
|
|
23
23
|
"【命名优先级】书面正式姓名(人物介绍条/工牌/来电显示)> 台词喊出的本名 > 纯描述名。有书面正式姓名就用它当规范名,哪怕全集只喊职务。绝不凭空捏造带姓氏的假名。\n" +
|
|
24
24
|
"【画面字幕铁律】每句台词底部压的对白字幕是台词的冗余复制,**必须丢弃**,只保留对应的 dlg,绝不在 act 里复述台词。只有承载新信息的画面文字(人物介绍条/身份头衔/时间地点交代/系统提示/关键道具上的字)才写进 act。\n" +
|
|
25
|
-
"
|
|
25
|
+
"【状态=造型】state / states = 一个角色一整套稳定扮相(着装+发型+持续妆造,如「深灰西装」),不是情绪/姿态,也不是单件衣服。给某角色标造型前,先看已知设定里他名下的「已知造型」清单——只要本集是他已列过的某套扮相(哪怕只拍到上半身/换了角度/光线不同/多看到少看到一件单品),**逐字照抄清单里那个造型名**,只有整套换装才新建。**造型名只填档位名本身,绝不带括号、斜杠、逗号或任何描述文字**(描述放实体 appearance,不要塞进造型名)。";
|
|
26
26
|
export function buildSerialUser(episodeNo, contextText) {
|
|
27
27
|
const ctx = contextText.trim()
|
|
28
28
|
? `========== 已知设定(到上一集为止,规范名以此为准) ==========\n${contextText}\n`
|
|
29
29
|
: "(这是第一集,暂无已知设定。)\n";
|
|
30
|
-
return `解析第 ${episodeNo}
|
|
31
|
-
|
|
32
|
-
${ctx}
|
|
33
|
-
========== 输出格式(严格照此,不要用代码块包裹,不要额外解释) ==========
|
|
34
|
-
## 梗概
|
|
35
|
-
<按发生顺序概括本集剧情,200-300 字纯文本>
|
|
36
|
-
|
|
37
|
-
# 剧本
|
|
38
|
-
|
|
39
|
-
## 场景 1
|
|
40
|
-
- 时空: <内|外> <日|夜>
|
|
41
|
-
- 时间: <MM:SS-MM:SS 本场起止>
|
|
42
|
-
- 地点: <稳定主空间地点名,沿用规范名>
|
|
43
|
-
- 角色: <角色1>(造型), <角色2>
|
|
44
|
-
- 道具: <道具1>, <道具2>
|
|
45
|
-
> [act] [MM:SS] 逐镜头动作/环境描写(含景别;不抄台词字幕)。
|
|
46
|
-
> [dlg|角色名|情绪] [MM:SS] 对白(以口型/音轨为准,称呼保留原话)。
|
|
47
|
-
> [dlg|broadcast:名] [MM:SS] 广播/画外音等非人物发声。
|
|
48
|
-
> [think|角色名] [MM:SS] 内心独白。
|
|
49
|
-
|
|
50
|
-
## 场景 2
|
|
51
|
-
...
|
|
52
|
-
|
|
53
|
-
# 资产维护
|
|
54
|
-
**只报增量。** 已知设定里已有、且本集无新信息的人/物,**不要重复输出**——他们已在花名册里,正文场景的「角色/道具」行照常列全即可。这一区只写:①首次出现的(新增);②已知但需补充/更正的(修正);③身份还原。
|
|
55
|
-
|
|
56
|
-
## 新增人物
|
|
57
|
-
只登记**已知设定里没有**的具体单人角色(首次出现),用多行块,首行标注 canonical/provisional 与 featured/background:
|
|
58
|
-
- <角色名> | <canonical|provisional> | <featured|background>
|
|
59
|
-
外观: <跨集恒定长相:性别+年龄段+脸型+发型+固定标记,不含服饰。认不出可留空>
|
|
60
|
-
锚点: <1-3 个最好认的视觉特征,用于跨集重新指认>
|
|
61
|
-
作用: <剧情身份与关系>
|
|
62
|
-
造型: <本集该角色出现的造型名,多个用 / 分隔;无则省略此行>
|
|
63
|
-
别名: <本集见到的其它称呼,多个用 / 分隔;无则省略此行>
|
|
64
|
-
|
|
65
|
-
## 修正
|
|
66
|
-
对**已知设定里已有**角色的补充/更正——一行一人,**只写发生变化的字段**(看清了更准的外观、本集新造型、新称呼、剧情让作用更明确)。无变化的人不要出现在这里:
|
|
67
|
-
- <角色名> | 外观: <更准外观> | 锚点: <更好的指认特征> | 作用: <更明确身份> | 造型: <本集新造型> | 别名: <本集新称呼>
|
|
68
|
-
|
|
69
|
-
## 新增场景
|
|
70
|
-
只登记已知设定里没有的地点:
|
|
71
|
-
- <地点名> | <featured|background>: <空间类型/风格/主色调/光线/陈设>
|
|
72
|
-
|
|
73
|
-
## 新增道具
|
|
74
|
-
只登记已知设定里没有的道具:
|
|
75
|
-
- <道具名> | <featured|background>: <类别/材质/颜色/标志特征>
|
|
76
|
-
|
|
77
|
-
## 还原
|
|
78
|
-
把已知设定里 provisional(·待定)的人,凭本集剧情还原成真身(没有就整段省略):
|
|
79
|
-
- <之前的描述名> => <真名> | 依据: <剧情依据一句话>
|
|
80
|
-
|
|
81
|
-
## 线索
|
|
82
|
-
本集剧情线索维护(没有就整段省略):
|
|
83
|
-
+ <本集新开、尚未交代结果的悬念/关系变化>
|
|
84
|
-
- [<已知设定里该线索的 id,如 t3_1>] ← 本集交代了结果、关闭它
|
|
85
|
-
|
|
86
|
-
规则:
|
|
87
|
-
- 只登记具体单人角色;群众/路人写进 action 或用 group:名 发声,不进花名册。
|
|
88
|
-
- **已知设定里已有的人/物,除非要补充或更正,否则一个字都别再写**——正文场景行照常列全即可。
|
|
89
|
-
- 造型用描述性命名(深灰西装/金色礼服),不用「默认/常态」。
|
|
90
|
-
- 认不出的人首次登记为 provisional 并写锚点;不要编带姓假名。
|
|
91
|
-
- 每个 act/dlg/think 都带 [MM:SS] 时间戳(分:秒,无需亚秒)。`;
|
|
30
|
+
return `解析第 ${episodeNo} 集:对照本集原视频,按输出 schema 返回 JSON 对象。scenes 逐场逐镜头覆盖全集;registry_delta 只报增量(已知且无新信息的实体不要写)。\n\n${ctx}`;
|
|
92
31
|
}
|
|
93
32
|
function serialError(message, received) {
|
|
94
33
|
return new CliError("INGEST VIDEO SERIAL FAILED", message, {
|
|
@@ -98,23 +37,183 @@ function serialError(message, received) {
|
|
|
98
37
|
nextSteps: ["Inspect the episode error sidecar and rerun `scriptctl ingest` to resume."],
|
|
99
38
|
});
|
|
100
39
|
}
|
|
101
|
-
|
|
102
|
-
|
|
40
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
41
|
+
const asStr = (v) => (typeof v === "string" ? v.trim() : "");
|
|
42
|
+
const asArr = (v) => (Array.isArray(v) ? v : []);
|
|
43
|
+
// Deterministic backstop for outfit-name pollution the schema description already
|
|
44
|
+
// forbids but a model may still leak: a state must be a bare wardrobe label. Strip
|
|
45
|
+
// everything from the first paren/slash/comma separator on — `黑丝短裙(身穿收银短袖)`
|
|
46
|
+
// and `黑丝短裙/绷带短裙` both collapse to `黑丝短裙`, folding the ep39/40/17-style
|
|
47
|
+
// fragments back onto the canonical outfit. Empty stays empty (no change this scene).
|
|
48
|
+
const cleanState = (raw) => {
|
|
49
|
+
const s = asStr(raw);
|
|
50
|
+
return s ? s.split(/[((//,,、]/)[0].trim() : "";
|
|
51
|
+
};
|
|
52
|
+
// Structured-output JSON → SerialOutput. The schema guarantees shape; this is a
|
|
53
|
+
// defensive projection (tolerates missing/wrong-typed fields) that also runs every
|
|
54
|
+
// state through cleanState and re-nests space/time into `environment` the way
|
|
55
|
+
// applyDelta / deltaToDoc expect.
|
|
56
|
+
export function toSerialOutput(input) {
|
|
57
|
+
const out = { synopsis: "", scenes: [], registry_delta: { new_entities: [], enrich: [], resolve: [] }, open_threads: { opened: [], closed: [] } };
|
|
58
|
+
if (!isObj(input))
|
|
59
|
+
return out;
|
|
60
|
+
out.synopsis = asStr(input.synopsis);
|
|
61
|
+
for (const s of asArr(input.scenes)) {
|
|
62
|
+
if (!isObj(s))
|
|
63
|
+
continue;
|
|
64
|
+
const environment = {};
|
|
65
|
+
const space = asStr(s.space);
|
|
66
|
+
if (space)
|
|
67
|
+
environment.space = space;
|
|
68
|
+
const time = asStr(s.time);
|
|
69
|
+
if (time)
|
|
70
|
+
environment.time = time;
|
|
71
|
+
const scene = {
|
|
72
|
+
environment,
|
|
73
|
+
characters: asArr(s.characters).flatMap((c) => {
|
|
74
|
+
if (!isObj(c))
|
|
75
|
+
return [];
|
|
76
|
+
const name = asStr(c.name);
|
|
77
|
+
if (!name)
|
|
78
|
+
return [];
|
|
79
|
+
const state = cleanState(c.state);
|
|
80
|
+
return [state ? { name, state } : { name }];
|
|
81
|
+
}),
|
|
82
|
+
props: asArr(s.props).map(asStr).filter(Boolean),
|
|
83
|
+
anchors: asArr(s.anchors).flatMap((a) => {
|
|
84
|
+
if (!isObj(a))
|
|
85
|
+
return [];
|
|
86
|
+
const kind = asStr(a.kind);
|
|
87
|
+
if (kind !== "act" && kind !== "dlg" && kind !== "think")
|
|
88
|
+
return [];
|
|
89
|
+
const anchor = { kind, content: asStr(a.content) };
|
|
90
|
+
const speaker = asStr(a.speaker);
|
|
91
|
+
if (speaker)
|
|
92
|
+
anchor.speaker = speaker;
|
|
93
|
+
const emotion = asStr(a.emotion);
|
|
94
|
+
if (emotion)
|
|
95
|
+
anchor.emotion = emotion;
|
|
96
|
+
const ts = asStr(a.ts).replace(/\.\d+$/, "");
|
|
97
|
+
if (ts)
|
|
98
|
+
anchor.ts = ts; // drop any sub-second the model leaks → MM:SS
|
|
99
|
+
return [anchor];
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
const timeRange = asStr(s.timeRange);
|
|
103
|
+
if (timeRange)
|
|
104
|
+
scene.timeRange = timeRange;
|
|
105
|
+
const location = asStr(s.location);
|
|
106
|
+
if (location)
|
|
107
|
+
scene.location = location;
|
|
108
|
+
out.scenes.push(scene);
|
|
109
|
+
}
|
|
110
|
+
const rd = isObj(input.registry_delta) ? input.registry_delta : {};
|
|
111
|
+
for (const e of asArr(rd.new_entities)) {
|
|
112
|
+
if (!isObj(e))
|
|
113
|
+
continue;
|
|
114
|
+
const name = asStr(e.name);
|
|
115
|
+
const kind = asStr(e.kind);
|
|
116
|
+
if (!name || (kind !== "actor" && kind !== "location" && kind !== "prop"))
|
|
117
|
+
continue;
|
|
118
|
+
const ent = {
|
|
119
|
+
name,
|
|
120
|
+
kind,
|
|
121
|
+
status: asStr(e.status) === "provisional" ? "provisional" : "canonical",
|
|
122
|
+
importance: asStr(e.importance) === "background" ? "background" : "featured",
|
|
123
|
+
};
|
|
124
|
+
const anchor = asStr(e.anchor);
|
|
125
|
+
if (anchor)
|
|
126
|
+
ent.anchor = anchor;
|
|
127
|
+
const appearance = asStr(e.appearance);
|
|
128
|
+
if (appearance)
|
|
129
|
+
ent.appearance = appearance;
|
|
130
|
+
const role = asStr(e.role);
|
|
131
|
+
if (role)
|
|
132
|
+
ent.role = role;
|
|
133
|
+
const states = asArr(e.states).map(cleanState).filter(Boolean);
|
|
134
|
+
if (states.length)
|
|
135
|
+
ent.states = states;
|
|
136
|
+
const aliases = asArr(e.aliases).map(asStr).filter(Boolean);
|
|
137
|
+
if (aliases.length)
|
|
138
|
+
ent.aliases = aliases;
|
|
139
|
+
out.registry_delta.new_entities.push(ent);
|
|
140
|
+
}
|
|
141
|
+
for (const e of asArr(rd.enrich)) {
|
|
142
|
+
if (!isObj(e))
|
|
143
|
+
continue;
|
|
144
|
+
const name = asStr(e.name);
|
|
145
|
+
if (!name)
|
|
146
|
+
continue;
|
|
147
|
+
const en = { name };
|
|
148
|
+
const anchor = asStr(e.anchor);
|
|
149
|
+
if (anchor)
|
|
150
|
+
en.anchor = anchor;
|
|
151
|
+
const appearance = asStr(e.appearance);
|
|
152
|
+
if (appearance)
|
|
153
|
+
en.appearance = appearance;
|
|
154
|
+
const role = asStr(e.role);
|
|
155
|
+
if (role)
|
|
156
|
+
en.role = role;
|
|
157
|
+
const addA = asArr(e.add_aliases).map(asStr).filter(Boolean);
|
|
158
|
+
if (addA.length)
|
|
159
|
+
en.add_aliases = addA;
|
|
160
|
+
const addS = asArr(e.add_states).map(cleanState).filter(Boolean);
|
|
161
|
+
if (addS.length)
|
|
162
|
+
en.add_states = addS;
|
|
163
|
+
if (Object.keys(en).length > 1)
|
|
164
|
+
out.registry_delta.enrich.push(en);
|
|
165
|
+
}
|
|
166
|
+
for (const r of asArr(rd.resolve)) {
|
|
167
|
+
if (!isObj(r))
|
|
168
|
+
continue;
|
|
169
|
+
const p = asStr(r.provisional_name);
|
|
170
|
+
const c = asStr(r.canonical_name);
|
|
171
|
+
if (p && c)
|
|
172
|
+
out.registry_delta.resolve.push({ provisional_name: p, canonical_name: c, reason: asStr(r.reason) });
|
|
173
|
+
}
|
|
174
|
+
const ot = isObj(input.open_threads) ? input.open_threads : {};
|
|
175
|
+
for (const o of asArr(ot.opened)) {
|
|
176
|
+
if (!isObj(o))
|
|
177
|
+
continue;
|
|
178
|
+
const text = asStr(o.text);
|
|
179
|
+
if (text)
|
|
180
|
+
out.open_threads.opened.push({ text });
|
|
181
|
+
}
|
|
182
|
+
for (const c of asArr(ot.closed)) {
|
|
183
|
+
if (!isObj(c))
|
|
184
|
+
continue;
|
|
185
|
+
const ref = asStr(c.ref);
|
|
186
|
+
if (ref)
|
|
187
|
+
out.open_threads.closed.push({ ref });
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
// Returns the raw JSON text (pretty-printed, persisted for human review) alongside
|
|
192
|
+
// the parsed SerialOutput the pipeline folds into context.
|
|
103
193
|
export async function runVideoSerial(port, file, episodeNo, contextText, fps, signal) {
|
|
104
194
|
const response = await port.generate({
|
|
105
195
|
file,
|
|
106
196
|
system: VIDEO_SERIAL_SYSTEM,
|
|
107
197
|
user: buildSerialUser(episodeNo, contextText),
|
|
108
198
|
fps,
|
|
199
|
+
responseJsonSchema: VIDEO_SERIAL_SCHEMA,
|
|
109
200
|
...(signal ? { signal } : {}),
|
|
110
201
|
});
|
|
111
|
-
const
|
|
112
|
-
// A too-short
|
|
113
|
-
if (
|
|
114
|
-
throw serialError(`episode ${episodeNo}: serial
|
|
115
|
-
|
|
202
|
+
const raw = response.text.trim();
|
|
203
|
+
// A too-short body means a failed/empty generation (§12.3: not retried).
|
|
204
|
+
if (raw.length < 40)
|
|
205
|
+
throw serialError(`episode ${episodeNo}: serial output too short (finishReason=${response.finishReason})`, [`length: ${raw.length}`]);
|
|
206
|
+
let parsed;
|
|
207
|
+
try {
|
|
208
|
+
parsed = JSON.parse(raw);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
throw serialError(`episode ${episodeNo}: serial output was not valid JSON (finishReason=${response.finishReason})`, [raw.slice(0, 200)]);
|
|
212
|
+
}
|
|
213
|
+
const output = toSerialOutput(parsed);
|
|
116
214
|
if (output.scenes.length === 0)
|
|
117
|
-
throw serialError(`episode ${episodeNo}: serial
|
|
215
|
+
throw serialError(`episode ${episodeNo}: serial output produced no scenes`, [raw.slice(0, 200)]);
|
|
216
|
+
const md = JSON.stringify(parsed, null, 2);
|
|
118
217
|
return { md, output };
|
|
119
218
|
}
|
|
120
219
|
//# sourceMappingURL=video-serial.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-serial.js","sourceRoot":"","sources":["../../../../src/llm/tasks/ingest/video-serial.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kFAAkF;AAClF
|
|
1
|
+
{"version":3,"file":"video-serial.js","sourceRoot":"","sources":["../../../../src/llm/tasks/ingest/video-serial.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,3 +3,6 @@ export declare const EPISODE_TITLE_SCHEMA: JsonSchema;
|
|
|
3
3
|
export declare const SYNOPSIS_SCHEMA: JsonSchema;
|
|
4
4
|
export declare const SCRIPT_SYNOPSIS_SCHEMA: JsonSchema;
|
|
5
5
|
export declare const STATE_BINDING_SCHEMA: JsonSchema;
|
|
6
|
+
export declare const SERIAL_DELTA_SCHEMA: JsonSchema;
|
|
7
|
+
export declare const VIDEO_SERIAL_SCHEMA: JsonSchema;
|
|
8
|
+
export declare const NAME_FIX_SCHEMA: JsonSchema;
|