InferAll serves two models that accept images, both at $0 input and $0 output:
| Model id | What it is |
|---|---|
nvidia/nemotron-3.5-super-vl-120b-a12b |
NVIDIA's Nemotron 3.5 Super VL: 120B parameters in total, 12B active per token |
meta/llama-3.2-11b-vision-instruct |
Meta's Llama 3.2 11B Vision Instruct |
You can send the image the OpenAI way (an image_url part) or the Anthropic way (an image block). Both work on both models.
What we measured (2026-10-19, through InferAll)
We sent a 64x64 PNG whose left half is red and right half is blue, and asked for the two colours. Exact routing, so each answer came from the model named.
| Model | Endpoint | Correct answers | Time per answer |
|---|---|---|---|
| Super VL | /v1/chat/completions |
3 of 3 | 1.4s, 1.5s, 31.8s |
| Super VL | /v1/messages |
2 of 2 | 1.2s, 11.7s |
| Llama 3.2 Vision | /v1/chat/completions |
2 of 3 (one provider error) | 0.9s, 5.2s |
| Llama 3.2 Vision | /v1/messages |
2 of 2 | 2.2s, 32.5s |
Most answers took one to five seconds; a few took 12s to 32s while the shared NVIDIA capacity was busy. One request to Llama 3.2 Vision returned a provider error (HTTP 502). Use default routing (below) if you want InferAll to retry on another vision model when that happens.
This was a simple test. It shows that the image reaches the model and is read; it does not measure OCR, charts or fine detail.
Python (OpenAI SDK)
import base64
from openai import OpenAI
client = OpenAI(
base_url="https://api.inferall.ai/v1",
api_key="ifu_your_key_here", # inferall.ai/keys
)
with open("photo.png", "rb") as f:
image_b64 = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="nvidia/nemotron-3.5-super-vl-120b-a12b",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image in one sentence."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_b64}"}},
],
}],
max_tokens=300,
)
print(response.model) # the model that answered
print(response.choices[0].message.content)
Anthropic format (/v1/messages)
import base64
import anthropic
client = anthropic.Anthropic(
base_url="https://api.inferall.ai",
api_key="ifu_your_key_here",
)
with open("photo.png", "rb") as f:
image_b64 = base64.b64encode(f.read()).decode()
message = client.messages.create(
model="meta/llama-3.2-11b-vision-instruct",
max_tokens=300,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": image_b64}},
{"type": "text", "text": "Describe this image in one sentence."},
],
}],
)
print(message.content[0].text)
curl
IMG=$(base64 < photo.png | tr -d '\n')
curl https://api.inferall.ai/v1/chat/completions \
-H "Authorization: Bearer $INFERALL_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"model\": \"nvidia/nemotron-3.5-super-vl-120b-a12b\", \"max_tokens\": 300,
\"messages\": [{\"role\": \"user\", \"content\": [
{\"type\": \"text\", \"text\": \"Describe this image in one sentence.\"},
{\"type\": \"image_url\", \"image_url\": {\"url\": \"data:image/png;base64,$IMG\"}}]}]}"
If a vision model is busy
With default routing, a request that contains an image only moves to another model that can see images. It is never answered by a text-only model that would ignore the picture. The model field of the response, and the X-Inferall-Actual-Model header, say which model answered. To always get the model you named, send the header X-Inferall-Routing: exact.
Get a key
Sign up at inferall.ai/keys. New accounts get 25 free calls on open models, no card needed. Model pages: Super VL and Llama 3.2 Vision.