Skip to Content

Decisions API

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

API подходит для классификации, маршрутизации, модерации, оценки, фильтрации и других сценариев, где программа должна напрямую ветвиться по результату. Модель отвечает только в пределах заданных вами вариантов и уровней, никогда не возвращает значения за их пределами, поэтому разбирать свободный текст не требуется.

При первом использовании моделей решений рекомендуется сначала ознакомиться с руководством по Jev, которое содержит разделы «Быстрый старт», «Проектирование вопросов», описание возвращаемых результатов и примеры сценариев. Данная страница является справочником по полям.

Эндпоинты

Все три эндпоинта обслуживаются одними и теми же моделями по единой тарификации и различаются только форматом запроса и ответа. Выберите эндпоинт, соответствующий вашему клиенту:

ЭндпоинтФорматПодходит для
POST https://api.ofox.ai/v1/decisionsЕдиный формат OfoxAI (вопросы в виде массива)cURL, любой HTTP-клиент, OpenAI SDK
POST https://api.ofox.ai/openai/v1/decisionsТо жеПроекты, в которых base_url OpenAI SDK уже указывает на https://api.ofox.ai/openai/v1
POST https://api.ofox.ai/typesafe/v1/systemoneОфициальный формат TypeSafe System One (вопросы в виде объекта)Официальный SDK TypeSafe или код, написанный по официальной документации TypeSafe

Аутентификация такая же, как у остальных эндпоинтов: Authorization: Bearer <ваш OFOXAI_API_KEY>. Поддерживаются только непотоковые запросы: каждый запрос синхронно возвращает все ответы.

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

ID моделиОписание
typesafe/jev-latestTypeSafe Jev, специализированная модель решений. Только текстовый или JSON-ввод, контекст 64K. Можно сокращённо указывать jev-latest
openai/gpt-6-lunaРаботает на всех трёх эндпоинтах; умеет читать изображения (передайте input_image в массиве сообщений)

Полный список моделей с поддержкой этого API см. на странице моделей . Вызов с обычной чат-моделью (например, openai/gpt-4o) возвращает endpoint_not_supported.

Единый формат: /v1/decisions

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

ПараметрТипОбязательныйОписание
modelstring✅ID модели, например typesafe/jev-latest
inputstring | object | array✅Содержимое для оценки; см. Формат ввода
questionsarray✅Список вопросов, каждый элемент — объект вопроса. Ответы возвращаются в том же порядке
safety_identifierstring—Стабильный ID конечного пользователя; действует только для моделей OpenAI

Формат ввода

input поддерживает три формы:

  • Текст: одна строка.
    "input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today."
  • Структурированные данные: JSON-объект, который передаётся модели без изменений. В вопросах можно ссылаться на имена полей в обратных кавычках, например `message`.
    "input": { "ticket_id": 4812, "message": "I was charged twice.", "plan": "pro" }
  • Массив сообщений: [{ "role", "content" }], где content — строка или список блоков содержимого. Поддерживаются только блоки input_text и input_image. Изображения работают только с моделями, которые умеют их читать. Jev не читает изображения: при передаче изображения возвращается 400.

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

ПолеПрименяется кОписание
typeВсеpredicate (да/нет), choice (один вариант) или score (оценка по шкале)
nameВсеНеобязательно, но рекомендуется. Возвращается в ответе без изменений, чтобы сопоставлять вопросы и ответы. Должно быть уникальным в пределах запроса
instructionsВсеСам вопрос. Строка или JSON-объект с вопросом и справочными данными
criteriapredicateНеобязательно. { "true": "...", "false": "..." } — что означают «да» и «нет»
choiceschoiceОбязательно. Массив вариантов, каждый вида { "value": "billing", "description": "Списания, возвраты" }; description можно опустить. Не более 255 вариантов
levelsscoreОбязательно. Массив уровней от низшего к высшему, каждый вида { "label": "low", "description": "..." }. От 2 до 10 уровней

Примеры запросов

Terminal
curl https://api.ofox.ai/v1/decisions \ -H "Authorization: Bearer $OFOX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "typesafe/jev-latest", "input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today.", "questions": [ { "type": "predicate", "name": "is_frustrated", "instructions": "Is the customer frustrated?" }, { "type": "choice", "name": "category", "instructions": "Which category does this ticket belong to?", "choices": [ { "value": "billing", "description": "Charges and refunds" }, { "value": "bug", "description": "Product issue" }, { "value": "other", "description": "Other" } ] }, { "type": "score", "name": "urgency", "instructions": "How quickly does a human need to respond?", "levels": [ { "label": "low", "description": "Within a week is fine" }, { "label": "medium", "description": "Should respond soon" }, { "label": "high", "description": "Must respond today" } ] } ] }'

Формат ответа

{ "model": "typesafe/jev-latest", "answers": [ { "type": "predicate", "name": "is_frustrated", "probability": 0.97 }, { "type": "choice", "name": "category", "choice": "billing", "confidence": 1, "probabilities": [ { "value": "billing", "probability": 1 }, { "value": "bug", "probability": 0 }, { "value": "other", "probability": 0 } ] }, { "type": "score", "name": "urgency", "score": 2, "confidence": 1, "legend": { "0": "low: Within a week is fine", "1": "medium: Should respond soon", "2": "high: Must respond today" }, "probabilities": [ { "value": 0, "label": "low", "probability": 0 }, { "value": 1, "label": "medium", "probability": 0 }, { "value": 2, "label": "high", "probability": 1 } ] } ], "usage": { "prompt_tokens": 407, "completion_tokens": 72, "total_tokens": 479 } }

answers соответствуют questions один к одному и в том же порядке. Поля ответа для каждого типа:

ТипПолеОписание
predicateprobabilityВероятность того, что ответ «да», от 0 до 1
choicechoiceВариант с наибольшей вероятностью
probabilitiesВероятность каждого варианта, в сумме 1
confidenceНасколько модель уверена в этом решении, от 0 до 1; см. Вероятность и уверенность
scorescoreЗначение уровня, взвешенное по вероятностям, отсчёт с 0. Может находиться между двумя уровнями (например, 1.43)
legendСоответствие номеров уровней их описаниям
probabilitiesВероятность каждого уровня
confidenceТо же, что выше

Нативный формат TypeSafe: /typesafe/v1/systemone

Форматы запроса и ответа совпадают с официальным API TypeSafe , поэтому можно напрямую использовать SDK TypeSafe или перенести существующий код. Отличия от единого формата:

Единый формат /v1/decisionsНативный формат TypeSafe
Содержимое для оценкиinputstate
ВопросыМассив, идентификация по nameОбъект, ключ — ID вопроса
Вопросы «да/нет»type: "predicate", поле ответа probabilitytype: "noul", поле ответа noul
Варианты и уровниМассивы choices / levelsОба задаются в criteria: для choice — объект {вариант: описание}, для score — массив строк с описаниями
Поля использованияprompt_tokens / completion_tokensinput_tokens / output_tokens
Terminal
curl https://api.ofox.ai/typesafe/v1/systemone \ -H "Authorization: Bearer $OFOX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "jev-latest", "state": "Help! My payouts have been failing for 3 days.", "questions": { "is_urgent": { "type": "noul", "instructions": "Does this convey urgency?" }, "department": { "type": "choice", "instructions": "Which team should handle this?", "criteria": { "billing": "Payments, invoicing, refunds", "technical": "Bugs, outages, integrations", "sales": "Pricing, upgrades" } }, "frustration": { "type": "score", "instructions": "How frustrated is the customer?", "criteria": ["Calm", "Frustrated", "Very angry"] } } }'
{ "model": "typesafe/jev-latest", "answers": { "is_urgent": { "type": "noul", "noul": 0.95 }, "department": { "type": "choice", "choice": "billing", "confidence": 0.85, "probabilities": { "billing": 0.9, "technical": 0.1, "sales": 0 } }, "frustration": { "type": "score", "score": 1.03, "confidence": 0.95, "legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" }, "probabilities": { "0": 0, "1": 0.97, "2": 0.03 } } }, "usage": { "input_tokens": 399, "output_tokens": 73 } }

Подключение через SDK

OpenAI SDK

Официальный OpenAI SDK предоставляет метод client.decisions.create(). Укажите base_url равным https://api.ofox.ai/v1 и используйте для тела запроса единый формат. Пример приведён выше на вкладке Python. Требуется версия SDK с поддержкой Decisions API (проверено на openai Python 3.31.0).

TypeSafe SDK

В официальном SDK TypeSafe укажите base_url равным https://api.ofox.ai/typesafe и замените api_key на OfoxAI API Key. Остальной код не меняется:

typesafe_sdk.py
# pip install typesafe-sdk import os from typesafe_sdk import TypeSafeClient, Noul, Choice, Score with TypeSafeClient(base_url="https://api.ofox.ai/typesafe", api_key=os.environ["OFOX_API_KEY"]) as client: r = client.system_one( model="jev-latest", state={"message": "I was charged twice, nobody has answered my two emails, and I need a refund today."}, questions={ "urgent": Noul(instructions="Is the customer asking for this to be handled today?"), "dept": Choice( instructions="Which team should handle this?", criteria={"billing": "Charges, invoices, refunds", "technical": "Bugs, integrations", "sales": "Pricing, upgrades"}, ), "anger": Score(instructions="How upset is the customer?", criteria=["Calm", "Upset but polite", "Very angry"]), }, ) print(r.nouls["urgent"].noul) # 0.98 print(r.choices["dept"].choice) # billing print(r.scores["anger"].score) # 1.56

Вероятность и уверенность

  • Вероятность отвечает на вопрос «каков ответ»: probability и probabilities — откалиброванные вероятности модели для каждого возможного ответа.
  • Уверенность отвечает на вопрос «можно ли доверять этому решению»: confidence выводится из распределения вероятностей и тем выше, чем сильнее оно сконцентрировано. Если два варианта получили по 0.5, choice всё равно вернёт один из них, но confidence будет низкой.

Распространённый подход — задать порог в коде: при высокой уверенности действовать автоматически, при низкой передавать решение человеку или более сильной модели на проверку.

Тарификация

Оплата взимается за токены; расценки см. на странице модели . typesafe/jev-latest тарифицирует только входные токены; выход не оплачивается (completion_tokens / output_tokens по-прежнему возвращаются).

Все вопросы в одном запросе используют общий ввод, поэтому объединение нескольких вопросов в одном запросе значительно дешевле и быстрее, чем отдельные вызовы.

Ограничения

ПараметрОграничение
Тело запросаДо 32 MiB
Контекст64K токенов для Jev; при превышении возвращается 400
Варианты choiceДо 255
Уровни scoreОт 2 до 10
Вложенность JSONДо 64 уровней отдельно для input/state, instructions и criteria
Потоковая передачаНе поддерживается

Типичные ошибки

HTTP · typeТекст ошибкиПричинаРешение
400 invalid_request_errorquestion "a" has kind choice and requires criteria optionsУ вопроса choice нет choicesДобавьте массив вариантов
400 invalid_request_errorquestion name "a" is used more than onceУ двух вопросов одинаковый nameИспользуйте уникальные имена
400 invalid_request_errorToo many score levels. Must have at most 10 levels.У вопроса score больше 10 уровнейОбъедините уровни или разделите на несколько вопросов
400 invalid_request_errordecision input carries an "input_image" part, which Typesafe cannot readВ Jev передано изображениеУдалите изображение или используйте модель, умеющую читать изображения
400 invalid_request_errorInvalid request payloadНа /v1/decisions отправлен нативный формат TypeSafe (state + questions в виде объекта)Перейдите на единый формат или вызывайте /typesafe/v1/systemone
400 endpoint_not_supportedModel 'openai/gpt-4o' does not support the /v1/decisions endpoint on this platform.Модель не является моделью решенийИспользуйте одну из доступных моделей
404 model_not_foundModel 'typesafe/jev-9' not foundНеверный ID моделиИспользуйте typesafe/jev-latest
404 invalid_request_errorUnsupported API endpoint.Указан путь /v1/systemoneПуть нативного формата TypeSafe — /typesafe/v1/systemone

Прочие общие ошибки описаны в разделе Обработка ошибок.

Обновлено