项目文件夹

文件
wehub-resource-sync d0e4308def
Validate YAML Workflows / Validate YAML Configuration Files (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:37:51 +08:00

333 行
14 KiB
YAML
可执行文件

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. **内容完整性第一** - 保证内容完整
## 分页标记规则:
- 使用 `<!-- PAGEBREAK -->` 作为分页标记
- 分页标记必须单独占一行
## 分页策略:
- 你分割的一页是后续要在 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: (.*?)<!--\s*PAGEBREAK\s*-->
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: {}