Decisions API
Decisions API позволяет модели принимать типизированные решения по фрагменту содержимого вместо генерации текста. Вы передаёте содержимое для оценки и набор вопросов, а модель возвращает структурированный ответ на каждый из них: вероятность ответа «да», один вариант из списка или оценку по градуированной шкале, а также вероятность каждого варианта и уверенность.
API подходит для классификации, маршрутизации, модерации, оценки, фильтрации и других сценариев, где программа должна напрямую ветвиться по результату. Модель отвечает только в пределах заданных вами вариантов и уровней, никогда не возвращает значения за их пределами, поэтому разбирать свободный текст не требуется.
При первом использовании моделей решений рекомендуется сначала ознакомиться с руководством по Jev, которое содержит разделы «Быстрый старт», «Проектирование вопросов», описание возвращаемых результатов и примеры сценариев. Данная страница является справочником по полям.
Эндпоинты
Все три эндпоинта обслуживаются одними и теми же моделями по единой тарификации и различаются только форматом запроса и ответа. Выберите эндпоинт, соответствующий вашему клиенту:
Аутентификация такая же, как у остальных эндпоинтов: Authorization: Bearer <ваш OFOXAI_API_KEY>. Поддерживаются только непотоковые запросы: каждый запрос синхронно возвращает все ответы.
Доступные модели
Полный список моделей с поддержкой этого API см. на странице моделей . Вызов с обычной чат-моделью (например, openai/gpt-4o) возвращает endpoint_not_supported.
Единый формат: /v1/decisions
Параметры запроса
Формат ввода
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.
Объект вопроса
Примеры запросов
cURL
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 один к одному и в том же порядке. Поля ответа для каждого типа:
Нативный формат TypeSafe: /typesafe/v1/systemone
Форматы запроса и ответа совпадают с официальным API TypeSafe , поэтому можно напрямую использовать SDK TypeSafe или перенести существующий код. Отличия от единого формата:
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. Остальной код не меняется:
Python
# 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 по-прежнему возвращаются).
Все вопросы в одном запросе используют общий ввод, поэтому объединение нескольких вопросов в одном запросе значительно дешевле и быстрее, чем отдельные вызовы.
Ограничения
Типичные ошибки
Прочие общие ошибки описаны в разделе Обработка ошибок.