<div align="center">
<img src="https://raw.githubusercontent.com/shaharia-lab/jev-cli/HEAD/assets/banner.png" alt="jev - 터미널, CI 작업 또는 AI 에이전트에서 모든 텍스트에 대해 유형화된 질문을 하고 보정된 확률을 얻으세요." width="1000">
모든 텍스트에 유형화된 질문을 하세요. 단락이 아닌 확률을 받으세요.
jev는 TypeSafe AI의 Jev 모델을 위한 명령줄 도구(command-line tool)입니다. 이 모델은 텍스트를 작성하지 않습니다.
콘텐츠와 정의한 질문을 보내면 보정된 확률을 얻고, 이를 셸 스크립트, CI 작업 또는 AI 에이전트에서 분기 처리할 수 있습니다. 이는 터미널을 위한 **의미론적 if 문(semantic if statement)**입니다.
Release
CI
crates.io
Downloads
Stars
License
빠른 시작(Quick start) · 어디에 사용할 수 있나요?(What can I use it for?) · 문서(Documentation) · 명령어 참조(Command reference) · FAQ
<br>
2초면 되며, 이것이 다음 사람이 jev를 발견하는 방법입니다.
</div>
🎬 작동 모습 보기(See it in action)
질문을 하고, 확률을 얻고, 종료 코드에 따라 분기 처리한 다음, 여러 질문을 한 번에 할 수 있습니다.
jev in a terminal: a yes/no question answered with a probability, a gate that sets the exit code, and a request file answered in one call
[!IMPORTANT]
비공식 프로젝트입니다. jev는 커뮤니티에서 구축되었습니다. 이는 제휴하거나 보증하는 것이 아닙니다.
🤔 이 도구가 해결하는 문제는 무엇인가요?
당신에게 텍스트가 있습니다: 지원 티켓, 커밋 메시지, 사용자의 답변, 제품 리뷰, 모델의 출력물. 당신은 그것에 대한 결정이 필요합니다: 화난 것인지, 어떤 팀이 소유하고 있는지, 위험도가 어느 정도인지, 이 파이프라인을 계속 진행해야 하는지?
오늘날에는 취약한 키워드 규칙을 작성하거나, 대규모 언어 모델(Large Language Model)에 질문을 한 다음, 그 모델이 내일 다르게 표현할 수 있는 문장을 구문 분석해야 합니다.
Jev는 세 번째 선택지입니다. 사용자가 질문과 가능한 답변을 정의합니다. 모델은 각 답변에 대해 숫자를 반환하고, 사용자의 코드가 무엇을 할지 결정합니다.
jev noul "Is this customer angry?" --state "You charged me twice. Fix it now."
answer noul yes 0.91 ██████████████████░░
model jev-1.13.0 (requested jev-latest) · 42 input tokens · est. cost $0.000002 · 1 ms · request req_demo
질문 하나, 숫자 하나로, 백분의 일 센트 정도의 비용입니다. 프롬프트 엔지니어링도, JSON 파싱도, "AI 언어 모델로서" 같은 문구도 필요 없습니다.
| LLM prompt | jev |
|---|
| 반환되는 값 | 구문 분석할 문장 | 정의한 형태의 숫자 |
| ... | | |
💡 무엇에 사용할 수 있나요?
프로그램이 콘텐츠에 대한 판단을 내려야 하는 모든 곳에서 사용 가능합니다. 사람들이 가장 먼저 시도하는 몇 가지 사례는 다음과 같습니다:
| 사용 사례 | 질문 내용 |
|---|
| 지원 티켓 분류(Triage support tickets) | 어떤 팀이 담당할까요, 얼마나 급한가요, 고객은 얼마나 화났나요 |
| ... | |
| 각각의 경우 모두 하나의 명령어로 처리됩니다: | |
jev noul "Is this message angry?" --state-file message.txt --fail-under 0.7
...
더 많은 아이디어와 질문을 효과적으로 작성하는 방법은 좋은 질문 쓰기를 참고하세요.
⚡ 빠른 시작
세 단계, 약 1분 소요, 그리고 극히 적은 비용입니다.
<details open>
<summary><b id="installation">1. 설치</b> - 사용 환경을 선택하세요</summary>
<br>
</details>
<details open>
<summary><b>2. 키 설정하기</b></summary>
<br>
TypeSafe console에서 키를 생성한 후, CI 작업이나 에이전트가 해야 할 것처럼 다음 중 하나를 수행합니다:
export TYPESAFE_API_KEY=...
또는 읽을 수 있는 개인 파일에 한 번 저장할 수도 있습니다:
jev auth login
jev auth status
이 키는 플래그 값으로 절대 승인되지 않기 때문에 셸 히스토리에 남지 않으며, 마지막 네 글자만 표시됩니다.
</details>
<details open>
<summary><b>3. 질문하기</b></summary>
<br>
jev noul "이 메시지는 화난가요?" --state "두 번 청구하셨어요. 지금 고쳐주세요."
파이프하거나 리디렉션해도 동일한 명령은 테이블 대신 JSON을 출력하며, --field noul은 0.91과 아무것도 출력하지 않습니다.
</details>
[!TIP]
하나의 호출로 같은 콘텐츠에 대해 여러 질문을 하세요. 추가 질문은 라운드 트립(round trips)이 아닌 토큰을 소모하며, 콘텐츠는 단 한 번만 비용이 청구됩니다.
❓ 세 가지 종류의 질문
| 유형 | 명령어 | 얻게 되는 값 | 언제 사용해야 하는가 |
|---|
| noul | jev noul | 예일 확률, 0에서 1 사이 | 속성이 존재하거나 존재하지 않는 경우 |
| ... | | | |
확률이 0.5에 가까우면 모델이 판단할 수 없다는 의미이지 '보통'이라는 뜻은 아닙니다. --abstain-band 0.4,0.6을 사용하면 이를 자체 종료 코드로 변환하여 해당 케이스를 사람에게 전달할 수 있습니다. Jev는 문자 그대로 해석하므로 카운트, 산술 연산 또는 날짜 비교는 할 수 없으니 코드에 유의하세요.
자세한 내용 및 작업 예시: 질문 유형 세 가지.
🧩 한 번에 여러 질문하기
하나의 콘텐츠, 여러 질문, 하나의 호출. triage.yaml을 작성하세요:
model: jev-latest
questions:
is_urgent:
...
무료로 확인한 다음 실행합니다:
jev validate -f triage.yaml --state-file ticket.txt
jev eval -f triage.yaml --state-file ticket.txt
jev eval -f triage.yaml --state-file ticket.txt --field answers.department.choice
jev validate는 아무것도 보내지 않으며 키가 필요하지 않습니다. jev eval --dry-run은 더 나아가 정확한 요청 내용과 예상 비용을 출력합니다.
수천 개의 행에 걸쳐 동일한 질문을 병렬 처리(concurrency), 백오프(back-off) 기능과 충돌에도 살아남는 --resume 기능을 사용하여 실행하려면 jev batch run을 사용하십시오: 많은 행 한 번에를 참조하세요.
🔧 스크립트, CI 및 에이전트를 위해 구축됨
표준 출력(stdout)은 데이터입니다. 표준 오류(stderr)는 그 외 모든 것입니다. 종료 코드(Exit codes)는 안정적인 계약이므로 스크립트는 출력을 파싱할 필요가 없습니다:
| 코드 | 의미 |
|---|
| 0 | 성공했으며 모든 게이트 조건이 충족됨 |
| ... | |
if jev noul "Is this ticket about billing?" --state-file ticket.txt --fail-under 0.7 --quiet; then
echo "billing"
fi
전체 테이블, 게이팅 플래그(gating flags), JSON 형태(JSON shapes), 오류 객체(error object), 그리고 GitHub Actions 예시는 스크립팅 및 CI와 종료 코드 및 JSON 계약에 있습니다.
🤖 AI 에이전트를 위해
jev는 에이전트를 사후 고려 사항이 아닌 일급 사용자(first-class users)로 취급합니다.
- 자체 설명적(Self-describing).
jev spec은 모든 명령어, 플래그, 기본값, 종료 코드 및 예시를 하나의 JSON 문서로 출력하며, 모든 --help는 형제 명령어 대신 이 명령어를 언제 사용해야 하는지 알려줍니다.
- 추측이 아닌 스키마(Schema).
jev schema request|questions|batch-record|output|error는 jev가 읽고 쓰는 모든 것에 대한 JSON Schema를 출력합니다.
- 무료 드라이 런(Dry run).
jev validate와 --dry-run은 요청을 오프라인으로 확인하므로, 에이전트는 비용을 지출하기 전에 자체 실수를 수정할 수 있습니다.
- MCP 서버(server).
jev mcp serve는 호출당 지출 한도와 기본적으로 거부되는 파일 접근 권한을 갖춘 MCP 도구와 동일한 기능을 노출합니다.
claude mcp add jev -- jev mcp serve
전체 워크플로우를 가르치는 에이전트 스킬(agent skill)도 있습니다:
claude plugin marketplace add shaharia-lab/jev-cli
claude plugin install jev@jev-cli
Claude Desktop, Cursor, VS Code 및 기타 모든 MCP 클라이언트용 설정과 지출 한도(spend caps)는 AI 에이전트 및 MCP에 있습니다.
🔐 개인 정보 보호 및 보안 (Privacy and security)
- 원격 측정 데이터 전송 없음 (No telemetry, ever).
jev는 오직 두 개의 호스트와 통신합니다: 무언가를 평가할 때 TypeSafe API를 사용하며, 업데이트 확인 시에는 GitHub Releases를 사용합니다. 이 기능은 끌 수 있습니다.
- 콘텐츠는 사용자 소유로 유지됩니다. 콘텐츠는 API로 전송되며 다른 곳으로는 가지 않으며, 명시적으로 로그 기록을 요청하지 않는 한 절대 로그에 작성되지 않습니다.
- 키가 노출되지 않습니다. 플래그(flag)로도, 로그나 오류 메시지에서도, dry-run 출력이나 MCP 결과에서도 키는 노출되지 않습니다. 오직 마지막 네 글자만 표시됩니다.
- HTTPS 전용이며, 인증서 검증을 비활성화할 수 없고 리디렉션(redirects)은 절대 따르지 않습니다.
- 서명된 업데이트 (Signed updates). 모든 다운로드는 무언가를 대체하기 전에 서명 및 체크섬과 비교됩니다.
jev는 스스로 다운그레이드하지 않습니다.
SECURITY.md에는 전체 모델 정보, 릴리스를 직접 검증하는 방법, 취약점을 비공개로 보고하는 방법이 나와 있습니다. 이와 관련하여 공개 이슈(public issue)를 열지 마십시오.
📚 문서화 (Documentation)
<table>
<tr>
<td valign="top" width="50%">
사용자 가이드 (User guide)
</td>
<td valign="top" width="50%">
참고 및 개발 (Reference and development)
</td>
</tr>
</table>
목차
<br>
jev --help
jev spec
jev schema request
</td>
</tr>
</table>
🙋 FAQ
<details>
<summary><b>LLM에 질문하는 것과 어떻게 다른가요?</b></summary>
<br>
LLM은 문장을 작성하며, 사용자는 이를 파싱해야 하고, 내일은 표현 방식이 달라질 수 있습니다.
Jev는 지정된 형태(shape)로 숫자를 반환하므로, 코드가 이 값을 기반으로 분기할 수 있습니다. 또한, 아무것도 생성하지 않기 때문에 훨씬 빠르고 저렴합니다. Jev가 LLM을 대체하는 것은 아니며, 작업이 '결정'일 때 사용하는 도구입니다.
</details>
<details>
<summary><b>비용은 얼마인가요?</b></summary>
<br>
입력 토큰에 대해서만 청구되므로, 짧은 티켓 하나는 아주 작은 돈(fraction of a cent)이 듭니다. jev는 항상 비용을 추정치로 표시하며, --dry-run 플래그를 사용하면 전송하기 전에 실행 비용을 산출할 수 있습니다.
</details>
<details>
<summary><b>TypeSafe 계정이 필요한가요?</b></summary>
<br>
네, 콘텐츠를 평가하는 모든 작업에 필요합니다. 오프라인에서 실행되는 모든 것은 무료이며 키(key)가 필요하지 않습니다: jev validate, jev schema, jev spec, jev completion 및 --dry-run을 사용하는 모든 명령어.
</details>
<details>
<summary><b>답변이 재현 가능한가요?</b></summary>
<br>
비트 단위로 완전히 동일하지는 않습니다. 등가성(equality)보다는 임계값(thresholds)과 비교해야 하며, 안정성을 유지해야 하는 모든 작업에는 jev-1.13.0와 같은 버전이 지정된 모델을 고정(pin)하는 것이 좋습니다. 별도의 통보 없이 새로운 버전으로 이동하는 별칭은 jev-latest입니다.
</details>
<details>
<summary><b>수천 개의 파일에 대해 실행할 수 있나요?</b></summary>
<br>
네. jev batch run은 JSONL 또는 CSV를 스트리밍하기 때문에 파일 크기에 따라 메모리가 증가하지 않으며, API 속도 제한(rate limits)에 도달하면 백오프(back off)하고, 행당 하나의 JSON 레코드를 작성하며, --resume을 사용하여 중단했던 지점부터 재개할 수 있습니다.