Repository navigation
csagent-llmrouting
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é
- Notes de mise à jour
- 1. Choix automatique du modèle
- 2. Le modèle utilisé est affiché
- 3. Règles de routage modifiables :
LLMRoutingRules/ - 4. Messages de routage en français et en anglais
- 5.
--prompt: une seule demande - 6. Autres changements
- Nouvelle configuration
- Limites
- Tests
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.
- 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 surdeepseek-v4-flash. Pour retrouver le comportement d'avant (un seul modèle), utilise--no-route(ouCSAGENT_ROUTING=off), ou--model <nom>. - 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. - Orchestrateurs (
--api). Un nouvel événement SSEmodelest envoyé après chaquethought. Un client qui ignore les types d'événements inconnus n'est pas affecté ; sinon, ajoute ce type à ceux que tu ignores. - 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-largeconvient ; sinon, vérifie-le aveccsagent --model <nom> --prompt "list the files here and summarise the README". - 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 noncsagent "hello my name is John"). - 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 dossierLLMRoutingRulesdans 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 :
--model <nom>l'emporte toujours.- Une image dans la conversation sélectionne le modèle de vision.
- Les règles de
LLMRoutingRules/rules.json(la première qui correspond). - 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.
- 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.
- 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.
- Un message qui parle de code, de commande, d'e-mail, d'audio, de git, de tests… : modèle de code.
- 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--uiet--leanui, un événementmodelen--api. Quand le serveur indique un autre nom que l'alias demandé, il est ajouté :openweight-large (served: openai/gpt-oss-120b). --quietn'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>(ouCSAGENT_ROUTING_RULES), puis./LLMRoutingRules, puis à côté de l'exécutable. Un--rulesvers 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-routedé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 --docfonctionne 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
> Usersans fin. --quiets'applique aussi à--uiet--leanui(les étapes, appels d'outils et résultats réussis ne sont pas envoyés ;--apil'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.jsonou--model.--explain-routingaide à comprendre pourquoi. - Les alias
openweight-*sont ceux de l'API Albert ;openweight-mediuma répondu par une erreur lors des essais,openweight-largeconvient. - 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,--docet l'interface web restent en anglais. --promptn'a pas d'effet en--ui,--leanuiet--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, etmodels.jsonqui 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.