Skip to content

trousse_chat

trousse_chat

La trousse du chat : stable par défaut, adaptative sur demande.

20 septembre 2026 — la trousse qui change coûte plus cher que la trousse lourde. Ollama (llama-server, un créneau) réutilise le préfixe calculé du tour précédent ; les schémas d'outils sont rendus en TÊTE du prompt, donc toute variation de la trousse invalide tout ce qui suit. Banc de cinq tours sur le 9b, même conversation, trousse adaptative :

tâches (catalogue + 2)  préremplissage 9,1 s  — froid
capitale du Pérou (45)                24,4 s  — froid
mes notes (catalogue + 1)              8,4 s  — froid, puis relecture 2,9 s
capitale du Chili (45)                 2,9 s  — chaud : même trousse que le Pérou
tâches en retard (catalogue + 2)       9,0 s  — froid

Quatre tours sur cinq à froid ; le seul tour chaud est celui dont la trousse était identique au précédent tour de même forme. Une trousse unique pour toute la conversation — et pour TOUTES les conversations, le préfixe étant le même partout — ne se paie qu'au chargement du modèle.

Le mode adaptatif du 19 septembre (catalogue léger + schémas des familles reconnues, relecture d'une réponse sans appel) reste disponible : [agent] trousse_adaptative = true. Il gardait l'accès à TOUS les outils (les paramètres seuls étaient différés) et valait pour un premier tour à froid : 3 441 jetons au lieu de 10 231.

Ce qui varie encore, mesuré ou lu le 20 septembre : un « Merci ! » part sans trousse (préfixe = identité seule, 4,2 s de préremplissage pour 1 843 jetons) mais llama-server garde le préfixe outillé en cache — le tour suivant est revenu chaud à 2,7 s ; le tour qui répond à un questionnaire retire le schéma des questions (46 → 45) et le passage sans outils après trois actions retire tout le bloc : un recalcul de l'historique chacun, rares. La relecture avant affichage n'a plus d'objet avec tous les schémas ; le modèle qui affirme sans lire reste possible, comme avant le 19 septembre.

Classes

TrousseChat

TrousseChat(
    tools: Sequence[Any],
    messages: Sequence[Message],
    *,
    adaptative: bool = False,
)

Sélection propre au tour ; aucune mutation du registre ou de l'exécuteur.

Source code in src/diapason/server/trousse_chat.py
def __init__(
    self,
    tools: Sequence[Any],
    messages: Sequence[Message],
    *,
    adaptative: bool = False,
):
    self._specs = [outil.to_openai_function() for outil in tools]
    self.noms = {s["function"]["name"] for s in self._specs}
    self._charges = 0
    amorces, connue = _amorcer(messages)
    self._actifs = amorces & self.noms
    self._lecture_attendue = _demande_de_lecture(messages)
    catalogue = "\n".join(
        s["function"]["name"]
        + ": "
        + re.split(
            r"(?<=[.!?])\s", s["function"].get("description", ""), maxsplit=1
        )[0][:180]
        for s in self._specs
    )
    self._chargement = {
        "type": "function",
        "function": {
            "name": CHARGER_OUTILS,
            "description": (
                "Charge les paramètres des outils du catalogue ci-dessous. "
                "Pour lire ou modifier des données personnelles, "
                "appelle l'outil réel : "
                "ne les invente pas. Si son schéma est absent, "
                "charge-le ici puis utilise-le. "
                "Pour une explication ou rédaction autonome, réponds directement. "
                "Charger un schéma n'exécute aucune action. Catalogue :\n"
                + catalogue
            ),
            "parameters": {
                "type": "object",
                "additionalProperties": False,
                "properties": {
                    "toolNames": {
                        "type": "array",
                        "items": {"type": "string"},
                        "minItems": 1,
                    }
                },
                "required": ["toolNames"],
            },
        },
    }
    self._differee = (
        adaptative
        and CHARGER_OUTILS not in self.noms
        and _taille(self._specs) > SEUIL_CATALOGUE
        # Essai réel du 19/09 : « J'ai reçu quoi ? » avec catalogue seul
        # produisait une absence de messages inventée. Une demande inconnue
        # garde donc les schémas complets ; les indices ne sont pas un plafond.
        and (connue or _redaction_autonome(messages))
        and _taille(self._selection()) < _taille(self._specs)
    )