|
|
|
@ -18,17 +18,48 @@ client = OpenAI(
|
|
|
|
|
api_key=MODEL_API_KEY,
|
|
|
|
|
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
|
|
|
)
|
|
|
|
|
import re
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
def markdown_to_dict(markdown_content):
|
|
|
|
|
"""
|
|
|
|
|
将 Markdown 内容转换为 Python 字典
|
|
|
|
|
将 Markdown 内容转换为 Python 字典,并处理【】中的文字
|
|
|
|
|
"""
|
|
|
|
|
# 将 Markdown 转换为 JSON 字符串
|
|
|
|
|
json_content = markdown_to_json.jsonify(markdown_content)
|
|
|
|
|
# 解码 Unicode 转义
|
|
|
|
|
json_content = json_content.encode('utf-8').decode('unicode_escape')
|
|
|
|
|
# 将 JSON 字符串转换为字典
|
|
|
|
|
return json.loads(json_content)
|
|
|
|
|
json_dict = json.loads(json_content)
|
|
|
|
|
|
|
|
|
|
# 提取【】中的文字
|
|
|
|
|
def extract_brackets(text):
|
|
|
|
|
match = re.search(r'【(.*?)】', text)
|
|
|
|
|
return match.group(1) if match else None
|
|
|
|
|
|
|
|
|
|
# 递归处理字典,提取并赋值 title 和 text 属性
|
|
|
|
|
def process_dict(d):
|
|
|
|
|
if isinstance(d, dict):
|
|
|
|
|
for key, value in d.items():
|
|
|
|
|
if isinstance(value, str):
|
|
|
|
|
# 提取【】中的文字作为 text
|
|
|
|
|
text = extract_brackets(value)
|
|
|
|
|
if text:
|
|
|
|
|
# title 是【】左侧的文字
|
|
|
|
|
d[key] = value.split("【")[0].strip()
|
|
|
|
|
# text 是【】中的内容
|
|
|
|
|
d[f"{key}_text"] = text
|
|
|
|
|
elif isinstance(value, dict):
|
|
|
|
|
process_dict(value)
|
|
|
|
|
elif isinstance(value, list):
|
|
|
|
|
for item in value:
|
|
|
|
|
process_dict(item)
|
|
|
|
|
elif isinstance(d, list):
|
|
|
|
|
for item in d:
|
|
|
|
|
process_dict(item)
|
|
|
|
|
|
|
|
|
|
process_dict(json_dict)
|
|
|
|
|
return json_dict
|
|
|
|
|
|
|
|
|
|
def extract_level1(json_dict):
|
|
|
|
|
"""
|
|
|
|
@ -37,10 +68,11 @@ def extract_level1(json_dict):
|
|
|
|
|
# 获取第一个一级目录的名称
|
|
|
|
|
level1_title = next(iter(json_dict.keys()), None)
|
|
|
|
|
if level1_title:
|
|
|
|
|
return [{"type": "cover", "data": {"title": level1_title, "text": level1_title}}]
|
|
|
|
|
# 提取 text 属性
|
|
|
|
|
level1_text = json_dict.get(f"{level1_title}_text", "")
|
|
|
|
|
return [{"type": "cover", "data": {"title": level1_title, "text": level1_text}}]
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def extract_level2_and_level3(json_dict, level1_title=None):
|
|
|
|
|
"""
|
|
|
|
|
提取指定一级目录下的二级目录及其三级目录内容,生成指定格式的 JSON 对象列表
|
|
|
|
@ -52,11 +84,14 @@ def extract_level2_and_level3(json_dict, level1_title=None):
|
|
|
|
|
if level1_title and level1_title in json_dict:
|
|
|
|
|
result = []
|
|
|
|
|
for level2_title, level2_content in json_dict[level1_title].items():
|
|
|
|
|
# 输出二级目录
|
|
|
|
|
result.append({"type": "transition", "data": {"title": level2_title, "text": level2_title}})
|
|
|
|
|
# 提取二级目录的 text 属性
|
|
|
|
|
level2_text = json_dict[level1_title].get(f"{level2_title}_text", "")
|
|
|
|
|
result.append({"type": "transition", "data": {"title": level2_title, "text": level2_text}})
|
|
|
|
|
# 输出三级目录内容
|
|
|
|
|
if isinstance(level2_content, dict):
|
|
|
|
|
for level3_title, level3_items in level2_content.items():
|
|
|
|
|
# 提取三级目录的 text 属性
|
|
|
|
|
level3_text = level2_content.get(f"{level3_title}_text", "")
|
|
|
|
|
# 确保 level3_items 是列表
|
|
|
|
|
if isinstance(level3_items, list):
|
|
|
|
|
items = [{"title": item, "text": item} for item in level3_items]
|
|
|
|
@ -66,6 +101,7 @@ def extract_level2_and_level3(json_dict, level1_title=None):
|
|
|
|
|
"type": "content",
|
|
|
|
|
"data": {
|
|
|
|
|
"title": level3_title,
|
|
|
|
|
"text": level3_text,
|
|
|
|
|
"items": items
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
@ -97,6 +133,7 @@ async def ConvertMarkdownToJson(markdown_content):
|
|
|
|
|
|
|
|
|
|
# 提取一级目录
|
|
|
|
|
level1_json = extract_level1(json_dict)
|
|
|
|
|
print(level1_json)
|
|
|
|
|
for item in level1_json:
|
|
|
|
|
yield json.dumps(item, ensure_ascii=False)
|
|
|
|
|
await asyncio.sleep(0.5) # 控制逐行输出的速度
|
|
|
|
@ -109,6 +146,7 @@ async def ConvertMarkdownToJson(markdown_content):
|
|
|
|
|
# 提取二级目录及其三级目录内容
|
|
|
|
|
level2_and_level3_json = extract_level2_and_level3(json_dict)
|
|
|
|
|
for item in level2_and_level3_json:
|
|
|
|
|
print(item)
|
|
|
|
|
yield json.dumps(item, ensure_ascii=False)
|
|
|
|
|
await asyncio.sleep(0.5)
|
|
|
|
|
|
|
|
|
@ -139,7 +177,7 @@ async def generate_stream_markdown(course_name: str):
|
|
|
|
|
model=MODEL_NAME,
|
|
|
|
|
messages=[
|
|
|
|
|
{'role': 'system', 'content': '你是一个教学经验丰富的基础教育教师'},
|
|
|
|
|
{'role': 'user', 'content': '帮我设计一下' + course_name + '的课件提纲,用markdown格式返回。强调1、标签只能返回 #,##,###,-,其它标签一率不可以返回,这个非常重要!2、不要返回 ```markdown 或者 ``` 这样的内容! 3、每部分都有生成完整的一、二、三级内容,不能省略。4、一级、二级、三级都要同步生成一个对于当前部分的一句话描述。以【】包裹起来。'}
|
|
|
|
|
{'role': 'user', 'content': '帮我设计一下' + course_name + '的课件提纲,用markdown格式返回。强调1、标签只能返回 #,##,###,-,其它标签一率不可以返回,这个非常重要!2、不要返回 ```markdown 或者 ``` 这样的内容! 3、每部分都有生成完整的一、二、三级内容,不能省略。4、必须做到:一级、二级、三级都要同步生成一个对于当前部分的一句话描述,尽量简短,不要出现标点符号,与当前级别换行后输出,放到【】这两个符号内部。'}
|
|
|
|
|
],
|
|
|
|
|
stream=True, # 启用流式响应
|
|
|
|
|
timeout=6000,
|
|
|
|
|