Python 가이드

Python에서의 OpenAI Decisions API

OpenAI는 Decisions API용 SDK를 공개하지 않았습니다 — 복사할 client.decisions.create가 없습니다. 이 페이지는 이 사이트의 엔드포인트(decisions-1을 제공하는, 호출 가능한 OpenAI Decisions API 대안)를 위한 실제 동작하는 JavaScript가 아닌 Python 코드를 보여줍니다. 같은 제한적 의사결정 패턴을 따릅니다.

업데이트

호출하기

Bearer 키로 /api/v1/decisions에 POST 한 번. 본문은 model, state, questions — 1~6개 질문이며 각각 noul, choice, score 타입입니다. DECISIONS_API_KEY를 대시보드의 키로 설정하세요.

requests를 쓰세요(비동기면 httpx — 호출 형태는 동일). 모든 호출에 타임아웃을 두세요. 멈춘 의사결정은 파이프라인을 정지시키지 말고 빠르게 실패해야 합니다.

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, 모든 옵션의 확률, confidence를 담습니다 — 자동 실행 여부는 승자가 아니라 confidence로 결정하세요.

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는 짧은 백오프 재시도 가치가 있습니다 — 실패 호출은 과금되지 않습니다. 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"

자주 묻는 질문

Decisions API용 공식 OpenAI SDK 예제가 있나요?

없습니다. OpenAI는 Decisions API의 SDK 메서드나 요청 스키마를 공개하지 않았습니다 — client.decisions.create를 보여주는 코드는 전부 지어낸 것입니다. 이 페이지는 평범한 HTTP를 쓰며, 어떤 프로바이더 SDK도 내부적으로 그렇게 합니다.

requests 대신 httpx를 써도 되나요?

네 — 엔드포인트는 평범한 HTTPS POST입니다. httpx.AsyncClient에 같은 헤더, 본문, 타임아웃, 상태 처리를 적용하세요.

구조화된 컨텍스트는 어떻게내나요?

state는 문자열뿐 아니라 JSON 객체나 배열도 받습니다 — json 본문에 dict를 그대로 전달하면 모델이 컨텍스트로 읽습니다.

브라우저에서 의사결정 실행

설정 없이 — 신규 방문자 무료 크레딧 2개로 플레이그라운드에서 실제 호출을 실행하세요.