Model Radar

CLI de selección de modelos LLM en OpenRouter. Parsea restricciones en lenguaje natural a argumentos token:valor, consulta un caché local de metadatos y rankings, y emite JSON para que el agente lo renderice como tabla Markdown.

¿Qué es Model Radar?

Model Radar es una habilidad para agentes de IA que permite seleccionar modelos de lenguaje (LLM) en OpenRouter mediante una interfaz de línea de comandos (CLI). Traduce restricciones en lenguaje natural a argumentos token:valor, como `price:..10` para modelos económicos o `cap:tool_use` para soporte de herramientas. La herramienta mantiene un caché local con metadatos y rankings de modelos (TTL de 6 horas para modelos, 24 horas para rankings) que se actualiza automáticamente desde los endpoints públicos de OpenRouter. Está diseñada para agentes como Claude Code, Cursor y Codex CLI, funciona con Node.js 18+ sin dependencias npm, y no requiere API key. Los comandos principales son `list` (para filtrar y ordenar modelos), `recommend` (para obtener una puntuación ponderada según un preset como coding o batch) y `compare` (para comparar modelos lado a lado). La salida siempre se renderiza como tabla Markdown, y la herramienta incluye auto-actualización desde GitHub para mantenerse al día.

Compatible con✓Claude Code✓Codex CLI~Cursor
npx skills add primexiao/agent-skills

Installed? Explore more Investigación y análisis de datos skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿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=0 para deshabilitar.

Flujo de trabajo

  1. Ejecuta node scripts/self-update.js auto antes de usar la habilidad. Si stderr imprime MODEL_RADAR_UPDATED, vuelve a leer este SKILL.md antes de continuar.
  2. Parsea la solicitud del usuario en argumentos token:valor usando la asignación Intención → Token a continuación
  3. Elige el comando: list (filtrar+ordenar), recommend (puntuación ponderada contra un preset), compare (comparación lado a lado)
  4. Ejecuta desde el directorio de la habilidad. scripts/main.js tambié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.
  5. Renderiza la salida JSON como una tabla Markdown (ver Salida)
  6. Termina con Datos al {fetched_at}; sugiere refresh si 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, ruta skills/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.js reinicia 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.json y cache/rankings.json para 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.

TokenSignificadoFormato del valorEjemplos
sortdimensión de ordenaciónpalabra preset (ver abajo)sort:cheap sort:popular
price$/MTk combinado..max / min.. / min..max / solo=máxprice:..10 price:5..20
ctxlongitud de contextoigual, sufijo k/m, solo=mínctx:128k ctx:128k..1m
outtokens máximos de salidaigual, solo=mínout:32k
capcapacidades (Y)separadas por comascap:tool_use,reasoning
inmodalidades de entrada (Y)separadas por comasin:image in:audio,image
genmodalidades de salida (Y)separadas por comasgen:image gen:audio
openfiltro de código abiertotrue / falseopen:true
toplímite de resultadosnúmero (por defecto: list=20, recommend=3)top:5
presetpreset de puntuación (solo recommend)nombre del presetpreset: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 diceToken(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:

  1. id exacto — anthropic/claude-sonnet-4-5
  2. Sufijo exacto — claude-sonnet-4 → anthropic/claude-sonnet-4 (nunca la variante -fast)
  3. 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 / combinado
  • Caps: etiquetas cortas (tool reason vision …)
  • 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 en cache/) y salida de red a openrouter.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-low y order=latency-low-to-high

Skills relacionados