支持 vision 的模型可以在一次请求里同时接收图片和文字。你可以把图片交给模型,让它描述画面、识别其中的文字(OCR)、看懂界面截图、流程图或图表,也可以从拍照的表格里把数据读出来。
底层用的还是和普通对话一样的 OpenAI 兼容端点。唯一变化的是 content 字段:不再传一个字符串,而是传一个由若干部分组成的数组 —— 文本块 {"type": "text"} 和图片块 {"type": "image_url"}。
通过公开链接传图
最简单的情况 —— 图片已经在网上,有直接可访问的 URL。
from openai import OpenAI
client = OpenAI(
api_key="sk-你的密钥",
base_url="https://www.ruapi.ai/v1",
)
response = client.chat.completions.create(
model="claude-opus-4-8", # vision 模型;准确名称见价格页
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "图里是什么?请简要描述。"},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg"
},
},
],
}
],
)
print(response.choices[0].message.content)
本地文件用 base64
如果图片无法公开访问(截图、磁盘上的照片),就把它编码成 base64,以 data:image/jpeg;base64,... 这种 data URI 形式传入。
import base64
from openai import OpenAI
client = OpenAI(
api_key="sk-你的密钥",
base_url="https://www.ruapi.ai/v1",
)
# 把本地文件编码成 base64
with open("screenshot.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode("utf-8")
data_uri = f"data:image/jpeg;base64,{b64}"
response = client.chat.completions.create(
model="claude-opus-4-8",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "识别这张截图里的所有文字。"},
{"type": "image_url", "image_url": {"url": data_uri}},
],
}
],
)
print(response.choices[0].message.content)
PNG 把前缀改成 data:image/png;base64,,WebP 用 data:image/webp;base64,。MIME 类型必须和文件的真实格式一致。
注意事项
图片会计入输入 token,分辨率越高,请求越贵。如果不需要看清细节,发送前先把图缩小(比如长边压到 1024–1568 px)。
base64 字符串比原文件大约大三分之一,而且整段都塞进请求体里。对于体积大的图片,用公开链接比传几兆字节的 data URI 更稳妥 —— 否则可能撞上请求体积上限。
通常是 jpeg、png、webp 和 gif。HEIC、TIFF、SVG 等冷门格式建议先转换成上述之一。
接下来
- 快速入门 —— 注册、密钥和第一个请求
- 错误及解决办法 —— 遇到 400 / 413 / 415 等状态码时怎么办