Эмбеддинги

POST/v1/embeddings

Векторы для текста, форма OpenAI.

Запрос

modelstringbodyобязательно
имя embedding-модели из GET /v1/models
inputstring|arraybodyобязательно
текст или массив текстов; порядок ответа совпадает с порядком входа

Ответы

Response

{
  "object": "list",
  "data": [
    { "object": "embedding", "index": 0, "embedding": [0.0023, -0.0091, 0.0157] }
  ],
  "usage": { "prompt_tokens": 5, "total_tokens": 5, "cost_usd": "0.0000001" }
}

модерация остановила промпт до модели (type: content_policy_violation и категория)

ключа нет в заголовке или он не наш

остатка не хватает на худшую цену этого запроса

model_not_found — модель выключена админом — из GET /v1/models она пропадает тоже

апстрим ответил лимитом; повтори с задержкой

апстрим недоступен (type: upstream_error)

таймаут ожидания апстрима: чтение 300 с, в стриме 60 с без байтов

Подробности

Нужен ключ в заголовке Authorization: Bearer или x-api-key.

Прямой проброс в OpenAI-совместимый апстрим: своей логики у ручки нет, кроме общей для шлюза — идемпотентности, проверки, что модель не выключена, проверки баланса и стоимости в ответе. Поля, кроме перечисленных (dimensions, encoding_format и прочие), уходят как есть. Модель шлюз за клиента не выбирает: в model нужна строка embedding-модели из каталога.

Стоимость этого запроса приходит в самом ответе: заголовок x-teamtoken-cost-usd и поле usage.cost_usd в теле. Значение — строка с десятичной записью («0.0000465»), а не число: число после парсинга показывалось бы по правилам языка клиента (Python выдал бы 4.65e-05), строка доходит до кода ровно такой, как записана. Стоимость может и не прийти — тогда её нет ни в заголовке, ни в поле: в нестриминговом ответе так бывает, когда апстрим её не сообщил, в стриме — когда у модели нет тарифа в каталоге. Стрима у эмбеддингов нет: шлюз читает ответ целиком. Модерация к этому пути не применяется — она включена только там, где есть промпт для модели.

Байт-в-байт такой же запрос с тем же ключом в пределах короткого TTL (по умолчанию 60 с) не уезжает в модель повторно — шлюз отдаёт тело первого ответа и второй раз денег не берёт. Кэшируется только успешный ответ не больше 256 КБ; всё остальное уедет апстриму заново. У повтора из кэша нет заголовка x-teamtoken-cost-usd (списания не было), а cost_usd в теле — от первого, оплаченного ответа. Отсюда же следствие: уже оплаченный ответ отдаётся и при пустом кошельке — проверка баланса стоит ПОСЛЕ идемпотентности. Любая ошибка приходит одним конвертом (поле code — не у каждого статуса): { "error": { "message": "...", "type": "...", "code": "PROVIDER_CODE" } }.

Ответ всегда несёт то логическое имя модели, которое ты запросил. Если ответ не уложился в таймаут ожидания шлюза (по умолчанию чтение 300 с, в стриме 60 с без байтов), приходит 504; нестриминговую попытку шлюз при этом помечает, и если апстрим всё же досчитал и списал, реконсайлер возвращает сумму на баланс компенсирующим грантом. Из тел ошибок вычищены имена хостов апстрима, поэтому текст ошибки может отличаться от того, что прислал апстрим.

Своего маршрута у этого пути нет: все POST /v1/* принимает один обработчик шлюза, и список принимаемых путей у него закрытый — на любой другой /v1/* приходит 404.

Примеры кода
# MODEL — an embedding model id from GET https://api.teamtoken.store/v1/models
curl https://api.teamtoken.store/v1/embeddings \
  -H "Authorization: Bearer sk-…" \
  -H "Content-Type: application/json" \
  -d "{\"model\": \"$MODEL\", \"input\": \"text to embed\"}"
Запрос
https://api.teamtoken.store/v1

Панель отправляет запрос с этого домена; в своём коде используйте адрес выше.

Ключ никуда не сохраняется: он живёт в этой вкладке до перезагрузки страницы.

имя embedding-модели из GET /v1/models

текст или массив текстов; порядок ответа совпадает с порядком входа

Запрос уйдёт по-настоящему и будет стоить денег по тарифу модели.

Ответ

Нажмите «Отправить запрос» выше — и здесь появится ответ.