auto-git:
[add] scripts/.DS_Store [add] scripts/README.md [add] scripts/extract_texture_filename_from_3ds.py [add] scripts/generate_3d_glb.py [add] scripts/generate_json.py [add] scripts/image_from_json.py [add] scripts/naming.py [add] scripts/openai_image_gen.py [add] scripts/remesh_bake_batch.py [add] server/public/assets/images/.DS_Store [add] server/public/assets/models/spirits/.DS_Store [change] server/public/assets/.DS_Store [change] server/public/assets/models/.DS_Store
This commit is contained in:
112
scripts/openai_image_gen.py
Normal file
112
scripts/openai_image_gen.py
Normal file
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
import requests
|
||||
import urllib.parse
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Bilder mit der OpenAI Image API generieren und herunterladen"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--api_key", "-k",
|
||||
help="OpenAI API-Schlüssel (alternativ über OPENAI_API_KEY)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--model", "-m",
|
||||
default="dall-e-2",
|
||||
help="Modellname (z.B. 'gpt-image-1' oder 'dall-e-2')"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--prompt", "-p",
|
||||
required=True,
|
||||
help="Text-Prompt für die Bildgenerierung"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--count", "-n",
|
||||
type=int,
|
||||
default=1,
|
||||
help="Anzahl der Bilder"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--size", "-s",
|
||||
choices=["256x256", "512x512", "1024x1024"],
|
||||
default="1024x1024",
|
||||
help="Bildgröße"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--format", "-f",
|
||||
choices=["url", "b64_json"],
|
||||
default="url",
|
||||
help="Format der Antwort"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output", "-o",
|
||||
help="Zieldatei für das heruntergeladene Bild (bei mehreren: Suffix _1,_2 etc.)"
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
# API-Key: zuerst aus Argument, sonst aus Umgebungsvariable
|
||||
api_key = args.api_key or os.getenv("OPENAI_API_KEY")
|
||||
if not api_key:
|
||||
print("Error: Bitte gib einen API-Schlüssel via --api_key an oder setze OPENAI_API_KEY.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# Request aufsetzen
|
||||
url = "https://api.openai.com/v1/images/generations"
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {api_key}",
|
||||
}
|
||||
payload = {
|
||||
"model": args.model,
|
||||
"prompt": args.prompt,
|
||||
"n": args.count,
|
||||
"size": args.size,
|
||||
"response_format": args.format,
|
||||
}
|
||||
|
||||
# Anfrage abschicken
|
||||
try:
|
||||
response = requests.post(url, headers=headers, json=payload)
|
||||
response.raise_for_status()
|
||||
except requests.RequestException as e:
|
||||
print(f"API-Request fehlgeschlagen: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# Antwort auswerten und ggf. herunterladen
|
||||
data = response.json().get("data", [])
|
||||
for i, item in enumerate(data, start=1):
|
||||
if args.format == "url":
|
||||
img_url = item.get('url')
|
||||
print(f"[{i}] Bild-URL: {img_url}")
|
||||
|
||||
# Bild herunterladen
|
||||
try:
|
||||
img_resp = requests.get(img_url)
|
||||
img_resp.raise_for_status()
|
||||
except requests.RequestException as e:
|
||||
print(f"Fehler beim Herunterladen des Bildes: {e}", file=sys.stderr)
|
||||
continue
|
||||
|
||||
# Dateinamen bestimmen
|
||||
if args.output:
|
||||
base, ext = os.path.splitext(args.output)
|
||||
filename = f"{base}_{i}{ext}" if args.count > 1 else args.output
|
||||
else:
|
||||
path = urllib.parse.urlparse(img_url).path
|
||||
filename = os.path.basename(path)
|
||||
|
||||
# Datei schreiben
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(img_resp.content)
|
||||
print(f"Bild gespeichert: {filename}")
|
||||
|
||||
else:
|
||||
# Base64-Ausgabe
|
||||
b64 = item.get('b64_json')
|
||||
print(f"[{i}] Bild (Base64):\n{b64}\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user