API / 모델 프록시 / 하네스 플러그인. 영상이 네 번째 비공개 훅.
X · 2026-09-17
트윗은 하네스 분기이고, GitHub의 jev-router는 Claude 모델 갈아끼우기다. /model의 Jev Auto는 공식 env 한 줄이다.
읽기 전에
이 글이 묻는 것: 트윗의 Jev, npm의 jev-router, Claude Code /model의 Jev Auto는 같은 물건인가?
Jev는 채팅 모델이 아니라 typed classifier다. 그 위에 세 구현이 얹힌다. (1) Lahfir의 하네스 분기 — 공개본은 lahfir/claude-plugins. (2) Pratyush의 모델 분기 — gargpratyush/jev-router, Claude 안에서만. (3) TypeSafe API 자체 — TypeSafe 문서. /model 행은 Claude를 해킹한 결과가 아니라 Claude Code env-vars의 커스텀 옵션 1개다.
요약만: 6분. 소스 경로까지: 18분.
Executive Summary
2026-09-17 05:01 KST, Lahfir는 Jev가 로컬 하네스/모델 라우팅을 해결했다고 썼다. 영상은 node .claude/pick-model.mjs가 디프 리뷰를 Opencode/Gemini 3.8 Flash로 보낸다. 공개된 가까운 구현은 같은 날의 delegate 플러그인이다. 댓글의 jev-router는 Claude 모델만 갈아끼운다.
API / 모델 프록시 / 하네스 플러그인. 영상이 네 번째 비공개 훅.
jev-router 패키지는 registry에 없다. clone 후 npm link.
CUSTOM_MODEL_OPTION 센티널. 프록시만 실제 id로 재작성.
jev-claude는 ~/.local/bin/claude를 띄운다. 별칭 llmux run을 건너뛴다.
팩트체크
신뢰도
B
트윗·영상·세 공개 레포·공식 env 문서는 맞다. README의 npm 설치는 거짓. 43%와 “무료 키”는 미검증. pick-model.mjs는 공개 레포에 없다.
검증일 2026-09-17. 트윗은 aside 로그인 세션으로 영어 원문 추출. 소스는 git clone HEAD a5694a6 / delegate 724676a. npm registry와 Claude Code 문서는 같은 날 조회.
TypeSafe Jev는 System One 모델이고 systemOne API는 state + typed questions를 받는다.
ANTHROPIC_CUSTOM_MODEL_OPTION은 /model에 커스텀 행 1개를 추가하고, 그 ID는 검증하지 않는다. 커스텀 BASE_URL에서는 모델 이름이 통과한다.
jev-claude는 위 env를 AUTO_MODEL=jev-auto로 주입하고, 키가 있으면 127.0.0.1 프록시를 ANTHROPIC_BASE_URL로 건다. bin/jev-claude.mjs:21–32, 116–119. src/config.mjs:32.
README의 npm install -g jev-router는 2026-09-17 기준 설치 경로가 아니다. registry.npmjs.org/jev-router → HTTP 404. @typesafe-ai/sdk 0.6.0은 존재한다.
@typesafe-ai/sdk · 직접 GET 영수증
Lahfir는 하네스 라우터를 MIT로 공개했다. marketplace lahfir-plugins, 플러그인 delegate. 트윗과 같은 날 업데이트.
영상 속 pick-model.mjs는 delegate와 같은 클래스지만 그 파일은 lahfir 공개 레포에서 검색되지 않았다. 공개 등가물은 delegate.mjs다.
lahfir/claude-plugins · 영상 포스터 img/tweet-video-poster.jpg
README “Get a key from TypeSafe for free.” 문서 인덱스·퀵스타트에 가격/프리티어 문장이 없다. 키 발급 URL만 있다.
이 머신: zsh alias claude=llmux run. PATH의 실행 파일은 ~/.local/bin/claude → 2.1.274. jev-claude resolveClaude()는 accessSync라 별칭을 건너뛴다. settings.statusLine이 이미 있어 jev statusline 주입은 스킵된다.
로컬 which/settings.json · Claude Code 설치
원본 (완역)
Lahfir @mdlahfir, 2026년 9월 17일 오전 5:01.
Jev가 로컬 하네스/모델 라우팅을 해결했습니다.
저는 Claude Code, Codex, Opencode의 조합을 로컬 에이전틱 스택으로 사용하며, 다른 하네스에 대한 라우팅은 항상 시스템 프롬프트/규칙에서 강제되었습니다.
Claude Code가 위임 전에 결정할 수 있는 결정론적 훅으로, Jev는 작업에 따라 올바른 하네스/모델로 라우팅하는 데 도움을 주며, 작업의 강도/지능에 따라 꽤 정확합니다.
기계적 작업은 Haiku로 라우팅됩니다
지능적인 작업은 Opus 하위 에이전트로 라우팅됩니다
장기 실행 구현 작업은 외부 하네스로 라우팅됩니다
node .claude/pick-model.mjs "read the whole staging..integration diff and report findings with file:line". 결과: opencode · openrouter/google/gemini-3.8-flash (harness picked) conf 0.90. 막대: 0.93 / opus 0.06 / sonnet 0.01.조회 31,294 · 답글 11 · 재게시 23 · 좋아요 197 · 북마크 223 (aside 캡처 시점).
유용한 패턴은 정책 기반 라우팅이다. 먼저 작업 복잡도를 분류하고, 기계적 일은 싼 모델로, 깊거나 오래 가는 일은 더 강한 전문가로 보낸다.
Lahfir: “Exactly. 결정 지점이 여러 개인 엔터프라이즈 워크플로에서 큰 쓰임새라고 본다.” 동의 댓글
나는 Claude Code 사용자 전용으로 하나 만들었다. 여기서 누구나 해볼 수 있다: gargpratyush/jev-router
Lahfir: “This is amazing!”
Zee @mozoobear: “오픈소스 할 건가요?”
Lahfir의 답 카드는 lahfir/agent-desktop — “Agent Desktop gives any agent reliable computer use on the desktop.” 라우터와 다른 물건이다. 같은 날 공개된 가까운 물건은 lahfir/claude-plugins.
WunderCorp: “Nice routing feature! We’ll put this in loki.computer asap.”
Jev는 TypeSafe의 System One 모델이다. 문장: state와 typed question을 보내고, 코드가 바로 쓰는 구조화 답을 받는다. 텍스트 생성도 파싱도 없다. 질문 종류는 Choice / Score / Noul. 여러 질문을 한 호출에서 병렬 평가한다. TypeSafe 문서 intent-routing
jev-router는 JS SDK @typesafe-ai/sdk의 TypeSafeClient.systemOne을 쓴다 (src/router.mjs). delegate는 SDK 없이 POST https://api.typesafe.ai/v1/systemone에 Bearer 키를 붙인다 (delegate.mjs:203). 모델 필드는 jev-latest.
에이전트에게 API 쓰는 법을 가르치는 스킬은 따로 있다. TypeSafe agent skill — claude plugin marketplace add typesafe-ai/skills 후 typesafe@typesafe-ai. 이것은 /model 행이 아니다.
트윗의 라우팅 축은 누구를 실행할 것인가다. Haiku와 Opus는 Claude Code 안의 티어고, “외부 하네스”는 Codex/Opencode 같은 다른 CLI 다. 영상은 후자를 보여 준다: 분류기가 하네스 이름과 모델 id를 고르고, 노란 프롬프트에 opencode run -m openrouter/google/gemini-3.8-flash가 남는다.
예전의 방법(시스템 프롬프트에 “이런 일은 Codex로”)은 모델이 잊거나 무시할 수 있다. 훅은 위임 전에 결정한다. delegate 스킬도 같은 계약이다: “The plugin decides. You launch.” 스크립트는 실행하지 않는다.
catman의 “policy-based routing”은 이 구조의 일반형이다. TypeSafe 문서의 intent-routing과 같다: 싼 분류 1회 후, 코드 / 전문 모델 / 사람으로 분기. intent-routing
Claude Code는 시작 시 환경변수를 읽어 빌트인 행 뒤에 커스텀 행 하나를 붙인다. Claude Code env-vars Claude Code model-config
| 변수 | jev-claude가 넣는 값 |
|---|---|
ANTHROPIC_CUSTOM_MODEL_OPTION | jev-auto (src/config.mjs:32 AUTO_MODEL) |
ANTHROPIC_CUSTOM_MODEL_OPTION_NAME | Jev Auto |
ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION | Route each turn to the cheapest model that can do it |
ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES | thinking,adaptive_thinking,interleaved_thinking,effort,max_effort |
ANTHROPIC_MODEL | 비어 있으면 jev-auto (세션만. settings에 안 씀) |
ANTHROPIC_BASE_URL | http://127.0.0.1:<loopback port> |
주입 위치: bin/jev-claude.mjs autoModelEnv() 21–32행. 키가 있을 때만 startProxy() 후 Object.assign (116–119행). 키 없으면 라우팅 없이 일반 claude를 띄우고 stderr에 경고.
왜 가짜 이름이 통과하나. 공식 문서: 인식 검사는 Anthropic API에서만 돈다. 커스텀 BASE_URL에서는 공급자가 이름을 정의하므로 아무 문자열이나 통과한다. CUSTOM_MODEL_OPTION ID도 검증을 건너뛴다. 그래서 센티널 jev-auto가 프록시에 그대로 도착한다.
프록시 (src/proxy.mjs):
HEAD / → 200. Claude Code가 첫 요청 전 프로브./v1/messages가 아니면 그대로 업스트림.body.model !== 'jev-auto' → 통과. 유저가 고른 모델 + 내부 Haiku 제목/요약 호출.티어 id (src/config.mjs): haiku claude-haiku-4-5-20251001 (thinking/effort 없음) · sonnet claude-sonnet-5 · opus claude-opus-5 · fable claude-fable-5-1 (JEV_ALLOW_FABLE=1).
UI는 요청한 이름만 보여 준다. 그래서 status line을 주입하려 한다. 이미 statusLine이 있으면 코드를 건드리지 않는다 (bin/jev-claude.mjs:47–55). Enter로 고르면 settings.json.model에 jev-auto가 저장된다. 종료 시 이전 값으로 되돌린다 (src/settings.mjs). 크래시하면 일반 claude가 가짜 이름으로 깨질 수 있다.
src/policy.mjs decide(), 테스트 test/policy.test.mjs. 순서:
use opus / switch to haiku 류 → 그 티어. Jev를 이긴다.Jev 질문은 “답의 길이가 아니라 요구되는 추론”을 보라고 못 박는다. README: “answer in one sentence”인 하드 디버그가 Haiku 0.21에서 Opus 0.81로 옮겨졌다 — 저자 측정, 여기선 재현 안 함.
타임아웃: 시도 1.5s, 전체 3s, 재시도 1회. 실패는 라우팅을 막지 않는다 (fail-open).
| 층 | 공개 | 하는 일 | /model 행 |
|---|---|---|---|
| TypeSafe Jev API | 문서·SDK·콘솔 | classifier | 없음 |
| typesafe-ai/skills | 플러그인 MIT | 에이전트에게 API 사용법 | 없음 |
| jev-router | GitHub MIT. npm 없음 | Claude 모델 티어 재작성 | 있음 (jev-auto) |
| delegate 플러그인 | GitHub MIT | 세션/서브에이전트/외부 CLI 선택. 실행 안 함 | 없음 |
| agent-desktop | GitHub Apache-2.0 | 데스크톱 computer-use | 없음 |
| pick-model.mjs | 영상만 | 분류 + opencode 론치 데모 | 없음 |
| TypeSafe 가격 | 문서에 없음 | — | — |
프롬프트 텍스트는 라우팅 결정 때 TypeSafe로 간다 (jev-router README Limitations). 그 외는 안 간다. delegate도 task 문자열만 state에 넣는다.
이 머신 전제: claude는 llmux run 별칭. 실행 파일은 ~/.local/bin/claude (2.1.274). settings.model은 grok[1m]. statusLine은 bash ~/.claude/statusline-command.sh. ~/.jev-claude.env 없음.
claude를 jev-claude로 바꾸지 않는다. llmux 모델(grok[1m], gpt-6-astra)이 그 세션에서 사라진다.npm install -g jev-router는 오늘 404다.zbrain은 이미 서브에이전트·trinity·llmux가 있다. 분류만 빌려 오고 론치는 기존 게이트에 두는 편이 맞다.
/plugin marketplace add lahfir/claude-plugins
/plugin install delegate@lahfir-plugins
/delegate:setup
# TYPESAFE_API_KEY를 셸이나 프로젝트 env에
/delegate:route <task>
allowlist의 fits는 “무엇을 주고 무엇을 주지 않는지”를 같이 써야 한다. 칭찬만 있으면 그 옵션이 전부 이긴다. 스크립트는 명령을 돌려줄 뿐 실행하지 않는다. 외부 CLI 론치는 기존 유저 게이트를 유지한다.
git clone https://github.com/gargpratyush/jev-router
cd jev-router && npm install
echo 'JEV_API_KEY=…' > ~/.jev-claude.env
JEV_NO_STATUSLINE=1 node bin/jev-claude.mjs
JEV_NO_STATUSLINE=1: 기존 statusLine을 덮지 못하게. 라우팅 결과는 TUI에 안 보인다. 보려면 ~/.jev-claude.log (JEV_DEBUG=1) 또는 statusline-command.sh에 tmp/jev-claude/<session>.json 읽기를 합친다 — 합치기는 별 작업이다.
이 세션은 구독 Claude만 쓴다. llmux 모델은 없다. 그게 목표면 쓰지 않는다.
프록시 없이 행만 추가하는 것은 공식 계약이다. 다만 센티널 이름을 Anthropic이 받으면 첫 요청이 실패한다. 행 + 재작성은 항상 쌍이다.
원본 링크·인용
본문 인라인 링크가 정본이다. 이 목록은 보조.
기타
캡처 2026-09-17. ui-ux-ref openai. 원문 원문 트윗.