向量化 - 多模态(DashScope 协议)
适用于多模态向量化模型(如 qwen3-vl-embedding)。支持文本、图片、视频的多模态融合向量化,采用 DashScope 原生协议。
请求体用 input.contents 数组承载多模态内容(与《文本向量-OpenAI格式》的 input 字符串写法不同),响应在 output.embeddings 里返回向量。
接口概述
- 输入模态:文本、图片(URL 或 Base64)、视频(URL),一个请求里可以混着传。
- 两种用法:
enable_fusion为true时把所有 content 融合成 一个 向量;不融合时每个 content 各出一个 向量,用type标注它是哪种模态。 - 同步返回,无需轮询。
接口地址
POST https://test.jw-info.com/v1/embeddings
请求头
| Header | 必填 | 说明 |
|---|---|---|
| Content-Type | 是 | 固定 application/json |
| Authorization | 是 | Bearer <你的 API Key>;也可用 x-api-key |
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型名称,如 qwen3-vl-embedding |
| input | object | 是 | 输入容器 |
| input.contents | array | 是 | 多模态内容数组,每个元素可包含 text、image、video |
| input.contents[].text | string | 否 | 文本内容 |
| input.contents[].image | string | 否 | 图片 URL 或 Base64 |
| input.contents[].video | string | 否 | 视频 URL |
| parameters | object | 否 | 向量控制参数 |
| parameters.enable_fusion | bool | 否 | 是否融合多模态向量。true:所有 content 融合为一个向量;false:每个 content 各生成一个向量。默认 false |
| parameters.dimension | integer | 否 | 输出向量维度,可选 2560(默认)、2048、1536、1024、768、512、256 |
| parameters.output_type | string | 否 | 向量输出格式,目前仅支持 dense |
| parameters.instruct | string | 否 | 自定义任务提示(建议英文),可小幅提升检索效果 |
| parameters.fps | float | 否 | 视频抽帧比例,取值 0~1,默认 1.0 |
注意:
enable_fusion默认是false。要拿到「整段内容合成一个向量」的效果,请显式传"enable_fusion": true;否则返回的向量个数与input.contents等长。
请求示例
多模态融合向量化(一个向量):
{
"model": "qwen3-vl-embedding",
"input": {
"contents": [
{"text": "商品描述文本"},
{"image": "https://example.com/img.png"},
{"video": "https://example.com/video.mp4"}
]
},
"parameters": {
"enable_fusion": true
}
}
各模态独立向量化(每个 content 一个向量):
{
"model": "qwen3-vl-embedding",
"input": {
"contents": [
{"text": "商品描述文本"},
{"image": "https://example.com/img.png"}
]
},
"parameters": {
"enable_fusion": false
}
}
响应参数
| 参数 | 类型 | 说明 |
|---|---|---|
| output | object | 输出信息 |
| output.embeddings | array | 向量结果列表 |
| output.embeddings[].embedding | array | 向量 float 数组,维度由 parameters.dimension 决定 |
| output.embeddings[].index | int | 对应输入 contents 数组下标 |
| output.embeddings[].type | string | 向量类型:融合模式下为 fusion;不融合模式下按模态为 text / image / video(多模态服务也可能统一标为 vl) |
| usage | object | 用量信息 |
| usage.input_tokens | int | 文本 token(含系统模板,不含图片视频) |
| usage.image_tokens | int | 图片 / 视频视觉部分消耗 token |
| usage.total_tokens | int | 总 token(= input_tokens + image_tokens) |
| request_id | string | 请求唯一标识,排障时提供 |
响应示例
融合响应(enable_fusion: true,所有 content 合并为一个向量):
{
"output": {
"embeddings": [{
"embedding": [0.0234, -0.0092, 0.0156],
"index": 0,
"type": "fusion"
}]
},
"usage": {
"image_tokens": 2186,
"input_tokens": 43,
"total_tokens": 2229
},
"request_id": "4d82fb3e-e9df-95f8-af*******90201fe"
}
不融合响应(enable_fusion: false,每个 content 各一个向量):
{
"output": {
"embeddings": [
{"embedding": [-0.0012, 0.0234], "index": 0, "type": "text"},
{"embedding": [-0.0098, 0.0156], "index": 1, "type": "image"}
]
},
"usage": {
"image_tokens": 1093,
"input_tokens": 12,
"total_tokens": 1105
},
"request_id": "4d82fb3e-e9d*****fa4490201fe"
}
实际返回的是完整维度的 float 数组(默认 2560 维),上例只展示前几维;不融合时
output.embeddings元素个数与input.contents一一对应。
用量与计费
- 按输入 token(
input_tokens+image_tokens)计费,人民币计价(精确到 0.000001 元,无最低消费),单价见模型广场对应卡片。 - 费用不进响应,到控制台「费用中心」查看明细。
- 拿不到用量统计的极少数情况会按估算用量计费,并在明细里标「估」便于对账。
错误响应
| 情况 | 说明 |
|---|---|
参数错误(缺 model、input 结构不对) | 按「错误码」页返回 |
{
"error": {
"message": "model is required",
"type": "invalid_request_error",
"code": "invalid_request_error"
}
}
完整状态码与处理方式见「错误码」页。
可用模型
| 模型 ID | 说明 |
|---|---|
| qwen3-vl-embedding | 文本 / 图片 / 视频多模态向量化,支持融合与不融合两种用法,默认 2560 维 |
更多向量模型见模型广场(筛选「文本向量」)。
代码示例(Python)
import requests
BASE = "https://test.jw-info.com"
API_KEY = "sk-你的密钥"
resp = requests.post(
f"{BASE}/v1/embeddings",
headers={"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"},
json={
"model": "qwen3-vl-embedding",
"input": {
"contents": [
{"text": "商品描述文本"},
{"image": "https://example.com/img.png"},
]
},
"parameters": {"enable_fusion": True, "dimension": 1024},
},
timeout=60,
)
result = resp.json()
if resp.status_code == 200:
embeddings = result["output"]["embeddings"]
print("向量个数:", len(embeddings))
for emb in embeddings:
print(f" [{emb['index']}] type={emb['type']}, dim={len(emb['embedding'])}")
print("用量:", result["usage"])
else:
print("请求失败:", result.get("error", result))