모델 레이더
OpenRouter 모델 선택 CLI입니다. 자연어 제약 조건을 token:value 인자로 파싱하고, 모델 메타데이터 + 순위의 로컬 캐시를 조회한 후, 에이전트가 마크다운 테이블로 렌더링할 수 있는 JSON을 출력합니다.
설정
- 런타임: Node.js 18+ (설치 단계 불필요, npm 의존성 없음)
- API 키 불필요 — OpenRouter 공개 엔드포인트 사용
- 모든 명령어는 이 스킬 디렉토리(이 파일이 있는 디렉토리)에서 실행
- 첫 실행 시 네트워크에서 캐시를 채움; 이후 호출은 로컬 캐시 사용 (모델 TTL 6시간, 순위 TTL 24시간)
- 자체 업데이트는 기본적으로 활성화됩니다. 각 CLI 실행 시 고정된 GitHub 소스를 최대 24시간에 한 번 확인하고, 설치된 복사본에 대해 자동으로 업데이트를 적용합니다. 비활성화하려면
MODEL_RADAR_AUTO_UPDATE=0을 설정하세요.
워크플로우
- 스킬을 사용하기 전에
node scripts/self-update.js auto를 실행합니다. stderr에MODEL_RADAR_UPDATED가 출력되면 계속 진행하기 전에 이SKILL.md를 다시 읽으십시오. - 사용자의 요청을 아래 의도 → 토큰 매핑을 사용하여
token:value인자로 파싱합니다. - 명령어를 선택합니다:
list(필터+정렬),recommend(프리셋에 대한 가중치 점수),compare(나란히 비교) - 스킬 디렉토리에서 실행합니다.
scripts/main.js는 자체 업데이트 사전 점검도 자동으로 수행하므로, 직접 CLI를 사용해도 최신 상태를 유지합니다. - JSON 출력을 마크다운 테이블로 렌더링합니다 (출력 참조).
{fetched_at} 기준 데이터로 마무리하고, 12시간보다 오래된 경우refresh를 제안합니다.
명령어
node scripts/main.js list [tokens...] # 필터 + 정렬
node scripts/main.js recommend [tokens...] # 프리셋에 대한 가중치 점수
node scripts/main.js compare <id|name>... # 나란히 비교
node scripts/main.js refresh # 두 캐시 모두 강제 새로고침
node scripts/self-update.js status # 업데이트 상태 확인
node scripts/self-update.js check # GitHub 업데이트 확인
node scripts/self-update.js apply # 최신 스킬 업데이트 적용
자체 업데이트
- 소스는
package.json.repository:primexiao/agent-skills, 경로skills/model-radar로 고정됩니다. - 설치된 복사본은 자동으로 업데이트됩니다. 소스 체크아웃은
MODEL_RADAR_AUTO_UPDATE_SOURCE=1이 설정되지 않는 한 자동 업데이트를 건너뜁니다. - 스킬 디렉토리 아래에 로컬에서 커밋되지 않은 변경 사항이 있으면 자동 업데이트가 건너뜁니다.
scripts/main.js를 직접 사용하면 성공적인 자체 업데이트 후 현재 명령어를 다시 시작하여 업데이트된 코드로 결과가 생성되도록 합니다.- 업데이트는 임시 체크아웃을 사용하고, 필수 파일을 검증하며, 현재 스킬을 백업하고, 런타임 파일이 아닌 파일을 교체한 후, 실패 시 롤백합니다.
- 성공적인 업데이트는
cache/raw.json,cache/models.json,cache/rankings.json을 삭제하여 새 코드가 이전 데이터 캐시와 혼합되지 않도록 합니다. - 자체 업데이트 상태 및 경고는 stderr로 전송됩니다. 명령어 JSON은 stdout에 남습니다.
토큰 문법
Tailwind에서 영감을 받은 위치 기반 token:value 인자입니다. 순서는 중요하지 않습니다.
| 토큰 | 의미 | 값 형식 | 예제 |
|---|---|---|---|
sort | 정렬 차원 | 프리셋 단어 (아래 참조) | sort:cheap sort:popular |
price | $/MTok 블렌드 | ..최대 / 최소.. / 최소..최대 / 단독=최대 | price:..10 price:5..20 |
ctx | 컨텍스트 길이 | 동일, k/m 접미사, 단독=최소 | ctx:128k ctx:128k..1m |
out | 최대 출력 토큰 수 | 동일, 단독=최소 | out:32k |
cap | 기능 (AND) | 쉼표로 구분 | cap:tool_use,reasoning |
in | 입력 모달리티 (AND) | 쉼표로 구분 | in:image in:audio,image |
gen | 출력 모달리티 (AND) | 쉼표로 구분 | gen:image gen:audio |
open | 오픈소스 필터 | true / false | open:true |
top | 결과 개수 제한 | 숫자 (기본값: list=20, recommend=3) | top:5 |
preset | 점수 프리셋 (recommend만) | 프리셋 이름 | preset:coding |
sort 값: cheap expensive new (기본값) ctx popular throughput latency
기능: tool_use reasoning structured_output vision long_output prompt_caching web_search audio_input video_input file_input image_generation audio_output
입력 모달리티: text image audio video file
출력 모달리티: text image audio
추천 프리셋: coding batch chat vision (가중치 및 필수 기능은 config/presets.json 참조)
의도 → 토큰
| 사용자 말 | 토큰 |
|---|---|
| "예산 $X" / "$X 이하" | price:..X |
| "최소 $X" / "프리미엄 티어" | price:X.. |
| "최소 Nk 컨텍스트" | ctx:Nk |
| "툴 사용 / 비전 / 추론 필요" | cap:tool_use / cap:vision / cap:reasoning |
| "구조화된 출력" / "JSON 모드" | cap:structured_output |
| "오디오 / 이미지 입력 가능" | in:audio / in:image |
| "이미지 / 오디오 생성 가능" | gen:image / gen:audio |
| "오픈소스만" | open:true |
| "가장 저렴한" / "가장 합리적인" | sort:cheap |
| "가장 인기 있는" / "트렌딩" | sort:popular |
| "최신" / "최근" | sort:new |
| "가장 빠른" / "가장 낮은 지연 시간" | sort:latency |
| "가장 높은 처리량" | sort:throughput |
| "코딩 에이전트" | recommend preset:coding |
| "배치 / 대량 작업" | recommend preset:batch |
| "비전 에이전트" | recommend preset:vision |
모델 매칭 (compare)
compare의 각 인자에 대한 매칭 우선순위:
- 정확한 id —
anthropic/claude-sonnet-4-5 - 접미사 정확 일치 —
claude-sonnet-4→anthropic/claude-sonnet-4(절대-fast변형 아님) - 부분 문자열 id/name에서, 최신 릴리스 우선 —
claude-sonnet→ 최신 Sonnet
출력
항상 JSON 출력을 마크다운 테이블로 렌더링합니다 — 테이블이 기본 표시 형식입니다.
list
| # | 모델 | $/MTok (P/C/Blend) | Ctx | 출력 | 기능 | 순위# |
$/MTok: 프롬프트 / 완성 / 블렌드 가격기능: 짧은 태그 (toolreasonvision…)순위#: 순위 캐시가 최신이면 인기 순위, 그렇지 않으면—
recommend
| 순위 | 모델 | 점수 | 가격↑ | Ctx↑ | 출력↑ | 기능↑ | $/MTok | 기능 |
모델당 한 줄의 근거를 추가합니다. 점수 및 각 차원 점수는 [0, 1] 범위입니다.
compare
세로 테이블 — 모델당 한 열, 차원당 한 행:
| 차원 | 모델 A | 모델 B | 모델 C |
| ---------------- | ------- | ------- | ------- |
| 가격 (P/C/Blend) | … | … | … |
| 컨텍스트 | … | … | … |
| 최대 출력 | … | … | … |
| 입력 모달리티 | … | … | … |
| 출력 모달리티 | … | … | … |
| 기능 | … | … | … |
| 인기 순위 | … | … | … |
| 주간 요청 | … | … | … |
항상 다음으로 마무리: {fetched_at} 기준 데이터. 12시간보다 오래된 경우, node scripts/main.js refresh 실행을 제안합니다.
캐싱
cache/
raw.json — OpenRouter 프론트엔드 카드 데이터를 로컬 원시 스키마로 변환 (TTL 6시간)
models.json — 확장됨: 정규화된 가격 + 기능 레이블 (TTL 6시간)
rankings.json — 인기 / 처리량 / 지연 시간 + 사용량 분석 (TTL 24시간)
config/
presets.json
tier1-categories.json
- 캐시 파일은
cache/아래에 있으며 커밋되지 않습니다 — 첫 실행 시 네트워크에 접속합니다. - TTL이 만료되면 CLI는 10초 타임아웃으로 다시 가져옵니다.
- 가져오기 실패 시, 스테일 캐시로 폴백하고 stderr에
[warn]을 출력합니다. 따라서 읽기 전용/오프라인 샌드박스에서도 (아마도 스테일된) 응답을 할 수 있습니다. - 성공적인 스킬 자체 업데이트는 모델 데이터 캐시 파일을 삭제합니다. 다음 모델 명령어가 다시 채웁니다.
샌드박스 참고 사항
- Codex CLI:
-s workspace-write(CLI가cache/에 쓰기) 및openrouter.ai로의 네트워크 이그레스가 필요합니다. TTL 내에서는 네트워크 호출이 없습니다. - 새 체크아웃에서의 첫 호출은 엄격하게 네트워크가 필요한 유일한 경우입니다.
- 자체 업데이트는 이 스킬 디렉토리에 대한 파일 시스템 쓰기 액세스와 GitHub에 대한 네트워크 액세스가 필요합니다. 사용할 수 없으면 경고를 출력하거나 건너뛰고, 모델 명령어는 현재 로컬 복사본으로 계속 실행됩니다.
알려진 문제
- OpenRouter 프론트엔드 API (
/api/frontend/v1/models/find?active=true&fmt=cards)는 비공식입니다. 실패하면 CLI는 사용 가능한 경우 스테일 캐시로 폴백하고[warn]을 출력합니다.
데이터 소스
- 모델:
https://openrouter.ai/api/frontend/v1/models/find?active=true&fmt=cards - 순위:
order=top-weekly,order=throughput-high-to-low,order=latency-low-to-high를 사용한 동일한 엔드포인트