返回 oh-my-ppt
planning.ts
根目录 / src / main / agent-runtime / prompt / composers / planning.ts
1 import { CONTENT_LANGUAGE_RULES, SOURCE_MATERIAL_PLANNING_RULES } from './shared'
2 import type { AvailableFont } from '../../../presentation/fonts/font-registry'
3 import { requireSlideSize, type SlideSizePreset } from '@shared/slide-size'
4 import { createPromptCatalog } from '../catalog'
5
6 import planningSystemTemplate from '../templates/planning/system.md?raw'
7 import designContractSystemTemplate from '../templates/planning/design-contract-system.md?raw'
8
9 type PlanningSystemTemplateVars = {
10 system: {
11 contentLanguageRules: string
12 sourceMaterialPlanningRules: string
13 totalPages: number
14 }
15 }
16
17 const planningPromptCatalog = createPromptCatalog<PlanningSystemTemplateVars>({
18 system: planningSystemTemplate.trimEnd()
19 })
20
21 type DesignContractSystemTemplateVars = {
22 system: {
23 availableFonts: string
24 fontInstruction: string
25 languageHint: string
26 slideHeight: number
27 slideSizeId: string
28 slideWidth: number
29 styleSkill: string
30 }
31 }
32
33 const designContractPromptCatalog = createPromptCatalog<DesignContractSystemTemplateVars>({
34 system: designContractSystemTemplate.trimEnd()
35 })
36
37 export function buildPlanningSystemPrompt(totalPages: number = 0): string {
38 return planningPromptCatalog.render('system', {
39 contentLanguageRules: CONTENT_LANGUAGE_RULES,
40 sourceMaterialPlanningRules: SOURCE_MATERIAL_PLANNING_RULES,
41 totalPages
42 })
43 }
44
45 export function buildDesignContractSystemPrompt(args: {
46 styleSkill?: string | null
47 availableFonts?: AvailableFont[]
48 requestedFontPair?: { titleFont: string; bodyFont: string } | null
49 languageHint?: string | null
50 slideSize: SlideSizePreset
51 }): string {
52 const styleSkill = args.styleSkill
53 const availableFonts = args.availableFonts || []
54 const requestedFontPair = args.requestedFontPair || null
55 const slideSize = requireSlideSize(args.slideSize)
56 const fontInstruction = requestedFontPair
57 ? [
58 '- titleFont and bodyFont are fixed by the user selection. Copy them exactly:',
59 ` - titleFont: ${requestedFontPair.titleFont}`,
60 ` - bodyFont: ${requestedFontPair.bodyFont}`
61 ].join('\n')
62 : [
63 '- titleFont: choose one exact family from availableFonts whose role includes "title".',
64 '- bodyFont: choose one exact family from availableFonts whose role includes "body".',
65 '- Both titleFont and bodyFont must support the main writing system implied by languageHint.',
66 '- If using a display/handwriting font for titleFont, choose a highly readable bodyFont.'
67 ].join('\n')
68 return designContractPromptCatalog.render('system', {
69 availableFonts: JSON.stringify(availableFonts),
70 fontInstruction,
71 languageHint: args.languageHint || 'unknown',
72 slideHeight: slideSize.height,
73 slideSizeId: slideSize.id,
74 slideWidth: slideSize.width,
75 styleSkill: styleSkill || '(No style preset specified. Choose a coherent restrained visual direction.)'
76 })
77 }
78
78 lines TYPESCRIPT