@lingjingai/scriptctl 0.19.2 → 0.20.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/dist/common.d.ts +3 -1
- package/dist/common.js +37 -27
- package/dist/common.js.map +1 -1
- package/dist/domain/direct-core.d.ts +6 -3
- package/dist/domain/direct-core.js +89 -72
- package/dist/domain/direct-core.js.map +1 -1
- package/dist/infra/providers.d.ts +2 -0
- package/dist/infra/providers.js +81 -35
- package/dist/infra/providers.js.map +1 -1
- package/package.json +1 -1
package/dist/common.d.ts
CHANGED
|
@@ -45,7 +45,9 @@ export declare const PROP_REUSE_SCENE_LIMIT = 1;
|
|
|
45
45
|
export declare const MARKDOWN_BATCH_PROMPT_SPEC: string;
|
|
46
46
|
export declare const PARSE_MD_SPEC: string;
|
|
47
47
|
export type JsonSchema = Record<string, unknown>;
|
|
48
|
-
export declare const
|
|
48
|
+
export declare const DEFAULT_METADATA_ASSET_CHUNK = 20;
|
|
49
|
+
export declare const METADATA_GLOBAL_MD_SPEC: string;
|
|
50
|
+
export declare const METADATA_DESC_MD_SPEC: string;
|
|
49
51
|
export declare const EPISODE_TITLE_EXTRACTION_SCHEMA: JsonSchema;
|
|
50
52
|
export declare const EPISODE_SYNOPSIS_SCHEMA: JsonSchema;
|
|
51
53
|
export declare const SCRIPT_SYNOPSIS_SCHEMA: JsonSchema;
|
package/dist/common.js
CHANGED
|
@@ -292,40 +292,50 @@ export const PARSE_MD_SPEC = "scriptctl parse 输入 = 一个 md 工作区目录
|
|
|
292
292
|
"- 群体词(众人 / 群众 / 围观者 / 路人们)不进 人物.md,登到 发声源.md 用 group 或写动作旁白。\n" +
|
|
293
293
|
"- 动作 / 对白正文逐字保留,不要转述 / 翻译 / 概括 / 加注释;动作种类只有 act/dlg/think。\n" +
|
|
294
294
|
"- 每个出现在正文里的角色,都要在 人物.md 给出非空描述(否则校验报错)。\n";
|
|
295
|
-
// Metadata extraction
|
|
296
|
-
//
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
//
|
|
304
|
-
export const
|
|
305
|
-
|
|
306
|
-
|
|
295
|
+
// Metadata extraction is split into many small markdown requests instead of one
|
|
296
|
+
// big one: a single GLOBAL call (worldview + protagonists, tiny input/output)
|
|
297
|
+
// plus N per-asset-chunk DESCRIPTION calls (each ≤ DEFAULT_METADATA_ASSET_CHUNK
|
|
298
|
+
// assets). Markdown (not tool_use JSON) keeps every response well under
|
|
299
|
+
// DEFAULT_BATCH_MAX_TOKENS on the non-streaming `messages.create` path the LiteLLM
|
|
300
|
+
// gateway doesn't drop, and chunking bounds each response so output can't overflow.
|
|
301
|
+
// All keyed by id (not name). Results merge through overlayMetadataSections, which
|
|
302
|
+
// validates enums and backfills any missing asset from the deterministic baseline.
|
|
303
|
+
// How many assets (actors + locations + props, pooled) per description request.
|
|
304
|
+
export const DEFAULT_METADATA_ASSET_CHUNK = 20;
|
|
305
|
+
// GLOBAL call: the two fields a single chunk can't decide — worldview (whole-show
|
|
306
|
+
// judgement) and which actors are protagonists. Tiny input (names + titles, no
|
|
307
|
+
// examples) and tiny output. Parsed by parseGlobalMetadataMd.
|
|
308
|
+
export const METADATA_GLOBAL_MD_SPEC = "Output format: a single markdown document with exactly two top-level sections,\n" +
|
|
309
|
+
"in this order: `# 世界观` then `# 主角`. Do NOT wrap it in fenced code blocks;\n" +
|
|
310
|
+
"do NOT add any prose before or after it.\n" +
|
|
307
311
|
"\n" +
|
|
308
312
|
"# 世界观\n" +
|
|
309
313
|
"<从给定 context.worldview_options 里选且只选一个,原样照抄该选项文字>\n" +
|
|
310
314
|
"\n" +
|
|
311
|
-
"#
|
|
312
|
-
"- <actor_id
|
|
313
|
-
"
|
|
314
|
-
"# 场景\n" +
|
|
315
|
-
"- <location_id> | <场景用途 / 氛围描述>\n" +
|
|
316
|
-
"\n" +
|
|
317
|
-
"# 道具\n" +
|
|
318
|
-
"- <prop_id> | <道具描述>\n" +
|
|
315
|
+
"# 主角\n" +
|
|
316
|
+
"- <actor_id>\n" +
|
|
317
|
+
"- <actor_id>\n" +
|
|
319
318
|
"\n" +
|
|
320
319
|
"Rules:\n" +
|
|
321
320
|
"- 世界观正文必须是 context.worldview_options 中的一个,原样照抄,不要自创、不要翻译。\n" +
|
|
322
|
-
"-
|
|
323
|
-
"
|
|
324
|
-
"-
|
|
325
|
-
|
|
321
|
+
"- 主角小节只列真正的主角 actor_id(行首用 id,不是名字),通常 1-3 个;其余角色\n" +
|
|
322
|
+
" 一律视为配角,不要列出。若拿不准,可只列最核心的一个。\n" +
|
|
323
|
+
"- 只输出这两个小节,不要 JSON、不要解释。\n";
|
|
324
|
+
// DESCRIPTION call: one short visual description per asset id in the given chunk.
|
|
325
|
+
// Uniform `id | 描述` rows under a single section — kind is recovered from the id
|
|
326
|
+
// by the caller. Parsed by parseAssetDescriptionsMd.
|
|
327
|
+
export const METADATA_DESC_MD_SPEC = "Output format: a single markdown document with one top-level section `# 描述`.\n" +
|
|
328
|
+
"Do NOT wrap it in fenced code blocks; do NOT add any prose before or after it.\n" +
|
|
329
|
+
"\n" +
|
|
330
|
+
"# 描述\n" +
|
|
331
|
+
"- <id> | <该资产的简洁可视描述>\n" +
|
|
332
|
+
"- <id> | <...>\n" +
|
|
333
|
+
"\n" +
|
|
334
|
+
"Rules:\n" +
|
|
335
|
+
"- context.assets 里每个条目都带一个 id;为每个条目各写一行,行首用其 id(不是名字)。\n" +
|
|
326
336
|
"- 描述要简洁、服务下游出图,基于给定的 names / states / examples,不要编造剧情。\n" +
|
|
327
337
|
"- 描述里不要出现 `|` 或换行(会被解析截断)。资产名 / 状态写进描述正文即可。\n" +
|
|
328
|
-
"-
|
|
338
|
+
"- 不要输出 context 里没有的 id,不要写世界观 / 主配角,只写描述。\n";
|
|
329
339
|
export const EPISODE_TITLE_EXTRACTION_SCHEMA = {
|
|
330
340
|
type: "object",
|
|
331
341
|
required: ["episode_titles"],
|
|
@@ -359,8 +369,8 @@ export const EPISODE_SYNOPSIS_SCHEMA = {
|
|
|
359
369
|
// Top-level whole-script synopsis schema. Only the final reduce call uses this;
|
|
360
370
|
// it produces the script overview fields a downstream agent reads to answer
|
|
361
371
|
// "what is this script about / who's in it / what's the theme". worldview is
|
|
362
|
-
// produced by metadata extraction (enum-backed, see
|
|
363
|
-
// produced here because it is a whole-show judgement.
|
|
372
|
+
// produced by metadata extraction (enum-backed, see METADATA_GLOBAL_MD_SPEC);
|
|
373
|
+
// style is produced here because it is a whole-show judgement.
|
|
364
374
|
export const SCRIPT_SYNOPSIS_SCHEMA = {
|
|
365
375
|
type: "object",
|
|
366
376
|
required: ["synopsis", "theme", "logline", "style", "main_characters"],
|
package/dist/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -163,10 +163,13 @@ export interface MetadataMdSections {
|
|
|
163
163
|
locations: Map<string, string>;
|
|
164
164
|
props: Map<string, string>;
|
|
165
165
|
}
|
|
166
|
-
export declare function parseMetadataMdSections(raw: string): MetadataMdSections;
|
|
167
|
-
export declare function metadataMdSectionsEmpty(s: MetadataMdSections): boolean;
|
|
168
166
|
export declare function overlayMetadataSections(parsed: MetadataMdSections, script: Dict): Dict;
|
|
169
|
-
export declare function
|
|
167
|
+
export declare function parseGlobalMetadataMd(raw: string): {
|
|
168
|
+
worldviewRaw: string;
|
|
169
|
+
protagonistIds: string[];
|
|
170
|
+
};
|
|
171
|
+
export declare function parseAssetDescriptionsMd(raw: string): Map<string, string>;
|
|
172
|
+
export declare function assembleMetadataFromParts(script: Dict, worldviewRaw: string, protagonistIds: string[], descriptionsById: Map<string, string>): Dict;
|
|
170
173
|
export declare function applyMetadataToScript(script: Dict, metadata: Dict): void;
|
|
171
174
|
interface AssetUsage {
|
|
172
175
|
episodes: Set<string>;
|
|
@@ -2559,73 +2559,6 @@ export function deterministicExtractMetadata(script) {
|
|
|
2559
2559
|
})),
|
|
2560
2560
|
};
|
|
2561
2561
|
}
|
|
2562
|
-
// Split a metadata markdown document (see METADATA_MD_SPEC) into its raw pieces.
|
|
2563
|
-
// This is a DISTINCT grammar from parseMarkdownBatch (id-keyed `id | role | desc`
|
|
2564
|
-
// rows, not the name-keyed `名: 描述` asset registry), so it intentionally does
|
|
2565
|
-
// not share that parser. Strict on section identity: only an EXACT top-level
|
|
2566
|
-
// heading (世界观 / 人物 / 场景 / 道具, any number of leading `#`) opens a section,
|
|
2567
|
-
// so a stray sub-heading like "## 人物关系说明" can't hijack the bullets under it.
|
|
2568
|
-
// A worldview value written inline on the heading (`# 世界观:赛博朋克`) is still
|
|
2569
|
-
// captured. Pipe-split fields keep any extra pipes inside the description. Missing
|
|
2570
|
-
// fields yield "".
|
|
2571
|
-
export function parseMetadataMdSections(raw) {
|
|
2572
|
-
const actors = new Map();
|
|
2573
|
-
const locations = new Map();
|
|
2574
|
-
const props = new Map();
|
|
2575
|
-
let worldviewRaw = "";
|
|
2576
|
-
let section = "";
|
|
2577
|
-
for (const lineRaw of raw.split("\n")) {
|
|
2578
|
-
const line = lineRaw.trim();
|
|
2579
|
-
if (!line)
|
|
2580
|
-
continue;
|
|
2581
|
-
if (line.startsWith("#")) {
|
|
2582
|
-
const heading = line.replace(/^#+/, "").trim();
|
|
2583
|
-
const inlineWorldview = heading.match(/^世界观[::]\s*(.+)$/);
|
|
2584
|
-
if (heading === "人物")
|
|
2585
|
-
section = "actors";
|
|
2586
|
-
else if (heading === "场景")
|
|
2587
|
-
section = "locations";
|
|
2588
|
-
else if (heading === "道具")
|
|
2589
|
-
section = "props";
|
|
2590
|
-
else if (heading === "世界观")
|
|
2591
|
-
section = "worldview";
|
|
2592
|
-
else if (inlineWorldview) {
|
|
2593
|
-
section = "worldview";
|
|
2594
|
-
if (!worldviewRaw)
|
|
2595
|
-
worldviewRaw = inlineWorldview[1].trim();
|
|
2596
|
-
}
|
|
2597
|
-
else
|
|
2598
|
-
section = "";
|
|
2599
|
-
continue;
|
|
2600
|
-
}
|
|
2601
|
-
if (section === "worldview") {
|
|
2602
|
-
if (!worldviewRaw)
|
|
2603
|
-
worldviewRaw = line;
|
|
2604
|
-
continue;
|
|
2605
|
-
}
|
|
2606
|
-
if (section === "")
|
|
2607
|
-
continue;
|
|
2608
|
-
// Keep any extra pipes inside the description (the model may ignore the
|
|
2609
|
-
// no-pipe rule) by rejoining the trailing parts rather than dropping them.
|
|
2610
|
-
const parts = line.replace(/^[-*]\s*/, "").split("|").map((s) => s.trim());
|
|
2611
|
-
const id = parts[0] ?? "";
|
|
2612
|
-
if (!id)
|
|
2613
|
-
continue;
|
|
2614
|
-
if (section === "actors")
|
|
2615
|
-
actors.set(id, { role: parts[1] ?? "", description: parts.slice(2).join(" | ").trim() });
|
|
2616
|
-
else if (section === "locations")
|
|
2617
|
-
locations.set(id, parts.slice(1).join(" | ").trim());
|
|
2618
|
-
else
|
|
2619
|
-
props.set(id, parts.slice(1).join(" | ").trim());
|
|
2620
|
-
}
|
|
2621
|
-
return { worldviewRaw, actors, locations, props };
|
|
2622
|
-
}
|
|
2623
|
-
// True when nothing recognizable parsed — no worldview and no asset rows. The
|
|
2624
|
-
// provider boundary uses this to reject a non-conforming response (prose refusal,
|
|
2625
|
-
// wrong format) instead of silently degrading to a name-only baseline.
|
|
2626
|
-
export function metadataMdSectionsEmpty(s) {
|
|
2627
|
-
return !s.worldviewRaw.trim() && s.actors.size === 0 && s.locations.size === 0 && s.props.size === 0;
|
|
2628
|
-
}
|
|
2629
2562
|
// Resolve a raw worldview line to a valid enum value, or null if it can't be
|
|
2630
2563
|
// pinned down. Exact match wins; otherwise a substring match is accepted ONLY
|
|
2631
2564
|
// when exactly one enum value appears, so a line naming two (e.g. "古代历史…古风
|
|
@@ -2674,11 +2607,95 @@ export function overlayMetadataSections(parsed, script) {
|
|
|
2674
2607
|
base["confidence"] = "high";
|
|
2675
2608
|
return base;
|
|
2676
2609
|
}
|
|
2677
|
-
// Parse
|
|
2678
|
-
//
|
|
2679
|
-
//
|
|
2680
|
-
export function
|
|
2681
|
-
|
|
2610
|
+
// Parse the GLOBAL metadata call (see METADATA_GLOBAL_MD_SPEC): a worldview line
|
|
2611
|
+
// and a list of protagonist actor_ids. Same exact-heading + inline-worldview
|
|
2612
|
+
// tolerance as parseMetadataMdSections.
|
|
2613
|
+
export function parseGlobalMetadataMd(raw) {
|
|
2614
|
+
let worldviewRaw = "";
|
|
2615
|
+
const protagonistIds = [];
|
|
2616
|
+
let section = "";
|
|
2617
|
+
for (const lineRaw of raw.split("\n")) {
|
|
2618
|
+
const line = lineRaw.trim();
|
|
2619
|
+
if (!line)
|
|
2620
|
+
continue;
|
|
2621
|
+
if (line.startsWith("#")) {
|
|
2622
|
+
const heading = line.replace(/^#+/, "").trim();
|
|
2623
|
+
const inlineWorldview = heading.match(/^世界观[::]\s*(.+)$/);
|
|
2624
|
+
if (heading === "世界观")
|
|
2625
|
+
section = "worldview";
|
|
2626
|
+
else if (heading === "主角")
|
|
2627
|
+
section = "leads";
|
|
2628
|
+
else if (inlineWorldview) {
|
|
2629
|
+
section = "worldview";
|
|
2630
|
+
if (!worldviewRaw)
|
|
2631
|
+
worldviewRaw = inlineWorldview[1].trim();
|
|
2632
|
+
}
|
|
2633
|
+
else
|
|
2634
|
+
section = "";
|
|
2635
|
+
continue;
|
|
2636
|
+
}
|
|
2637
|
+
if (section === "worldview") {
|
|
2638
|
+
if (!worldviewRaw)
|
|
2639
|
+
worldviewRaw = line;
|
|
2640
|
+
continue;
|
|
2641
|
+
}
|
|
2642
|
+
if (section === "leads") {
|
|
2643
|
+
const id = (line.replace(/^[-*]\s*/, "").split("|")[0] ?? "").trim();
|
|
2644
|
+
if (id)
|
|
2645
|
+
protagonistIds.push(id);
|
|
2646
|
+
}
|
|
2647
|
+
}
|
|
2648
|
+
return { worldviewRaw, protagonistIds };
|
|
2649
|
+
}
|
|
2650
|
+
// Parse a DESCRIPTION chunk (see METADATA_DESC_MD_SPEC): uniform `id | 描述` rows.
|
|
2651
|
+
// Tolerant — collects any bullet with a non-empty description, ignores headings.
|
|
2652
|
+
// Pipes inside the description are preserved.
|
|
2653
|
+
export function parseAssetDescriptionsMd(raw) {
|
|
2654
|
+
const out = new Map();
|
|
2655
|
+
for (const lineRaw of raw.split("\n")) {
|
|
2656
|
+
const line = lineRaw.trim();
|
|
2657
|
+
if (!line || line.startsWith("#") || !/^[-*]\s+/.test(line))
|
|
2658
|
+
continue;
|
|
2659
|
+
const parts = line.replace(/^[-*]\s*/, "").split("|").map((s) => s.trim());
|
|
2660
|
+
const id = parts[0] ?? "";
|
|
2661
|
+
const description = parts.slice(1).join(" | ").trim();
|
|
2662
|
+
if (id && description)
|
|
2663
|
+
out.set(id, description);
|
|
2664
|
+
}
|
|
2665
|
+
return out;
|
|
2666
|
+
}
|
|
2667
|
+
// Merge the chunked metadata pieces (global worldview + protagonist ids + a
|
|
2668
|
+
// pooled id→description map) into the deterministicExtractMetadata dict shape.
|
|
2669
|
+
// Descriptions are routed to actor/location/prop by matching the script's id sets
|
|
2670
|
+
// (unknown ids are dropped), then overlayMetadataSections applies them onto the
|
|
2671
|
+
// baseline (with enum/role coercion and backfill).
|
|
2672
|
+
export function assembleMetadataFromParts(script, worldviewRaw, protagonistIds, descriptionsById) {
|
|
2673
|
+
const idSet = (list, key) => new Set(asList(list).map((it) => strOf(it[key])).filter((s) => s));
|
|
2674
|
+
const actorIds = idSet(script["actors"], "actor_id");
|
|
2675
|
+
const locationIds = idSet(script["locations"], "location_id");
|
|
2676
|
+
const propIds = idSet(script["props"], "prop_id");
|
|
2677
|
+
const sections = {
|
|
2678
|
+
worldviewRaw,
|
|
2679
|
+
actors: new Map(),
|
|
2680
|
+
locations: new Map(),
|
|
2681
|
+
props: new Map(),
|
|
2682
|
+
};
|
|
2683
|
+
for (const [id, description] of descriptionsById) {
|
|
2684
|
+
if (actorIds.has(id))
|
|
2685
|
+
sections.actors.set(id, { role: "", description });
|
|
2686
|
+
else if (locationIds.has(id))
|
|
2687
|
+
sections.locations.set(id, description);
|
|
2688
|
+
else if (propIds.has(id))
|
|
2689
|
+
sections.props.set(id, description);
|
|
2690
|
+
}
|
|
2691
|
+
for (const pid of protagonistIds) {
|
|
2692
|
+
if (!actorIds.has(pid))
|
|
2693
|
+
continue;
|
|
2694
|
+
const cur = sections.actors.get(pid) ?? { role: "", description: "" };
|
|
2695
|
+
cur.role = "主角";
|
|
2696
|
+
sections.actors.set(pid, cur);
|
|
2697
|
+
}
|
|
2698
|
+
return overlayMetadataSections(sections, script);
|
|
2682
2699
|
}
|
|
2683
2700
|
export function applyMetadataToScript(script, metadata) {
|
|
2684
2701
|
script["worldview"] = metadata["worldview"];
|