JEV / 판단 실험
발표로 보기 →기준을 적고, 바로 시험하기
환불 기준을 시험하거나, 같은 문장을 세 질문 형식으로 비교해 보세요.
Jev의 응답과 앱의 처리 과정을 함께 살펴보는 실험입니다.
실행마다 같은 조건의 새 주문을 만듭니다. 실제 결제·배송·메일 전송은 없습니다.
문의와 기준은 판단을 위해 Cloudflare·TypeSafe로 전송되며 기록은 최대 24시간 보관합니다. 개인정보는 적지 마세요.
처리 결과
입력이 바뀌었습니다. 아래는 이전 실행에 저장한 조건과 결과입니다.
Jev 판단
기준 확인
실행 결과
자세히 보기 · 저장된 기준, 결제와 판단 내역
이번 실행의 기준
결제·환불 원장
저장된 처리 내역
의도 20% 이하는 안내, 80% 미만은 운영자 확인입니다. 자동 처리에는 명확한 요청 범위와 각 기준의 선택 확률 80% 이상이 필요합니다. 수치는 체험 설정이며 정확도가 아닙니다.
Jev 응답과 주문 사실
이전 실행
전체 주문 · 기존 상점 기록
기존 상점 기록은 그대로 보관됩니다. 새 체험의 기준은 이전 주문에 적용되지 않습니다.
ONE INPUT / THREE QUESTIONS
같은 문장, 다른 질문 형식
예·아니오를 묻고, 선택지를 고르고, 정도를 재 봅니다. 같은 입력을 세 질문에 한 번에 보내 결과를 나란히 비교하세요. Jev와 생성 모델도 동시에 실행할 수 있습니다.
실행할 때만 호출합니다. 입력은 Cloudflare·TypeSafe로, 동시 비교 시 Google·OpenAI에도 전송됩니다. 개인정보는 적지 마세요. 환불 체험과 합쳐 분당 5회 실행할 수 있으며, 동시 비교 한 번은 최대 4개 모델 호출을 사용합니다. 실패 시 자동 재시도하지 않습니다.
비교 주제를 불러오고 있습니다.
세 질문과 기준 살펴보기
동시 비교는 Jev, Gemini 3.8 Flash, Gemini 3.5 Flash-Lite, GPT-6 Luna에 각각 한 번씩 요청합니다. Gemini·Luna는 같은 기준을 읽고 JSON으로 예·아니오, 선택지, 정수 점수를 생성합니다. Jev가 제공하는 확률·연속 점수와 함께 읽되, 같은 측정값으로 보지는 마세요.
이번 실행의 결과
입력이 바뀌었습니다. 아래는 이전 실행의 결과입니다. 다시 실행하면 새 문장을 판단합니다.
모델별 시간은 서버에서 호출을 시작해 응답을 검증하기까지의 왕복 시간입니다. 네트워크와 대기 시간도 포함하며 한 번의 결과로 성능이나 정답률을 평가할 수 없습니다. Flash는 thinking low, Flash-Lite는 minimal, Luna는 reasoning none으로 실행하며 생성 토큰 상한은 각각 256입니다.
Noul의 50%는 ‘중간 정도’가 아니라 예·아니오의 확률이 같다는 뜻입니다. Score는 기준의 순서에 따른 점수입니다. confidence는 확률 분포의 집중도를 요약하며, 정답률을 뜻하지 않습니다. 세 질문은 독립적으로 판단하므로 결과가 다를 수 있습니다.
실행 당시 질문과 응답 JSON
JEV / 호출에서 실행까지
응답을 받으면, 다음 코드는 누가 고를까?
Jev는 숫자와 선택지를 반환합니다. 앱은 그 값을 검증한 뒤 if나 switch로 분기하고, 미리 작성한 함수를 호출합니다.
- 01 입력 보내기
- 02 응답 검증
- 03 함수 선택
- 04 서버에서 처리
이 탭은 코드 설명입니다. 읽거나 펼치는 동안 Jev를 호출하지 않습니다. 현재 앱의 코드는 필요한 부분을 추렸고, 연결 패턴을 보여주는 예제는 따로 표시했습니다.
모델마다 호출 코드는 어떻게 다를까?
같은 긴급도 문장을 보낼 때 바뀌는 부분을 비교하세요. 탭을 바꿔도 모델을 호출하지 않습니다.
typesafe/jev
state와 questions를 그대로 보내고, 모델 고유의 확률·선택지·연속 점수를 받습니다.
출력: Noul 확률 · Choice와 분포 · Score와 분포
const raw = await env.AI.run("typesafe/jev", {
state,
questions,
}, { gateway });// 완료 상태, 질문별 타입, 확률 범위·합과 토큰 수를 검사합니다.
const response = validateComparisonAnswer(raw, questions);
// response.answers.choice:
// { choice: "urgent", probabilities: { regular: 0, soon: 0, urgent: 1 }, ... }
// 설명용 분기: 실제 작업 대신 경로 이름을 반환합니다.
function chooseNext(answers) {
const a = answers.choice;
if (a.probabilities[a.choice] < 0.8) return "담당자 확인";
switch (a.choice) {
case "urgent": return "우선 확인";
case "soon": return "빠른 확인";
case "regular": return "일반 순서";
default: return "담당자 확인";
}
}
const next = chooseNext(response.answers);
// 0.8은 설명용 앱 기준이며 모델의 정답률이 아닙니다.google/gemini-3.8-flash
같은 기준을 systemInstruction으로 전달하고 JSON을 생성합니다. Flash-Lite와 요청·검증 구조가 같고, 모델 ID와 thinking 설정이 다릅니다.
thinking: low · 최대 생성 256토큰 · 출력: boolean / 선택지 / 정수
const raw = await env.AI.run("google/gemini-3.8-flash", {
systemInstruction: { parts: [{ text: instructions }] },
contents: [{
role: "user",
parts: [{ text: JSON.stringify({ state }) }],
}],
generationConfig: {
thinkingConfig: { thinkingLevel: "low" },
maxOutputTokens: 256,
responseMimeType: "application/json",
responseJsonSchema: schema,
},
}, { gateway });// raw.candidates[0].content.parts[].text에서 JSON을 읽습니다.
// finishReason === "STOP", 차단 여부, 토큰 수와 JSON 타입을 검사합니다.
const response = generatedAnswer(raw, "google/gemini-3.8-flash", questions);
// 검증 후 answers 예시 (관측 기록이 아닌 형식 예시):
// { noul: true, choice: "urgent", score: 2 }
// 설명용 분기: 실제 작업 대신 경로 이름을 반환합니다.
function chooseNext(answers) {
switch (answers.choice) {
case "urgent": return "우선 확인";
case "soon": return "빠른 확인";
case "regular": return "일반 순서";
default: return "담당자 확인";
}
}
const next = chooseNext(response.answers);
// 생성한 선택지에는 Jev처럼 확률 임계값을 적용하지 않습니다.google/gemini-3.5-flash-lite
Flash와 같은 contents·generationConfig 형식을 쓰는 경량 모델입니다. 이 실험에서는 thinking을 minimal로 설정합니다.
thinking: minimal · 최대 생성 256토큰 · 출력: boolean / 선택지 / 정수
const raw = await env.AI.run("google/gemini-3.5-flash-lite", {
systemInstruction: { parts: [{ text: instructions }] },
contents: [{
role: "user",
parts: [{ text: JSON.stringify({ state }) }],
}],
generationConfig: {
thinkingConfig: { thinkingLevel: "minimal" },
maxOutputTokens: 256,
responseMimeType: "application/json",
responseJsonSchema: schema,
},
}, { gateway });// raw.candidates[0].content.parts[].text에서 JSON을 읽습니다.
// finishReason === "STOP", 차단 여부, 토큰 수와 JSON 타입을 검사합니다.
const response = generatedAnswer(raw, "google/gemini-3.5-flash-lite", questions);
// 검증 후 answers 예시 (관측 기록이 아닌 형식 예시):
// { noul: true, choice: "urgent", score: 2 }
// 설명용 분기: 실제 작업 대신 경로 이름을 반환합니다.
function chooseNext(answers) {
switch (answers.choice) {
case "urgent": return "우선 확인";
case "soon": return "빠른 확인";
case "regular": return "일반 순서";
default: return "담당자 확인";
}
}
const next = chooseNext(response.answers);
// 생성한 선택지에는 Jev처럼 확률 임계값을 적용하지 않습니다.openai/gpt-6-luna
Responses 형식의 instructions·input을 사용합니다. JSON Schema를 text.format에 지정하고 output의 텍스트를 검증합니다.
reasoning: none · 최대 생성 256토큰 · store: false · 출력: boolean / 선택지 / 정수
const raw = await env.AI.run("openai/gpt-6-luna", {
instructions,
input: JSON.stringify({ state }),
reasoning: { effort: "none" },
max_output_tokens: 256,
store: false,
text: { format: {
type: "json_schema", name: "classification", strict: true, schema,
} },
}, { gateway });// status === "completed", error·incomplete_details 없음부터 확인합니다.
// output의 완료된 message에서 output_text를 읽고 JSON 타입을 검사합니다.
const response = generatedAnswer(raw, "openai/gpt-6-luna", questions);
// 검증 후 answers 예시 (관측 기록이 아닌 형식 예시):
// { noul: true, choice: "urgent", score: 2 }
// 설명용 분기: 실제 작업 대신 경로 이름을 반환합니다.
function chooseNext(answers) {
switch (answers.choice) {
case "urgent": return "우선 확인";
case "soon": return "빠른 확인";
case "regular": return "일반 순서";
default: return "담당자 확인";
}
}
const next = chooseNext(response.answers);
// 생성한 선택지에는 Jev처럼 확률 임계값을 적용하지 않습니다.Promise.all · 네 모델
각 요청을 먼저 시작하고 결과를 모읍니다. 오류는 모델마다 처리하므로 한 모델이 실패해도 다른 결과가 남습니다.
모델별 대기 상한 15초 · 자동 재시도 없음 · 환불 실행 없음
// modelInput은 앞의 각 모델 탭에 표시한 요청을 만듭니다.
const results = await Promise.all(models.map(async (model) => {
const input = modelInput(model.id, state, questions);
try {
const raw = await env.AI.run(model.id, input, { gateway });
const response = model.kind === "native"
? validateComparisonAnswer(raw, questions)
: generatedAnswer(raw, model.id, questions);
return { id: model.id, status: "fulfilled", response };
} catch {
return { id: model.id, status: "rejected" };
}
}));
// 실제 구현에는 모델별 15초 대기 상한과 왕복 시간 측정도 있습니다.
// 대기 종료가 제공자 측 추론 취소를 보장하지는 않습니다.// 설명용 화면 연결: 결과별로 성공/실패 카드를 선택합니다.
for (const result of results) {
if (result.status === "fulfilled") {
renderAnswerCard(result.response);
} else {
renderErrorCard(result.id);
}
}
// renderAnswerCard / renderErrorCard는 설명용 함수 이름입니다.
// 실제 비교 화면은 renderModels() 안에서 DOM을 만듭니다.공통 변수와 생략한 부분
state는 문장, questions는 선택한 주제의 Noul·Choice·Score 기준입니다. instructions는 그 기준과 JSON 출력 지시, schema는 boolean·허용된 선택지·0~2 정수의 JSON Schema입니다.
gateway는 기존 Gateway ID와 skipCache: true, collectLog: false를 담습니다. 서버의 입력·호출 제한 검사와 상세 검증 구현은 생략했습니다. 검증에 실패하면 분기 예제에 도달하지 않습니다. 실제 전달한 전체 설정은 비교 결과의 ‘실행 당시 질문과 응답 JSON’에서 볼 수 있습니다.
01 · 현재 앱의 호출 구조
브라우저가 요청하고, Worker가 Jev를 호출한다
‘질문 형식 비교’의 실행 버튼은 문장과 주제 ID를 홈페이지 API에 보냅니다. await는 응답을 기다리고, res.json()은 응답 본문을 JavaScript 객체로 읽습니다.
const res = await fetch("/api/jev/compare", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
presetId: "urgency",
message: "오늘 오후까지 처리해야 업무를 진행할 수 있어요.",
}),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
render(data); // 응답을 세 결과 카드로 표시Worker는 주제 ID에 맞는 Noul·Choice·Score 질문을 가져옵니다. 판단할 자료인 state와 질문 묶음인 questions를 한 번에 보내면 raw에 모델 응답이 들어옵니다. env.AI는 서버의 Cloudflare AI binding입니다.
// Worker 안에서 실행 · body는 읽어 온 요청 본문
const input = validateComparison(body);
const state = { message: input.message };
const questions = input.preset.questions;
const raw = await env.AI.run(
"typesafe/jev",
{ state, questions },
{
gateway: {
id: env.JEV_GATEWAY,
skipCache: true,
collectLog: false,
},
},
);
const response = validateComparisonAnswer(raw, questions);읽기 쉽게 변수 이름과 흐름을 정리했습니다. 실제 Worker에는 출처·입력 크기·호출 횟수 검사, 15초 대기 제한, 오류 응답 처리도 있습니다. 위 조각만으로 완성된 API가 되는 것은 아닙니다.
02 · 실제 관찰한 응답
응답의 타입과 범위를 확인한다
“오늘 오후까지 결제가 취소되지 않으면 업무를 진행할 수 없어요.”를 보냈을 때 받은 응답 일부입니다. Noul은 긴급 요청일 확률 0.94, Choice는 urgent, Score는 2를 반환했습니다.
{
"model": "jev-1.13.0",
"answers": {
"noul": { "type": "noul", "noul": 0.94 },
"choice": {
"type": "choice",
"choice": "urgent",
"probabilities": { "regular": 0, "soon": 0, "urgent": 1 },
"confidence": 1
},
"score": {
"type": "score",
"score": 2,
"probabilities": { "0": 0, "1": 0, "2": 1 },
"confidence": 1
}
}
}validateComparisonAnswer()는 완료된 응답인지 확인하고, 타입·숫자 범위·허용한 선택지·확률 분포를 검사합니다. 검사에 실패하면 결과를 사용하지 않고 오류를 돌려줍니다.
이 수치는 한 번의 실행 기록입니다. 다른 입력이나 실행에서는 달라질 수 있습니다. confidence는 분포의 집중도이며 정답률과 같지 않습니다.
03 · 연결 패턴 예제
반환된 값으로 내가 만든 함수를 호출한다
아래의 handleUrgent() 같은 함수가 다음 동작을 담당합니다. 여기서는 경로 이름만 반환하지만, 앱에서는 화면을 바꾸거나 작업을 등록하는 코드를 함수 안에 넣을 수 있습니다.
Noul → 조건문
‘예’의 확률을 기준과 비교합니다.
Choice → switch
고정된 선택지를 함수에 연결합니다.
Score → 구간
정도의 점수를 구간별로 나눕니다.
// 설명용 함수: 여기서는 실행 경로의 이름만 반환합니다.
function handleUrgent() { return "우선 확인"; }
function handleSoon() { return "빠른 확인"; }
function handleRegular(){ return "일반 순서"; }
function askHuman() { return "담당자 확인"; }
// answers는 검증을 마친 긴급도 응답입니다.
function routeByNoul(answers) {
const p = answers.noul.noul;
if (p >= 0.8) return handleUrgent();
if (p <= 0.2) return handleRegular();
return askHuman();
}
function routeByChoice(answers) {
const a = answers.choice;
if (a.probabilities[a.choice] < 0.8) return askHuman();
switch (a.choice) {
case "urgent": return handleUrgent();
case "soon": return handleSoon();
case "regular": return handleRegular();
default: return askHuman();
}
}
function routeByScore(answers) {
const a = answers.score;
if (a.confidence < 0.8) return askHuman();
if (a.score >= 1.5) return handleUrgent();
if (a.score >= 0.5) return handleSoon();
return handleRegular();
}
// 세 방식 중 앱의 목적에 맞는 연결을 선택합니다.
const next = routeByChoice(response.answers); // "우선 확인"위 응답을 넣으면 세 함수 모두 handleUrgent()를 호출합니다. Noul만으로는 ‘빠른 처리’와 ‘일반 순서’를 나누지 못하므로, 필요한 구분에 맞는 질문 형식을 선택해야 합니다.
0.8·0.2·1.5·0.5는 이 예제에서 정한 기준입니다. 실제로 도입할 때는 자기 데이터로 정해야 합니다. 현재 ‘질문 형식 비교’ 탭은 응답을 화면에 표시하며, 이 예제의 작업 등록이나 환불을 실행하지 않습니다.
04 · 현재 환불 체험에서 실행되는 코드
검증한 판단을 상점 서버의 처리 함수로 넘긴다
환불 체험에서는 Jev에 고객 문의·서버 주문 사실·입력한 환불 기준을 보냅니다. 질문 ID도 refund_requested, request_scope, rule_0처럼 업무별로 붙습니다. trialAnswer()가 응답을 검사해 intent, scope, rules 등의 처리용 값으로 바꿉니다.
// apps/jev-lab/src/shop.mjs · 환불 체험 경로 발췌
const decision = trialAnswer(raw, modelMs, job.trial);
const applied = await call("decide", {
body: {
generation,
ticketId: job.ticketId,
attempt: job.attempt,
decision,
},
});call("decide", …)는 Worker 내부 함수입니다. 인증된 HTTP 요청으로 Python 상점 서버에 판단을 보내고, 서버의 decide()가 세션·실행 회차를 확인한 뒤 decide_trial()을 호출합니다.
- 환불 의도가 20% 이하면 정보 안내로 끝냅니다.
- 의도가 80% 미만이거나 범위·사실·규칙 판단이 불확실하면 운영자 확인으로 보냅니다.
- 기준끼리 충돌하거나 해당 기준이 없거나 운영자 확인을 요구해도 자동 환불을 보류합니다.
# apps/refund-shop/core.py · decide_trial() 마지막 분기
# 앞부분에서 의도·요청 범위·주문 사실·규칙의 확률을 검사합니다.
# 검토가 필요하면 reason에 이유가 담깁니다.
if reason:
self.event(db, t['id'], 'rule', {'rule': reason})
self.finish(db, t, 'review', reason)
elif 'deny' in choices:
self.finish(db, t, 'denied',
'이번 실행에 저장된 기준에 따라 환불할 수 없습니다.')
else:
self.trial_refund(db, t, order, d['scope'], '자동')finish()는 안내·검토·거절 상태와 답변을 저장합니다. 허용 조건을 통과하면 trial_refund()를 호출하고, 이 함수가 환불 금액을 계산해 refund()로 넘깁니다.
금액 계산과 잔액 검사도 보기
# trial_refund()에서 금액을 계산하는 부분
remaining = self.balances(db, order)[2]
amount = max(0, remaining - order['total']) if scope == 'duplicate' else remaining
# 양수인지 확인한 뒤 refund()에 금액과 주문 상태를 전달합니다.
# refund()는 현재 잔액을 다시 읽어 검사합니다.
_, _, remaining = self.balances(db, order)
require(type(amount) is int and 0 < amount <= remaining, 'REFUND_LIMIT', 409)중복분 요청은 결제 잔액에서 주문 금액을 뺀 초과분만, 전체 환불은 잔액을 사용합니다. 최종 함수는 잔액을 다시 검사하고 같은 트랜잭션 안에서 가상 환불 내역을 기록합니다. 이 체험에서 실제 돈은 이동하지 않습니다.
현재 환불 체험의 Score 긴급도는 기록·표시에 사용됩니다. 자동 환불 허용은 의도·범위·사실·기준 판단을 함께 검사하며, 긴급도 점수만으로 결정하지 않습니다.
동작을 따라 읽기
요청을 만들고, 답을 확인하고, 함수로 연결하는 두 장면.
동작을 따라 읽기
문장 하나가 요청이 되기까지
무엇을 읽을지, 무엇을 물을지. 두 가지를 나누면 Jev 요청이 보입니다.
구조를 설명하는 예제입니다. 재생해도 API를 호출하지 않습니다.
? 도형에 마우스를 올리거나 눌러 뜻을 확인하세요.
전달되는 값 자세히 보기
state
{ message: "오늘까지 취소해야 업무를 진행해요." }읽을 정보
state는 판단에 사용할 정보입니다. 여기서는 고객 문장을 넣습니다. 환불 체험에서는 서버가 가진 주문 사실도 함께 전달하며, 고객 문장이 그 사실을 바꾸지는 않습니다.
연결되는 코드JavaScript · 펼치기/접기
// 서버의 Cloudflare Worker 안에서 실행const state = { message: "오늘까지 취소해야 업무를 진행해요.",};const questions = { urgent: { type: "noul", instructions: "message에 임박한 기한이 있나요?", },}; const raw = await env.AI.run( "typesafe/jev", { state, questions }, { gateway: { id: env.JEV_GATEWAY } },);const result = validateResponse(raw);const answer = result.answers.urgent;동작을 따라 읽기
같은 답, 다른 실행 경로
모델이 답한 다음에는 앱의 차례입니다. 기준을 바꾸며 실행할 함수를 따라가 보세요.
고정된 설명용 응답 · Noul 0.94. 실제 측정값이나 운영 권장 기준이 아닙니다.
? 도형에 마우스를 올리거나 눌러 뜻을 확인하세요.
전달되는 값 자세히 보기
answer
{ type: "noul", noul: 0.94 }답을 받기
같은 응답을 고정해 두고 앱의 판단 기준만 바꿔봅니다. Noul의 값과 앱이 정하는 처리 기준은 서로 다른 값입니다.
연결되는 코드JavaScript · 펼치기/접기
// 설명용 응답 · 실제 모델을 호출하지 않습니다.const answer = { type: "noul", noul: 0.94 };const threshold = 0.80; function route(answer) { const p = answer?.noul; if (answer?.type !== "noul" || typeof p !== "number" || !Number.isFinite(p) || p < 0 || p > 1) return "담당자 확인"; if (p >= threshold) return handleUrgent(); return askHuman();}function handleUrgent() { return "우선 확인"; }function askHuman() { return "담당자 확인"; } const next = route(answer);2026. 9. 27. 실제 호출한 응답 10건입니다. 아래 예시 전환과 분류 기준 조절은 새 API를 호출하지 않습니다.
입력 → Jev 판단 → 앱 동작 순서로 읽어보세요.
차분한 푸른 밤
1 입력
차분한 푸른 밤처럼, 입자들이 천천히 흘렀으면 좋겠어.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 색을 원하나요?
Choice푸른색
- 미지정
2% - 무채색
0% - 따뜻한 주황색
0% - 푸른색
98%
분포의 집중도 confidence 0.98
어떤 움직임을 원하나요?
Choice천천히
- 미지정
0% - 활발하게
0% - 정지
0% - 천천히
100%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 764ms · 입력 604토큰
3 앱 동작 예시
푸른색 · 천천히
Jev가 고른 이름을 코드에서 색상과 움직임 설정에 연결합니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "차분한 푸른 밤처럼, 입자들이 천천히 흘렀으면 좋겠어.",
"questions": {
"palette": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 색 조합을 선택하세요. 부정한 색은 제외하고, 색 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"blue": "파랑, 푸른 밤, 차가운 색",
"warm": "주황, 노을, 따뜻한 색",
"gray": "회색, 무채색",
"unspecified": "원하는 색을 특정하지 않음"
}
},
"motion": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 입자의 움직임을 선택하세요. 부정한 움직임은 제외하고, 움직임 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"slow": "천천히 흐르는 차분한 움직임",
"lively": "빠르거나 신나게 튀는 활발한 움직임",
"still": "정지하고 움직이지 않음",
"unspecified": "원하는 움직임을 특정하지 않음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"palette": {
"type": "choice",
"choice": "blue",
"probabilities": {
"unspecified": 0.02,
"gray": 0,
"warm": 0,
"blue": 0.98
},
"confidence": 0.98
},
"motion": {
"type": "choice",
"choice": "slow",
"probabilities": {
"unspecified": 0,
"lively": 0,
"still": 0,
"slow": 1
},
"confidence": 1
}
},
"usage": {
"input_tokens": 604,
"output_tokens": 92
}
},
"elapsed_ms": 764
}활발한 주황색 노을
1 입력
노을처럼 따뜻한 주황색으로, 입자들이 신나게 튀었으면 좋겠어.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 색을 원하나요?
Choice따뜻한 주황색
- 푸른색
0% - 미지정
0% - 무채색
0% - 따뜻한 주황색
100%
분포의 집중도 confidence 1.00
어떤 움직임을 원하나요?
Choice활발하게
- 활발하게
100% - 정지
0% - 천천히
0% - 미지정
0%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 772ms · 입력 606토큰
3 앱 동작 예시
따뜻한 주황색 · 활발하게
Jev가 고른 이름을 코드에서 색상과 움직임 설정에 연결합니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "노을처럼 따뜻한 주황색으로, 입자들이 신나게 튀었으면 좋겠어.",
"questions": {
"palette": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 색 조합을 선택하세요. 부정한 색은 제외하고, 색 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"blue": "파랑, 푸른 밤, 차가운 색",
"warm": "주황, 노을, 따뜻한 색",
"gray": "회색, 무채색",
"unspecified": "원하는 색을 특정하지 않음"
}
},
"motion": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 입자의 움직임을 선택하세요. 부정한 움직임은 제외하고, 움직임 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"slow": "천천히 흐르는 차분한 움직임",
"lively": "빠르거나 신나게 튀는 활발한 움직임",
"still": "정지하고 움직이지 않음",
"unspecified": "원하는 움직임을 특정하지 않음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"palette": {
"type": "choice",
"choice": "warm",
"probabilities": {
"blue": 0,
"unspecified": 0,
"gray": 0,
"warm": 1
},
"confidence": 1
},
"motion": {
"type": "choice",
"choice": "lively",
"probabilities": {
"lively": 1,
"still": 0,
"slow": 0,
"unspecified": 0
},
"confidence": 1
}
},
"usage": {
"input_tokens": 606,
"output_tokens": 93
}
},
"elapsed_ms": 772
}파랑은 빼고, 빠르지 않게
1 입력
푸른색은 빼고 따뜻한 주황색으로 해줘. 움직임은 빠르지 않게, 천천히.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 색을 원하나요?
Choice따뜻한 주황색
- 미지정
0% - 푸른색
0% - 따뜻한 주황색
100% - 무채색
0%
분포의 집중도 confidence 1.00
어떤 움직임을 원하나요?
Choice천천히
- 미지정
0% - 활발하게
0% - 정지
0% - 천천히
100%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 335ms · 입력 610토큰
3 앱 동작 예시
따뜻한 주황색 · 천천히
Jev가 고른 이름을 코드에서 색상과 움직임 설정에 연결합니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "푸른색은 빼고 따뜻한 주황색으로 해줘. 움직임은 빠르지 않게, 천천히.",
"questions": {
"palette": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 색 조합을 선택하세요. 부정한 색은 제외하고, 색 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"blue": "파랑, 푸른 밤, 차가운 색",
"warm": "주황, 노을, 따뜻한 색",
"gray": "회색, 무채색",
"unspecified": "원하는 색을 특정하지 않음"
}
},
"motion": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 입자의 움직임을 선택하세요. 부정한 움직임은 제외하고, 움직임 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"slow": "천천히 흐르는 차분한 움직임",
"lively": "빠르거나 신나게 튀는 활발한 움직임",
"still": "정지하고 움직이지 않음",
"unspecified": "원하는 움직임을 특정하지 않음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"palette": {
"type": "choice",
"choice": "warm",
"probabilities": {
"unspecified": 0,
"blue": 0,
"warm": 1,
"gray": 0
},
"confidence": 1
},
"motion": {
"type": "choice",
"choice": "slow",
"probabilities": {
"unspecified": 0,
"lively": 0,
"still": 0,
"slow": 1
},
"confidence": 1
}
},
"usage": {
"input_tokens": 610,
"output_tokens": 92
}
},
"elapsed_ms": 335
}아무거나 예쁘게
1 입력
아무거나 예쁘게 해줘.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 색을 원하나요?
Choice미지정
- 무채색
0% - 미지정
100% - 따뜻한 주황색
0% - 푸른색
0%
분포의 집중도 confidence 1.00
어떤 움직임을 원하나요?
Choice미지정
- 활발하게
0% - 미지정
100% - 천천히
0% - 정지
0%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 302ms · 입력 587토큰
3 앱 동작 예시
구체적인 설정을 다시 묻기
Jev가 고른 이름을 코드에서 색상과 움직임 설정에 연결합니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "아무거나 예쁘게 해줘.",
"questions": {
"palette": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 색 조합을 선택하세요. 부정한 색은 제외하고, 색 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"blue": "파랑, 푸른 밤, 차가운 색",
"warm": "주황, 노을, 따뜻한 색",
"gray": "회색, 무채색",
"unspecified": "원하는 색을 특정하지 않음"
}
},
"motion": {
"type": "choice",
"instructions": "사용자가 명시적으로 원하는 입자의 움직임을 선택하세요. 부정한 움직임은 제외하고, 움직임 정보가 없으면 unspecified를 선택하세요.",
"criteria": {
"slow": "천천히 흐르는 차분한 움직임",
"lively": "빠르거나 신나게 튀는 활발한 움직임",
"still": "정지하고 움직이지 않음",
"unspecified": "원하는 움직임을 특정하지 않음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"palette": {
"type": "choice",
"choice": "unspecified",
"probabilities": {
"gray": 0,
"unspecified": 1,
"warm": 0,
"blue": 0
},
"confidence": 1
},
"motion": {
"type": "choice",
"choice": "unspecified",
"probabilities": {
"lively": 0,
"unspecified": 1,
"slow": 0,
"still": 0
},
"confidence": 1
}
},
"usage": {
"input_tokens": 587,
"output_tokens": 96
}
},
"elapsed_ms": 302
}게임 말고 시각적인 작품
1 입력
게임 말고 마우스로 직접 움직여보는 시각적인 작품을 보고 싶어.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 작품이 맞나요?
Choice생각의 궤도
- 생각의 궤도
99% - 적합한 작품 없음
0% - 작은 짝맞추기
0% - Matmap
1%
분포의 집중도 confidence 0.99
jev-1.13.0 · 왕복 328ms · 입력 606토큰
3 앱 동작 예시
추천 결과
생각의 궤도
작품 열기 →저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": {
"request": "게임 말고 마우스로 직접 움직여보는 시각적인 작품을 보고 싶어.",
"works": [
{
"id": "orbit",
"title": "생각의 궤도",
"description": "마우스와 속도·밀도 조절로 입자 궤도를 움직이는 브라우저 미디어아트."
},
{
"id": "pairs",
"title": "작은 짝맞추기",
"description": "설치나 로그인 없이 열여섯 장의 카드에서 같은 모양을 찾는 브라우저 게임."
},
{
"id": "matmap",
"title": "Matmap",
"description": "주짓수 포지션과 기술의 연결을 살펴보는 개인 지식그래프."
}
]
},
"questions": {
"work": {
"type": "choice",
"instructions": "request에 가장 적합한 작품을 works에서 하나 고르세요. 사용자가 원하지 않는 경험은 제외하세요. 적합한 작품이 없으면 none을 선택하세요.",
"criteria": {
"orbit": "생각의 궤도",
"pairs": "작은 짝맞추기",
"matmap": "Matmap",
"none": "적합한 작품이 없음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"work": {
"type": "choice",
"choice": "orbit",
"probabilities": {
"orbit": 0.99,
"none": 0,
"pairs": 0,
"matmap": 0.01
},
"confidence": 0.99
}
},
"usage": {
"input_tokens": 606,
"output_tokens": 46
}
},
"elapsed_ms": 328
}주짓수 기술 연결
1 입력
주짓수 포지션에서 다른 기술로 어떻게 연결되는지 보고 싶어.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 작품이 맞나요?
ChoiceMatmap
- 작은 짝맞추기
0% - 적합한 작품 없음
0% - 생각의 궤도
0% - Matmap
100%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 291ms · 입력 604토큰
3 앱 동작 예시
추천 결과
Matmap
작품 열기 →저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": {
"request": "주짓수 포지션에서 다른 기술로 어떻게 연결되는지 보고 싶어.",
"works": [
{
"id": "orbit",
"title": "생각의 궤도",
"description": "마우스와 속도·밀도 조절로 입자 궤도를 움직이는 브라우저 미디어아트."
},
{
"id": "pairs",
"title": "작은 짝맞추기",
"description": "설치나 로그인 없이 열여섯 장의 카드에서 같은 모양을 찾는 브라우저 게임."
},
{
"id": "matmap",
"title": "Matmap",
"description": "주짓수 포지션과 기술의 연결을 살펴보는 개인 지식그래프."
}
]
},
"questions": {
"work": {
"type": "choice",
"instructions": "request에 가장 적합한 작품을 works에서 하나 고르세요. 사용자가 원하지 않는 경험은 제외하세요. 적합한 작품이 없으면 none을 선택하세요.",
"criteria": {
"orbit": "생각의 궤도",
"pairs": "작은 짝맞추기",
"matmap": "Matmap",
"none": "적합한 작품이 없음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"work": {
"type": "choice",
"choice": "matmap",
"probabilities": {
"pairs": 0,
"none": 0,
"orbit": 0,
"matmap": 1
},
"confidence": 1
}
},
"usage": {
"input_tokens": 604,
"output_tokens": 47
}
},
"elapsed_ms": 291
}목록에 없는 동영상 편집기
1 입력
직접 편집할 수 있는 동영상 편집기를 찾고 있어.
직접 작성한 테스트 문장
2 Jev의 실제 응답
어떤 작품이 맞나요?
Choice적합한 작품 없음
- 적합한 작품 없음
91% - Matmap
0% - 작은 짝맞추기
0% - 생각의 궤도
9%
분포의 집중도 confidence 0.88
jev-1.13.0 · 왕복 284ms · 입력 600토큰
3 앱 동작 예시
추천 결과
적합한 작품 없음
다른 관심사를 물어봅니다. 목록에 없는 작품을 만들어 추천하지 않습니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": {
"request": "직접 편집할 수 있는 동영상 편집기를 찾고 있어.",
"works": [
{
"id": "orbit",
"title": "생각의 궤도",
"description": "마우스와 속도·밀도 조절로 입자 궤도를 움직이는 브라우저 미디어아트."
},
{
"id": "pairs",
"title": "작은 짝맞추기",
"description": "설치나 로그인 없이 열여섯 장의 카드에서 같은 모양을 찾는 브라우저 게임."
},
{
"id": "matmap",
"title": "Matmap",
"description": "주짓수 포지션과 기술의 연결을 살펴보는 개인 지식그래프."
}
]
},
"questions": {
"work": {
"type": "choice",
"instructions": "request에 가장 적합한 작품을 works에서 하나 고르세요. 사용자가 원하지 않는 경험은 제외하세요. 적합한 작품이 없으면 none을 선택하세요.",
"criteria": {
"orbit": "생각의 궤도",
"pairs": "작은 짝맞추기",
"matmap": "Matmap",
"none": "적합한 작품이 없음"
}
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"work": {
"type": "choice",
"choice": "none",
"probabilities": {
"none": 0.91,
"matmap": 0,
"pairs": 0,
"orbit": 0.09
},
"confidence": 0.88
}
},
"usage": {
"input_tokens": 600,
"output_tokens": 46
}
},
"elapsed_ms": 284
}중복 결제 환불 요청
1 입력
두 번 결제됐어요. 중복 결제를 환불해 주세요.
직접 작성한 테스트 문장
2 Jev의 실제 응답
환불을 요청했나요?
Noul예 97%
얼마나 급한가요?
Score0 / 2
- 일반 요청
100% - 빠른 처리 희망
0% - 긴급 요청
0%
분포의 집중도 confidence 0.99
jev-1.13.0 · 왕복 320ms · 입력 471토큰
3 앱 동작 예시
접수 경로
환불 검토함
일반 순서 · 긴급도 0
아래 분류 기준을 바꾸면 같은 응답이 다른 접수함으로 향할 수 있습니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "두 번 결제됐어요. 중복 결제를 환불해 주세요.",
"questions": {
"refund_requested": {
"type": "noul",
"instructions": "메시지 작성자가 실제 환불을 명시적으로 요청하고 있나요? 결제 조회나 환불 방법만 묻는 경우, 환불을 원하지 않는다는 표현은 아니오입니다."
},
"urgency": {
"type": "score",
"instructions": "메시지에 명시된 긴급도를 평가하세요. 언급하지 않은 사정이나 기한은 추측하지 마세요.",
"criteria": [
"일반 요청: 기한이나 급함을 언급하지 않음",
"빠른 처리 희망: 빨리 해달라고 하지만 구체적 기한이나 업무 중단은 없음",
"긴급 요청: 오늘 같은 임박한 기한이나 업무 중단을 명시함"
]
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"refund_requested": {
"type": "noul",
"noul": 0.97
},
"urgency": {
"type": "score",
"score": 0,
"legend": {
"0": "일반 요청: 기한이나 급함을 언급하지 않음",
"1": "빠른 처리 희망: 빨리 해달라고 하지만 구체적 기한이나 업무 중단은 없음",
"2": "긴급 요청: 오늘 같은 임박한 기한이나 업무 중단을 명시함"
},
"probabilities": {
"0": 1,
"1": 0,
"2": 0
},
"confidence": 0.99
}
},
"usage": {
"input_tokens": 471,
"output_tokens": 35
}
},
"elapsed_ms": 320
}환불이 아닌 내역 조회
1 입력
환불을 원하는 것은 아니에요. 결제 내역을 확인하는 방법만 알려주세요.
직접 작성한 테스트 문장
2 Jev의 실제 응답
환불을 요청했나요?
Noul예 7%
얼마나 급한가요?
Score0 / 2
- 일반 요청
100% - 빠른 처리 희망
0% - 긴급 요청
0%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 358ms · 입력 481토큰
3 앱 동작 예시
접수 경로
일반 안내함
일반 순서 · 긴급도 0
아래 분류 기준을 바꾸면 같은 응답이 다른 접수함으로 향할 수 있습니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "환불을 원하는 것은 아니에요. 결제 내역을 확인하는 방법만 알려주세요.",
"questions": {
"refund_requested": {
"type": "noul",
"instructions": "메시지 작성자가 실제 환불을 명시적으로 요청하고 있나요? 결제 조회나 환불 방법만 묻는 경우, 환불을 원하지 않는다는 표현은 아니오입니다."
},
"urgency": {
"type": "score",
"instructions": "메시지에 명시된 긴급도를 평가하세요. 언급하지 않은 사정이나 기한은 추측하지 마세요.",
"criteria": [
"일반 요청: 기한이나 급함을 언급하지 않음",
"빠른 처리 희망: 빨리 해달라고 하지만 구체적 기한이나 업무 중단은 없음",
"긴급 요청: 오늘 같은 임박한 기한이나 업무 중단을 명시함"
]
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"refund_requested": {
"type": "noul",
"noul": 0.07
},
"urgency": {
"type": "score",
"score": 0,
"legend": {
"0": "일반 요청: 기한이나 급함을 언급하지 않음",
"1": "빠른 처리 희망: 빨리 해달라고 하지만 구체적 기한이나 업무 중단은 없음",
"2": "긴급 요청: 오늘 같은 임박한 기한이나 업무 중단을 명시함"
},
"probabilities": {
"0": 1,
"1": 0,
"2": 0
},
"confidence": 1
}
},
"usage": {
"input_tokens": 481,
"output_tokens": 35
}
},
"elapsed_ms": 358
}오늘 마감인 환불 요청
1 입력
중복 결제를 환불해 주세요. 오늘 오후에 마감하는 정산 업무가 막혀 있어 오늘 안에 처리가 필요합니다.
직접 작성한 테스트 문장
2 Jev의 실제 응답
환불을 요청했나요?
Noul예 98%
얼마나 급한가요?
Score2 / 2
- 일반 요청
0% - 빠른 처리 희망
0% - 긴급 요청
100%
분포의 집중도 confidence 1.00
jev-1.13.0 · 왕복 274ms · 입력 491토큰
3 앱 동작 예시
접수 경로
환불 검토함
우선 확인 · 긴급도 2
아래 분류 기준을 바꾸면 같은 응답이 다른 접수함으로 향할 수 있습니다.
저장된 응답에 적용한 설명용 규칙입니다. 실제 접수·환불·외부 작업은 실행하지 않습니다.
당시 요청과 응답 JSON 보기
{
"request": {
"model": "typesafe/jev",
"input": {
"state": "중복 결제를 환불해 주세요. 오늘 오후에 마감하는 정산 업무가 막혀 있어 오늘 안에 처리가 필요합니다.",
"questions": {
"refund_requested": {
"type": "noul",
"instructions": "메시지 작성자가 실제 환불을 명시적으로 요청하고 있나요? 결제 조회나 환불 방법만 묻는 경우, 환불을 원하지 않는다는 표현은 아니오입니다."
},
"urgency": {
"type": "score",
"instructions": "메시지에 명시된 긴급도를 평가하세요. 언급하지 않은 사정이나 기한은 추측하지 마세요.",
"criteria": [
"일반 요청: 기한이나 급함을 언급하지 않음",
"빠른 처리 희망: 빨리 해달라고 하지만 구체적 기한이나 업무 중단은 없음",
"긴급 요청: 오늘 같은 임박한 기한이나 업무 중단을 명시함"
]
}
}
}
},
"response": {
"model": "jev-1.13.0",
"answers": {
"refund_requested": {
"type": "noul",
"noul": 0.98
},
"urgency": {
"type": "score",
"score": 2,
"legend": {
"0": "일반 요청: 기한이나 급함을 언급하지 않음",
"1": "빠른 처리 희망: 빨리 해달라고 하지만 구체적 기한이나 업무 중단은 없음",
"2": "긴급 요청: 오늘 같은 임박한 기한이나 업무 중단을 명시함"
},
"probabilities": {
"0": 0,
"1": 0,
"2": 1
},
"confidence": 1
}
},
"usage": {
"input_tokens": 491,
"output_tokens": 35
}
},
"elapsed_ms": 274
}판단 이후의 규칙은 코드에 둡니다
명확한 예·아니오는 자동 분류하고, 그 사이는 담당자에게 보냅니다. 아래 기준은 흐름을 설명하기 위한 예시입니다.
환불 요청 확률이 80% 이상이면 환불 검토함, 20% 이하면 일반 안내함, 그 사이는 담당자 확인함.
Jev가 맡는 작은 판단
앱은 문장과 질문, 가능한 답을 준비합니다. Jev는 선택(Choice), 단계 평가(Score), 예일 확률(Noul)을 돌려줍니다. 그 값을 읽고 무엇을 실행할지는 앱이 정합니다.
이번 결제 문의 예시에서는 환불 의도와 긴급도만 판단했습니다. 실제 환불 자동화에는 결제 내역 확인, 금액 계산, 권한과 중복 실행 검사 같은 별도의 절차가 필요합니다.
confidence는 Choice·Score 확률 분포의 집중도를 요약한 값입니다. 선택된 답의 확률이나 정답률과 같지 않으며 Noul에는 별도 confidence가 없습니다. 위 화면은 모델의 내부 사고가 아닌, 반환된 값과 앱의 규칙을 보여줍니다.
이번에 확인한 것
- 한국어 예시
- 10건 · 각 1회
- 미리 정한 기대 결과
- 10건 모두 일치
- HTTP 왕복 시간
- 중앙값 324ms
- 측정 범위
- 274–772ms
직접 작성한 적은 수의 예시로 연결과 동작을 확인했습니다. 정확도 벤치마크나 일반적인 속도 보장은 아닙니다. 시간에는 네트워크와 Cloudflare 경로가 포함됩니다. 별도로 호출한 영문 1건은 이 집계에 넣지 않았습니다.
다음에 살펴볼 자동화
자료를 모아 읽을 후보를 고르는 흐름을 다음 후보로 생각하고 있습니다. 관심 있는 주제인지, 기존 자료와 겹치는지, 원문을 더 읽을 가치가 있는지를 각각 판단하고 읽을거리 보관함으로 나누는 방식입니다. 아직 구현하지 않은 후속 아이디어입니다.
Jev는 선택지가 정해져 있고 문장의 의미를 읽어야 하는 분기에서 쓰기 좋습니다. 정확한 계산은 코드에, 긴 설명과 글쓰기는 생성 모델에 맡기는 구성이 어울립니다.