EasyRouterEasyRouter
使用指南API 文档接入 Agent 工具
AI 模型接口嵌入(Embeddings)原生OpenAI格式

嵌入(Embeddings)

通过 EasyRouter 统一接口调用 Vertex AI 和 AWS Bedrock 的 Embedding 模型

将文本转换为向量嵌入。兼容 OpenAI Embeddings API,现有 OpenAI SDK 可直接接入,无需修改代码。

支持的模型

模型供应商向量维度批量上限支持 dimensions
gemini-embedding-001Google Vertex AI30721(单条)
text-embedding-004Google Vertex AI7685
amazon.titan-embed-text-v2:0AWS Bedrock1024(默认)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)}")  # 3072
package 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)}")  # 256
package 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)}")  # 256
package 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 状态码错误信息原因
400input is emptyinput 字段缺失
400amazon titan embedding only supports a single input per requestTitan 传了数组
400gemini-embedding-001 only supports single input per requestgemini-embedding-001 传了数组
400text-embedding-004 supports up to 5 inputs per request批量超过 5 条
400unsupported bedrock embedding model: xxx传入了不支持的 Bedrock embedding 模型
401Invalid tokenAPI Key 无效或已过期
429Rate limit exceeded请求频率超限
500upstream error上游服务异常,稍后重试

选型建议

场景推荐模型原因
RAG 知识库 / 高精度检索gemini-embedding-0013072 维,语义精度最高
大规模向量存储(降本)text-embedding-004 + dimensions=256批量 + 维度可压缩
文本相似度 / 分类text-embedding-004768 维,性价比高,支持批量
AWS 基础设施用户amazon.titan-embed-text-v2:0原生 Bedrock,精确 token 计费,支持维度压缩
多语言场景三者均可原生支持中英文及多语言

接口参考

POST
/v1/embeddings

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
  }
}