Update app.py
Browse files
app.py
CHANGED
@@ -86,29 +86,20 @@ def messages():
|
|
86 |
|
87 |
try:
|
88 |
json_body = request.json
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
"stop_sequence": "string",
|
100 |
-
"usage": {"input_tokens": 0, "output_tokens": 0}
|
101 |
-
})
|
102 |
-
|
103 |
# 记录日志:此时请求上下文仍然有效
|
104 |
log_request(request.remote_addr, request.path, 200)
|
105 |
|
106 |
def generate():
|
107 |
-
previous_messages = "\n\n".join([msg['content'] for msg in json_body['messages']])
|
108 |
-
msg_id = str(uuid.uuid4())
|
109 |
-
response_event = Event()
|
110 |
-
response_text = []
|
111 |
-
|
112 |
yield create_event("message_start", {
|
113 |
"type": "message_start",
|
114 |
"message": {
|
@@ -214,6 +205,86 @@ def messages():
|
|
214 |
log_request(request.remote_addr, request.path, 400)
|
215 |
return jsonify({"error": str(e)}), 400
|
216 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
@app.errorhandler(404)
|
218 |
def not_found(error):
|
219 |
log_request(request.remote_addr, request.path, 404)
|
|
|
86 |
|
87 |
try:
|
88 |
json_body = request.json
|
89 |
+
stream = json_body.get('stream', True) # 默认为True
|
90 |
+
previous_messages = "\n\n".join([msg['content'] for msg in json_body['messages']])
|
91 |
+
msg_id = str(uuid.uuid4())
|
92 |
+
response_event = Event()
|
93 |
+
response_text = []
|
94 |
+
|
95 |
+
if not stream:
|
96 |
+
# 处理 stream 为 false 的情况
|
97 |
+
return handle_non_stream(previous_messages, msg_id)
|
98 |
+
|
|
|
|
|
|
|
|
|
99 |
# 记录日志:此时请求上下文仍然有效
|
100 |
log_request(request.remote_addr, request.path, 200)
|
101 |
|
102 |
def generate():
|
|
|
|
|
|
|
|
|
|
|
103 |
yield create_event("message_start", {
|
104 |
"type": "message_start",
|
105 |
"message": {
|
|
|
205 |
log_request(request.remote_addr, request.path, 400)
|
206 |
return jsonify({"error": str(e)}), 400
|
207 |
|
208 |
+
def handle_non_stream(previous_messages, msg_id):
|
209 |
+
"""
|
210 |
+
处理 stream 为 false 的情况,返回完整的响应。
|
211 |
+
"""
|
212 |
+
try:
|
213 |
+
response_event = Event()
|
214 |
+
response_text = []
|
215 |
+
|
216 |
+
def on_connect():
|
217 |
+
logging.info("Connected to Perplexity AI")
|
218 |
+
emit_data = {
|
219 |
+
"version": "2.9",
|
220 |
+
"source": "default",
|
221 |
+
"attachments": [],
|
222 |
+
"language": "en-GB",
|
223 |
+
"timezone": "Europe/London",
|
224 |
+
"search_focus": "writing",
|
225 |
+
"frontend_uuid": str(uuid.uuid4()),
|
226 |
+
"mode": "concise",
|
227 |
+
"is_related_query": False,
|
228 |
+
"is_default_related_query": False,
|
229 |
+
"visitor_id": str(uuid.uuid4()),
|
230 |
+
"frontend_context_uuid": str(uuid.uuid4()),
|
231 |
+
"prompt_source": "user",
|
232 |
+
"query_source": "home"
|
233 |
+
}
|
234 |
+
sio.emit('perplexity_ask', (previous_messages, emit_data))
|
235 |
+
|
236 |
+
def on_query_progress(data):
|
237 |
+
nonlocal response_text
|
238 |
+
if 'text' in data:
|
239 |
+
text = json.loads(data['text'])
|
240 |
+
chunk = text['chunks'][-1] if text['chunks'] else None
|
241 |
+
if chunk:
|
242 |
+
response_text.append(chunk)
|
243 |
+
|
244 |
+
# 检查是否是最终响应
|
245 |
+
if data.get('final', False):
|
246 |
+
response_event.set()
|
247 |
+
|
248 |
+
def on_disconnect():
|
249 |
+
logging.info("Disconnected from Perplexity AI")
|
250 |
+
response_event.set()
|
251 |
+
|
252 |
+
def on_connect_error(data):
|
253 |
+
logging.error(f"Connection error: {data}")
|
254 |
+
response_text.append(f"Error connecting to Perplexity AI: {data}")
|
255 |
+
response_event.set()
|
256 |
+
|
257 |
+
sio.on('connect', on_connect)
|
258 |
+
sio.on('query_progress', on_query_progress)
|
259 |
+
sio.on('disconnect', on_disconnect)
|
260 |
+
sio.on('connect_error', on_connect_error)
|
261 |
+
|
262 |
+
sio.connect('wss://www.perplexity.ai/', **connect_opts, headers=sio_opts['extraHeaders'])
|
263 |
+
|
264 |
+
# 等待响应完成
|
265 |
+
response_event.wait(timeout=30)
|
266 |
+
|
267 |
+
# 生成完整的响应
|
268 |
+
full_response = {
|
269 |
+
"id": msg_id,
|
270 |
+
"content": [{"text": ''.join(response_text)}], # 合并所有文本块
|
271 |
+
"model": "claude-3-opus-20240229",
|
272 |
+
"stop_reason": "end_turn",
|
273 |
+
"stop_sequence": None,
|
274 |
+
"usage": {
|
275 |
+
"input_tokens": 8,
|
276 |
+
"output_tokens": len(''.join(response_text)),
|
277 |
+
},
|
278 |
+
}
|
279 |
+
return jsonify(full_response)
|
280 |
+
|
281 |
+
except Exception as e:
|
282 |
+
logging.error(f"Error during socket connection: {str(e)}")
|
283 |
+
return jsonify({"error": str(e)}), 500
|
284 |
+
finally:
|
285 |
+
if sio.connected:
|
286 |
+
sio.disconnect()
|
287 |
+
|
288 |
@app.errorhandler(404)
|
289 |
def not_found(error):
|
290 |
log_request(request.remote_addr, request.path, 404)
|