trirouter: AI 요청 라우팅 및 제어 엔진
요약
trirouter는 Claude Code, OpenAI Codex 등 AI 모델 호출 전 실행되는 요청 라우팅 및 제어 엔진입니다. 이 도구는 사용할 모델, 추론 노력, 추가 에이전트 개수, 적합한 기술 등을 결정하여 AI 작업의 효율성과 안전성을 높입니다. 사용자들은 Python 패키지 설치와 함께 `trirouter` CLI를 설정하고, 이를 통해 모든 AI 요청을 중앙에서 관리할 수 있습니다.
핵심 포인트
- AI 모델 호출 전 실행되는 핵심 라우팅 엔진입니다.
- 모델 선택, 에이전트 개수, 기술 적합성 등을 결정합니다.
- OpenAI Codex, Claude Code 등 다양한 도구와 연동됩니다.
- Python 패키지 설치 및 CLI를 통해 시스템에 통합됩니다.
trirouter는 Claude Code, OpenAI Codex 또는 Google Antigravity로 보내는 모든 프롬프트 이전에 실행됩니다 – 모든 프로젝트, 데스크톱 앱 및 원격 세션에서 – 그리고 해당 단일 요청에 대해 다음을 결정합니다:
- **어떤 모델(which model)**과 **어떤 추론 노력(reasoning effort)**을 사용할지,
- 병렬로 작업할 수 있는 추가 에이전트의 개수(how many extra agents) (엄격한 토큰 예산),
- 세 가지 도구가 모두 읽는 공유 폴더에서 어떤 **기술(skill)**이 적합한지,
- 요청이 되돌릴 수 없는지(irreversible) (그렇다면 모델은 행동하기 전에 물어봐야 함),
- 답변할 **언어(which language)**가 될지 (프롬프트의 언어).
과거에는 jev-router (저장소: claude-workspace)였으며, 이제는 모든 곳에서 trirouter로 이름이 변경되었습니다: Python 패키지, ~/.trirouter/, 그리고 trirouter MCP 서버 및 예약된 작업에서도 마찬가지입니다. 기존 설치는 python install.py를 통해 마이그레이션됩니다 (상태 폴더 이동, 훅(hooks), MCP 항목, PATH 및 원격 액세스 서비스가 재작성됨). 단계별 내용은 CHANGELOG를 참조하십시오. JEV 자체는 외부 라우팅 엔진으로 남아 있으며 이름을 유지합니다.
또한 실행 중인 작업을 보호합니다: 이전 요청이 아직 처리 중일 때 전송된 프롬프트는 그 뒤에 대기열로 추가되며, 이를 멈추거나 덮어쓰지 않도록 합니다.
결정은 사용자가 TypeSafe 토큰 또는 OpenRouter 키를 구성할 때 **JEV (TypeSafe)**에서 나오며 (JEV는 2026년 9월부터 OpenRouter에 있습니다). 이들이 없다면, 동일한 답변 형식을 가진 내장 로컬 분류기가 결정하며 – 모든 것이 별도의 설정 없이 작동합니다.
필수 요구 사항: Python 3.10 이상 및 Claude Code, Codex CLI 또는 Antigravity CLI 중 최소 하나.
git clone https://github.com/hajdu-patrik/trirouter.git trirouter
dcd trirouter
python install.py # 첫 실행 시: `trirouter` 명령은 아직 존재하지 않음
설정 과정에서 trirouter 명령어도 설치됩니다 (PATH에 추가되는 ~/.trirouter/bin의 런처). 이후 새 터미널을 열고 아무 폴더에서나 trirouter <명령어>를 사용하십시오 – trirouter help은 명령어를 나열하고, trirouter help <명령어>는 man-page와 유사한 페이지를 보여주며, docs/cli.md가 전체 참고 자료입니다.
python install.py <명령어>
그리고 python -m trirouter <명령어>도 사용합니다.
작동을 유지하고 동일한 작업을 수행하려면 (첫 실행 시 또는 런처가 PATH에 없을 때 이들을 사용하세요). 설치 프로그램은 다섯 단계로 안내합니다:
감지(Detect): Claude Code, Codex, Antigravity 중 어떤 것이 설치되어 로그인되었는지 감지하고, 로그인되지 않은 경우 어떻게 로그인해야 하는지 알려줍니다.JEV 접근: TypeSafe 토큰이나 OpenRouter 키(sk-or-...)를 붙여넣거나 Enter를 눌러 내장 로컬 분류기(classifier)를 사용합니다.훅 + MCP 서버: 로그인된 모든 도구에 대해 trirouter 명령어를 위한 훅과 MCP 서버가 설정됩니다.공유 스킬 폴더 (~/.skills): 기존 도구들의 스킬이 여기에 이동하고, 설치 시 SkillSpector로 검사되며 (위험한 경우 격리될 수 있음), 다시 연결되어 각 도구가 이 모든 것을 볼 수 있게 됩니다. 작업자 에이전트(worker agents)는 모든 모델 × 노력(effort)에 대해 생성됩니다.선택적 추가 기능: 휴대폰에서 원격 액세스, 음성-텍스트 변환 등이 있습니다.
모든 변경 사항은 먼저 표시되며, 변경된 설정 파일에는 .bak 사본이 생성되고 재실행해도 안전합니다.
아무것도 변경하지 않고 미리 보기: python install.py --dry-run
(나중에: trirouter setup --dry-run).
| 명령어 | 목적 |
|---|---|
trirouter setup [--dry-run] | 대화형 설정 (python install.py가 실행하는 것) |
trirouter detect | 설치된/로그인된 도구 보고 |
trirouter models [--probe] | 계정이 사용할 수 있는 모델 테스트 (사용자별 저장) |
trirouter remote --name "My PC" [--workdir <폴더>] | 다른 장치에서의 원격 접속 (가이드) |
trirouter uninstall | 훅(hook), MCP 항목, 원격 접속 및 런처 제거 (스킬은 유지됨) |
| `trirouter skills [--apply] [--allow-skill=<이름>] [--scan-llm=on | off] [--accept-flagged] [--quarantine-days=N]` |
| `trirouter quarantine [list | restore <이름>... |
trirouter doctor | 상태 보고서(health report) |
trirouter route [--provider claude] [--json] <텍스트> | 하나의 프롬프트 또는 하위 작업에 대한 라우팅 결정, 부작용 없음 (세부 정보) |
trirouter help [<명령어>], trirouter version | 매뉴얼 페이지, 버전 |
모든 명령어는 플래그를 검증하며(알 수 없거나 잘못된 플래그는 "혹시 ~을 의미하셨나요"라는 힌트와 함께 오류가 발생함), 자체 페이지를 가지고 있습니다: trirouter help skills 또는 trirouter skills --help. 동일한 페이지에는 시작 가이드 및 일반 작업이 docs/cli.md에 있습니다.
설치 후 일회성 단계: Codex는 사용자가 신뢰할 때만 새로운 훅을 실행합니다 (codex → /hooks).
Claude 데스크톱 Chat/Cowork의 경우, 앱을 재시작하고 *설정(Settings) → 프로필(Profile) → 개인 설정(Personal preferences)*에 다음 문구를 추가하세요:
"새로운 요청에 응답하기 전에, 내 메시지와 함께 trirouter route_prompt 도구를 호출하고 그 지침을 따르세요."
prompt ─► hook / MCP 도구 ─► trirouter/core.route()
├─ is_continuation() "mehet" / "yes, do it" → 마지막 결정을 유지
├─ split_pasted() 붙여넣은 블록은 언어나 작업을 결정하지 않음
...
| Surface | Mechanism |
|---|---|
| Claude Code (CLI, desktop Code, Remote Control) | UserPromptSubmit, Stop, StopFailure, SessionEnd, SubagentStart hooks; SessionStart는 만료된 격리 항목만 삭제함 |
| Codex (CLI, ChatGPT app in Codex mode) | UserPromptSubmit + Stop hooks |
| Antigravity (CLI, desktop app) | PreInvocation + Stop hooks (프롬프트는 기록에서 읽어와 턴당 한 번 주입됨) |
| Claude desktop Chat / Cowork (훅 없음) | MCP 도구 route_prompt |
| Claude Code on the web (클라우드 샌드박스) | --cloud-only를 사용한 프로젝트 훅 |
| Scripts, other agents and projects (하위 작업별) | shim ~/.trirouter/bin/route.py를 통한 route 명령어 |
어떤 도구도 실행 중인 모델을 전환하는 훅을 허용하지 않습니다. 따라서 trirouter는 (모델, 노력) 쌍당 하나의 워커 에이전트를 생성합니다 – Claude 하위 에이전트 <model>-worker-<effort> (그리고 test-worker-<effort>), Codex 역할 <model>-<effort> – 그리고 라우터가 적절한 곳으로 위임합니다. Antigravity 에이전트는 노력(effort)이 아닌 모델 티어(flash / pro)만 고정할 수 있으며, 하위 에이전트로만 가능합니다: trirouter는 gemini-flash-worker와 gemini-pro-worker (~/.gemini/config/agents/)를 생성하고, 강제 요청은 Pro용으로 위임됩니다; 그렇지 않으면 모델 선택은 자문적입니다 (또는 cli-bridge를 통해 강제됨).
각 에이전트의 지침은 models.json에 있는 해당 모델의 역할(role) 템플릿에서 가져옵니다 – fast, balanced, deep (trirouter/templates/agents/<role>-worker.md)와 테스트 티어용 test-worker가 있습니다 – 따라서 새로운 모델은 새로운 템플릿이 아니라 models.json에 한 줄만 추가하면 됩니다.
| Provider | 모델 (카탈로그: trirouter/config/models.json ) |
노력 수준 (Effort levels) |
|---|---|---|
| Claude | fable, sonnet, opus – 일반 별칭만 사용 가능하며, Haiku는 절대 불가 | low · medium · high · xhigh · max |
| Codex | gpt-6-luna, gpt-5.6-terra, gpt-5.6-luna, gpt-reserve (기본값); models --probe 이후 더 많은 모델 사용 가능 | low … max (모델별) |
| Antigravity | Gemini 3.8 / 3.7 / 3.6 Flash, Gemini 3.1 Pro, Claude Sonnet/Opus 4.6, GPT-OSS 120B | 모델 이름의 일부 |
ultra 노력 수준은 제공되지 않으며, 어떤 답변에서도 제거되고 워커가 없습니다.
단순한 진행 허가 또는 상태 확인(
세 가지 도구 모두 에이전트가 바쁜 동안 입력된 메시지를 이미 큐에 넣습니다. trirouter는 누락된 컨텍스트를 추가합니다: 새로운 프롬프트에는 같은 세션의 이전 작업이 여전히 실행 중이며 먼저 완료되어야 한다는 점이 알려지며, 이는 절대 중단되거나 재시작되거나 덮어쓰여지지 않습니다. 만약 다른 세션이 같은 폴더에서 작동한다면, 해당 프롬프트는 그 세션의 파일을 수정하지 않도록 경고를 받습니다. Claude의 StopFailure(API 오류로 인해 종료된 턴)와 SessionEnd도 큐를 해제하며, 상태가 자동으로 만료되므로 충돌한 세션이 아무것도 차단하는 일이 없습니다.
doctor는 또한 **위임 준수(delegation compliance)**를 보고합니다: SubagentStart 후크는 모델이 실제로 시작한 워커를 기록하므로, 라우터의 조언을 얼마나 자주 따랐는지 확인할 수 있습니다.
~/.skills는 단일 스킬 폴더입니다. Claude Code와 Codex는 이를 개별 스킬 링크(Windows에서는 접합점(junction), 다른 곳에서는 심볼릭 링크(symlinks))를 통해 처리합니다. Antigravity는 skills.json을 통해 처리합니다. 도구가 자체 관리하는 스킬(Claude desktop의 동기화된 스킬, 플러그인, Codex 내장 기능)은 제자리에 유지되지만 인덱싱도 되어 라우터가 한 도구의 스킬을 다른 도구에 전달할 수 있습니다(
더 이상 어떤 도구도 그것을 인식하지 못합니다 – 연결은 제거되고, 카탈로그를 떠나며, Antigravity(전체 허브를 읽는)조차 그것을 찾지 못하게 됩니다. 질문은 전체 배치에 대해 번호가 매겨진 목록으로 한 번만 요청됩니다:
1. agent-platform-deploy (risk 79, max HIGH)
2. impeccable (risk 100, max HIGH)
Quarantine these skills? [a]ll / [n]one / [s]elect (default: none)
a는 모두 격리하고, n 또는 Enter는 모두 유지하며, s는 번호를 요청합니다(1,3,5-8), 두 그룹을 보여주고 최종 y를 원합니다. 유지하는 스킬은 연결 상태가 유지되며 해당 콘텐츠에 대해 정확하게 기억됩니다: 스킬이 변경될 때만 다시 요청받습니다.
자동 정리(Automatic purge): 격리된 스킬은 3일 후에 영구적으로 삭제됩니다 (사이드카 ~/.trirouter/quarantine/<name>.json가 언제 격리되었는지, 위험도 및 제거 날짜를 기록합니다). config.json의 skillscan.quarantine_days(--quarantine-days=N, 기억됨; 0 = 절대 아님)는 보존 기간을 변경합니다. 만료된 항목은 모든 setup 및 skills --apply에서, 그리고 최대 6시간마다 Claude Code 세션이 시작될 때 정리됩니다. 오직 ~/.trirouter/quarantine 내부의 폴더만 삭제되며 연결은 절대 따라가지 않습니다. 3일 이내에: trirouter quarantine는 제거 날짜와 함께 항목을 나열하고, trirouter quarantine restore <name>은 하나를 ~/.skills로 되돌리며 허용하고, trirouter quarantine purge [--all]는 지금 삭제할 수 있습니다.
왜 차단 대신 요청하는가: anthropics/skills의 19개 스킬에 대한 테스트에서 SkillSpector 2.12는 7개의 합법적인 항목을 DO_NOT_INSTALL(docx, xlsx, pptx, mcp-builder, skill-creator, webapp-testing, claude-api)로 평가했습니다 – subprocess를 호출하거나 파일을 읽는 스크립트는 정적 분석에 데이터 유출처럼 보이고, 그 LLM 메타 분석도 이러한 판결을 변경하지 않았습니다.
재정의(Override): --allow-skill=<name>[,<name>]은 이 스킬들에 대해 절대 묻지 않으며 격리된 곳에서 복원합니다 ( trirouter quarantine restore <name>도 마찬가지입니다); 이 목록은 config.json에 기억됩니다 (skillscan.allow)
)).검토 후 모두 유지하기 (Keep all after a review): skills --apply --accept-flagged
현재 DO_NOT_INSTALL로 평가된 모든 스킬을, '없음(none)'이라고 답하는 것처럼 질문 없이 유지합니다. 이는 현재 내용에 바인딩되기 때문에, 변경된 스킬은 다시 질문받게 됩니다. 스킬의 출처는 검증할 수 없습니다 (프런트매터가 어떤 작가를 주장할 수도 있으므로), 따라서 발행자에 의한 허용 목록은 존재하지 않습니다.기본적으로 정적 (Static by default): 이 스캔은 --no-llm으로 실행되므로, 어떠한 스킬 내용도 기계를 벗어나지 않습니다. --scan-llm=on
(이는 skillscan.llm으로 기억됩니다.)
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Claude Ecosystem의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기