mirror of
https://github.com/hanzoskill/bot-meshyai.git
synced 2026-10-30 21:07:28 +00:00
72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Create a Meshy Text-to-Image task and download the resulting image(s).
|
|
|
|
Usage:
|
|
python3 text_to_image.py --prompt "a cute robot" --out-dir ./out
|
|
|
|
Env:
|
|
MESHY_API_KEY (required)
|
|
MESHY_BASE_URL (optional)
|
|
|
|
Docs:
|
|
https://docs.meshy.ai/en/api/text-to-image
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import os
|
|
import re
|
|
|
|
from meshy_client import MeshyError, create_task, poll_task, download
|
|
|
|
|
|
def _slug(s: str, max_len: int = 64) -> str:
|
|
s = s.strip().lower()
|
|
s = re.sub(r"[^a-z0-9]+", "-", s)
|
|
s = re.sub(r"-+", "-", s).strip("-")
|
|
return (s[:max_len] or "meshy")
|
|
|
|
|
|
def main() -> None:
|
|
ap = argparse.ArgumentParser()
|
|
ap.add_argument("--prompt", required=True)
|
|
ap.add_argument("--ai-model", default="nano-banana")
|
|
ap.add_argument("--aspect-ratio", default=None)
|
|
ap.add_argument("--generate-multi-view", action="store_true")
|
|
ap.add_argument("--out-dir", default="./meshy-out")
|
|
ap.add_argument("--timeout", type=int, default=900)
|
|
args = ap.parse_args()
|
|
|
|
payload = {
|
|
"ai_model": args.ai_model,
|
|
"prompt": args.prompt,
|
|
}
|
|
if args.generate_multi_view:
|
|
payload["generate_multi_view"] = True
|
|
if args.aspect_ratio and not args.generate_multi_view:
|
|
payload["aspect_ratio"] = args.aspect_ratio
|
|
|
|
task_id = create_task("/openapi/v1/text-to-image", payload)
|
|
task = poll_task(f"/openapi/v1/text-to-image/{task_id}", timeout_s=args.timeout)
|
|
|
|
status = str(task.get("status", "")).upper()
|
|
if status != "SUCCEEDED":
|
|
raise MeshyError(f"Text-to-Image task did not succeed. status={status} task={task}")
|
|
|
|
urls = task.get("image_urls") or []
|
|
if not isinstance(urls, list) or not urls:
|
|
raise MeshyError(f"No image_urls in task response: {task}")
|
|
|
|
out_dir = os.path.join(args.out_dir, f"text-to-image_{task_id}_{_slug(args.prompt)}")
|
|
os.makedirs(out_dir, exist_ok=True)
|
|
|
|
for i, url in enumerate(urls, start=1):
|
|
out_path = os.path.join(out_dir, f"image_{i}.png")
|
|
download(str(url), out_path)
|
|
print(out_path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|