> ## Documentation Index
> Fetch the complete documentation index at: https://docs.infercom.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Vision- und Multimodalitätsfunktionen implementieren - Entwicklerhandbuch

> Verarbeiten Sie Bilder mit dem EU-souveränen Vision-Modell von Infercom. Analysieren Sie Bilder und generieren Sie kontextbewusste Textantworten mit vollständiger DSGVO-Konformität.

Infercom bietet Zugang zu vision-fähigen Modellen auf unserer EU-souveränen Infrastruktur, die es Ihnen ermöglicht, sowohl Text als auch Bilder mit vollständiger Datensouveränität zu verarbeiten. Diese Modelle analysieren Bilder und generieren kontextbewusste Textantworten.

## Unterstützte Modelle

| Modell | Kontext | Region | Hinweise |
|--------|---------|--------|----------|
| `gemma-4-31B-it` | 128K | EU | Googles Gemma 4 31B mit Vision-Fähigkeiten |

<div class="infercom-info">
<Aside type="note">
`gemma-4-31B-it` läuft auf Infercoms souveräner Infrastruktur in Deutschland. Ihre Bilddaten verlassen niemals die EU.
</Aside>
</div>

## Eine Anfrage mit einem Bild stellen

Bei Infercom folgt die Vision-Modellanfrage dem multimodalen Eingabeformat von OpenAI, das sowohl Text- als auch Bildeingaben in einer strukturierten Payload akzeptiert. Während der Aufruf ähnlich der [Textgenerierung](/de/features/text-generation) ist, unterscheidet er sich durch die Einbeziehung einer kodierten Bilddatei, die über die Variable `image_path` referenziert wird. Eine Hilfsfunktion wird verwendet, um dieses Bild in einen Base64-String zu konvertieren, wodurch es zusammen mit dem Text in der Anfrage übergeben werden kann.

<Steps>

1. **Schritt 1**

   Erstellen Sie eine neue Python-Datei und kopieren Sie den unten stehenden Code.

   <Aside type="note">
     Dieses Beispiel verwendet `gemma-4-31B-it`, Googles vision-fähiges Gemma 4-Modell, gehostet auf Infercoms EU-souveräner Infrastruktur.
   </Aside>
   <Tabs syncKey="code">
   <TabItem label="Python (SambaNova)">

   ```python
   from sambanova import SambaNova
   import base64

   client = SambaNova(
       base_url="https://api.infercom.ai/v1",
       api_key="ihr-infercom-api-schluessel",
   )

   # Hilfsfunktion zum Kodieren des Bildes
   def encode_image(image_path):
     with open(image_path, "rb") as image_file:
       return base64.b64encode(image_file.read()).decode('utf-8')

   # Der Pfad zu Ihrem Bild
   image_path = "beispiel.JPEG"

   # Der Base64-String des Bildes
   image_base64 = encode_image(image_path)

   print(image_base64)

   response = client.chat.completions.create(
       model="gemma-4-31B-it",
       messages=[
           {
               "role": "user",
               "content": [
                   {"type": "text", "text": "Was passiert in diesem Bild?"},
                   {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}}
               ]
           }
       ]
   )

   print(response.choices[0].message.content)
   ```

   </TabItem>
   <TabItem label="Python (OpenAI)">

   ```python
   from openai import OpenAI
   import base64

   client = OpenAI(
       base_url="https://api.infercom.ai/v1",
       api_key="ihr-infercom-api-schluessel",
   )

   # Hilfsfunktion zum Kodieren des Bildes
   def encode_image(image_path):
     with open(image_path, "rb") as image_file:
       return base64.b64encode(image_file.read()).decode('utf-8')

   # Der Pfad zu Ihrem Bild
   image_path = "beispiel.JPEG"

   # Der Base64-String des Bildes
   image_base64 = encode_image(image_path)

   print(image_base64)

   response = client.chat.completions.create(
       model="gemma-4-31B-it",
       messages=[
           {
               "role": "user",
               "content": [
                   {"type": "text", "text": "Was passiert in diesem Bild?"},
                   {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}}
               ]
           }
       ]
   )

   print(response.choices[0].message.content)
   ```

   </TabItem>
   </Tabs>

2. **Schritt 2**

   Verwenden Sie Ihren Infercom API-Schlüssel von der Seite [API-Schlüssel und URLs](/de/get-started/api-keys-urls), um den Platzhalter `"ihr-infercom-api-schluessel"` in der Konstruktion des Clients zu ersetzen.

3. **Schritt 3**

   Wählen Sie ein Bild aus und verschieben Sie es zu einem geeigneten Pfad, den Sie in den Zeilen angeben können.

   ```python
   # Der Pfad zu Ihrem Bild
   image_path = "beispiel.JPEG"
   ```

4. **Schritt 4**

   Überprüfen Sie den Prompt, der mit dem Bild im `content`-Teil des `user`-Prompts gepaart werden soll.

5. **Schritt 5**

   Führen Sie die Python-Datei aus, um die Textausgabe zu erhalten.

</Steps>

## Tools und strukturierte Ausgabe mit Bildern

Vision-Anfragen unterstützen dieselben Optionen `tools`, `tool_choice` und `response_format` wie reine Textanfragen. Die Einschränkung wird während der Generierung angewendet. Ein erzwungener Tool-Aufruf oder ein striktes JSON-Schema wird daher auch bei einer Anfrage mit Bild eingehalten.

| Option | Verhalten bei einer Anfrage mit Bild |
| :----- | :----------------------------------- |
| `tool_choice` mit einem Funktionsnamen | Das Modell gibt diesen Tool-Aufruf zurück. `finish_reason` ist `tool_calls` |
| `tool_choice: "none"` | Das Modell gibt reinen Text zurück. `finish_reason` ist `stop` |
| `response_format: {"type": "json_schema", ...}` | Das Modell gibt JSON zurück, das dem Schema entspricht |

<Tabs syncKey="code">
<TabItem label="Python (OpenAI)">

```python
from openai import OpenAI
import base64

client = OpenAI(
    base_url="https://api.infercom.ai/v1",
    api_key="ihr-infercom-api-schluessel",
)

with open("beispiel.JPEG", "rb") as image_file:
    image_base64 = base64.b64encode(image_file.read()).decode("utf-8")

tools = [{
    "type": "function",
    "function": {
        "name": "report_colors",
        "parameters": {
            "type": "object",
            "properties": {"colors": {"type": "array", "items": {"type": "string"}}},
            "required": ["colors"],
        },
    },
}]

response = client.chat.completions.create(
    model="gemma-4-31B-it",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Welche Farben erscheinen in diesem Bild?"},
                {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}},
            ],
        }
    ],
    tools=tools,
    tool_choice={"type": "function", "function": {"name": "report_colors"}},
    max_tokens=200,
    temperature=1.0,
)

print(response.choices[0].message.tool_calls[0].function.arguments)
```

</TabItem>
<TabItem label="cURL">

```bash
curl -s "https://api.infercom.ai/v1/chat/completions" \
  -H "Authorization: Bearer $INFERCOM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma-4-31B-it",
    "messages": [{"role": "user", "content": [
      {"type": "text", "text": "Welche Farben erscheinen in diesem Bild?"},
      {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,<BASE64>"}}
    ]}],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "colors",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {"colors": {"type": "array", "items": {"type": "string"}}},
          "required": ["colors"],
          "additionalProperties": false
        }
      }
    },
    "max_tokens": 200,
    "temperature": 1.0
  }'
```

</TabItem>
</Tabs>

Den vollständigen Ablauf für Tool-Aufrufe finden Sie unter [Function Calling und JSON-Modus](/de/features/function-calling).

## Fehler

### Fehlerhafte Bilddaten

Wenn die API Ihr Bild nicht dekodieren kann, gibt sie HTTP 400 zurück. Dies ist ein permanenter Fehler. Wiederholen Sie die Anfrage nicht. Prüfen Sie, ob der Base64-String vollständig ist und ob der MIME-Typ in der `data:`-URL zur Datei passt.

<Aside type="caution">
  Diese Antwort verwendet nicht die standardmäßige Fehlerhülle. Das Feld `error` ist ein **String**, kein Objekt, und es gibt keine `request_id`. Ein Client, der `error.message` liest, erhält hier `undefined`.

  ```json
  {
    "error": "Unable to decode image: cannot identify image file <_io.BytesIO object at 0x...>",
    "error_code": null,
    "error_param": null,
    "error_type": "invalid_request_error"
  }
  ```

  Die standardmäßige Fehlerhülle und die beiden Pfade, die sie nicht verwenden, finden Sie unter [API-Fehlercodes](/de/api-reference/using-the-api/api-error-codes).
</Aside>

### Bild-Tokens zählen zum Kontextlimit

Bilder verbrauchen Prompt-Tokens. Ein großes Bild zusammen mit einem langen Prompt kann das Kontextlimit des Modells von 128K überschreiten und einen `context_length_exceeded`-Fehler zurückgeben. Prüfen Sie `usage.prompt_tokens` in der Antwort, um zu sehen, wie viele Tokens ein Bild kostet.
