hubris

POST /v1/decisions

Модели решений (Jev и другие) — ответы «да/нет», выбор из списка и оценка по шкале с вероятностями вместо текста.

Модели решений не пишут текст. Вы передаёте данные и вопросы, модель возвращает по каждому вопросу ответ с вероятностями: «да» или «нет», вариант из списка, уровень на шкале. Подходит для разбора обращений, маршрутизации запросов, модерации и оценки лидов.

Например, Jev от TypeSafe (typesafe/jev-1.13, всегда последняя версия — ~typesafe/jev-latest), о ней подробно — на отдельной странице. Отвечает за 0,3–0,5 секунды (наш замер 07.10.2026), платится только вход. Все модели решений — в каталоге с фильтром «Решения».

Стрима нет: один запрос, один JSON-ответ. В OpenAI SDK такого метода нет, вызывайте обычным HTTP-запросом.

Эндпоинт

POSThttps://api.hubris.pw/v1/decisions

Заголовки:

ЗаголовокЗначение
AuthorizationBearer sk-gw-... (обязательно)
Content-Typeapplication/json (обязательно)

Тело запроса

ПолеТипОписание
modelstringID модели решений, например typesafe/jev-1.13.
statestring | object | arrayДанные, о которых задаются вопросы: письмо клиента, карточка лида, ответ другой модели. Какие модели принимают ещё и картинки — видно по входу на странице модели в каталоге.
questionsobjectВопросы по ключам. Ключ вернётся в answers. Все вопросы решаются за один запрос.
userstringИдентификатор конечного пользователя, до 256 знаков.

Типы вопросов

typeЧто спрашиваетcriteriaОтвет
noulДа или нет?Необязательно: {"true": "…", "false": "…"} — что считать «да» и «нет».noul — вероятность «да» от 0 до 1.
choiceКакой вариант?Обязательно: объект «ключ → описание», хотя бы один вариант.choice — ключ варианта, probabilities по всем вариантам.
scoreГде на шкале?Обязательно: массив описаний уровней по порядку, от низшего к высшему.score — дробный уровень от 0, probabilities и legend по уровням.

Поле instructions у каждого вопроса — сам вопрос простыми словами. Описания в instructions и criteria можно писать по-русски.

Пример

curl -s https://api.hubris.pw/v1/decisions \-H "Authorization: Bearer sk-gw-..." \-H "Content-Type: application/json" \-d '{  "model": "typesafe/jev-1.13",  "state": "Третий день не проходит оплата на сайте, клиенты уходят. Помогите срочно.",  "questions": {    "is_urgent": {"type": "noul", "instructions": "Клиент сообщает о срочной проблеме?"},    "department": {      "type": "choice",      "instructions": "Какой отдел должен ответить?",      "criteria": {"billing": "Оплата и счета", "tech": "Сбои и ошибки", "sales": "Тарифы"}    },    "frustration": {      "type": "score",      "instructions": "Насколько раздражён клиент?",      "criteria": ["Спокоен", "Раздражён, но вежлив", "Очень зол"]    }  }}'
import requestsres = requests.post(  "https://api.hubris.pw/v1/decisions",  headers={"Authorization": "Bearer sk-gw-..."},  json={      "model": "typesafe/jev-1.13",      "state": "Третий день не проходит оплата на сайте, клиенты уходят.",      "questions": {          "is_urgent": {"type": "noul", "instructions": "Клиент сообщает о срочной проблеме?"},          "department": {              "type": "choice",              "instructions": "Какой отдел должен ответить?",              "criteria": {"billing": "Оплата и счета", "tech": "Сбои и ошибки", "sales": "Тарифы"},          },      },  },)answers = res.json()["answers"]if answers["is_urgent"]["noul"] > 0.8:  print("Срочно в", answers["department"]["choice"])
const res = await fetch("https://api.hubris.pw/v1/decisions", {method: "POST",headers: {  Authorization: `Bearer ${process.env.HUBRIS_API_KEY}`,  "Content-Type": "application/json",},body: JSON.stringify({  "model": "typesafe/jev-1.13",  "state": "Третий день не проходит оплата на сайте, клиенты уходят.",  "questions": {    "is_urgent": { "type": "noul", "instructions": "Клиент сообщает о срочной проблеме?" },    "department": {      "type": "choice",      "instructions": "Какой отдел должен ответить?",      "criteria": { "billing": "Оплата и счета", "tech": "Сбои и ошибки", "sales": "Тарифы" },    },  },}),});const { answers } = await res.json();console.log(answers.department.choice); // "billing"

Ответ

{
  "id": "gen-dec-1791382115-AhWoFZPJy4wb51Vy5yPM",
  "model": "typesafe/jev-1.13-20260917",
  "answers": {
    "is_urgent": { "type": "noul", "noul": 0.99 },
    "department": {
      "type": "choice",
      "choice": "billing",
      "confidence": 0.62,
      "probabilities": { "billing": 0.75, "tech": 0.25, "sales": 0 }
    },
    "frustration": {
      "type": "score",
      "score": 0.89,
      "confidence": 0.83,
      "probabilities": { "0": 0.11, "1": 0.89, "2": 0 },
      "legend": { "0": "Спокоен", "1": "Раздражён, но вежлив", "2": "Очень зол" }
    }
  },
  "usage": {
    "input_tokens": 633,
    "output_tokens": 73,
    "cost": 1
  }
}

Поля ответа

ПолеТипОписание
modelstringФактическая версия модели.
answers.<ключ>.type"noul" | "choice" | "score"Тип вопроса.
answers.<ключ>.noulnumberДля noul: вероятность «да».
answers.<ключ>.choicestringДля choice: ключ выбранного варианта.
answers.<ключ>.scorenumberДля score: ожидаемый уровень, от 0 до числа уровней минус один.
answers.<ключ>.confidencenumberУверенность модели, от 0 до 1. Низкая — повод передать решение человеку или большой модели.
answers.<ключ>.probabilitiesobjectВероятность каждого варианта или уровня.
answers.<ключ>.legendobjectДля score: номер уровня и его описание из запроса.
usage.input_tokensintegerВходные токены, вместе с текстом вопросов. Только они оплачиваются.
usage.output_tokensintegerВыходные токены, бесплатно.
usage.costintegerСписано в копейках.

HTTP-коды

КодКогда
200Успешный ответ.
400Тело не соответствует схеме: нет questions, неизвестный type, у choice пустые criteria. Текст причины — в error.message.
401Ключ отсутствует, отозван или невалиден.
402Недостаточно средств на балансе.
404Модели нет или это не модель решений (чат-модели здесь не работают).
413Тело запроса больше 4 МБ.
429Превышен лимит запросов.
502 / 503 / 504Временный сбой у провайдера или курса валют.

Формат тела ошибки и повторы — Ошибки.

Биллинг

Платятся только входные токены, в том числе текст вопросов и вариантов: три вопроса дороже одного. Ответ бесплатный. С каждого запроса к платной модели списывается не меньше 1 копейки. Цены в ₽ за 1 млн токенов — на странице модели в каталоге, формула — Цены.

Что дальше

Обновлено: