smgc commited on
Commit
4a5e212
1 Parent(s): f30c15c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -19
app.py CHANGED
@@ -86,29 +86,20 @@ def messages():
86
 
87
  try:
88
  json_body = request.json
89
- if not json_body.get('stream', False):
90
- log_request(request.remote_addr, request.path, 200)
91
- return jsonify({
92
- "id": str(uuid.uuid4()),
93
- "content": [
94
- {"text": "Please turn on streaming."},
95
- {"id": "string", "name": "string", "input": {}}
96
- ],
97
- "model": "string",
98
- "stop_reason": "end_turn",
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)