对话
图像、PDF、音频和视频输入
对于支持相应输入的模型,可以在消息中加入图片、PDF、音频和视频。可发送文件本身 (base64) 或链接:我们会自行获取链接中的文件,因此任何公开可访问、文件不超过 20 MB 的 https 链接都可以使用。
速览
每个内容部分都支持公开的 https 链接,也支持以 base64 data URL 形式直接传入文件,例如 data:application/pdf;base64,JVBERi0...。一条消息可以包含多个文件,只要模型支持对应类型,就可以任意混合。
各模型支持的输入类型
所有对话模型都支持文本输入。下表实时显示各模型当前支持的输入类型。如果传入模型不支持的内容,请求会立即被拒绝并返回 unsupported_content,因此模型不会对未读取的文件作答。
图片
添加一个 image_url 内容部分,传入链接或 data URL。支持 PNG, JPEG, WebP 和 GIF。所有支持图片输入的模型都支持在一条消息中接收多张图片。
import osfrom openai import OpenAIclient = 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, osfrom openai import OpenAIclient = 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)。
添加一个 file 内容部分,在 file_data 中传入 PDF 的 data URL,并提供文件名。模型会读取文本;如果支持,也会将页面作为图片读取(图表、扫描件、表格)。也可以在 file_data 中传入公开链接。
import base64, osfrom openai import OpenAIclient = 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 osfrom pathlib import Pathfrom openai import OpenAIclient = 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, osfrom openai import OpenAIclient = 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 osfrom openai import OpenAIclient = 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:
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、音频和视频。也可以在文件之间插入文本内容部分,为文件添加说明。
链接
- 链接必须是可公开访问的
httpsURL。我们最多跟随 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." }]限制
文件较大时,请发送链接:链接不计入请求体大小。不能使用上传到模型厂商自有 Files API (file_id) 的文件;请直接发送文件或链接。
错误
前两项是错误的 code;其余项是错误的 type,并附有说明如何修改的消息。这些错误都会在调用模型前返回,因此不产生费用。其他错误请参阅错误。
媒体如何计费
模型会将媒体转换为输入 token,按模型的输入价格计费。各家厂商的计算方式不同;以下是我们实测的典型数值:
请求日志会显示每次请求的准确用量。将图片缩小到所需尺寸,是最简单的省钱方法:对大多数模型来说,1024 px 图片的识别效果与 4000 px 图片相当。
有疑问,或发现内容缺失?联系我们的支持团队,我们会通过邮件回复,通常只需一分钟。