Документация

Decisions API (Jev)

Jev — модель класса «System One»: она не генерирует текст, а сразу возвращает типизированные решения с калиброванными вероятностями. Вы присылаете данные (state) и карту вопросов (questions) — получаете готовые значения, которые можно использовать в коде без парсинга: маршрутизация тикетов, модерация, скоринг, фильтры. Все вопросы одного запроса оцениваются параллельно, ответ приходит за 300–500 мс.

POST
https://ai.wormsoft.ru/api/v1/systemone
Официальный контракт TypeSafe SystemOne
POST
https://ai.wormsoft.ru/api/v1/decisions
APInex-совместимый путь (оба формата тела)
Авторизация
YOUR_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 — текстовая модель: изображения в запросах не поддерживаются.

Ошибки

400
Неверное тело запроса: нет state/input, questions или неизвестная модель
401
Не передан или не разрешён API-ключ
429
Закончились лимиты подписки (см. заголовок Retry-After) или rate limit провайдера
500 +
Ошибка на стороне нашего сервиса