Тема
Язык

Files API и PDF

Files API и ввод PDF в GetVibe API, совместимом с OpenAI: base64, ссылка или file_id в chat/completions, responses и messages; модели, которые видят изображения внутри PDF; ограничения и ошибки.

Files API, совместимый с OpenAI, для загрузки, чтения и удаления файлов. Каждая операция требует API-ключа; файл доступен только тому же клиентскому аккаунту, который его загрузил.

Загрузить файл

POSThttps://getvibeapi.com/v1/files

Отправьте multipart/form-data с обязательными полями file и purpose. Допустимые назначения: assistants, batch, fine-tune, vision и user_data. Максимальный размер файла — 50 MiB (52 428 800 байт); при превышении возвращается 413.

curl -X POST https://getvibeapi.com/v1/files \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -F "purpose=user_data" \
  -F "file=@./report.pdf"

Получить метаданные, содержимое или удалить

GEThttps://getvibeapi.com/v1/files/{file_id}
GEThttps://getvibeapi.com/v1/files/{file_id}/content
DELETEhttps://getvibeapi.com/v1/files/{file_id}

Загрузка возвращает объект file с непрозрачным id, именем, размером, назначением и временем создания. GET без /content возвращает эти метаданные; GET /content скачивает необработанные байты. После успешного DELETE оба GET возвращают 404. Существующий файл другой учётной записи возвращает 403, а неизвестный идентификатор — 404.

Безопасный рабочий процесс

  1. Загрузите файл и сохраните только возвращённый file_id.
  2. Проверьте метаданные тем же ключом; при работе с Responses передавайте этот id в input_file.file_id.
  3. Не загружайте секреты и удалите файл после завершения работы. Удалённый файл невозможно восстановить.

PDF в запросах к моделям

Каждая текстовая модель принимает PDF во всех трёх форматах API. Кратко: отправьте файл любым из трёх способов ниже — по умолчанию мы бесплатно извлечём из него текст и передадим его модели. Модель читает текст и таблицы, но не изображения внутри PDF и не сканы. Если важны изображения, макет или скан, выберите модель из таблицы ниже и отключите извлечение текста. Всё на этой странице проверено на реальных запросах 2 ноября 2026 года с использованием PDF на три страницы с текстом, таблицей и изображением.

Три способа отправить PDF

МетодКакКогда использовать
base64 в запросеChat: {"type":"file","file":{"filename":"report.pdf","file_data":"data:application/pdf;base64,…"}}; Responses: {"type":"input_file","filename":"report.pdf","file_data":"data:…"}; Messages: {"type":"document","source":{"type":"base64","media_type":"application/pdf","data":"…"}}Разовый документ. Работает со всеми тремя эндпоинтами. Файлы размером до 20 MiB.
Общедоступная ссылкаChat: "file":{"file_url":"https://…"}; Responses: {"type":"input_file","file_url":"https://…"}; Messages: "source":{"type":"url","url":"https://…"}Файл уже доступен в интернете. Мы скачиваем его самостоятельно: только по HTTPS, без логина и пароля; сервер должен отвечать с application/pdf; размер — до 20 MiB, время скачивания — не более 10 секунд, не более 3 перенаправлений.
file_id после загрузкиЗагрузите файл с помощью POST /v1/files и purpose=user_data, затем: Chat "file":{"file_id":"file-pv-…"}, Responses {"type":"input_file","file_id":"file-pv-…"}, Messages "source":{"type":"file","file_id":"file-pv-…"}Один документ для нескольких запросов: не нужно каждый раз повторно отправлять мегабайты, а идентичный префикс запроса кэшируется. Файл хранится 7 дней и виден только в вашем аккаунте.

Готовые к запуску примеры

Ключ считывается из переменной окружения GETVIBE_API_KEY. В примерах на Python используются официальные SDK openai и anthropic без изменений — отличается только адрес.

/v1/chat/completions

# PDF inline (base64); jq builds the body so a large file does not hit the command-line length limit
# macOS: replace base64 -w0 report.pdf with base64 -i report.pdf
jq -n --rawfile b64 <(base64 -w0 report.pdf) '{model: "deepseek-v4.1-flash", messages: [{role: "user", content: [
    {type: "text", text: "Summarise the document"},
    {type: "file", file: {filename: "report.pdf", file_data: ("data:application/pdf;base64," + $b64)}}]}]}' |
curl https://getvibeapi.com/v1/chat/completions \
  -H "Authorization: Bearer $GETVIBE_API_KEY" -H "Content-Type: application/json" -d @-

/v1/responses

# FILE_ID comes from the upload, see the "curl · file_id" tab above
curl https://getvibeapi.com/v1/responses \
  -H "Authorization: Bearer $GETVIBE_API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"gpt-6.1-sol","input":[{"role":"user","content":[
    {"type":"input_text","text":"What were the sales in Kazan in August?"},
    {"type":"input_file","file_id":"'"$FILE_ID"'"}]}]}'
# base64 instead of file_id:
#   {"type":"input_file","filename":"report.pdf","file_data":"data:application/pdf;base64,…"}

/v1/messages

curl https://getvibeapi.com/v1/messages \
  -H "x-api-key: $GETVIBE_API_KEY" -H "anthropic-version: 2023-06-01" -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-5.5","max_tokens":1024,"messages":[{"role":"user","content":[
    {"type":"document","source":{"type":"file","file_id":"'"$FILE_ID"'"}},
    {"type":"text","text":"Summarise the document"}]}]}'
# other sources:
#   "source":{"type":"base64","media_type":"application/pdf","data":"<base64>"}
#   "source":{"type":"url","url":"https://example.com/report.pdf"}

Что видит модель: текст или сам файл

По умолчанию извлекается текст. Мы берём текстовый слой PDF и передаём его модели вместо файла. Это бесплатно и работает с любой моделью, даже без поддержки PDF. Модель видит слова и числа, включая таблицы (без границ, но с правильными значениями). Чего она не видит: изображения, диаграммы, печати, подписи, цвета и макет. Для каждого запроса передаётся не более 60,000 символов текста (около 28 страниц с плотным текстом); остальное отсекается, и модели сообщается, что документ был усечён. Заголовок ответа x-pv-document-shim сообщает, что произошло: applied:text_extracted означает, что модель получила текст, not-needed:lane_reads_pdf — что она получила сам файл.

Сам файл. Чтобы модель видела страницы целиком, включая изображения и макет, добавьте "plugins":[{"id":"documents","enabled":false}] в тело запроса (тогда заголовок будет not-needed:disabled_by_client). Делайте это только с моделями, отмеченными в таблице как «да»: остальные отвечают 400 или сообщают, что не видят файл, при этом входные токены файла всё равно тарифицируются.

# curl: add the field to the request body
"plugins": [{"id": "documents", "enabled": false}]

# Python (openai SDK)
r = client.chat.completions.create(
    model="gpt-6.1-sol",
    messages=[...],
    extra_body={"plugins": [{"id": "documents", "enabled": False}]},
)
МодельПо умолчаниюВидит сам файл (извлечение отключено)
gpt-6.1-solсам файлда — в /chat/completions и /responses
gpt-6-lunatextда — в /chat/completions и /responses
gpt-5.6-soltextне подтверждено — оставьте значение по умолчанию
claude-sonnet-5.5, claude-opus-5.5textнет — модель не видит файл, поэтому даже при отключённом плагине мы извлекаем текст (заголовок x-getvibe-warnings: plugin_overridden:documents); для самого файла используйте gpt-6.1-sol
claude-haiku-5.5textнет — модель не видит файл
gemini-4-argon, gemini-3.8-flashtextнет — модель не видит файл или возвращает 400
qwen3.8-flashtextда — в /chat/completions; 400 в /responses
deepseek-v4.1-flash, glm-5.3, kimi-k3textнет — 400

Как мы проводили тестирование: модель просили назвать слово со страницы 1, число из ячейки таблицы и описать изображение (фигуры, цвета и число, нарисованное как изображение). «Текст» означает, что модель правильно назвала слово и число и сообщила, что не видит изображение. «Да» означает, что она также правильно описала изображение. Отправляйте PDF моделям GPT, Gemini и Qwen через /v1/chat/completions или /v1/responses: в /v1/messages они не видят сам файл.

Сканы. В скане нет текстового слоя, поэтому извлекать нечего, и модель получает исходный файл (заголовок not-needed:no_text_layer_unmeasured_lane). Дальше всё зависит от модели: gpt-6.1-sol и qwen3.8-flash читают наш скан, модели DeepSeek отвечают 400. Если ваша модель не умеет читать сканы, выполните OCR самостоятельно и отправьте текст либо передайте страницы как изображения PNG/JPEG через image_url модели, которая принимает изображения.

Ограничения, токены и время

ЧтоОграничение
PDF в запросе к модели (base64, ссылка или file_id)до 20 MiB на файл; файл должен начинаться с %PDF-
Загрузка в POST /v1/filesдо 50 MiB (52,428,800 bytes), но в запрос модели можно включить только PDF размером до 20 MiB
file_id lifetime7 дней (поле expires_at), затем файл удаляется
Страницыотдельного ограничения нет; при извлечении текста — до 60,000 символов на запрос; при передаче самого файла — до размера контекстного окна модели
Скачивание по ссылкедо 10 секунд и не более 3 перенаправлений

Как подсчитываются токены. PDF тарифицируется как обычные входные токены выбранной модели по её цене; отдельной платы за файл или извлечение текста нет. Вот сколько это составляет (измерено с учётом короткого вопроса):

  • Извлечённый текст: примерно 700 токенов на страницу с плотным текстом (10 страниц — 7,300 токенов; 40 страниц, усечённых до 60,000 символов, — 20,300 токенов). Страница с небольшой таблицей — 100–200 токенов.
  • Сам файл на моделях GPT: около 600–700 токенов на страницу (10 страниц — 5,900; 40 — 23,300); на gemini-4-argon — около 1,200 на страницу; на Claude — около 1,600 на страницу. Отсканированная страница на gpt-6.1-sol — около 5,800 токенов.
  • При повторном использовании одного и того же документа срабатывает кэш, если начало запроса не меняется: во втором запросе с тем же file_id из 7,309 токенов 7,168 были прочитаны из кэша.

Время. Извлечение текста занимает доли секунды; ответ по документу на 40 страниц был получен за 4–12 секунд. Для больших документов и длинных ответов используйте stream: true и установите тайм-аут клиента не менее 300 секунд.

Ошибки и способы их устранения

ОтветПричинаЧто делать
400 invalid_pdfThe PDF must start with the %PDF- signature.Это не PDF или base64 повреждён. Убедитесь, что вы кодируете сам файл, а не его путь, и что тип файла — application/pdf.
400 invalid_pdfThe PDF size must not exceed 20 MiB.Разбейте документ на части или сожмите изображения внутри него.
413 invalid_request_errorНа POST /v1/files: размер файла превышает 52,428,800 байтРазмер файла превышает 50 MiB: разделите его на части.
400 invalid_request_errorfile_id недоступенФайл удалён, срок его действия истёк (7 дней), он был загружен с другого аккаунта или идентификатор получен из другого сервиса. Загрузите файл повторно, используя тот же ключ.
400 invalid_pdfThe PDF URL must be a public HTTPS URL without credentials.Ссылка использует http://, содержит логин и пароль, использует нестандартный порт или ведёт на несуществующий домен. Укажите общедоступную HTTPS-ссылку или отправьте base64.
400 invalid_pdfCould not safely fetch the PDF from the URL.Ссылка возвращает 404, страницу входа, HTML вместо PDF или сервер не отвечает в течение 10 секунд. Откройте ссылку в приватном окне браузера; если файл не скачивается сразу, отправьте base64.
400 unsupported_inputМодель не умеет читать PDF, а файл не содержит текста (это скан).Используйте модель, которая умеет читать сканы (см. выше), или выполните OCR самостоятельно.
400 invalid_request_errorInvalid request… с отключённым извлечением текста или со сканом.Модель не принимает файлы PDF. Удалите plugins documents enabled:false, чтобы модель получила текст, или выберите модель, отмеченную в таблице значением "yes".
200, но «Я не вижу файл»Извлечение отключено, а модель или канал не читает файл.Вернитесь к извлечению текста по умолчанию или выберите модель, отмеченную в таблице как «да».

Рекомендации

  • Нужно использовать документ в нескольких запросах? Загрузите его один раз и передавайте file_id: запрос будет меньше, а повторяющийся префикс будет кэшироваться и обойдётся дешевле.
  • Размещайте PDF и постоянные инструкции в начале сообщения, а изменяющийся вопрос — в конце: тогда кэш будет срабатывать чаще.
  • Разбивайте документы длиннее ~28 страниц с плотным текстом по главам: при извлечении текста всё, что превышает 60,000 символов, до модели не доходит.
  • Для договоров, отчётов и экспортированных файлов с текстовым слоем достаточно извлечения текста — это самый дешёвый вариант для любой модели, включая deepseek-v4.1-flash.
  • Нужны диаграммы, печати или сканы? Отключите извлечение и используйте модель, отмеченную в таблице как «да», например gpt-6.1-sol.
  • Текст на нелатинице (русский, китайский и другие языки) в PDF читается без дополнительных настроек. Перед отправкой удалите пароль с PDF.
  • Удалите загруженные файлы с помощью DELETE /v1/files/{file_id}, когда они вам больше не нужны.
Files API не гарантирует, что любой выбранный маршрут модели принимает файлы. Если маршрут не поддерживает файл, исправьте форму запроса или выберите совместимую модель; не заменяйте возвращённый file_id сторонним идентификатором.
GetVibe API Files API и PDF — загрузка файлов и отправка PDF моделям | GetVibe API