Update app.py
Browse files
app.py
CHANGED
@@ -215,6 +215,22 @@ def list_models():
|
|
215 |
"owned_by": "openai",
|
216 |
"root": "deepseek-reasoner",
|
217 |
"parent": None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
218 |
}
|
219 |
]
|
220 |
|
@@ -312,8 +328,14 @@ def handsome_chat_completions():
|
|
312 |
return jsonify({"error": "Invalid request data"}), 400
|
313 |
|
314 |
model_name = data['model']
|
|
|
|
|
|
|
|
|
|
|
|
|
315 |
|
316 |
-
api_key = select_key(
|
317 |
|
318 |
if not api_key:
|
319 |
return jsonify(
|
@@ -326,11 +348,6 @@ def handsome_chat_completions():
|
|
326 |
}
|
327 |
), 429
|
328 |
|
329 |
-
if model_name == "deepseek-reasoner":
|
330 |
-
for param in ["temperature", "top_p", "presence_penalty", "frequency_penalty", "logprobs", "top_logprobs"]:
|
331 |
-
if param in data:
|
332 |
-
del data[param]
|
333 |
-
|
334 |
headers = {
|
335 |
"Authorization": f"Bearer {api_key}",
|
336 |
"Content-Type": "application/json"
|
@@ -343,7 +360,7 @@ def handsome_chat_completions():
|
|
343 |
headers=headers,
|
344 |
json=data,
|
345 |
stream=data.get("stream", False),
|
346 |
-
timeout=
|
347 |
)
|
348 |
|
349 |
if response.status_code == 429:
|
@@ -364,8 +381,6 @@ def handsome_chat_completions():
|
|
364 |
full_response_content += chunk.decode("utf-8")
|
365 |
|
366 |
for line in chunk.decode("utf-8").splitlines():
|
367 |
-
# print(line)
|
368 |
-
|
369 |
if line.startswith("data:"):
|
370 |
try:
|
371 |
chunk_json = json.loads(line.lstrip("data: ").strip())
|
@@ -382,8 +397,6 @@ def handsome_chat_completions():
|
|
382 |
|
383 |
if delta.get("content") is not None:
|
384 |
if not first_reasoning_chunk:
|
385 |
-
# yield f"data: {json.dumps({'choices': [{'delta': {'content': '\n```\n'}, 'index': 0}]})}\n\n"
|
386 |
-
# yield f"data: {json.dumps({'choices': [{'delta': {'content': '\n\n---\n\n### 结果输出\n'}, 'index': 0}]})}\n\n"
|
387 |
yield f"data: {json.dumps({'choices': [{'delta': {'content': '\n\n'}, 'index': 0}]})}\n\n"
|
388 |
first_reasoning_chunk = True
|
389 |
yield f"data: {json.dumps({'choices': [{'delta': {'content': delta["content"]}, 'index': 0}]})}\n\n"
|
@@ -493,7 +506,7 @@ def handsome_chat_completions():
|
|
493 |
completion_tokens = response_json["usage"]["completion_tokens"]
|
494 |
response_content = ""
|
495 |
|
496 |
-
if model_name == "deepseek-reasoner" and "choices" in response_json and len(response_json["choices"]) > 0:
|
497 |
choice = response_json["choices"][0]
|
498 |
if "message" in choice:
|
499 |
if "reasoning_content" in choice["message"]:
|
@@ -507,6 +520,19 @@ def handsome_chat_completions():
|
|
507 |
elif "choices" in response_json and len(response_json["choices"]) > 0:
|
508 |
response_content = response_json["choices"][0]["message"]["content"]
|
509 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
510 |
except (KeyError, ValueError, IndexError) as e:
|
511 |
logging.error(
|
512 |
f"解析非流式响应 JSON 失败: {e}, "
|
|
|
215 |
"owned_by": "openai",
|
216 |
"root": "deepseek-reasoner",
|
217 |
"parent": None
|
218 |
+
},
|
219 |
+
{
|
220 |
+
"id": "deepseek-reasoner-thinking",
|
221 |
+
"object": "model",
|
222 |
+
"created": 1678888889,
|
223 |
+
"owned_by": "openai",
|
224 |
+
"root": "deepseek-reasoner",
|
225 |
+
"parent": None
|
226 |
+
},
|
227 |
+
{
|
228 |
+
"id": "deepseek-reasoner-openwebui",
|
229 |
+
"object": "model",
|
230 |
+
"created": 1678888889,
|
231 |
+
"owned_by": "openai",
|
232 |
+
"root": "deepseek-reasoner",
|
233 |
+
"parent": None
|
234 |
}
|
235 |
]
|
236 |
|
|
|
328 |
return jsonify({"error": "Invalid request data"}), 400
|
329 |
|
330 |
model_name = data['model']
|
331 |
+
if model_name == "deepseek-reasoner-thinking" or model_name == "deepseek-reasoner-openwebui":
|
332 |
+
model_realname = "deepseek-reasoner"
|
333 |
+
else:
|
334 |
+
model_realname = model_name
|
335 |
+
|
336 |
+
data['model'] = model_realname
|
337 |
|
338 |
+
api_key = select_key(model_realname)
|
339 |
|
340 |
if not api_key:
|
341 |
return jsonify(
|
|
|
348 |
}
|
349 |
), 429
|
350 |
|
|
|
|
|
|
|
|
|
|
|
351 |
headers = {
|
352 |
"Authorization": f"Bearer {api_key}",
|
353 |
"Content-Type": "application/json"
|
|
|
360 |
headers=headers,
|
361 |
json=data,
|
362 |
stream=data.get("stream", False),
|
363 |
+
timeout=120
|
364 |
)
|
365 |
|
366 |
if response.status_code == 429:
|
|
|
381 |
full_response_content += chunk.decode("utf-8")
|
382 |
|
383 |
for line in chunk.decode("utf-8").splitlines():
|
|
|
|
|
384 |
if line.startswith("data:"):
|
385 |
try:
|
386 |
chunk_json = json.loads(line.lstrip("data: ").strip())
|
|
|
397 |
|
398 |
if delta.get("content") is not None:
|
399 |
if not first_reasoning_chunk:
|
|
|
|
|
400 |
yield f"data: {json.dumps({'choices': [{'delta': {'content': '\n\n'}, 'index': 0}]})}\n\n"
|
401 |
first_reasoning_chunk = True
|
402 |
yield f"data: {json.dumps({'choices': [{'delta': {'content': delta["content"]}, 'index': 0}]})}\n\n"
|
|
|
506 |
completion_tokens = response_json["usage"]["completion_tokens"]
|
507 |
response_content = ""
|
508 |
|
509 |
+
if model_name == "deepseek-reasoner-thingking" and "choices" in response_json and len(response_json["choices"]) > 0:
|
510 |
choice = response_json["choices"][0]
|
511 |
if "message" in choice:
|
512 |
if "reasoning_content" in choice["message"]:
|
|
|
520 |
elif "choices" in response_json and len(response_json["choices"]) > 0:
|
521 |
response_content = response_json["choices"][0]["message"]["content"]
|
522 |
|
523 |
+
if model_name == "deepseek-reasoner-openwebui" and "choices" in response_json and len(response_json["choices"]) > 0:
|
524 |
+
choice = response_json["choices"][0]
|
525 |
+
if "message" in choice:
|
526 |
+
if "reasoning_content" in choice["message"]:
|
527 |
+
response_content += f"<think>\n"
|
528 |
+
reasoning_content = choice["message"]["reasoning_content"]
|
529 |
+
formatted_reasoning = f"\n<\think>\n"
|
530 |
+
response_content += formatted_reasoning
|
531 |
+
if "content" in choice["message"]:
|
532 |
+
response_content += choice["message"]["content"]
|
533 |
+
elif "choices" in response_json and len(response_json["choices"]) > 0:
|
534 |
+
response_content = response_json["choices"][0]["message"]["content"]
|
535 |
+
|
536 |
except (KeyError, ValueError, IndexError) as e:
|
537 |
logging.error(
|
538 |
f"解析非流式响应 JSON 失败: {e}, "
|