Que fait Model Radar ?
CLI de sélection de modèles OpenRouter. Analyse des contraintes en langage naturel en arguments token:value, interroge un cache local des métadonnées des modèles + classements, et émet du JSON que l'agent affiche sous forme de tableau markdown.
Configuration
- Runtime : Node.js 18+ (aucune installation ni dépendance npm)
- Pas de clé API — utilise les endpoints publics d'OpenRouter
- Exécutez toutes les commandes depuis le répertoire de ce skill (celui contenant ce fichier)
- La première exécution remplit le cache depuis le réseau ; les appels suivants utilisent le cache local (TTL modèles 6h, TTL classements 24h)
- Les mises à jour automatiques sont activées par défaut. Chaque exécution CLI vérifie la source GitHub fixe au maximum une fois toutes les 24h et applique les mises à jour automatiquement pour les copies installées. Définissez
MODEL_RADAR_AUTO_UPDATE=0pour désactiver.
Flux de travail
- Exécutez
node scripts/self-update.js autoavant d'utiliser le skill. Si stderr afficheMODEL_RADAR_UPDATED, relisez ceSKILL.mdavant de continuer. - Analysez la requête de l'utilisateur en arguments
token:valueà l'aide du mappage Intention → Jeton ci-dessous - Choisissez la commande :
list(filtrer+trier),recommend(score pondéré par rapport à un préréglage),compare(côte à côte) - Exécutez depuis le répertoire du skill.
scripts/main.jsexécute également la même vérification préalable de mise à jour automatique, donc l'utilisation directe de la CLI reste à jour. - Affichez la sortie JSON sous forme de tableau markdown (voir Sortie)
- Terminez par
Data as of {fetched_at}; suggérezrefreshsi plus de 12h
Commandes
node scripts/main.js list [tokens...] # filtrer + trier
node scripts/main.js recommend [tokens...] # score pondéré par rapport à un préréglage
node scripts/main.js compare <id|nom>... # comparaison côte à côte
node scripts/main.js refresh # forcer le rafraîchissement des deux caches
node scripts/self-update.js status # inspecter l'état de la mise à jour
node scripts/self-update.js check # vérifier les mises à jour sur GitHub
node scripts/self-update.js apply # appliquer la dernière mise à jour du skill
Mise à jour automatique
- La source est fixée par
package.json.repository:primexiao/agent-skills, cheminskills/model-radar. - Les copies installées se mettent à jour automatiquement. Les extractions de source ignorent la mise à jour automatique sauf si
MODEL_RADAR_AUTO_UPDATE_SOURCE=1est défini. - Les modifications locales non validées dans le répertoire du skill entraînent l'ignorance de la mise à jour automatique.
- L'utilisation directe de
scripts/main.jsredémarre la commande en cours après une mise à jour automatique réussie, de sorte que le résultat soit produit par le code mis à jour. - Les mises à jour utilisent une extraction temporaire, valident les fichiers requis, sauvegardent le skill actuel, remplacent les fichiers non runtime, et restaurent en cas d'échec.
- Les mises à jour réussies suppriment
cache/raw.json,cache/models.jsonetcache/rankings.jsonafin que le nouveau code ne se mélange pas avec l'ancien cache de données. - L'état de la mise à jour automatique et les avertissements vont sur stderr. La sortie JSON de la commande reste sur stdout.
Syntaxe des jetons
Arguments positionnels token:value inspirés de Tailwind. L'ordre n'a pas d'importance.
| Jeton | Signification | Format de valeur | Exemples |
|---|---|---|---|
sort | dimension de tri | mot préréglé (voir ci-dessous) | sort:cheap sort:popular |
price | $/MTok mixte | ..max / min.. / min..max / bare=max | price:..10 price:5..20 |
ctx | longueur de contexte | idem, suffixe k/m, bare=min | ctx:128k ctx:128k..1m |
out | tokens de sortie max | idem, bare=min | out:32k |
cap | capacités (ET) | séparées par des virgules | cap:tool_use,reasoning |
in | modalités d'entrée (ET) | séparées par des virgules | in:image in:audio,image |
gen | modalités de sortie (ET) | séparées par des virgules | gen:image gen:audio |
open | filtre open-source | true / false | open:true |
top | limite de résultats | nombre (défaut : list=20, recommend=3) | top:5 |
preset | préréglage de score (recommend seulement) | nom du préréglage | preset:coding |
Valeurs sort : cheap expensive new (défaut) ctx popular throughput latency
Capacités : tool_use reasoning structured_output vision long_output prompt_caching web_search audio_input video_input file_input image_generation audio_output
Modalités d'entrée : text image audio video file
Modalités de sortie : text image audio
Préréglages de recommandation : coding batch chat vision (voir config/presets.json pour les poids et les capacités requises)
Intention → Jeton
| L'utilisateur dit | Jeton(s) |
|---|---|
| "budget 10 $" / "moins de 10 $" | price:..10 |
| "au moins 10 $" / "haut de gamme" | price:10.. |
| "au moins Nk de contexte" | ctx:Nk |
| "a besoin de tool use / vision / raisonnement" | cap:tool_use / cap:vision / cap:reasoning |
| "sortie structurée" / "mode JSON" | cap:structured_output |
| "peut prendre une entrée audio / image" | in:audio / in:image |
| "peut générer des images / de l'audio" | gen:image / gen:audio |
| "open source seulement" | open:true |
| "le moins cher" / "le plus abordable" | sort:cheap |
| "le plus populaire" / "tendance" | sort:popular |
| "le plus récent" / "dernier" | sort:new |
| "le plus rapide" / "latence la plus basse" | sort:latency |
| "débit le plus élevé" | sort:throughput |
| "agent de codage" | recommend preset:coding |
| "tâche par lot / en vrac" | recommend preset:batch |
| "agent de vision" | recommend preset:vision |
Correspondance de modèles (compare)
Priorité de correspondance pour chaque argument de compare :
- ID exact —
anthropic/claude-sonnet-4-5 - Suffixe exact —
claude-sonnet-4→anthropic/claude-sonnet-4(jamais la variante-fast) - Sous-chaîne partielle sur id/nom, la version la plus récente gagne —
claude-sonnet→ dernier Sonnet
Sortie
Affichez toujours la sortie JSON sous forme de tableau markdown — les tableaux sont le format d'affichage principal.
list
| # | Modèle | $/MTok (P/C/Mixte) | Ctx | Sortie | Caps | Pop# |
$/MTok: prix prompt / complétion / mixteCaps: étiquettes courtes (toolreasonvision…)Pop#: rang de popularité si le cache des classements est frais, sinon—
recommend
| Rang | Modèle | Score | Coût↑ | Ctx↑ | Out↑ | Cap↑ | $/MTok | Caps |
Ajoutez une ligne de justification par modèle. Le score et les scores par dimension sont dans [0, 1].
compare
Tableau vertical — une colonne par modèle, une ligne par dimension :
| Dimension | Modèle A | Modèle B | Modèle C |
| ------------------ | -------- | -------- | -------- |
| Prix (P/C/Mixte) | … | … | … |
| Contexte | … | … | … |
| Sortie max | … | … | … |
| Modalités d'entrée | … | … | … |
| Modalités de sortie| … | … | … |
| Capacités | … | … | … |
| Rang de popularité | … | … | … |
| Requêtes hebdo. | … | … | … |
Terminez toujours par : Data as of {fetched_at}. Si plus de 12h, suggérez à l'utilisateur d'exécuter node scripts/main.js refresh.
Mise en cache
cache/
raw.json — données de la carte frontend OpenRouter adaptées au schéma brut local (TTL 6h)
models.json — enrichi : tarification normalisée + étiquettes de capacité (TTL 6h)
rankings.json — popularité / débit / latence + analyses d'utilisation (TTL 24h)
config/
presets.json
tier1-categories.json
- Les fichiers de cache résident sous
cache/et ne sont pas suivis — la première exécution contacte le réseau - À l'expiration du TTL, la CLI récupère avec un délai d'attente de 10 s
- En cas d'échec de récupération, elle utilise le cache obsolète et émet
[warn]sur stderr — ainsi les sandbox en lecture seule / hors ligne répondent toujours (éventuellement obsolètes) - Une mise à jour automatique réussie du skill supprime les fichiers de cache des données de modèle. La prochaine commande modèle les repeuple.
Notes sur les sandbox
- Codex CLI : nécessite
-s workspace-write(CLI écrit danscache/) et un accès réseau sortant versopenrouter.ai. Dans la limite du TTL, aucun appel réseau. - Premier appel dans un checkout frais est le seul qui nécessite strictement le réseau.
- La mise à jour automatique nécessite un accès en écriture au système de fichiers de ce répertoire de skill et un accès réseau à GitHub. Si indisponible, elle avertit ou ignore, et la commande modèle s'exécute toujours avec la copie locale actuelle.
Problèmes connus
- L'API frontend d'OpenRouter (
/api/frontend/v1/models/find?active=true&fmt=cards) n'est pas officielle ; si elle échoue, la CLI utilise le cache obsolète lorsque disponible et émet[warn].
Sources de données
- Modèles :
https://openrouter.ai/api/frontend/v1/models/find?active=true&fmt=cards - Classements : même endpoint avec
order=top-weekly,order=throughput-high-to-lowetorder=latency-low-to-high