コンテンツにスキップ

ファイル

Files API を使うと、アセットを一度アップロードして file_id で推論リクエストから参照できます。ターンごとにバイト列 (または base64) を再送する必要がありません。OpenAI Files API のシェイプと完全互換で、anthropic-version ヘッダ付きのリクエストには Anthropic Files API のシェイプを返します。これにより、公式の openai SDK と anthropic SDK のどちらも拡張なしで動作します。

POST /v1/files
GET /v1/files
GET /v1/files/{file_id}
GET /v1/files/{file_id}/content
DELETE /v1/files/{file_id}
Purpose単発の /v1/files/v1/uploads 経由の合計許可される MIME タイプ
vision100 MiB100 MiBimage/png, image/jpeg, image/webp, image/gif
video100 MiB8 GiBvideo/mp4, video/webm, video/quicktime
audio100 MiB1 GiBaudio/wav, audio/x-wav, audio/mpeg, audio/mp3, audio/flac, audio/ogg, audio/webm, audio/mp4, audio/x-m4a
document100 MiB1 GiBapplication/pdf

動画生成は GIF を受け付けません。/v1/videos のフレームと参照画像は PNG、JPEG、WebP のいずれかである必要があります(vision はチャット用に image/gif も受け付けます)。

アップロードのデフォルト有効期限は 30 日で、ファイルオブジェクトには常に expires_at が含まれます。期限切れ後の参照は 410 file_expired で失敗します。ファイルは DELETE によるソフト削除の対象でもあります。

POST /v1/files

multipart フォームアップロードです。

フィールド型必須説明
filefileはいアセットのバイト列
purposestringいいえvision、video、audio、document のいずれか。制限値と参照可能なモデルを決定します。省略時はファイルの MIME タイプから推測されます — purpose を送信しない Anthropic SDK のアップロードでもそのまま動作します
from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.aiand.com/v1",
)
with open("photo.png", "rb") as f:
file = client.files.create(file=f, purpose="vision")
print(file.id) # → file-abc123...

MIME タイプは multipart パートの Content-Type から判定されます。openai-node は fs.ReadStream をそのまま渡すと application/octet-stream として送信し、どの purpose でも拒否されるため、toFile で明示的に type を指定してください。

{
"id": "file-abc123def456",
"object": "file",
"bytes": 482301,
"purpose": "vision",
"filename": "photo.png",
"created_at": 1719450000,
"expires_at": 1722042000
}
フィールド型説明
idstringfile- プレフィックス付きの安定 ID。チャット補完のコンテンツパートで使用します
objectstring常に "file"
bytesintegerファイルサイズ (バイト)
purposestringアップロード時に指定した purpose
filenamestring | null提供された場合は元のファイル名
created_atintegerUnix タイムスタンプ
expires_atinteger | nullUnix タイムスタンプ。デフォルトはアップロードから 30 日後
page_countintegerdocument アップロードでのみ存在 — PDF のページ数

チャット補完でファイルを参照する

Section titled “チャット補完でファイルを参照する”

ユーザーメッセージ内で type: "file" のコンテンツパートを使用します。クライアントが送信するのは ID のみで、バイト列が再度送信されることはありません。

{
"model": "<vision-capable-model>",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "What's in this image?" },
{ "type": "file", "file": { "file_id": "file-abc123def456" } }
]
}]
}
completion = client.chat.completions.create(
model="<vision-capable-model>",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "file", "file": {"file_id": file.id}},
],
}],
)
print(completion.choices[0].message.content)
{
"model": "<video-capable-model>",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "Describe what happens in this clip." },
{ "type": "file", "file": { "file_id": "file-vid789..." } }
]
}]
}

ワイヤーフォーマットは画像と同じです — 送信するのは常に type: "file" で、ファイルの purpose がモデルへの受け渡し方を決定します。

{
"model": "<audio-capable-model>",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "Transcribe and summarize this clip." },
{ "type": "file", "file": { "file_id": "file-aud456..." } }
]
}]
}

シェイプは同じです。音声をアップロードせずインラインで送る場合は、OpenAI シェイプの { "type": "input_audio", "input_audio": { "data": "<base64>", "format": "wav" } } パートを直接送信することもできます。

{
"model": "<vision-capable-model>",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "Summarize this paper." },
{ "type": "file", "file": { "file_id": "file-doc456..." } }
]
}]
}

ワイヤーフォーマットは同じ type: "file" 参照です。モデルは 1 ページにつき 1 枚の画像を受け取るため、vision capability が必要です。ページ数は GET /v1/files/{file_id} のレスポンスの page_count で確認できます。

PDF の処理はアップロード時に行われるため、推論レイテンシはドキュメントサイズの影響を受けません。

GET /v1/files
クエリパラメータ型説明
purposestringpurpose で絞り込み
limitintegerページサイズ (1〜100、デフォルト 20)
afterstringカーソル: 前ページの最後のアイテムの id を指定

ファイルは新しい順 (逆時系列) で返されます。

Terminal window
curl "https://api.aiand.com/v1/files?purpose=vision&limit=50" \
-H "Authorization: Bearer sk-your-api-key"
{
"object": "list",
"data": [
{ "id": "file-abc...", "object": "file", "bytes": 482301, "purpose": "vision", "filename": "photo.png", "created_at": 1719450000, "expires_at": 1722042000 }
],
"has_more": false,
"first_id": "file-abc...",
"last_id": "file-abc..."
}

has_more: true のときは、次のリクエストの after に last_id を指定します。SDK のページネーション (client.files.list().auto_paging_iter()) は自動的に動作します。

ファイルメタデータを取得する

Section titled “ファイルメタデータを取得する”
GET /v1/files/{file_id}

アップロードレスポンスと同じシェイプを返します。

Terminal window
curl https://api.aiand.com/v1/files/file-abc123 \
-H "Authorization: Bearer sk-your-api-key"

ファイルコンテンツをダウンロードする

Section titled “ファイルコンテンツをダウンロードする”
GET /v1/files/{file_id}/content

生のバイト列を返します。Content-Type と Content-Disposition ヘッダはアップロード時のメタデータから設定されます。

content = client.files.content("file-abc123")
with open("downloaded.png", "wb") as f:
f.write(content.read())
DELETE /v1/files/{file_id}

ファイルを削除します。以降、その ID を参照する推論リクエストは失敗します。

Terminal window
curl -X DELETE https://api.aiand.com/v1/files/file-abc123 \
-H "Authorization: Bearer sk-your-api-key"
{
"id": "file-abc123",
"object": "file",
"deleted": true
}

ファイルが存在しない、または既に削除されている場合は 404 を返します (冪等な動作)。

ステータスerror.code発生条件
400invalid_request_errorfile/purpose の欠落、未知の purpose、許可外の mime、ファイルサイズの上限超過
400model_capability_mismatchチャット補完が、モデルに無い capability を必要とする purpose のファイルを参照
401invalid_api_keyAuthorization ヘッダが欠落または無効
404file_not_found未知の ID、または別の組織に属する ID
410file_expiredファイルが expires_at を過ぎている
500server_error内部エラー
  • ファイル ID はアップロード元の 組織 にスコープされます。組織をまたいだ参照は 404 を返します。
  • 単発の小さな画像であれば、標準の {type: "image_url", image_url: {url: "data:..."}} コンテンツパートで base64 をインラインで送ることも可能です。ただしマルチターン会話や大きなアセットでは「一度アップロードしてから参照する」方式の方が効率的です。