Skip to content

Multimodal I/O

Send images and documents alongside text, request structured JSON responses, and receive images and audio from models.

Send images to vision-capable models as remote URLs or base64 data URLs.

from liter_llm import create_client, ContentPart, ImageDetail
client = create_client(api_key="sk-...")
response = client.chat(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg",
"detail": "high" # low, high, auto
}
}
]
}
]
)
print(response.choices[0].message.text())

Embed images directly as base64 data URLs without hosting them remotely.

from liter_llm import create_client, image
from pathlib import Path
client = create_client(api_key="sk-...")
# Encode local file
png_bytes = Path("photo.png").read_bytes()
data_url = image.encode_data_url(png_bytes, image.IMAGE_PNG)
response = client.chat(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image"},
{
"type": "image_url",
"image_url": {"url": data_url}
}
]
}
]
)
print(response.choices[0].message.text())

Request responses in a specific JSON schema format.

Simple JSON mode (any valid JSON object).

from liter_llm import create_client, ResponseFormat
client = create_client(api_key="sk-...")
response = client.chat(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "Extract the main entities from: 'John Smith works at Acme Corp in NYC'"
}
],
response_format=ResponseFormat.json_object()
)
print(response.choices[0].message.text())

Define an exact schema the model must follow.

from liter_llm import create_client, ResponseFormat
client = create_client(api_key="sk-...")
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"company": {"type": "string"},
"location": {"type": "string"}
},
"required": ["name", "company", "location"]
}
response = client.chat(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "Extract the main entities from: 'John Smith works at Acme Corp in NYC'"
}
],
response_format=ResponseFormat.json_schema(
name="Entity",
schema=schema
)
)
print(response.choices[0].message.text())

Generate images from text prompts.

from liter_llm import create_client
client = create_client(api_key="sk-...")
response = client.image_generate(
model="dall-e-3",
prompt="A serene landscape with mountains and lake"
)
for image in response.data:
print(f"Image URL: {image.url}")

Request image output directly in chat completion.

from liter_llm import create_client, Modality
client = create_client(api_key="sk-...")
response = client.chat(
model="gemini-2.0-flash",
messages=[
{
"role": "user",
"content": "Generate a serene landscape image"
}
],
modalities=["image"]
)
# Access output images
output_images = response.choices[0].message.output_images()
for img in output_images:
print(f"Generated image: {img.url}")

Request audio output from speech models.

from liter_llm import create_client, Modality
from pathlib import Path
client = create_client(api_key="sk-...")
response = client.chat(
model="gpt-4o-audio-preview",
messages=[
{
"role": "user",
"content": "Tell me about the history of AI"
}
],
modalities=["text", "audio"]
)
# Extract text and audio
text = response.choices[0].message.text()
audio_parts = response.choices[0].message.output_audio()
for audio in audio_parts:
# audio.data is base64, audio.format is the codec
Path("response.wav").write_bytes(
__import__("base64").b64decode(audio.data)
)

Not all providers support all modalities. Refer to the table below for support:

Feature OpenAI Anthropic Gemini/Vertex Claude
Vision Input gpt-4o, gpt-4-turbo claude-3.5-sonnet gemini-2.0-flash Yes
Response Format (JSON Schema) Yes Yes (via system) Yes (native) Via system
Image Output dall-e-3 imagen-3 (Vertex)
Audio Output gpt-4o-audio-*

For details on provider-specific transformations, see Providers.