チャット

画像、PDF、音声、動画の入力

対応モデルには、メッセージ内で画像、PDF、音声、動画を送信できます。ファイル本体(base64)またはリンクを指定してください。リンク先のファイルはZurelayが取得するため、公開されているhttpsリンクなら、20 MBまでのファイルを利用できます。

概要

送信するもの/v1/chat/completions (every model)/v1/messages (Claude)形式
画像image_urlパートimageブロックPNG, JPEG, WebP, GIF
PDFfileパートdocumentブロックPDF
録音input_audioパートClaudeは音声に対応していませんWAV, MP3
動画video_urlパートClaudeは動画を視聴できませんMP4, MOV, WebM
テキスト、コード、CSV、Word、Excelメッセージ内のテキストそのものtextブロック、またはプレーンテキストのdocumentテキスト

各パートには、公開httpsリンクか、data:application/pdf;base64,JVBERi0...などのbase64データURLにしたファイル自体を指定できます。モデルが読み取れる形式なら、1つのメッセージに複数のファイルを自由に組み合わせられます。

モデルが読み取れる形式

すべてのチャットモデルがテキストを読み取れます。この表には、各モデルが現在読み取れる形式がリアルタイムで表示されます。モデルが対応していない形式を渡すと、すぐにunsupported_contentで拒否されるため、読み取っていないファイルについて回答することはありません。

画像

リンクまたはデータURLを指定したimage_urlパートを追加します。PNG、JPEG、WebP、GIFに対応しています。画像を読み取れるモデルなら、1つのメッセージで複数の画像を送れます。

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "What's in this picture? One sentence."
},
{
"type": "image_url",
"image_url": {
"url": "https://zurelay.com/examples/gpt-image-2.5-flare/watch-800.webp"
}
}
]
}
],
)
print(response.choices[0].message.content)

ディスク上のファイルを送るには、base64でエンコードしてデータURLにします:

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("receipt.jpg", "rb") as f:
data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's the total on this receipt?"},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
)
print(response.choices[0].message.content)

detail(low、high、auto)は、対応するモデルにそのまま渡されます。

PDF

PDFをfile_data内のデータURLとファイル名で指定したfileパートを追加します。モデルはテキストを読み取り、対応していればページを画像としても読み取ります(グラフ、スキャン、表など)。file_dataには公開リンクも指定できます。

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("contract.pdf", "rb") as f:
pdf = "data:application/pdf;base64," + base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Who are the parties, and how can the contract be ended?"},
{"type": "file", "file": {"filename": "contract.pdf", "file_data": pdf}},
],
}],
)
print(response.choices[0].message.content)

長いPDFではページごとに入力トークンがかかるため(下記の料金を参照)、必要なページだけを送ってください。複数の文書について一度に質問するには、文書ごとにfileパートを追加し、区別できる名前を付けてください。

Word、Excel、テキスト、コード

モデルはPDFを読み取れますが、Word、Excel、PowerPointファイルは読み取れません。テキスト、CSV、JSON、Markdown、コードは、テキストとしてメッセージに直接入れてください。通常の入力トークンとして課金され、モデルにとっても最も読み取りやすい形式です。レイアウトが重要な場合(表、グラフ、スキャンなど)は、PDFに書き出して送ってください。text/plainなど、ほかの種類のデータURLは、理由を示すエラーで拒否されます。

import os
from pathlib import Path
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
notes = Path("meeting-notes.md").read_text()
sales = Path("sales.csv").read_text()
response = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{
"role": "user",
"content": f"Summarize the notes, then total the sales by region.\n\n"
f"<notes>\n{notes}\n</notes>\n\n<sales>\n{sales}\n</sales>",
}],
)
print(response.choices[0].message.content)

音声

音声を扱えるモデル(表を参照)には、base64の音声と形式(wavまたはmp3)を指定したinput_audioパートを送ります。input_audioには音声データ自体を指定します。リンクを使う場合は、file_dataにリンクを指定したfileパートを使ってください。ブラウザで録音したデータは通常WebMで、動画として読み取られます。音声のみを扱うモデルには、MP3またはWAVに変換してください。

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("call.mp3", "rb") as f:
audio = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Transcribe this call, then list the action items."},
{"type": "input_audio", "input_audio": {"data": audio, "format": "mp3"}},
],
}],
)
print(response.choices[0].message.content)

動画

動画を扱えるモデルには、リンクまたはデータURLを指定したvideo_urlパートを送ります(fileパートも使えます)。MP4、MOV、WebMに対応しています。音声にも対応するモデルはサウンドトラックも読み取るため、発言内容について質問できます。

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe what happens, and transcribe anything that's said."
},
{
"type": "video_url",
"video_url": {
"url": "https://example.com/clip.mp4"
}
}
]
}
],
)
print(response.choices[0].message.content)

ディスク上の動画も、同じようにデータURLとして送れます:

Python
with open("clip.mp4", "rb") as f:
video = "data:video/mp4;base64," + base64.b64encode(f.read()).decode()
content = [
{"type": "text", "text": "What happens in this clip?"},
{"type": "video_url", "video_url": {"url": video}},
]

入力形式を問わず、モデルに合った形式で渡します

各ラボが受け付けるメディアの形式は異なります(動画は、参照するドキュメントによってvideo_url、image_url、fileパートのいずれかになります)。どの形式でも送れます。各モデルが読み取れる形式に変換して渡します。

1つのメッセージに複数のファイルを送る

読み取らせたい順にファイルごとのパートを追加し、テキストでは順番や名前で参照してください(「2枚目の画像」「contract.pdf」など)。モデルがそれぞれの形式に対応していれば、画像、PDF、音声、動画を組み合わせられます。ファイルの間にテキストパートを入れて、説明を付けることもできます。

  • リンクには公開https URLを指定してください。リダイレクトは最大3回までたどり、最大20秒待機します。
  • ダウンロードできないリンクは、モデルを呼び出す前に、invalid_urlとリンク先が返したステータスで直ちに拒否されます。
  • 署名付きリンク(S3、Cloud Storage、Zurelayの画像リンク)は、有効期限内なら使用できます。

Anthropic 形式

/v1/messagesでは、ClaudeモデルはAnthropic形式のブロック(imageとdocument)を受け付けます。ソースにはbase64またはurlを指定します。一部のClaudeモデルは/v1/chat/completions経由でのみPDFを読み取れます。/v1/messagesに送ると、代わりの送信先がエラーに表示されます。

コンテンツブロック
[
{ "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgo..." } },
{ "type": "document", "source": { "type": "url", "url": "https://example.com/report.pdf" } },
{ "type": "document", "source": { "type": "base64", "media_type": "application/pdf", "data": "JVBERi0..." } },
{ "type": "text", "text": "Compare the chart with the report's conclusion." }
]

制限

制限値
ファイル1件20 MB
1リクエスト内の全メディア30 MB
リクエスト本文(base64で約3分の1増加)25 MB
1リクエストあたりのメディアパート数100
リクエストあたりのリンク数20

大きなファイルはリンクで送ってください。リンクはリクエストボディのサイズに含まれません。ラボ独自の Files API (file_id) にアップロードしたファイルは使用できません。ファイルまたはリンクを送ってください。

エラー

ステータスエラー発生条件
400unsupported_contentその種類のファイルは、このモデルでは読み取れません。上の表から対応するモデルを選んでください。
400invalid_urlリンク先をダウンロードできませんでした。理由(ステータス、タイムアウト、メディアファイルではないなど)はメッセージに表示されます。
400invalid_request_errorデータ URL でも https リンクでもない、空である、またはモデルが読み取れない種類(Word、プレーンテキスト)のパートです。
413invalid_request_error20 MBを超えるファイル、合計30 MBを超えるメディア、または25 MBを超えるリクエストボディです。

最初の2つはエラーのcode、残りはtypeで、変更すべき内容を示すメッセージが付きます。いずれもモデルを呼び出す前に返されるため、料金はかかりません。その他のエラーはエラーをご覧ください。

メディアの課金方法

モデルはメディアを入力トークンに変換し、モデルの入力料金で課金します。カウント方法はラボごとに異なります。以下は当社が測定した目安です。

ClaudeGPTGemini
1024 × 1024の画像約1,400トークン約1,250~1,650約1,100
大きな写真(12 MP)最大約4,800ピクセル数に応じて増加約1,100~1,200
PDFの1ページ約1,600~2,500ページ内のテキスト約560
音声1秒読み取り不可読み取り不可約25
動画1秒読み取り不可読み取り不可約100~300

各リクエストでカウントされた量は、リクエストログで正確に確認できます。手軽に節約するには、画像を必要なサイズまで縮小してください。ほとんどのモデルは、1024 pxの画像を4000 pxの画像と同じように読み取れます。

同じ画像やドキュメントを何度も送る場合は、会話の最初に置き、その部分を毎回同じにしてください。プロンプトキャッシュに対応するモデルでは、繰り返し送る入力にキャッシュ料金が適用されます。

ご質問や不足している情報はありますか? サポートチームにお問い合わせください。通常1分以内にメールで回答します。