Эмбеддинги
Генерация векторных представлений текста через эндпоинт /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: фактически списанная сумма в долларах США, уже с учётом наценки LLMostcost_details— расширение LLMost: детализация списания
Батчинг
В input можно передать массив строк — это рекомендуемый способ получить эмбеддинги для нескольких текстов: один запрос со списком дешевле и быстрее, чем отдельный запрос на каждую строку.
{
"model": "baai/bge-base-en-v1.5-20251117",
"input": [
"Кофейня открывается в 8 утра",
"Ресторан работает до полуночи",
"Магазин закрыт по воскресеньям"
]
}В ответе data будет содержать по одному элементу на каждую строку input, в том же порядке — сопоставляйте по полю index.
Параметры
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
model | string | Да | Слаг модели из каталога, например baai/bge-base-en-v1.5-20251117 |
input | string | string[] | number[] | number[][] | object[] | Да | Текст для эмбеддинга: строка, массив строк, массив токенов, батч из нескольких претокенизированных последовательностей (number[][]) или мультимодальные объекты |
encoding_format | string | Нет | float (по умолчанию) — массив чисел, base64 — эмбеддинг в виде base64-строки |
dimensions | integer | Нет | Желаемая размерность вектора — только если модель поддерживает уменьшение размерности |
user | string | Нет | Произвольный идентификатор конечного пользователя, передаётся провайдеру как есть |
Прочие поля, не описанные в таблице, пробрасываются в апстрим-провайдер как есть.
Список моделей
Каталог эмбеддинг-моделей отделён от общего каталога языковых моделей — в основном списке 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 утра"Следующие шаги
- Ознакомьтесь с Аутентификацией для безопасной работы с ключами
- Изучите Обработку ошибок — общий формат для всего API
- Для текстовой генерации используйте POST /chat/completions