Вложение — это элемент массива content рядом с текстом. Метод остаётся тем же chat/completions: отдельного эндпоинта для картинок и документов нет.
Когда в сообщении есть вложение, content из строки становится массивом частей. Текст — такая же часть, как и всё остальное, и его порядок относительно вложения модель учитывает: вопрос лучше ставить после файла, а инструкцию — до.
{
"role": "user",
"content": [
{"type": "text", "text": "Что не так на этой схеме?"},
{"type": "image_url", "image_url": {"url": "https://example.ru/scheme.png"}}
]
}Принимаются ссылка и data:-URL. Ссылку скачиваем мы — значит, она должна быть доступна снаружи вашего контура; внутренний адрес вроде http://10.0.0.5/ вернёт 400. Всё, что не лежит в открытом доступе, отправляйте в base64.
import base64
with open("scheme.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
resp = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Что не так на этой схеме?"},
{"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{b64}"}},
],
}],
)| Что | Значение |
|---|---|
| Форматы | PNG, JPEG, WEBP, неанимированный GIF |
| Размер файла | до 20 МБ на изображение после кодирования |
| Количество | до 20 изображений в одном запросе, если модель не ограничивает жёстче |
| detail | low, high или auto. low дешевле и достаточен для «что на картинке», high нужен для мелкого текста и чертежей |
| Стоимость | по изображению или по токенам — зависит от модели, точная сумма в поле usage ответа |
PDF передаётся частью типа file. Разбирать его можно тремя способами, и разница между ними — деньги.
{
"model": "anthropic/claude-sonnet-5",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Собери таблицу платежей из договора"},
{"type": "file", "file": {
"filename": "contract.pdf",
"file_data": "data:application/pdf;base64,JVBERi0…"
}}
]
}],
"plugins": [{
"id": "file-parser",
"pdf": {"engine": "text"}
}]
}| Движок | Как работает | Когда брать |
|---|---|---|
| text | Извлекает текстовый слой, картинки игнорирует | Обычный текстовый PDF. Бесплатно и быстро — умолчание |
| ocr | Распознаёт каждую страницу как изображение | Сканы, фотографии документов, чертежи. Платно, тариф за страницу |
| native | Отдаёт файл модели как есть, если она умеет PDF сама | Вёрстка важна: таблицы, колонки, подписи под рисунками |
Если движок не указан, мы берём text, а при пустом текстовом слое переключаемся на ocr и сообщаем об этом в usage. Тихо потратить ваши деньги на распознавание мы не можем — но и отдать пустой ответ на скан было бы бесполезно.
Разобранный PDF возвращается в ответе в поле file_annotations. Сохраните его и подставляйте в следующие запросы вместо файла — повторный разбор тогда не выполняется и не оплачивается. Для многоходового диалога по одному документу это основная статья экономии.
Звук передаётся частью input_audio в base64 — ссылок здесь нет намеренно, чтобы не тянуть чужие файлы по сети от вашего имени.
{
"role": "user",
"content": [
{"type": "text", "text": "Расшифруй и выдели решения"},
{"type": "input_audio", "input_audio": {"data": "UklGRi…", "format": "wav"}}
]
}wav и mp3.usage.audio_seconds.Смотрите modalities.input в каталоге или фильтр модальности в списке моделей. Вложение типа, которого модель не принимает, возвращает 400 до отправки на площадку — платить за заведомо неудачный запрос не придётся.