Scope & Evidence
协议可用不等于模型具备视觉能力
端点标签只说明模型可以使用某种请求协议。openai、anthropic 或 gemini 本身都不能证明具体模型支持图片输入。
Vision Input
视觉输入没有跨协议通用的请求体。先确认具体模型支持图片理解,再按 OpenAI 兼容、Claude 原生或 Gemini 原生协议构造内容块。
Scope & Evidence
端点标签只说明模型可以使用某种请求协议。openai、anthropic 或 gemini 本身都不能证明具体模型支持图片输入。
Protocol Map
| 端点标签 | 方法与路径 | 图片内容块 | 认证 |
|---|---|---|---|
| openai | POST /v1/chat/completions | image_url | Authorization: Bearer ... |
| anthropic | POST /v1/messages | image + source | x-api-key |
| gemini | POST /v1beta/models/{model}:generateContent | inline_data | x-goog-api-key |
同一模型若显示多个端点标签,也应分别验证各协议;不能把一种协议下的视觉成功自动推广到另一种协议。
Image Preparation
image/jpeg、image/png 或 image/webp;具体支持范围由模型决定。import base64
from pathlib import Path
image_bytes = Path("example.jpg").read_bytes()
base64_image = base64.b64encode(image_bytes).decode("ascii")
print("编码字符数:", len(base64_image))
OpenAI Compatible
OpenAI 兼容视觉消息把文字和图片放在同一个用户消息的 content 数组中。即使传入 Base64,也仍然放进 image_url.url,并使用 Data URL 前缀。
curl https://api.muxllm.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_NAME",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "描述图片中的主体,并指出不确定之处。"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/non-sensitive-image.jpg"
}
}
]
}
]
}'
{
"role": "user",
"content": [
{
"type": "text",
"text": "读取图片中清晰可见的标题;无法确认时不要猜测。"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,BASE64_IMAGE_DATA"
}
}
]
}
部分实现支持 detail 等图片参数,但其取值、费用和效果可能因模型而异。首次验证不要添加未确认的可选字段。
Anthropic Native
Claude 原生 Messages 请求的根地址不额外加 /v1,完整路径仍为 /v1/messages。图片块和文字块位于用户消息的 content 数组内。
curl https://api.muxllm.com/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_NAME",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "BASE64_IMAGE_DATA"
}
},
{
"type": "text",
"text": "列出图片中的可见对象,并区分观察与推断。"
}
]
}
]
}'
media_type 和 data;不要把 OpenAI 的 image_url 或 Gemini 的 inline_data 复制到该请求体。Gemini Native
Gemini 原生请求把模型名放在路径中。请求体使用 contents[].parts[],文字和图片是相邻的 part。
curl https://api.muxllm.com/v1beta/models/MODEL_NAME:generateContent \
-H "x-goog-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{
"text": "描述图片中的布局;不清楚的文字标记为无法辨认。"
},
{
"inline_data": {
"mime_type": "image/jpeg",
"data": "BASE64_IMAGE_DATA"
}
}
]
}
]
}'
部分 Gemini SDK 可能把 REST 字段映射为不同语言风格的属性名。使用 SDK 时以该 SDK 当前类型定义为准;直接发送 JSON 时保持网关接受的 REST 字段结构。
Multiple Images
若具体模型和协议支持多图片,可以在同一消息中依次加入多个图片块,并在文字中使用“第一张”“第二张”等明确指代。
Privacy & Security
裁剪到完成任务需要的区域,遮盖身份证、联系方式、付款码和其他无关信息。
清理 EXIF 和定位信息,并确认文件扩展名与真实 MIME 一致。
远程资源使用短期、最小权限链接;避免把签名 URL 写入聊天、工单或公开日志。
只记录哈希、字节数、MIME、状态码和脱敏请求 ID,不记录 Base64 正文。
图片中的指令、二维码和网页截图均视为不可信输入,不得据此泄露密钥或执行高风险操作。
Troubleshooting
| 现象 | 优先检查 | 建议动作 |
|---|---|---|
| 400 字段错误 | 是否混用了三种协议的图片字段 | 按本页协议表回到单图、单文字的最小结构 |
| 模型拒绝图片 | 视觉能力是否有明确证据 | 换用已确认支持视觉的模型,不要只看协议标签 |
| 远程图片不可读 | URL 公网可达、TLS、重定向和权限 | 使用不含隐私的测试图,或改用受支持的 Base64 |
| Base64 无效 | MIME、前缀、换行和编码正文 | 重新从原始二进制编码,避免二次编码 |
| 413 / 请求过大 | 原图尺寸、Base64 膨胀和图片数量 | 在不损害任务的前提下缩放或压缩,并减少图片 |
| 超时 | 图片体积、模型耗时和客户端超时 | 延长有上限的超时;不要在状态未知时盲目重复提交 |
Official Sources
Controlled Acceptance
从模型广场复制 MODEL_NAME,另行确认该模型具备视觉能力及目标协议。
使用单张低分辨率图片,记录 MIME、字节数和预期可观察内容。
使用专用低额度 YOUR_API_KEY,先批准一次调用和明确停止条件。
只保留模型、单条用户消息、单个图片块和一个可客观判断的问题。
记录状态码、响应字段、耗时和结果是否符合图片事实;不保存 Key 或图片正文。
Next Guide
函数调用需要完整的参数校验、白名单执行和结果回传闭环。