Files
virtual_interdimensional_sp…/scripts/openai_image_gen.py

113 lines
3.3 KiB
Python
Raw Permalink Normal View History

#!/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()