OpenAI Chat Completions Images and PDFs with AI Gateway
Send images and PDFs alongside your text prompt by using an array of content parts in place of a plain string. Every part carries its own type, so one message can mix text, images, and documents.
Model support varies. Check the models list for a model's input modalities before sending an attachment.
Send images as part of your chat completion request.
Example request
image-analysis.ts
import fs from 'node:fs';
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
// Read the image file as base64
const imageBuffer = fs.readFileSync('./image.png');
const imageBase64 = imageBuffer.toString('base64');
const completion = await openai.chat.completions.create({
model: 'anthropic/claude-opus-5',
messages: [
{
role: 'user',
content: [
{ type: 'text', text: 'Describe this image in detail.' },
{
type: 'image_url',
image_url: {
url: `data:image/png;base64,${imageBase64}`,
detail: 'auto',
},
},
],
},
],
stream: false,
});
console.log('Assistant:', completion.choices[0].message.content);
console.log('Tokens used:', completion.usage);image-analysis.py
import os
import base64
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
# Read the image file as base64
with open('./image.png', 'rb') as image_file:
image_base64 = base64.b64encode(image_file.read()).decode('utf-8')
completion = client.chat.completions.create(
model='anthropic/claude-opus-5',
messages=[
{
'role': 'user',
'content': [
{'type': 'text', 'text': 'Describe this image in detail.'},
{
'type': 'image_url',
'image_url': {
'url': f'data:image/png;base64,{image_base64}',
'detail': 'auto'
}
}
]
}
],
stream=False,
)
print('Assistant:', completion.choices[0].message.content)
print('Tokens used:', completion.usage)image-analysis.sh
IMAGE_B64=$(base64 -i image.png)
curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-opus-5",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What is in this image?" },
{
"type": "image_url",
"image_url": { "url": "data:image/png;base64,'"$IMAGE_B64"'" }
}
]
}
]
}'Send PDF documents as part of your chat completion request.
Example request
pdf-analysis.ts
import fs from 'node:fs';
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
// Read the PDF file as base64
const pdfBuffer = fs.readFileSync('./document.pdf');
const pdfBase64 = pdfBuffer.toString('base64');
const completion = await openai.post<OpenAI.Chat.Completions.ChatCompletion>(
'/chat/completions',
{
body: {
model: 'anthropic/claude-opus-5',
messages: [
{
role: 'user',
content: [
{
type: 'text',
text: 'What is the main topic of this document? Please summarize the key points.',
},
{
type: 'file',
file: {
data: pdfBase64,
media_type: 'application/pdf',
filename: 'document.pdf',
},
},
],
},
],
stream: false,
},
},
);
console.log('Assistant:', completion.choices[0].message.content);
console.log('Tokens used:', completion.usage);pdf-analysis.py
import os
import base64
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
# Read the PDF file as base64
with open('./document.pdf', 'rb') as pdf_file:
pdf_base64 = base64.b64encode(pdf_file.read()).decode('utf-8')
completion = client.chat.completions.create(
model='anthropic/claude-opus-5',
messages=[
{
'role': 'user',
'content': [
{
'type': 'text',
'text': 'What is the main topic of this document? Please summarize the key points.'
},
{
'type': 'file',
'file': {
'data': pdf_base64,
'media_type': 'application/pdf',
'filename': 'document.pdf'
}
}
]
}
],
stream=False,
)
print('Assistant:', completion.choices[0].message.content)
print('Tokens used:', completion.usage)pdf-analysis.sh
PDF_B64=$(base64 -i document.pdf)
curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-opus-5",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Summarize this document." },
{
"type": "file",
"file": {
"filename": "document.pdf",
"file_data": "data:application/pdf;base64,'"$PDF_B64"'"
}
}
]
}
]
}'- Chat completions - Request and response shapes for text
- Image generation - Generate images rather than send them
Last updated September 8, 2026
Was this helpful?