feat(image): add gpt-image-2 single and multi-image workflows

This commit is contained in:
zhangheng
2026-05-15 19:30:07 +08:00
commit 1e61d7c806
12 changed files with 1716 additions and 0 deletions

63
tests/test_scripts.py Normal file
View File

@@ -0,0 +1,63 @@
from __future__ import annotations
import os
import unittest
from unittest.mock import patch
import gpt_image2_generate as image_demo
import gpt_image2_generate_multi as image_multi_demo
class ImageDemoHelpersTest(unittest.TestCase):
def test_openai_ratio_size_mapping(self) -> None:
self.assertEqual(image_demo.resolve_api_size("16:9", "openai"), "1536x864")
self.assertEqual(image_demo.resolve_api_size("3840x2160", "openai"), "3840x2160")
def test_min_output_edge(self) -> None:
self.assertEqual(image_demo.resolve_min_output_edge("4096x2304", None, "apicodex"), 4096)
self.assertIsNone(image_demo.resolve_min_output_edge("1024x1024", None, "openai"))
class ImageMultiDemoHelpersTest(unittest.TestCase):
def test_collect_reference_sources_from_json_array(self) -> None:
with patch.dict(os.environ, {"REFERENCE_IMAGES": '["./a.png", "./b.png", "./a.png"]'}, clear=True):
self.assertEqual(image_multi_demo.collect_reference_sources(), ["./a.png", "./b.png"])
def test_build_edit_files_field_names(self) -> None:
ref1 = image_demo.ImageInput("a.png", "image/png", b"a")
ref2 = image_demo.ImageInput("b.png", "image/png", b"b")
openai_single = image_multi_demo.build_edit_files("openai", [ref1], None)
openai_multi = image_multi_demo.build_edit_files("openai", [ref1, ref2], None)
apicodex_multi = image_multi_demo.build_edit_files("apicodex", [ref1, ref2], None)
self.assertEqual([name for name, _ in openai_single], ["image"])
self.assertEqual([name for name, _ in openai_multi], ["image[]", "image[]"])
self.assertEqual([name for name, _ in apicodex_multi], ["image[]", "image[]"])
def test_output_stem_env_is_sanitized(self) -> None:
with patch.dict(os.environ, {"IMAGE_OUTPUT_STEM": "../bad stem!"}, clear=True):
self.assertEqual(image_multi_demo.resolve_output_stem(), "bad_stem")
def test_default_n_matches_reference_count(self) -> None:
env = {
"IMAGE_PROMPT": "hello",
"IMAGE_SIZE": "1:1",
}
with patch.dict(os.environ, env, clear=True):
payload, model, size, request_mode, mask_source, background, input_fidelity = image_multi_demo.build_payload(
"http://localhost",
["./a.png", "./b.png"],
)
self.assertEqual(payload["n"], 2)
self.assertEqual(request_mode, "edit")
self.assertIsNone(mask_source)
self.assertIsNone(background)
self.assertIsNone(input_fidelity)
self.assertEqual(model, image_demo.DEFAULT_MODEL)
self.assertEqual(size, "1:1")
if __name__ == "__main__":
unittest.main()