POST Systemone

Ответы на типизированные вопросы к тексту — да/нет, выбор из вариантов, оценка по шкале — с вероятностями

POST Systemone

Ответы на типизированные вопросы к тексту — да/нет, выбор из вариантов, оценка по шкале — с вероятностями.

Ручка модели Jev: вы отправляете текст (state) и вопросы с известными вариантами ответа (questions) — получаете значения и вероятности, готовые для кода. Текст модель не генерирует.

Впервые видите Jev? Начните с гайда «Решения вместо текста»: там объяснено, что это за модель, и разобран первый запрос.

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

МодельIDТакже принимаются
TypeSafe Jevtypesafe/jevjev-latest, jev-preview, jev-1.13.0

Параметры запроса

ПараметрТипОбязательныйОписание
modelstringДаID модели
statestring / object / arrayДаОцениваемый текст. До 400 000 символов
questionsobjectДаВопросы: ключ — имя вопроса (придумываете сами), значение — объект вопроса. От 1 до 256 вопросов
providerobjectНетВыбор провайдера

Объект вопроса

ПолеТипОбязательныйОписание
typestringДаnoul, choice или score
instructionsstring / object / arrayДаСам вопрос
criteriaзависит от типаДля choice и scoreВарианты ответа
typecriteriaПоля ответа
noulНеобязательно: { "true": "...", "false": "..." }noul — вероятность «да», от 0 до 1
choiceОбъект { "вариант": "описание" }; описание может быть null. До 255 вариантовchoice, probabilities, confidence
scoreМассив описаний уровней по возрастанию, от 2 до 10score, legend, probabilities, confidence

Как формулировать вопросы и критерии — в гайде «Как задавать вопросы».

Пример

curl -X POST "https://api.usellm.ru/v1/systemone" \
  -H "Authorization: Bearer <USELLM_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev",
    "state": "Кроссовки пришли не того размера. Можно обменять на 43-й? Это срочно, у меня соревнования в субботу.",
    "questions": {
      "is_urgent": {
        "type": "noul",
        "instructions": "Клиент сообщает о срочной проблеме?"
      },
      "department": {
        "type": "choice",
        "instructions": "Какая команда должна заняться обращением?",
        "criteria": {
          "returns": "Обмен, возврат, не тот или повреждённый товар",
          "shipping": "Статус доставки, задержки, потерянные посылки",
          "billing": "Списания, счета, проблемы с оплатой",
          "other": "Ничего из перечисленного"
        }
      }
    }
  }'

Ответ

{
  "model": "jev-1.13.0",
  "answers": {
    "is_urgent": { "type": "noul", "noul": 0.97 },
    "department": {
      "type": "choice",
      "choice": "returns",
      "confidence": 1.0,
      "probabilities": { "returns": 1.0, "shipping": 0.0, "billing": 0.0, "other": 0.0 }
    }
  },
  "usage": { "input_tokens": 548, "output_tokens": 64, "cost_rub": 0.0115 }
}
ПолеОписание
modelВерсия модели, которая ответила
answersОтветы под именами ваших вопросов
usage.input_tokensВходные токены — тарифицируются только они
usage.output_tokensВыходные токены — бесплатны
usage.cost_rubСтоимость запроса в рублях. Python SDK TypeSafe это поле отбрасывает; в TypeScript SDK и в HTTP-ответе оно есть

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

Ошибки

Ошибки приходят в стандартном формате (error.code, error.message, trace_id). Дополнительно в поле detail дублируется форма TypeSafe — { "error_type", "message" }.

СтатусКогда
400Запрос не прошёл проверку — нашу или провайдера (у TypeSafe это 422); превышен контекст модели; модель не поддерживает эту ручку
401Неверный API-ключ
402Недостаточно средств (detail.error_type: insufficient_balance)
429Превышен лимит запросов. SDK TypeSafe повторяют запрос сами
503Провайдер недоступен или перегружен

Тексты запросов и ответов на стороне usellm не сохраняются и не логируются.