From 5e9f90a2872be537c40babfb7e4cc2a19d91a386 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Thu, 15 Oct 2026 22:32:53 +0200 Subject: [PATCH] Modifications et ajout de nouveaux fichiers --- README.md | 6 ++- llm_avis.md | 44 +++++++++++++++++++ packages/agent/src/tools/currentmodel.test.ts | 15 +++++++ packages/agent/src/tools/currentmodel.ts | 17 +++++++ packages/agent/src/tools/index.ts | 2 + packages/core/src/agent.ts | 2 +- packages/core/src/types.ts | 2 + 7 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 llm_avis.md create mode 100644 packages/agent/src/tools/currentmodel.test.ts create mode 100644 packages/agent/src/tools/currentmodel.ts diff --git a/README.md b/README.md index a5312b1..a3d89df 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ tient compte de `MAIA_CWD`, puis de `INIT_CWD` (dossier où pnpm/npm a été lan | `core` | Contrats (`LLMProvider`, `Tool`, `AgentUI`…), boucle agent, sessions, `!`, `@fichier`, `§skill` | | `providers` | Adaptateurs LLM : `litellm` (provider unique : requêtes au format OpenAI vers LiteLLM, voir ci-dessous) | | `ui` | Interface Ink/React (journal, saisie, listes de choix, confirmations, spinner) | -| `agent` | L'agent MAIA : contexte (MAIA.md / CLAUDE.md), skills `.maia/skills` + outils Read/Glob/Grep/Write/Edit/Bash/TodoWrite/WebFetch | +| `agent` | L'agent MAIA : contexte (MAIA.md / CLAUDE.md), skills `.maia/skills` + outils Read/Glob/Grep/Write/Edit/Bash/TodoWrite/WebFetch/CurrentModel | | `cli` | Point d'entrée : configuration, boucle de conversation | Résolution du modèle (pas de défaut : s'il n'est pas défini, il est demandé) : option `--model` > variable `MAIA_MODEL` @@ -206,9 +206,10 @@ Instructions du skill… ($ARGUMENTS = arguments passés avec §sk_test) Conséquence : sans `settings.json`, il n'y a plus de règles de permissions ni de variables d'environnement venant de la configuration de l'agent, et plus de slash-commandes personnalisées. Les outils qui demandent confirmation (Write, Edit, Bash, WebFetch) la demandent toujours. -## Outils TodoWrite et WebFetch (lot 3, première partie) +## Outils TodoWrite, WebFetch et CurrentModel - **TodoWrite** : liste de tâches de la session (`pending` / `in_progress` / `completed`, forme `activeForm` pour la tâche en cours). Chaque appel remplace la liste ; le résultat (☐ ▶ ☑) est affiché à l'utilisateur et renvoyé au modèle. Un avertissement est ajouté si plusieurs tâches sont « en cours ». +- **CurrentModel** : renvoie le modèle LLM utilisé par la session (valeur à jour après un `/model`). Sans paramètre, sans confirmation ; le modèle est lu au moment de l'appel. - **WebFetch** : télécharge une URL http(s) (HTML converti en Markdown avec `turndown`, JSON mis en forme, texte brut ; 5 Mo et 30 s maximum, `max_length` caractères renvoyés). Pas de JavaScript exécuté, pas de PDF ni d'images. - Confirmation demandée à chaque appel (les règles de permissions de l'ancien `settings.json` ne sont plus lues). - Une redirection vers un **autre domaine** n'est pas suivie : l'outil renvoie la nouvelle URL, que le modèle doit rappeler (ce qui repasse par la confirmation). @@ -244,3 +245,4 @@ Journal des évolutions, dans l'ordre : 14. **Skills dans `.maia/skills`** (dossier de lancement, dossier parent, dossier utilisateur) ; les dossiers `.claude` ne sont plus lus. 15. **Badges `@inkjs/ui`** : `INFO`, `WARN`, `FAIL` (texte d'erreur `#DC8ADD`) et `ASK` devant les questions. 16. **Suppression des modes et des extensions** : un seul agent MAIA (`packages/agent`), contexte de départ `MAIA.md` sinon `CLAUDE.md` (message `INFO`, ou `WARN` si aucun). +17. **Outil `CurrentModel`** : indique au modèle quel LLM est utilisé dans la session. diff --git a/llm_avis.md b/llm_avis.md new file mode 100644 index 0000000..efe0806 --- /dev/null +++ b/llm_avis.md @@ -0,0 +1,44 @@ +# Recommandations d'utilisation des modèles LLM + +## 📊 Modèles disponibles et leurs domaines de force + +### **1. Claude 4.5 Haiku** (anthropic--claude-4.5-haiku) +- **Domaines forts :** Tâches rapides et légères, traitement économique +- **Avantages :** Très rapide, coût très bas, bon pour les tâches simples +- **Idéal pour :** Réponses rapides, résumés, tâches de faible complexité + +### **2. Claude 4.5 Sonnet** (anthropic--claude-4.5-sonnet) ⭐ **MEILLEUR CHOIX POLYVALENT** +- **Domaines forts :** + - 🎓 Raisonnement avancé (graduées-level) + - 💻 **Codage et traduction de code** (64% de réussite en agentic coding) + - 📝 Rédaction de contenu de qualité + - 🎨 Vision/interprétation visuelle (graphiques, charts) + - 📊 Reconnaissance de texte dans les images +- **Avantages :** Meilleur rapport intelligence/coût, 2x plus rapide que les anciens modèles +- **Idéal pour :** Travail complexe, aide à la programmation, orchestration multi-étapes + +### **3. GPT-4.1** (gpt-4.1) +- **Domaines forts :** Benchmark général, raisonnement, utilisation en production stable +- **Avantages :** Version légèrement améliorée de GPT-4, toujours une référence fiable +- **Idéal pour :** Tâches générales de raisonnement, code + +### **4. GPT-5 Nano** (gpt-5-nano) +- **Domaines forts :** Version légère et rapide de GPT-5 +- **Avantages :** Probablement plus performant que GPT-4 avec meilleur rapport latence/intelligence +- **Idéal pour :** Tâches exigeant plus de puissance que les modèles légers + +### **5. GPT-6 Astra** (gpt-6-astra) +- **Domaines forts :** Modèle de pointe OpenAI (la version la plus récente/puissante) +- **Avantages :** Probablement la meilleure performance globale +- **Idéal pour :** Tâches très complexes et exigeantes, recherche, problèmes de raisonnement avancé + +## 🎯 Tableau de recommandations + +| Besoin | Modèle recommandé | +|--------|-------------------| +| **Codage et programmation** | Claude 4.5 Sonnet ou GPT-6 Astra | +| **Raisonnement complexe** | GPT-6 Astra ou Claude 4.5 Sonnet | +| **Rapidité et économie** | Claude 4.5 Haiku | +| **Équilibre qualité/coût** | Claude 4.5 Sonnet ✅ | +| **Production stable** | GPT-4.1 | +| **Tâches légères/rapides** | Claude 4.5 Haiku | diff --git a/packages/agent/src/tools/currentmodel.test.ts b/packages/agent/src/tools/currentmodel.test.ts new file mode 100644 index 0000000..0b558bd --- /dev/null +++ b/packages/agent/src/tools/currentmodel.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from "vitest"; +import { currentModelTool } from "./currentmodel"; + +describe("CurrentModel", () => { + it("renvoie le modèle de la session", async () => { + expect(await currentModelTool.execute({}, { cwd: "/x", model: "gpt-4o" })).toContain("gpt-4o"); + }); + it("modèle inconnu", async () => { + expect(await currentModelTool.execute({}, { cwd: "/x" })).toContain("inconnu"); + }); + it("sans confirmation, sans paramètre", () => { + expect(currentModelTool.permission).toBe("auto"); + expect(currentModelTool.spec.name).toBe("CurrentModel"); + }); +}); diff --git a/packages/agent/src/tools/currentmodel.ts b/packages/agent/src/tools/currentmodel.ts new file mode 100644 index 0000000..2f7bd17 --- /dev/null +++ b/packages/agent/src/tools/currentmodel.ts @@ -0,0 +1,17 @@ +import type { Tool } from "@maia/core"; + +/** Indique le modèle LLM utilisé par la session (celui choisi au démarrage ou avec /model). */ +export const currentModelTool: Tool = { + spec: { + name: "CurrentModel", + description: + "Renvoie le nom du modèle LLM utilisé dans la session en cours. À utiliser quand on te demande quel modèle tu es " + + "ou quel modèle est utilisé : ne le devine pas, le modèle peut avoir été changé par l'utilisateur en cours de session.", + inputSchema: { type: "object", properties: {} }, + }, + permission: "auto", + describe: () => "modèle de la session", + async execute(_input, ctx) { + return ctx.model ? `Modèle LLM de la session : ${ctx.model}` : "Modèle LLM de la session : inconnu"; + }, +}; diff --git a/packages/agent/src/tools/index.ts b/packages/agent/src/tools/index.ts index 3158f91..3131147 100644 --- a/packages/agent/src/tools/index.ts +++ b/packages/agent/src/tools/index.ts @@ -1,5 +1,6 @@ import type { Tool } from "@maia/core"; import { bashTool } from "./bash"; +import { currentModelTool } from "./currentmodel"; import { editTool } from "./edit"; import { globTool } from "./glob"; import { grepTool } from "./grep"; @@ -18,4 +19,5 @@ export const builtinTools: Tool[] = [ bashTool, todoWriteTool, webFetchTool, + currentModelTool, ]; diff --git a/packages/core/src/agent.ts b/packages/core/src/agent.ts index c1c657b..5ae5f66 100644 --- a/packages/core/src/agent.ts +++ b/packages/core/src/agent.ts @@ -148,7 +148,7 @@ async function executeToolCall( } try { - const output = await tool.execute(call.input, { cwd: session.cwd, signal, env: session.env }); + const output = await tool.execute(call.input, { cwd: session.cwd, model: session.provider.model, signal, env: session.env }); ui.onToolResult(call.name, output, false); return result(output); } catch (err) { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 37b1abf..6b955f9 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -51,6 +51,8 @@ export interface LLMProvider { export interface ToolContext { cwd: string; + /** Modèle LLM utilisé par la session à cet instant (change avec /model). */ + model?: string; signal?: AbortSignal; /** Variables d'environnement additionnelles (fournies par l'agent). */ env?: Record;