Update app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,10 @@ from flask import Flask, request, Response, stream_with_context
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
import json
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
app = Flask(__name__)
|
| 7 |
|
|
@@ -15,6 +19,7 @@ def aippt_outline():
|
|
| 15 |
data = request.json
|
| 16 |
content = data.get('content')
|
| 17 |
language = data.get('language', 'zh')
|
|
|
|
| 18 |
|
| 19 |
# 构建发送给 OpenAI 的提示
|
| 20 |
messages = [
|
|
@@ -49,7 +54,7 @@ def aippt_outline():
|
|
| 49 |
'Authorization': f'Bearer {OPENAI_API_KEY}'
|
| 50 |
}
|
| 51 |
payload = {
|
| 52 |
-
'model':
|
| 53 |
'messages': messages,
|
| 54 |
'stream': True
|
| 55 |
}
|
|
@@ -82,6 +87,7 @@ def aippt():
|
|
| 82 |
data = request.json
|
| 83 |
content = data.get('content')
|
| 84 |
language = data.get('language', 'zh')
|
|
|
|
| 85 |
|
| 86 |
# 构建发送给 OpenAI 的提示,包含 PPTist 所需数据结构的详细说明
|
| 87 |
messages = [
|
|
@@ -94,25 +100,25 @@ def aippt():
|
|
| 94 |
2. 必须严格遵循以下JSON格式,任何格式错误都会导致幻灯片无法显示:
|
| 95 |
|
| 96 |
封面页:
|
| 97 |
-
{"type":"cover","data":{"title":"主标题","text":"副标题或简短描述"}}
|
| 98 |
|
| 99 |
目录页:
|
| 100 |
-
{"type":"contents","data":{"items":["一级章节1","一级章节2","一级章节3","一级章节4","一级章节5"]}}
|
| 101 |
|
| 102 |
过渡页:
|
| 103 |
-
{"type":"transition","data":{"title":"章节标题","text":"章节简介"}}
|
| 104 |
|
| 105 |
内容页:
|
| 106 |
-
{"type":"content","data":{"title":"二级标题","items":[{"title":"要点1标题","text":"要点1描述"},{"title":"要点2标题","text":"要点2描述"},{"title":"要点3标题","text":"要点3描述"},{"title":"要点4标题","text":"要点4描述"}]}}
|
| 107 |
|
| 108 |
结束页:
|
| 109 |
-
{"type":"end"}
|
| 110 |
|
| 111 |
3. 转换规则:
|
| 112 |
-
- 大纲中的主标题("#
|
| 113 |
-
- 所有一级章节("##
|
| 114 |
- 每个一级章节前生成一个过渡页
|
| 115 |
-
- 每个二级标题("###
|
| 116 |
- 内容页中的items数组由该二级标题下的要点("-"开头)组成
|
| 117 |
- 最后添加一个结束页
|
| 118 |
|
|
@@ -123,10 +129,9 @@ def aippt():
|
|
| 123 |
- 每个内容页必须包含该节点下所有的要点,通常为2-4个
|
| 124 |
|
| 125 |
示例输出:
|
| 126 |
-
{"type":"cover","data":{"title":"5G技术如何改变我们的生活","text":"探索5G技术对现代生活的全方位影响"}}
|
| 127 |
-
{"type":"contents","data":{"items":["5G技术概述","5G对通信领域的变革","5G与智能家居的融合","5G推动智能交通发展","5G在医疗领域的应用","5G助力工业互联网升级"]}}
|
| 128 |
-
{"type":"transition","data":{"title":"5G技术概述","text":"本章将介绍5G技术的定义、关键特性及发展历程。"}}
|
| 129 |
-
..."""
|
| 130 |
},
|
| 131 |
{
|
| 132 |
"role": "user",
|
|
@@ -140,7 +145,7 @@ def aippt():
|
|
| 140 |
'Authorization': f'Bearer {OPENAI_API_KEY}'
|
| 141 |
}
|
| 142 |
payload = {
|
| 143 |
-
'model':
|
| 144 |
'messages': messages,
|
| 145 |
'stream': True
|
| 146 |
}
|
|
@@ -193,17 +198,17 @@ def aippt():
|
|
| 193 |
# 验证是否为有效的 JSON
|
| 194 |
slide_data = json.loads(json_str)
|
| 195 |
|
| 196 |
-
#
|
| 197 |
-
if isinstance(slide_data, dict) and
|
| 198 |
# 发送到客户端
|
| 199 |
yield json.dumps(slide_data) + '\n'
|
| 200 |
# 从缓冲区中移除已处理的部分
|
| 201 |
buffer = buffer[json_end+1:]
|
| 202 |
else:
|
| 203 |
-
#
|
| 204 |
buffer = buffer[json_end+1:]
|
| 205 |
except Exception as e:
|
| 206 |
-
# 解析错误,可能不是完整的JSON
|
| 207 |
print(f"Error parsing JSON: {e}")
|
| 208 |
break
|
| 209 |
except Exception as e:
|
|
@@ -211,9 +216,5 @@ def aippt():
|
|
| 211 |
|
| 212 |
return Response(stream_with_context(generate()), mimetype='text/event-stream')
|
| 213 |
|
| 214 |
-
# 添加请求警告过滤器,抑制 SSL 验证警告
|
| 215 |
-
import urllib3
|
| 216 |
-
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
| 217 |
-
|
| 218 |
if __name__ == '__main__':
|
| 219 |
app.run(debug=True, host='0.0.0.0', port=7860)
|
|
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
import json
|
| 5 |
+
import urllib3
|
| 6 |
+
|
| 7 |
+
# 禁用 SSL 警告
|
| 8 |
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
| 9 |
|
| 10 |
app = Flask(__name__)
|
| 11 |
|
|
|
|
| 19 |
data = request.json
|
| 20 |
content = data.get('content')
|
| 21 |
language = data.get('language', 'zh')
|
| 22 |
+
model = data.get('model', 'gpt-4o')
|
| 23 |
|
| 24 |
# 构建发送给 OpenAI 的提示
|
| 25 |
messages = [
|
|
|
|
| 54 |
'Authorization': f'Bearer {OPENAI_API_KEY}'
|
| 55 |
}
|
| 56 |
payload = {
|
| 57 |
+
'model': model,
|
| 58 |
'messages': messages,
|
| 59 |
'stream': True
|
| 60 |
}
|
|
|
|
| 87 |
data = request.json
|
| 88 |
content = data.get('content')
|
| 89 |
language = data.get('language', 'zh')
|
| 90 |
+
model = data.get('model', 'gpt-4.1-mini')
|
| 91 |
|
| 92 |
# 构建发送给 OpenAI 的提示,包含 PPTist 所需数据结构的详细说明
|
| 93 |
messages = [
|
|
|
|
| 100 |
2. 必须严格遵循以下JSON格式,任何格式错误都会导致幻灯片无法显示:
|
| 101 |
|
| 102 |
封面页:
|
| 103 |
+
{{"type":"cover","data":{{"title":"主标题","text":"副标题或简短描述"}}}}
|
| 104 |
|
| 105 |
目录页:
|
| 106 |
+
{{"type":"contents","data":{{"items":["一级章节1","一级章节2","一级章节3","一级章节4","一级章节5"]}}}}
|
| 107 |
|
| 108 |
过渡页:
|
| 109 |
+
{{"type":"transition","data":{{"title":"章节标题","text":"章节简介"}}}}
|
| 110 |
|
| 111 |
内容页:
|
| 112 |
+
{{"type":"content","data":{{"title":"二级标题","items":[{{"title":"要点1标题","text":"要点1描述"}},{{"title":"要点2标题","text":"要点2描述"}},{{"title":"要点3标题","text":"要点3描述"}},{{"title":"要点4标题","text":"要点4描述"}}]}}}}
|
| 113 |
|
| 114 |
结束页:
|
| 115 |
+
{{"type":"end"}}
|
| 116 |
|
| 117 |
3. 转换规则:
|
| 118 |
+
- 大纲中的主标题("#"开头)转换为封面页
|
| 119 |
+
- 所有一级章节("##"开头)组成目录页
|
| 120 |
- 每个一级章节前生成一个过渡页
|
| 121 |
+
- 每个二级标题("###"开头)生成一个内容页
|
| 122 |
- 内容页中的items数组由该二级标题下的要点("-"开头)组成
|
| 123 |
- 最后添加一个结束页
|
| 124 |
|
|
|
|
| 129 |
- 每个内容页必须包含该节点下所有的要点,通常为2-4个
|
| 130 |
|
| 131 |
示例输出:
|
| 132 |
+
{{"type":"cover","data":{{"title":"5G技术如何改变我们的生活","text":"探索5G技术对现代生活的全方位影响"}}}}
|
| 133 |
+
{{"type":"contents","data":{{"items":["5G技术概述","5G对通信领域的变革","5G与智能家居的融合","5G推动智能交通发展","5G在医疗领域的应用","5G助力工业互联网升级"]}}}}
|
| 134 |
+
{{"type":"transition","data":{{"title":"5G技术概述","text":"本章将介绍5G技术的定义、关键特性及发展历程。"}}}}"""
|
|
|
|
| 135 |
},
|
| 136 |
{
|
| 137 |
"role": "user",
|
|
|
|
| 145 |
'Authorization': f'Bearer {OPENAI_API_KEY}'
|
| 146 |
}
|
| 147 |
payload = {
|
| 148 |
+
'model': model,
|
| 149 |
'messages': messages,
|
| 150 |
'stream': True
|
| 151 |
}
|
|
|
|
| 198 |
# 验证是否为有效的 JSON
|
| 199 |
slide_data = json.loads(json_str)
|
| 200 |
|
| 201 |
+
# 验证是否包含必要的字段
|
| 202 |
+
if isinstance(slide_data, dict) and 'type' in slide_data:
|
| 203 |
# 发送到客户端
|
| 204 |
yield json.dumps(slide_data) + '\n'
|
| 205 |
# 从缓冲区中移除已处理的部分
|
| 206 |
buffer = buffer[json_end+1:]
|
| 207 |
else:
|
| 208 |
+
# 格式不符合要求,从缓冲区移除
|
| 209 |
buffer = buffer[json_end+1:]
|
| 210 |
except Exception as e:
|
| 211 |
+
# 解析错误,可能不是完整的JSON,等待更多数据
|
| 212 |
print(f"Error parsing JSON: {e}")
|
| 213 |
break
|
| 214 |
except Exception as e:
|
|
|
|
| 216 |
|
| 217 |
return Response(stream_with_context(generate()), mimetype='text/event-stream')
|
| 218 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 219 |
if __name__ == '__main__':
|
| 220 |
app.run(debug=True, host='0.0.0.0', port=7860)
|