Документация

Эмбеддинги

Генерация векторных представлений текста через эндпоинт /embeddings API LLMost, совместимый с OpenAI Embeddings API.

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

Типичные сценарии использования:

  • RAG (retrieval-augmented generation) — поиск релевантных фрагментов документов перед тем, как передать их языковой модели
  • Семантический поиск — поиск по смыслу запроса, а не по совпадению ключевых слов
  • Кластеризация и категоризация текстов
  • Дедупликация похожих записей
  • Рекомендательные системы на основе схожести контента

Эндпоинт POST /embeddings API LLMost совместим с OpenAI Embeddings API — существующий код на официальных SDK OpenAI работает без изменений, достаточно поменять base_url и API-ключ.

Основная информация

Эндпоинт: POST https://llmost.ru/api/v1/embeddings

Аутентификация — API-ключ LLMost в заголовке Authorization: Bearer llmost_... (см. Аутентификация).

Совместимость с OpenAI SDK

Существующий код на официальных SDK OpenAI работает без изменений: поменяйте base_url на https://llmost.ru/api/v1, подставьте ключ LLMost и вызывайте embeddings.create().

Стриминга у этого эндпоинта нет — ответ всегда возвращается целиком, за один HTTP-запрос.

Быстрый старт

cURL

curl https://llmost.ru/api/v1/embeddings \
  -H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "baai/bge-base-en-v1.5-20251117",
    "input": "Кофейня открывается в 8 утра"
  }'

Python с OpenAI SDK

from openai import OpenAI

client = OpenAI(
    base_url="https://llmost.ru/api/v1",
    api_key="ВАШ_API_КЛЮЧ",
)

response = client.embeddings.create(
    model="baai/bge-base-en-v1.5-20251117",
    input="Кофейня открывается в 8 утра",
)

print(response.data[0].embedding[:5])  # первые 5 чисел вектора

TypeScript с OpenAI SDK

import OpenAI from 'openai';

const openai = new OpenAI({
  baseURL: 'https://llmost.ru/api/v1',
  apiKey: process.env.LLMOST_API_KEY,
});

const response = await openai.embeddings.create({
  model: 'baai/bge-base-en-v1.5-20251117',
  input: 'Кофейня открывается в 8 утра',
});

console.log(response.data[0].embedding.slice(0, 5));

Формат ответа

Ответ соответствует формату OpenAI Embeddings API:

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [0.0023064255, -0.009327292, "..."]
    }
  ],
  "model": "baai/bge-base-en-v1.5-20251117",
  "usage": {
    "prompt_tokens": 6,
    "total_tokens": 6,
    "cost": 0.0000012,
    "cost_details": {}
  }
}

Поля ответа

data

Массив объектов эмбеддингов, по одному на каждый элемент input, в том же порядке. Поле embedding — массив чисел (по умолчанию) или base64-строка, если передан encoding_format: "base64".

usage

Присутствует в ответе, если его вернул провайдер модели — на практике это происходит почти всегда. Если провайдер usage не прислал, поля в ответе не будет, но списание всё равно произойдёт: сумма считается по токенной цене модели.

  • prompt_tokens — количество входных токенов
  • total_tokens — совпадает с prompt_tokens: у эмбеддингов нет токенов генерации, тарифицируется только вход
  • cost — расширение LLMost: фактически списанная сумма в долларах США, уже с учётом наценки LLMost
  • cost_details — расширение LLMost: детализация списания

Батчинг

В input можно передать массив строк — это рекомендуемый способ получить эмбеддинги для нескольких текстов: один запрос со списком дешевле и быстрее, чем отдельный запрос на каждую строку.

{
  "model": "baai/bge-base-en-v1.5-20251117",
  "input": [
    "Кофейня открывается в 8 утра",
    "Ресторан работает до полуночи",
    "Магазин закрыт по воскресеньям"
  ]
}

В ответе data будет содержать по одному элементу на каждую строку input, в том же порядке — сопоставляйте по полю index.

Параметры

ПараметрТипОбязателенОписание
modelstringДаСлаг модели из каталога, например baai/bge-base-en-v1.5-20251117
inputstring | string[] | number[] | number[][] | object[]ДаТекст для эмбеддинга: строка, массив строк, массив токенов, батч из нескольких претокенизированных последовательностей (number[][]) или мультимодальные объекты
encoding_formatstringНетfloat (по умолчанию) — массив чисел, base64 — эмбеддинг в виде base64-строки
dimensionsintegerНетЖелаемая размерность вектора — только если модель поддерживает уменьшение размерности
userstringНетПроизвольный идентификатор конечного пользователя, передаётся провайдеру как есть

Прочие поля, не описанные в таблице, пробрасываются в апстрим-провайдер как есть.

Список моделей

Каталог эмбеддинг-моделей отделён от общего каталога языковых моделей — в основном списке GET /models эмбеддинг-модели не встречаются.

curl https://llmost.ru/api/v1/embeddings/models \
  -H "Authorization: Bearer ВАШ_API_КЛЮЧ"

Каждый элемент data имеет ту же схему, что и объект модели в API моделей — те же поля id, canonical_slug, name, created, description, context_length, architecture, pricing, per_request_limits, supported_parameters:

{
  "data": [
    {
      "id": "baai/bge-base-en-v1.5-20251117",
      "canonical_slug": "baai/bge-base-en-v1.5-20251117",
      "name": "BAAI: bge-base-en-v1.5",
      "created": 1763337600,
      "description": "Англоязычная модель эмбеддингов от BAAI...",
      "context_length": 8192,
      "architecture": {
        "input_modalities": ["text"],
        "output_modalities": ["embeddings"],
        "tokenizer": "Other",
        "instruct_type": null
      },
      "pricing": {
        "prompt": "0.000001",
        "completion": "0",
        "request": "0",
        "image": "0",
        "web_search": "0",
        "internal_reasoning": "0",
        "input_cache_read": "0",
        "input_cache_write": "0"
      },
      "per_request_limits": null,
      "supported_parameters": [
        "frequency_penalty",
        "max_tokens",
        "min_p",
        "presence_penalty",
        "repetition_penalty",
        "response_format",
        "seed",
        "stop",
        "temperature",
        "top_k",
        "top_p"
      ]
    }
  ]
}

Значения created, description и pricing в примере иллюстративны — актуальные данные смотрите в ответе своего запроса. Полное описание всех полей — на странице Модели.

Первая модель в каталоге

На старте доступна одна модель — baai/bge-base-en-v1.5-20251117: англоязычная, вектор размерностью 768, контекст 512 токенов у провайдера. Каталог эмбеддинг-моделей будет расширяться — актуальный список смотрите через GET /embeddings/models.

Обработка ошибок

КодПричина
400Невалидный запрос, модель не найдена или модель не поддерживает эмбеддинги
401Недействительный или отсутствующий API-ключ
402Недостаточно средств на балансе — пополните баланс
403Запрос отклонён модерацией провайдера
408Истекло время ожидания запроса на стороне провайдера
429Превышен лимит запросов
500Сбой прокси-запроса к шлюзу LLMost
502Модель или провайдер временно недоступны
503Нет доступных провайдеров для модели
504Провайдер не ответил вовремя (таймаут запроса к апстриму)

Пример ответа с ошибкой

{
  "error": {
    "message": "Model 'baai/nonexistent-model' not found",
    "type": "invalid_model",
    "code": "MODEL_NOT_FOUND"
  }
}

См. Ошибки для общего формата ошибок API и подробностей по каждому коду.

Пример: семантический поиск

Компактный пример поиска ближайшего по смыслу документа с помощью косинусного сходства:

import numpy as np
from openai import OpenAI

client = OpenAI(
    base_url="https://llmost.ru/api/v1",
    api_key="ВАШ_API_КЛЮЧ",
)
MODEL = "baai/bge-base-en-v1.5-20251117"

def get_embeddings(texts: list[str]) -> np.ndarray:
    response = client.embeddings.create(model=MODEL, input=texts)
    return np.array([item.embedding for item in response.data])

def cosine_similarity(a: np.ndarray, b: np.ndarray) -> np.ndarray:
    a_norm = a / np.linalg.norm(a, axis=-1, keepdims=True)
    b_norm = b / np.linalg.norm(b)
    return a_norm @ b_norm

documents = [
    "Кофейня открывается в 8 утра",
    "Ресторан работает до полуночи",
    "Курс доллара вырос на 2%",
]

# Один батч-запрос на все документы — дешевле и быстрее, чем по одному
doc_embeddings = get_embeddings(documents)

query = "во сколько открывается кафе"
query_embedding = get_embeddings([query])[0]

scores = cosine_similarity(doc_embeddings, query_embedding)
best_match = documents[int(np.argmax(scores))]

print(best_match)  # "Кофейня открывается в 8 утра"

Следующие шаги

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