Forráskód Böngészése

CONTEXT_MESSAGE_LIMIT plafonné à 100

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet 22 órája
szülő
commit
032cc7cbd6
3 módosított fájl, 9 hozzáadás és 3 törlés
  1. 2 0
      CHANGELOG.md
  2. 1 1
      README.md
  3. 6 2
      bot/config.py

+ 2 - 0
CHANGELOG.md

@@ -24,6 +24,8 @@ Les versions les plus récentes sont en haut. Chaque entrée commence par un ré
 
 - **Une personnalité illisible ne rend plus Rika muette.** Un fichier de personnalité qui n'est pas en UTF-8 (enregistré en ANSI avec le Bloc-notes, par exemple), illisible, ou un `PERSONALITY_FILE` qui désigne un dossier (ConfigMap montée comme dossier sur OpenShift) faisait échouer chaque message sans réponse. Rika garde maintenant la dernière personnalité valide, ou celle par défaut au démarrage, et le journal indique une seule fois le problème et comment le corriger. Le fichier est relu dès qu'il est modifié.
 
+- **`CONTEXT_MESSAGE_LIMIT` plafonné à 100.** Aucune limite n'empêchait d'y mettre 2000 : chaque mention demandait alors une vingtaine d'appels à Discord et envoyait environ 100 000 tokens à Claude (plusieurs dizaines de centimes par mention, ou un refus « prompt is too long »). Au-delà de 100, le bot refuse de démarrer avec un message « Erreur de configuration » clair.
+
 - **Un dossier absent est signalé au démarrage.** Si le dossier de `LOG_FILE`, de `HISTORY_FILE` ou de `MEMORY_DIR` n'existe pas (volume Docker mal monté, faute de frappe) ou n'est pas accessible en écriture, le bot refuse de démarrer avec un message « Erreur de configuration » clair, au lieu d'une trace Python (`LOG_FILE`) ou de tourner sans jamais rien sauvegarder (`HISTORY_FILE`). L'historique est aussi enregistré comme les autres fichiers : envoyé jusqu'au disque avant de remplacer l'ancien, pour ne pas finir vide après une coupure de courant.
 
 ---

+ 1 - 1
README.md

@@ -106,7 +106,7 @@ Tous les réglages se trouvent dans le `.env`, et chacun est expliqué dans `.en
 | `EFFORT` | Niveau d'effort : `low`, `medium`, `high`, `xhigh` ou `max` ; vide = valeur du modèle | `medium` |
 | `MAX_TOKENS` | Longueur maximale d'une réponse (réflexion et notes de mémoire comprises), en tokens ; ne coûte que si elle est atteinte. Avec la mémoire, de quoi réécrire un fichier plein après la réflexion (voir `.env.exemple`) : le bot refuse de démarrer sous le minimum, et prévient dans le message « En ligne » si la réflexion risque de ne pas tenir | `4000` |
 | `MAX_HISTORY_LENGTH` | Messages gardés en mémoire dans le salon dédié (jusqu'à la moitié de plus avant d'y revenir d'un coup, ce qui garde la mémoire en cache) | `10` |
-| `CONTEXT_MESSAGE_LIMIT` | Messages lus autour d'une mention | `20` |
+| `CONTEXT_MESSAGE_LIMIT` | Messages lus autour d'une mention (100 au plus) | `20` |
 | `API_TIMEOUT` | Attente maximale d'une réponse, en secondes, relances comprises (une requête trop lente n'est pas relancée) ; le bot prévient au démarrage s'il est trop court pour `MAX_TOKENS` | `60` |
 | `WEB_SEARCH` | Recherche web et lecture de liens (`on` ou `off`) ; prévois alors un `API_TIMEOUT` d'au moins 90 secondes | `off` |
 | `PRESENCE` | Statut Discord et absences (`on` ou `off`) ; les `PRESENCE_*` règlent les chances de chaque statut et la nuit | `on` |

+ 6 - 2
bot/config.py

@@ -39,7 +39,8 @@ def _get_str(name: str, default: str | None = None, required: bool = False) -> s
     return value.strip()
 
 
-def _get_int(name: str, default: int | None = None, required: bool = False, minimum: int | None = None) -> int | None:
+def _get_int(name: str, default: int | None = None, required: bool = False, minimum: int | None = None,
+             maximum: int | None = None) -> int | None:
     raw = _get_str(name, required=required)
     if raw is None:
         return default
@@ -49,6 +50,8 @@ def _get_int(name: str, default: int | None = None, required: bool = False, mini
         raise ConfigError(f"La variable {name} doit être un nombre entier (valeur actuelle : {raw!r}).")
     if minimum is not None and value < minimum:
         raise ConfigError(f"La variable {name} doit être supérieure ou égale à {minimum} (valeur actuelle : {value}).")
+    if maximum is not None and value > maximum:
+        raise ConfigError(f"La variable {name} ne peut pas dépasser {maximum} (valeur actuelle : {value}).")
     return value
 
 
@@ -247,7 +250,8 @@ def load_settings() -> Settings:
         web_search=web_search_raw == "on",
         web_max_uses=_get_int("WEB_MAX_USES", default=3, minimum=1),
         max_history_length=_get_int("MAX_HISTORY_LENGTH", default=10, minimum=2),
-        context_message_limit=_get_int("CONTEXT_MESSAGE_LIMIT", default=20, minimum=0),
+        # Lus à chaque mention puis envoyés à Claude : au-delà, chaque mention coûte cher (ou dépasse la limite).
+        context_message_limit=_get_int("CONTEXT_MESSAGE_LIMIT", default=20, minimum=0, maximum=100),
         history_file=history_file,
         personality_file=Path(_get_str("PERSONALITY_FILE", default="personality_prompt.txt")),
         memory=memory_raw == "on",