¿Qué hace Model Radar?
CLI de selección de modelos OpenRouter. Parsea restricciones en lenguaje natural a argumentos token:valor, consulta un caché local de metadatos + rankings de modelos y emite JSON para que el agente lo renderice como una tabla Markdown.
Configuración
- Entorno de ejecución: Node.js 18+ (sin pasos de instalación ni dependencias npm)
- Sin clave API — utiliza los endpoints públicos de OpenRouter
- Ejecuta todos los comandos desde este directorio de la habilidad (el que contiene este archivo)
- La primera ejecución llena el caché desde la red; las llamadas posteriores usan el caché local (TTL de modelos 6 h, TTL de rankings 24 h)
- Las auto-actualizaciones están habilitadas por defecto. Cada ejecución de la CLI comprueba la fuente fija de GitHub como máximo una vez cada 24 h y aplica las actualizaciones automáticamente para las copias instaladas. Establece
MODEL_RADAR_AUTO_UPDATE=0para deshabilitar.
Flujo de trabajo
- Ejecuta
node scripts/self-update.js autoantes de usar la habilidad. Si stderr imprimeMODEL_RADAR_UPDATED, vuelve a leer esteSKILL.mdantes de continuar. - Parsea la solicitud del usuario en argumentos
token:valorusando la asignación Intención → Token a continuación - Elige el comando:
list(filtrar+ordenar),recommend(puntuación ponderada contra un preset),compare(comparación lado a lado) - Ejecuta desde el directorio de la habilidad.
scripts/main.jstambién ejecuta la misma verificación previa de auto-actualización automáticamente, por lo que el uso directo de la CLI se mantiene actualizado. - Renderiza la salida JSON como una tabla Markdown (ver Salida)
- Termina con
Datos al {fetched_at}; sugiererefreshsi es más antiguo de 12 h
Comandos
node scripts/main.js list [tokens...] # filtrar + ordenar
node scripts/main.js recommend [tokens...] # puntuación ponderada contra un preset
node scripts/main.js compare <id|nombre>... # comparación lado a lado
node scripts/main.js refresh # forzar actualización de ambos cachés
node scripts/self-update.js status # inspeccionar estado de la actualización
node scripts/self-update.js check # comprobar actualizaciones en GitHub
node scripts/self-update.js apply # aplicar la última actualización de la habilidad
Auto-actualización
- La fuente está fijada por
package.json.repository:primexiao/agent-skills, rutaskills/model-radar. - Las copias instaladas se actualizan automáticamente. Los checkouts de la fuente omiten la auto-actualización a menos que se establezca
MODEL_RADAR_AUTO_UPDATE_SOURCE=1. - Los cambios locales no confirmados bajo el directorio de la habilidad hacen que la auto-actualización se omita.
- El uso directo de
scripts/main.jsreinicia el comando actual después de una auto-actualización exitosa para que el resultado sea producido por el código actualizado. - Las actualizaciones utilizan un checkout temporal, validan los archivos requeridos, hacen una copia de seguridad de la habilidad actual, reemplazan los archivos no relacionados con el tiempo de ejecución y revierten en caso de fallo.
- Las actualizaciones exitosas limpian
cache/raw.json,cache/models.jsonycache/rankings.jsonpara que el código nuevo no se mezcle con el caché de datos antiguo. - El estado de la auto-actualización y las advertencias van a stderr. El JSON del comando permanece en stdout.
Sintaxis de Tokens
Argumentos posicionales token:valor inspirados en Tailwind. El orden no importa.
| Token | Significado | Formato del valor | Ejemplos |
|---|---|---|---|
sort | dimensión de ordenación | palabra preset (ver abajo) | sort:cheap sort:popular |
price | $/MTk combinado | ..max / min.. / min..max / solo=máx | price:..10 price:5..20 |
ctx | longitud de contexto | igual, sufijo k/m, solo=mín | ctx:128k ctx:128k..1m |
out | tokens máximos de salida | igual, solo=mín | out:32k |
cap | capacidades (Y) | separadas por comas | cap:tool_use,reasoning |
in | modalidades de entrada (Y) | separadas por comas | in:image in:audio,image |
gen | modalidades de salida (Y) | separadas por comas | gen:image gen:audio |
open | filtro de código abierto | true / false | open:true |
top | límite de resultados | número (por defecto: list=20, recommend=3) | top:5 |
preset | preset de puntuación (solo recommend) | nombre del preset | preset:coding |
Valores de sort: cheap expensive new (por defecto) 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 salida: text image audio
Presets de recomendación: coding batch chat vision (ver config/presets.json para pesos y capacidades requeridas)
Intención → Token
| El usuario dice | Token(s) |
|---|---|
| "presupuesto $X" / "menos de $X" | price:..X |
| "al menos $X" / "nivel premium" | price:X.. |
| "al menos Nk de contexto" | ctx:Nk |
| "necesita uso de herramientas / visión / razonamiento" | cap:tool_use / cap:vision / cap:reasoning |
| "salida estructurada" / "modo JSON" | cap:structured_output |
| "puede tomar entrada de audio / imagen" | in:audio / in:image |
| "puede generar imágenes / audio" | gen:image / gen:audio |
| "solo código abierto" | open:true |
| "más barato" / "más asequible" | sort:cheap |
| "más popular" / "tendencia" | sort:popular |
| "más nuevo" / "último" | sort:new |
| "más rápido" / "menor latencia" | sort:latency |
| "mayor rendimiento" | sort:throughput |
| "agente de codificación" | recommend preset:coding |
| "trabajo por lotes / a granel" | recommend preset:batch |
| "agente de visión" | recommend preset:vision |
Coincidencia de Modelos (compare)
Prioridad de coincidencia para cada argumento de compare:
- id exacto —
anthropic/claude-sonnet-4-5 - Sufijo exacto —
claude-sonnet-4→anthropic/claude-sonnet-4(nunca la variante-fast) - Subcadena parcial en id/nombre, gana la versión más reciente —
claude-sonnet→ último Sonnet
Salida
Renderiza siempre la salida JSON como una tabla Markdown — las tablas son el formato de visualización principal.
list
| # | Modelo | $/MTk (P/C/Comb) | Ctx | Salida | Caps | Pop# |
$/MTk: precios de prompt / completado / combinadoCaps: etiquetas cortas (toolreasonvision…)Pop#: rango de popularidad si el caché de rankings está fresco, si no—
recommend
| Rango | Modelo | Puntuación | Costo↑ | Ctx↑ | Sal↑ | Cap↑ | $/MTk | Caps |
Agrega una línea de justificación por modelo. La puntuación y las puntuaciones por dimensión están en [0, 1].
compare
Tabla vertical — una columna por modelo, una fila por dimensión:
| Dimensión | Modelo A | Modelo B | Modelo C |
| ------------------ | -------- | -------- | -------- |
| Precio (P/C/Comb) | … | … | … |
| Contexto | … | … | … |
| Salida máxima | … | … | … |
| Modalidades entrada| … | … | … |
| Modalidades salida | … | … | … |
| Capacidades | … | … | … |
| Rango popularidad | … | … | … |
| Solicitudes semanales | … | … | … |
Termina siempre con: Datos al {fetched_at}. Si es más antiguo de 12 h, sugiere al usuario ejecutar node scripts/main.js refresh.
Almacenamiento en Caché
cache/
raw.json — datos de tarjeta del frontend de OpenRouter adaptados al esquema local sin procesar (TTL 6 h)
models.json — enriquecido: precios normalizados + etiquetas de capacidad (TTL 6 h)
rankings.json — popularidad / rendimiento / latencia + análisis de uso (TTL 24 h)
config/
presets.json
tier1-categories.json
- Los archivos de caché residen en
cache/y no se confirman — la primera ejecución accede a la red - Al caducar el TTL, la CLI vuelve a obtener datos con un tiempo de espera de 10 s
- Ante cualquier fallo de obtención, recurre al caché obsoleto y emite
[warn]en stderr — así los sandboxes de solo lectura / fuera de línea aún responden (posiblemente con datos obsoletos) - Una auto-actualización exitosa de la habilidad elimina los archivos de caché de datos del modelo. El siguiente comando de modelo los vuelve a llenar.
Notas para Sandbox
- Codex CLI: necesita
-s workspace-write(CLI escribe encache/) y salida de red aopenrouter.ai. Dentro del TTL, no hay llamadas de red. - La primera llamada en un checkout nuevo es la única que requiere estrictamente red.
- La auto-actualización necesita acceso de escritura al sistema de archivos de este directorio de la habilidad y acceso de red a GitHub. Si no está disponible, advierte u omite y el comando del modelo aún se ejecuta con la copia local actual.
Problemas Conocidos
- La API del frontend de OpenRouter (
/api/frontend/v1/models/find?active=true&fmt=cards) no es oficial; si falla, la CLI recurre al caché obsoleto cuando está disponible y emite[warn].
Fuentes de Datos
- Modelos:
https://openrouter.ai/api/frontend/v1/models/find?active=true&fmt=cards - Rankings: el mismo endpoint con
order=top-weekly,order=throughput-high-to-lowyorder=latency-low-to-high