概述
CMR 是 AI 网关。CMR Embedding API 通过统一的接口和鉴权方式,为不同上游 Embedding 模型提供模型访问、请求转发、协议适配、路由与限流等网关能力。CMR 本身不生成向量。向量由实际调用的上游模型生成;输入限制、向量维度、输出形式、向量质量和模型效果均以所选模型的能力为准。文本和多模态请求使用同一个入口:
POST /v1/embeddings
请求形式 | input 填写方式 | 说明 |
单条文本 | string | 为一条文本生成向量 |
批量文本 | string[] | 一次为多条文本生成向量 |
单组图文内容 | object | 在一组输入中组合文本和图片 |
前提条件
2. 已创建模型路由实例,详细操作指导请参见 创建模型路由实例。
3. 已创建 BYOK 实例,详细操作指导请参见 创建 BYOK 实例。
4. 已创建模型路由访问密钥(API Key),详细操作指导请参见 创建模型路由访问密钥。
5. 已完成向量嵌入模型关联和模型路由策略配置,详细操作指导请参见 配置模型调度管理。
接口地址与鉴权
请求地址
POST {CMR_BASE_URL}/v1/embeddings
CMR_BASE_URL 为 CMR 实例的访问地址,请以控制台展示为准。
请求头
Header | 必填 | 说明 |
Authorization | 是 | Bearer <CMR_API_KEY> |
Content-Type | 是 | 固定为 application/json |
快速开始
cURL
curl --request POST "${CMR_BASE_URL}/v1/embeddings" \\--header "Authorization: Bearer ${CMR_API_KEY}" \\--header "Content-Type: application/json" \\--data '{"model": "cmr-text-embedding","input": "今天深圳的天气很好"}'
Python
import osimport requestsresponse = requests.post(f"{os.environ['CMR_BASE_URL']}/v1/embeddings",headers={"Authorization": f"Bearer {os.environ['CMR_API_KEY']}","Content-Type": "application/json",},json={"model": "cmr-text-embedding","input": "今天深圳的天气很好",},timeout=30,)response.raise_for_status()result = response.json()print(result["data"][0]["embedding"])
请求参数
基本参数
参数 | 类型 | 必填 | 说明 |
model | string | 是 | CMR 逻辑模型名称或模型别名。可用值以控制台关联模型为准 |
input | string | string[] | object | 是 | 需要生成向量的文本或图文内容 |
dimensions | integer | 否 | 期望的 Dense 向量维度。仅在所选模型支持可变维度时生效 |
encoding_format | string | 否 | Dense 向量的返回编码,常用值为 float 或 base64,以所选模型支持情况为准 |
user | string | 否 | 终端用户标识,可用于业务追踪或上游风控。请勿传入密码、Token 等敏感信息 |
文本输入
单条文本:
{"model": "cmr-text-embedding","input": "查询文本"}
批量文本:
{"model": "cmr-text-embedding","input": ["Query: 如何重置密码?", "Document: 在账户安全页面选择重置密码。"]}
批量请求时,可通过响应中的 data[].index 将向量与输入项对应。
多模态输入
支持在一组输入中组合文本和图片。input 按下表填写:
参数 | 类型 | 必填 | 说明 |
input.type | string | 是 | 固定为 multimodal |
input.content | object[] | 是 | 同一组输入中的文本和图片内容 |
input.content[].type | string | 是 | 文本内容填 text,图片内容填 image_url |
input.content[].text | string | 当 type=text 时必填 | 文本内容 |
input.content[].image_url | object | 当 type=image_url 时必填 | 图片输入对象 |
input.content[].image_url.url | string | 当 type=image_url 时必填 | 图片输入值。该值不限于 HTTP/HTTPS URL;可填写的格式(如公网 URL、Data URL 等)以所选上游模型的支持情况为准,CMR 按请求值透传 |
请求示例:
{"model": "cmr-multimodal-embedding","input": {"type": "multimodal","content": [{"type": "text","text": "红色跑鞋"},{"type": "image_url","image_url": {"url": "https://example.com/red-shoe.jpg"}}]},"encoding_format": "float"}
上例仅演示使用公网 URL 传入图片。其他图片格式是否可用,请查看所选上游模型的说明。当前标准请求不支持视频、多组多模态输入,也不支持在顶层直接混用文本和图片数组。
Provider 自定义请求参数
CMR Standard 字段包括 model、input、dimensions、encoding_format 和 user。如需传入 input_type、instruction 等 CMR Standard 之外的 Provider 参数,可配置自定义字段透传。
例如,已放通 input_type 时:
{"model": "cmr-text-embedding","input": "如何重置密码?","input_type": "query"}
自定义参数的名称、类型和含义以当前 Provider 为准。更换模型或 Provider 前,请确认相同参数仍然适用。
响应参数
基本响应字段
参数 | 类型 | 是否一定返回 | 说明 |
id | string | 是 | 本次 Embedding 请求的标识 |
created | integer | 是 | 响应创建时间,为 Unix 时间戳,单位为秒 |
object | string | 是 | 固定为 list |
data | object[] | 是 | 向量结果列表 |
model | string | 是 | 请求中使用的 CMR 逻辑模型名称 |
usage | object | 否 | 上游模型返回的用量信息。上游未提供时,响应中可能没有该字段 |
响应向量结果
参数 | 类型 | 是否一定返回 | 说明 |
data[].object | string | 是 | 固定为 embedding |
data[].index | integer | 是 | 结果对应的输入序号,从 0 开始 |
data[].embedding | number[] | string | 否 | Dense 向量。使用编码输出时可能为字符串 |
data[].sparse_embedding | object[] | 否 | Sparse 向量,只列出非零位置及其权重 |
data[].multi_embedding | number[][] | string | object | 否 | Multi-vector 结果。具体形式以所选模型的返回值为准 |
每个 data[] 结果至少包含 Dense、Sparse 或 Multi-vector 中的一种。所选模型支持时,同一个结果可同时包含多种向量。
sparse_embedding 中每个元素的含义如下:
参数 | 类型 | 是否一定返回 | 说明 |
index | integer | 是 | 非零维度的下标 |
value | number | 是 | 该维度的权重 |
token | string | 否 | 上游模型返回的对应 Token |
Provider 自定义响应参数
除上述字段外,响应中可能保留上游 Provider 返回的额外信息。例如:
响应顶层的 request_id;
data[] 中表示向量类型的 type。
这些字段以实际响应为准,更换模型或 Provider 后可能不再返回或含义发生变化。
响应示例
以下示例仅展示字段形式,向量值、向量维度和 Token 用量以实际返回为准。
Dense 向量
{"id": "emb-7f3a2c10","created": 1787385661,"object": "list","data": [{"object": "embedding","index": 0,"embedding": [0.012, -0.034, 0.021]}],"model": "cmr-text-embedding","usage": {"prompt_tokens": 4,"total_tokens": 4}}
Dense + Sparse 向量
{"id": "emb-a1b2c3d4","created": 1787385661,"object": "list","data": [{"object": "embedding","index": 0,"embedding": [0.018, -0.041, 0.007],"sparse_embedding": [{"index": 18452,"value": 0.73,"token": "数据库"}]}],"model": "cmr-hybrid-embedding","usage": {"total_tokens": 9},"request_id": "provider-request-id"}
Dense + Multi-vector
{"id": "emb-9e8d7c6b","created": 1787385661,"object": "list","data": [{"object": "embedding","index": 0,"embedding": [0.016, -0.028, 0.031],"multi_embedding": [[0.021, -0.013, 0.009],[0.008, 0.034, -0.017]]}],"model": "cmr-multimodal-embedding"}
错误响应
CMR Embedding API 使用统一的错误响应形式:
{"error": {"message": "Invalid input: input is required.","type": "invalid_request_error","param": "input","code": "400"}}
参数 | 说明 |
error.message | 错误说明 |
error.type | 错误类型;具体值可能随错误来源而不同 |
error.param | 与错误相关的请求参数;无明确参数时可能为空 |
error.code | 错误码。当前常见为字符串形式的 HTTP 状态码 |
CMR 可能在错误中保留已安全处理的上游附加信息。客户端应优先根据 HTTP 状态码处理失败,不要依赖上游错误文案始终不变。
常见 HTTP 状态码:
HTTP 状态码 | 常见场景 | 建议 |
400 | JSON 或参数格式错误、输入类型不支持、CMR 逻辑模型名称无效,或上游模型拒绝当前参数 | 修正请求,不要盲目重试 |
401 | API Key 无效或已失效,或上游鉴权失败 | 检查 API Key 和相关凭证 |
403 | API Key 缺失、鉴权头格式错误,或无权访问当前 CMR 实例、模型或上游资源 | 检查 Authorization Header 和权限配置 |
404 | 上游模型、资源或接口路径不存在 | 检查所选模型及 Provider 配置 |
408 | 请求或上游调用超时 | 在业务允许时重试 |
429 | CMR 限流、上游配额超限,或当前暂无可用部署 | 参考 Retry-After(如存在)并使用退避策略重试 |
500 | CMR 内部错误,或 CMR 连接上游失败 | 记录请求标识并联系支持人员 |
502 | 上游响应无效,或响应与当前协议配置不匹配 | 使用退避策略重试;持续出现时联系支持人员 |
503 | 上游服务或当前协议配置暂不可用 | 使用退避策略重试 |
504 | 上游网关超时 | 使用退避策略重试 |