openbmb--chatdev
333 行
14 KiB
YAML
可执行文件
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: {}
|