Руководство 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. Когда OpenAI откроет свою Decisions API, вы замените внутренности decide(), а все точки вызова останутся прежними. Тексты вопросов, варианты и пороги сохраняются.

Python

# Keep the decision behind one function. Swap the HTTP layer
# when OpenAI publishes its schema — callers never change.
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 — ровно то, что оборачивал бы любой SDK провайдера.

Можно ли использовать httpx вместо requests?

Да — эндпоинт это обычный HTTPS POST. Используйте httpx.AsyncClient с теми же заголовками, телом, таймаутом и обработкой статусов.

Как отправить структурированный контекст?

state принимает JSON-объект или массив, а не только строку — передавайте dict прямо в json-теле, модель прочитает его как контекст.

Запустите решение из браузера

Без настройки — выполните настоящий вызов в песочнице с 2 бесплатными кредитами для новых посетителей.