对话

图像、PDF、音频和视频输入

对于支持相应输入的模型,可以在消息中加入图片、PDF、音频和视频。可发送文件本身 (base64) 或链接:我们会自行获取链接中的文件,因此任何公开可访问、文件不超过 20 MB 的 https 链接都可以使用。

速览

发送内容/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 链接,也支持以 base64 data URL 形式直接传入文件,例如 data:application/pdf;base64,JVBERi0...。一条消息可以包含多个文件,只要模型支持对应类型,就可以任意混合。

各模型支持的输入类型

所有对话模型都支持文本输入。下表实时显示各模型当前支持的输入类型。如果传入模型不支持的内容,请求会立即被拒绝并返回 unsupported_content,因此模型不会对未读取的文件作答。

图片

添加一个 image_url 内容部分,传入链接或 data URL。支持 PNG, JPEG, WebP 和 GIF。所有支持图片输入的模型都支持在一条消息中接收多张图片。

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 编码为 data 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

添加一个 file 内容部分,在 file_data 中传入 PDF 的 data URL,并提供文件名。模型会读取文本;如果支持,也会将页面作为图片读取(图表、扫描件、表格)。也可以在 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 会按页消耗输入 token(详见下方计费说明),因此只需发送用到的页面。要同时询问多份文档,可为每份文档添加一个 file 内容部分,并使用便于区分的文件名。

Word、Excel、文本和代码

模型支持读取 PDF,不支持直接读取 Word、Excel 或 PowerPoint 文件。请将文本、CSV、JSON、Markdown 或代码直接作为文本放入消息中:这些内容按普通输入 token 计费,也是模型最擅长读取的形式。如果需要保留版式(表格、图表、扫描件),请先将文件导出为 PDF 再发送。其他类型的 data URL(例如 text/plain)会被拒绝,并返回说明原因的错误。

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)

音频

对于支持音频输入的模型(见表格):使用 input_audio 内容部分,传入 base64 编码的音频及其格式 wav 或 mp3。input_audio 接收音频数据本身;如需使用链接,请使用 file 内容部分,并将链接放在 file_data 中。浏览器录音通常为 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)

视频

对于支持视频输入的模型:使用 video_url 内容部分,传入链接或 data 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)

本地视频片段也以同样方式发送,使用 data 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 内容部分)。任选一种结构发送即可:我们会将媒体转换为各模型支持的结构。

在一条消息中发送多个文件

按希望模型读取的顺序,为每个文件添加一个内容部分,并在文本中按顺序或文件名引用(“第二张图片”、“contract.pdf”)。只要模型支持所有对应类型,就可以混合发送图片、PDF、音频和视频。也可以在文件之间插入文本内容部分,为文件添加说明。

  • 链接必须是可公开访问的 https URL。我们最多跟随 3 次重定向,最长等待 20 秒。
  • 如果链接无法下载,请求会在调用任何模型之前立即被拒绝,并返回 invalid_url 及该链接响应的状态码。
  • 签名链接(S3、Cloud Storage、我们生成的图片链接)在有效期内均可使用。

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." }
]

限制

限制项值
单个文件20 MB
单次请求中的全部媒体30 MB
请求体 (base64 编码后体积约增加三分之一)25 MB
单次请求的媒体内容部分数量100
每次请求的链接数20

文件较大时,请发送链接:链接不计入请求体大小。不能使用上传到模型厂商自有 Files API (file_id) 的文件;请直接发送文件或链接。

错误

状态错误触发条件
400unsupported_content该模型不支持读取这类文件。请从上表中选择支持的模型。
400invalid_url链接下载失败。错误消息会说明原因 (HTTP 状态、超时或链接内容不是媒体文件)。
400invalid_request_error某个内容部分不是 data URL 或 https 链接、内容为空,或属于模型不支持读取的类型 (Word、纯文本)。
413invalid_request_error单个文件超过 20 MB、媒体总大小超过 30 MB,或请求体超过 25 MB。

前两项是错误的 code;其余项是错误的 type,并附有说明如何修改的消息。这些错误都会在调用模型前返回,因此不产生费用。其他错误请参阅错误。

媒体如何计费

模型会将媒体转换为输入 token,按模型的输入价格计费。各家厂商的计算方式不同;以下是我们实测的典型数值:

ClaudeGPTGemini
一张 1024 × 1024 图片约 1,400 tokens约 1,250 至 1,650约 1,100
一张大尺寸照片 (12 MP)最高约 4,800随像素数增加约 1,100 至 1,200
一页 PDF约 1,600 至 2,500按页面文本计算约 560
一秒音频不支持读取不支持读取约 25
一秒视频不支持读取不支持读取约 100 至 300

请求日志会显示每次请求的准确用量。将图片缩小到所需尺寸,是最简单的省钱方法:对大多数模型来说,1024 px 图片的识别效果与 4000 px 图片相当。

需要在多次请求中发送同一张图片或同一份文档?将其放在对话靠前的位置,并保持这段前缀不变:支持提示词缓存的模型会按缓存价格对重复输入计费。

有疑问,或发现内容缺失?联系我们的支持团队,我们会通过邮件回复,通常只需一分钟。