본문 바로가기
성공지식백과 로고성공지식백과
가이드

타입세이프 Jev 가이드

글을 만들지 않고 타입이 정해진 결정만 돌려주는 모델 Jev의 사용법을 한 문서에 정리했습니다. 질문 세 가지, 확신도 임계값, 실전 패턴 네 가지, 가격과 한도, 자주 막히는 지점까지 예제 코드와 함께 다룹니다.

TypeSafeJevSystem OneAPIAI 자동화
정성준 12분 읽기
공유:

Jev는 타입세이프(TypeSafe AI)가 2026년 9월 15일 얼리 액세스로 공개한 모델입니다. 글을 만들지 않고 코드가 그대로 쓸 수 있는 결정만 돌려줍니다. LLM에게 JSON을 부탁하고 파싱이 깨질까 검증하던 자리에 들어가는 모델이라고 보면 됩니다.

이 문서는 Jev로 실제 기능을 만들 때 필요한 것을 한 곳에 모아둔 레퍼런스입니다. 처음부터 읽어도 되고, 확신도 임계값이나 토큰 한도처럼 필요한 항목만 찾아봐도 됩니다. 모델의 배경과 발표 내용은 Jev 공개 소식에서 다룹니다.

🧩

기준 모델

jev-1.13.0 (별칭 jev-latest)

📅

확인 날짜

2026년 9월 18일

📚

기준 문서

docs.typesafe.ai 공식 문서

💻

작업 환경

Windows PowerShell 또는 WSL

Jev가 하는 일

Jev에 보내는 요청은 두 부분입니다. 판단의 재료인 상태(state)와 그 재료에 대해 묻는 질문(questions)입니다. 응답은 질문마다 하나씩, 요청에서 쓴 키 그대로 돌아옵니다.

json복사
{
  "state": "결제가 3일째 실패합니다. 매출이 계속 빠지고 있어요. 급합니다.",
  "model": "jev-latest",
  "questions": {
    "is_urgent": {
      "type": "noul",
      "instructions": "이 메시지가 긴급함을 나타내는가?"
    }
  }
}

핵심은 답의 모양을 요청에서 미리 못 박는다는 점입니다. 선택지를 세 개 주면 답은 그 세 개 중 하나이고, 등급을 다섯 개 주면 점수는 그 안에 들어옵니다. 스키마를 벗어난 값이 나오지 않으므로 출력을 다시 파싱하거나 형식이 깨졌을 때를 대비한 재시도가 필요하지 않습니다.

그래서 잘 맞는 일과 맞지 않는 일이 분명하게 갈립니다.

잘 맞는 일맞지 않는 일
분류, 라우팅, 점수 매기기, 예·아니오 판정문장·코드·요약 생성
실시간 분기가 필요한 판단여러 단계의 추론이 필요한 문제
수만 건을 훑어 피처로 만드는 작업계산, 개수 세기, 날짜 비교
LLM 입출력 검사와 가드레일이미지, 오디오, 영상 입력

시작 전 준비

Jev는 지금 대기명단을 거쳐 순서대로 접근 권한을 주는 얼리 액세스 단계에 있습니다. typesafe.ai에서 신청하고 접근 권한을 받은 다음 아래를 준비합니다.

사전 준비

0/4 완료

키는 콘솔의 키 화면에서 만듭니다. SDKTYPESAFE_API_KEY 환경 변수를 자동으로 읽기 때문에 코드에 키를 적을 필요가 없습니다.

$env:TYPESAFE_API_KEY = "여기에_발급받은_키"

# 현재 세션에만 적용됩니다. 영구 설정은 아래를 씁니다.
[Environment]::SetEnvironmentVariable("TYPESAFE_API_KEY", "여기에_발급받은_키", "User")
export TYPESAFE_API_KEY="여기에_발급받은_키"

# 셸을 다시 열어도 유지하려면
echo 'export TYPESAFE_API_KEY="여기에_발급받은_키"' >> ~/.bashrc

코드를 쓰기 전에 감을 잡으려면 콘솔의 플레이그라운드에 텍스트를 붙이고 질문을 하나 넣어보는 편이 빠릅니다. 같은 요청을 화면에서 만들고 그대로 코드로 옮길 수 있습니다.

첫 호출

엔드포인트는 하나입니다. POST https://api.typesafe.ai/v1/systemone으로 보내고 Authorization: Bearer 헤더에 키를 넣습니다.

bash
curl -X POST https://api.typesafe.ai/v1/systemone \
  -H "Authorization: Bearer $TYPESAFE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "state": "결제가 3일째 실패합니다. 급합니다.",
    "model": "jev-latest",
    "questions": {
      "is_urgent": { "type": "noul", "instructions": "Does this convey urgency?" }
    }
  }'
python
# pip install typesafe-sdk  (uv를 쓰면 uv add typesafe-sdk)
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient

with TypeSafeClient() as client:
    response = client.system_one(
        state={"document": "I was charged twice. Please fix this ASAP."},
        questions={
            "billing": Noul(instructions="Is this ticket about billing?"),
            "tone": Choice(
                instructions="What is the customer's tone?",
                criteria={"calm": None, "frustrated": None, "angry": None},
            ),
            "urgency": Score(
                instructions="How urgent is this ticket?",
                criteria=["can wait", "this week", "today"],
            ),
        },
    )

print(response.nouls["billing"].noul)
print(response.choices["tone"].choice)
print(response.scores["urgency"].score)
typescript
// npm install @typesafe-ai/sdk  (Node.js 20 이상)
import { choice, TypeSafeClient } from "@typesafe-ai/sdk";

const client = new TypeSafeClient();
const response = await client.systemOne({
  state: { document: "I was charged twice. Please fix this ASAP." },
  questions: {
    category: choice("What is this ticket about?", {
      billing: null,
      technical: null,
      other: null,
    }),
  },
});

console.log(response.answers.category.choice);

SDK에는 재시도 정책이 기본으로 들어 있습니다. 429나 529가 오면 지수 백오프로 다시 시도하고 retry-after 헤더를 지킵니다. HTTP API를 직접 부를 때는 이 처리를 직접 넣어야 합니다.

계정이 쓸 수 있는 모델 목록은 GET /v1/models로 확인합니다.

WSL
$ curl https://api.typesafe.ai/v1/models \
    -H "Authorization: Bearer $TYPESAFE_API_KEY"
{"models":[{"name":"jev-latest","description":"...","release_date":"..."}]}

질문 세 가지

질문마다 ID와 type, instructions가 필요합니다. ID는 내 코드가 쓰는 키이고 모델에는 전달되지 않습니다. 그래서 ID가 아무리 설명적이어도 질문 본문은 instructions에 전부 써야 합니다.

종류언제 쓰는가응답 필드
Choice순서 없는 선택지 중 하나를 고를 때`choice`, `probabilities`, `confidence`
Score정의한 등급 사이의 위치를 잴 때`score`, `legend`, `probabilities`, `confidence`
Noul예·아니오 확률 자체가 신호일 때`noul`

세 종류를 한 요청에 섞어 보내면 답도 한꺼번에 돌아옵니다. 아래는 이 세 질문을 실제 게임 세 개에 붙여 돌린 화면입니다. 각 화면 아래 카드가 그 순간의 답이고, 왼쪽 아래 JSON이 모델이 본 state 전부입니다. 두 번째 화면에서는 코드가 미리 계산한 예측 궤적을 점선으로 그려 넣었고, 세 번째 화면에서는 고른 답의 확률이 57%인데 확신도가 0.15로 떠 있습니다.

Jev에 게임 세 개를 붙여 돌린 화면. 각 화면 아래 카드가 그 순간 모델이 돌려준 답이다.

Choice: 선택지 하나 고르기

criteria는 선택지 이름과 설명의 맵입니다. 설명이 필요 없으면 값에 null을 넣습니다. 한 질문에 선택지는 255개까지 넣을 수 있으니 후보를 미리 줄이지 말고 전체 목록을 주는 편이 낫습니다. 목록이 입력을 다 덮지 못할 가능성이 있으면 other 같은 탈출구를 꼭 넣습니다.

json복사
{
  "department": {
    "type": "choice",
    "instructions": "Which team should handle this?",
    "criteria": {
      "billing": "Payments, invoicing, refunds",
      "technical": "Bugs, outages, integrations",
      "sales": "Pricing, upgrades, new accounts"
    }
  }
}

응답의 probabilities는 전체 선택지에 대한 분포이고 합이 1입니다. choice에는 그중 확률이 가장 높은 선택지가 들어옵니다.

Score: 등급 사이의 위치 재기

criteria는 낮은 쪽에서 높은 쪽으로 정렬한 등급 설명 배열입니다. 최소 2개, 최대 10개까지 넣습니다. 응답의 score는 등급 사이에 걸칠 수 있는 확률 가중 평균이고, legend가 각 번호에 어떤 설명이 붙었는지 되돌려줍니다.

json복사
{
  "frustration": {
    "type": "score",
    "instructions": "How frustrated is the customer?",
    "criteria": ["Calm", "Frustrated", "Very angry"]
  }
}

등급 설명은 서로 구분되게 씁니다. 구분해서 설명할 수 없는 등급을 억지로 늘리면 분포가 퍼지고 확신도만 떨어집니다.

Noul: 예·아니오 확률

Noul은 noul 하나만 돌려줍니다. 0에 가까우면 아니오, 1에 가까우면 예, 0.5 근처면 모델이 양쪽에 같은 확률을 준 상태입니다. Noul에는 confidence가 없습니다. 값 자체가 이미 확률이기 때문입니다.

주의
Noul 0.5는 중간 수준이 아닙니다

`파이썬 실력이 좋은가?`라는 Noul이 0.5를 돌려줬다면 실력이 중간이라는 뜻이 아니라 예와 아니오가 반반이라는 뜻입니다. 수준을 재려면 등급을 정의한 Score를 쓰고, 예·아니오로 끊으려면 `이력서에 업무에서 파이썬을 썼다고 적혀 있는가?`처럼 조건을 분명하게 씁니다.

상태를 설계하는 법

state는 문자열, JSON 객체, 텍스트 배열 중 하나입니다. 대부분은 객체를 쓰는 편이 낫습니다. 각 부분에 이름이 붙어서 질문이 어디를 봐야 하는지 가리킬 수 있습니다.

숫자를 누가 만드느냐도 같이 정해야 합니다. 공식 약점 문서가 세기와 산술을 약점으로 적어둔 만큼, 계산은 코드에서 끝내고 모델에는 그 숫자를 보고 내리는 판단만 맡기는 편이 안전합니다. 앞서 본 플래피 버드 화면의 점선이 그 예입니다. 코드가 0.35초 뒤 위치를 미리 계산해 state에 넣고, 모델은 그 두 숫자 중 어느 쪽이 구멍에 가까운지만 답합니다.

형태쓰는 경우
문자열메시지 한 건, 문단 하나처럼 단순한 입력
객체이름 붙은 필드, 관련 기록, 애플리케이션 상태
배열메시지나 레코드의 나열

객체로 넣었으면 질문에서 경로를 직접 가리킵니다. 백틱을 포함해 ticket.messages[0].text처럼 씁니다.

questions.py복사
questions = {
    "refund_requested": {
        "type": "noul",
        "instructions": "Does `ticket.messages[0].text` request a refund?",
    },
    "policy_supports_refund": {
        "type": "noul",
        "instructions": (
            "Does `refund_policy` support the refund requested "
            "in `ticket.messages[0].text`, given `order.charges`?"
        ),
    },
}

상태에 관련 없는 내용을 많이 넣으면 정확도가 떨어집니다. 공식 문서도 검색과 필터링을 코드에서 먼저 하고 질문에 필요한 필드만 보내라고 권고합니다. 질문을 여러 개 넣는 것은 거의 무료지만 상태를 키우면 비용과 정확도 양쪽에 영향이 옵니다.

확신도로 행동을 나누기

Choice와 Score의 답에는 confidence가 0에서 1 사이로 함께 옵니다. 확률 분포가 한 곳에 몰려 있으면 높고, 퍼져 있으면 낮습니다. 공식 문서가 권하는 출발점은 세 구간입니다.

- 높음: 자동으로 처리합니다.
- 중간: 사용자 확인을 받거나 검토 대기로 표시합니다.
- 낮음: 실행하지 않고 사람에게 넘기거나 다른 경로로 보냅니다.

경계를 어디에 둘지는 실수했을 때의 비용이 결정합니다. 같은 시스템 안에서도 작업마다 기준이 달라야 합니다.

여기서 자주 오해하는 게 하나 있습니다. 확신도는 선택지가 몇 개냐가 아니라 확률이 한쪽으로 얼마나 몰렸느냐를 요약한 값입니다. 선택지가 둘뿐인 상황이라도 답이 분명하면 확신도가 0.9를 넘고, 반대로 57 대 43처럼 갈리면 0.15까지 떨어집니다. 앞서 본 트레이딩 화면이 그 경우입니다. 고른 답의 확률은 57%인데 확신도는 0.15로 떠 있습니다. 이런 자리에서 확신도만 보고 거르면 행동해야 할 순간을 통째로 놓칩니다.

routing.py복사
action = response.answers["action"]
confidence = action.confidence

if confidence < 0.5:
    # 모델이 스스로 모르겠다고 말한 구간입니다.
    route_to_human(user_message)

elif action.choice == "check_balance":
    # 잘못 눌러도 되돌릴 수 있는 작업입니다.
    show_balance(account_id)

elif action.choice == "approve_transfer":
    if confidence > 0.9:
        confirm_then_execute(account_id)
    else:
        ask_user_to_confirm(account_id)
전체 보기

확신도는 probabilities에서 계산한 요약값입니다. 통계 알고리즘을 직접 쓸 생각이라면 확신도 대신 원본 분포를 쓰는 편이 맞습니다. 여러 선택지 중 최선만 고르면 되는 상황이라면 임계값 없이 확률이 가장 높은 답을 쓰면 됩니다.

INFO
보정은 묶음 단위의 성질입니다

확률이 보정됐다는 말은 확신도가 0.8인 답들을 모아보면 그 근처 비율로 맞는다는 뜻입니다. 개별 답 하나가 맞는다는 보장이 아닙니다. 임계값은 반드시 내 데이터로 시험해서 정합니다.

실전 패턴 네 가지

공식 문서는 네 가지 구성 패턴을 정리해두었습니다. 네 개 모두 판단을 잘게 쪼개고 조합은 코드가 맡는다는 같은 원칙에서 나옵니다.

투기적 팬아웃

필요할지 모르는 질문까지 한 번에 다 보내고, 무엇을 쓸지는 코드가 뒤에서 고릅니다. 질문은 병렬로 평가되므로 개수를 늘려도 응답 시간이 거의 늘지 않습니다. 티켓 분류를 예로 들면 카테고리와 함께 버그 심각도, 재현 절차 유무, 환불 요청 여부, 불만 정도를 한 번에 묻습니다. 버그 신고가 아니면 심각도 답은 코드에서 버립니다.

공식 병렬 질문 쿡북은 13개 질문을 한 호출에 묶었을 때 따로 부르는 것보다 12.2배 저렴하고 10.0배 빨랐으며 답은 달라지지 않았다고 보고합니다.

확신도 게이팅

답이 무엇인지와 그 답으로 행동할지를 따로 다룹니다. 답은 choice가 알려주고 행동 여부는 confidence가 결정합니다. 위 라우팅 코드가 이 패턴의 최소 형태입니다.

합성 점수

복잡한 판단 하나를 여러 개의 독립된 Score로 쪼개고 가중치를 코드에서 곱합니다. 이력서 심사라면 파이썬 깊이, 팀 리딩 경험, 시스템 설계 경험, 낯선 영역 적응력을 각각 5단계로 물어본 다음 역할에 따라 다르게 조합합니다.

ranking.py복사
py      = response.answers["python_depth"].score / 4
lead    = response.answers["team_leadership"].score / 4
arch    = response.answers["system_design"].score / 4
general = response.answers["generalist"].score / 4

# 시니어 개발자 기준
ic_score = (0.40 * py) + (0.10 * lead) + (0.40 * arch) + (0.10 * general)

# 엔지니어링 매니저 기준
em_score = (0.15 * py) + (0.40 * lead) + (0.20 * arch) + (0.25 * general)

우선순위가 바뀌면 프롬프트를 다시 쓰는 대신 계수만 고칩니다. 최종 점수가 어떻게 나왔는지 코드에 남는다는 점이 이 방식의 실제 이득입니다.

인텐트 라우팅

들어온 요청을 분류해서 각각 맞는 처리기로 보냅니다. 결정적 코드로 끝낼 일, 전문 LLM에 넘길 일, 사람이 봐야 할 일을 갈라놓는 자리입니다. Jev를 문 앞에 두고 무거운 모델을 필요한 때만 부르는 구성이 비용과 속도 양쪽에서 유리합니다.

모델, 가격, 한도

현재 공개된 모델은 하나입니다. 별칭 jev-latestjev-1.13.0을 가리키고, jev-preview도 지금은 같은 버전을 가리킵니다. 별칭은 새 버전이 나오면 움직이므로 확신도 임계값을 특정 버전에 맞춰 조정했다면 버전 ID를 직접 고정하는 편이 안전합니다. 응답의 model 필드에 실제로 답한 버전이 들어옵니다.

항목
모델 ID`jev-1.13.0`
가격입력 100만 토큰당 0.042달러, 출력 무료
속도 제한초당 25만 토큰, 분당 1,200요청
토큰 예산요청당 6만 4천, 상태와 가장 긴 질문 합계는 3만 2천
입력텍스트만. 문자열, JSON 객체, 텍스트 배열

타입세이프는 수요가 많아 속도 제한이 예고 없이 바뀔 수 있다고 공지했습니다. 더 높은 한도는 커스텀·엔터프라이즈 계약에서 제공합니다. 파인튜닝이나 LoRA는 없습니다. 같은 가중치를 모든 계정이 쓰고, 도메인에 맞추는 일은 상태와 질문 쪽에서 합니다.

자주 막히는 지점

타입세이프는 jev-1.13의 약점을 따로 문서로 공개했습니다. 실제로 붙여보기 전에 한 번 읽어두면 헛수고를 줄일 수 있습니다.

문제대신 이렇게
지시문을 문자 그대로 읽음조건을 정확히 쓰고 경계 사례를 criteria에 넣기
계산과 개수 세기가 약함산술은 코드에서 하고 항목별로 질문 나누기
날짜 비교가 불안정함날짜 조각을 Choice로 뽑고 비교는 코드에서
여러 단계를 거치는 질문에 약함질문을 직접적으로 쓰고 관련 필드를 이름으로 지목
상태가 크고 잡다하면 정확도 하락코드에서 먼저 걸러 필요한 필드만 보내기
적대적 입력에 흔들릴 수 있음criteria를 명시적으로 쓰고 경계 사례를 미리 시험
지시문과 criteria가 어긋나면 혼란둘을 같은 방향으로 맞춰 쓰기
질문 형태를 바꾸면 값이 안 맞음Noul에서 맞춘 임계값을 Choice에 옮기지 않기
텍스트 생성은 못 함생성은 생성 모델에 맡기기

특히 헷갈리기 쉬운 것은 질문 형태를 바꿨을 때 값이 맞지 않는 문제입니다. 같은 내용을 Noul로 묻는 것과 예·아니오 Choice로 묻는 것은 서로 다른 질문입니다. 공식 문서의 예를 보면 같은 티켓에서 Noul이 0.22를 준 반면 Choice는 no에 0.99를 줬습니다. 하나의 Choice는 선택지들 사이의 상대적 비교이고, 선택지마다 따로 물은 Noul은 각각 절대적인 판정입니다. 그래서 여러 Noul의 합이 1이 되지도 않습니다.

한국어로 쓸 때 주의할 점

공식 문서는 Jev의 주 학습 언어가 영어이며 한국어를 포함한 CJK 문자는 처리하지만 정확도가 같지 않다고 밝혔습니다. 영어가 아닌 작업에 쓰기 전에 자기 데이터로 시험하고 확신도를 특히 주의해서 보라는 안내가 붙어 있습니다.

실무에서 쓸 만한 절충안은 상태와 지시문의 언어를 분리하는 것입니다. 상태에는 원문 한국어를 그대로 넣고, 질문의 instructionscriteria는 영어로 쓰는 방식입니다. 선택지 이름도 billing이나 refund처럼 영어 식별자로 두면 코드에서 분기하기도 편합니다. 어느 쪽이 정확한지는 짐작하지 말고 같은 데이터 100건 정도로 양쪽을 돌려 비교해봅니다.

권장하지 않음
{
  "state": "주문 취소하고 환불해주세요. 벌써 2주째입니다.",
  "questions": {
    "환불요청": {
      "type": "noul",
      "instructions": "고객이 환불을 요청했나요?"
    }
  }
}
권장
{
  "state": { "message": "주문 취소하고 환불해주세요. 벌써 2주째입니다." },
  "questions": {
    "refund_requested": {
      "type": "noul",
      "instructions": "Does `message` explicitly ask for a refund?",
      "criteria": {
        "true": "The customer asks for money back",
        "false": "No refund is requested"
      }
    }
  }
}

코딩 에이전트에 붙이기

타입세이프는 코딩 에이전트용 스킬을 공개했습니다. 질문 세 종류와 패턴, 요청 형식을 에이전트가 읽고 쓰게 만드는 스킬이며 설치하면 바로 동작합니다.

claude plugin marketplace add typesafe-ai/skills
claude plugin install typesafe@typesafe-ai

# 업데이트
claude plugin marketplace update typesafe-ai
claude plugin update typesafe@typesafe-ai
npx skills add typesafe-ai/skills --skill typesafe-ai

# 기본은 프로젝트 로컬 설치입니다. 전역 설치는 -g를 붙입니다.
# 업데이트는 npx skills update

설치 뒤에는 Claude Code에서 /typesafe:typesafe-ai로 직접 부르거나, 다른 에이전트에서는 TypeSafe 스킬을 써서라고 요청에 적으면 됩니다. 에이전트가 질문을 호출마다 하나씩 나눠 보내는 습관이 있으니, 여러 질문을 한 호출에 묶으라는 지시를 함께 주는 편이 좋습니다.

에이전트에게 맡길 때 사람이 꼭 검토해야 하는 것은 질문 문장과 임계값 상수입니다. 두 가지를 파일 하나에 모아두면 리뷰가 훨씬 수월해집니다. 공식 문서도 같은 방식을 권합니다.

FAQ

지금 바로 쓸 수 있나요?
대기명단을 거쳐야 합니다. typesafe.ai에서 신청하면 순서대로 접근 권한을 줍니다. 얼리 액세스 단계이므로 속도 제한도 예고 없이 바뀔 수 있습니다.
LLM을 완전히 대체하나요?
Jev는 문자열을 만들지 않으므로 대체재가 아닙니다. 글과 코드 생성은 LLM이 하고 분류·라우팅·점수 매기기 같은 판단을 Jev가 맡는 구성이 공식 문서가 권하는 방향입니다.
환각이 없다는 말은 답이 항상 맞다는 뜻인가요?
출력이 정의한 타입과 선택지를 벗어나지 않는다는 뜻입니다. 고른 답이 틀릴 수는 있습니다. 그래서 확신도로 자동 처리 범위를 정하는 설계가 필요합니다.
이미지나 PDF를 넣을 수 있나요?
지원하지 않습니다. 텍스트나 구조화된 필드로 먼저 변환한 다음 state에 넣어야 합니다.
내 데이터로 파인튜닝할 수 있나요?
제공하지 않습니다. 모든 계정이 같은 가중치를 쓰고, 도메인 지식은 state와 질문의 instructions·criteria로 넣습니다. 회사는 고객 요청과 응답을 학습에 쓰지 않는다고 밝혔습니다.
질문을 몇 개까지 한 번에 보낼 수 있나요?
개수 제한 대신 토큰 예산으로 제한됩니다. 요청당 6만 4천 토큰을 상태와 질문이 함께 씁니다. 질문을 늘려도 응답 시간은 거의 그대로입니다.
가중치가 공개되어 있나요?
공개되지 않았습니다. 로컬 실행이나 오픈 웨이트 요구가 발표 직후 토론에서 여러 번 나왔지만 회사는 아키텍처도 당장 공개하지 않겠다고 했습니다.
관련 글