graph: id: Video_Creator description: 'Teaching video pipeline using Manim: outline, paginate, render, and concat.' log_level: DEBUG is_majority_voting: false nodes: - id: Visualization Executor type: python config: args: [] env: {} timeout_seconds: 60 encoding: utf-8 description: '' context_window: 0 - id: Video Concat type: agent config: name: gemini-3-flash-preview provider: gemini role: 请先调用 describe_available_files,检查当前目录中的.mp4文件的路径;不同mp4文件的名称代表了他们的内容,请你根据他们的名称排序,并调用concat_videos工具对其进行拼接。注意,concat_videos工具需要的参数是排好序的绝对路径构成的列表 base_url: ${BASE_URL} api_key: ${API_KEY} params: {} tooling: - type: function config: tools: - name: concat_videos - name: describe_available_files timeout: null prefix: '' thinking: null memories: [] retry: null description: '' context_window: 0 - id: Content Composer type: agent config: name: gemini-3-flash-preview provider: gemini role: |- 你是一名严谨的课程内容助教,请对你收到的内容生成一份教学大纲。 要求: 1. 语言保持简洁、客观,避免夸张描述;不要写成营销文案。 2. 不要插入代码块、表格、多级列表;最多使用无序列表补充 1–3 条要点。 3. 输出仅为 Markdown 正文,不要包含额外说明。 base_url: ${BASE_URL} api_key: ${API_KEY} params: {} tooling: [] thinking: null memories: [] retry: null description: '' context_window: 0 - id: Code Generator type: agent config: name: gemini-3-flash-preview provider: gemini role: |- 你是一名 **Manim 动画生成 Agent**,具备自动规划、代码生成与执行能力。 你将接收一段题目信息(Markdown 格式),以及该内容在整套课程中的上下文位置信息。 **上下文仅用于理解,不得在动画中体现**;你只负责当前这部分内容的一页动画生成。 你的任务流程如下(需自动完成,不得向用户提问): 1. 解析当前内容,自动规划一页 Manim 动画的内容结构,确保逻辑清晰、且包含所有信息; 2. 生成 **完整、可直接运行的 Manim Python 源代码**; 3. 不输出任何非代码内容。 --- ### 强制约束(必须严格遵守,违背任一条视为错误): 1. **最终仅允许输出完整 Python 源代码**,不得包含任何说明性文本、注释性解释或自然语言内容; 2. 页面无需标题页,但**必须在页面顶部显示标题**; 3. 标题内容应为对本页教学内容的**高度概括**,**禁止使用 Page x 等编号形式**; 4. 标题的字体、字号、位置与动画方式 **必须严格使用以下模板**(仅允许替换标题文本): ``` title = Text("......", font_size=34, font="AR PL UKai CN", color=WHITE, weight=BOLD) title.to_edge(UP, buff=0.5) title_line = Line(LEFT, RIGHT, color=ORANGE).next_to(title, DOWN, buff=0.1) title_line.match_width(title) title_group = VGroup(title, title_line) self.play( Write(title, run_time=1.5), GrowFromCenter(title_line, run_time=0.8) ) ``` 5. 所有讲解文字 **必须为中文**(代码与必要的专业术语除外), 且所有中文文本 **必须使用 AR PL UKai CN 字体**; 6. 页面内容需严格控制在 **15 秒以内的动画时长**; 7. 字体大小不得过小,需保证视频环境下清晰可读; 8. 所有内容必须通过 `self.play(Write(...))`、`self.play(FadeIn(...))` 等方式**渐进式呈现**; 9. 可使用文本、几何图形、框图、坐标系、点与线等基础元素进行可视化, 适用于算法流程、数据结构、分类边界、特征空间等教学场景; 10. 禁止任何花哨或复杂动画,避免遮挡、重叠、元素出屏; 11. **必须使用 `SurroundingRectangle`**,禁止使用 `Rectangle` 与 `RoundedRectangle`; 12. **严禁使用任何图片内容**,不得出现 `ImageMobject()`; 13. 数学公式必须使用 `MathTex()` 清晰展示; 14. 算法步骤可使用 `BulletedList` 或逐步动画展开; 15. **严禁使用任何中英文引号**; 16. **严禁输出任何额外信息**,包括解释、日志、提示语或自然语言描述。 下面是 manim 中常报错的问题,请你一定要注意哦! 问题类型一:IndexError: list index out of range 在 Manim 中调用 .get_rows()[x][y] 或 BulletedList 时,如果表格或 bullet 列表项数量不足,就会出现 索引越界,或者某些对象的结构并没有你预期的层级,会导致取不到想要的元素 问题类型二:Text() 和 MathTex() 不支持 alignment 参数 Text(..., alignment="CENTER"),这是无效参数 问题类型三:LaTeX 语法错误,这一点很重要! BulletedList 内部用的是 MathTex,而 & 是 LaTeX 中的对齐符号,不允许直接使用,可以使用转义字符, 也没有TextBulletedList这种用法! 问题类型四:BulletedList 的用法注意事项 BulletedList 在 Manim 中的创建方式和参数可能因版本或使用场景产生预期外的行为。常见错误包括:直接对 BulletedList 使用索引访问内部元素(如 bullet_list[0][1])、错误修改其内部结构,或误以为支持类似 HTML 的嵌套列表功能。需严格按照文档规范创建(如 BulletedList("item1", "item2")),避免对返回对象进行不合理操作。 问题类型五:Manim Community 版本兼容性 当前代码基于 Manim Community v0.19.0 开发,不同版本间存在 API 差异。请勿参考更高版本(如 0.20.0+)的示例代码,可能遇到方法名变更、参数调整或功能移除等问题(例如 Text 类的某些样式参数在新版本中已被弃用),严格使用对应版本的文档或示例。也不要使用旧版本的Manim开发:例如ShowCreation 是旧版 Manim 的动画类,新版(尤其是 manimCE v0.12.0+)推荐使用Create()画出线条或图形 问题类型六:页面元素布局控制, 在场景设计中,图片和文字的排版易出现位置偏移或间距失衡问题: 1.​图片定位​:未显式设置坐标时,图片可能默认出现在画布左上角或随机位置。需通过 move_to()、to_edge() 或相对定位(如 next_to(title, DOWN))明确位置; 2.​标题与内容间距​:直接连续添加标题和内容可能导致重叠。建议使用 VGroup 组合元素后,通过 arrange(DOWN, buff=0.5) 调节垂直间距(buff 控制间隔大小),或单独设置 shift(DOWN*2) 微调位置; 3.​居中问题​:文本/图片默认左对齐,需通过 move_to(ORIGIN) 或结合 align_to(LEFT/RIGHT/UP/DOWN) 实现精准居中或对齐边界。 问题类型七:内容可视化注意事项 在制作教学动画时需要特别注意: 1.​数学公式​:复杂的ML公式应分步展示,避免一次性显示过长的公式导致超出屏幕; 2.​算法流程​:用简洁的流程图展示算法步骤,避免过度复杂的逻辑图; 3.​数据可视化​:展示数据点时注意坐标范围,确保所有点都在可视区域内; 4.​概念层次​:概念具有层次性,应按照从简单到复杂的顺序渐进展示。 问题类型八:Code()不支持font_size参数,不支持code参数,同时Code物件也没有.code这个属性,要千万注意哦!!! 5.在生成多行字符串时,字符串内部的所有代码行必须保留缩进,严禁顶格书写,确保与外层代码缩进对齐。 base_url: ${BASE_URL} api_key: ${API_KEY} params: {} tooling: [] thinking: null memories: [] retry: null description: '' context_window: 0 - id: Concluder type: agent config: name: gemini-3-flash-preview provider: gemini role: |- 请先调用 describe_available_files,检查当前目录中的.py脚本文件的路径;之后直接使用render_manim工具进行渲染,此工具的参数只需要{script_path}(脚本路径(绝对路径));如果有多个py文件,则需要对每个py文件均运行render_manim工具进行渲染 如果你在render_manim中发现出现问题,请你将具体的报错输出,同时输出“ERROR” base_url: ${BASE_URL} api_key: ${API_KEY} params: {} tooling: - type: function config: tools: - name: render_manim - name: describe_available_files timeout: null prefix: '' thinking: null memories: [] retry: null description: '' context_window: 0 - id: Paginator type: agent config: name: gemini-3-flash-preview provider: gemini role: |- 你是一位专业的文档格式处理专家,擅长为教学文档添加合适的分页标记。 任务:对提供的章节markdown内容进行分页处理,添加分页标记但完全保留所有原有内容。 章节内容: {section_content} ## 处理原则: 1. **完全保留原有内容** - 逐字逐句完整保留,包括所有文字、标点、空行、格式和结构 2. **只添加分页标记** - 仅在合适位置插入分页符 3. **保持逻辑结构** - 确保分页不会破坏内容的逻辑连贯性 4. **内容完整性第一** - 保证内容完整 ## 分页标记规则: - 使用 `` 作为分页标记 - 分页标记必须单独占一行 ## 分页策略: - 你分割的一页是后续要在 manim 一页中展示的,所以尽量细致一些,但也不要太细 - 确保代码示例完整性 - 重要概念不被分页截断 - 如果某一章节不需要分页,就什么都不改变就可以 - 不要将各级标题单独分为一页,这很重要 ## 输出要求: - 保持原有的markdown格式 - 分页标记单独占一行 - **绝对不能截断或省略任何部分** ## 输出格式: 直接输出处理后的完整markdown内容,不要添加任何解释文字。 请严格按照上述要求处理章节内容,确保输出内容的完整性。 base_url: ${BASE_URL} api_key: ${API_KEY} params: {} tooling: [] thinking: null memories: [] retry: null description: '' context_window: 0 edges: - from: Visualization Executor to: Code Generator trigger: true condition: type: function config: name: code_fail carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: null - from: Visualization Executor to: Concluder trigger: true condition: type: function config: name: code_pass carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: null - from: Concluder to: Code Generator trigger: true condition: type: keyword config: any: - ERROR none: [] regex: [] case_sensitive: true carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: null - from: Concluder to: Video Concat trigger: true condition: 'true' carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: null - from: Content Composer to: Paginator trigger: true condition: 'true' carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: null - from: Code Generator to: Visualization Executor trigger: true condition: 'true' carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: type: map split: type: message config: {} config: max_parallel: 10 - from: Paginator to: Code Generator trigger: true condition: 'true' carry_data: true keep_message: false clear_context: false clear_kept_context: false process: null dynamic: type: map split: type: regex config: pattern: (.*?) group: '' case_sensitive: true multiline: false dotall: false on_no_match: pass config: max_parallel: 10 memory: [] initial_instruction: '' start: - Content Composer end: [] version: 0.0.0 vars: {}