OraCatQAQ commited on
Commit
06794c7
·
1 Parent(s): a621ff2

增加多次验证

Browse files
Files changed (1) hide show
  1. app.py +68 -58
app.py CHANGED
@@ -321,7 +321,8 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
321
  full_reasoning = "" # 添加思维链内容累积变量
322
  conversation_id = None # 会话ID
323
  captcha_base64 = None # 验证码图片
324
- captcha_detected_in_stream = False # 新增标志位,仅用于当前流
 
325
 
326
  try:
327
  # 使用iter_content替代iter_lines
@@ -348,13 +349,26 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
348
  content = data.get('data', {}).get('content', '')
349
  reasoning_content = data.get('data', {}).get('reasoning_content', '')
350
 
351
- # 检测是否含有验证码 (仅在非递归调用时检测)
352
- if not is_post_captcha and "验证码提示" in content and "![](data:image" in content:
353
- captcha_detected_in_stream = True # 标记在本流中检测到验证码
 
354
  logger.info("检测到验证码响应")
355
  captcha_base64 = extract_captcha_image(content)
 
 
 
 
 
 
 
 
356
 
357
- # 先向客户端发送原始验证码响应
 
 
 
 
358
  original_captcha_message = {
359
  "id": f"chatcmpl-{request_id}",
360
  "object": "chat.completion.chunk",
@@ -364,7 +378,7 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
364
  {
365
  "index": 0,
366
  "delta": {
367
- "content": content
368
  },
369
  "finish_reason": None
370
  }
@@ -372,7 +386,7 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
372
  }
373
  yield f"data: {json.dumps(original_captcha_message)}\n\n"
374
 
375
- # 然后显示自动识别提示
376
  captcha_message = {
377
  "id": f"chatcmpl-{request_id}",
378
  "object": "chat.completion.chunk",
@@ -389,52 +403,8 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
389
  ]
390
  }
391
  yield f"data: {json.dumps(captcha_message)}\n\n"
392
-
393
- if content:
394
- full_response += content
395
- # 如果在本流中检测到了验证码,则不发送实际内容,直到验证码处理完毕
396
- if not captcha_detected_in_stream:
397
- chunk_content = {
398
- "id": f"chatcmpl-{request_id}",
399
- "object": "chat.completion.chunk",
400
- "created": timestamp,
401
- "model": model,
402
- "choices": [
403
- {
404
- "index": 0,
405
- "delta": {
406
- "content": content
407
- },
408
- "finish_reason": None
409
- }
410
- ]
411
- }
412
- yield f"data: {json.dumps(chunk_content)}\n\n"
413
-
414
- # 处理思维链内容 (始终发送)
415
- if reasoning_content:
416
- full_reasoning += reasoning_content
417
- reasoning_chunk = {
418
- "id": f"chatcmpl-{request_id}",
419
- "object": "chat.completion.chunk",
420
- "created": timestamp,
421
- "model": model,
422
- "choices": [
423
- {
424
- "index": 0,
425
- "delta": {
426
- "reasoning_content": reasoning_content
427
- },
428
- "finish_reason": None
429
- }
430
- ]
431
- }
432
- yield f"data: {json.dumps(reasoning_chunk)}\n\n"
433
 
434
- elif data.get('code') == 203:
435
- # 如果在本流检测到验证码且会话结束,处理验证码
436
- # 确保只在原始流(非递归调用)中处理
437
- if not is_post_captcha and captcha_detected_in_stream and captcha_base64 and conversation_id:
438
  captcha_text = recognize_captcha(captcha_base64)
439
 
440
  if captcha_text:
@@ -537,12 +507,13 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
537
  }
538
  yield f"data: {json.dumps(captcha_submitted_message)}\n\n"
539
 
540
- # 启动递归调用处理成功的响应流
 
541
  async for chunk_after_captcha in stream_openai_response(
542
- captcha_response, request_id, model, api_key, token_index, deepsider_model, is_post_captcha=True
543
  ):
544
  yield chunk_after_captcha
545
- return # 正常结束验证码处理
546
  else:
547
  # 验证码识别失败的处理
548
  error_msg = "\n[验证码识别失败,请重试]"
@@ -564,9 +535,48 @@ async def stream_openai_response(response, request_id: str, model: str, api_key,
564
  yield f"data: {json.dumps(error_chunk)}\n\n"
565
  yield "data: [DONE]\n\n"
566
  return
567
-
568
- # 普通完成信号 (如果没有在本流检测到验证码,或者是在递归调用中)
569
- if not captcha_detected_in_stream or is_post_captcha:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
570
  final_chunk = {
571
  "id": f"chatcmpl-{request_id}",
572
  "object": "chat.completion.chunk",
 
321
  full_reasoning = "" # 添加思维链内容累积变量
322
  conversation_id = None # 会话ID
323
  captcha_base64 = None # 验证码图片
324
+ captcha_detected = False # 验证码检测标志
325
+ captcha_content = "" # 验证码响应内容
326
 
327
  try:
328
  # 使用iter_content替代iter_lines
 
349
  content = data.get('data', {}).get('content', '')
350
  reasoning_content = data.get('data', {}).get('reasoning_content', '')
351
 
352
+ # 检测是否含有验证码
353
+ if "验证码提示" in content and "![](data:image" in content and "系统检测到您当前存在异常" in content:
354
+ captcha_detected = True
355
+ captcha_content = content
356
  logger.info("检测到验证码响应")
357
  captcha_base64 = extract_captcha_image(content)
358
+
359
+ # 累积非验证码响应内容
360
+ if not captcha_detected:
361
+ full_response += content
362
+
363
+ # 处理思维链内容
364
+ if reasoning_content:
365
+ full_reasoning += reasoning_content
366
 
367
+ # 当整个响应结束时处理验证码
368
+ elif data.get('code') == 203:
369
+ # 如果检测到验证码,进行验证码处理
370
+ if captcha_detected and captcha_base64 and conversation_id:
371
+ # 先向客户端发送验证码响应
372
  original_captcha_message = {
373
  "id": f"chatcmpl-{request_id}",
374
  "object": "chat.completion.chunk",
 
378
  {
379
  "index": 0,
380
  "delta": {
381
+ "content": captcha_content
382
  },
383
  "finish_reason": None
384
  }
 
386
  }
387
  yield f"data: {json.dumps(original_captcha_message)}\n\n"
388
 
389
+ # 显示自动识别提示
390
  captcha_message = {
391
  "id": f"chatcmpl-{request_id}",
392
  "object": "chat.completion.chunk",
 
403
  ]
404
  }
405
  yield f"data: {json.dumps(captcha_message)}\n\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
 
407
+ # 识别验证码
 
 
 
408
  captcha_text = recognize_captcha(captcha_base64)
409
 
410
  if captcha_text:
 
507
  }
508
  yield f"data: {json.dumps(captcha_submitted_message)}\n\n"
509
 
510
+ # 处理验证码后的响应(可能还有验证码)
511
+ # 创建一个新的stream_openai_response流,但检测是否还有验证码
512
  async for chunk_after_captcha in stream_openai_response(
513
+ captcha_response, request_id, model, api_key, token_index, deepsider_model
514
  ):
515
  yield chunk_after_captcha
516
+ return
517
  else:
518
  # 验证码识别失败的处理
519
  error_msg = "\n[验证码识别失败,请重试]"
 
535
  yield f"data: {json.dumps(error_chunk)}\n\n"
536
  yield "data: [DONE]\n\n"
537
  return
538
+
539
+ # 非验证码响应,直接流式输出到目前为止收集的内容
540
+ if not captcha_detected:
541
+ # 流式输出响应内容
542
+ if full_response:
543
+ content_chunk = {
544
+ "id": f"chatcmpl-{request_id}",
545
+ "object": "chat.completion.chunk",
546
+ "created": timestamp,
547
+ "model": model,
548
+ "choices": [
549
+ {
550
+ "index": 0,
551
+ "delta": {
552
+ "content": full_response
553
+ },
554
+ "finish_reason": None
555
+ }
556
+ ]
557
+ }
558
+ yield f"data: {json.dumps(content_chunk)}\n\n"
559
+
560
+ # 流式输出思维链内容(如果有)
561
+ if full_reasoning:
562
+ reasoning_chunk = {
563
+ "id": f"chatcmpl-{request_id}",
564
+ "object": "chat.completion.chunk",
565
+ "created": timestamp,
566
+ "model": model,
567
+ "choices": [
568
+ {
569
+ "index": 0,
570
+ "delta": {
571
+ "reasoning_content": full_reasoning
572
+ },
573
+ "finish_reason": None
574
+ }
575
+ ]
576
+ }
577
+ yield f"data: {json.dumps(reasoning_chunk)}\n\n"
578
+
579
+ # 发送完成信号
580
  final_chunk = {
581
  "id": f"chatcmpl-{request_id}",
582
  "object": "chat.completion.chunk",