현재 설정과 대표 테스트 케이스를 저장해 두세요. 질문 유형, 선택지, 이미지, 응답 파싱, 재시도를 확인하세요. 의도적으로 롤백할 수 있도록 이전 제공업체의 설정도 남겨 두세요.
기본 URL과 경로 설정하기
기본 URL로 https://api.decisionmodels.io를, 텍스트 요청에는 POST /v1/systemone을 사용하세요. 클라이언트가 경로를 직접 덧붙인다면 기존의 /v1 접미사를 제거하세요. 실제로 전송되는 경로를 확인하세요.
별도의 API 키 만들기
대시보드에서 Decision Models 키를 만들고 Authorization: Bearer로 전송하세요. TypeSafe의 키, 잔액, 계정은 이전되지 않습니다. 키는 환경 변수에 보관하세요.
모델 ID 교체하기
TypeSafe 모델 ID를 s1-fast처럼 사용 가능한 Decision Models ID로 바꾸세요. TypeSafe 별칭을 그대로 가져오지 말고 GET /v1/models로 확인하세요.
처리 리전을 명시적으로 선택하기
예를 들어 S1-Region: eu를 설정합니다. 값은 eu 또는 global이며 키 권한에 따라 달라집니다. 헤더가 없으면 키의 기본값이 적용됩니다. EU 요청은 EU 안에서만 처리됩니다. EU 밖에서 Peer-to-Peer 처리를 하려면 키에 전 세계 처리 동의가 필요합니다. 처리 및 계약 조건을 검토하세요.
모델 한도에 맞게 질문 나누기
s1-pro는 요청당 텍스트 질문을 최대 3개, s1-fast는 1개, s1-vision은 1개까지 받습니다. 추가 질문은 직접 나누어 보내세요. 서비스는 질문을 조용히 나누거나 버리지 않으며, 초과한 질문은 400 request_limit_exceeded를 반환합니다. 아래의 토큰 및 선택지 한도도 함께 확인하세요.
질문 유형과 이미지 검토하기
state와, 질문 이름을 키로 하는 questions 객체를 유지하세요. 아래의 criteria 형식을 사용하세요. 이미지는 POST /v1/multimodal을 통해 s1-vision을 사용하고 images 배열에 이미지를 정확히 하나만 넣으세요. PNG, JPEG, WebP 데이터 URL 또는 공개 HTTPS URL을 지원하며 디코딩 후 4 MiB, 2,000,000 픽셀까지입니다. 아래의 텍스트 예제는 이미지 요청을 테스트하지 않습니다.
응답과 사용량 집계 읽기
결과는 answers 아래에서 질문 이름으로 읽으세요. usage.input_tokens, usage.output_tokens, usage.decisions, 그리고 보고된 model_version을 기록하세요. 토큰 수는 이미지 요청의 이미지 위치를 포함해 모델이 산정합니다. 금액은 대시보드의 사용량 영수증을 기준으로 하고, 글자 수를 과금 토큰으로 환산하지 마세요.
오류, 재시도, 롤백 테스트하기
잘못된 키, 크레딧 부족, 모델 한도, 요청 속도 제한, 타임아웃을 테스트하세요. 아래의 오류 코드를 사용하세요. 직접 만든 케이스로 결과를 평가하고, 인수 검사를 마친 뒤 트래픽을 전환하세요. 로컬 계약 테스트는 모델 품질이나 프로덕션 가용성을 입증하지 않습니다.
질문 유형과 현재 입력 한도
noul: 예/아니오 질문입니다. 응답의 noul은 참일 확률입니다.
choice: criteria는 안정적인 선택지 ID를 두 개 이상 가진 객체입니다. choice, confidence, probabilities를 읽으세요.
score: criteria는 레벨이 두 개 이상인 순서 있는 배열입니다. score는 0부터 시작하는 레벨 인덱스의 확률 가중 평균이며 소수일 수 있습니다.
모델
질문당 입력 토큰
질문 수
선택지
s1-fast
8,000
1
16
s1-pro
8,192
3
64
s1-vision
8,000
1
26
각 질문에는 state, criteria, 프롬프트 템플릿이 포함되며, s1-vision은 이미지 위치도 계산합니다. 전체 입력 한도를 확인하세요.
마이그레이션하면 달라지는 점
2026년 10월 27일 확인. 날짜가 명시된 Jev 대안 비교와 마이그레이션 노트가 호환성의 경계를 규정합니다. 키, 모델 ID, 처리 티어, 과금, 한도, 메타데이터, 오류가 서로 다릅니다. 모델을 바꾸려면 직접 출력 결과를 평가해야 합니다. 바이트 단위의 완전한 호환성은 주장하지 않습니다.
저희 score 루브릭은 최소 두 개의 레벨이 필요하지만, TypeSafe가 공개한 스키마는 레벨 하나도 허용합니다. 초과한 질문은 재시도할 수 없는 오류입니다.
Idempotency-Key를 사용하면 진행 중인 요청은 202 in_progress를 반환합니다. 정산이 끝난 뒤이거나 정산 여부가 불확실한 동안에는 영수증과 함께 409 idempotency_replay_unavailable을 반환하며 추가 과금은 없고 저장된 답변도 없습니다. 답변도 과금도 없는 실패가 확인되면 같은 키와 본문으로 재시도할 수 있습니다. 같은 키에 다른 본문을 보내면 409 idempotency_conflict를 반환합니다. 새 키는 의도적으로 새로운 추론을 할 때만 사용하세요.
테스트한 텍스트 예제
아래 파일은 모두 저희가 공개한 계약을 격리된 로컬 HTTP 목업으로 구현한 환경에서 수정 없이 실행했습니다. 확인한 항목은 메서드, 경로, Bearer 인증, S1-Region, JSON 본문, 그리고 사용량과 model_version이 포함된 모의 응답 읽기입니다. 프로덕션 추론 요청은 보내지 않았습니다.
DECISIONMODELS_API_KEY에 키를 설정하세요. 선택 사항인 DECISIONMODELS_BASE_URL은 로컬 목업을 가리키게 할 수 있으며, 설정하지 않으면 공개 API 기본 주소를 사용합니다. Python 예제에는 Python 3.10과 표시된 패키지 버전이 필요합니다. fetch 예제는 JavaScript와 호환되는 TypeScript이며 Node.js 20.19.4로 실행했습니다.
LiteLLM은 typesafe/ 제공업체 접두사를 제거하며, 목업은 s1-fast를 받았습니다. 테스트한 것은 Ollama의 Python 클라이언트뿐이며 CLI는 테스트하지 않았습니다. 타입이 지정된 SDK는 model_version 같은 추가 메타데이터를 버릴 수 있지만, 직접 HTTP를 호출하는 예제는 이를 보존합니다.
curl 7.81.0
2026년 10월 27일, curl 7.81.0로 저희가 공개한 계약에 대해 테스트함
curl.sh
curl --fail-with-body --silent --show-error --max-time 15 \
"${DECISIONMODELS_BASE_URL:-https://api.decisionmodels.io}/v1/systemone" \
-H "Authorization: Bearer $DECISIONMODELS_API_KEY" \
-H 'Content-Type: application/json' \
-H 'S1-Region: eu' \
--data '{"model":"s1-fast","state":"Mia owns a red bicycle.","questions":{"color":{"type":"choice","instructions":"Which color is the bicycle?","criteria":{"red":null,"blue":null}}}}'
Python requests 2.32.5
2026년 10월 27일, Python requests 2.32.5로 저희가 공개한 계약에 대해 테스트함
requests.py
import os
import requests
base = os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io")
response = requests.post(
base + "/v1/systemone",
headers={
"Authorization": "Bearer " + os.environ["DECISIONMODELS_API_KEY"],
"S1-Region": "eu",
},
json={
"model": "s1-fast",
"state": "Mia owns a red bicycle.",
"questions": {"color": {
"type": "choice",
"instructions": "Which color is the bicycle?",
"criteria": {"red": None, "blue": None},
}},
},
timeout=15,
)
response.raise_for_status()
print(response.json())
Node.js fetch 20.19.4
2026년 10월 27일, Node.js fetch 20.19.4로 저희가 공개한 계약에 대해 테스트함
fetch.ts
// JavaScript-compatible TypeScript; native fetch in Node.js.
const base = process.env.DECISIONMODELS_BASE_URL ?? "https://api.decisionmodels.io";
const response = await fetch(`${base}/v1/systemone`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.DECISIONMODELS_API_KEY}`,
"Content-Type": "application/json",
"S1-Region": "eu",
},
body: JSON.stringify({
model: "s1-fast",
state: "Mia owns a red bicycle.",
questions: { color: {
type: "choice",
instructions: "Which color is the bicycle?",
criteria: { red: null, blue: null },
} },
}),
signal: AbortSignal.timeout(15000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());
LiteLLM 1.106.4
2026년 10월 27일, LiteLLM 1.106.4로 저희가 공개한 계약에 대해 테스트함
litellm.py
import os
import litellm
response = litellm.systemone(
model="typesafe/s1-fast",
api_base=os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io"),
api_key=os.environ["DECISIONMODELS_API_KEY"],
extra_headers={"S1-Region": "eu"},
state="Mia owns a red bicycle.",
questions={"color": {
"type": "choice",
"instructions": "Which color is the bicycle?",
"criteria": {"red": None, "blue": None},
}},
timeout=15,
)
print(response.model_dump())
Ollama Python 0.6.3
2026년 10월 27일, Ollama Python 0.6.3로 저희가 공개한 계약에 대해 테스트함
ollama.py
import os
from ollama import Client
client = Client(
host=os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io"),
headers={
"Authorization": "Bearer " + os.environ["DECISIONMODELS_API_KEY"],
"S1-Region": "eu",
},
timeout=15,
)
response = client.systemone(
model="s1-fast",
state="Mia owns a red bicycle.",
questions={"color": {
"type": "choice",
"instructions": "Which color is the bicycle?",
"criteria": {"red": None, "blue": None},
}},
)
print(response.model_dump())