Руководство Python
OpenAI Decisions API на Python
OpenAI не публиковала SDK для своей Decisions API — нечего копировать, client.decisions.create не существует. На этой странице — рабочий Python для эндпоинта этого сайта: вызываемой альтернативы OpenAI Decisions API, которая обслуживает decisions-1 и следует тому же паттерну ограниченных решений.
Обновлено
Выполните вызов
Один POST на /api/v1/decisions с Bearer-ключом. Тело — model, state и questions: от 1 до 6 вопросов типа noul, choice или score. Установите DECISIONS_API_KEY в ключ из панели.
Используйте requests (или httpx для async — форма вызова идентична). Ставьте таймаут на каждый вызов: зависшее решение должно быстро падать, а не останавливать конвейер.
Python
import os
import requests
res = requests.post(
"https://decisions-api.net/api/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['DECISIONS_API_KEY']}"},
json={
"model": "decisions-1",
"state": "I was charged twice for my subscription this morning.",
"questions": {
"refund": {
"type": "noul",
"instructions": "Is the customer asking for money back?",
}
},
},
timeout=30,
)
res.raise_for_status()
answers = res.json()["answers"]
print(answers["refund"]["noul"])Чтение вероятностей
answers возвращается по вашим ID вопросов. Ответ noul — вероятность истинности утверждения. Ответ choice несёт победивший choice, вероятность для каждого варианта и значение уверенности — решайте об автоматическом действии по уверенности, а не только по победителю.
Python
answers = res.json()["answers"]
# noul: probability the statement is true
if answers["refund"]["noul"] >= 0.8:
route_to_refunds()
# choice: winning label + per-option probabilities + confidence
team = answers["team"]
print(team["choice"], team["probabilities"], team["confidence"])Таймауты и ретраи
429 и 502 стоят короткого ретрая с backoff — неудачные вызовы не оплачиваются. 402 — пустой баланс: пополняйте, а не ретрайте. 422 — ошибка валидации; сообщение называет поле, так что чините тело, а не повторяйте.
Python
import time
import requests
def decide(body, attempts=3):
for i in range(attempts):
try:
res = requests.post(
"https://decisions-api.net/api/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['DECISIONS_API_KEY']}"},
json=body,
timeout=30,
)
if res.status_code in (429, 502):
time.sleep(2 ** i)
continue
if res.status_code == 402:
raise RuntimeError("out of credits")
res.raise_for_status()
return res.json()["answers"]
except requests.Timeout:
time.sleep(2 ** i)
raise RuntimeError("decision call failed")Оберните вызов в хелпер
Вызывающий код должен видеть функцию «текст на вход — метка на выход», а не детали HTTP. Таймаут, проверку 402 и цикл ретраев один раз поместите внутрь decide() — и все места вызова останутся чистыми.
Python
# Keep the call behind one function — timeouts, 402s,
# and retries live inside it, not at every call site.
def route_ticket(text: str) -> str:
answers = decide({
"model": "decisions-1",
"state": text,
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should own this ticket?",
"criteria": {
"payments": "Checkout or billing.",
"frontend": "Rendering or browser behavior.",
"account": "Login or permissions.",
},
}
},
})
team = answers["team"]
return team["choice"] if team["confidence"] >= 0.7 else "triage"Частые вопросы
Есть ли официальный пример SDK OpenAI для Decisions API?
Нет. OpenAI не опубликовала ни методов SDK, ни схемы запроса для Decisions API — любой код с client.decisions.create выдуман. Эта страница использует чистый HTTP.
Можно ли использовать httpx вместо requests?
Да — эндпоинт это обычный HTTPS POST. Используйте httpx.AsyncClient с теми же заголовками, телом, таймаутом и обработкой статусов.
Как отправить структурированный контекст?
state принимает JSON-объект или массив, а не только строку — передавайте dict прямо в json-теле, модель прочитает его как контекст.
Запустите решение из браузера
Без настройки — выполните настоящий вызов в песочнице с 1 бесплатным кредитом для новых посетителей.