Files
dsProject/dsLightRag/Manim/Backup/T2_LLM.py

204 lines
7.9 KiB
Python
Raw Normal View History

2025-08-14 15:45:08 +08:00
from openai import OpenAI
import subprocess # 新增导入
from Config.Config import ALY_LLM_API_KEY, ALY_LLM_MODEL_NAME, ALY_LLM_BASE_URL
if __name__ == '__main__':
# 初始化OpenAI客户端
client = OpenAI(
api_key=ALY_LLM_API_KEY,
base_url=ALY_LLM_BASE_URL
)
reasoning_content = "" # 定义完整思考过程
answer_content = "" # 定义完整回复
is_answering = False # 判断是否结束思考过程并开始回复
# 3、 分块追加:在上一步代码基础上,加一条动态垂直线段,连接圆上的动点与 x 轴,并显示线段长度数值。
prompt = """
你是一位资深 Manim 动画工程师专注于教育场景请遵循以下规范
1. 仅输出 Python 代码不解释思路
2. 使用 Manim 社区版 v0.18.0 语法
3. 严格按提示的步骤进行编码不要发挥扩展
4. 所有公式用 MathTex文字用 Text更好地支持中文颜色统一用 Manim 内置调色板
5. 关键坐标用常量定义在类顶部例如 LEFT_MARGIN = 3.2
6. 每行不超过 88 字符函数名用 snake_case
7. 动画时长 3-5 / 默认 ease-in-out
8. 请严格按照以下模板坐标轴范围颜色字体统一使用 Manim 社区版默认主题
9. 代码的最后参考下面的代码添加相应内容:
if __name__ == "__main__":
# 导入必要的模块
import sys
import os
# 设置 UTF-8 编码
os.environ['PYTHONIOENCODING'] = 'utf-8'
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')
# 全局指定 ctex 模板(一次性)
config.tex_template = TexTemplateLibrary.ctex
# 使用临时配置渲染场景配置只在with块内有效
with tempconfig({{
"quality": "high_quality",
"background_color": WHITE,
"preview": True
}}):
# 实例化场景类
scene = ParabolaUp()
# 执行渲染流程(包含文件生成和预览)
scene.render()
10. 输出要求
(1). 完整可运行 Python 脚本文件名 ParabolaUp.py
(2). 场景类名 ParabolaUp
(3). 包含 `if __name__ == "__main__":` 可直接 `manim -pql ParabolaUp.py ParabolaUp`
(4). 代码内只出现中文注释方便二次修改
本成的具体需求如下
{{XuQiu}}
"""
# XuQiu = """
# 任务:生成一条 45 秒的抛物线教学动画。
# 面向:初二学生,零前置知识。
# 风格:明亮、卡通、无暴力特效。
#
# 【场景结构】
# 1. 开口向上15 s
# 显示标题a是正数开口向上
# 画面:公式栏出现 y = ax² 逐步缩放。
# 动画:
# - 先出现 y = x²再乘以 a = 0.5 → 1 → 2曲线随之变胖/变瘦。
# - 同步出现滑杆数值 a = 0.5 / 1 / 2。
#
# 2. 动画:留 5 秒静止帧,方便老师暂停提问。
# """
LLM_XuQiu="""
任务 Manim 生成 20 秒极简抛物线动画
风格明亮卡通黑色背景
要求
1. 背景 BLACK
2. 坐标系Axes(x_range=[-4,4,1], y_range=[-3,5,1])带箭头
3. 曲线y = a a 0.52 匀速变化始终过原点
4. 颜色曲线 YELLOW_E坐标轴 WHITE
5. 动画无滑块无文字仅曲线随 a 缩放 15 秒后静止 5
输出
文件名 ParabolaUp.py场景类 ParabolaUp可直接 `manim -pql` 运行
"""
prompt = prompt.format(XuQiu=LLM_XuQiu)
# 创建聊天完成请求
completion = client.chat.completions.create(
model=ALY_LLM_MODEL_NAME,
messages=[
{
"role": "user",
"content": [
{"type": "text",
"text": prompt},
],
},
],
stream=True,
)
print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")
for chunk in completion:
# 如果chunk.choices为空则打印usage
if not chunk.choices:
print("\nUsage:")
print(chunk.usage)
else:
delta = chunk.choices[0].delta
# 打印思考过程
if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
print(delta.reasoning_content, end='', flush=True)
reasoning_content += delta.reasoning_content
else:
# 开始回复
if delta.content != "" and is_answering is False:
print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
is_answering = True
# 打印回复过程
print(delta.content, end='', flush=True)
answer_content += delta.content
# 保存提示词和生成结果到文件
with open("/Manim/TiShiCi.txt", "w", encoding="utf-8") as f:
f.write("====== 提示词 ======\n")
f.write(prompt)
f.write("\n\n====== 生成结果 ======\n")
f.write(answer_content)
print("提示词和生成结果已保存到 TiShiCi.txt 文件中。")
# 将生成结果另存为ParabolaUp.py
# 逐行读取并只写入```python和```之间的内容
clean_content = []
start_writing = False
# 逐行处理answer_content
for line in answer_content.split('\n'):
# 检查是否开始写入
if '```python' in line:
start_writing = True
continue # 跳过这一行
# 检查是否结束写入
elif line.strip() == '```':
start_writing = False
break # 结束写入
# 如果正在写入则添加到clean_content
elif start_writing:
# 替换全角符号为半角符号
line = line.replace('', ',')
line = line.replace('', ';')
line = line.replace('', ':')
line = line.replace('', '.')
line = line.replace('', '(')
line = line.replace('', ')')
clean_content.append(line)
# 组合成完整的内容
clean_content = '\n'.join(clean_content)
# 在代码开头添加必要的编码声明
clean_content = '# -*- coding: utf-8 -*-\n' + clean_content
with open("/Manim/ParabolaUp.py", "w", encoding="utf-8") as f:
f.write(clean_content)
print("生成结果已另存为 ParabolaUp.py 文件中。")
# 运行 ParabolaUp.py 文件
print("开始运行 ParabolaUp.py 文件...")
try:
# 先检查Python文件语法是否正确
syntax_check = subprocess.run(
["python", "-m", "py_compile", "d:\dsWork\dsProject\dsLightRag\Manim\ParabolaUp.py"],
capture_output=True,
text=True,
encoding='utf-8'
)
if syntax_check.returncode != 0:
print(f"ParabolaUp.py 语法检查失败: {syntax_check.stderr}")
else:
print("ParabolaUp.py 语法检查通过,开始运行...")
# 使用manim命令行运行动画
result = subprocess.run(
["manim", "-pql", "d:\dsWork\dsProject\dsLightRag\Manim\ParabolaUp.py", "ParabolaUp"],
check=True,
capture_output=True,
text=True,
encoding='utf-8'
)
print("ParabolaUp.py 运行成功!")
print(f"输出: {result.stdout}")
except subprocess.CalledProcessError as e:
print(f"ParabolaUp.py 运行失败: {e}")
print(f"错误输出: {e.stderr}")