通义千问多模态模型(如Qwen-VL系列)需将文本与图片封装于单条user消息的content列表中,支持text/image_url/image类型元素组合,并严格遵循Base64编码或SDK自动处理规范。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您尝试调用通义千问多模态模型(如Qwen-VL系列)但无法正确传递文本与图片混合内容,则可能是由于消息结构不符合OpenAI兼容协议或Base64编码格式不规范所致。以下是实现多模态输入统一处理的具体方法:
一、构造符合OpenAI协议的messages数组
通义千问多模态API(如qwen-vl-plus)要求用户将文本与图像以结构化数组形式封装在单条user消息中,确保模型能识别不同类型的内容单元。该方式是官方推荐的统一输入范式,适用于所有支持vision的模型版本。
1、准备原始图片文件路径,例如/path/to/photo.jpg。
2、使用Python读取图片并编码为Base64字符串:
import base64
with open("/path/to/photo.jpg", "rb") as f:
image_base64 = base64.b64encode(f.read()).decode("utf-8")
3、构建messages参数,其中content为列表,按顺序包含text类型与image_url类型元素:
{"role": "user", "content": [
{"type": "text", "text": "请描述这张图片中的场景和人物动作"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64," + image_base64}}
]}
4、将该messages对象作为请求体传入DashScope SDK或OpenAI兼容客户端。
二、使用OpenClaw网关进行自动格式转换
OpenClaw可屏蔽底层编码细节,将本地图片路径、URL或二进制流自动转换为标准Base64嵌入格式,并统一注入messages结构。该方案适合需要批量处理多图或多轮交互的开发场景。
1、确认OpenClaw网关已启动且配置指向qwen-vision提供方:
openclaw gateway status
2、通过HTTP POST向http://localhost:8000/v1/chat/completions发送原始请求体:
{"model": "qwen-vl-plus",
"messages": [{"role": "user", "content": "这张截图里显示了什么错误?"}],
"images": ["/Users/me/Desktop/error.png"]}
3、OpenClaw自动读取指定路径图片,完成Base64编码与content数组组装,再转发至后端Qwen服务。
4、响应结果与标准API一致,无需额外解析逻辑。
三、通过DashScope SDK的高级参数直接传入PIL图像对象
DashScope Python SDK v1.22.0+支持将PIL.Image.Image实例直接作为content元素传入,SDK内部自动执行格式校验、尺寸归一化与Base64编码,避免手动处理图像元数据带来的兼容性风险。
1、安装满足版本要求的SDK:
pip install dashscope>=1.22.0
2、加载图像并构造消息:
from PIL import Image
from dashscope import MultiModalConversation
img = Image.open("/path/to/photo.jpg")
messages = [
{"role": "user",
"content": [
{"type": "text", "text": "分析图像中是否存在交通标志"},
{"type": "image", "image": img}
]}
]
3、调用MultiModalConversation.call接口:
response = MultiModalConversation.call(model="qwen-vl-plus", messages=messages)
4、检查response.output.choices[0].message.content是否返回有效文本结果。
四、在前端JavaScript中通过File API动态构建混合输入
浏览器环境无法直接读取本地文件系统路径,需借助File API获取用户选择的图片文件,再通过Blob URL或内存Base64编码方式注入messages结构,实现纯前端多模态输入。
1、在HTML中添加文件选择控件:
2、监听change事件并读取文件:
document.getElementById('imageUpload').addEventListener('change', async (e) => {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = async () => {
const base64String = reader.result.split(',')[1];
const messages = [{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有什么动物?"},
{"type": "image_url", "image_url": {"url": "data:" + file.type + ";base64," + base64String}}
]
}];
// 后续发起fetch请求
};
reader.readAsDataURL(file);
});
3、使用fetch发送请求,注意设置Content-Type: application/json及携带DASHSCOPE_API_KEY请求头。
4、接收JSON响应并提取response.choices[0].message.content字段展示结果。
五、采用curl命令行一次性提交文本与Base64图像
对于调试或CI/CD流水线中的轻量调用,可完全脱离编程语言依赖,使用curl组合JSON载荷与内联Base64图像数据,验证服务连通性与输入格式正确性。
1、在终端中执行Base64编码命令(Linux/macOS):
IMAGE_BASE64=$(base64 -i /path/to/photo.jpg | tr -d '\n')
2、构造完整JSON载荷并保存为payload.json:
{
"model": "qwen-vl-plus",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "图中人物穿的是什么颜色的衣服?"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,'$IMAGE_BASE64'"}}
]
}],
"max_tokens": 512
}
3、执行curl调用:
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d @payload.json
4、查看返回的output.text字段确认模型是否成功理解图文混合语义。


















