Decisions API (Jev)
Jev — модель класса «System One»: она не генерирует текст, а сразу возвращает типизированные решения с калиброванными вероятностями. Вы присылаете данные (state) и карту вопросов (questions) — получаете готовые значения, которые можно использовать в коде без парсинга: маршрутизация тикетов, модерация, скоринг, фильтры. Все вопросы одного запроса оцениваются параллельно, ответ приходит за 300–500 мс.
https://ai.wormsoft.ru/api/v1/systemonehttps://ai.wormsoft.ru/api/v1/decisionsYOUR_API_KEYФорматы API
Одна и та же модель доступна в двух форматах тела запроса. Оба пути равнозначны: /api/v1/decisions принимает любой из них, /api/v1/systemone — официальный контракт TypeSafe (нужен TypeSafe SDK и нативным клиентам Jev).
- SystemOne / TypeSafe — state (строка, JSON-объект или массив) + questions в виде карты «имя → вопрос». Формат официального Jev/API TypeSafe.
- OpenAI Decisions SDK — input (строка или массив сообщений) + questions в виде списка вопросов с полем name. Формат client.decisions.create из OpenAI-совместимых SDK.
Модель
Наше имя модели — jev:1.13. Для совместимости с нативными клиентами принимаются и официальные идентификаторы Jev: jev-1.13, jev-1.13.0, jev-latest, jev-preview, typesafe/jev-1.13 — все они обслуживают одну и ту же модель. В ответе поле model повторяет присланный вами идентификатор.
Типы вопросов
Каждый вопрос — объект с полем type и текстом задания instructions. Вопросы одного запроса могут свободно смешиваться.
- noul — да/нет. Возвращает noul — вероятность истинности от 0 до 1 (у этого типа нет отдельного confidence: сама вероятность и есть сигнал). Необязательный criteria уточняет, что считается «да», а что «нет».
- choice — выбор одного варианта из набора. Обязательный criteria — карта «вариант → описание». Возвращает choice, вероятности всех вариантов probabilities и confidence.
- score — оценка по шкале. Обязательный criteria — упорядоченный массив уровней (от низшего к высшему). Возвращает score (может быть дробным), legend с вашими уровнями, probabilities и confidence.
Пример: формат SystemOne (state + questions)
curl --request POST \
--url https://ai.wormsoft.ru/api/v1/systemone \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "jev:1.13",
"state": "Order #8814 arrived with a cracked screen. Third time this quarter. Customer wants money back today.",
"questions": {
"wants_refund": {
"type": "noul",
"instructions": "Is the customer asking for money back?"
},
"department": {
"type": "choice",
"instructions": "Which team should own this request?",
"criteria": {
"billing": "Payment, subscription or refund issues",
"technical": "Bug, outage or product defect",
"sales": "Pricing or account inquiry"
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm and factual", "Frustrated but polite", "Very angry"]
}
}
}'{
"object": "decision",
"model": "jev:1.13",
"answers": {
"wants_refund": { "type": "noul", "noul": 0.99 },
"department": {
"type": "choice",
"choice": "technical",
"probabilities": { "billing": 0.15, "technical": 0.85, "sales": 0 },
"confidence": 0.78
},
"frustration": {
"type": "score",
"score": 1.42,
"legend": { "0": "Calm and factual", "1": "Frustrated but polite", "2": "Very angry" },
"probabilities": { "0": 0.03, "1": 0.52, "2": 0.45 },
"confidence": 0.28
}
},
"usage": { "input_tokens": 342, "output_tokens": 38, "total_tokens": 380 }
}Пример: формат OpenAI Decisions SDK (input + questions)
Тот же контракт, что у client.decisions.create: типы вопросов predicate (аналог noul), choice, score; у каждого вопроса есть поле name. Ответ приходит массивом answers в порядке вопросов.
curl --request POST \
--url https://ai.wormsoft.ru/api/v1/decisions \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "jev:1.13",
"input": "I was charged twice for my subscription this month and I need an immediate refund!",
"questions": [
{
"type": "predicate",
"name": "urgent_billing_issue",
"instructions": "Does the message report a duplicate charge or billing error requiring refund?"
},
{
"type": "choice",
"name": "sentiment",
"instructions": "What is the customer sentiment?",
"choices": [
{ "value": "positive", "description": "Happy or satisfied" },
{ "value": "neutral", "description": "Matter-of-fact inquiry" },
{ "value": "frustrated", "description": "Upset or demanding urgent resolution" }
]
}
]
}'{
"object": "decision",
"model": "jev:1.13",
"answers": [
{ "type": "predicate", "name": "urgent_billing_issue", "probability": 0.98 },
{
"type": "choice",
"name": "sentiment",
"choice": "frustrated",
"probabilities": [
{ "value": "positive", "probability": 0 },
{ "value": "neutral", "probability": 0 },
{ "value": "frustrated", "probability": 1 }
],
"confidence": 1
}
],
"usage": { "input_tokens": 368, "output_tokens": 63, "total_tokens": 431 }
}Нативное подключение: TypeSafe SDK
Эндпоинт /api/v1/systemone — дроп-ин для официальных SDK Jev (TypeSafe). Менять код не нужно: достаточно указать наш base URL и свой API-ключ. SDK сам ходит на POST /v1/systemone.
Python
pip install typesafe-sdk
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
with TypeSafeClient(
api_key="YOUR_API_KEY",
base_url="https://ai.wormsoft.ru/api",
) as client:
response = client.system_one(
model="jev:1.13",
state="Order #8814 arrived with a cracked screen. Third time this quarter.",
questions={
"wants_refund": Noul(instructions="Is the customer asking for money back?"),
"department": Choice(
instructions="Which team should own this request?",
criteria={"billing": "Refunds", "technical": "Product defects"},
),
"frustration": Score(
instructions="How frustrated is the customer?",
criteria=["Calm", "Frustrated", "Angry"],
),
},
)
print(response.answers["wants_refund"].noul) # 0.99
print(response.answers["department"].choice) # "technical"
print(response.answers["frustration"].probabilities)JavaScript / TypeScript
npm install @typesafe-ai/sdk
import { choice, noul, score, TypeSafeClient } from "@typesafe-ai/sdk";
const client = new TypeSafeClient({
apiKey: process.env.WORMSOFT_API_KEY,
baseURL: "https://ai.wormsoft.ru/api",
defaultModel: "jev:1.13",
});
const response = await client.systemOne({
state: "Order #8814 arrived with a cracked screen. Third time this quarter.",
questions: {
wantsRefund: noul("Is the customer asking for money back?"),
department: choice("Which team should own this request?", {
billing: "Refunds",
technical: "Product defects",
}),
frustration: score("How frustrated is the customer?", ["Calm", "Frustrated", "Angry"]),
},
});
console.log(response.answers.wantsRefund.noul);Без SDK (fetch)
const res = await fetch("https://ai.wormsoft.ru/api/v1/systemone", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WORMSOFT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "jev:1.13",
state: "The invoice total does not match the quote.",
questions: {
is_billing: { type: "noul", instructions: "Is this about billing?" },
},
}),
});
const { answers } = await res.json();
console.log(answers.is_billing.noul); // вероятность 0..1Как читать ответ
- noul — вероятность того, что утверждение из instructions истинно. Значения около 0.5 — модель не уверена.
- probabilities — распределение по всем вашим вариантам/уровням. Второй по величине вариант — хороший сигнал для ручной проверки.
- confidence — уверенность модели в выбранном ответе (у choice и score). Пороги действий задавайте в своём коде: при низком confidence отправляйте кейс человеку или на другую модель.
- Jev не объясняет решения (нет поля rationale) и не выполняет арифметику — даты и суммы считайте заранее и передавайте в state.
Тарификация
- Стоимость зависит только от входных токенов: 4 000 кредитов за 1M input-токенов (0,004 кредита за токен). Выходные токены не тарифицируются.
- Кредиты списываются с буста и лимита подписки
- При нехватке кредитов остаток уходит в долг
- Списание происходит только при успешном ответе модели (не менее 1 кредита за запрос)
Лимиты
- В одном запросе — до 256 вопросов; оптимально 5–20: они оцениваются параллельно, время ответа почти не растёт.
- Размер state — до 32K токенов, всего запроса — до 64K токенов.
- jev:1.13 — текстовая модель: изображения в запросах не поддерживаются.