多模态对话(Anthropic Messages 协议)

接口概述

支持图片的视觉理解模型,兼容 Anthropic Messages 格式:把 messages[].content 从字符串换成内容块数组、放入图片即可,可对图片做描述、文字识别与多图对比。

POST https://test.jw-info.com/v1/messages
项目说明
输入类型文本 + 图片(本协议当前不支持音频与文件输入
图片写法image 内容块,源数据放 source(公网 URL 或 Base64 二选一)
图片格式image/jpegimage/pngimage/gifimage/webp
多图一次请求可放多张图(数组里多个 image 内容块),可做对比分析
纯文本用法不带图片的纯文本对话见「Anthropic 兼容-Messages」页
音频 / 文件需要音频或文件输入时,用「OpenAI 兼容-Chat(多模态)」或「OpenAI 兼容-Response(多模态)」页的写法

请求头

请求头是否必填说明
Content-Typeapplication/json请求体格式
x-api-key{API_KEY}也可以用 Authorization: Bearer {API_KEY}——同一把密钥的两种传法,不需要建两套密钥
anthropic-version2023-06-01建议携带,行为更稳定

与纯文本的区别

项目纯文本多模态
系统提示词顶层 system 字段同左
messages[].content字符串内容块数组(每个元素是一个 content block)
max_tokens必填必填
// 多模态:content 为内容块数组
{
  "model": "qwen3.7-plus",
  "system": "你是一个专业的图片分析助手。",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "描述这张图片" },
        {
          "type": "image",
          "source": {
            "type": "base64",
            "media_type": "image/jpeg",
            "data": "/9j/4AAQSkZJRg……"
          }
        }
      ]
    }
  ]
}
// 纯文本:content 仍是字符串(同样可用,详见「Anthropic 兼容-Messages」页)
{
  "model": "qwen3.7-plus",
  "system": "你是一个有用的助手。",
  "max_tokens": 1024,
  "messages": [
    { "role": "user", "content": "你好,请介绍一下你自己" }
  ]
}

Content 类型详解

type字段说明
texttext(string)文本内容
imagesource(object)图片源信息
image → sourcetype(string)源类型:base64url
image → sourcemedia_type(string)图片 MIME 类型:image/jpeg / image/png / image/gif / image/webp
image → sourcedata(string)图片的 Base64 编码数据(typebase64 时使用)
image → sourceurl(string)图片地址(typeurl 时使用)

其余请求参数(modeltemperaturetop_pstreamtools 等)与纯文本一致,见「Anthropic 兼容-Messages」页。

示例

1. 图片 URL 方式

curl https://test.jw-info.com/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: sk-你的密钥" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "qwen3.7-plus",
    "system": "你是一个专业的图片分析助手,请用中文回答。",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "这张图片里有什么?请详细描述。" },
          {
            "type": "image",
            "source": { "type": "url", "url": "https://example.com/sample.jpg" }
          }
        ]
      }
    ]
  }'
import base64

from anthropic import Anthropic

client = Anthropic(api_key="sk-你的密钥", base_url="https://test.jw-info.com/v1")


def describe_image(image_path: str, prompt: str = "描述这张图片") -> str:
    """发送图片给模型并获取描述"""
    with open(image_path, "rb") as f:
        image_data = base64.b64encode(f.read()).decode("utf-8")

    ext = image_path.rsplit(".", 1)[-1].lower()
    media_type = {"jpg": "image/jpeg", "jpeg": "image/jpeg", "png": "image/png",
                  "gif": "image/gif", "webp": "image/webp"}.get(ext, "image/jpeg")

    message = client.messages.create(
        model="qwen3.7-plus",
        system="你是一个专业的图片分析助手,请用中文回答。",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": [
                {"type": "text", "text": prompt},
                {"type": "image", "source": {"type": "base64",
                                             "media_type": media_type,
                                             "data": image_data}},
            ],
        }],
    )
    return message.content[0].text


print(describe_image("photo.png", "这张图片中有什么物体?"))

2. 图片 Base64 方式

curl https://test.jw-info.com/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: sk-你的密钥" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "qwen3.7-plus",
    "system": "你是一个 OCR 识别助手。",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "请识别这张图片中的所有文字。" },
          {
            "type": "image",
            "source": {
              "type": "base64",
              "media_type": "image/png",
              "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
            }
          }
        ]
      }
    ]
  }'

本地图片先编码再发送:

import base64


def local_image_block(image_path: str, mime: str = "image/jpeg") -> dict:
    """本地图片 -> Anthropic image 内容块"""
    with open(image_path, "rb") as f:
        data = base64.b64encode(f.read()).decode("utf-8")
    return {"type": "image",
            "source": {"type": "base64", "media_type": mime, "data": data}}

3. 多图对比

curl https://test.jw-info.com/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: sk-你的密钥" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "qwen3.7-plus",
    "system": "你是一个专业的图片对比分析助手。",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "请对比这两张图片,分析它们的异同。" },
          { "type": "image", "source": { "type": "url", "url": "https://example.com/image1.jpg" } },
          { "type": "image", "source": { "type": "url", "url": "https://example.com/image2.jpg" } }
        ]
      }
    ]
  }'
# 与示例 1 相同,只是 content 数组里放多个 image 内容块
content = [
    {"type": "text", "text": "请对比这两张图片,分析它们的异同。"},
    {"type": "image", "source": {"type": "url",
                                 "url": "https://example.com/image1.jpg"}},
    {"type": "image", "source": {"type": "url",
                                 "url": "https://example.com/image2.jpg"}},
]

4. 纯文本(兼容模式)

纯文本对话仍然支持把 content 直接写成字符串,无需数组形式(完整参数见「Anthropic 兼容-Messages」页):

{
  "model": "qwen3.7-plus",
  "system": "你是一个有用的助手。",
  "max_tokens": 1024,
  "messages": [
    { "role": "user", "content": "你好,请介绍一下你自己" }
  ]
}

响应格式

响应格式与纯文本 Anthropic Messages 相同。

字段类型说明
idstring本次请求的唯一标识
typestring固定 message
rolestring固定 assistant
modelstring实际使用的模型名称
contentarray内容块数组
content[].typestringtext(正文)/ thinking(思考过程)/ tool_use(工具调用)
content[].textstringtypetext 时的正文
stop_reasonstring停止原因:end_turn / max_tokens / stop_sequence / tool_use
stop_sequencestring触发的停止词(stop_reasonstop_sequence 时出现)
usage.input_tokensinteger输入 token 数(图片会折算成输入 token)
usage.output_tokensinteger输出 token 数

成功响应:

{
  "id": "msg_xxxxxxxxxxxxx",
  "type": "message",
  "role": "assistant",
  "model": "qwen3.7-plus",
  "content": [
    {
      "type": "text",
      "text": "这张图片展示了一座位于海边的灯塔,天空晴朗,海浪轻轻拍打着礁石……"
    }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": { "input_tokens": 150, "output_tokens": 80 }
}

流式响应(stream: true)事件顺序:

event: message_start
event: content_block_start
event: content_block_delta   # 多次,delta.text 为增量文本
event: content_block_stop
event: message_delta         # 最终用量在这里(usage.output_tokens)
event: message_stop
event: message_start
data: {"type":"message_start","message":{"id":"msg_xxx","type":"message","role":"assistant","content":[],"usage":{}}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"这张"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"图片"}}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"input_tokens":150,"output_tokens":80}}

event: message_stop
data: {"type":"message_stop"}

message_start 里的 usage 可能是空对象,最终用量以 message_delta 为准

错误格式

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "Invalid image source: unsupported media type"
  }
}
错误类型说明
invalid_request_error请求参数错误
invalid_image_source图片源无效或格式不支持
rate_limit_error请求频率超限
context_length_exceededToken 数量超出模型限制
authentication_error密钥无效或已禁用

状态码与错误处理约定见「错误码」页。

可用模型

以下模型均支持图片输入,模型名照模型广场的写法传入:

模型供应商上下文说明
qwen3.7-plus通义千问128K旗舰多模态模型
qwen3.6-plus通义千问128K高性能多模态
qwen3.6-flash通义千问128K轻量快速多模态
qwen3.5-plus通义千问128K上一代旗舰
qwen3.5-flash通义千问128K上一代轻量版
qwen3.5-122b-a10b通义千问128K大参数 MoE 模型
qwen3.5-397b-a17b通义千问128K超大参数 MoE 模型
qwen3.5-35b-a3b通义千问128K轻量 MoE 模型
minimax-m3MiniMax128KMiniMax 多模态模型
doubao-seed-2.0-pro豆包128K豆包旗舰多模态
doubao-seed-2.0-lite豆包128K豆包轻量多模态
doubao-seed-2.0-mini豆包128K豆包极速多模态
kimi-k3月之暗面128KKimi 旗舰多模态
kimi-k2.7-code月之暗面128KKimi 代码多模态
kimi-k2.6月之暗面128KKimi 多模态
kimi-k2.5月之暗面128KKimi 多模态

以上模型同样支持纯文本对话(见「Anthropic 兼容-Messages」页)。模型广场上带「视觉理解」标签的模型都支持图片输入。

注意事项

  • 协议支持度是模型级的:个别模型不支持本协议,调用会返回错误并说明原因——换支持该协议的模型,或改用 /v1/chat/completions 调同一个模型即可,模型名与计费都不变。
  • 本协议只收文本与图片:传音频、文件会返回参数错误;需要这两类输入请用「OpenAI 兼容-Chat(多模态)」或「OpenAI 兼容-Response(多模态)」页的写法。
  • 图片地址需公网可直接访问;地址不可达或格式不受支持时会返回图片相关错误。
  • 单张图片不宜过大:过大的图会显著增加输入 token 消耗,必要时先压缩或缩放。

计费

  • 图片会折算成输入 token,与文本一起按模型的输入单价计费;输出按输出单价计费。
  • 每次调用的费用记入控制台「费用中心」,接口响应本身不返回费用信息。
  • 账户余额不足时调用前直接返回 402,请管理员在控制台「费用中心」手工授信。

在模型广场查看支持「视觉理解」的模型 →