HouYunFei commited on
Commit ·
fdca7c2
1
Parent(s): 594a796
feat(image): 新增Codex链路生图支持2k/4k分辨率
Browse files- 新增Codex链路生图功能,支持2k和4k分辨率
- 支持RT刷新账号信息
- 简化了Codex图像响应处理逻辑,移除流式处理相关代码
- 直接获取图像结果并返回,提高图像生成效率
- 移除原有的事件类型统计和上游错误处理代码
- 更新版本号至1.2.2并更新变更日志
- CHANGELOG.md +5 -0
- VERSION +1 -1
- 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.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 |
-
|
| 675 |
-
|
| 676 |
-
|
| 677 |
-
|
| 678 |
-
|
| 679 |
-
|
| 680 |
-
|
| 681 |
-
|
| 682 |
-
|
| 683 |
-
|
| 684 |
-
|
| 685 |
-
|
| 686 |
-
|
| 687 |
-
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 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 |
|