Документация Эмбеддинги

Embeddings

Получение векторных представлений текста. Базовый URL: https://api.ru-openrouter.ru/v1/

Embeddings — это числовые представления текста, которые сохраняют семантическое значение. Они преобразуют текст в векторы (массивы чисел), которые можно использовать для различных задач машинного обучения.

Для чего используются Embeddings

  • RAG (Retrieval-Augmented Generation): поиск релевантного контекста в базе знаний перед генерацией ответа.
  • Семантический поиск: поиск по смыслу, а не по ключевым словам.
  • Рекомендательные системы: поиск семантически похожих элементов.
  • Кластеризация и классификация: группировка похожих документов.
  • Поиск дубликатов: обнаружение повторяющегося контента.

Эндпоинты

Эндпоинт Метод Описание
/v1/embeddings POST Получение эмбеддингов
/v1/embeddings/models GET Список embedding-моделей
/v1/models?filter=embedding GET Альтернативный способ получения списка

POST /v1/embeddings

Генерация векторных представлений текста. Поддерживает OpenAI-совместимые и Яндекс embedding модели.

Параметры запроса

Поле Тип Обязательное Описание
model string Да ID модели (например, openai/text-embedding-3-small)
input string | array Да Текст или массив текстов для векторизации
encoding_format string Нет float (по умолчанию) или base64. Пробрасывается провайдеру как есть
user string Нет ID пользователя для мониторинга

Базовый запрос

curl https://api.ru-openrouter.ru/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -d '{
    "model": "openai/text-embedding-3-small",
    "input": "The quick brown fox jumps over the lazy dog"
  }'

Пример ответа

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [0.0023, -0.0091, ...]
    }
  ],
  "model": "openai/text-embedding-3-small",
  "usage": {
    "prompt_tokens": 8,
    "total_tokens": 8,
    "total_cost": 0.000032,
    "currency": "RUB"
  }
}

Пакетная обработка (batch)

Можно передать массив строк для получения эмбеддингов для нескольких текстов за один запрос:

curl https://api.ru-openrouter.ru/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -d '{
    "model": "openai/text-embedding-3-small",
    "input": [
      "Machine learning is a subset of artificial intelligence",
      "Deep learning uses neural networks with multiple layers",
      "Natural language processing enables computers to understand text"
    ]
  }'

Мультимодальные эмбеддинги (изображения)

Некоторые embedding-модели поддерживают изображения на входе. Для этого используйте формат с content:

curl https://api.ru-openrouter.ru/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -d '{
    "model": "nvidia/llama-nemotron-embed-vl-1b-v2",
    "input": [
      {
        "content": [
          {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
        ]
      }
    ],
    "encoding_format": "float"
  }'

Можно комбинировать текст и изображение:

curl https://api.ru-openrouter.ru/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -d '{
    "model": "nvidia/llama-nemotron-embed-vl-1b-v2",
    "input": [
      {
        "content": [
          {"type": "text", "text": "A scenic boardwalk through a green meadow"},
          {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
        ]
      }
    ],
    "encoding_format": "float"
  }'

Пример на Python

import requests

response = requests.post(
    "https://api.ru-openrouter.ru/v1/embeddings",
    headers={
        "Authorization": "Bearer sk_ваш_api_ключ",
        "Content-Type": "application/json",
    },
    json={
        "model": "openai/text-embedding-3-small",
        "input": "The quick brown fox jumps over the lazy dog"
    }
)

data = response.json()
embedding = data["data"][0]["embedding"]
print(f"Embedding dimension: {len(embedding)}")
print(f"Cost: {data['usage']['total_cost']} RUB")

Пример семантического поиска (Python)

import requests
import numpy as np

API_KEY = "sk_ваш_api_ключ"
BASE_URL = "https://api.ru-openrouter.ru/v1"

documents = [
    "The cat sat on the mat",
    "Dogs are loyal companions",
    "Python is a programming language",
    "Machine learning models require training data",
    "The weather is sunny today"
]

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

def semantic_search(query, documents):
    response = requests.post(
        f"{BASE_URL}/embeddings",
        headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
        json={"model": "openai/text-embedding-3-small", "input": [query] + documents}
    )
    data = response.json()
    query_emb = np.array(data["data"][0]["embedding"])
    doc_embs = [np.array(item["embedding"]) for item in data["data"][1:]]

    results = [
        {"document": doc, "similarity": cosine_similarity(query_emb, doc_embs[i])}
        for i, doc in enumerate(documents)
    ]
    results.sort(key=lambda x: x["similarity"], reverse=True)
    return results

results = semantic_search("pets and animals", documents)
for i, r in enumerate(results):
    print(f"{i+1}. {r['document']} ({r['similarity']:.4f})")

GET /v1/embeddings/models

Список доступных embedding-моделей.

curl https://api.ru-openrouter.ru/v1/embeddings/models \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Пример ответа

{
  "object": "list",
  "data": [
    {
      "id": "openai/text-embedding-3-small",
      "object": "embedding",
      "created": 1709012345,
      "owned_by": "openai"
    }
  ]
}

Дополнительные поля модели

Поле Описание
encoding_format float или base64
dimensions Количество измерений (для некоторых моделей)
provider Настройки маршрутизации провайдера

Ограничения

Описание
Нет streaming Эмбеддинги возвращаются полным ответом
Лимит токенов Каждая модель имеет максимальную длину входного текста
Детерминированный вывод Одинаковый текст всегда даёт одинаковый эмбеддинг

Коды ошибок

HTTP Код Описание
400 missing_model Не указана модель
400 missing_input Не указан input
400 invalid_input Некорректный input
400 model_not_found Модель не найдена или неактивна
401 invalid_api_key Неверный API-ключ
402 insufficient_balance Недостаточно средств
429 rate_limit_exceeded Превышен лимит запросов
429 limit_exceeded Превышен лимит API-ключа
502 empty_response Пустой ответ от провайдера