Files APIとPDF
OpenAI互換のGetVibe API Files APIとPDF入力:chat/completions、responses、messagesでのbase64、リンク、file_id、PDF内の画像を認識できるモデル、制限、エラーについて説明します。
ファイルのアップロード、読み取り、削除のための OpenAI 互換 Files API。すべての操作に API キーが必要です。ファイルには、アップロードした同じクライアントアカウントからのみアクセスできます。
ファイルをアップロード
multipart/form-data に必須の file フィールドと purpose フィールドを付けて送信します。許可される 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、name、size、purpose、作成時刻を持つ id オブジェクトを返します。/content なしの GET はこのメタデータを返し、/content 付きの GET は生のバイトをダウンロードします。DELETE が成功した後は、どちらの GET も 404 を返します。別アカウントの既存ファイルは 403、不明な識別子は 404 を返します。
安全なワークフロー
- ファイルをアップロードし、返された
file_idのみを保持します。 - 同じキーでメタデータを検証します。Responses を扱う場合は、この id を
input_file.file_idで渡してください。 - シークレットをアップロードせず、作業が終わったらファイルを削除してください。削除されたファイルは復元できません。
モデルリクエストでのPDF
すべてのテキストモデルは、3つのAPI形式すべてでPDFを受け付けます。要点は次のとおりです。以下のいずれかの方法でファイルを送信すると、デフォルトではテキストが無料で抽出され、モデルに渡されます。モデルはテキストと表を読み取りますが、PDF内の画像やスキャンは読み取れません。画像、レイアウト、スキャンが重要な場合は、以下の表からモデルを選び、テキスト抽出をオフにしてください。このページの内容はすべて、2026年11月2日に、テキスト、表、画像を含む3ページのPDFを使った実際のリクエストで検証済みです。
PDFを送信する3つの方法
| メソッド | 方法 | 使用する状況 |
|---|---|---|
| リクエスト内の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":"…"}} | 単発のドキュメントです。3つのエンドポイントすべてで動作します。最大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の例では、公式のopenaiとanthropic SDKをそのまま使用し、アドレスだけが異なります。
/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に対応していないモデルを含む、あらゆるモデルで利用できます。モデルには、表(罫線はありませんが、値は正しく保持されます)を含め、単語と数値が表示されます。一方、表示されないものは、画像、グラフ、スタンプ、署名、色、レイアウトです。1リクエストにつき最大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になります)。表で「yes」と示されたモデルでのみ使用してください。それ以外のモデルは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では使用可能、/responsesでは400 |
deepseek-v4.1-flash, glm-5.3, kimi-k3 | text | いいえ — 400 |
テスト方法:モデルに、1ページ目の単語、表のセルの数値、画像の説明(形、色、画像として描かれた数値)を求めました。「Text」は、単語と数値を正しく答え、画像は見えないと回答したことを意味します。「Yes」は、画像も正しく説明できたことを意味します。/v1/chat/completionsまたは/v1/responses経由で、GPT、Gemini、QwenモデルにPDFを送信できます。/v1/messagesでは、これらのモデルはファイル自体を読み取れません。
not-needed:no_text_layer_unmeasured_lane)。その後の動作はモデルによって異なります。gpt-6.1-solとqwen3.8-flashはスキャンを読み取りますが、DeepSeekモデルは400を返します。お使いのモデルがスキャンを読み取れない場合は、手元でOCRを実行してテキストを送信するか、画像を受け付けるモデルにimage_url経由でページをPNG/JPEG画像として送信してください。上限、トークン、所要時間
| 何 | 上限 |
|---|---|
| モデルリクエスト内のPDF(base64、リンク、またはfile_id) | 1ファイルあたり最大20 MiB。ファイルの先頭は%PDF-である必要があります |
POST /v1/filesにアップロードする | 最大50 MiB(52,428,800 bytes)ですが、モデルのリクエストに含められるPDFは最大20 MiBです |
file_id lifetime | 7日間(expires_atフィールド)、その後ファイルは削除されます |
| ページ | 個別の制限なし。テキスト抽出の場合は1リクエストあたり最大60,000文字、ファイル自体を渡す場合はモデルのコンテキストウィンドウまで |
| リンクからダウンロード | 最大10秒、リダイレクトは最大3回 |
トークンの数え方。 PDFは選択したモデルの通常の入力トークンとして、その料金で課金されます。ファイルやテキスト抽出に別料金はかかりません。料金の目安(短い質問を含む実測値)は次のとおりです。
- 抽出したテキスト:高密度のテキストページあたり約700トークン(10ページで7,300トークン、40ページの場合は60,000文字に切り詰められ、20,300トークン)。短い表のあるページは100–200トークンです。
- GPTモデルでファイルそのものを処理する場合:約1ページあたり600~700トークン(10ページで5,900、40ページで23,300)。
gemini-4-argonでは1ページあたり約1,200トークン、Claudeでは1ページあたり約1,600トークンです。gpt-6.1-solでスキャンしたページは約5,800トークンです。 - リクエストの先頭部分が変わらなければ、同じドキュメントの再利用時にキャッシュがヒットします。同じ
file_idを使った2回目のリクエストでは、7,309トークン中7,168トークンがキャッシュから読み取られました。
所要時間。 テキスト抽出は1秒未満で完了します。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 bytesを超えています | ファイルが50 MiBを超えています。分割してください。 |
400 invalid_request_error | file_idは利用できません | ファイルが削除された、有効期限(7日間)が切れた、別のアカウントからアップロードされた、または別のサービスのIDが使われています。同じキーを使ってファイルを再度アップロードしてください。 |
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を返す、ログインページを表示する、PDFではなくHTMLを返す、またはサーバーが10秒以内に応答しませんでした。プライベートブラウザーウィンドウでリンクを開いてください。ファイルがすぐにダウンロードされない場合は、base64を送信してください。 |
400 unsupported_input | モデルはPDFを読み取れず、ファイルにはテキストがありません(スキャン画像です)。 | スキャンを読み取れるモデル(上記参照)を使うか、手元でOCRを実行してください。 |
400 invalid_request_error | テキスト抽出をオフにしたInvalid request…、またはスキャンしたPDFです。 | モデルはPDFファイルを受け付けません。plugins documents enabled:false を削除してモデルにテキストを渡すか、表で「yes」と表示されているモデルを選択してください。 |
| 200ですが、「ファイルが見えません」と表示されます | 抽出がオフで、モデルまたはチャネルがファイルを読み取れません。 | デフォルトのテキスト抽出に戻すか、表で「yes」と示されたモデルを選んでください。 |
ベストプラクティス
- ドキュメントを複数のリクエストで使う必要がありますか?一度アップロードして
file_idを渡してください。リクエストが小さくなり、繰り返されるプレフィックスがキャッシュされて料金が安くなります。 - PDFと固定の指示をメッセージの先頭に、変化する質問を末尾に配置すると、キャッシュがより頻繁にヒットします。
- 高密度のページが約28ページを超えるドキュメントは、章ごとに分割してください。テキスト抽出では、60,000文字を超える部分はモデルに届きません。
- テキストレイヤーがある契約書、レポート、エクスポートデータには、テキスト抽出で十分です。
deepseek-v4.1-flashを含むどのモデルでも利用でき、最も低コストな方法です。 - グラフ、スタンプ、スキャンが必要ですか?抽出をオフにし、たとえば
gpt-6.1-solのように、表で「yes」と示されたモデルを使用してください。 - PDF内の非ラテン文字(ロシア語、中国語など)は、設定なしで読み取れます。送信する前にPDFのパスワードを解除してください。
- アップロードしたファイルが不要になったら、
DELETE /v1/files/{file_id}で削除してください。
file_id をサードパーティの識別子に置き換えないでください。