Skip to content

ThomasPixelsOf/EcoPrompt-VSCode-Extension

Repository files navigation

EcoPrompt

Non affilié à Anthropic. Projet personnel/prototype indépendant. « Claude » et « Claude Code » sont des marques d'Anthropic, utilisées ici uniquement pour décrire la compatibilité.

Extension VS Code qui surveille le fichier de transcript de la session Claude Code active (~/.claude/projects/<workspace>/<session>.jsonl) et suggère un modèle (et un niveau d'effort) mieux adapté via une notification, selon la complexité estimée de vos prompts.

Fonctionnement

  1. Au démarrage, l'extension scanne tout ~/.claude/projects/ (tous les projets, pas seulement le workspace ouvert dans cette fenêtre VS Code) et surveille le fichier .jsonl modifié le plus récemment — c'est-à-dire la conversation Claude Code active en ce moment, où que ce soit sur la machine.
  2. À chaque nouveau prompt utilisateur écrit dans ce fichier, un score de complexité est calculé (mots-clés « complexes » vs « simples », blocs de code, questions multiples, longueur), biaisé selon le type de projet (README/package.json/marqueurs infra) et lissé sur les derniers prompts.
  3. Si le score dépasse un seuil, une notification (non bloquante) suggère un modèle et un niveau d'effort mieux adaptés. Vous changez vous-même via le sélecteur /model de Claude Code.
  4. Le modèle réellement utilisé est lu dans le transcript (message.model des réponses) pour ne pas suggérer un modèle déjà actif.
  5. Si une nouvelle conversation est ouverte (nouveau fichier .jsonl), l'extension bascule automatiquement sa surveillance dessus.

Limites connues

  • Le format des fichiers de transcript (~/.claude/projects/...) est un détail d'implémentation interne, non documenté publiquement. Il peut changer sans préavis dans une future version de Claude Code.
  • Aucune API publique n'existe pour piloter le modèle ou l'effort de Claude Code depuis une extension tierce (vérifié empiriquement, v2.1.204) :
    • aucune commande VS Code exposée (vscode.commands) liée au modèle/effort ;
    • l'extension officielle n'exporte pas d'API (activate() ne retourne rien d'exploitable) ;
    • pas de flag CLI modifiant une session en cours ;
    • écrire dans ~/.claude/settings.json de l'extérieur ne fait rien : le fichier est une sortie (persistance), Claude Code ne le relit pas en direct. EcoPrompt est donc — et doit rester — un outil d'observation et de suggestion. Le changement de modèle/effort reste manuel, par conception.
  • L'heuristique reste du pattern-matching textuel ; elle ne « comprend » pas vraiment le contenu du prompt.
  • La détection du modèle actif (currentModel) ne relit pas l'historique existant : au lancement de l'extension, elle reste inconnue tant qu'une nouvelle réponse de Claude Code n'est pas arrivée. La déduplication « ne pas suggérer le modèle déjà actif » ne s'active donc qu'après le premier échange suivant le démarrage.
  • Le niveau d'effort est lu depuis ~/.claude/settings.json (effortLevel), pas depuis le transcript (qui n'en contient aucune trace).
  • ~/.claude/settings.json est un fichier global à la machine : il reflète le dernier modèle/effort changé, pas forcément celui de la session précise que l'extension suit. Si plusieurs sessions Claude Code tournent en parallèle avec des réglages différents, la détection peut donc pointer vers la mauvaise. En usage mono-session (le cas normal), ce n'est pas un souci.
  • Le point de persistance de l'effort est prouvé dans le code (applySettings({effortLevel})), mais le chemin exact d'écriture du modèle dans settings.json n'a pas été confirmé. En cas de désynchronisation apparente entre le modèle affiché et celui réellement utilisé, le transcript .jsonl sert de source de vérité de secours.
  • Transcript rétréci (/compact) : quand le fichier .jsonl est réécrit plus petit (typiquement après un /compact), l'extension saute à la fin du fichier au lieu de rejouer tout l'historique. Sans cela, chaque prompt passé serait ré-analysé d'un coup, polluant le shadow log et pouvant noyer une vraie suggestion. Hypothèse non totalement vérifiée : si une écriture de compaction contenait, à sa toute fin, un prompt utilisateur réellement inédit (et jamais ré-appendé ensuite), il serait manqué. Jugé négligeable — /compact écrit un résumé, pas un nouveau prompt, et le prompt suivant arrive dans une écriture ultérieure captée normalement.

Contrôle automatique du modèle/effort — sujet clôturé

Question posée : EcoPrompt pourrait-il changer le modèle/effort à la place de l'utilisateur, au lieu de seulement le suggérer ? Pistes explorées et tranchées empiriquement (Claude Code v2.1.204) :

# Piste Résultat
1 Écrire dans ~/.claude/settings.json ❌ Sans effet en direct. Le fichier est lu au lancement d'une session (il sert de valeur initiale à effortLevel) mais n'est pas relu en live — testé manuellement (l'UI ne bouge pas) et confirmé dans le code.
2 Commandes VS Code publiques ❌ Aucune commande model/effort/setting exposée (toutes sont UI : open/focus/mention…).
3 API exportée par l'extension officielle activate() ne retourne aucune API exploitable.
4 Flag CLI ciblant une session active ❌ Aucun ; pas de binaire claude pilotable, le schema n'a que des clés de config.
5 Protocole URI (vscode://…/open) ❌ Le handler n'accepte que /install-plugin (params plugin, marketplace) et /open (params prompt, session). Aucun param model/effort.
6 settings.local.json (par projet) ❌ Même catégorie que le settings.json global (persistance, gitignored) — même comportement « lu au lancement, jamais en live ».

Deux autres pistes sont écartées par choix de conception, pas par impossibilité technique :

  • IPC/protocole interne non documenté — ferait d'EcoPrompt un outil de rétro-ingénierie d'un protocole privé, cassant à chaque mise à jour.
  • Automatisation de clics au niveau OS — fragile (dépend de la position des éléments à l'écran) et hors du rôle d'un outil d'observation passif.

Conclusion définitive : aucun moyen légitime et stable n'existe pour piloter le modèle/effort depuis une extension tierce. EcoPrompt reste un outil d'observation et de suggestion. Le changement final est, et restera, manuel.

Langue / Language

Toute l'interface et les messages de l'Output sont traduits dans les 12 langues d'affichage officielles de VS Code : anglais, français, allemand, espagnol, italien, portugais (Brésil), russe, chinois simplifié, chinois traditionnel, japonais, coréen, turc.

  • Réglage : ecoPrompt.language. Par défaut auto, qui suit la langue d'affichage de VS Code (vscode.env.language), avec repli sur l'anglais si la langue n'est pas couverte.
  • Changement à la volée : item « 🌐 Langue » dans le menu de la barre de statut (ou commande « EcoPrompt: Change Language »). Le changement est immédiat, sans recharger la fenêtre.
  • Implémentation : toutes les chaînes passent par t(clé, params) dans i18n.js ; l'anglais est la source de vérité et le repli pour toute clé/locale manquante. Un test de parité (i18n.test.js) garantit que chaque langue définit exactement les mêmes clés et les mêmes placeholders {…} que l'anglais.
  • Hors périmètre : la commande de diagnostic dev « Discover Claude Code Integration » écrit en anglais directement dans l'Output (outil de développement, pas d'UI utilisateur).

Shadow mode (calibration silencieuse)

En plus des notifications (qui ne changent pas), EcoPrompt journalise discrètement chaque prompt analysé pour permettre de vérifier, après coup, si les seuils de score sont bien réglés — plutôt que de les deviner.

  • Fichier : ecoprompt-shadow.jsonl dans le stockage global de l'extension (globalStorageUri), une ligne JSON par prompt.
  • Champs : ts, sessionId (identifiant de la conversation Claude Code active — l'UUID du fichier .jsonl, pour pouvoir filtrer/analyser le comportement par conversation), instantScore, smoothedScore, suggestedModel, suggestedEffort, activeModel, activeEffort, outcome (neutral / dedup-already-active / cooldown / pending-updated / shown).
  • Réaction utilisateur : la réaction à une suggestion affichée (clic « Je m'en occupe » / « Garder mon réglage », ou expiration) est persistée en mode append-only : plutôt que de réécrire l'entrée d'origine (risque de collision avec les écritures concurrentes), une ligne de réaction distincte est ajoutée : {"type":"reaction","ref":<id>,"userReaction":…}. Valeurs : accepted, declined, declined-insisted, ignored-expired. Chaque entrée de prompt porte un id unique (<timestamp>-<compteur>) auquel la réaction se réfère. showShadowStats recoupe les deux au moment de la lecture ; les réactions orphelines (dont l'entrée d'origine a été tronquée) sont ignorées silencieusement, jamais une erreur.
  • Écriture non bloquante (append asynchrone), erreurs ignorées.
  • Taille bornée : tronqué aux 5000 dernières lignes au démarrage. Le trim tolère les réactions orphelines (choix assumé : garder le trim trivial et sûr plutôt qu'une logique de blocs cohérents plus risquée).
  • Consultation : commande « EcoPrompt: Show Shadow Calibration Stats » → taux de concordance (le modèle suggéré a-t-il correspondu au modèle réellement actif dans les 5 minutes suivantes ?), pas un dump brut.

Exemple de ligne :

{"ts":"2026-07-08T09:12:44.512Z","sessionId":"8f84ba1d-0816-4083-95e4-49ccb0af31b2","instantScore":4.2,"smoothedScore":3.1,"suggestedModel":"claude-opus-4-8","suggestedEffort":"high","activeModel":"sonnet","activeEffort":"low","outcome":"shown"}

Commande « EcoPrompt: Redémarrer »

Redémarre l'extension sans recharger toute la fenêtre VS Code : arrête les watchers (session + settings.json), fait une remise à zéro franche de l'état en mémoire (scores lissés, suggestion en attente, compteurs d'insistance, modèle/effort détectés) pour ne pas perpétuer un état éventuellement corrompu, puis relance tout. Le shadow log (sur disque) n'est pas affecté — aucune donnée perdue. Utile si une notification semble bloquée ou si un watcher ne réagit plus.

Installer / lancer en dev

# ouvrir le dossier dans VS Code, puis F5 pour lancer l'Extension Development Host
code .

About

This is a VSCode extension that simply suggests which models to use based on the type of prompt you enter for the Claude Code extension included in VSCode.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors