Update app.py
Browse files
app.py
CHANGED
@@ -6,9 +6,9 @@ from flask import Flask, request, Response, jsonify
|
|
6 |
import socketio
|
7 |
import requests
|
8 |
import logging
|
|
|
9 |
from threading import Event
|
10 |
import re
|
11 |
-
import traceback # 用于捕获详细的堆栈信息
|
12 |
|
13 |
app = Flask(__name__)
|
14 |
logging.basicConfig(level=logging.INFO)
|
@@ -49,12 +49,15 @@ sio_opts = {
|
|
49 |
}
|
50 |
}
|
51 |
|
52 |
-
def log_request(ip, route, status):
|
53 |
"""
|
54 |
-
记录请求的关键信息:IP
|
55 |
"""
|
56 |
timestamp = datetime.now().isoformat()
|
57 |
-
|
|
|
|
|
|
|
58 |
|
59 |
def validate_api_key():
|
60 |
api_key = request.headers.get('x-api-key')
|
@@ -124,13 +127,11 @@ def messages():
|
|
124 |
return auth_error
|
125 |
|
126 |
try:
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
request_size = len(json.dumps(json_body))
|
131 |
-
if request_size > 1 * 1024 * 1024: # 超过 1MB 的请求大小
|
132 |
-
logging.warning(f"Request size is too large: {request_size / 1024:.2f} KB")
|
133 |
|
|
|
134 |
model = json_body.get('model', 'claude-3-opus-20240229') # 动态获取模型,默认 claude-3-opus-20240229
|
135 |
stream = json_body.get('stream', True) # 默认为True
|
136 |
|
@@ -148,9 +149,6 @@ def messages():
|
|
148 |
# 处理 stream 为 false 的情况
|
149 |
return handle_non_stream(previous_messages, msg_id, model, input_tokens)
|
150 |
|
151 |
-
# 记录请求的关键信息:IP地址、路由、状态码
|
152 |
-
log_request(request.remote_addr, request.path, 200)
|
153 |
-
|
154 |
def generate():
|
155 |
yield create_event("message_start", {
|
156 |
"type": "message_start",
|
@@ -230,9 +228,7 @@ def messages():
|
|
230 |
})
|
231 |
|
232 |
except Exception as e:
|
233 |
-
# 捕获并记录详细的堆栈信息
|
234 |
logging.error(f"Error during WebSocket communication: {str(e)}")
|
235 |
-
logging.error(traceback.format_exc()) # 输出堆栈信息
|
236 |
yield create_event("content_block_delta", {
|
237 |
"type": "content_block_delta",
|
238 |
"index": 0,
|
@@ -256,9 +252,9 @@ def messages():
|
|
256 |
return Response(generate(), content_type='text/event-stream')
|
257 |
|
258 |
except Exception as e:
|
259 |
-
#
|
260 |
logging.error(f"Request error: {str(e)}")
|
261 |
-
logging.error(traceback.format_exc()) #
|
262 |
log_request(request.remote_addr, request.path, 400)
|
263 |
return jsonify({"error": str(e)}), 400
|
264 |
|
@@ -339,10 +335,11 @@ def handle_non_stream(previous_messages, msg_id, model, input_tokens):
|
|
339 |
return Response(json.dumps(full_response, ensure_ascii=False), content_type='application/json')
|
340 |
|
341 |
except Exception as e:
|
342 |
-
#
|
343 |
logging.error(f"Request error: {str(e)}")
|
344 |
-
logging.error(traceback.format_exc()) #
|
345 |
return jsonify({"error": str(e)}), 500
|
|
|
346 |
finally:
|
347 |
if sio.connected:
|
348 |
sio.disconnect()
|
@@ -355,6 +352,8 @@ def not_found(error):
|
|
355 |
@app.errorhandler(500)
|
356 |
def server_error(error):
|
357 |
logging.error(f"Server error: {str(error)}")
|
|
|
|
|
358 |
log_request(request.remote_addr, request.path, 500)
|
359 |
return "Something broke!", 500
|
360 |
|
|
|
6 |
import socketio
|
7 |
import requests
|
8 |
import logging
|
9 |
+
import traceback
|
10 |
from threading import Event
|
11 |
import re
|
|
|
12 |
|
13 |
app = Flask(__name__)
|
14 |
logging.basicConfig(level=logging.INFO)
|
|
|
49 |
}
|
50 |
}
|
51 |
|
52 |
+
def log_request(ip, route, status, data_size=None):
|
53 |
"""
|
54 |
+
记录请求的关键信息:IP地址、路由、状态码,以及请求数据大小(如果提供)。
|
55 |
"""
|
56 |
timestamp = datetime.now().isoformat()
|
57 |
+
log_message = f"{timestamp} - {ip} - {route} - {status}"
|
58 |
+
if data_size is not None:
|
59 |
+
log_message += f" - Data size: {data_size} bytes"
|
60 |
+
logging.info(log_message)
|
61 |
|
62 |
def validate_api_key():
|
63 |
api_key = request.headers.get('x-api-key')
|
|
|
127 |
return auth_error
|
128 |
|
129 |
try:
|
130 |
+
# 记录请求数据大小
|
131 |
+
data_size = len(request.data)
|
132 |
+
log_request(request.remote_addr, request.path, 200, data_size)
|
|
|
|
|
|
|
133 |
|
134 |
+
json_body = request.json
|
135 |
model = json_body.get('model', 'claude-3-opus-20240229') # 动态获取模型,默认 claude-3-opus-20240229
|
136 |
stream = json_body.get('stream', True) # 默认为True
|
137 |
|
|
|
149 |
# 处理 stream 为 false 的情况
|
150 |
return handle_non_stream(previous_messages, msg_id, model, input_tokens)
|
151 |
|
|
|
|
|
|
|
152 |
def generate():
|
153 |
yield create_event("message_start", {
|
154 |
"type": "message_start",
|
|
|
228 |
})
|
229 |
|
230 |
except Exception as e:
|
|
|
231 |
logging.error(f"Error during WebSocket communication: {str(e)}")
|
|
|
232 |
yield create_event("content_block_delta", {
|
233 |
"type": "content_block_delta",
|
234 |
"index": 0,
|
|
|
252 |
return Response(generate(), content_type='text/event-stream')
|
253 |
|
254 |
except Exception as e:
|
255 |
+
# 记录详细的错误堆栈信息
|
256 |
logging.error(f"Request error: {str(e)}")
|
257 |
+
logging.error(traceback.format_exc()) # 记录堆栈信息
|
258 |
log_request(request.remote_addr, request.path, 400)
|
259 |
return jsonify({"error": str(e)}), 400
|
260 |
|
|
|
335 |
return Response(json.dumps(full_response, ensure_ascii=False), content_type='application/json')
|
336 |
|
337 |
except Exception as e:
|
338 |
+
# 记录详细的错误堆栈信息
|
339 |
logging.error(f"Request error: {str(e)}")
|
340 |
+
logging.error(traceback.format_exc()) # 记录堆栈信息
|
341 |
return jsonify({"error": str(e)}), 500
|
342 |
+
|
343 |
finally:
|
344 |
if sio.connected:
|
345 |
sio.disconnect()
|
|
|
352 |
@app.errorhandler(500)
|
353 |
def server_error(error):
|
354 |
logging.error(f"Server error: {str(error)}")
|
355 |
+
# 记录详细的错误堆栈信息
|
356 |
+
logging.error(traceback.format_exc()) # 记录堆栈信息
|
357 |
log_request(request.remote_addr, request.path, 500)
|
358 |
return "Something broke!", 500
|
359 |
|