AI 模型接口嵌入(Embeddings)原生OpenAI格式
嵌入(Embeddings)
通过 EasyRouter 统一接口调用 Vertex AI 和 AWS Bedrock 的 Embedding 模型
将文本转换为向量嵌入。兼容 OpenAI Embeddings API,现有 OpenAI SDK 可直接接入,无需修改代码。
支持的模型
| 模型 | 供应商 | 向量维度 | 批量上限 | 支持 dimensions |
|---|---|---|---|---|
gemini-embedding-001 | Google Vertex AI | 3072 | 1(单条) | 否 |
text-embedding-004 | Google Vertex AI | 768 | 5 | 是 |
amazon.titan-embed-text-v2:0 | AWS Bedrock | 1024(默认) | 1(单条) | 是(256 / 512 / 1024) |
各模型使用说明
供应商:Google Vertex AI 维度:3072 批量上限:1 条
input 只能传字符串,不支持数组。不支持 dimensions 参数。单次最多 2048 tokens。
适合 RAG 检索、知识库构建等高精度语义向量场景。
curl https://easyrouter.io/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-embedding-001",
"input": "EasyRouter 是一个企业级 AI API 网关"
}'from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://easyrouter.io/v1"
)
resp = client.embeddings.create(
model="gemini-embedding-001",
input="EasyRouter 是一个企业级 AI API 网关"
)
print(f"维度: {len(resp.data[0].embedding)}") # 3072package main
import (
"context"
"fmt"
"github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig("YOUR_API_KEY")
config.BaseURL = "https://easyrouter.io/v1"
client := openai.NewClientWithConfig(config)
resp, err := client.CreateEmbeddings(context.Background(),
openai.EmbeddingRequest{
Model: "gemini-embedding-001",
Input: []string{"EasyRouter 是一个企业级 AI API 网关"},
},
)
if err != nil {
panic(err)
}
fmt.Printf("维度: %d\n", len(resp.Data[0].Embedding)) // 3072
}import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://easyrouter.io/v1",
});
const resp = await client.embeddings.create({
model: "gemini-embedding-001",
input: "EasyRouter 是一个企业级 AI API 网关",
});
console.log(`维度: ${resp.data[0].embedding.length}`); // 3072<?php
$response = file_get_contents('https://easyrouter.io/v1/embeddings', false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => implode("\r\n", [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
]),
'content' => json_encode([
'model' => 'gemini-embedding-001',
'input' => 'EasyRouter 是一个企业级 AI API 网关',
]),
],
])
);
$data = json_decode($response, true);
echo '维度: ' . count($data['data'][0]['embedding']) . PHP_EOL; // 3072供应商:Google Vertex AI 维度:768 批量上限:5 条
支持批量传入数组(最多 5 条)。支持 dimensions 压缩输出维度,建议使用 256 / 512 / 768。单次最多 2048 tokens。
性价比高,适合大规模向量存储与文本相似度计算。
单条:
curl https://easyrouter.io/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-004",
"input": "人工智能正在改变世界"
}'批量(最多 5 条):
curl https://easyrouter.io/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-004",
"input": ["文本一", "文本二", "文本三"]
}'压缩维度至 256:
curl https://easyrouter.io/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-004",
"input": "压缩存储示例",
"dimensions": 256
}'from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://easyrouter.io/v1"
)
# 单条
resp = client.embeddings.create(
model="text-embedding-004",
input="人工智能正在改变世界"
)
print(f"维度: {len(resp.data[0].embedding)}") # 768
# 批量(最多 5 条)
resp = client.embeddings.create(
model="text-embedding-004",
input=["文本一", "文本二", "文本三"]
)
for item in resp.data:
print(f"[{item.index}] 维度: {len(item.embedding)}") # 768
# 压缩维度至 256
resp = client.embeddings.create(
model="text-embedding-004",
input="压缩存储示例",
dimensions=256
)
print(f"维度: {len(resp.data[0].embedding)}") # 256package main
import (
"context"
"fmt"
"github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig("YOUR_API_KEY")
config.BaseURL = "https://easyrouter.io/v1"
client := openai.NewClientWithConfig(config)
// 批量
resp, err := client.CreateEmbeddings(context.Background(),
openai.EmbeddingRequest{
Model: "text-embedding-004",
Input: []string{"文本一", "文本二", "文本三"},
},
)
if err != nil {
panic(err)
}
for _, item := range resp.Data {
fmt.Printf("[%d] 维度: %d\n", item.Index, len(item.Embedding)) // 768
}
// 压缩维度至 256
resp, err = client.CreateEmbeddings(context.Background(),
openai.EmbeddingRequest{
Model: "text-embedding-004",
Input: []string{"压缩存储示例"},
Dimensions: 256,
},
)
if err != nil {
panic(err)
}
fmt.Printf("维度: %d\n", len(resp.Data[0].Embedding)) // 256
}import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://easyrouter.io/v1",
});
// 批量(最多 5 条)
const batchResp = await client.embeddings.create({
model: "text-embedding-004",
input: ["文本一", "文本二", "文本三"],
});
batchResp.data.forEach((item) => {
console.log(`[${item.index}] 维度: ${item.embedding.length}`); // 768
});
// 压缩维度至 256
const compressedResp = await client.embeddings.create({
model: "text-embedding-004",
input: "压缩存储示例",
dimensions: 256,
});
console.log(`维度: ${compressedResp.data[0].embedding.length}`); // 256<?php
// 批量(最多 5 条)
$response = file_get_contents('https://easyrouter.io/v1/embeddings', false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => implode("\r\n", [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
]),
'content' => json_encode([
'model' => 'text-embedding-004',
'input' => ['文本一', '文本二', '文本三'],
]),
],
])
);
$data = json_decode($response, true);
foreach ($data['data'] as $item) {
echo "[{$item['index']}] 维度: " . count($item['embedding']) . PHP_EOL; // 768
}
// 压缩维度至 256
$response = file_get_contents('https://easyrouter.io/v1/embeddings', false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => implode("\r\n", [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
]),
'content' => json_encode([
'model' => 'text-embedding-004',
'input' => '压缩存储示例',
'dimensions' => 256,
]),
],
])
);
$data = json_decode($response, true);
echo '维度: ' . count($data['data'][0]['embedding']) . PHP_EOL; // 256供应商:AWS Bedrock 维度:1024(默认) 批量上限:1 条
input 只能传字符串,不支持数组。dimensions 仅支持 256、512、1024 三个值。不支持 encoding_format: base64。输出向量经过 L2 归一化,计费使用精确 token 数。
默认维度(1024):
curl https://easyrouter.io/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "amazon.titan-embed-text-v2:0",
"input": "Hello, Bedrock!"
}'指定维度 256:
curl https://easyrouter.io/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "amazon.titan-embed-text-v2:0",
"input": "压缩向量示例",
"dimensions": 256
}'from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://easyrouter.io/v1"
)
# 默认维度(1024)
resp = client.embeddings.create(
model="amazon.titan-embed-text-v2:0",
input="Hello, Bedrock!"
)
print(f"维度: {len(resp.data[0].embedding)}") # 1024
# 指定维度 256
resp = client.embeddings.create(
model="amazon.titan-embed-text-v2:0",
input="压缩向量示例",
dimensions=256
)
print(f"维度: {len(resp.data[0].embedding)}") # 256package main
import (
"context"
"fmt"
"github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig("YOUR_API_KEY")
config.BaseURL = "https://easyrouter.io/v1"
client := openai.NewClientWithConfig(config)
// 默认维度(1024)
resp, err := client.CreateEmbeddings(context.Background(),
openai.EmbeddingRequest{
Model: "amazon.titan-embed-text-v2:0",
Input: []string{"Hello, Bedrock!"},
},
)
if err != nil {
panic(err)
}
fmt.Printf("维度: %d\n", len(resp.Data[0].Embedding)) // 1024
// 指定维度 256
resp, err = client.CreateEmbeddings(context.Background(),
openai.EmbeddingRequest{
Model: "amazon.titan-embed-text-v2:0",
Input: []string{"压缩向量示例"},
Dimensions: 256,
},
)
if err != nil {
panic(err)
}
fmt.Printf("维度: %d\n", len(resp.Data[0].Embedding)) // 256
}import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://easyrouter.io/v1",
});
// 默认维度(1024)
const resp = await client.embeddings.create({
model: "amazon.titan-embed-text-v2:0",
input: "Hello, Bedrock!",
});
console.log(`维度: ${resp.data[0].embedding.length}`); // 1024
// 指定维度 256
const compressedResp = await client.embeddings.create({
model: "amazon.titan-embed-text-v2:0",
input: "压缩向量示例",
dimensions: 256,
});
console.log(`维度: ${compressedResp.data[0].embedding.length}`); // 256<?php
// 默认维度(1024)
$response = file_get_contents('https://easyrouter.io/v1/embeddings', false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => implode("\r\n", [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
]),
'content' => json_encode([
'model' => 'amazon.titan-embed-text-v2:0',
'input' => 'Hello, Bedrock!',
]),
],
])
);
$data = json_decode($response, true);
echo '维度: ' . count($data['data'][0]['embedding']) . PHP_EOL; // 1024
// 指定维度 256
$response = file_get_contents('https://easyrouter.io/v1/embeddings', false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => implode("\r\n", [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
]),
'content' => json_encode([
'model' => 'amazon.titan-embed-text-v2:0',
'input' => '压缩向量示例',
'dimensions' => 256,
]),
],
])
);
$data = json_decode($response, true);
echo '维度: ' . count($data['data'][0]['embedding']) . PHP_EOL; // 256响应示例:
{
"object": "list",
"data": [{ "object": "embedding", "index": 0, "embedding": [0.013, -0.008, "...共 256 维"] }],
"model": "amazon.titan-embed-text-v2:0",
"usage": { "prompt_tokens": 5, "total_tokens": 5 }
}错误码
| HTTP 状态码 | 错误信息 | 原因 |
|---|---|---|
| 400 | input is empty | input 字段缺失 |
| 400 | amazon titan embedding only supports a single input per request | Titan 传了数组 |
| 400 | gemini-embedding-001 only supports single input per request | gemini-embedding-001 传了数组 |
| 400 | text-embedding-004 supports up to 5 inputs per request | 批量超过 5 条 |
| 400 | unsupported bedrock embedding model: xxx | 传入了不支持的 Bedrock embedding 模型 |
| 401 | Invalid token | API Key 无效或已过期 |
| 429 | Rate limit exceeded | 请求频率超限 |
| 500 | upstream error | 上游服务异常,稍后重试 |
选型建议
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| RAG 知识库 / 高精度检索 | gemini-embedding-001 | 3072 维,语义精度最高 |
| 大规模向量存储(降本) | text-embedding-004 + dimensions=256 | 批量 + 维度可压缩 |
| 文本相似度 / 分类 | text-embedding-004 | 768 维,性价比高,支持批量 |
| AWS 基础设施用户 | amazon.titan-embed-text-v2:0 | 原生 Bedrock,精确 token 计费,支持维度压缩 |
| 多语言场景 | 三者均可 | 原生支持中英文及多语言 |
接口参考
Authorization
BearerAuth
AuthorizationBearer <token>
使用 Bearer Token 认证。
格式: Authorization: Bearer sk-xxxxxx
In: header
Request Body
application/json
model*string
input*string|
要嵌入的文本
encoding_format?string
Default
"float"Value in
"float" | "base64"dimensions?integer
输出向量维度
Response Body
application/json
curl -X POST "https://easyrouter.io/v1/embeddings" \ -H "Content-Type: application/json" \ -d '{ "model": "text-embedding-ada-002", "input": "string" }'{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [
0
]
}
],
"model": "string",
"usage": {
"prompt_tokens": 0,
"total_tokens": 0
}
}