@waterwx/dsh-novel-forge 2.1.0-alpha → 2.1.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/README.md +368 -457
- package/lib/client.js +20495 -22316
- package/lib/index.js +4640 -3932
- package/lib/types/action-guard.d.ts +61 -0
- package/lib/types/ai-scan.d.ts +0 -6
- package/lib/types/assets.d.ts +7 -9
- package/lib/types/assistant.d.ts +25 -0
- package/lib/types/author-assets.d.ts +1 -3
- package/lib/types/bookshelf.d.ts +13 -3
- package/lib/types/client/api.d.ts +49 -29
- package/lib/types/client/chip-prefs.d.ts +36 -0
- package/lib/types/client/docx.d.ts +2 -2
- package/lib/types/client/llmLive.d.ts +12 -14
- package/lib/types/client/locales.d.ts +12 -67
- package/lib/types/client/mount.d.ts +0 -2
- package/lib/types/client/panel/AdaptModeView.d.ts +1 -1
- package/lib/types/client/panel/AiTag.d.ts +1 -0
- package/lib/types/client/panel/AssetsTab.d.ts +1 -1
- package/lib/types/client/panel/AssistantTab.d.ts +4 -1
- package/lib/types/client/panel/AuthorAssetsView.d.ts +1 -1
- package/lib/types/client/panel/AuthorHome.d.ts +12 -12
- package/lib/types/client/panel/CmdPalette.d.ts +12 -0
- package/lib/types/client/panel/CreateBookView.d.ts +1 -1
- package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +1 -1
- package/lib/types/client/panel/ImportModal.d.ts +1 -1
- package/lib/types/client/panel/LiveFeedLog.d.ts +8 -0
- package/lib/types/client/panel/ModelManager.d.ts +2 -2
- package/lib/types/client/panel/NovelPanel.d.ts +7 -2
- package/lib/types/client/panel/PageHeader.d.ts +18 -0
- package/lib/types/client/panel/ProgressConsole.d.ts +1 -1
- package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
- package/lib/types/client/panel/ReaderView.d.ts +1 -1
- package/lib/types/client/panel/RunPanel.d.ts +1 -1
- package/lib/types/client/panel/SettingsView.d.ts +13 -10
- package/lib/types/client/panel/ShelfView.d.ts +11 -2
- package/lib/types/client/panel/SubPage.d.ts +27 -0
- package/lib/types/client/panel/TensionView.d.ts +18 -0
- package/lib/types/client/panel/TimelineView.d.ts +18 -0
- package/lib/types/client/panel/WorldTab.d.ts +1 -1
- package/lib/types/client/panel/helpers.d.ts +5 -3
- package/lib/types/client/panel/market-radar-state.d.ts +56 -0
- package/lib/types/client/panel/outline-markdown.d.ts +112 -0
- package/lib/types/client/panel/status-badge.d.ts +13 -0
- package/lib/types/client/panel/storage-parse.d.ts +46 -0
- package/lib/types/client/panel/toast.d.ts +2 -0
- package/lib/types/client/panel/usePersistentState.d.ts +17 -0
- package/lib/types/client/panel/views.d.ts +21 -35
- package/lib/types/client/run-status.d.ts +21 -0
- package/lib/types/client/sidebar-entry.d.ts +0 -2
- package/lib/types/digest-parse.d.ts +29 -0
- package/lib/types/docx-core.d.ts +16 -0
- package/lib/types/docx.d.ts +2 -3
- package/lib/types/engine.d.ts +122 -103
- package/lib/types/home.d.ts +11 -0
- package/lib/types/index.d.ts +21 -13
- package/lib/types/llm-live.d.ts +62 -36
- package/lib/types/llm-retry.d.ts +38 -0
- package/lib/types/market-radar-scan.d.ts +0 -1
- package/lib/types/market-radar-sources.d.ts +1 -1
- package/lib/types/migrate-output.d.ts +25 -0
- package/lib/types/model-capability.d.ts +119 -0
- package/lib/types/model-request.d.ts +36 -0
- package/lib/types/output-budget.d.ts +86 -0
- package/lib/types/plotline-align.d.ts +35 -0
- package/lib/types/prompt-slots.d.ts +57 -0
- package/lib/types/prompting.d.ts +2 -27
- package/lib/types/protocol.d.ts +479 -595
- package/lib/types/revision.d.ts +76 -0
- package/lib/types/routes.d.ts +9 -3
- package/lib/types/run-selection.d.ts +51 -0
- package/lib/types/run.d.ts +31 -0
- package/lib/types/settings-persist.d.ts +59 -0
- package/lib/types/snapshots.d.ts +46 -0
- package/lib/types/stage-contract.d.ts +58 -0
- package/lib/types/stream-fallback.d.ts +60 -0
- package/lib/types/strip-headings.d.ts +33 -0
- package/lib/types/tension.d.ts +53 -0
- package/lib/types/timeline.d.ts +37 -0
- package/package.json +50 -27
- package/assets/styles/arcane-thick-3d.webp +0 -0
- package/assets/styles/chinese-ink.webp +0 -0
- package/assets/styles/clay-stopmotion-3d.webp +0 -0
- package/assets/styles/dark-ghibli.webp +0 -0
- package/assets/styles/dark-gothic-3d.webp +0 -0
- package/assets/styles/film-photo.webp +0 -0
- package/assets/styles/guofeng-heavy.webp +0 -0
- package/assets/styles/guoman-2d-gufeng.webp +0 -0
- package/assets/styles/guoman-3d-tianyuan.webp +0 -0
- package/assets/styles/guoman-3d-xuanhuan.webp +0 -0
- package/assets/styles/horror-game-3d.webp +0 -0
- package/assets/styles/hyperreal-3d.webp +0 -0
- package/assets/styles/japan-cel-dark.webp +0 -0
- package/assets/styles/korean-webtoon.webp +0 -0
- package/assets/styles/low-cyberpunk-3d.webp +0 -0
- package/assets/styles/nextgen-cg.webp +0 -0
- package/assets/styles/noir-film.webp +0 -0
- package/assets/styles/openworld-survival.webp +0 -0
- package/assets/styles/paper-cut-3d.webp +0 -0
- package/assets/styles/pixar-adult-3d.webp +0 -0
- package/assets/styles/pop-marvel-2d.webp +0 -0
- package/assets/styles/sandiao-qban.webp +0 -0
- package/assets/styles/shinkai-anime.webp +0 -0
- package/assets/styles/tactical-stealth.webp +0 -0
- package/assets/styles/urban-lightreal-3d.webp +0 -0
- package/assets/styles/vaporwave-3d.webp +0 -0
- package/assets/styles/vhs90.webp +0 -0
- package/lib/types/client/panel/BookshelfBar.d.ts +0 -11
- package/lib/types/client/panel/FlowGuide.d.ts +0 -22
- package/lib/types/client/panel/MangaRoleLibrary.d.ts +0 -20
- package/lib/types/client/panel/MangaWorkspace.d.ts +0 -12
- package/lib/types/client/panel/ModelPicker.d.ts +0 -11
- package/lib/types/client/panel/ProgressHomeView.d.ts +0 -5
- package/lib/types/client/panel/PropLibrary.d.ts +0 -8
- package/lib/types/client/panel/SceneLibrary.d.ts +0 -16
- package/lib/types/client/panel/StoryboardTab.d.ts +0 -19
- package/lib/types/client/panel/StyleCard.d.ts +0 -8
- package/lib/types/client/panel/StyleGallery.d.ts +0 -1
- package/lib/types/comic-presets.d.ts +0 -12
- package/lib/types/manga-genre-rules.d.ts +0 -22
- package/lib/types/prompt-utils.d.ts +0 -35
- package/lib/types/review-policy.d.ts +0 -97
- package/lib/types/shot-language.d.ts +0 -46
- package/lib/types/src/ai-scan.d.ts +0 -36
- package/lib/types/src/assets.d.ts +0 -37
- package/lib/types/src/assistant.d.ts +0 -45
- package/lib/types/src/author-assets.d.ts +0 -25
- package/lib/types/src/bookshelf.d.ts +0 -42
- package/lib/types/src/client/api.d.ts +0 -234
- package/lib/types/src/client/docx.d.ts +0 -15
- package/lib/types/src/client/index.d.ts +0 -14
- package/lib/types/src/client/locales.d.ts +0 -212
- package/lib/types/src/client/mount.d.ts +0 -9
- package/lib/types/src/client/panel/AdaptModeView.d.ts +0 -5
- package/lib/types/src/client/panel/AssetsTab.d.ts +0 -12
- package/lib/types/src/client/panel/AssistantTab.d.ts +0 -7
- package/lib/types/src/client/panel/AuthorAssetsView.d.ts +0 -4
- package/lib/types/src/client/panel/AuthorHome.d.ts +0 -32
- package/lib/types/src/client/panel/BookshelfBar.d.ts +0 -11
- package/lib/types/src/client/panel/CreateBookView.d.ts +0 -9
- package/lib/types/src/client/panel/FlowGuide.d.ts +0 -22
- package/lib/types/src/client/panel/GlobalAssetLibraryView.d.ts +0 -4
- package/lib/types/src/client/panel/ImportModal.d.ts +0 -7
- package/lib/types/src/client/panel/MangaRoleLibrary.d.ts +0 -20
- package/lib/types/src/client/panel/MangaWorkspace.d.ts +0 -12
- package/lib/types/src/client/panel/ModelManager.d.ts +0 -14
- package/lib/types/src/client/panel/NovelPanel.d.ts +0 -13
- package/lib/types/src/client/panel/ProgressConsole.d.ts +0 -17
- package/lib/types/src/client/panel/ProgressHomeView.d.ts +0 -5
- package/lib/types/src/client/panel/PropLibrary.d.ts +0 -8
- package/lib/types/src/client/panel/ReaderView.d.ts +0 -8
- package/lib/types/src/client/panel/ReasoningSection.d.ts +0 -10
- package/lib/types/src/client/panel/RunPanel.d.ts +0 -5
- package/lib/types/src/client/panel/SceneLibrary.d.ts +0 -16
- package/lib/types/src/client/panel/SettingsView.d.ts +0 -16
- package/lib/types/src/client/panel/ShelfView.d.ts +0 -15
- package/lib/types/src/client/panel/StoryboardTab.d.ts +0 -19
- package/lib/types/src/client/panel/StyleCard.d.ts +0 -8
- package/lib/types/src/client/panel/StyleGallery.d.ts +0 -1
- package/lib/types/src/client/panel/WorldTab.d.ts +0 -10
- package/lib/types/src/client/panel/controller.d.ts +0 -19
- package/lib/types/src/client/panel/helpers.d.ts +0 -18
- package/lib/types/src/client/panel/views.d.ts +0 -77
- package/lib/types/src/client/sidebar-entry.d.ts +0 -13
- package/lib/types/src/client/text.d.ts +0 -9
- package/lib/types/src/comic-presets.d.ts +0 -12
- package/lib/types/src/docx.d.ts +0 -19
- package/lib/types/src/engine.d.ts +0 -402
- package/lib/types/src/index.d.ts +0 -79
- package/lib/types/src/manga-genre-rules.d.ts +0 -22
- package/lib/types/src/novel-context.d.ts +0 -80
- package/lib/types/src/prompt-utils.d.ts +0 -35
- package/lib/types/src/protocol.d.ts +0 -2176
- package/lib/types/src/review-policy.d.ts +0 -97
- package/lib/types/src/routes.d.ts +0 -29
- package/lib/types/src/run.d.ts +0 -32
- package/lib/types/src/shot-language.d.ts +0 -46
- package/lib/types/src/story-beat-language.d.ts +0 -35
- package/lib/types/src/style-library.d.ts +0 -33
- package/lib/types/story-beat-language.d.ts +0 -35
- package/lib/types/style-library.d.ts +0 -33
- package/src/ai-scan.ts +0 -179
- package/src/assets.ts +0 -1774
- package/src/assistant.ts +0 -915
- package/src/author-assets.ts +0 -147
- package/src/bookshelf.ts +0 -167
- package/src/client/api.ts +0 -716
- package/src/client/css-modules.d.ts +0 -8
- package/src/client/docx.ts +0 -69
- package/src/client/index.ts +0 -34
- package/src/client/llmLive.ts +0 -101
- package/src/client/locales.ts +0 -418
- package/src/client/mount.tsx +0 -97
- package/src/client/mount.tsx._new +0 -97
- package/src/client/mount.tsx._nf +0 -97
- package/src/client/mount.tsx._tmp +0 -97
- package/src/client/panel/AdaptModeView.tsx +0 -535
- package/src/client/panel/AssetsTab.tsx +0 -458
- package/src/client/panel/AssistantTab.tsx +0 -339
- package/src/client/panel/AuthorAssetsView.tsx +0 -208
- package/src/client/panel/AuthorHome.tsx +0 -235
- package/src/client/panel/BookAnalysisView.tsx +0 -60
- package/src/client/panel/BookshelfBar.tsx +0 -170
- package/src/client/panel/CreateBookView.tsx +0 -371
- package/src/client/panel/DirectorView.tsx +0 -200
- package/src/client/panel/FlowGuide.tsx +0 -84
- package/src/client/panel/GlobalAssetLibraryView.tsx +0 -172
- package/src/client/panel/IdeaInspirationView.tsx +0 -71
- package/src/client/panel/ImportModal.tsx +0 -303
- package/src/client/panel/KnowledgeBaseView.tsx +0 -73
- package/src/client/panel/LiveFeedLog.tsx +0 -76
- package/src/client/panel/MangaRoleLibrary.tsx +0 -1002
- package/src/client/panel/MangaWorkspace.tsx +0 -715
- package/src/client/panel/MarketRadarView.tsx +0 -374
- package/src/client/panel/ModelManager.tsx +0 -205
- package/src/client/panel/NovelPanel.tsx +0 -4721
- package/src/client/panel/ProgressConsole.tsx +0 -63
- package/src/client/panel/ProgressHomeView.tsx +0 -87
- package/src/client/panel/PropLibrary.tsx +0 -175
- package/src/client/panel/ReaderView.tsx +0 -306
- package/src/client/panel/ReasoningSection.tsx +0 -31
- package/src/client/panel/RunPanel.tsx +0 -204
- package/src/client/panel/SceneLibrary.tsx +0 -453
- package/src/client/panel/SettingsView.tsx +0 -289
- package/src/client/panel/ShelfView.tsx +0 -242
- package/src/client/panel/StoryboardTab.tsx +0 -472
- package/src/client/panel/StyleCard.tsx +0 -90
- package/src/client/panel/StyleGallery.tsx +0 -58
- package/src/client/panel/WorldTab.tsx +0 -202
- package/src/client/panel/controller.ts +0 -45
- package/src/client/panel/helpers.ts +0 -67
- package/src/client/panel/panel.module.css +0 -4359
- package/src/client/panel/views.tsx +0 -314
- package/src/client/sidebar-entry.ts +0 -122
- package/src/client/text.ts +0 -28
- package/src/comic-presets.ts +0 -67
- package/src/docx.ts +0 -83
- package/src/engine.ts +0 -5636
- package/src/global-assets.ts +0 -59
- package/src/index.ts +0 -345
- package/src/llm-live.ts +0 -68
- package/src/manga-genre-rules.ts +0 -87
- package/src/market-radar-scan.ts +0 -41
- package/src/market-radar-sources.ts +0 -173
- package/src/novel-context.ts +0 -287
- package/src/prompt-utils.ts +0 -73
- package/src/prompting.ts +0 -159
- package/src/protocol.ts +0 -2565
- package/src/review-policy.ts +0 -161
- package/src/routes.ts +0 -3939
- package/src/run.ts +0 -338
- package/src/shot-language.ts +0 -181
- package/src/story-beat-language.ts +0 -130
- package/src/style-library.ts +0 -84
package/lib/types/llm-live.d.ts
CHANGED
|
@@ -1,44 +1,70 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* LLM 实况 feed
|
|
2
|
+
* LLM 实况 feed:以「每次 LLM 调用」为粒度,把生命周期事件(开始/流式正文/阶段变化/完成)
|
|
3
|
+
* 推给订阅者,并提供环形缓冲供新连上的客户端重放。
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* 同时承担三件与用量有关的事(进程内,不落盘):
|
|
6
|
+
* 1) **用量账本**:每次调用结束后按用途累计 token / 耗时,供 /status 展示;
|
|
7
|
+
* 2) **Prompt 记录**:保存每次调用实际发送的 system + user(环形,按需查询);
|
|
8
|
+
* 3) **首字耗时**:调用方在拿到第一个文本增量时打点,用于观察模型响应速度。
|
|
6
9
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
import type { BlockAssembler, TokenUsage } from '@deepseek-ai/dsh-llm';
|
|
11
|
+
import type { LlmLiveFrame, LlmPromptRecord, LlmTokenUsage, LlmUsageSummary } from './protocol.ts';
|
|
12
|
+
export type { LlmLiveFrame };
|
|
13
|
+
type Listener = (frame: LlmLiveFrame) => void;
|
|
14
|
+
export declare function nextSessionId(): string;
|
|
15
|
+
export declare function subscribeLiveFeed(listener: Listener): () => void;
|
|
16
|
+
export declare function emitLive(frame: LlmLiveFrame): void;
|
|
17
|
+
/** 把 dsh-llm 的 usage 转成线上形状。 */
|
|
18
|
+
export declare function toLiveUsage(usage: TokenUsage | undefined): LlmTokenUsage | undefined;
|
|
19
|
+
/** 本次运行的用量汇总(按耗时降序排列用途,便于看谁最贵)。 */
|
|
20
|
+
export declare function liveUsage(): LlmUsageSummary;
|
|
21
|
+
/** 清零用量账本(面板「重新计数」用)。 */
|
|
22
|
+
export declare function resetLiveUsage(): void;
|
|
23
|
+
/** 记一条 Prompt(超长截断并标记)。 */
|
|
24
|
+
export declare function recordPrompt(input: {
|
|
11
25
|
sessionId: string;
|
|
12
|
-
/** 本次调用用途(如 正文生成/审稿/章节规划)。 */
|
|
13
26
|
label?: string;
|
|
14
|
-
/** 使用模型(用于展示)。 */
|
|
15
27
|
model?: string;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
system?: string;
|
|
29
|
+
user?: string;
|
|
30
|
+
}): LlmPromptRecord;
|
|
31
|
+
/** 取一条 Prompt 记录(不存在返回 undefined)。 */
|
|
32
|
+
export declare function livePrompt(sessionId: string): LlmPromptRecord | undefined;
|
|
33
|
+
/** 一次调用的打点句柄。 */
|
|
34
|
+
export interface LiveCallHandle {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
startedAt: number;
|
|
37
|
+
/** 用途(用于 session_completed 的用量分组)。 */
|
|
38
|
+
label: string;
|
|
39
|
+
/** 实际使用的模型。 */
|
|
40
|
+
model: string;
|
|
41
|
+
/** 首字耗时(毫秒),由 markFirstToken 写入。 */
|
|
42
|
+
firstTokenMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 开始一次 LLM 调用:发 session_started、记 Prompt、起计时。
|
|
46
|
+
*
|
|
47
|
+
* @param input 用途/模型/实际发送的 system 与 user。
|
|
48
|
+
* @returns 打点句柄(结束时交给 endLiveCall)。
|
|
49
|
+
*/
|
|
50
|
+
export declare function beginLiveCall(input: {
|
|
51
|
+
label: string;
|
|
52
|
+
model: string;
|
|
53
|
+
system?: string;
|
|
54
|
+
user?: string;
|
|
55
|
+
}): LiveCallHandle;
|
|
56
|
+
/** 首字打点(调用方在收到第一个文本增量时调用,只记第一次)。 */
|
|
57
|
+
export declare function markFirstToken(handle: LiveCallHandle): void;
|
|
58
|
+
/**
|
|
59
|
+
* 结束一次 LLM 调用:从 assembler 取用量,发 session_completed(含 token/耗时/首字)。
|
|
60
|
+
*
|
|
61
|
+
* @param handle beginLiveCall 的句柄。
|
|
62
|
+
* @param assembler 本次调用的 BlockAssembler。
|
|
63
|
+
* @param extra 字符数/预览/失败信息等。
|
|
64
|
+
*/
|
|
65
|
+
export declare function endLiveCall(handle: LiveCallHandle, assembler: BlockAssembler, extra?: {
|
|
66
|
+
chars?: number;
|
|
34
67
|
preview?: string;
|
|
35
|
-
|
|
68
|
+
phase?: 'completed' | 'failed';
|
|
36
69
|
error?: string;
|
|
37
|
-
}
|
|
38
|
-
type Listener = (frame: LlmLiveFrame) => void;
|
|
39
|
-
export declare function nextSessionId(): string;
|
|
40
|
-
export declare function subscribeLiveFeed(listener: Listener): () => void;
|
|
41
|
-
export declare function emitLive(frame: LlmLiveFrame): void;
|
|
42
|
-
export declare function liveLatest(): LlmLiveFrame[];
|
|
43
|
-
export declare function clearLiveFeed(): void;
|
|
44
|
-
export {};
|
|
70
|
+
}): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型失败恢复规则(纯逻辑,可离线单测)。
|
|
3
|
+
*
|
|
4
|
+
* 解决的问题:批量连写时,主模型偶发限流/超时/额度耗尽会让**整批中断**,
|
|
5
|
+
* 而换一个模型重试一次往往就能过去。规则:
|
|
6
|
+
* 1) 只对「可重试」错误切换模型——用户主动取消、参数/契约类错误不重试;
|
|
7
|
+
* 2) 备用模型为空或与主模型相同则不切换;
|
|
8
|
+
* 3) 备用模型也失败时,抛**原始错误**(保留主因,不掩盖现场);
|
|
9
|
+
* 4) 每次调用最多切换一次。
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 判断一次 LLM 失败是否值得换模型重试。
|
|
13
|
+
*
|
|
14
|
+
* @param error 捕获到的异常。
|
|
15
|
+
* @returns 可重试时为 true。
|
|
16
|
+
*/
|
|
17
|
+
export declare function isRetryableLlmError(error: unknown): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 判断是否应当切换到备用模型。
|
|
20
|
+
*
|
|
21
|
+
* @param fallbackModel 配置的备用模型(空串 = 未配置)。
|
|
22
|
+
* @param primaryModel 本次实际使用的主模型。
|
|
23
|
+
* @param error 捕获到的异常。
|
|
24
|
+
* @returns 应当切换时为 true。
|
|
25
|
+
*/
|
|
26
|
+
export declare function shouldSwitchModel(fallbackModel: string | undefined, primaryModel: string, error: unknown): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* 用主模型执行;失败且满足切换条件时,用备用模型再执行一次。
|
|
29
|
+
*
|
|
30
|
+
* @param input 主模型 / 备用模型 / 实际执行函数(接收本次要用的模型 id)。
|
|
31
|
+
* @returns 执行结果(备用模型成功时返回其结果)。
|
|
32
|
+
* @throws 主模型失败且未切换时抛原错误;切换后仍失败时同样抛**主模型的原始错误**。
|
|
33
|
+
*/
|
|
34
|
+
export declare function withModelFallback<T>(input: {
|
|
35
|
+
model: string;
|
|
36
|
+
fallbackModel?: string;
|
|
37
|
+
onSwitch?: (from: string, to: string, error: unknown) => void;
|
|
38
|
+
}, run: (model: string) => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 输出目录迁移(Migrate Output Dir)— 把一本书/默认输出目录的内容搬到新位置。
|
|
3
|
+
*
|
|
4
|
+
* 安全纪律(数据零丢失排序):
|
|
5
|
+
* 1. copy 全部内容到新目录(源目录始终原样保留);
|
|
6
|
+
* 2. 调用方完成配置写入 / 书架重指向后,最后一步才删源目录;
|
|
7
|
+
* 3. 中途任何失败,最坏情况只是新目录多一份副本,源数据零丢失。
|
|
8
|
+
*/
|
|
9
|
+
/** 目录内容清单(相对路径 + 总字节)。 */
|
|
10
|
+
export interface DirContents {
|
|
11
|
+
files: string[];
|
|
12
|
+
bytes: number;
|
|
13
|
+
}
|
|
14
|
+
/** 规范化路径用于比较(统一分隔符,Windows 忽略大小写)。 */
|
|
15
|
+
export declare function normalizeDir(dir: string): string;
|
|
16
|
+
/** 列出目录全部内容(递归;子目录以 `name/` 形式占位列出)。 */
|
|
17
|
+
export declare function listDirContents(dir: string): DirContents;
|
|
18
|
+
/**
|
|
19
|
+
* 把 from 全部内容复制到 to(源目录保留,删除由调用方在收尾执行)。
|
|
20
|
+
* 目标必须不存在或为空目录(防覆盖无关数据);禁止互相嵌套的目录对。
|
|
21
|
+
* @returns 复制的顶层条目数。
|
|
22
|
+
*/
|
|
23
|
+
export declare function copyDirContents(from: string, to: string): number;
|
|
24
|
+
/** 删除源目录(仅复制 + 配置/书架重指向全部成功后调用)。 */
|
|
25
|
+
export declare function removeDir(dir: string): void;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型参数能力兼容层。
|
|
3
|
+
*
|
|
4
|
+
* 设计原则:**界面上保存的温度/思考档位是用户偏好,不是最终请求值。** 构造请求前
|
|
5
|
+
* 必须经过本层收敛到厂商允许的范围 —— 否则换模型、走自定义中转、或厂商改了约束,
|
|
6
|
+
* 就会出现「换个 provider 就报参数错误」这类故障。
|
|
7
|
+
*
|
|
8
|
+
* 两条硬要求:
|
|
9
|
+
* 1. **按模型身份判断,不按 provider 判断**。同一个模型经由自定义中转调用时,
|
|
10
|
+
* provider 名可能完全自定义,但参数约束属于模型本身;把判断写成
|
|
11
|
+
* `provider === '某个厂商' && ...` 会让走中转的调用绕过约束。
|
|
12
|
+
* 2. **约束要有出处**。每条规则的来源写在规则上,不靠猜。下列规则来自厂商官方
|
|
13
|
+
* 《模型参数参考》(https://platform.kimi.com/docs/api/models-overview.md):
|
|
14
|
+
* · kimi-k3 : temperature 固定 1.0;支持顶层 reasoning_effort
|
|
15
|
+
* · kimi-k2.7-code : temperature 固定 1.0;不支持 reasoning_effort(用 thinking,且不可禁用)
|
|
16
|
+
* · kimi-k2.6 : thinking 固定 1.0 / 非 thinking 固定 0.6;不支持 reasoning_effort
|
|
17
|
+
* 官方同时建议:这类模型**不要显式传入 temperature**。本层因此优先「不传」,
|
|
18
|
+
* 仅在调用方无法省略该参数时才钳到允许值。
|
|
19
|
+
*/
|
|
20
|
+
/** 一次请求的参数约束。 */
|
|
21
|
+
export interface ModelCapability {
|
|
22
|
+
/** 该模型只接受这一个温度值(如 Kimi 全系),缺省表示不约束。 */
|
|
23
|
+
fixedTemperature?: number;
|
|
24
|
+
/** 温度允许的下界(默认 0)。 */
|
|
25
|
+
minTemperature?: number;
|
|
26
|
+
/** 温度允许的上界(默认 2,主流 OpenAI 兼容区间)。 */
|
|
27
|
+
maxTemperature?: number;
|
|
28
|
+
/**
|
|
29
|
+
* 是否支持 OpenAI 兼容的 `reasoning_effort`。
|
|
30
|
+
* false 表示**不得下发**该参数(如 Kimi K2.x 用的是 `thinking`),下发会被厂商拒绝。
|
|
31
|
+
*/
|
|
32
|
+
supportsReasoning?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 推理控制方式:`reasoning_effort`(OpenAI 兼容顶层参数)或 `thinking`(Kimi K2.x 专属)。
|
|
35
|
+
* 运行时若适配层支持,应按此选择参数名;仅为诊断与后续适配保留。
|
|
36
|
+
*/
|
|
37
|
+
reasoningControl?: 'reasoning-effort' | 'thinking' | 'none';
|
|
38
|
+
/** 严格结构化输出必须关闭思考(覆盖用户偏好)。 */
|
|
39
|
+
reasoningForcedOff?: boolean;
|
|
40
|
+
/** 命中的规则名,用于日志与测试断言。 */
|
|
41
|
+
rule: string;
|
|
42
|
+
/** 约束出处(文档 URL 或说明),便于复核与更新。 */
|
|
43
|
+
source: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 把模型 id 归一化为「模型身份」。
|
|
47
|
+
*
|
|
48
|
+
* 处理:去空白与首尾斜杠、小写、剥掉供应商前缀(`kimi/kimi-k3` → `kimi-k3`)。
|
|
49
|
+
* @param model - 原始模型 id。
|
|
50
|
+
* @returns 归一化后的身份(小写、无前缀)。
|
|
51
|
+
*/
|
|
52
|
+
export declare function canonicalModelId(model: string | undefined): string;
|
|
53
|
+
/**
|
|
54
|
+
* 解析一条模型的能力约束。
|
|
55
|
+
* @param model - 模型 id(可能带供应商前缀)。
|
|
56
|
+
* @returns 命中的能力;无约束时返回 undefined。
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveModelCapability(model: string | undefined): ModelCapability | undefined;
|
|
59
|
+
/** 一次待收敛的请求参数。 */
|
|
60
|
+
export interface RequestParams {
|
|
61
|
+
temperature: number;
|
|
62
|
+
/** 请求方(含用户偏好)希望使用的思考档位;undefined 表示不涉及。 */
|
|
63
|
+
reasoningEffort?: 'off' | 'low' | 'high' | 'max';
|
|
64
|
+
}
|
|
65
|
+
/** 收敛结果:最终请求值 + 发生了哪些调整(便于日志与诊断)。 */
|
|
66
|
+
export interface ConvergedParams {
|
|
67
|
+
/**
|
|
68
|
+
* 最终要下发的温度;`undefined` 表示**应当省略该参数**。
|
|
69
|
+
* 厂商建议这类模型不要显式传 temperature 时,本层返回 undefined。
|
|
70
|
+
*/
|
|
71
|
+
temperature: number | undefined;
|
|
72
|
+
reasoningEffort?: 'off' | 'low' | 'high' | 'max';
|
|
73
|
+
/** 被本层改掉的项,形如 `temperature: 0.3 -> 省略`。 */
|
|
74
|
+
adjustments: string[];
|
|
75
|
+
/** 命中的规则名。 */
|
|
76
|
+
rule?: string;
|
|
77
|
+
/** 约束出处。 */
|
|
78
|
+
source?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 把请求参数收敛到模型允许的范围。
|
|
82
|
+
*
|
|
83
|
+
* @param params - 调用方希望使用的参数。
|
|
84
|
+
* @param model - 实际要调用的模型 id(应传**实际模型**;换备用模型后需重算)。
|
|
85
|
+
* @param options - `structured: true` 表示这是严格结构化输出任务;
|
|
86
|
+
* `omitFixedTemperature: true` 表示调用方可以不传温度(推荐,厂商建议如此),
|
|
87
|
+
* 此时固定温度会收敛为 undefined 而不是钳到固定值。
|
|
88
|
+
* @returns 最终请求值与被调整项。
|
|
89
|
+
*/
|
|
90
|
+
export declare function convergeRequestParams(params: RequestParams, model: string | undefined, options?: {
|
|
91
|
+
structured?: boolean;
|
|
92
|
+
omitFixedTemperature?: boolean;
|
|
93
|
+
}): ConvergedParams;
|
|
94
|
+
/**
|
|
95
|
+
* 全文输出(正文/改写/润色)的 token 预算。
|
|
96
|
+
*
|
|
97
|
+
* ## 为什么放在这里
|
|
98
|
+
*
|
|
99
|
+
* 它是「按模型身份决定参数」这件事的最后一环,与 {@link convergeRequestParams}
|
|
100
|
+
* 同源;而本模块**零运行时依赖**,可以脱离宿主包离线单测。反过来若留在
|
|
101
|
+
* engine.ts,就只能靠类型检查"证明"它对——而它恰恰是这次修复的核心行为。
|
|
102
|
+
*
|
|
103
|
+
* ## 行为
|
|
104
|
+
*
|
|
105
|
+
* - 用户配的 `maxTokens` 始终是**上限**:`Math.max` 保证不会因为用户调小而
|
|
106
|
+
* 让长章写不完(3500 字中文约需 5~6k token,20000 是留足余量的地板)。
|
|
107
|
+
* - 换到备用模型时,若作者通过 `config.fallbackMaxTokens` 显式给了预算就改用它。
|
|
108
|
+
* 能力表没有上下文窗口数据,此时不猜、不硬编码任何 clamp 数值——那只会造出
|
|
109
|
+
* 一个假的正确。**没填就返回 undefined**(沿用请求原值),把决定权留给作者。
|
|
110
|
+
*
|
|
111
|
+
* @param config - 当前配置。
|
|
112
|
+
* @param model - 本次实际要用的模型。
|
|
113
|
+
* @param primaryModel - 主模型 id(与 `model` 相同即主路径)。
|
|
114
|
+
* @returns 该模型应使用的 maxTokens;undefined 表示沿用调用方原值。
|
|
115
|
+
*/
|
|
116
|
+
export declare function fullTextBudget(config: {
|
|
117
|
+
maxTokens: number;
|
|
118
|
+
fallbackMaxTokens?: number;
|
|
119
|
+
}, model: string, primaryModel: string): number | undefined;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 请求参数收敛的**执行层**(model-capability.ts 是规则层)。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么独立成文件
|
|
5
|
+
*
|
|
6
|
+
* `applyModelCapability` 需要 `ReasoningEffortId` 这个 dsh-llm 运行时值,而
|
|
7
|
+
* `model-capability.ts` 必须保持零运行时依赖(它有一组离线单测,且被大量结构化
|
|
8
|
+
* 任务路径复用)。所以把「规则」留在 model-capability,把「把规则应用到请求上」
|
|
9
|
+
* 挪到这里。
|
|
10
|
+
*
|
|
11
|
+
* 顺带解开了 engine.ts ↔ stream-fallback.ts 的循环依赖:
|
|
12
|
+
* 流式兜底要重算参数,本模块正是它该依赖的东西,不需要绕回 engine。
|
|
13
|
+
*/
|
|
14
|
+
import { type GenerateOptions } from '@deepseek-ai/dsh-llm';
|
|
15
|
+
/** `applyModelCapability` 的可选行为开关。 */
|
|
16
|
+
export interface ApplyModelCapabilityOptions {
|
|
17
|
+
/** 严格结构化输出任务:能力档案要求时强制关闭思考。 */
|
|
18
|
+
structured?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 按**本次实际模型**重算输出预算。
|
|
21
|
+
*
|
|
22
|
+
* 能力表(model-capability.ts)目前不含上下文窗口数据,所以这里不猜、
|
|
23
|
+
* 不硬编码任何 clamp 数值——那只会造出一个假的正确。改为把决定权交给调用方:
|
|
24
|
+
* 流式长文路径用它保证「备用模型不会沿用主模型的 20000 预算而撞 max-tokens」。
|
|
25
|
+
*/
|
|
26
|
+
maxTokensFor?: (model: string) => number | undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 把能力约束应用到一份请求上。
|
|
30
|
+
*
|
|
31
|
+
* @param base - 调用方拼好的原始请求。
|
|
32
|
+
* @param model - **本次实际要调用的模型**(切换备用模型后必须重算,故在循环内调用)。
|
|
33
|
+
* @param options - 附加行为开关。
|
|
34
|
+
* @returns 收敛后的请求(固定温度的模型会省略 temperature / 不支持的参数会被移除)。
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyModelCapability(base: GenerateOptions, model: string, options?: ApplyModelCapabilityOptions): GenerateOptions;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 结构化输出预算与字段长度合同。
|
|
3
|
+
*
|
|
4
|
+
* 背景:本插件此前给每个 LLM 调用写死一个 `Math.max(config.maxTokens, N)`。短任务
|
|
5
|
+
* 与长任务拿到同一个额度,长任务(分卷、拆章、逐章规划)**额度不随规模增长**,
|
|
6
|
+
* 截断后只能抛「请增大 maxTokens」。这里把额度改成按规模推算,并给结构化字段
|
|
7
|
+
* 定长度上限,让预算花在结构上而不是被自由发挥吃光。
|
|
8
|
+
*
|
|
9
|
+
* 设计取舍:结构化输出的额度应当**随本次要产出的条目数增长**,并由硬上限兜住,
|
|
10
|
+
* 否则要么短任务浪费额度,要么长任务写到一半被截断。字段长度上限同时写进提示词
|
|
11
|
+
* 与解析端,两处共用一张表,避免漂移。
|
|
12
|
+
*
|
|
13
|
+
* 一条硬纪律:**不要用 JSON repair 去补被截断的结构**。repair 只能修已有结构,
|
|
14
|
+
* 补不出尚未输出的条目;在服务层手工补齐缺失项,等于把不完整的规划伪装成可用
|
|
15
|
+
* 资产。预算给够 + 输出够紧凑,才是正解。
|
|
16
|
+
*/
|
|
17
|
+
/** 一次调用的输出规模描述:给出能决定输出体量的那个量。 */
|
|
18
|
+
export interface OutputScope {
|
|
19
|
+
/** 预期卷数(分卷/卷战略类)。 */
|
|
20
|
+
volumes?: number;
|
|
21
|
+
/** 预期章节数(章节列表/批量拆章类)。 */
|
|
22
|
+
chapters?: number;
|
|
23
|
+
/** 预期角色数(角色阵容/资产提炼类)。 */
|
|
24
|
+
characters?: number;
|
|
25
|
+
/** 预期条目数(伏笔、题材、资产等清单类)。 */
|
|
26
|
+
items?: number;
|
|
27
|
+
/** 需要覆盖的正文规模(字),用于拆书/反推这类按输入体量走的任务。 */
|
|
28
|
+
sourceChars?: number;
|
|
29
|
+
}
|
|
30
|
+
/** 一类结构化任务的预算规格。 */
|
|
31
|
+
export interface OutputBudgetSpec {
|
|
32
|
+
/** 无视规模也要给到的下限。 */
|
|
33
|
+
floor: number;
|
|
34
|
+
/** 规模为 0 时的起步额度。 */
|
|
35
|
+
base: number;
|
|
36
|
+
/** 每单位规模追加的额度。 */
|
|
37
|
+
perUnit: number;
|
|
38
|
+
/** 硬上限:超过它只会让模型啰嗦,不会让结构更完整。 */
|
|
39
|
+
ceiling: number;
|
|
40
|
+
}
|
|
41
|
+
/** 结构化任务分组——按"输出里每个单位要写多少字段"分档,而不是按业务名。 */
|
|
42
|
+
export type OutputBudgetKind = 'volume-strategy' | 'chapter-list' | 'character-cast' | 'item-list' | 'analysis';
|
|
43
|
+
/**
|
|
44
|
+
* 取出与任务类型相关的那一个规模量。
|
|
45
|
+
* @param kind - 任务类型。
|
|
46
|
+
* @param scope - 规模描述。
|
|
47
|
+
* @returns 单位数;分析类返回千字单位(向上取整)。
|
|
48
|
+
*/
|
|
49
|
+
export declare function scopeUnits(kind: OutputBudgetKind, scope: OutputScope): number;
|
|
50
|
+
/**
|
|
51
|
+
* 按规模推算输出额度。
|
|
52
|
+
* @param kind - 结构化任务类型。
|
|
53
|
+
* @param scope - 本次任务的规模(缺省时按最小规模处理)。
|
|
54
|
+
* @returns 建议的 `maxTokens`,落在该类型的 [floor, ceiling] 内。
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveOutputBudget(kind: OutputBudgetKind, scope?: OutputScope): number;
|
|
57
|
+
/** 读取某类任务的规格(供诊断与测试断言)。 */
|
|
58
|
+
export declare function outputBudgetSpec(kind: OutputBudgetKind): OutputBudgetSpec;
|
|
59
|
+
/**
|
|
60
|
+
* 结构化字段长度合同 —— 与 prompt 里的长度声明必须逐项一致。
|
|
61
|
+
*
|
|
62
|
+
* 两边同步的理由:只写进 schema,模型不知道就会超长被拒;只写进 prompt,模型
|
|
63
|
+
* 偶尔超长没人拦。本表是单一数据源。
|
|
64
|
+
*/
|
|
65
|
+
export declare const STRUCTURED_FIELD_LIMITS: {
|
|
66
|
+
/** 分卷战略:书级阶梯类字段。 */
|
|
67
|
+
readonly volumeLadder: 160;
|
|
68
|
+
/** 分卷战略:每卷定位标签。 */
|
|
69
|
+
readonly volumeRoleLabel: 32;
|
|
70
|
+
/** 分卷战略:每卷核心回报 / 升级焦点。 */
|
|
71
|
+
readonly volumeReward: 64;
|
|
72
|
+
/** 分卷战略:不确定项原因。 */
|
|
73
|
+
readonly volumeUncertaintyReason: 64;
|
|
74
|
+
/** 章节计划:单章标题。 */
|
|
75
|
+
readonly chapterTitle: 40;
|
|
76
|
+
/** 章节计划:单章摘要。 */
|
|
77
|
+
readonly chapterSummary: 300;
|
|
78
|
+
/** 章节计划:本章目标。 */
|
|
79
|
+
readonly chapterGoal: 200;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* 把长度合同渲染成可直接塞进 system prompt 的一句话,避免 prompt 与表漂移。
|
|
83
|
+
* @param entries - 要声明的字段(描述 + 上限),按声明顺序渲染。
|
|
84
|
+
* @returns 形如「为保证输出完整:A 不超过 160 字;B 不超过 64 字。」的中文说明。
|
|
85
|
+
*/
|
|
86
|
+
export declare function renderLengthContract(entries: ReadonlyArray<readonly [string, number]>): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 剧情线批量刷新的**结果对齐**。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么单独成文件
|
|
5
|
+
*
|
|
6
|
+
* 批量刷新让模型一次返回 `{items: [{name, progress}]}`,再按 name 对齐回原线。
|
|
7
|
+
* 这里最容易出的错是**错位**:一旦线名对不上,模型给 A 线的进度就会被写到
|
|
8
|
+
* B 线上。这种 bug 不报错、界面也正常显示,只是内容全错了,作者很难发现。
|
|
9
|
+
*
|
|
10
|
+
* 所以必须能离线验证。而对齐逻辑所在的 engine.ts 依赖宿主包
|
|
11
|
+
* `@deepseek-ai/dsh-llm`,脱离 dsh 环境 import 就失败——故规则层放这里。
|
|
12
|
+
*/
|
|
13
|
+
/** 一条待刷新的线(对齐只需要 id 与 name)。 */
|
|
14
|
+
export interface AlignLine {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
/** 对齐结果:text 为空串表示这条线没拿到进度。 */
|
|
19
|
+
export interface AlignedProgress extends AlignLine {
|
|
20
|
+
text: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 把模型返回的 items 对齐回原始线列表。
|
|
24
|
+
*
|
|
25
|
+
* 对齐规则(按优先级):
|
|
26
|
+
* 1. **线名逐字匹配**——模型原样回显 name,最可靠;
|
|
27
|
+
* 2. name 缺失或重复时,按**出现顺序**兜给尚未匹配的线
|
|
28
|
+
* (宁可可能错位,也不能让作者看到一片空白);
|
|
29
|
+
* 3. 模型漏项的线**留空**,绝不拿别人的进度填。
|
|
30
|
+
*
|
|
31
|
+
* @param items - 模型返回的原始 items(不保证是数组/对象)。
|
|
32
|
+
* @param lines - 原始线列表,顺序即最终返回顺序。
|
|
33
|
+
* @returns 与 `lines` 一一对应的结果(长度恒等)。
|
|
34
|
+
*/
|
|
35
|
+
export declare function alignPlotlineProgress(items: unknown, lines: AlignLine[]): AlignedProgress[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 提示词槽位:给作者留几个**安全可改**的位置,用来微调本书的写作偏好。
|
|
3
|
+
*
|
|
4
|
+
* 设计边界(很重要):
|
|
5
|
+
* * 槽位只追加"作者偏好",**不允许覆盖**规则工程与合规红线——道藏、写作红线、
|
|
6
|
+
* 九条内容合规红线、反 AI 规则、阶段契约都由宿主锁定,槽位碰不到;
|
|
7
|
+
* * 槽位内容随项目保存(`novel-project.json`),换书即换槽位;
|
|
8
|
+
* * 每个槽位有长度上限,超长直接截断并标记(沿用「截断显式化」的规则)。
|
|
9
|
+
*/
|
|
10
|
+
import type { ProjectState, PromptSlotId } from './protocol.ts';
|
|
11
|
+
/** 单个槽位的元信息。 */
|
|
12
|
+
export interface PromptSlotSpec {
|
|
13
|
+
id: PromptSlotId;
|
|
14
|
+
/** 面板显示名。 */
|
|
15
|
+
label: string;
|
|
16
|
+
/** 一句话说明它影响什么。 */
|
|
17
|
+
hint: string;
|
|
18
|
+
/** 示例(面板占位符)。 */
|
|
19
|
+
placeholder: string;
|
|
20
|
+
/** 字符上限。 */
|
|
21
|
+
maxChars: number;
|
|
22
|
+
}
|
|
23
|
+
/** 允许作者编辑的槽位(白名单;不在此列表的提示词一律不可改)。 */
|
|
24
|
+
export declare const PROMPT_SLOTS: readonly PromptSlotSpec[];
|
|
25
|
+
/** 单个槽位的渲染结果。 */
|
|
26
|
+
export interface RenderedSlot {
|
|
27
|
+
id: PromptSlotId;
|
|
28
|
+
label: string;
|
|
29
|
+
text: string;
|
|
30
|
+
/** 是否因超长被截断。 */
|
|
31
|
+
truncated: boolean;
|
|
32
|
+
/** 原文长度(截断前)。 */
|
|
33
|
+
chars: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 读取并规整项目里的槽位内容(去空白、按上限截断)。
|
|
37
|
+
*
|
|
38
|
+
* @param project 项目状态。
|
|
39
|
+
* @returns 非空槽位列表(保持 PROMPT_SLOTS 的声明顺序)。
|
|
40
|
+
*/
|
|
41
|
+
export declare function readPromptSlots(project: ProjectState): RenderedSlot[];
|
|
42
|
+
/**
|
|
43
|
+
* 把槽位渲染成注入提示词的段落。
|
|
44
|
+
*
|
|
45
|
+
* @param project 项目状态。
|
|
46
|
+
* @returns 提示词片段;无槽位时返回空串。
|
|
47
|
+
*/
|
|
48
|
+
export declare function renderPromptSlots(project: ProjectState): string;
|
|
49
|
+
/**
|
|
50
|
+
* 校验并规整一次槽位写入。
|
|
51
|
+
*
|
|
52
|
+
* @param id 槽位 id。
|
|
53
|
+
* @param value 内容(空串表示清空该槽位)。
|
|
54
|
+
* @returns 归一化后的内容。
|
|
55
|
+
* @throws 槽位 id 不在白名单时抛错。
|
|
56
|
+
*/
|
|
57
|
+
export declare function normalizeSlotValue(id: string, value: string): string;
|
package/lib/types/prompting.d.ts
CHANGED
|
@@ -1,30 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* 目标:把高频提示词从内联字符串升级为「可定位、可版本化、可诊断缺组」的资产,
|
|
5
|
-
* 同时保留 writeSystemPrompt 的现有大段上下文注入(道藏/世界观/大纲/资产/伏笔/剧情线),
|
|
6
|
-
* 只在其基础上补充「官方渲染骨架」的必达/禁止/自查块。
|
|
7
|
-
*/
|
|
8
|
-
export interface OfficialTemplate {
|
|
9
|
-
id: string;
|
|
10
|
-
version: string;
|
|
11
|
-
/** 需要的 slot 变量(跨层注入点)。 */
|
|
12
|
-
slots: string[];
|
|
13
|
-
/** 需要的上下文分组(缺组时可诊断)。 */
|
|
14
|
-
contextGroups: string[];
|
|
15
|
-
/** system 提示模板(可用 {{slot.*}} 占位,运行时替换)。 */
|
|
16
|
-
system: string[];
|
|
17
|
-
/** human 提示模板(可用 {{context.*}} / {{input.*}} 占位)。 */
|
|
18
|
-
human: string[];
|
|
19
|
-
}
|
|
20
|
-
export declare const OFFICIAL_TEMPLATES: Record<string, OfficialTemplate>;
|
|
21
|
-
export declare function getOfficialPromptTemplate(id: string): OfficialTemplate | null;
|
|
22
|
-
export declare function getOfficialPromptTemplateVersion(id: string): string | null;
|
|
23
|
-
/** 轻量稳定哈希(与上游 sha1 对齐精神:内容变化→版本变化)。 */
|
|
24
|
-
export declare function hashPromptTemplate(id: string): string;
|
|
25
|
-
export declare function getRequiredTemplateContextGroups(id: string): string[];
|
|
26
|
-
/** 把官方 writer 骨架渲染成可附加到现有系统提示词末尾的约束/自查块。 */
|
|
27
|
-
export declare function renderOfficialChapterWriterSkeleton(meta: {
|
|
1
|
+
/** 章节写作约束:把写作骨架渲染成可附加到系统提示词末尾的必达/禁止/自查块。 */
|
|
2
|
+
export declare function renderChapterWriterSkeleton(meta: {
|
|
28
3
|
targetChars: number;
|
|
29
4
|
minChars: number;
|
|
30
5
|
maxChars: number;
|