# Bild-API: Bilder erzeugen und bearbeiten

> Erzeuge und bearbeite Bilder über die OpenAI-kompatible Images-API von OpenCheese: Parameter je Modell, curl- und Python-Beispiele, base64, Upload-Limits.
>
> Webseite: https://opencheese.dev/de/docs/images/ · Alle Seiten der Doku: https://opencheese.dev/de/docs.md

OpenCheese stellt die Images-API von OpenAI für jedes Bildmodell bereit, das für dein Konto
freigeschaltet ist, mit demselben API-Schlüssel wie für Text- und Codemodelle.

## Bildmodelle und ihre Parameter finden

`GET /v1/images/capabilities` listet jedes Bildmodell auf, das dein Schlüssel nutzen kann, dazu die
Parameter, die jedes Modell akzeptiert – etwa Größe, Seitenverhältnis, Bildgröße, Qualität,
Hintergrund und Ausgabeformat – und wie viele Bilder eine Anfrage höchstens zurückgeben darf.
Anfragen werden anhand derselben Liste geprüft; sende also nur die Parameter, die ein Modell nennt.

```bash
curl https://api.opencheese.dev/v1/images/capabilities \
  -H "Authorization: Bearer $OPENCHEESE_API_KEY"
```

Eine gekürzte Antwort:

```json
{
  "models": [
    {
      "publicModelId": "IMAGE_MODEL_ID",
      "displayName": "Example Image Model",
      "supportsEdit": true,
      "maxImagesPerRequest": 1,
      "params": [
        { "kind": "enum", "id": "aspect_ratio", "values": ["1:1", "16:9", "9:16"], "initial": "16:9" },
        { "kind": "enum", "id": "quality", "values": ["auto", "low", "medium", "high"], "initial": "auto" }
      ]
    }
  ]
}
```

Jeder Eintrag in `params` ist ein Parameter, den du unter seiner `id` senden kannst, zusammen mit den
Werten, die er akzeptiert. `initial` ist ein sinnvoller Startwert; `default` gilt, wenn du den
Parameter weglässt. `maxImagesPerRequest` ist das größte `n`, und `supportsEdit` gibt an, ob das
Modell `/v1/images/edits` unterstützt.

## Ein Bild erzeugen

```bash
curl https://api.opencheese.dev/v1/images/generations \
  -H "Authorization: Bearer $OPENCHEESE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "IMAGE_MODEL_ID", "prompt": "A wedge of cheese on a circuit board"}'
```

`model` und `prompt` sind Pflichtfelder. `size`, `quality`, `background`, `output_format`,
`aspect_ratio`, `image_size` und `n` werden akzeptiert, wenn das Modell sie aufführt.

Die Antwort enthält jedes Bild als base64 in `data[].b64_json`; gehostete Bild-URLs werden nicht
ausgegeben, daher akzeptiert `response_format` nur `b64_json`. `opencheese_cost_usd` im selben Body
gibt an, was dich die Anfrage gekostet hat, in Credits (USD). So speicherst du das erste Bild:

```bash
curl ... | jq -r '.data[0].b64_json' | base64 --decode > image.png
```

Wähle die Dateiendung passend zum Format, das du in `output_format` angefordert hast.

Mit dem Python-SDK von OpenAI:

```python
import base64
from openai import OpenAI

client = OpenAI(base_url="https://api.opencheese.dev/v1", api_key="YOUR_OPENCHEESE_API_KEY")
result = client.images.generate(model="IMAGE_MODEL_ID", prompt="A wedge of cheese on a circuit board")
with open("image.png", "wb") as file:
    file.write(base64.b64decode(result.data[0].b64_json))
```

## Bilder bearbeiten

`POST /v1/images/edits` erwartet `multipart/form-data`: das Ausgangsbild in `image` (oder mehrere in
`image[]`), dazu `model` und `prompt` als Formularfelder.

```bash
curl https://api.opencheese.dev/v1/images/edits \
  -H "Authorization: Bearer $OPENCHEESE_API_KEY" \
  -F "model=IMAGE_MODEL_ID" \
  -F "prompt=Turn the scene into night" \
  -F "image=@input.png"
```

- Uploads müssen PNG, JPEG oder WebP sein: bis zu 5 Bilder mit je bis zu 10 MB.
- Andere Dateifelder wie `mask` werden abgelehnt.

## Einschränkungen

- Bildantworten werden nicht gestreamt: `stream` und `partial_images` werden abgelehnt.
- Manche Modelle geben ein Bild pro Anfrage zurück; wie viele `n` erlaubt, zeigt
  `/v1/images/capabilities`.
- `moderation` lässt sich nicht ändern; es gilt der Standardwert des Modells.
- Ein Prompt, den die eigene Inhaltsrichtlinie des Modells ablehnt, wird mit `moderation_blocked`
  abgewiesen und nicht berechnet. Einige wenige Modelle prüfen stattdessen das fertige Bild und
  berechnen auch eines, das sie ablehnen: Diese Antwort lautet `moderation_blocked_billed`.

## Bildmodelle in Chat-Apps

Chat-Apps, die alle Modelle in einer gemeinsamen Auswahl anzeigen, können ein Bildmodell im normalen
Chat nutzen: Bei `/v1/chat/completions` und `/v1/responses` wird die letzte Nachricht des Nutzers zum
Prompt, und das Bild kommt in der Antwort zurück. Wie diese Antwort aufgebaut ist, steht unter
[Chat Completions](https://opencheese.dev/de/docs/chat-completions.md).

## Preise und Verbrauch

Bildmodelle werden pro Bild abgerechnet, je nach Auflösung und Qualität. Die Preise für dein Konto
findest du nach der Anmeldung auf der Dashboard-Seite **Preise**, und jedes erzeugte Bild erscheint
mit seinen Kosten unter **Transaktionen**.
