Files
dsProject/dsLightRag/Manim/Backup/T2_LLM.py
2025-08-14 15:45:08 +08:00

204 lines
7.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 x²a 从 0.5→2 匀速变化,始终过原点
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}")