Decisions API는 분류, 라우팅, 점수 매기기 또는 게이팅 작업에서 확률 값을 반환받고 싶을 때 사용하세요. 이 API는 GPT-6 Luna에서 실행되며, 텍스트 대신 유형이 지정된 답변을 반환하고, 출력, 캐시 읽기 또는 캐시 쓰기 요금 없이 1백만 토큰당 $0.10의 입력 비용만 청구하며, OpenAI는 Responses API보다 약 10배 빠르다고 말합니다. Responses API는 생성된 텍스트, 자체 스키마의 JSON, 도구 호출, 스트리밍 또는 대화 상태가 필요할 때 사용하세요. Decisions는 2026년 10월 6일에 공개 베타를 시작했습니다.
이 게시물에서는 하나의 작업(지원 티켓 라우팅)을 두 엔드포인트 모두에서 실행하고, 각 엔드포인트가 반환하는 내용을 비교하며, 비용을 한 번 계산한 다음, 마이그레이션 참고 사항과 하나의 Apidog 프로젝트에서 두 가지를 모두 테스트하는 방법으로 마무리합니다. 엔드포인트의 구조에 대한 자세한 내용은 Decisions API 핵심 가이드를 참조하고, 기본 정보는 Responses API 가이드를 참조하세요.
기능 매트릭스
| Decisions API | Responses API (GPT-6 Luna) | |
|---|---|---|
| 엔드포인트 | POST /v1/decisions |
POST /v1/responses |
| 출력 | 엔드포인트에서 제공하는 확률 및 신뢰도를 포함한 predicate, choice, score 답변 (및 refusal) |
생성된 텍스트, 또는 text.format을 통해 스키마를 따르는 JSON |
| 자체 JSON 스키마 | 아니요 | 예, strict: true가 있는 json_schema |
| 도구 / 함수 호출 | 아니요 | 예 |
| 스트리밍 | 아니요 | 예 |
| 대화 상태 | 아니요 | 예 |
| 프롬프트 캐싱 | 캐시 요금 없음; OpenAI 포럼에 따르면 아직 캐싱 없음 | 예, 캐시된 입력은 1백만 토큰당 $0.01 |
| 배치 | 문서화되지 않음 | 예, 표준의 50% |
| 이미지 | 예, base64 데이터 URL; 참조 문서에는 공개 HTTP(S) URL도 나열되어 있으며, 요청당 최대 128개 | 예, Luna는 텍스트와 이미지를 처리함 |
| 연쇄적 (종속적) 결정 | 별도의 요청 | 하나의 생성된 응답이 종속 필드를 포함할 수 있음 |
| 1백만 토큰당 가격, 짧은 컨텍스트 | 입력 $0.10; 출력 요금 없음 | 입력 $0.10, 추론 토큰을 포함한 출력 $0.50 |
| ZDR / HIPAA | 적격 고객에게 지원; 미국 및 EU 내 지역 처리 | 이 비교에는 포함되지 않음; OpenAI의 데이터 제어 페이지 참조 |
모든 행은 OpenAI의 Decisions 가이드, API 참조 및 가격 책정 페이지에서 가져왔습니다.
동일한 작업 두 가지 방법: 지원 티켓 라우팅
티켓 내용은 "주문에 대해 두 번 청구되었습니다." 입니다. 부서는 청구, 기술, 배송 및 기타입니다. 다음은 Structured Outputs를 사용한 Responses 요청으로, 대부분의 팀이 오늘날 이 방법을 사용합니다:
curl https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "Route this support ticket to one department.\n\nTicket: I was charged twice for my order.",
"text": {
"format": {
"type": "json_schema",
"name": "ticket_route",
"strict": true,
"schema": {
"type": "object",
"properties": {
"department": {
"type": "string",
"enum": ["billing", "technical", "shipping", "other"]
}
},
"required": ["department"],
"additionalProperties": false
}
}
}
}'
동일한 티켓에 대한 Decisions 요청은 다음과 같습니다:
curl https://api.openai.com/v1/decisions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "I was charged twice for my order.",
"questions": [
{
"type": "choice",
"name": "department",
"instructions": "Which department should handle this ticket?",
"choices": [
{"value": "billing", "description": "Charges, refunds, invoices"},
{"value": "technical", "description": "Bugs, errors, login problems"},
{"value": "shipping", "description": "Delivery, tracking, returns in transit"},
{"value": "other", "description": "Anything else"}
]
}
]
}'
Responses 본문은 프롬프트 내부에 질문을, 스키마 내부에 허용되는 답변을 담고 있습니다. Decisions 본문은 원본 티켓을 input으로, 질문을 2에서 255개의 고유 값을 가진 choice로 담고 있습니다. 이 엔드포인트에는 temperature, reasoning, stream 또는 text 필드가 없습니다.
각각 반환하는 것
Responses는 생성된 텍스트를 반환합니다. 엄격한 스키마를 사용하면 해당 텍스트는 유효한 JSON이므로, 파싱 후 레이블을 얻을 수 있습니다:
{"department": "billing"}
신뢰도(confidence) 숫자를 원한다면 스키마에 필드를 추가하고 모델에게 작성하도록 요청합니다. 반환되는 것은 확률처럼 보이는 생성된 텍스트이지 측정된 값이 아닙니다.
Decisions는 레이블과 함께 그 뒤에 있는 분포를 반환합니다. 아래 숫자는 이 정확한 입력에 대한 OpenAI의 가이드 예시입니다:
{
"model": "gpt-6-luna",
"answers": [
{
"type": "choice",
"name": "department",
"choice": "billing",
"probabilities": [
{"value": "billing", "probability": 0.95},
{"value": "technical", "probability": 0.02},
{"value": "shipping", "probability": 0.01},
{"value": "other", "probability": 0.02}
],
"confidence": 0.93
}
]
}
usage 객체는 answers 뒤에 옵니다(비용 섹션에 표시). 파서나 정규식은 필요 없습니다. confidence 필드는 임계값을 설정하는 데 사용되며, OpenAI의 지침은 정확도나 보정 수치가 게시되지 않으므로 자체적으로 레이블링된 예시를 통해 임계값을 설정하는 것입니다. 거부(refusal)는 {"type": "refusal", "name": "department"}로 도착합니다. 동일한 요청의 다른 질문은 여전히 답변을 받습니다.
비용: 한 번의 계산
두 엔드포인트 모두 짧은 컨텍스트(최대 272K 입력 토큰)에서 Luna 입력에 대해 1백만 토큰당 $0.10를 청구합니다. 출력에 따라 달라집니다. 1,000,000 요청에서 500 토큰짜리 티켓을 가정해 봅시다:
- Decisions: 500 / 1,000,000 x $0.10 = 요청당 $0.00005, 따라서 1백만 건에 $50이며, 추가할 출력 또는 캐시 라인이 없습니다.
- Responses: 동일한 $50의 입력과, 1백만 토큰당 $0.50의 출력 비용이 추가됩니다. 40 토큰짜리 JSON 레이블은 40 / 1,000,000 x $0.50 = 요청당 $0.00002, 또는 1백만 건에 $20입니다. 그런 다음 Luna가 동일한 $0.50으로 출력으로 청구하는 추론 토큰을 추가합니다.
따라서 레이블만으로도 $50 대 $70의 분명한 차이가 있습니다. 더 큰 차이는 추론 라인이며, 솔직히 말하면 Decisions는 출력 토큰을 전혀 청구하지 않습니다. OpenAI의 참조 예시에서는 두 카운터 모두 0으로 표시됩니다:
"usage": {
"input_tokens": 42,
"input_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0},
"output_tokens": 0,
"output_tokens_details": {"reasoning_tokens": 0},
"total_tokens": 42
}
두 가지 주의사항. Responses에는 Decisions에 없는 지렛대가 있습니다: reasoning.effort는 Luna에서 none까지 내려가고, 프롬프트 캐싱은 반복되는 입력을 1백만 토큰당 $0.01로 낮추며, Batch API는 표준 요금을 절반으로 줄입니다. Decisions에 대해서는 이러한 기능 중 어느 것도 문서화되어 있지 않습니다. 그리고 긴 컨텍스트 입력(272K 토큰 이상)은 두 API 모두에서 입력 요율을 두 배로 늘리므로, 긴 Decisions 요청은 1백만 입력 토큰당 $0.20입니다(가격 책정 페이지의 승수에서 파생); 지역 처리는 10%를 추가합니다.
속도
OpenAI는 Decisions API가 Responses API보다 약 10배 빠르다고 말합니다. 절대적인 지연 시간은 게시되지 않았으므로, 이 주장을 예산보다는 방향으로 받아들이고 중요한 경로를 이동하기 전에 자신만의 p50 및 p95를 측정하세요. OpenAI 포럼의 한 개발자는 느린 연결에서 이미지 입력 결정이 약 0.8초 만에 반환되었다고 보고했습니다. 이것은 일화일 뿐 벤치마크는 아닙니다. 방향은 그럴듯합니다: Responses는 추론을 포함한 토큰을 생성하며, 마지막 토큰을 기다려야 합니다.
결정 규칙
출력이 다음 중 하나일 때 Decisions를 선택하세요:
- 확률을 포함한 예/아니요(`predicate`): "이 메시지가 스팸인가요?"
- 정렬되지 않은 N개의 범주 중 하나(`choice`): 부서, 의도, 다음에 호출할 모델 또는 도구. "기타"와 같은 대체 항목을 포함합니다.
- 정렬된 수준(`score`): 심각도, 우선순위, 긴급성. 점수는 0-기반 수준 인덱스의 확률 가중 평균이며, 1.1은 수준 1과 수준 2 사이, 1에 가깝다는 의미입니다.
- 게이트: `confidence` 또는 `probability`를 임계값과 비교하여 신뢰도가 낮은 항목을 사람의 대기열로 보냅니다.
다음 중 하나라도 해당할 때 Responses를 선택하세요:
- 사람이 읽을 텍스트가 필요할 때: 요약, 답변, 설명.
- 자체 형태의 객체가 필요할 때: 추출된 필드, 중첩 구조, 알 수 없는 길이의 배열. 이는 Structured Outputs 영역이며, OpenAI 가이드에도 명시되어 있습니다.
- 모델이 인수를 사용하여 도구 호출을 요청해야 할 때: 함수 호출.
- 스트리밍, 대화 상태 또는 Luna 이외의 모델이 필요할 때.
- 하나의 결정이 다른 결정에 종속되며, 이 둘을 한 번의 왕복으로 처리하고 싶을 때. Decisions는 하나의 입력에 대해 여러 독립적인 질문을 처리하지만, 종속적인 결정에는 별도의 요청이 필요합니다.
많은 파이프라인은 두 가지 모두를 원합니다: 분류 및 게이팅에는 Decisions를, 답변 작성에는 Responses를 사용합니다.
Responses에서 Decisions로 분류기 마이그레이션
엄격한 enum 스키마로 티켓을 이미 라우팅하고 있다면, 마이그레이션은 간단합니다:
- 동일한
input을 유지하되, 원본 티켓으로 되돌리고 질문은 프롬프트 밖으로 이동합니다. - 질문을
questions에choice로 넣고, enum 값을choices[].value로, 한 줄 설명을 각description으로 추가합니다. 값은 문자열 또는 부울일 수 있으며,true와"true"는 다릅니다. - 파서를 삭제합니다.
answers[0].choice와answers[0].confidence를 읽습니다. 답변은 요청한 순서대로 도착하며 설정한name을 에코합니다. 그런 다음 레이블이 지정된 샘플에서 임계값을 설정합니다. - 입력 경로를 확인합니다. Decisions는 사용자 메시지만 허용합니다: 시스템 또는 어시스턴트 역할, 함수 호출, 파일,
file_id는 없습니다. 시스템 프롬프트 규칙은instructions또는 선택 항목 설명에 포함시킵니다. 이미지는 base64 데이터 URL로 입력됩니다. 참조 문서에는 공개 HTTP(S) URL도 나열되어 있으므로 호스팅된 이미지를 먼저 테스트합니다. - 체인을 분할합니다. "분류 후 청구라면 환불 자격 결정"은 두 개의 요청이 됩니다.
하나의 Apidog 프로젝트에서 두 가지 모두 테스트
결정하는 가장 깔끔한 방법은 동일한 레이블이 지정된 티켓에 대해 두 요청을 모두 실행하고 비교하는 것입니다. Apidog에서 키를 환경 변수로 한 번 저장하고, 두 저장된 요청의 Authorization: Bearer 헤더에 {{OPENAI_API_KEY}}를 참조하여 리터럴 키가 저장된 본문에 포함되지 않도록 합니다.
두 요청에 동일한 어설션(assertion)을 부여합니다: 부서는 billing과 같아야 합니다. Decisions 요청에서는 $.answers[0].choice에 대한 JSONPath 어설션이며, $.answers[0].confidence가 0.8보다 크고 $.usage.output_tokens가 0과 같아야 합니다. Responses 요청에서는 레이블이 생성된 텍스트 안에 있으므로, 짧은 후처리 스크립트가 이를 어설션이 확인하는 변수로 파싱합니다. 그런 다음 두 응답의 usage를 비교합니다: Decisions는 출력 및 추론 토큰이 0이라고 보고하지만, Responses는 그렇지 않습니다.
이 쌍을 티켓 텍스트와 예상 부서의 CSV 파일을 통한 데이터 기반 테스트 시나리오로 전환하면, 각 엔드포인트가 신뢰도 임계값 이상으로 올바르게 라우팅하는 티켓 수를 보여줍니다. 라우터가 먼저 구축될 수 있도록 answers 배열을 모의(mock)하고, 조건부 모의 응답처럼, Apidog CLI로 CI에서 시나리오를 실행하여 문구 또는 모델 별칭 변경으로 인해 티켓이 잘못 라우팅되는 대신 테스트가 실패하도록 합니다. 더 많은 어설션 패턴은 LLM 애플리케이션 테스트를 참조하세요.
FAQ
Responses API도 Decisions처럼 확률을 반환할 수 있나요? 측정된 값으로는 안 됩니다. JSON 스키마의 confidence 필드는 모델이 작성한 숫자, 즉 생성된 텍스트를 제공합니다. Decisions는 엔드포인트 자체에서 제공한 옵션에 대한 확률을 반환합니다.
Decisions에서 GPT-6 Luna 외 다른 모델을 사용할 수 있나요? 아니요. 가이드에 따르면 gpt-6-luna가 현재 사용 가능한 유일한 모델입니다. GPT-6 Luna 개요를 참조하세요.
Decisions는 TypeSafe의 Jev와 어떻게 다른가요? 둘 다 확률을 포함한 유형이 지정된 답변을 반환하고 입력만 비용을 청구합니다. 가격, 입력 및 응답 형태가 다릅니다. Decisions API vs Jev를 참조하세요.
Decisions API는 무료인가요? 아니요. 1백만 입력 토큰당 $0.10가 청구되며, 문서화된 무료 Decisions 계층은 없습니다. Luna 자체에 대한 무료 경로는 GPT-6 Luna를 무료로 사용하는 방법을 참조하세요.
다음 단계
오늘날 Responses를 통해 실행하는 분류기 중 하나를 가져와 choice 질문으로 재구성한 다음, Apidog에서 동일한 어설션으로 50개의 레이블이 지정된 티켓에 대해 둘 다 실행해 보세요. 신뢰도 임계값이 유지되고 사용량이 0개의 출력 토큰을 보여준다면, 답을 얻은 것입니다. Apidog를 다운로드하고, Decisions API 사용 방법에 따라 첫 번째 호출과 전체 테스트 연습을 진행하세요.
