视觉输入
带图请求把 content 从字符串换成数组,用内容块混排文字与图片。协议与 OpenAI 一致。
视觉输入指「看图回答」。它和图像生成是两件不同的事——生成类模型走各自的端点与计费方式, 请在模型详情页确认。
哪些模型支持
当前公开目录中声明了视觉能力的模型共 9 个:
gpt-5.6-luna、gpt-5.6-sol、gpt-5.6-terra、grok-4.20-0309-non-reasoning、grok-4.20-0309-reasoning、grok-4.20-multi-agent-0309、grok-4.3、grok-4.5、grok-4.6
清单来自构建期快照,会随目录变化,以 模型目录 的实时字段为准。向不支持视觉的模型传图片块,通常会报参数错误或图片被静默忽略。
消息体结构
纯文本请求里 content 是字符串;带图时改成数组, 每个元素是一个内容块,type 为 text 或 image_url。顺序会影响理解, 建议先给指令再给图。
用 URL 传图
curl https://chuanapi.com/v1/chat/completions \
-H "Authorization: Bearer $WANCHUAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_ID",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有哪些控件?"},
{"type": "image_url",
"image_url": {"url": "https://example.com/screenshot.png"}}
]
}]
}'URL 必须是公网可访问的直链。需要登录、带签名过期时间或只在内网可达的地址会拉取失败。 若图片存放在私有存储,请改用 base64。
用 base64 传图
import base64
from openai import OpenAI
client = OpenAI(api_key="...", base_url="https://chuanapi.com/v1")
with open("screenshot.png", "rb") as fp:
encoded = base64.b64encode(fp.read()).decode()
resp = client.chat.completions.create(
model="MODEL_ID",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有哪些控件?"},
{"type": "image_url", "image_url": {
# 注意 data URI 前缀要和真实图片类型一致
"url": f"data:image/png;base64,{encoded}",
}},
],
}],
)
print(resp.choices[0].message.content)base64 会让请求体膨胀约三分之一,大图容易撞上请求体大小限制。 本地图片、私有存储或一次性截图适合用它;重复使用的图片更适合先上传到可公开访问的位置再用 URL。
多图与图文混排
一条消息里可以放多张图,配合文字说明各图的角色。
"content": [
{"type": "text", "text": "左边是改版前,右边是改版后,列出布局差异"},
{"type": "image_url", "image_url": {"url": "https://example.com/before.png"}},
{"type": "image_url", "image_url": {"url": "https://example.com/after.png"}}
]图片数量越多,占用的输入 token 越多。做对比任务时,两三张通常已足够; 一次塞十几张既贵又容易让模型混淆。
成本与清晰度权衡
- 图片按视觉 token 计入输入侧费用,分辨率越高消耗越多。 换算规则与倍率见 计费说明。
- 截图类任务先裁掉无关区域,比整屏上传更省也更准。
- 需要识别小字(例如日志、报错弹窗)时不要过度压缩, 压过头会导致模型读错字符,反而要多轮追问。
- 多轮对话里历史图片会持续占用上下文。长会话应在拿到结论后移除旧图片块。