资讯动态

OpenMAIC 幻灯片内容生成提示模板(slide-content/user.md)深度解析:从场景信息到可解析 JSON 的完整链路

发布时间:2026/9/10 11:28:51 来源:尧图企业网站定制
OpenMAIC 幻灯片内容生成提示模板slide-content/user.md深度解析从场景信息到可解析 JSON 的完整链路【免费下载链接】OpenMAICOpen Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click项目地址: https://gitcode.com/GitHub_Trending/op/OpenMAIC导读本文围绕 OpenMAICOpen Multi-Agent Interactive Classroom生成管线中的核心提示资产 packages/openmaic/generation/templates/slide-content/user.md完整讲解它如何把场景信息 可用资源 输出约束组装成一次幻灯片内容生成请求并配合配套的系统提示 system.md 约束模型产出可直接解析的 Canvas/PPT JSON。读完本文你将掌握该模板的变量体系、条件渲染机制、JSON 输出铁律以及模型输出如何经由 scene-generator.ts 完成校验、修复与资产映射最终进入教室幻灯片渲染。一、模板的定位生成管线中的用户侧剧本在 OpenMAIC 的生成管线里一次幻灯片内容生成由系统提示system.md与用户提示user.md共同驱动system.md 负责刻画内容设计师的角色、画布规格、元素类型与设计规则user.md 则负责把当前这一页的具体任务交付给模型包括页面标题、描述、要点、可用的媒体资源与输出硬约束。两者的装配发生在 scene-generator.ts 的generateSlideContent中核心调用如下buildPrompt(PROMPT_IDS.SLIDE_CONTENT, { title, description, keyPoints, ... })PROMPT_IDS.SLIDE_CONTENT在 src/prompts/index.ts 中被定义为slide-content对应templates/slide-content/目录下的 system.md 与 user.md 两个文件。装配完成后由aiCall(prompts.system, userPrompt, visionImages)将最终提示文本发送给模型。二、模板结构总览user.md 按从上到下的顺序组织为四个区段每一段都在约束模型行为的某一个侧面区段内容作用Scene InformationTitle / Description / Key Points / teacherContext提供本页的主题事实Available Resources可用媒体列表 画布尺寸声明可用的原料边界Output Requirements单页 Canvas/PPT 组件的生成目标明确交付物形态Language Directive Must Follow语言指令 8 条输出铁律约束语言与 JSON 格式以下各节逐段拆解。三、场景信息变量的注入与默认值user.md 第一段直接使用 Handlebars 风格占位符接收调用方传入的场景数据- **Title**: {{title}} - **Description**: {{description}} - **Key Points**: {{keyPoints}} {{teacherContext}}这些变量在 loader.ts 的interpolateVariables中被替换。值得注意的实现细节是占位符匹配规则为/\{\{(\w)\}\}/g——只替换小驼峰或蛇形命名的变量正则注释明确说明\w刻意不触碰 kebab-case 占位符对象类型变量会被JSON.stringify(value, null, 2)序列化未提供的变量则原样保留、不做插值。实际传参发生在 scene-generator.tsconst prompts buildPrompt(PROMPT_IDS.SLIDE_CONTENT, { title: outline.title, description: outline.description, keyPoints: (outline.keyPoints || []).map((p, i) ${i 1}. ${p}).join(\n), assignedImages: assignedImagesText, canvas_width: canvasWidth, canvas_height: canvasHeight, teacherContext, languageDirective: languageDirective || , imageElementEnabled, generatedImageEnabled, generatedVideoEnabled, mediaElementEnabled, });几个关键点keyPoints 编号化大纲中的要点被转成1. …、2. …的编号列表让模型在页面布局时自然形成有条理的条目结构。teacherContext来自formatTeacherPersonaForPrompt见 prompt-formatters.ts。当课堂配置中存在role teacher的 Agent 时会注入教师人设文本并明确禁止把教师姓名/身份写进幻灯片no Teacher Xs tips……保证幻灯片是中性、专业的视觉辅助物。画布尺寸是固定常量canvasWidth 1000、canvasHeight 562.5注释说明它需与viewportSize/viewportRatio保持一致。这两个占位符还属于受测试保护的祖传命名——assets.test.ts 中的GRANDFATHERED_NON_CAMEL_CASE_PLACEHOLDERS明确锁定slide-content/user.md: {{canvas_height}}与{{canvas_width}}是仅有的非标准命名豁免项防止未来新增不合规占位符。四、可用资源媒体边界与画布声明{{#if mediaElementEnabled}} - **Available Media**: {{assignedImages}} {{/if}} - **Canvas Size**: {{canvas_width}} × {{canvas_height}} px这里演示了 loader 的条件块机制。processConditionalBlocks使用/\{\{#if (\w)\}\}([\s\S]*?)\{\{\/if\}\}/g正则处理非嵌套条件块条件为真则保留块内内容否则整体移除。mediaElementEnabled的取值逻辑在 scene-generator.tsconst generatedImageEnabled generatedImageEntries.length 0; const generatedVideoEnabled generatedVideoEntries.length 0; const imageElementEnabled hasAssignedImages || generatedImageEnabled; const mediaElementEnabled imageElementEnabled || generatedVideoEnabled;也就是说当大纲为当前页分配了来自 PDF/素材库的图片assignedImages或计划生成 AI 图片/视频mediaGenerations时mediaElementEnabled为真模型才能看到可用媒体清单没有任何媒体时该块整体消失assignedImagesText会被设为无可用图片禁止插入任何 image 元素同文件 scene-generator.ts从提示层直接封死模型幻觉图片的空间。assignedImagesText的组装同样在 scene-generator 中完成视觉模式下图片以占位符形式列出仅 ID 页码 尺寸 宽高比非视觉模式则给出包含描述文本的完整条目formatImageDescription并拼接 AI 生成媒体gen_img_*/gen_vid_*的 ID 与提示词描述。五、输出要求与语言指令user.md 中段的交付目标与语言指令如下Based on the scene information above, generate a complete Canvas/PPT component for one page. ## Language Directive {{languageDirective}}languageDirective由 prompt-formatters.ts 的buildLanguageText生成合并课程级语言指令与可选的本场景补充说明。模板里正文文本的语言必须与此指令一致system.md 中亦有Text language must match the language specified in generation requirements的呼应约束。六、Must Follow八条输出铁律与容错user.md 的核心约束集中在Must Follow区块原文为 5 条编号 若干条件性条目合并如下直接输出纯 JSON不带任何解释或描述不得包裹json代码块JSON 前后不得附加任何文本确保 JSON 格式正确、可直接被解析启用图片元素时src只能使用给定的图片 ID如img_1启用生成视频时mediaRef只能使用给定的生成视频媒体引用所有 TextElement 的height必须从系统提示中的快速查找表取值。6.1 为什么要求如此苛刻因为模板的作者深知模型不会 100% 遵守指令。为此仓库在解析侧提供了多层容错——这正是 json-repair.ts 存在的意义。parseJsonResponse的解析顺序为精确解析直接JSON.parse(trim())剥离推理前缀截掉末尾/think//reasoning之后的内容再解析代码块提取从json ... 中抓取{/[开头的片段正文结构扫描用括号深度匹配算法在响应文本中定位完整的 JSON 结构整体解析兜底。即便提取出 JSON 片段tryParseJson仍会依次尝试四类修复修复被误写成字符串的键值对片段如height: 76→height: 76、双转义 LaTeX 风格的反斜杠\frac等、补齐被截断的数组/对象括号、清理控制字符最后才交给jsonrepair库处理。6.2 元素级防御模型输出不可全信即使 JSON 整体可解析单个元素仍可能畸形。在 scene-generator.ts 的fixElementDefaults中每个元素都要经过stripNulls递归剔除值为null的字段让 DSL 规范器将其视为缺省而非类型错误normalizeElement来自openmaic/dsl补齐缺省字段、由包围盒推导 line 的start/end与 shape 的viewBox/path遇到类型错误的字段fail loud规范化失败的单个元素会被丢弃并告警——注释解释得很清楚丢掉一个元素只是幻灯片轻微劣化保留一个畸形元素可能拖垮整个场景。图片元素还会在此阶段按assignedImages的真实宽高比修正盒子尺寸height width / ratio超出 462px 上限则反向缩宽。七、配套系统提示元素类型的完整契约user.md 的输出结构示例给出的是最简形态{background:{type:solid,color:#ffffff},elements:[{id:title_001,type:text,left:60,top:50,width:880,height:76,content:p style\font-size:32px;\strongTitle Content/strong/p,defaultFontName:,defaultColor:#333333},{id:content_001,type:text,left:60,top:150,width:880,height:130,content:p style\font-size:18px;\• Point One/pp style\font-size:18px;\• Point Two/pp style\font-size:18px;\• Point Three/p,defaultFontName:,defaultColor:#333333}]}而完整的元素契约由 system.md 定义。user.md 第 5 条铁律要求 TextElement 的height必须查表指的正是 system.md 中的Text Height Lookup Tableline-height1.5含两侧各 10px 内边距Font Size1 line2 lines3 lines4 lines5 lines14px43648510612716px46709411814218px497610313015720px528211214217224px589413016620228px6410614819023232px7011816621426236px76130184238292system.md 还定义了shape、line、chart、latex、table五类元素的完整字段约束以及八条设计规则文本宽度计算、对齐验证、对称布局、文字背景配对、装饰线、间距标准、字号层级。其中几条与 user.md 的输出结构示例直接相关TextElement 内部有 10px 内边距实际文本区为(width-20) × (height-20)TextElement 禁止内联 LaTeX\frac、\lim、\sqrt等会以字面反斜杠字符串显示数学内容必须独立使用 LatexElementKaTeX 渲染LineElement 的width是描边粗细而非长度建议 2–6px箭头部大小 width × 3LatexElement 不得生成path/viewBox/strokeWidth/fixedRatio这些由系统自动填充对应的实现正是 scene-generator 中的processLatexElements——它在运行时用 KaTeX 把latex字符串渲染为 HTML 并填入html与fixedRatio: true渲染失败的公式会被移除。八、输出后处理从 JSON 到真实幻灯片资产user.md 的 src 只能用图片 ID 与 mediaRef 只能用视频引用 两条规则其背后是完整的两阶段资产映射设计见 scene-generator.ts 的resolveImageIds模型只产出逻辑 ID图片用img_1、img_2正则^img_\d$识别生成媒体用gen_img_*/gen_vid_*占位符isGeneratedMediaPlaceholder判定管线负责替换为真实来源resolveImageIds将图片 ID 替换为imageMapping[src]中对应的真实 URL/资产 ID生成媒体若已在generatedMediaMapping中则直接替换否则保留占位符交由前端渲染骨架屏后异步回填。映射值的形态完全由调用方的imageMapping决定浏览器端映射携带 base64 data URL服务端映射携带资产池分配的 asset id渲染器再通过池注册表解析。这套模型只见 ID、管线负责解析的设计源码注释称之为 Plan B大幅降低了提示复杂度也保证了src字段不会出现幻觉 URL。最终所有通过校验的元素会被统一改写为type_nanoid8的新 ID 并补上rotate: 0背景在solid/gradient两种形态间归一化再与remark一起返回为GeneratedSlideContent进入后续的动作生成与场景组装阶段。九、测试保障模板资产的守护者assets.test.ts 为该模板提供了三层保护理解它有助于你把 user.md 当作可维护的契约而非死文本文件清单测试templates/与snippets/下的文件集合必须与PROMPT_IDS × {system, user}精确匹配杜绝模板漂移Snippet 引用测试模板中的每个{{snippet:...}}都必须有对应snippets/*.md且非空system.md 通过条件块按需引入 slide 系列图片/视频指令片段占位符命名测试除canvas_width/canvas_height这两个祖传豁免项外不允许新增非小驼峰命名占位符——这保证了interpolateVariables的\w替换规则始终有效。十、一次完整生成的调用链速览把以上内容串起来一次基于 user.md 的幻灯片内容生成完整链路为大纲(SceneOutline) → generateSlideContent(scene-generator.ts) → 组装 assignedImagesText / teacherContext / 媒体开关 → buildPrompt(slide-content, …) → loadPrompt 读取 user.md system.md → processSnippets 展开 {{snippet:...}} → processConditionalBlocks 处理 {{#if ...}} → interpolateVariables 替换 {{变量}} → aiCall(system, user, visionImages) // 模型输出纯 JSON → parseJsonResponse // 多层容错解析 → fixElementDefaults // normalizeElement 校验/修复 → processLatexElements // KaTeX 渲染公式 → resolveImageIds / normalizeGeneratedVideoRefs // 资产映射 → GeneratedSlideContent元素 背景 备注全文最值得记住的一句话来自 user.md 的标题——Generation Requirements它把这一页讲什么、能用什么、必须怎么输出三件事压缩进一个结构化的用户提示再用 system.md 的元素契约与 json-repair.ts 的容错解析兜底最终让模型输出可稳定落地的教室幻灯片。理解这套模板即理解 OpenMAIC 内容生成质量的底层保障。【免费下载链接】OpenMAICOpen Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click项目地址: https://gitcode.com/GitHub_Trending/op/OpenMAIC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价