87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
# Test script: directly call https://chatgpt.com/backend-api/codex/responses to generate one 2K image.
|
|
# Only edit ACCESS_TOKEN, then run: python codex_responses_image_test.py
|
|
# Fixed request parameters:
|
|
# prompt: A highly detailed square 2K image of a quiet futuristic library at sunrise
|
|
# responses model: gpt-5.5
|
|
# image model: gpt-image-2
|
|
# size: 2048x2048
|
|
# quality: auto
|
|
# output_format: png
|
|
# output file: codex_4k.png
|
|
|
|
import base64
|
|
import json
|
|
import time
|
|
import urllib.request
|
|
|
|
ACCESS_TOKEN = ""
|
|
|
|
|
|
def parse_events(raw):
|
|
ctype, text = raw.headers.get("content-type", ""), raw.read().decode("utf-8", "replace")
|
|
if "application/json" in ctype:
|
|
return [json.loads(text)]
|
|
events, lines = [], []
|
|
for line in text.splitlines() + [""]:
|
|
if not line:
|
|
if lines:
|
|
data = "\n".join(lines).strip()
|
|
if data and data != "[DONE]":
|
|
events.append(json.loads(data))
|
|
lines = []
|
|
elif line.startswith("data:"):
|
|
lines.append(line[5:].lstrip())
|
|
return events
|
|
|
|
|
|
def find_images(value):
|
|
if isinstance(value, dict):
|
|
if value.get("type") == "image_generation_call" and isinstance(value.get("result"), str):
|
|
result = value["result"].strip()
|
|
return [result.split(",", 1)[1] if result.startswith("data:image/") else result]
|
|
return [image for item in value.values() for image in find_images(item)]
|
|
if isinstance(value, list):
|
|
return [image for item in value for image in find_images(item)]
|
|
return []
|
|
|
|
|
|
def main():
|
|
start_time = time.time()
|
|
body = {
|
|
"model": "gpt-5.5",
|
|
"instructions": "Use the image_generation tool to create exactly one image for the user's request. Return the generated image result.",
|
|
"store": False,
|
|
"input": [{"role": "user", "content": [{"type": "input_text", "text": "A highly detailed square 2K image of a quiet futuristic library at sunrise"}]}],
|
|
"tools": [{
|
|
"type": "image_generation",
|
|
"model": "gpt-image-2",
|
|
"action": "generate",
|
|
"size": "3840x2160",
|
|
"quality": "auto",
|
|
"output_format": "png"
|
|
}],
|
|
"tool_choice": {"type": "image_generation"},
|
|
"stream": True
|
|
}
|
|
headers = {"Authorization": f"Bearer {ACCESS_TOKEN}", "Content-Type": "application/json"}
|
|
|
|
req = urllib.request.Request("https://chatgpt.com/backend-api/codex/responses", json.dumps(body).encode(), headers, method="POST")
|
|
try:
|
|
images = find_images(parse_events(urllib.request.urlopen(req, timeout=1200)))
|
|
except urllib.error.HTTPError as error:
|
|
raise SystemExit(f"HTTP {error.code}: {error.read().decode('utf-8', 'replace')[:1000]}")
|
|
|
|
if not images:
|
|
raise SystemExit("No image result found in response")
|
|
|
|
with open("codex_4k.png", "wb") as file:
|
|
file.write(base64.b64decode(images[0]))
|
|
print("saved codex_4k.png")
|
|
end_time = time.time()
|
|
print(f"total time: {end_time - start_time:.2f} seconds")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|