Skip to content

Multimodal: Image Analysis (Vision)

Multimodal models accept images as input in addition to text. This enables tasks like image descriptions, chart analysis, OCR-like text recognition, or visual question answering, all through the same /chat/completions endpoint you also use for plain text.

Technically, an image is embedded by passing a message’s content field as an array. Each element in it is either a text part ({"type": "text", ...}) or an image part ({"type": "image_url", ...}). The model receives both together and can reference the text as well as the image in its response.

Instead of a string, content contains a list of parts. A typical example looks like this:

[
{"type": "text", "text": "What does this image show?"},
{"type": "image_url", "image_url": {"url": "https://example.com/chart.png"}}
]

The image_url.url field may contain a publicly reachable HTTPS URL or, depending on the client SDK, a base64 data URL (e.g. data:image/png;base64,...). For base64 URLs, ensure the correct MIME-type prefix.

Terminal window
curl -X POST https://ai.noris.de/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "vllm/release/gemma-4-31b-it",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Briefly describe what this image shows."},
{"type": "image_url", "image_url": {"url": "https://example.com/image.png"}}
]
}
]
}'

The response follows the same structure as plain-text requests, the generated text is under choices[0].message.content.

The openai SDK supports the content array natively:

from openai import OpenAI
client = OpenAI(base_url="https://ai.noris.de/v1", api_key="YOUR_API_KEY")
response = client.chat.completions.create(
model="vllm/release/gemma-4-31b-it",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Briefly describe what this image shows."},
{"type": "image_url", "image_url": {"url": "https://example.com/image.png"}}
]
}
]
)
print(response.choices[0].message.content)

Not all models on the platform support image input. As of today, the following mapping applies:

ModelVision-capableNote
Gemma 4 31B (IT)YesMultimodal, suited for general image analysis.
Qwen 3.6 27BYesMultimodal, strong in code/diagram analysis.
GPT-OSS 120BNoText-only reasoning model.
GLM 5.2NoText model with very long context.

If an image is sent to a non-multimodal model, the API returns an error. Before integrating, verify that the chosen model supports vision, or use Gemma 4 31B or Qwen 3.6 27B directly. See Models for details.