[diffusion]Support url image input (#15262)
This commit is contained in:
@@ -671,6 +671,7 @@ def get_generate_fn(
|
||||
prompt: str | None = None,
|
||||
seconds: int | None = None,
|
||||
input_reference: Any | None = None,
|
||||
extra_body: dict[Any] | None = None,
|
||||
) -> str:
|
||||
"""
|
||||
Create a video job via /v1/videos, poll until completion,
|
||||
@@ -687,6 +688,8 @@ def get_generate_fn(
|
||||
create_kwargs["seconds"] = seconds
|
||||
if input_reference is not None:
|
||||
create_kwargs["input_reference"] = input_reference # triggers multipart
|
||||
if extra_body is not None:
|
||||
create_kwargs["extra_body"] = extra_body
|
||||
|
||||
job = client.videos.create(**create_kwargs) # type: ignore[attr-defined]
|
||||
video_id = job.id
|
||||
@@ -839,6 +842,53 @@ def get_generate_fn(
|
||||
|
||||
return rid
|
||||
|
||||
def generate_image_edit_url(case_id, client) -> str:
|
||||
"""TI2I: Text + Image ? Image edit using direct URL transfer (no pre-download)."""
|
||||
if not sampling_params.prompt or not sampling_params.image_path:
|
||||
pytest.skip(f"{id}: no edit config")
|
||||
|
||||
# Handle both single URL and list of URLs
|
||||
image_urls = sampling_params.image_path
|
||||
if not isinstance(image_urls, list):
|
||||
image_urls = [image_urls]
|
||||
|
||||
# Validate all URLs
|
||||
for url in image_urls:
|
||||
if not is_image_url(url):
|
||||
pytest.skip(
|
||||
f"{id}: image_path must be a URL for URL direct test: {url}"
|
||||
)
|
||||
|
||||
response = client.images.with_raw_response.edit(
|
||||
model=model_path,
|
||||
prompt=sampling_params.prompt,
|
||||
image=[], # Only for OpenAI verification
|
||||
n=1,
|
||||
size=sampling_params.output_size,
|
||||
response_format="b64_json",
|
||||
extra_body={"url": image_urls},
|
||||
)
|
||||
|
||||
rid = response.headers.get("x-request-id", "")
|
||||
result = response.parse()
|
||||
validate_image(result.data[0].b64_json)
|
||||
|
||||
# Save and upload result for verification
|
||||
img_data = base64.b64decode(result.data[0].b64_json)
|
||||
tmp_path = f"{rid}.png"
|
||||
with open(tmp_path, "wb") as f:
|
||||
f.write(img_data)
|
||||
upload_file_to_slack(
|
||||
case_id=case_id,
|
||||
model=model_path,
|
||||
prompt=sampling_params.prompt,
|
||||
file_path=tmp_path,
|
||||
origin_file_path=str(sampling_params.image_path),
|
||||
)
|
||||
os.remove(tmp_path)
|
||||
|
||||
return rid
|
||||
|
||||
def generate_video(case_id, client) -> str:
|
||||
"""T2V: Text ? Video."""
|
||||
if not sampling_params.prompt:
|
||||
@@ -876,6 +926,19 @@ def get_generate_fn(
|
||||
input_reference=fh,
|
||||
)
|
||||
|
||||
def generate_text_url_image_to_video(case_id, client) -> str:
|
||||
if not sampling_params.prompt or not sampling_params.image_path:
|
||||
pytest.skip(f"{id}: no edit config")
|
||||
return _create_and_download_video(
|
||||
client,
|
||||
case_id,
|
||||
model=model_path,
|
||||
prompt=sampling_params.prompt,
|
||||
size=sampling_params.output_size,
|
||||
seconds=video_seconds,
|
||||
extra_body={"reference_url": sampling_params.image_path},
|
||||
)
|
||||
|
||||
def generate_text_image_to_video(case_id, client) -> str:
|
||||
"""TI2V: Text + Image ? Video."""
|
||||
if not sampling_params.prompt or not sampling_params.image_path:
|
||||
@@ -901,13 +964,19 @@ def get_generate_fn(
|
||||
|
||||
if modality == "video":
|
||||
if sampling_params.image_path and sampling_params.prompt:
|
||||
fn = generate_text_image_to_video
|
||||
if getattr(sampling_params, "direct_url_test", False):
|
||||
fn = generate_text_url_image_to_video
|
||||
else:
|
||||
fn = generate_text_image_to_video
|
||||
elif sampling_params.image_path:
|
||||
fn = generate_image_to_video
|
||||
else:
|
||||
fn = generate_video
|
||||
elif sampling_params.prompt and sampling_params.image_path:
|
||||
fn = generate_image_edit
|
||||
if getattr(sampling_params, "direct_url_test", False):
|
||||
fn = generate_image_edit_url
|
||||
else:
|
||||
fn = generate_image_edit
|
||||
else:
|
||||
fn = generate_image
|
||||
|
||||
|
||||
@@ -141,6 +141,9 @@ class DiffusionSamplingParams:
|
||||
num_frames: int | None = None # for video: number of frames
|
||||
fps: int | None = None # for video: frames per second
|
||||
|
||||
# URL direct test flag - if True, don't pre-download URL images
|
||||
direct_url_test: bool = False
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class DiffusionTestCase:
|
||||
@@ -233,6 +236,7 @@ MULTI_IMAGE_TI2I_sampling_params = DiffusionSamplingParams(
|
||||
"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Image/edit2509/edit2509_1.jpg",
|
||||
"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Image/edit2509/edit2509_2.jpg",
|
||||
],
|
||||
direct_url_test=True,
|
||||
)
|
||||
|
||||
T2V_PROMPT = "A curious raccoon"
|
||||
@@ -240,6 +244,7 @@ T2V_PROMPT = "A curious raccoon"
|
||||
TI2V_sampling_params = DiffusionSamplingParams(
|
||||
prompt="The man in the picture slowly turns his head, his expression enigmatic and otherworldly. The camera performs a slow, cinematic dolly out, focusing on his face. Moody lighting, neon signs glowing in the background, shallow depth of field.",
|
||||
image_path="https://is1-ssl.mzstatic.com/image/thumb/Music114/v4/5f/fa/56/5ffa56c2-ea1f-7a17-6bad-192ff9b6476d/825646124206.jpg/600x600bb.jpg",
|
||||
direct_url_test=True,
|
||||
)
|
||||
|
||||
# All test cases with clean default values
|
||||
|
||||
Reference in New Issue
Block a user