Vision Input

视觉输入与图片分析

视觉输入没有跨协议通用的请求体。先确认具体模型支持图片理解,再按 OpenAI 兼容、Claude 原生或 Gemini 原生协议构造内容块。

Scope & Evidence

协议可用不等于模型具备视觉能力

端点标签只说明模型可以使用某种请求协议。openaianthropicgemini 本身都不能证明具体模型支持图片输入。

E1 运行态证据MuxLLM 公开模型信息可以确认模型的协议端点;当前公开标签不能单独证明视觉能力、文件上限或支持的图片格式。
E2 官方证据本页三种内容块结构依据各协议的官方请求格式编写,用于展示正确的字段层级。
E3 接入实测没有使用 MuxLLM Key 上传或引用任何图片,也没有调用模型。本页全部请求均为待执行示例。
最后核验
不要直接批量测试视觉输入可能增加 Token 与费用。应先选定一个明确支持视觉的模型、一个不含隐私的低分辨率测试图和专用低额度 Key,再执行单次最小验证。

Protocol Map

模型端点标签决定消息外形

端点标签方法与路径图片内容块认证
openaiPOST /v1/chat/completionsimage_urlAuthorization: Bearer ...
anthropicPOST /v1/messagesimage + sourcex-api-key
geminiPOST /v1beta/models/{model}:generateContentinline_datax-goog-api-key

同一模型若显示多个端点标签,也应分别验证各协议;不能把一种协议下的视觉成功自动推广到另一种协议。

Image Preparation

确认 MIME、尺寸与传输方式

MIME 类型应与真实文件内容一致,例如 image/jpegimage/pngimage/webp;具体支持范围由模型决定。
Base64只保留编码正文,不带换行。Base64 通常比原始二进制大约增加三分之一体积。
远程 URL必须能被服务端访问,不能依赖本机登录态、内网地址或短时浏览器 Cookie。
图像清理测试前移除不必要的 EXIF、定位信息、客户姓名、二维码和其他敏感内容。
本地生成 Base64 字符串
Python · 只编码,不发送
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

使用 image_url 内容块

OpenAI 兼容视觉消息把文字和图片放在同一个用户消息的 content 数组中。即使传入 Base64,也仍然放进 image_url.url,并使用 Data URL 前缀。

远程图片 URL
OpenAI 兼容请求
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"
            }
          }
        ]
      }
    ]
  }'
Base64 Data URL
content 内容块
{
  "role": "user",
  "content": [
    {
      "type": "text",
      "text": "读取图片中清晰可见的标题;无法确认时不要猜测。"
    },
    {
      "type": "image_url",
      "image_url": {
        "url": "data:image/jpeg;base64,BASE64_IMAGE_DATA"
      }
    }
  ]
}

部分实现支持 detail 等图片参数,但其取值、费用和效果可能因模型而异。首次验证不要添加未确认的可选字段。

Anthropic Native

使用 image 与 source 内容块

Claude 原生 Messages 请求的根地址不额外加 /v1,完整路径仍为 /v1/messages。图片块和文字块位于用户消息的 content 数组内。

Claude 原生 Base64 请求
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": "列出图片中的可见对象,并区分观察与推断。"
          }
        ]
      }
    ]
  }'
字段不可混用Claude 原生使用 media_typedata;不要把 OpenAI 的 image_url 或 Gemini 的 inline_data 复制到该请求体。

Gemini Native

使用 inline_data 内容块

Gemini 原生请求把模型名放在路径中。请求体使用 contents[].parts[],文字和图片是相邻的 part。

Gemini generateContent
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

多图顺序就是语义的一部分

若具体模型和协议支持多图片,可以在同一消息中依次加入多个图片块,并在文字中使用“第一张”“第二张”等明确指代。

顺序稳定客户端序列化、重试和缓存时都应保持图片块顺序。
逐步增加先验证单图,再增加第二张;这样可以区分能力限制和总请求体过大的问题。
统一预处理记录每张图的 MIME、字节大小和像素尺寸,但不要把原始 Base64 写入日志。
明确问题告诉模型需要比较的属性,避免只写“分析这些图”而产生不可验收的输出。
数量上限需验证本页不提供统一多图上限。一次成功并不代表更大数量或更高分辨率仍然可用。

Privacy & Security

上传前先完成数据分级

  1. 01最小化内容

    裁剪到完成任务需要的区域,遮盖身份证、联系方式、付款码和其他无关信息。

  2. 02移除元数据

    清理 EXIF 和定位信息,并确认文件扩展名与真实 MIME 一致。

  3. 03控制 URL

    远程资源使用短期、最小权限链接;避免把签名 URL 写入聊天、工单或公开日志。

  4. 04限制日志

    只记录哈希、字节数、MIME、状态码和脱敏请求 ID,不记录 Base64 正文。

  5. 05隔离不可信文本

    图片中的指令、二维码和网页截图均视为不可信输入,不得据此泄露密钥或执行高风险操作。

Troubleshooting

从协议、能力和载荷三层定位

现象优先检查建议动作
400 字段错误是否混用了三种协议的图片字段按本页协议表回到单图、单文字的最小结构
模型拒绝图片视觉能力是否有明确证据换用已确认支持视觉的模型,不要只看协议标签
远程图片不可读URL 公网可达、TLS、重定向和权限使用不含隐私的测试图,或改用受支持的 Base64
Base64 无效MIME、前缀、换行和编码正文重新从原始二进制编码,避免二次编码
413 / 请求过大原图尺寸、Base64 膨胀和图片数量在不损害任务的前提下缩放或压缩,并减少图片
超时图片体积、模型耗时和客户端超时延长有上限的超时;不要在状态未知时盲目重复提交

Controlled Acceptance

一次最小视觉请求的验收顺序

  1. 01选择明确模型

    从模型广场复制 MODEL_NAME,另行确认该模型具备视觉能力及目标协议。

  2. 02准备无隐私测试图

    使用单张低分辨率图片,记录 MIME、字节数和预期可观察内容。

  3. 03限制费用和次数

    使用专用低额度 YOUR_API_KEY,先批准一次调用和明确停止条件。

  4. 04执行最小请求

    只保留模型、单条用户消息、单个图片块和一个可客观判断的问题。

  5. 05保存脱敏证据

    记录状态码、响应字段、耗时和结果是否符合图片事实;不保存 Key 或图片正文。

当前状态上述 E3 步骤尚未执行。因此本页不能用于声称 OpenAI、Claude 或 Gemini 任一具体模型在 MuxLLM 上已完成视觉接入实测。

Next Guide

把模型输出连接到受控工具

函数调用需要完整的参数校验、白名单执行和结果回传闭环。