Skip to content

csagent-llmrouting

Choose a tag to compare

@artydev artydev released this 10 Oct 15:50
· 52 commits to main since this release

CsAgent 0.9.0 — notes de version

La version 0.9.0 apporte le choix automatique du modèle pour chaque message (code, chat, vision), des règles de routage modifiables à la main dans le dossier LLMRoutingRules/, l'option --prompt pour poser une seule question depuis la ligne de commande, et un affichage du modèle utilisé sous chaque message. Elle fait suite à v0.8.0.

Résumé

Domaine Ce qui change
Routage des modèles Trois profils choisis message par message, sans appel LLM supplémentaire : code (deepseek-v4-flash), chat (openweight-large), vision (gemma-4-31b-it). Les recherches et les questions générales vont au modèle de chat
Affichage [model: …] avant chaque exécution (avec la raison) et sous chaque message de l'assistant, dans la CLI, --ui, --leanui et --api (événement SSE model)
Règles à la main Dossier LLMRoutingRules/ : models.json, keywords.json, rules.json. Relu dès qu'un fichier change
Nouvelles options --prompt, --code-model, --chat-model, --no-route, --init-routing, --explain-routing, --rules, --lang
Langues Messages de routage en français et en anglais (--lang, CSAGENT_LANG, sinon la langue du système)
Corrections csagent --doc fonctionne de nouveau ; l'enregistrement de la conversation ne plante plus quand le fichier est verrouillé ; la boucle interactive s'arrête quand l'entrée se ferme
--quiet S'applique aussi à --ui et --leanui
Documentation README.fr.md (version française du README), pages GitHub (docs/)

Notes de mise à jour

À lire avant de mettre à jour, surtout si tu pilotes CsAgent par script ou par un orchestrateur.

  1. Le modèle n'est plus le même pour tous les messages. Sur l'endpoint Albert par défaut, une recherche ou une question générale est maintenant traitée par openweight-large ; le code, les fichiers, le shell et les e-mails restent sur deepseek-v4-flash. Pour retrouver le comportement d'avant (un seul modèle), utilise --no-route (ou CSAGENT_ROUTING=off), ou --model <nom>.
  2. Un endpoint personnalisé ne change pas. Avec --endpoint (Ollama…), il n'y a pas de modèle de chat tant que tu n'en définis pas un avec --chat-model : tous les messages utilisent le modèle de code, comme avant.
  3. Orchestrateurs (--api). Un nouvel événement SSE model est envoyé après chaque thought. Un client qui ignore les types d'événements inconnus n'est pas affecté ; sinon, ajoute ce type à ceux que tu ignores.
  4. Le modèle de chat doit gérer l'appel d'outils, car la boucle de l'agent peut utiliser des outils dans n'importe quel message. Avec le défaut Albert, openweight-large convient ; sinon, vérifie-le avec csagent --model <nom> --prompt "list the files here and summarise the README".
  5. Un argument seul, sans tiret, reste le nom du dossier de mémoire (csagent mon_projet). Pour envoyer une demande depuis la ligne de commande, utilise --prompt : csagent --prompt "hello my name is John" (et non csagent "hello my name is John").
  6. Le dossier LLMRoutingRules/ est copié à côté de l'exécutable à la publication. Les fichiers fournis ne fixent aucun modèle (null = valeur intégrée) : ils ne changent donc rien tant que tu ne les modifies pas. Un dossier LLMRoutingRules dans le répertoire courant passe avant celui de l'exécutable.

Les fichiers de mémoire et les arguments existants ne changent pas.

1. Choix automatique du modèle

Le choix se fait pour chaque message, sans appel LLM supplémentaire et sans délai. Ordre des décisions :

  1. --model <nom> l'emporte toujours.
  2. Une image dans la conversation sélectionne le modèle de vision.
  3. Les règles de LLMRoutingRules/rules.json (la première qui correspond).
  4. Une réponse courte qui poursuit le tour précédent (« oui », « ok », « d'accord », « merci »… 8 mots au plus) garde le modèle de ce tour.
  5. Un nom de fichier, un chemin, du code, un fichier joint ou une action sur l'ordinateur (« open in Edge », « ouvre Chrome », « télécharge… ») : modèle de code.
  6. Une recherche explicite (web, actualités, météo, un lien à lire) : modèle de chat, même si le message contient aussi des mots qui ressemblent à du code.
  7. Un message qui parle de code, de commande, d'e-mail, d'audio, de git, de tests… : modèle de code.
  8. Sinon, conversation générale : modèle de chat.

Avant d'utiliser le modèle de chat, CSAgent le vérifie dans la liste des modèles du serveur (conservée 10 minutes). S'il est inconnu, indisponible ou s'il n'est pas un modèle de texte, le modèle de code répond à la place et la raison est affichée.

Profil Modèle par défaut Réglage
Code deepseek-v4-flash --code-model / CSAGENT_MODEL_CODE
Chat openweight-large (alias Albert de gpt-oss-120b, seulement sur l'endpoint par défaut) --chat-model / CSAGENT_MODEL_CHAT
Vision gemma-4-31b-it --vision-model / CSAGENT_VISION_MODEL

2. Le modèle utilisé est affiché

  • Avant chaque exécution : [model: openweight-large (chat: question générale)], avec la raison du choix. Quand le modèle de code est celui par défaut, seule la ligne [model: deepseek-v4-flash] s'affiche.
  • Sous chaque message de l'assistant, dans toutes les interfaces : [model: …] en CLI, une ligne [model] en --ui et --leanui, un événement model en --api. Quand le serveur indique un autre nom que l'alias demandé, il est ajouté : openweight-large (served: openai/gpt-oss-120b).
  • --quiet n'y change rien : les messages de l'assistant gardent leur ligne de modèle.

3. Règles de routage modifiables : LLMRoutingRules/

Le routage se règle sans recompiler. csagent --init-routing crée le dossier (il n'écrase jamais tes fichiers) :

Fichier Rôle
models.json Modèle de chaque profil : { "code": …, "chat": …, "vision": … } (null = valeur intégrée)
keywords.json Ajoute ou retire des mots, radicaux, expressions et extensions de fichier (chaque liste : un tableau, ou { "add": […], "remove": […] })
rules.json Tes règles : contains, contains_all, not_contains, starts_with, min_words, max_words → use (code, chat, vision ou un nom de modèle)
keywords.defaults.json Listes intégrées, pour information (jamais lu)
README.md Référence complète, dans la langue choisie

Exemple de règle :

{ "rules": [ { "name": "tickets", "contains": ["jira", "ticket"], "use": "code" } ] }
  • Recherche du dossier : --rules <dossier> (ou CSAGENT_ROUTING_RULES), puis ./LLMRoutingRules, puis à côté de l'exécutable. Un --rules vers un dossier inexistant donne un avertissement, sans repli silencieux.
  • Relecture automatique : un fichier modifié est pris en compte au message suivant, sans redémarrage.
  • Une erreur n'arrête jamais l'agent : JSON invalide, clé inconnue, règle incomplète… un avertissement s'affiche une seule fois et les valeurs intégrées sont conservées. Les clés qui commencent par _ sont ignorées (commentaires), les virgules finales sont tolérées.
  • Limites de sécurité : 256 Ko par fichier, 200 règles au plus.
  • csagent --explain-routing "open in Edge browser" montre le modèle qui serait choisi et la raison, sans appeler aucun modèle.
  • --no-route désactive aussi les règles de l'utilisateur.

4. Messages de routage en français et en anglais

Les raisons du choix, les avertissements sur les fichiers, la sortie de --init-routing et --explain-routing, ainsi que les commentaires et le README écrits dans LLMRoutingRules/, existent en anglais et en français. La langue vient de --lang fr|en, puis de CSAGENT_LANG, puis de la langue du système (LC_ALL, LANG, culture de l'interface) ; sans traduction, le message reste en anglais. L'aide --help et la documentation de --doc restent en anglais.

5. --prompt : une seule demande

csagent --prompt "hello my name is John"

CSAgent exécute cette demande, affiche la réponse puis quitte. La conversation est enregistrée comme d'habitude dans le dossier de mémoire (--mem), le modèle est choisi comme pour tout message, et les outils demandent confirmation sauf avec --yes.

Cas Résultat
Demande traitée code de sortie 0
Erreur, ou clé d'API absente code de sortie 1
--prompt sans texte usage affiché, code de sortie 2

--prompt s'utilise en mode terminal ; il n'a pas d'effet avec --ui, --leanui ou --api.

6. Autres changements

  • csagent --doc fonctionne de nouveau : le README n'était pas embarqué dans l'exécutable.
  • Enregistrement de la conversation : le déplacement final du fichier est réessayé et un fichier verrouillé ne fait plus planter l'agent.
  • Boucle interactive : quand l'entrée se ferme (pipe, Ctrl+D), elle s'arrête au lieu de réafficher > User sans fin.
  • --quiet s'applique aussi à --ui et --leanui (les étapes, appels d'outils et résultats réussis ne sont pas envoyés ; --api l'ignore).
  • Documentation : README.fr.md (version française complète, avec un lien de bascule entre les deux langues) et un site pour les pages GitHub (docs/).

Nouvelle configuration

Réglage Rôle Par défaut
--prompt "texte" Une seule demande, puis on quitte aucun
--code-model / CSAGENT_MODEL_CODE Modèle du profil code deepseek-v4-flash
--chat-model / CSAGENT_MODEL_CHAT Modèle du profil chat openweight-large sur Albert, aucun sur un endpoint personnalisé
--vision-model / CSAGENT_VISION_MODEL Modèle du profil vision gemma-4-31b-it
--no-route / CSAGENT_ROUTING=off Toujours le modèle de code, règles comprises désactivé
--init-routing Crée le dossier LLMRoutingRules/ —
--explain-routing "msg" Montre le modèle choisi, sans l'appeler —
--rules <dossier> / CSAGENT_ROUTING_RULES Dossier des règles de routage ./LLMRoutingRules, puis à côté de l'exécutable
--lang <en|fr> / CSAGENT_LANG Langue des messages de routage langue du système

Limites

  • Le choix du modèle se fait sur des mots-clés et des règles, pas sur le sens du message : un cas mal classé se corrige avec rules.json, keywords.json ou --model. --explain-routing aide à comprendre pourquoi.
  • Les alias openweight-* sont ceux de l'API Albert ; openweight-medium a répondu par une erreur lors des essais, openweight-large convient.
  • La qualité de l'appel d'outils du modèle de chat dépend du modèle ; il n'a pas été éprouvé sur des tâches longues.
  • Les messages de routage n'existent qu'en anglais et en français ; --help, --doc et l'interface web restent en anglais.
  • --prompt n'a pas d'effet en --ui, --leanui et --api.
  • Le dossier LLMRoutingRules/ est copié à la publication ; la publication AOT n'a pas été essayée dans l'environnement de développement de cette version.

Tests

187 tests (dotnet run --project Tests -c Release), dont :

  • Routage (ModelRouterTests.cs) : code, chat et vision en français et en anglais, recherches web, actions sur l'ordinateur, suites après des outils, priorité de --model, --no-route, endpoints personnalisés, vérification dans la liste des modèles (inconnu, indisponible, non texte, hors ligne), affichage du modèle sous chaque message (CLI, web, API, --quiet).
  • Règles JSON (RoutingRulesTests.cs) : valeurs par défaut, ajout et retrait de mots, conditions des règles, première règle qui correspond, erreurs signalées sans jamais bloquer, recherche du dossier et rechargement, --init-routing, --explain-routing.
  • Langues : détection (--lang, CSAGENT_LANG, système), raisons, avertissements et fichiers générés en français, cohérence du dictionnaire.
  • --prompt : analyse des arguments, et models.json qui ne fixe pas de modèle de chat sur un endpoint personnalisé.
  • Persistance : nouvelle tentative du déplacement final, fichier verrouillé.

--prompt a aussi été essayé de bout en bout, sur Windows (réponse du modèle de chat, mémoire et résumé de session mis à jour) et avec un faux serveur compatible OpenAI.