跳到主要内容

图片输入(视觉)

模型页面 Capabilities 一行列有 image input 的对话模型能看懂图片:截图、照片、图表、扫描件。图片和问题放在同一条消息里。

下面的示例是一个真实的文件,发布前我们都会实际运行一遍:

# pip install openai
# Send an image with the question. Any chat model whose page lists vision
# takes images; give a public https URL, or the file itself as a data URL.
import os
from openai import OpenAI

client = OpenAI(
base_url=os.getenv("OCEANTOKEN_BASE_URL", "https://api.oceantoken.ai/v1"),
api_key=os.environ["OCEANTOKEN_API_KEY"],
)

response = client.chat.completions.create(
model="openai/gpt-5-mini",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What does the large text in this image say?"},
{"type": "image_url", "image_url": {"url": "https://docs.oceantoken.ai/img/oceantoken-og.png"}},
],
}
],
)
print(response.choices[0].message.content)

怎样发送图片​

content 从字符串变成一个由多个部分组成的列表:text 部分和 image_url 部分,按你希望模型阅读的顺序排列。图片可以是:

  • 一个公开的 https:// URL,由模型去获取;或者
  • 以 data URL 形式(data:image/png;base64,...)直接发送文件本身,适用于本地文件或需要登录才能访问的文件。
import base64

with open("receipt.jpg", "rb") as f:
data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()

messages = [{
"role": "user",
"content": [
{"type": "text", "text": "这张小票的总金额是多少?"},
{"type": "image_url", "image_url": {"url": data_url}},
],
}]

PNG、JPEG 和 WebP 是稳妥的格式。要发多张图片,就在同一条消息里加多个 image_url 部分。

限制​

  • 整个请求最大 10 MB(限制)。base64 会让文件变大约三分之一,所以大图请用 URL 发送,而不是 data URL。
  • 每个模型对单个请求的图片数量都有上限,对话中之前每一轮的图片都计算在内。超过上限时,请求会以 400 invalid_request 被拒绝,消息里会写明上限;请删掉较早的图片,比如智能体以前截的屏。没有 image input 能力的模型完全不能读图。
  • 图片按输入 token 计费。 一张图片算多少 token 取决于模型和图片尺寸;请求的 usage.prompt_tokens 和它在 日志 中的记录会显示实际数量。

使用 Anthropic Messages API​

在 /v1/messages 上,图片是 Anthropic 格式的一个块,所有支持图片输入的对话模型都适用:

{"type": "image", "source": {"type": "url", "url": "https://example.com/chart.png"}}

直接发送文件本身时,写成 "source": {"type": "base64", "media_type": "image/png", "data": "..."}。

下一步​

  • 要生成或编辑图片,而不是读图,请看图像。
  • 控制台的对话也能发图片,写代码之前可以先在那里试模型。