Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -228,60 +228,16 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
|
|
228 |
|
229 |
if line.startswith(b'data: '):
|
230 |
try:
|
231 |
-
|
232 |
-
|
233 |
-
if
|
234 |
-
|
235 |
-
|
236 |
-
if
|
237 |
-
|
238 |
-
content = data.get('data', {}).get('content', '')
|
239 |
-
if content:
|
240 |
-
full_response += content
|
241 |
-
|
242 |
-
# 生成OpenAI格式的流式响应
|
243 |
-
chunk = {
|
244 |
-
"id": f"chatcmpl-{request_id}",
|
245 |
-
"object": "chat.completion.chunk",
|
246 |
-
"created": timestamp,
|
247 |
-
"model": model,
|
248 |
-
"choices": [
|
249 |
-
{
|
250 |
-
"index": 0,
|
251 |
-
"delta": {
|
252 |
-
"content": content
|
253 |
-
},
|
254 |
-
"finish_reason": None
|
255 |
-
}
|
256 |
-
]
|
257 |
-
}
|
258 |
-
yield f"data: {json.dumps(chunk)}\n\n"
|
259 |
-
|
260 |
-
elif data.get('code') == 203:
|
261 |
-
# 生成完成信号
|
262 |
-
chunk = {
|
263 |
-
"id": f"chatcmpl-{request_id}",
|
264 |
-
"object": "chat.completion.chunk",
|
265 |
-
"created": timestamp,
|
266 |
-
"model": model,
|
267 |
-
"choices": [
|
268 |
-
{
|
269 |
-
"index": 0,
|
270 |
-
"delta": {},
|
271 |
-
"finish_reason": "stop"
|
272 |
-
}
|
273 |
-
]
|
274 |
-
}
|
275 |
-
yield f"data: {json.dumps(chunk)}\n\n"
|
276 |
-
yield "data: [DONE]\n\n"
|
277 |
-
|
278 |
-
# 添加对错误代码的处理
|
279 |
-
elif data.get('code') != 0:
|
280 |
-
error_msg = data.get('message', 'Unknown error')
|
281 |
-
logger.error(f"API返回错误: {error_msg}")
|
282 |
|
283 |
-
#
|
284 |
-
|
285 |
"id": f"chatcmpl-{request_id}",
|
286 |
"object": "chat.completion.chunk",
|
287 |
"created": timestamp,
|
@@ -290,41 +246,34 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
|
|
290 |
{
|
291 |
"index": 0,
|
292 |
"delta": {
|
293 |
-
"content":
|
294 |
},
|
295 |
-
"finish_reason":
|
296 |
}
|
297 |
]
|
298 |
}
|
299 |
-
yield f"data: {json.dumps(
|
300 |
-
yield "data: [DONE]\n\n"
|
301 |
-
|
302 |
-
except json.JSONDecodeError as e:
|
303 |
-
logger.warning(f"无法解析响应: {line} - 错误: {str(e)}")
|
304 |
-
except Exception as e:
|
305 |
-
logger.warning(f"处理数据时出错: {str(e)} - 数据: {line}")
|
306 |
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
}
|
322 |
-
"
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
yield "data: [DONE]\n\n"
|
328 |
|
329 |
except Exception as e:
|
330 |
logger.error(f"流式响应处理出错: {str(e)}")
|
@@ -357,16 +306,7 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
|
|
357 |
# 路由定义
|
358 |
@app.get("/")
|
359 |
async def root():
|
360 |
-
"""
|
361 |
-
return {
|
362 |
-
"message": "OpenAI API Proxy服务已启动 连接至DeepSider API",
|
363 |
-
"usage": {
|
364 |
-
"模型列表": "GET /v1/models",
|
365 |
-
"聊天完成": "POST /v1/chat/completions",
|
366 |
-
"账户余额": "GET /admin/balance (需要X-Admin-Key头)"
|
367 |
-
},
|
368 |
-
"说明": "请在Authorization头中使用Bearer token格式,支持使用英文逗号分隔多个token实现轮询"
|
369 |
-
}
|
370 |
|
371 |
@app.get("/v1/models")
|
372 |
async def list_models(api_key: str = Depends(verify_api_key)):
|
@@ -419,9 +359,6 @@ async def create_chat_completion(
|
|
419 |
current_token_index = (TOKEN_INDEX - 1) % len(tokens) if len(tokens) > 0 else 0
|
420 |
|
421 |
try:
|
422 |
-
# 记录请求信息
|
423 |
-
logger.info(f"发送请求到DeepSider API - 模型: {deepsider_model}, Token索引: {current_token_index}")
|
424 |
-
|
425 |
# 发送请求到DeepSider API
|
426 |
response = requests.post(
|
427 |
f"{DEEPSIDER_API_BASE}/chat/conversation",
|
@@ -452,39 +389,21 @@ async def create_chat_completion(
|
|
452 |
else:
|
453 |
# 收集完整响应
|
454 |
full_response = ""
|
455 |
-
has_error = False
|
456 |
-
error_message = ""
|
457 |
-
|
458 |
for line in response.iter_lines():
|
459 |
if not line:
|
460 |
continue
|
461 |
|
462 |
if line.startswith(b'data: '):
|
463 |
try:
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
if
|
469 |
-
|
470 |
-
if content:
|
471 |
-
full_response += content
|
472 |
-
elif data.get('code') != 0 and data.get('code') != 203:
|
473 |
-
has_error = True
|
474 |
-
error_message = data.get('message', 'Unknown error')
|
475 |
-
logger.error(f"API返回错误: {error_message}")
|
476 |
|
477 |
-
except json.JSONDecodeError
|
478 |
-
|
479 |
-
except Exception as e:
|
480 |
-
logger.warning(f"处理数据时出错: {str(e)} - 数据: {line}")
|
481 |
-
|
482 |
-
# 检查是否没有收到任何内容
|
483 |
-
if not full_response and not has_error:
|
484 |
-
logger.warning("未收到任何响应内容")
|
485 |
-
full_response = "[未收到API响应。请检查您的token是否有效或是否有足够的配额。]"
|
486 |
-
elif has_error:
|
487 |
-
full_response = f"[API返回错误: {error_message}]"
|
488 |
|
489 |
# 返回OpenAI格式的完整响应
|
490 |
return await generate_openai_response(full_response, request_id, chat_request.model)
|
@@ -540,17 +459,7 @@ async def not_found_handler(request, exc):
|
|
540 |
"type": "not_found_error",
|
541 |
"code": "not_found"
|
542 |
}
|
543 |
-
}
|
544 |
-
|
545 |
-
@app.exception_handler(500)
|
546 |
-
async def server_error_handler(request, exc):
|
547 |
-
return {
|
548 |
-
"error": {
|
549 |
-
"message": f"服务器内部错误: {str(exc)}",
|
550 |
-
"type": "server_error",
|
551 |
-
"code": "internal_server_error"
|
552 |
-
}
|
553 |
-
}
|
554 |
|
555 |
# 启动事件
|
556 |
@app.on_event("startup")
|
@@ -558,9 +467,6 @@ async def startup_event():
|
|
558 |
"""服务启动时初始化"""
|
559 |
logger.info(f"OpenAI API代理服务已启动,可以接受请求")
|
560 |
logger.info(f"支持多token轮询,请在Authorization头中使用英文逗号分隔多个token")
|
561 |
-
logger.info(f"服务地址: http://127.0.0.1:7860")
|
562 |
-
logger.info(f"OpenAI API格式请求示例: POST http://127.0.0.1:7860/v1/chat/completions")
|
563 |
-
logger.info(f"可用模型查询: GET http://127.0.0.1:7860/v1/models")
|
564 |
|
565 |
# 主程序
|
566 |
if __name__ == "__main__":
|
|
|
228 |
|
229 |
if line.startswith(b'data: '):
|
230 |
try:
|
231 |
+
data = json.loads(line[6:].decode('utf-8'))
|
232 |
+
|
233 |
+
if data.get('code') == 202 and data.get('data', {}).get('type') == "chat":
|
234 |
+
# 获取正文内容
|
235 |
+
content = data.get('data', {}).get('content', '')
|
236 |
+
if content:
|
237 |
+
full_response += content
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
238 |
|
239 |
+
# 生成OpenAI格式的流式响应
|
240 |
+
chunk = {
|
241 |
"id": f"chatcmpl-{request_id}",
|
242 |
"object": "chat.completion.chunk",
|
243 |
"created": timestamp,
|
|
|
246 |
{
|
247 |
"index": 0,
|
248 |
"delta": {
|
249 |
+
"content": content
|
250 |
},
|
251 |
+
"finish_reason": None
|
252 |
}
|
253 |
]
|
254 |
}
|
255 |
+
yield f"data: {json.dumps(chunk)}\n\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
256 |
|
257 |
+
elif data.get('code') == 203:
|
258 |
+
# 生成完成信号
|
259 |
+
chunk = {
|
260 |
+
"id": f"chatcmpl-{request_id}",
|
261 |
+
"object": "chat.completion.chunk",
|
262 |
+
"created": timestamp,
|
263 |
+
"model": model,
|
264 |
+
"choices": [
|
265 |
+
{
|
266 |
+
"index": 0,
|
267 |
+
"delta": {},
|
268 |
+
"finish_reason": "stop"
|
269 |
+
}
|
270 |
+
]
|
271 |
+
}
|
272 |
+
yield f"data: {json.dumps(chunk)}\n\n"
|
273 |
+
yield "data: [DONE]\n\n"
|
274 |
+
|
275 |
+
except json.JSONDecodeError:
|
276 |
+
logger.warning(f"无法解析响应: {line}")
|
|
|
277 |
|
278 |
except Exception as e:
|
279 |
logger.error(f"流式响应处理出错: {str(e)}")
|
|
|
306 |
# 路由定义
|
307 |
@app.get("/")
|
308 |
async def root():
|
309 |
+
return {"message": "OpenAI API Proxy服务已启动 连接至DeepSider API"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
310 |
|
311 |
@app.get("/v1/models")
|
312 |
async def list_models(api_key: str = Depends(verify_api_key)):
|
|
|
359 |
current_token_index = (TOKEN_INDEX - 1) % len(tokens) if len(tokens) > 0 else 0
|
360 |
|
361 |
try:
|
|
|
|
|
|
|
362 |
# 发送请求到DeepSider API
|
363 |
response = requests.post(
|
364 |
f"{DEEPSIDER_API_BASE}/chat/conversation",
|
|
|
389 |
else:
|
390 |
# 收集完整响应
|
391 |
full_response = ""
|
|
|
|
|
|
|
392 |
for line in response.iter_lines():
|
393 |
if not line:
|
394 |
continue
|
395 |
|
396 |
if line.startswith(b'data: '):
|
397 |
try:
|
398 |
+
data = json.loads(line[6:].decode('utf-8'))
|
399 |
+
|
400 |
+
if data.get('code') == 202 and data.get('data', {}).get('type') == "chat":
|
401 |
+
content = data.get('data', {}).get('content', '')
|
402 |
+
if content:
|
403 |
+
full_response += content
|
|
|
|
|
|
|
|
|
|
|
|
|
404 |
|
405 |
+
except json.JSONDecodeError:
|
406 |
+
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
407 |
|
408 |
# 返回OpenAI格式的完整响应
|
409 |
return await generate_openai_response(full_response, request_id, chat_request.model)
|
|
|
459 |
"type": "not_found_error",
|
460 |
"code": "not_found"
|
461 |
}
|
462 |
+
}, 404
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
463 |
|
464 |
# 启动事件
|
465 |
@app.on_event("startup")
|
|
|
467 |
"""服务启动时初始化"""
|
468 |
logger.info(f"OpenAI API代理服务已启动,可以接受请求")
|
469 |
logger.info(f"支持多token轮询,请在Authorization头中使用英文逗号分隔多个token")
|
|
|
|
|
|
|
470 |
|
471 |
# 主程序
|
472 |
if __name__ == "__main__":
|