Files API dan PDF
Files API GetVibe API yang kompatibel dengan OpenAI dan input PDF: base64, tautan, atau file_id pada chat/completions, responses, dan messages; model mana yang dapat melihat gambar di dalam PDF, batasan, dan error.
Files API yang kompatibel dengan OpenAI untuk mengunggah, membaca, dan menghapus file. Setiap operasi memerlukan API key; file hanya dapat diakses oleh akun klien yang sama yang mengunggahnya.
Unggah file
Kirim multipart/form-data dengan kolom file dan purpose yang wajib. Tujuan yang diizinkan: assistants, batch, fine-tune, vision, dan user_data. Ukuran file maksimum 50 MiB (52 428 800 byte); jika melebihi akan mengembalikan 413.
curl -X POST https://getvibeapi.com/v1/files \
-H "Authorization: Bearer $GETVIBE_API_KEY" \
-F "purpose=user_data" \
-F "file=@./report.pdf"Dapatkan metadata, konten, atau hapus
Unggahan mengembalikan objek file dengan id buram, name, size, purpose, dan waktu pembuatan. GET tanpa /content mengembalikan metadata ini; GET /content mengunduh byte mentah. Setelah DELETE berhasil, kedua GET mengembalikan 404. File milik akun lain yang sudah ada mengembalikan 403, dan pengenal yang tidak dikenal mengembalikan 404.
Alur kerja aman
- Unggah file dan simpan hanya
file_idyang dikembalikan. - Verifikasi metadata dengan kunci yang sama; saat bekerja dengan Responses, kirimkan id ini di
input_file.file_id. - Jangan mengunggah secret dan hapus file setelah selesai. File yang dihapus tidak dapat dipulihkan.
PDF dalam permintaan model
Setiap model teks menerima PDF dalam ketiga format API. Singkatnya: kirim file dengan salah satu dari tiga cara di bawah ini — secara default kami mengekstrak teksnya secara gratis dan meneruskannya ke model. Model membaca teks dan tabel, tetapi tidak membaca gambar di dalam PDF atau hasil pemindaian. Jika gambar, tata letak, atau hasil pemindaian penting, pilih model dari tabel di bawah dan nonaktifkan ekstraksi teks. Semua yang ada di halaman ini telah diverifikasi dengan permintaan langsung pada November 2, 2026, menggunakan PDF tiga halaman yang berisi teks, tabel, dan gambar.
Tiga cara mengirim PDF
| Metode | Cara | Kapan menggunakannya |
|---|---|---|
| base64 dalam permintaan | 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":"…"}} | Dokumen sekali pakai. Berfungsi pada ketiga endpoint. File hingga 20 MiB. |
| Tautan publik | Chat: "file":{"file_url":"https://…"}; Responses: {"type":"input_file","file_url":"https://…"}; Messages: "source":{"type":"url","url":"https://…"} | File sudah tersedia secara online. Kami mengunduhnya sendiri: hanya HTTPS, tanpa login atau kata sandi, server harus merespons dengan application/pdf, maksimal 20 MiB, dalam 10 detik dan paling banyak 3 pengalihan. |
file_id setelah diunggah | Unggah dengan POST /v1/files dan purpose=user_data, lalu: Chat "file":{"file_id":"file-pv-…"}, Responses {"type":"input_file","file_id":"file-pv-…"}, Messages "source":{"type":"file","file_id":"file-pv-…"} | Satu dokumen untuk beberapa permintaan: Anda tidak perlu mengirim ulang megabita setiap kali, dan awalan permintaan yang identik disimpan dalam cache. File disimpan selama 7 hari dan hanya terlihat oleh akun Anda. |
Contoh siap dijalankan
Key dibaca dari variabel lingkungan GETVIBE_API_KEY. Contoh Python menggunakan SDK resmi openai dan anthropic tanpa perubahan — hanya alamatnya yang berbeda.
/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"}Yang dilihat model: teks atau file itu sendiri
Secara default, teks diekstrak. Kami mengambil lapisan teks PDF dan meneruskannya ke model, bukan filenya. Ini gratis dan berfungsi dengan model apa pun, bahkan model yang tidak mendukung PDF. Model melihat kata dan angka, termasuk tabel (tanpa garis batas, tetapi dengan nilai yang tepat). Yang tidak dilihatnya: gambar, bagan, stempel, tanda tangan, warna, dan tata letak. Hingga 60,000 karakter teks per permintaan diteruskan (sekitar 28 halaman padat); sisanya dipotong dan model diberi tahu bahwa dokumen telah dipangkas. Header respons x-pv-document-shim menunjukkan apa yang terjadi: applied:text_extracted berarti model menerima teks, not-needed:lane_reads_pdf berarti model menerima file itu sendiri.
File itu sendiri. Agar model dapat melihat seluruh halaman, termasuk gambar dan tata letaknya, tambahkan "plugins":[{"id":"documents","enabled":false}] ke isi permintaan (header kemudian akan menampilkan not-needed:disabled_by_client). Lakukan ini hanya dengan model yang ditandai "yes" dalam tabel: model lainnya merespons 400 atau menyatakan tidak melihat file, dan token input file tetap dikenai biaya.
# 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}]},
)| Model | Secara default | Melihat file itu sendiri (ekstraksi dinonaktifkan) |
|---|---|---|
gpt-6.1-sol | file itu sendiri | ya — pada /chat/completions dan /responses |
gpt-6-luna | text | ya — pada /chat/completions dan /responses |
gpt-5.6-sol | text | belum dikonfirmasi — gunakan setelan default |
claude-sonnet-5.5, claude-opus-5.5 | text | tidak — model tidak dapat melihat file tersebut, jadi meskipun plugin dinonaktifkan, kami tetap mengekstrak teksnya (header x-getvibe-warnings: plugin_overridden:documents); untuk file itu sendiri, gunakan gpt-6.1-sol |
claude-haiku-5.5 | text | tidak — model tidak melihat file tersebut |
gemini-4-argon, gemini-3.8-flash | text | tidak — model tidak melihat file tersebut, atau 400 |
qwen3.8-flash | text | ya — pada /chat/completions; 400 pada /responses |
deepseek-v4.1-flash, glm-5.3, kimi-k3 | text | tidak — 400 |
Cara kami menguji: model diminta menyebutkan satu kata dari halaman 1, angka dari sel tabel, dan mendeskripsikan gambar (bentuk, warna, dan angka yang digambar sebagai gambar). "Text" berarti model menyebutkan kata dan angka dengan benar serta mengatakan bahwa model tidak dapat melihat gambar. "Yes" berarti model juga mendeskripsikan gambar dengan benar. Kirim PDF ke model GPT, Gemini, dan Qwen melalui /v1/chat/completions atau /v1/responses: pada /v1/messages model-model tersebut tidak melihat file itu sendiri.
not-needed:no_text_layer_unmeasured_lane). Hasilnya kemudian bergantung pada model: gpt-6.1-sol dan qwen3.8-flash dapat membaca hasil pemindaian kami, sedangkan model DeepSeek merespons 400. Jika model Anda tidak dapat membaca hasil pemindaian, jalankan OCR di sisi Anda dan kirim teksnya, atau kirim halaman sebagai gambar PNG/JPEG melalui image_url ke model yang menerima gambar.Batas, token, dan waktu
| Apa | Batas |
|---|---|
| PDF dalam permintaan model (base64, tautan, atau file_id) | hingga 20 MiB per file; file harus diawali dengan %PDF- |
Unggah ke POST /v1/files | hingga 50 MiB (52,428,800 bytes), tetapi hanya PDF berukuran hingga 20 MiB yang dapat disertakan dalam permintaan ke model |
file_id lifetime | 7 hari (kolom expires_at), lalu file akan dihapus |
| Halaman | tidak ada batas terpisah; dengan ekstraksi teks, hingga 60,000 karakter per permintaan; dengan file itu sendiri, hingga batas jendela konteks model |
| Unduh melalui tautan | hingga 10 detik dan maksimal 3 pengalihan |
Cara token dihitung. PDF dikenai biaya sebagai token input biasa dari model yang dipilih sesuai harganya; tidak ada biaya terpisah untuk file atau ekstraksi teks. Perkiraan biayanya (diukur, termasuk pertanyaan singkat):
- Teks yang diekstrak: sekitar 700 token per halaman teks padat (10 halaman — 7,300 token; 40 halaman dipangkas hingga 60,000 karakter — 20,300 token). Halaman dengan tabel pendek — 100–200 token.
- File itu sendiri pada model GPT: sekitar 600–700 token per halaman (10 halaman — 5,900; 40 — 23,300); pada
gemini-4-argonsekitar 1,200 per halaman; pada Claude sekitar 1,600 per halaman. Halaman hasil pemindaian padagpt-6.1-sol— sekitar 5,800 token. - Dokumen yang sama akan menggunakan cache jika bagian awal permintaan tidak berubah: permintaan kedua dengan
file_idyang sama membaca 7,168 dari 7,309 token dari cache.
Waktu. Ekstraksi teks memerlukan waktu sepersekian detik; jawaban tentang dokumen 40 halaman diterima dalam 4–12 detik. Untuk dokumen besar dan jawaban panjang, gunakan stream: true dan atur batas waktu klien setidaknya 300 detik.
Error dan cara mengatasinya
| Respons | Penyebab | Yang harus dilakukan |
|---|---|---|
400 invalid_pdf | The PDF must start with the %PDF- signature. | Ini bukan PDF, atau base64-nya rusak. Pastikan Anda menyandikan file itu sendiri, bukan jalurnya, dan jenisnya adalah application/pdf. |
400 invalid_pdf | The PDF size must not exceed 20 MiB. | Pisahkan dokumen atau kompres gambar di dalamnya. |
413 invalid_request_error | Pada POST /v1/files: ukuran file lebih besar dari 52,428,800 bytes | File berukuran lebih dari 50 MiB: bagi file tersebut. |
400 invalid_request_error | file_id tidak tersedia | File telah dihapus, kedaluwarsa (7 hari), diunggah oleh akun lain, atau id berasal dari layanan lain. Unggah kembali file tersebut dengan key yang sama. |
400 invalid_pdf | The PDF URL must be a public HTTPS URL without credentials. | Tautannya menggunakan http://, memuat login dan kata sandi, menggunakan port nonstandar, atau domainnya tidak ada. Berikan tautan HTTPS publik atau kirim base64. |
400 invalid_pdf | Could not safely fetch the PDF from the URL. | Tautan mengembalikan 404, halaman login, HTML alih-alih PDF, atau server tidak merespons dalam 10 detik. Buka tautan di jendela browser privat; jika file tidak langsung terunduh, kirim base64. |
400 unsupported_input | Model tidak dapat membaca PDF dan file tersebut tidak memiliki teks (hasil pemindaian). | Gunakan model yang dapat membaca hasil pemindaian (lihat di atas), atau jalankan OCR di sisi Anda. |
400 invalid_request_error | Invalid request… dengan ekstraksi teks dinonaktifkan, atau dengan hasil pemindaian. | Model tidak menerima file PDF. Hapus plugins documents enabled:false agar model menerima teks, atau pilih model yang ditandai "yes" di tabel. |
| 200, tetapi "Saya tidak melihat file" | Ekstraksi dinonaktifkan, dan model atau saluran tidak membaca file. | Kembali ke ekstraksi teks default, atau pilih model yang ditandai "yes" dalam tabel. |
Praktik terbaik
- Perlu menggunakan dokumen dalam beberapa permintaan? Unggah sekali dan teruskan
file_id: ukuran permintaan lebih kecil, dan awalan yang berulang disimpan dalam cache dengan biaya lebih rendah. - Letakkan PDF dan instruksi tetap di awal pesan, lalu pertanyaan yang berubah-ubah di bagian akhir: dengan begitu, cache lebih sering digunakan.
- Pisahkan dokumen yang lebih panjang dari ~28 halaman padat berdasarkan bab: dengan ekstraksi teks, apa pun yang melebihi 60,000 karakter tidak akan pernah sampai ke model.
- Untuk kontrak, laporan, dan ekspor yang memiliki lapisan teks, ekstraksi teks sudah cukup — opsi termurah pada model apa pun, termasuk
deepseek-v4.1-flash. - Perlu bagan, stempel, atau hasil pemindaian? Nonaktifkan ekstraksi dan gunakan model yang ditandai "yes" dalam tabel, misalnya
gpt-6.1-sol. - Teks non-Latin (Rusia, Mandarin, dan lainnya) dalam PDF dibaca tanpa pengaturan apa pun. Hapus kata sandi dari PDF sebelum mengirimkannya.
- Hapus file yang diunggah dengan
DELETE /v1/files/{file_id}setelah Anda tidak lagi membutuhkannya.
file_id yang dikembalikan dengan pengenal pihak ketiga.