Model Radar
CLI de seleção de modelos do OpenRouter. Interpreta restrições em linguagem natural como argumentos token:valor, consulta um cache local de metadados e rankings dos modelos, e emite JSON para o agente renderizar como uma tabela markdown.
Configuração
- Ambiente de execução: Node.js 18+ (sem etapa de instalação e sem dependências npm)
- Sem chave de API — usa endpoints públicos do OpenRouter
- Execute todos os comandos a partir deste diretório da habilidade (o que contém este arquivo)
- A primeira execução popula o cache a partir da rede; chamadas subsequentes usam o cache local (TTL de modelos: 6h, TTL de rankings: 24h)
- Auto-atualização está habilitada por padrão. Cada execução da CLI verifica a fonte fixa do GitHub no máximo uma vez a cada 24h e aplica atualizações automaticamente para cópias instaladas. Defina
MODEL_RADAR_AUTO_UPDATE=0para desabilitar.
Fluxo de Trabalho
- Execute
node scripts/self-update.js autoantes de usar a habilidade. Se stderr imprimirMODEL_RADAR_UPDATED, releia esteSKILL.mdantes de continuar. - Analise a solicitação do usuário em argumentos
token:valorusando o mapeamento Intenção → Token abaixo - Escolha o comando:
list(filtrar+ordenar),recommend(pontuação ponderada contra uma predefinição),compare(lado a lado) - Execute a partir do diretório da habilidade.
scripts/main.jstambém executa a mesma verificação prévia de auto-atualização automaticamente, então o uso direto da CLI permanece atualizado. - Renderize a saída JSON como uma tabela markdown (veja Saída)
- Termine com
Dados de {fetched_at}; sugirarefreshse mais antigo que 12h
Comandos
node scripts/main.js list [tokens...] # filtrar + ordenar
node scripts/main.js recommend [tokens...] # pontuação ponderada contra uma predefinição
node scripts/main.js compare <id|nome>... # comparação lado a lado
node scripts/main.js refresh # forçar atualização de ambos os caches
node scripts/self-update.js status # inspecionar estado da atualização
node scripts/self-update.js check # verificar GitHub por atualizações
node scripts/self-update.js apply # aplicar a atualização mais recente da habilidade
Auto-Atualização
- A fonte é fixada por
package.json.repository:primexiao/agent-skills, caminhoskills/model-radar. - Cópias instaladas são atualizadas automaticamente. Checkouts da fonte ignoram auto-atualização a menos que
MODEL_RADAR_AUTO_UPDATE_SOURCE=1esteja definido. - Alterações locais não commitadas sob o diretório da habilidade fazem com que a auto-atualização seja ignorada.
- O uso direto de
scripts/main.jsreinicia o comando atual após uma auto-atualização bem-sucedida, para que o resultado seja produzido pelo código atualizado. - As atualizações usam um checkout temporário, validam arquivos necessários, fazem backup da habilidade atual, substituem arquivos não relacionados ao runtime e revertem em caso de falha.
- Atualizações bem-sucedidas limpam
cache/raw.json,cache/models.jsonecache/rankings.jsonpara que o novo código não se misture com o cache de dados antigo. - Status e avisos da auto-atualização vão para stderr. O JSON do comando permanece no stdout.
Sintaxe de Token
Argumentos posicionais token:valor inspirados no Tailwind. A ordem não importa.
| Token | Significado | Formato do valor | Exemplos |
|---|---|---|---|
sort | dimensão de ordenação | palavra predefinida (veja abaixo) | sort:cheap sort:popular |
price | $/MTok combinado | ..max / min.. / min..max / bare= max | price:..10 price:5..20 |
ctx | tamanho do contexto | mesmo, sufixo k/m, bare= min | ctx:128k ctx:128k..1m |
out | máximo de tokens de saída | mesmo, bare= min | out:32k |
cap | capacidades (E) | separados por vírgula | cap:tool_use,reasoning |
in | modalidades de entrada (E) | separados por vírgula | in:image in:audio,image |
gen | modalidades de saída (E) | separados por vírgula | gen:image gen:audio |
open | filtro de código aberto | true / false | open:true |
top | limite de resultados | número (padrão: list=20, recommend=3) | top:5 |
preset | predefinição de pontuação (apenas recommend) | nome da predefinição | preset:coding |
Valores de sort: cheap expensive new (padrão) ctx popular throughput latency
Capacidades: tool_use reasoning structured_output vision long_output prompt_caching web_search audio_input video_input file_input image_generation audio_output
Modalidades de entrada: text image audio video file
Modalidades de saída: text image audio
Predefinições de recomendação: coding batch chat vision (veja config/presets.json para pesos e capacidades necessárias)
Intenção → Token
| Usuário diz | Token(s) |
|---|---|
| "orçamento $X" / "abaixo de $X" | price:..X |
| "pelo menos $X" / "nível premium" | price:X.. |
| "pelo menos Nk de contexto" | ctx:Nk |
| "precisa de tool use / visão / raciocínio" | cap:tool_use / cap:vision / cap:reasoning |
| "saída estruturada" / "modo JSON" | cap:structured_output |
| "pode receber entrada de áudio / imagem" | in:audio / in:image |
| "pode gerar imagens / áudio" | gen:image / gen:audio |
| "apenas código aberto" | open:true |
| "mais barato" / "mais acessível" | sort:cheap |
| "mais popular" / "em tendência" | sort:popular |
| "mais novo" / "mais recente" | sort:new |
| "mais rápido" / "menor latência" | sort:latency |
| "maior taxa de transferência" | sort:throughput |
| "agente de codificação" | recommend preset:coding |
| "trabalho em lote / em massa" | recommend preset:batch |
| "agente de visão" | recommend preset:vision |
Correspondência de Modelos (compare)
Prioridade de correspondência para cada argumento de compare:
- ID exato —
anthropic/claude-sonnet-4-5 - Sufixo exato —
claude-sonnet-4→anthropic/claude-sonnet-4(nunca a variante-fast) - Substring parcial no ID/nome, versão mais recente vence —
claude-sonnet→ Sonnet mais recente
Saída
Sempre renderize a saída JSON como uma tabela markdown — tabelas são o formato principal de exibição.
list
| # | Modelo | $/MTok (P/C/Combinado) | Ctx | Saída | Caps | Pop# |
$/MTok: preços de prompt / conclusão / combinadosCaps: tags curtas (toolreasonvision…)Pop#: classificação de popularidade se o cache de rankings estiver atualizado, senão—
recommend
| Classif. | Modelo | Pontuação | Custo↑ | Ctx↑ | Saída↑ | Cap↑ | $/MTok | Caps |
Adicione uma linha de justificativa por modelo. Pontuação e pontuações por dimensão estão em [0, 1].
compare
Tabela vertical — uma coluna por modelo, uma linha por dimensão:
| Dimensão | Modelo A | Modelo B | Modelo C |
| ------------------ | -------- | -------- | -------- |
| Preço (P/C/Combinado)| … | … | … |
| Contexto | … | … | … |
| Máx. saída | … | … | … |
| Modalidades de entrada | … | … | … |
| Modalidades de saída | … | … | … |
| Capacidades | … | … | … |
| Classif. popularidade | … | … | … |
| Solicitações semanais | … | … | … |
Sempre termine com: Dados de {fetched_at}. Se mais antigo que 12h, sugira ao usuário executar node scripts/main.js refresh.
Cache
cache/
raw.json — dados do cartão frontend do OpenRouter adaptados ao esquema raw local (TTL 6h)
models.json — enriquecido: precificação normalizada + rótulos de capacidade (TTL 6h)
rankings.json — popularidade / taxa de transferência / latência + análises de uso (TTL 24h)
config/
presets.json
tier1-categories.json
- Os arquivos de cache residem em
cache/e não são commitados — a primeira execução acessa a rede - Na expiração do TTL, a CLI faz nova busca com timeout de 10s
- Em caso de falha na busca, utiliza o cache desatualizado e emite
[warn]no stderr — assim, sandboxes somente leitura / offline ainda respondem (possivelmente desatualizados) - Uma auto-atualização bem-sucedida da habilidade exclui os arquivos de cache de dados do modelo. O próximo comando de modelo os repopula.
Notas sobre Sandbox
- Codex CLI: precisa de
-s workspace-write(CLI escreve emcache/) e saída de rede paraopenrouter.ai. Dentro do TTL, não há chamadas de rede. - Primeira chamada em um checkout novo é a única que exige rede estritamente.
- Auto-atualização precisa de acesso de escrita ao sistema de arquivos neste diretório da habilidade e acesso de rede ao GitHub. Se indisponível, avisa ou ignora e o comando do modelo ainda executa com a cópia local atual.
Problemas Conhecidos
- A API frontend do OpenRouter (
/api/frontend/v1/models/find?active=true&fmt=cards) é não oficial; se falhar, a CLI usa o cache desatualizado quando disponível e emite[warn].
Fontes de Dados
- Modelos:
https://openrouter.ai/api/frontend/v1/models/find?active=true&fmt=cards - Rankings: mesmo endpoint com
order=top-weekly,order=throughput-high-to-loweorder=latency-low-to-high