# 视觉输入

> 图片以 URL 或 data URL(base64)传入的两种写法,以及体积与格式约束。

多模态模型接受图片输入。OpenAI 协议里图片是一个 `image_url` 内容块:

## 传公网 URL

```python
resp = client.chat.completions.create(
    model="gpt-5.4",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "这张图里有什么?"},
            {"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}},
        ],
    }],
)
```

## 传 base64(data URL)

```python
import base64, pathlib

data = base64.b64encode(pathlib.Path("cat.jpg").read_bytes()).decode()
resp = client.chat.completions.create(
    model="gpt-5.4",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "描述这张图"},
            {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{data}"}},
        ],
    }],
)
```

## 注意事项

- **格式**:`image/jpeg`、`image/png`、`image/webp` 最稳妥;SVG 通常不被接受
- **体积**:base64 会让请求体膨胀约 1/3。大图先缩放到长边 1024–2048px
- **URL 可达性**:上游厂商需要能访问你给的 URL,内网地址和预签名过期链接会失败
- **模型能力**:不是所有模型都支持图片输入,不支持的模型会返回明确错误而不是忽略图片

<Callout type="info" title="Anthropic / Gemini 协议的图片形态">
用 Anthropic 协议时图片是 `{"type":"image","source":{"type":"base64",...}}`;用 Gemini 协议时是
`inline_data` / `file_data`。网关按入站协议解释,再映射到目标厂商 —— 见[协议互转](/zh/guides/protocol-interop/)。
</Callout>
