Update app.py
Browse files
app.py
CHANGED
@@ -5,8 +5,10 @@ from datetime import datetime
|
|
5 |
from flask import Flask, request, Response, jsonify
|
6 |
import socketio
|
7 |
import requests
|
|
|
8 |
|
9 |
app = Flask(__name__)
|
|
|
10 |
|
11 |
# 从环境变量中获取API密钥
|
12 |
API_KEY = os.environ.get('PPLX_KEY')
|
@@ -25,11 +27,11 @@ if proxy_url:
|
|
25 |
else:
|
26 |
transport = None
|
27 |
|
28 |
-
sio = socketio.Client(http_session=transport)
|
29 |
|
30 |
# 连接选项
|
31 |
connect_opts = {
|
32 |
-
'transports': ['websocket'],
|
33 |
}
|
34 |
|
35 |
# 其他选项
|
@@ -50,7 +52,7 @@ def log_request(req, status):
|
|
50 |
timestamp = datetime.now().isoformat()
|
51 |
ip = req.remote_addr
|
52 |
route = req.path
|
53 |
-
|
54 |
|
55 |
def validate_api_key():
|
56 |
api_key = request.headers.get('x-api-key')
|
@@ -122,8 +124,9 @@ def messages():
|
|
122 |
yield create_event("content_block_start", {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}})
|
123 |
yield create_event("ping", {"type": "ping"})
|
124 |
|
125 |
-
@sio.
|
126 |
-
def
|
|
|
127 |
sio.emit('perplexity_ask', previous_messages, {
|
128 |
"version": "2.9",
|
129 |
"source": "default",
|
@@ -141,8 +144,8 @@ def messages():
|
|
141 |
"query_source": "home"
|
142 |
})
|
143 |
|
144 |
-
@sio.
|
145 |
-
def
|
146 |
if 'text' in data:
|
147 |
text = json.loads(data['text'])
|
148 |
chunk = text['chunks'][-1] if text['chunks'] else None
|
@@ -153,30 +156,32 @@ def messages():
|
|
153 |
"delta": {"type": "text_delta", "text": chunk},
|
154 |
})
|
155 |
|
156 |
-
@sio.
|
157 |
-
def
|
158 |
-
|
159 |
|
160 |
-
@sio.
|
161 |
-
def
|
162 |
-
|
163 |
yield create_event("content_block_delta", {
|
164 |
"type": "content_block_delta",
|
165 |
"index": 0,
|
166 |
-
"delta": {"type": "text_delta", "text": "Error
|
167 |
})
|
168 |
-
yield create_event("content_block_stop", {"type": "content_block_stop", "index": 0})
|
169 |
-
yield create_event("message_delta", {
|
170 |
-
"type": "message_delta",
|
171 |
-
"delta": {"stop_reason": "end_turn", "stop_sequence": None},
|
172 |
-
"usage": {"output_tokens": 12},
|
173 |
-
})
|
174 |
-
yield create_event("message_stop", {"type": "message_stop"})
|
175 |
-
log_request(request, 500)
|
176 |
|
177 |
-
|
178 |
-
|
179 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
|
181 |
yield create_event("content_block_stop", {"type": "content_block_stop", "index": 0})
|
182 |
yield create_event("message_delta", {
|
@@ -190,7 +195,7 @@ def messages():
|
|
190 |
return Response(generate(), content_type='text/event-stream')
|
191 |
|
192 |
except Exception as e:
|
193 |
-
|
194 |
log_request(request, 400)
|
195 |
return jsonify({"error": str(e)}), 400
|
196 |
|
@@ -201,7 +206,7 @@ def not_found(error):
|
|
201 |
|
202 |
@app.errorhandler(500)
|
203 |
def server_error(error):
|
204 |
-
|
205 |
log_request(request, 500)
|
206 |
return "Something broke!", 500
|
207 |
|
@@ -212,7 +217,7 @@ def create_event(event, data):
|
|
212 |
|
213 |
if __name__ == '__main__':
|
214 |
port = int(os.environ.get('PORT', 8081))
|
215 |
-
|
216 |
if not API_KEY:
|
217 |
-
|
218 |
app.run(host='0.0.0.0', port=port)
|
|
|
5 |
from flask import Flask, request, Response, jsonify
|
6 |
import socketio
|
7 |
import requests
|
8 |
+
import logging
|
9 |
|
10 |
app = Flask(__name__)
|
11 |
+
logging.basicConfig(level=logging.INFO)
|
12 |
|
13 |
# 从环境变量中获取API密钥
|
14 |
API_KEY = os.environ.get('PPLX_KEY')
|
|
|
27 |
else:
|
28 |
transport = None
|
29 |
|
30 |
+
sio = socketio.Client(http_session=transport, logger=True, engineio_logger=True)
|
31 |
|
32 |
# 连接选项
|
33 |
connect_opts = {
|
34 |
+
'transports': ['websocket', 'polling'], # 允许回退到轮询
|
35 |
}
|
36 |
|
37 |
# 其他选项
|
|
|
52 |
timestamp = datetime.now().isoformat()
|
53 |
ip = req.remote_addr
|
54 |
route = req.path
|
55 |
+
logging.info(f"{timestamp} - {ip} - {route} - {status}")
|
56 |
|
57 |
def validate_api_key():
|
58 |
api_key = request.headers.get('x-api-key')
|
|
|
124 |
yield create_event("content_block_start", {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}})
|
125 |
yield create_event("ping", {"type": "ping"})
|
126 |
|
127 |
+
@sio.event
|
128 |
+
def connect():
|
129 |
+
logging.info("Connected to Perplexity AI")
|
130 |
sio.emit('perplexity_ask', previous_messages, {
|
131 |
"version": "2.9",
|
132 |
"source": "default",
|
|
|
144 |
"query_source": "home"
|
145 |
})
|
146 |
|
147 |
+
@sio.event
|
148 |
+
def query_progress(data):
|
149 |
if 'text' in data:
|
150 |
text = json.loads(data['text'])
|
151 |
chunk = text['chunks'][-1] if text['chunks'] else None
|
|
|
156 |
"delta": {"type": "text_delta", "text": chunk},
|
157 |
})
|
158 |
|
159 |
+
@sio.event
|
160 |
+
def disconnect():
|
161 |
+
logging.info("Disconnected from Perplexity AI")
|
162 |
|
163 |
+
@sio.event
|
164 |
+
def connect_error(data):
|
165 |
+
logging.error(f"Connection error: {data}")
|
166 |
yield create_event("content_block_delta", {
|
167 |
"type": "content_block_delta",
|
168 |
"index": 0,
|
169 |
+
"delta": {"type": "text_delta", "text": f"Error connecting to Perplexity AI: {data}"},
|
170 |
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
|
172 |
+
try:
|
173 |
+
sio.connect('wss://www.perplexity.ai/', **connect_opts, headers=sio_opts['extraHeaders'])
|
174 |
+
sio.wait()
|
175 |
+
except Exception as e:
|
176 |
+
logging.error(f"Error during socket connection: {str(e)}")
|
177 |
+
yield create_event("content_block_delta", {
|
178 |
+
"type": "content_block_delta",
|
179 |
+
"index": 0,
|
180 |
+
"delta": {"type": "text_delta", "text": f"Error during socket connection: {str(e)}"},
|
181 |
+
})
|
182 |
+
finally:
|
183 |
+
if sio.connected:
|
184 |
+
sio.disconnect()
|
185 |
|
186 |
yield create_event("content_block_stop", {"type": "content_block_stop", "index": 0})
|
187 |
yield create_event("message_delta", {
|
|
|
195 |
return Response(generate(), content_type='text/event-stream')
|
196 |
|
197 |
except Exception as e:
|
198 |
+
logging.error(f"Request error: {str(e)}")
|
199 |
log_request(request, 400)
|
200 |
return jsonify({"error": str(e)}), 400
|
201 |
|
|
|
206 |
|
207 |
@app.errorhandler(500)
|
208 |
def server_error(error):
|
209 |
+
logging.error(f"Server error: {str(error)}")
|
210 |
log_request(request, 500)
|
211 |
return "Something broke!", 500
|
212 |
|
|
|
217 |
|
218 |
if __name__ == '__main__':
|
219 |
port = int(os.environ.get('PORT', 8081))
|
220 |
+
logging.info(f"Perplexity proxy listening on port {port}")
|
221 |
if not API_KEY:
|
222 |
+
logging.warning("Warning: PPLX_KEY environment variable is not set. API key validation will fail.")
|
223 |
app.run(host='0.0.0.0', port=port)
|