#!/usr/bin/env python3
import base64
import time
import mimetypes
from pathlib import Path
from openai import OpenAI
client = OpenAI(
base_url="https://your-sub2api-domain.com/v1",
api_key="sk-your-api-key",
)
def to_data_url(path: str) -> str:
mime, _ = mimetypes.guess_type(path)
mime = mime or "image/png"
return f"data:{mime};base64,{base64.b64encode(Path(path).read_bytes()).decode('ascii')}"
# 多份提示词文档
character_doc = Path("character.md").read_text(encoding="utf-8")
style_doc = Path("style_guide.md").read_text(encoding="utf-8")
# 一条 user 消息:多文档 + 指令 + 多参考图
content = [
{"type": "input_text", "text": f"【角色设定】\n{character_doc}"},
{"type": "input_text", "text": f"【风格指南】\n{style_doc}"},
{"type": "input_text", "text": "综合以上文档与参考图,生成一张高分辨率电影分镜图。"},
{"type": "input_image", "image_url": to_data_url("ref1.jpg"), "detail": "high"},
{"type": "input_image", "image_url": to_data_url("ref2.jpg"), "detail": "high"},
]
# 1) 提交 background 任务
response = client.responses.create(
model="gpt-5.5",
background=True,
tools=[{
"type": "image_generation",
"model": "gpt-image-2",
"quality": "high",
"size": "3072x1728",
"output_format": "png",
}],
tool_choice={"type": "image_generation"},
input=[{"role": "user", "content": content}],
)
print("任务已提交:", response.id)
# 2) 轮询(带超时保护)
started = time.time()
TIMEOUT = 600 # 10 分钟
while True:
elapsed = time.time() - started
if elapsed > TIMEOUT:
print("超时,放弃等待")
break
time.sleep(10)
result = client.responses.retrieve(response.id)
print(f"[{elapsed:.0f}s] {result.status}")
if result.status == "completed":
# 3) 保存所有图片
idx = 0
for item in result.output:
if item.type == "image_generation_call":
out = f"storyboard_{idx}.png"
Path(out).write_bytes(base64.b64decode(item.result))
print("已保存", out)
idx += 1
print(f"完成,用时 {elapsed:.0f}s")
break
if result.status in ("failed", "cancelled"):
print("生成未成功:", getattr(result, "error", result.status))
break