HouYunFei commited on
Commit
fdca7c2
·
1 Parent(s): 594a796

feat(image): 新增Codex链路生图支持2k/4k分辨率

Browse files

- 新增Codex链路生图功能,支持2k和4k分辨率
- 支持RT刷新账号信息
- 简化了Codex图像响应处理逻辑,移除流式处理相关代码
- 直接获取图像结果并返回,提高图像生成效率
- 移除原有的事件类型统计和上游错误处理代码
- 更新版本号至1.2.2并更新变更日志

Files changed (3) hide show
  1. CHANGELOG.md +5 -0
  2. VERSION +1 -1
  3. services/protocol/conversation.py +17 -100
CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
 
3
  ## Unreleased
4
 
 
 
 
 
 
5
  ## 1.2.0 - 2026-05-28
6
 
7
  + [新增] 当前版本基线,包含 Web 面板、画图、号池管理、注册机、图片管理、日志管理和设置能力。
 
2
 
3
  ## Unreleased
4
 
5
+ ## 1.2.2 - 2026-05-29
6
+
7
+ + [新增] 新增Codex链路生图、支持2k,4k。
8
+ + [新增] 支持RT刷新账号信息。
9
+
10
  ## 1.2.0 - 2026-05-28
11
 
12
  + [新增] 当前版本基线,包含 Web 面板、画图、号池管理、注册机、图片管理、日志管理和设置能力。
VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
 
1
+ 1.2.2
services/protocol/conversation.py CHANGED
@@ -651,113 +651,30 @@ def _codex_response_images(value: Any) -> list[str]:
651
  return []
652
 
653
 
654
- def _codex_response_error(value: Any) -> tuple[str, str]:
655
- if not isinstance(value, dict):
656
- return "", ""
657
- error = value.get("error")
658
- if not isinstance(error, dict):
659
- response = value.get("response")
660
- error = response.get("error") if isinstance(response, dict) and response.get("status") == "failed" else None
661
- if not isinstance(error, dict):
662
- return "", ""
663
- message = str(error.get("message") or "").strip()
664
- code = str(error.get("code") or error.get("type") or "server_error").strip()
665
- return message or "Codex responses failed upstream.", code
666
-
667
-
668
  def stream_codex_image_outputs(
669
  backend: OpenAIBackendAPI,
670
  request: ConversationRequest,
671
  index: int = 1,
672
  total: int = 1,
673
  ) -> Iterator[ImageOutput]:
674
- text_parts: list[str] = []
675
- event_count = 0
676
- event_types: dict[str, int] = {}
677
- for event in backend.iter_codex_image_response_events(
678
- prompt=request.prompt,
679
- images=request.images or [],
680
- size=request.size,
681
- quality=request.quality,
682
- ):
683
- event_type = str(event.get("type") or "")
684
- event_count += 1
685
- event_types[event_type or "<missing>"] = event_types.get(event_type or "<missing>", 0) + 1
686
- upstream_error, upstream_code = _codex_response_error(event)
687
- if upstream_error:
688
- logger.warning({
689
- "event": "codex_response_upstream_error",
690
- "model": request.model,
691
- "size": request.size,
692
- "quality": request.quality,
693
- "event_count": event_count,
694
- "event_types": event_types,
695
- "upstream_code": upstream_code,
696
- "upstream_error": upstream_error,
697
- })
698
- raise ImageGenerationError(
699
- upstream_error,
700
- status_code=502,
701
- error_type="server_error",
702
- code=upstream_code or "server_error",
703
- )
704
- if event_type == "response.output_text.delta":
705
- delta = str(event.get("delta") or "")
706
- if delta:
707
- text_parts.append(delta)
708
- yield ImageOutput(
709
- kind="progress",
710
- model=request.model,
711
- index=index,
712
- total=total,
713
- text=delta,
714
- upstream_event_type=event_type,
715
- )
716
- continue
717
- images = _codex_response_images(event)
718
- if images:
719
- logger.info({
720
- "event": "codex_response_image_result_found",
721
- "model": request.model,
722
- "size": request.size,
723
- "quality": request.quality,
724
- "event_count": event_count,
725
- "event_types": event_types,
726
- "image_count": len(images),
727
- "image_result_lengths": [len(item) for item in images[:10]],
728
- })
729
- data = format_image_result(
730
- [{"b64_json": item, "revised_prompt": request.prompt} for item in images],
731
- request.prompt,
732
- request.response_format,
733
- request.base_url,
734
- int(time.time()),
735
- )["data"]
736
- if data:
737
- yield ImageOutput(kind="result", model=request.model, index=index, total=total, data=data)
738
- return
739
- if event_type:
740
- yield ImageOutput(
741
- kind="progress",
742
- model=request.model,
743
- index=index,
744
- total=total,
745
- upstream_event_type=event_type,
746
- )
747
- message = "".join(text_parts).strip()
748
- if message:
749
- yield ImageOutput(kind="message", model=request.model, index=index, total=total, text=message)
750
  return
751
- logger.warning({
752
- "event": "codex_response_no_image_result",
753
- "model": request.model,
754
- "size": request.size,
755
- "quality": request.quality,
756
- "image_input_count": len(request.images or []),
757
- "event_count": event_count,
758
- "event_types": event_types,
759
- "output_text_len": len("".join(text_parts)),
760
- })
761
  raise ImageGenerationError("No image result found in response")
762
 
763
 
 
651
  return []
652
 
653
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
654
  def stream_codex_image_outputs(
655
  backend: OpenAIBackendAPI,
656
  request: ConversationRequest,
657
  index: int = 1,
658
  total: int = 1,
659
  ) -> Iterator[ImageOutput]:
660
+ images = _codex_response_images(list(backend.iter_codex_image_response_events(
661
+ prompt=request.prompt,
662
+ images=request.images or [],
663
+ size=request.size,
664
+ quality=request.quality,
665
+ )))
666
+ if not images:
667
+ raise ImageGenerationError("No image result found in response")
668
+ data = format_image_result(
669
+ [{"b64_json": item, "revised_prompt": request.prompt} for item in images],
670
+ request.prompt,
671
+ request.response_format,
672
+ request.base_url,
673
+ int(time.time()),
674
+ )["data"]
675
+ if data:
676
+ yield ImageOutput(kind="result", model=request.model, index=index, total=total, data=data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
677
  return
 
 
 
 
 
 
 
 
 
 
678
  raise ImageGenerationError("No image result found in response")
679
 
680