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)
|