Browse Source

Mentions : plus d'écriture inutile du contexte dans le cache de prompt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet 5 days ago
parent
commit
d0af1733aa
3 changed files with 13 additions and 4 deletions
  1. 9 3
      bot/claude_client.py
  2. 1 1
      bot/discord_bot.py
  3. 3 0
      changelog.txt

+ 9 - 3
bot/claude_client.py

@@ -133,8 +133,12 @@ class ClaudeClient:
             content.append({"type": "text", "text": text})
         return content
 
-    async def ask(self, history: list[dict], parts: list[tuple[str, ImageData | None]]) -> Answer:
-        """Envoie l'historique + le ou les nouveaux messages (texte, image), et renvoie la réponse de Claude."""
+    async def ask(self, history: list[dict], parts: list[tuple[str, ImageData | None]],
+                  cache_history: bool = True) -> Answer:
+        """Envoie l'historique + le ou les nouveaux messages (texte, image), et renvoie la réponse de Claude.
+
+        cache_history=False évite d'écrire les messages en cache quand l'appel suivant ne les
+        reprendra pas (mentions : contexte différent à chaque fois)."""
         messages = list(history) + [{"role": "user", "content": self.build_user_content(parts)}]
         has_image = any(image is not None for _, image in parts)
 
@@ -146,13 +150,15 @@ class ClaudeClient:
         # relus depuis le cache à 10 % du prix (pendant 5 minutes, prolongées à chaque message).
         # Le marqueur sur "system" couvre ce bloc fixe ; celui de premier niveau couvre en plus
         # l'historique, qui change à chaque message mais reprend le début de la requête précédente.
+        # Une écriture en cache coûte 25 % de plus : inutile si elle ne sera jamais relue.
         params: dict = {
             "model": self.settings.model,
             "max_tokens": self.settings.max_tokens,
             "system": [{"type": "text", "text": system, "cache_control": {"type": "ephemeral"}}],
             "messages": messages,
-            "cache_control": {"type": "ephemeral"},
         }
+        if cache_history:
+            params["cache_control"] = {"type": "ephemeral"}
         # Par défaut, les modèles récents réfléchissent avant de répondre, et cette réflexion
         # consomme le budget MAX_TOKENS. Avec THINKING=off, on la coupe de la façon propre au
         # modèle (voir models.py) ; sur Opus 5.5, impossible : seul EFFORT la réduit.

+ 1 - 1
bot/discord_bot.py

@@ -233,7 +233,7 @@ class ChatBot(commands.Bot):
 
         async with message.channel.typing():
             try:
-                answer = await self.claude.ask([], [(prompt, image)])
+                answer = await self.claude.ask([], [(prompt, image)], cache_history=False)
             except ClaudeError as exc:
                 await self.safe_reply(message, exc.user_message)
                 return

+ 3 - 0
changelog.txt

@@ -31,6 +31,9 @@ Corrections
 - /reset vidait mal la mémoire s'il était lancé pendant une réponse : l'échange
   en cours y était réécrit juste après. Le reset attend désormais la fin de la
   réponse avant de tout effacer.
+- Mentions moins chères : le contexte lu pour répondre à une mention n'est
+  plus écrit dans le cache de prompt (surcoût de 25 %), puisqu'il change à
+  chaque mention et n'y était jamais relu.
 
 
 Version 5.3.0 — 29/10/2026