CHANGELOG — Chatbot Discord =========================== Version 5.10 ------------ Nouveautés - Mémoire des membres (MEMORY=on) : Rika tient une fiche sur chaque membre et un fichier général du serveur (blagues récurrentes, événements, habitudes). Elle décide seule de ce qui mérite d'être retenu, quelle que soit la personne qui le lui apprend, et note la source quand l'info vient d'un autre membre (« d'après Toto »). Elle écrit en style télégraphique, une ligne par fait, sans doublon, et met à jour une ligne plutôt que d'en ajouter une. Elle ne signale pas ce qu'elle note : on le découvre plus tard, quand elle s'en souvient. - Ce que Rika voit : le bot joint lui-même à chaque message les fiches des membres concernés (auteurs, membres mentionnés, auteur du message cité), sans appel supplémentaire. Son prompt contient aussi le fichier général et la liste des membres, avec tous leurs noms (pseudo, nom d'utilisateur, surnoms notés en tête de fiche, anciens pseudos) et le chemin de leur fiche : elle peut ainsi noter une info sur quelqu'un cité par son seul nom ou surnom, et lire sa fiche si besoin. Les fiches jointes ne sont pas enregistrées dans l'historique, et le cache s'arrête juste avant elles : l'historique reste relu en cache. - Comment elle écrit : avec un outil « memoire » exécuté par le bot (lire, ajouter, remplacer, réécrire), limité à ces seuls fichiers. Une fiche fait au plus 3000 caractères (MEMORY_MEMBER_LIMIT) et le fichier général 5000 (MEMORY_SERVER_LIMIT) : une note de trop est refusée, et Rika réécrit alors le fichier en plus court, en fusionnant et en retirant le moins important. Au plus 5 lectures ou écritures par réponse (MEMORY_MAX_OPERATIONS). Outil maison plutôt que celui d'Anthropic, qui lui ferait relire tout le dossier avant chaque réponse, soit un appel de plus à chaque message. - /memoire : chaque membre voit sa fiche, visible par lui seul, et peut la modifier dans une fenêtre déjà remplie, tout effacer ou désactiver la mémoire (avec confirmation : sa fiche est effacée, plus rien n'est retenu sur lui ni joint à ses messages). Il peut la réactiver au même endroit. Les administrateurs (permission Administrateur) voient, modifient et effacent la fiche de n'importe qui avec /memoire membre:@… ; seul le membre lui-même peut désactiver sa mémoire. /memoire-serveur, réservé aux administrateurs, fait de même pour le fichier général. - Présentation : au premier message d'un membre, le bot lui envoie une seule fois un message privé qui explique ce qu'il peut retenir et comment le voir, le modifier ou le désactiver avec /memoire. Si ses messages privés sont fermés, le message est posté dans le salon, avec son nom en mention mais sans notification, et s'efface au bout d'une minute. Les membres déjà actifs sont prévenus à leur premier message après le passage à la 5.10 ; un membre qui a déjà utilisé /memoire ne l'est pas. - Registre des membres : le bot garde, pour chaque membre vu, son nom d'utilisateur, son nom d'affichage, son pseudo sur le serveur et ses 5 derniers anciens pseudos, mis à jour à chaque message, ainsi que ses réglages de la mémoire. Tout est dans le dossier memories/, à côté de l'historique (MEMORY_DIR pour un autre dossier) : registre.json, serveur.md et membres/.md. Avec Docker, il est donc sur le même volume que l'historique. - Mise en service : MEMORY=on dans le .env (ou la ConfigMap), sans nouvelle permission Discord. Avec MEMORY=off (par défaut), rien ne change, et /memoire et /memoire-serveur indiquent que la mémoire est coupée. MEMORY_MEMBER_LIMIT et MEMORY_SERVER_LIMIT ne peuvent pas dépasser 20000 (taille maximale de la fenêtre de modification). Divers - /reset et /skip sont réservés aux membres qui ont la permission Administrateur (avant : aussi aux modérateurs, avec « Gérer les messages »). Les commandes sont renvoyées à Discord au premier démarrage de la 5.10. Version 5.9 ----------- Nouveautés - Emojis du serveur : Rika reçoit automatiquement la liste des emojis du serveur et peut tous les utiliser, sans qu'il faille les recopier dans la personnalité ; un emoji ajouté ou retiré est pris en compte tout de suite. Elle les écrit par leur nom (:hap:), et le bot les remplace par l'emoji avant l'envoi : plus d'identifiant inventé, et environ 3 fois moins de tokens par emoji. Les emojis animés sont compris (un bot n'a pas besoin de Nitro) ; seuls ceux réservés à des rôles qu'elle n'a pas sont exclus, y compris quand elle répond à un emoji seul. Dans sa mémoire et dans les messages qu'elle lit, les emojis apparaissent aussi par leur nom. La personnalité dit seulement quand en mettre, par exemple : « Tu termines chaque message par un seul emoji du serveur, directement après le dernier mot. » Une ancienne liste de codes (<:hap:123…>) fonctionne encore, mais n'est plus utile. - Statut Discord gardé entre deux redémarrages : Rika reprend son statut là où elle en serait si elle ne s'était pas arrêtée, comme s'il avait continué pendant l'arrêt. Après un redémarrage rapide, elle regarde toujours le même épisode ou joue au même jeu ; après un arrêt plus long, l'anime a avancé d'autant d'épisodes et la playlist d'autant de morceaux. Absente ou en « Ne pas déranger », elle le reste : les messages en attente gardent leur réponse différée. Un statut terminé pendant l'arrêt, coupé par la nuit ou désactivé depuis dans PRESENCE_WEIGHTS laisse place à un nouveau, et ses derniers statuts personnalisés ne sont pas répétés. Le statut est gardé dans presence_state.json, à côté de l'historique. - /skip : abandonne le statut Discord en cours (l'anime ou la playlist entière) et en tire un nouveau tout de suite, selon les mêmes règles. Réservé aux modérateurs et administrateurs, comme /reset ; seul celui qui lance la commande voit le nouveau statut et sa durée. Si Rika était absente et passe en ligne, elle répond aussitôt aux messages en attente ; si elle s'éloigne en pleine conversation, elle prévient son salon. Sans effet la nuit, et absente avec PRESENCE=off. La commande est envoyée à Discord au premier démarrage de la 5.9. - Statuts plus variés : un nouveau statut ne peut plus être du même type que les deux derniers (avant, seul le dernier était exclu), et le type d'avant revient deux fois moins souvent. Les suites comme anime / musique / anime deviennent impossibles : un type vu dans les 3 derniers statuts revient dans 15 % des tirages au lieu de 37 %, et les chances de PRESENCE_WEIGHTS restent presque respectées. Si trop de statuts sont désactivés pour respecter la règle, elle s'assouplit. Les derniers types tirés sont gardés dans presence_state.json. Divers - Image Docker : Python 3.15 au lieu de 3.13. Toutes les dépendances ont leurs paquets précompilés pour cette version. Version 5.8 ----------- Nouveautés - Messages modifiés ou supprimés : dans son salon, Rika oublie le contenu d'un message supprimé (texte, pièces jointes) et sa citation dans les réponses qui le citaient. Elle se souvient seulement que quelqu'un a écrit un message à ce moment-là, supprimé depuis, et garde sa propre réponse : la conversation ne perd pas son fil. Un message modifié prend son nouveau texte, avec une mention indiquant qu'il a été modifié après sa réponse. Un message supprimé avant qu'elle y réponde (pendant une absence par exemple) ne reçoit plus de réponse, y compris une mention hors de son salon ; modifié, elle répond au nouveau texte. - Nouveau format de l'historique (version 3), plus lisible : chaque message Discord y garde son identifiant, et la date, l'auteur, la citation, le texte et les pièces jointes sont séparés. L'ancien fichier est converti automatiquement au premier lancement, sans réécrire le cache de prompt, et une copie en est gardée à côté (conversation_history.json.v2-). Revenir à la 5.7 demande de remettre cette copie à la place du fichier : la 5.7 ne sait pas lire le nouveau format et repartirait d'une mémoire vide. Corrections - Réflexion affichée : quand le modèle commence sa réponse par sa réflexion (…, …, faux appel d'outil), elle est retirée avant l'envoi, et le log le signale. Seul un bloc complet tout au début est retiré : une balise plus loin dans le texte ou dans du code reste affichée. Celle déjà présente dans la mémoire est nettoyée au démarrage : en la relisant, le modèle l'imitait, et une fuite en entraînait d'autres. Version 5.7 ----------- Nouveautés - Quand Rika passe absente ou en « Ne pas déranger » (ou part dormir) en pleine conversation, elle prévient son salon dans un court message, en accord avec son statut. Elle ne le fait que si quelqu'un y a écrit dans les 3 dernières minutes, et après avoir fini sa réponse en cours ; elle s'en souvient ensuite. - PDF : Rika lit un PDF joint au message (texte, tableaux, schémas, pages scannées), dans son salon et quand on la mentionne. Un PDF par message, sans image ; 20 pages au plus (PDF_MAX_PAGES dans le .env, 0 pour refuser les PDF) et 20 Mo. Les PDF protégés par un mot de passe sont refusés. Comme pour les images, seul le nom du fichier reste en mémoire. Nouvelle dépendance : pypdf (pip install -r requirements.txt). - Mémoire moins chère : quand elle est pleine, elle n'oublie plus un échange à chaque message, mais plusieurs d'un coup. Elle grandit jusqu'à MAX_HISTORY_LENGTH + la moitié (20 → 30 messages), puis revient à MAX_HISTORY_LENGTH. Entre deux coupes, le début de la conversation reste dans le cache de prompt au lieu d'être réécrit à chaque message : dans une conversation animée, l'historique coûte environ 2 à 3 fois moins cher. - Fichiers texte : en plus des .txt, Rika lit les .md, .csv, .json, .log, sous-titres (.srt, .vtt), fichiers de configuration, pages HTML et le code (.py, .js, .java, .cpp, .cs…). Corrections - Les captures d'écran trop grandes restent en PNG au lieu d'être converties en JPEG, qui brouillait le texte (le JPEG ne sert plus que si le PNG dépasse la limite de l'API). Les images en palette (PNG optimisés, GIF) sont réduites proprement, et non plus au plus proche voisin. - Erreurs de l'API : une requête refusée n'est plus toujours présentée comme un problème de formulation (ou d'image dès qu'une image est jointe). Rika parle de l'image seulement si c'est elle qui pose problème, propose /reset si la conversation est trop longue, et demande de prévenir l'administrateur pour un réglage du .env refusé, un crédit épuisé, un modèle introuvable ou un accès refusé ; les logs en donnent la cause. - Les fichiers .txt enregistrés en « Unicode » par le Bloc-notes (UTF-16) sont lus, au lieu d'être refusés comme « pas du texte lisible ». - Stickers : un sticker accompagné de texte ou d'une pièce jointe n'efface plus le message (même pendant une absence) : Claude reçoit le texte et le nom du sticker. « Aucun sticker utilisable » et « Aucun emoji personnalisé » ne sont plus envoyés à chaque fois : si le serveur n'a rien d'utilisable, Rika répond avec des mots. - Si Discord refuse l'indicateur « en train d'écrire » (permission manquante, panne passagère), la réponse est quand même envoyée, au lieu d'être perdue. - Commandes slash : elles ne sont plus renvoyées à Discord à chaque démarrage (Discord limite ces envois), seulement quand elles ont changé. Leur empreinte est gardée dans slash_commands.sha256, à côté de l'historique (le supprimer force un nouvel envoi). Un échec de l'envoi n'empêche plus le bot de démarrer : il réessaie au démarrage suivant. - Historique : un fichier conversation_history.json d'une forme inattendue (liste, « channels » qui n'est pas un dictionnaire, mauvais encodage) n'empêche plus le bot de démarrer : il est mis de côté et Rika repart d'une mémoire vide. Les copies de secours sont datées (.corrompu-AAAA-MM-JJ_HH-MM-SS) et ne s'écrasent plus entre elles. - .env : API_TIMEOUT doit valoir au moins 1 seconde, et les prix (PRICE_*) ne peuvent plus être négatifs. « nan » et « inf » sont refusés pour tous les réglages décimaux, PRESENCE_SPEED compris. Une valeur invalide arrête le bot au démarrage avec un message clair. Version 5.6 ----------- Nouveautés - Statut Discord : sous son pseudo, Rika regarde un anime, écoute de la musique, joue à un jeu, affiche une pensée du moment, ou passe en « Ne pas déranger » ou absente. - Chances de chaque statut : anime 20 %, musique 20 %, pensée 10 %, jeu 20 %, en ligne sans activité 20 %, Ne pas déranger 5 %, absente 5 % (PRESENCE_WEIGHTS dans le .env). Chaque statut a sa propre durée, tirée au sort ; à la fin, un nouveau statut est tiré, jamais le même que le précédent. - Animes : un titre (romaji) au hasard dans le top 500 d'AniList. Rika regarde 1 à 5 épisodes à la suite, à partir d'un épisode précis, à la durée réelle d'un épisode (un film compte pour un épisode). - Musiques : 6 à 20 titres au hasard dans le Top Worldwide, le Top France et le Top Japan de Deezer, chacun à sa durée réelle. - Jeux : un jeu au hasard dans toute la boutique Steam (clé STEAM_API_KEY ; sans elle, pas de statut « joue à »), pendant 45 min à 2 h. Les jeux pour adultes sont écartés, et Rika connaît la présentation du jeu sur la boutique. - En ligne sans activité : 15 à 45 min. - Pensée du moment (30 à 90 min), raison d'une absence (10 à 60 min) ou d'un Ne pas déranger (30 à 90 min) : écrites par Claude avec la personnalité du bot, selon l'heure et la durée, sans reprendre les dernières. - De 2 h à 6 h, Rika est automatiquement absente (PRESENCE_NIGHT), quoi qu'elle soit en train de faire. - Quand on lui parle, Rika sait ce qu'elle est en train de faire, et pour combien de temps encore. - PRESENCE_SPEED=10 rend tous les statuts 10 fois plus courts, pour tester. - Les listes sont téléchargées au démarrage puis une fois par jour, et gardées dans presence_sources.json (à côté de l'historique) au cas où un site ne répondrait plus. - Absente (et la nuit), Rika ne répond plus avant son retour ; en « Ne pas déranger », elle répond au bout de 5 à 15 minutes, ou dès qu'elle change de statut. - Dans son salon, tous les messages arrivés entre-temps reçoivent une seule réponse groupée. Ailleurs, elle répond à chaque mention avec « Répondre », pour qu'on sache à quel message elle répond. - Elle sait qu'elle répond en retard, et pourquoi (absente, Ne pas déranger, la nuit, avec la raison affichée). - Elle ne réagit pas aux stickers ni aux emojis seuls pendant ce temps. - Les messages en attente sont gardés dans waiting_messages.json (à côté de l'historique) : après un redémarrage, Rika y répond quand même. Version 5.5 ----------- Corrections - Les avertissements de discord.py sur le vocal (PyNaCl et davey non installés) n'apparaissent plus à chaque démarrage : le bot n'utilise pas le vocal. - Réflexion affichée : avec Sonnet 5.5 et EFFORT=high, le modèle écrivait parfois sa réflexion dans sa réponse (faux appel d'outil …, raisonnement entre balises …), quand il choisissait de ne pas réfléchir. Ça n'arrive plus avec EFFORT=medium : c'est le réglage conseillé. - Les consignes ajoutées automatiquement à la personnalité suivent les recommandations d'Anthropic contre ces fuites : plus d'interdiction de commenter les recherches web (ce commentaire n'est de toute façon jamais affiché), et une consigne générale contre les balises internes. - Au démarrage, le log indique le modèle, la réflexion, l'effort et la recherche web réellement utilisés. - Logs : chaque requête HTTP vers l'API d'Anthropic n'est plus journalisée (le SDK 2.x passe par httpx2, qui n'était pas rendu silencieux). Version 5.4.0 ------------- Nouveautés - Changement de modèle facile : il suffit de modifier CLAUDE_MODEL dans le .env (claude-sonnet-5-5, claude-haiku-5-5 ou claude-opus-5-5) et de redémarrer le bot. - THINKING=off coupe la réflexion de la façon propre à chaque modèle (auparavant, tout autre modèle que Sonnet 5.5 était refusé par l'API). - Sur Opus 5.5, la réflexion ne peut pas être coupée : régler EFFORT=low. - Les tarifs utilisés pour le coût estimé dans les logs suivent le modèle choisi ; PRICE_INPUT_PER_MTOK et PRICE_OUTPUT_PER_MTOK ne sont plus à renseigner que pour un autre modèle (à vider dans le .env existant). - Messages transférés : dans le salon dédié, le bot lit le message transféré (son texte et son image). - Discussion entre bots : le bot répond aux autres bots quand ils le mentionnent ou répondent à l'un de ses messages ; le reste de ce qu'ils postent est toujours ignoré. - Messages regroupés : dans le salon dédié, les messages envoyés pendant que le bot répond ne reçoivent plus chacun leur réponse ; ils lui sont transmis ensemble (avec leurs images) et il y répond en une seule fois. Corrections - Les messages système (arrivée d'un membre, message épinglé, boost, fil créé…) et les messages sans rien à lire (sondages…) ne déclenchent plus de réponse payante de Claude. - /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. - Mentions : l'image jointe à la mention elle-même est maintenant lue (seule celle du message cité l'était). Si les deux en ont une, c'est celle de la mention qui est envoyée à Claude. Version 5.3.0 ------------- Nouveautés - Accès à Internet (désactivé par défaut) : avec WEB_SEARCH=on dans le .env, le bot peut faire des recherches web et lire les liens partagés dans la conversation (outils web_search et web_fetch d'Anthropic). - Il ne cherche que si la question porte sur l'actualité ou une info qu'il ne connaît pas, et nomme sa source dans sa réponse (sans lien). - WEB_MAX_USES limite le nombre de recherches (et de pages lues) par message. - Seule la réponse finale est envoyée sur Discord, sans les commentaires écrits pendant les recherches. - Dans la mémoire, une mention indique au bot qu'il a réellement cherché, pour qu'il ne croie pas avoir inventé sa réponse au message suivant. - Avec la recherche activée, prévoir API_TIMEOUT=90. Améliorations - Cache de prompt : la personnalité, les outils et l'historique sont relus depuis le cache à 10 % du prix (pendant 5 minutes, prolongées à chaque message). Avec la recherche web activée, un message simple passe d'environ 0,015 $ à 0,002 $. - Le coût estimé dans les logs tient compte du cache (tokens lus et écrits) et des recherches web (PRICE_WEB_SEARCH_PER_1000). Version 5.2.0 ------------- Nouveautés - Fichiers texte : le bot lit un fichier .txt joint au message et en tient compte dans sa réponse. - Un fichier .txt par message (en plus d'une éventuelle image), 100 Ko maximum. - Fonctionne dans le salon dédié et en mode mention. - Encodage UTF-8 ou Windows (Bloc-notes) reconnu automatiquement. - Dans la mémoire, seul le nom du fichier est conservé, pas son contenu (comme pour les images), pour ne pas faire grimper le coût des messages suivants. - Personnalité perso : les fichiers *.local.txt sont exclus de GitHub (.gitignore). On peut y mettre une personnalité contenant des infos privées (ex. PERSONALITY_FILE=personality_prompt.local.txt dans le .env) ; personality_prompt.txt reste la personnalité par défaut publiée sur GitHub. Améliorations - Le bot n'utilise plus la fonction « Répondre » de Discord pour ses réponses : il écrit simplement à la suite dans le salon, comme un humain. - Les messages d'erreur (fichier non pris en charge, image en trop, etc.) restent en « Répondre », pour qu'on sache à qui ils s'adressent. Version 5.1.0 ------------- Nouveautés - Réponses aux messages : quand on utilise « Répondre » sur un message, même ancien, le bot lit le message cité et en tient compte dans sa réponse. - Si le message cité vient du bot, il sait qu'il s'agit de sa propre réponse. - Le texte cité est limité à 500 caractères. - Si le message cité contient une image, elle est aussi envoyée à Claude, sauf si la réponse contient déjà sa propre image (celle-ci est prioritaire). - Fonctionne dans le salon dédié et en mode mention. - En mode mention, le bot peut maintenant voir une image, celle du message cité. Améliorations - Le téléchargement et la préparation des images passent par une seule fonction, partagée entre le salon dédié et les messages cités. - Une image citée illisible ou trop lourde est simplement ignorée (avertissement dans bot.log) au lieu de bloquer la réponse. - La commande /reset est réservée aux modérateurs (permission « Gérer les messages ») et aux administrateurs du serveur. - Elle est masquée pour les autres membres et n'est plus disponible en messages privés. - Si un administrateur l'ouvre à tous dans les paramètres du serveur, le bot refuse quand même la commande (réponse visible uniquement par l'auteur) et note la tentative dans bot.log. Divers - discord.py 2.5 minimum est désormais requis (requirements.txt). - README : ajout de la fonctionnalité « Réponses ». - README : précision sur les droits nécessaires pour /reset. Version 5.0.0 ------------- Nouveautés - Passage de Mistral à Claude (Anthropic) pour générer les réponses. - Réécriture complète du Bot. Migration depuis la version 4 (Mistral) - L'ancien conversation_history.json est converti automatiquement au premier lancement (les images sont remplacées par un marqueur texte). - Dans le .env : MISTRAL_API_KEY devient ANTHROPIC_API_KEY, et MISTRAL_MODEL devient CLAUDE_MODEL. - L'intent Discord « Presence » n'est plus nécessaire.