판정 API
대화하거나 글을 쓰지 않고, 타입이 정해진 질문에 확률로 답하는 모델입니다. 분류, 라우팅, 가드레일, 점수화, 리랭킹에 씁니다. LLM과 같은 API 키·크레딧을 쓰지만 호출 규약은 채팅과 다르고, 모델마다 스키마가 다릅니다.
모델 상세 정보
GPT-6 Luna Decisions
OpenAI
GPT-6 Luna로 동작하는 OpenAI Decisions API를 게이트웨이로 호출합니다. 채팅이 아닙니다. input(텍스트, 또는 텍스트·base64 이미지가 담긴 user 메시지)과 타입이 정해진 질문을 보내면 질문마다 답이 옵니다 - predicate(조건이 참일 확률), choice(선택지 중 하나 + 선택지별 확률), score(정의한 단계 위의 위치) - 그리고 confidence가 함께 옵니다. Responses 호출보다 약 10배 빠르고 입력 토큰에만 과금됩니다.
Jev 1.13
TypeSafe
TypeSafe API 직결로 제공되는 System One 모델 Jev입니다. 대화하거나 텍스트를 생성하지 않습니다. state(텍스트·객체·배열)와 타입이 정해진 질문 묶음을 보내면 질문마다 구조화된 답을 돌려줍니다 - 예/아니오 확률(noul), 선택지별 확률이 붙은 선택(choice), 직접 정의한 루브릭 위의 점수(score) - 그리고 보정된 confidence가 함께 옵니다. 분류·라우팅·점수화·가드레일·리랭킹을 저렴하게 처리하도록 만들어졌고, 입력 토큰에만 과금됩니다.
판정 API (Decision) — TypeSafe Jev · OpenAI Decisions POST /llm/typesafe/v1/systemone
Jev는 TypeSafe의 System One 모델로, 대화하거나 텍스트를 생성하지 않습니다. 판정할 내용(state)과 타입이 정해진 질문 묶음(questions)을 한 번에 보내면 질문마다 확률이 붙은 구조화 답이 돌아옵니다 — 코드가 바로 비교·임계값 판단·분기할 수 있는 값이라 분류, 라우팅, 가드레일, 리랭킹, 점수화에 맞습니다. 요청 1회에 질문을 여러 개 넣어도 병렬로 평가되어 지연이 거의 늘지 않고, 입력 토큰에만 과금됩니다(출력 토큰 무료). OpenAI/Anthropic SDK나 콘솔 채팅은 쓸 수 없고 자체 JSON 스키마로 호출합니다.
질문 타입 3종
| type | 묻는 것 | criteria | 답 (answers[id]) |
|---|---|---|---|
| noul | 참인가? (예/아니오) | 선택 — {"true": "yes의 의미", "false": "no의 의미"} | {"noul": 0.95} — yes일 확률 0~1 |
| choice | 어느 선택지인가? (순서 없는 집합, 최대 255개) | 필수 — {"billing": "설명", "other": null} | {"choice", "probabilities", "confidence"} |
| score | 어느 단계인가? (순서 있는 스펙트럼, 2~10단계) | 필수 — ["Calm", "Frustrated", "Very angry"] (낮은 단계부터) | {"score", "legend", "probabilities", "confidence"} |
질문 id(예: is_urgent)는 코드용 키일 뿐 모델에 전달되지 않습니다 — instructions에 질문을 완전한 문장으로 쓰세요. state가 JSON 객체면 질문에서 `ticket.messages[0].text`처럼 백틱 경로로 특정 필드를 가리킬 수 있습니다.
요청 — 질문 3개를 한 번에
curl -X POST "https://api.core.today/llm/typesafe/v1/systemone" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer cdt_your_api_key" \
-d '{
"model": "jev-latest",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this message convey urgency?"
},
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new accounts"
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}
}
}'응답
{
"model": "jev-1.13.0",
"answers": {
"is_urgent": { "type": "noul", "noul": 0.95 },
"department": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.84, "technical": 0.16, "sales": 0.0 },
"confidence": 0.68
},
"frustration": {
"type": "score",
"score": 1.05,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0.0, "1": 0.95, "2": 0.05 },
"confidence": 0.92
}
},
"usage": { "input_tokens": 340, "output_tokens": 51 }
}- noul: yes일 확률. 1에 가까우면 강한 yes, 0에 가까우면 강한 no, 0.5 근처는 "중간"이 아니라 불확실하다는 뜻입니다. 정도를 재려면 score를 쓰세요.
- choice:
choice는 최고 확률 선택지,probabilities는 합이 1인 분포. 답은 항상 내가 준 선택지 안에서만 나옵니다. - score:
score는 확률 가중 위치(단계 사이 값 가능), 키는 단계 번호 문자열("0"…). 임계값 판정에는 좋지만 두 단계 사이를 보간해 정밀한 수치를 복원하진 마세요. - confidence(choice·score, 0~1): 분포가 얼마나 한쪽으로 몰렸는지를 요약한 값. 높으면 자동 처리, 낮으면 큰 LLM이나 사람에게 넘기는 confidence 게이트가 기본 패턴입니다. 질문마다 답은 서로 독립이고, 응답
model에는 실제로 답한 버전 id가 옵니다.
잘 쓰는 법
- 질문 하나 = 1초짜리 판단 하나. "분석해서 최선의 조치를 정하라" 같은 추론 과제는 작은 질문 여러 개로 쪼개고 코드에서 조합합니다(가중치는 코드 상수로 두면 프롬프트를 고치지 않고 튜닝됩니다 — composite scoring).
- 같은 state에 대한 질문은 전부 한 요청에. 병렬로 평가되어 지연이 거의 같고, 과금은 질문 토큰만 추가됩니다. 쓸지 안 쓸지 모르는 질문도 미리 물어 두세요 (speculative fan-out). 앞 답에 따라 state나 선택지가 달라질 때만 2차 요청을 합니다.
- choice에는 목록 밖 입력을 받을
other옵션을 넣고, 경계 사례는criteria설명에 적습니다.instructions와criteria는 문자열뿐 아니라 JSON 객체/배열도 받습니다(질문 한 필드 + 참조 데이터 필드). - confidence 임계값을 맞췄다면 별칭 대신
jev-1.13.0으로 고정하세요. 게이트웨이는jev-latest·jev-preview를 현재 빌드로 고정해 보내므로 새 빌드는 별도 행으로 추가됩니다.
한계와 주의 (jev-1.13)
| 약점 | 대신 이렇게 |
|---|---|
| 쓴 대로만 읽음 (의도 추론 약함) | 조건을 문장으로 정확히 쓰고 경계 사례를 criteria에 |
| 세기·산수·수치 비교·날짜 계산 | 코드에서 계산. 모델에는 추출·의미 판단만 |
| 다단계 간접 추론·이중 부정 | 질문을 직접적으로, 참조 필드를 백틱 경로로 지정 |
| 무관한 내용이 많은 큰 state | 코드에서 먼저 필터링. 필요한 필드만 전송 |
| 선택지 순서에 따른 흔들림 | 순서를 바꿔 보고 일관성 확인 |
| 텍스트 생성 | 생성형 모델(채팅 API)과 짝지어 사용 |
| 언어 | 영어가 가장 정확. 한국어 등 CJK도 처리하지만 더 약함 — 자체 데이터로 검증 |
| 한도 | 요청당 64K 토큰, state + 가장 긴 질문 32K. 텍스트 입력만 |
| 오류 | 422 검증 실패(필드 누락·형식), 429/529는 지수 백오프로 재시도 |
OpenAI Decisions API POST /llm/openai/v1/decisions
콘솔에서 실행 →OpenAI 도 같은 종류의 판정 API 를 냈습니다(2026-10-22 GA, 모델 gpt-6-luna 전용). 개념은 Jev 와 같고 스키마만 다릅니다: 판정 대상은 input(텍스트, 또는 input_text·input_image 파트를 가진 user 메시지 — 이미지 입력 가능, base64 data URL 만), 질문은 questions[] 배열이고 각 질문에 name 을 붙입니다.같은 gpt-6-luna 라도 채팅과 가격이 다릅니다 — 입력 $0.10/M, 캐시 읽기 $0.01/M·쓰기 $0.125/M, 출력 무과금. 그래서 게이트웨이는 이 경로를 별도 행 gpt-6-luna-decisions로 정산합니다 (model 에 어느 id 를 써도 됨; OpenAI SDK 는 base_url 을 https://api.core.today/llm/openai/v1로 바꾸고 client.decisions.create를 그대로 호출).
| TypeSafe Jev (systemone) | OpenAI Decisions | |
|---|---|---|
| 판정 대상 | state (string | object | array) | input (string | user message[] with input_text / input_image) |
| 질문 묶음 | questions: {id: {...}} 맵 | questions: [{name, ...}] 배열 |
| 예/아니오 | type: "noul" → {noul: 0~1} | type: "predicate" → {probability: 0~1} |
| 선택 | criteria: {option: 설명|null} → {choice, probabilities{}, confidence} | choices: [{value, description}] → {choice, probabilities[], confidence} |
| 단계 | criteria: ["L0", "L1", …] → {score, legend{}, probabilities{}, confidence} | levels: [{label, description}] → {score, probabilities[{value,label,probability}], confidence} |
| 거부 | — | type: "refusal" (다른 답은 정상) |
| usage | input_tokens / output_tokens | input_tokens / input_tokens_details / output_tokens / … |
| 과금 | 입력 $0.042/M, 출력 무료 | 입력 $0.10/M, 캐시 읽기 $0.01/M·쓰기 $0.125/M, 출력 무료 (>272K 입력 2x) |
curl -X POST "https://api.core.today/llm/openai/v1/decisions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer cdt_your_api_key" \
-d '{
"model": "gpt-6-luna-decisions",
"input": "I was charged twice for my order.",
"questions": [
{"type": "predicate", "name": "is_urgent", "instructions": "Does this convey urgency?"},
{"type": "choice", "name": "department", "instructions": "Which department should handle this?",
"choices": [{"value": "billing", "description": "Payments, invoices, refunds"},
{"value": "technical", "description": "Problems using the product"},
{"value": "other", "description": "Anything else"}]},
{"type": "score", "name": "severity", "instructions": "How severe is this issue?",
"levels": [{"label": "Cosmetic"}, {"label": "Workaround available"}, {"label": "Fully blocked"}]}
]
}'{
"model": "gpt-6-luna",
"answers": [
{"type": "predicate", "name": "is_urgent", "probability": 0.92},
{"type": "choice", "name": "department", "choice": "billing",
"probabilities": [{"value": "billing", "probability": 0.95}, {"value": "technical", "probability": 0.02}, {"value": "other", "probability": 0.03}],
"confidence": 0.93},
{"type": "score", "name": "severity", "score": 1.1,
"probabilities": [{"value": 0, "label": "Cosmetic", "probability": 0.1}, {"value": 1, "label": "Workaround available", "probability": 0.7}, {"value": 2, "label": "Fully blocked", "probability": 0.2}],
"confidence": 0.55}
],
"usage": {"input_tokens": 142, "input_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0}, "output_tokens": 31, "total_tokens": 173}
}게이트웨이 제약: stream: true·GET 은 400, 채팅 경로(/v1/chat/completions등)에 gpt-6-luna-decisions 를 쓰면 400 decisions_model_path. 모델 상세: GPT-6 Luna Decisions. 원문: OpenAI Decisions guide.
| 모델 | 입력 (크레딧/1M 토큰) | 출력 (크레딧/1M 토큰) | 캐시 읽기 | 캐시 쓰기 |
|---|---|---|---|---|
usage.input_tokens× 단가로 이뤄집니다. 모델 상세·파라미터: Jev 1.13. 원문 가이드: Primitives, Confidence, Patterns, Cookbooks, API reference.