| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- CHANGELOG — Chatbot Discord
- ===========================
- Version 5.10
- ------------
- 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-<date>). 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 (<think>…</think>, <reasoning>…, 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
- <invoke name="think">…, raisonnement entre balises <reasoning>…), 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.
|