The official Python library for the anthropic API
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Working with images, documents, and PDFs in Claude conversations.
import base64
with open("image.jpg", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode()
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
},
{"type": "text", "text": "Describe this image"}
]
}]
)# Supported MIME types
"image/jpeg"
"image/png"
"image/gif"
"image/webp"message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": img1}},
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": img2}},
{"type": "text", "text": "Compare these images"}
]
}]
)import base64
with open("document.pdf", "rb") as f:
pdf_data = base64.standard_b64encode(f.read()).decode()
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": pdf_data
}
},
{"type": "text", "text": "Summarize this document"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "url",
"media_type": "application/pdf",
"url": "https://example.com/document.pdf"
}
},
{"type": "text", "text": "Summarize this document"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "Long text content..."
}
},
{"type": "text", "text": "Analyze this text"}
]
}]
)Combine text, images, and documents:
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Review this presentation:"},
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": pdf_data}},
{"type": "text", "text": "Here's the cover image:"},
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": img_data}},
{"type": "text", "text": "What are the key points?"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {...}},
{"type": "text", "text": "List all objects visible in this image"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {...}},
{"type": "text", "text": "Extract all text from this image"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Before:"},
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": before_img}},
{"type": "text", "text": "After:"},
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": after_img}},
{"type": "text", "text": "What changed?"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{"type": "document", "source": {...}},
{"type": "text", "text": "Provide a brief summary"}
]
}]
)message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "document", "source": {...}},
{"type": "text", "text": "What is the main conclusion?"}
]
}]
)message = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=2048,
citations={"type": "enabled"},
messages=[{
"role": "user",
"content": [
{"type": "document", "source": {...}},
{"type": "text", "text": "Summarize with citations"}
]
}]
)
for block in message.content:
if hasattr(block, 'citations'):
for citation in block.citations:
print(f"Citation: {citation.cited_text}")from PIL import Image
import io
import base64
def optimize_image(image_path, max_size=(1024, 1024)):
img = Image.open(image_path)
img.thumbnail(max_size, Image.Resampling.LANCZOS)
buffer = io.BytesIO()
img.save(buffer, format="JPEG", quality=85)
return base64.standard_b64encode(buffer.getvalue()).decode()
optimized_data = optimize_image("large_image.jpg")For very large PDFs, consider splitting or summarizing sections.
Always provide clear instructions about what you want from the content.