Files API и PDF
Files API и ввод PDF в GetVibe API, совместимом с OpenAI: base64, ссылка или file_id в chat/completions, responses и messages; модели, которые видят изображения внутри PDF; ограничения и ошибки.
Files API, совместимый с OpenAI, для загрузки, чтения и удаления файлов. Каждая операция требует API-ключа; файл доступен только тому же клиентскому аккаунту, который его загрузил.
Загрузить файл
Отправьте 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"Получить метаданные, содержимое или удалить
Загрузка возвращает объект file с непрозрачным id, именем, размером, назначением и временем создания. GET без /content возвращает эти метаданные; GET /content скачивает необработанные байты. После успешного DELETE оба GET возвращают 404. Существующий файл другой учётной записи возвращает 403, а неизвестный идентификатор — 404.
Безопасный рабочий процесс
- Загрузите файл и сохраните только возвращённый
file_id. - Проверьте метаданные тем же ключом; при работе с Responses передавайте этот id в
input_file.file_id. - Не загружайте секреты и удалите файл после завершения работы. Удалённый файл невозможно восстановить.
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-luna | text | да — в /chat/completions и /responses |
gpt-5.6-sol | text | не подтверждено — оставьте значение по умолчанию |
claude-sonnet-5.5, claude-opus-5.5 | text | нет — модель не видит файл, поэтому даже при отключённом плагине мы извлекаем текст (заголовок x-getvibe-warnings: plugin_overridden:documents); для самого файла используйте gpt-6.1-sol |
claude-haiku-5.5 | text | нет — модель не видит файл |
gemini-4-argon, gemini-3.8-flash | text | нет — модель не видит файл или возвращает 400 |
qwen3.8-flash | text | да — в /chat/completions; 400 в /responses |
deepseek-v4.1-flash, glm-5.3, kimi-k3 | text | нет — 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 lifetime | 7 дней (поле 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_pdf | The PDF must start with the %PDF- signature. | Это не PDF или base64 повреждён. Убедитесь, что вы кодируете сам файл, а не его путь, и что тип файла — application/pdf. |
400 invalid_pdf | The PDF size must not exceed 20 MiB. | Разбейте документ на части или сожмите изображения внутри него. |
413 invalid_request_error | На POST /v1/files: размер файла превышает 52,428,800 байт | Размер файла превышает 50 MiB: разделите его на части. |
400 invalid_request_error | file_id недоступен | Файл удалён, срок его действия истёк (7 дней), он был загружен с другого аккаунта или идентификатор получен из другого сервиса. Загрузите файл повторно, используя тот же ключ. |
400 invalid_pdf | The PDF URL must be a public HTTPS URL without credentials. | Ссылка использует http://, содержит логин и пароль, использует нестандартный порт или ведёт на несуществующий домен. Укажите общедоступную HTTPS-ссылку или отправьте base64. |
400 invalid_pdf | Could not safely fetch the PDF from the URL. | Ссылка возвращает 404, страницу входа, HTML вместо PDF или сервер не отвечает в течение 10 секунд. Откройте ссылку в приватном окне браузера; если файл не скачивается сразу, отправьте base64. |
400 unsupported_input | Модель не умеет читать PDF, а файл не содержит текста (это скан). | Используйте модель, которая умеет читать сканы (см. выше), или выполните OCR самостоятельно. |
400 invalid_request_error | Invalid 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}, когда они вам больше не нужны.
file_id сторонним идентификатором.