Decisions API: TypeSafe Jev

Типизированные решения: вероятность, выбор категории и оценка

Jev принимает контекст state и вопросы questions, возвращая структурированные answers. Используйте отдельный Decisions API: chat/completions и чат-песочница для этих моделей не подходят.

POST
/v1/decisions

Получить ответы на типизированные вопросы

Совместимые пути: /decisions, /api/alpha/decisions и /alpha/decisions. Тело запроса и авторизация одинаковы.

Первый запрос

Нужен API-ключ KodikRouter с областью gateway:write (или admin:*), разрешённой моделью и положительным балансом организации. BASE_URL указывается без /v1.

bash
export BASE_URL="https://api.kodikrouter.ru"
export KODIK_API_KEY="YOUR_KODIKROUTER_API_KEY"

curl --fail-with-body "$BASE_URL/v1/decisions" \
  -H "Authorization: Bearer $KODIK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: jev-ticket-001" \
  -d '{
    "model": "~typesafe/jev-latest",
    "state": {"ticket": "The application crashes on startup. I cannot work."},
    "questions": {
      "is_bug": {"type": "noul", "instructions": "Is this a bug report?"},
      "team": {
        "type": "choice", "instructions": "Which team should handle this?",
        "criteria": {"engineering": "Broken functionality", "billing": "Payments and invoices"}
      },
      "urgency": {
        "type": "score", "instructions": "Rate urgency.",
        "criteria": ["Low", "Medium", "High"]
      }
    }
  }'

Формат вопросов

state
string | object | array
Контекст для оценки. Обязательное поле.
questions
object
Непустой объект: ID вопроса → type, instructions и criteria при необходимости.
noul
probability
Вероятность ответа «да» от 0 до 1. Необязательный объект criteria должен содержать оба ключа true и false с пояснениями.
choice
category
Требует непустой объект criteria: категория → пояснение или null. Возвращает выбранную категорию.
score
number
Требует непустой упорядоченный массив criteria без null. Оценка использует индексы с нуля: для Low, Medium, High значение 2 означает High.

instructions и пояснения criteria могут быть строкой, JSON-объектом или массивом. Необязательные поля запроса: provider, session_id (до 256 символов), trace, user. Потоковая выдача, messages, tools и параметры генерации чата не поддерживаются.

Ответ и стоимость

json
{
  "model": "typesafe/jev-1.13-20260917",
  "answers": {
    "is_bug": {"type": "noul", "noul": 0.97},
    "team": {"type": "choice", "choice": "engineering", "probabilities": {"engineering": 1, "billing": 0}, "confidence": 1},
    "urgency": {"type": "score", "score": 2}
  },
  "usage": {"input_tokens": 405, "output_tokens": 63, "cost": 0.00001701},
  "provider": "TypeSafe"
}

Сокращённый пример из успешной проверки: ID генерации и дополнительные поля score опущены. Alias latest может возвращать конкретную датированную версию модели. Значения вероятностей и расход токенов меняются между запросами.

usage.cost — стоимость провайдера в USD, а не итоговое списание в RUB. Шлюз применяет свой курс и наценку; если провайдер не вернул cost, используются токены и цены каталога. Ненулевое число output_tokens не означает платный вывод при нулевой цене выходных токенов.

Доступные модели

bash
curl -sS "$BASE_URL/v1/catalog/models?api_surfaces=decisions&q=jev"

Используйте точный ID из каталога, включая ~ у семейного alias. В проверке доступны ~typesafe/jev-latest и typesafe/jev-1.13; актуальная доступность определяется каталогом.

Повторы, конфиденциальность и ошибки

Idempotency-Key
Успешный ответ хранится 24 часа для той же организации и API-ключа, включая совместимые пути. Повтор с тем же телом не вызывает провайдера и не списывает средства повторно. Для нового тела используйте новый ключ: одновременный запрос или другое тело с прежним ключом возвращают 409. При аварийном завершении процесса между ответом провайдера, списанием и сохранением кэша строго однократное выполнение не гарантируется.
Политика PII
Весь запрос, включая ключи, инструкции, критерии и метаданные, проверяется согласно настройкам маскирования организации. Если политика обнаружила PII, запрос отклоняется с 400 до отправки провайдеру. Decisions не заменяет категории плейсхолдерами, поскольку это может изменить смысл решения.

401 — ключ отсутствует или недействителен; 403 — недостаточно прав или модель запрещена ключу; 402 — недостаточно средств; 429 — лимит запросов; 413 — превышен размер тела. Неверный формат запроса — 400; неправильный API для модели — 400. Ошибки провайдера — 502, таймаут — 504; upstream 400/402/404/409/429 сохраняют свой статус.