changelog.txt 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. CHANGELOG — Chatbot Discord
  2. ===========================
  3. Version 5.10
  4. ------------
  5. Nouveautés
  6. - Mémoire des membres (MEMORY=on, en construction) : le bot tient un
  7. registre des membres qu'il voit : auteurs des messages qu'il lit,
  8. membres mentionnés et auteurs des messages cités, sans les bots. Pour chacun, il garde le
  9. nom d'utilisateur, le nom d'affichage, le pseudo sur le serveur et les
  10. 5 derniers anciens pseudos, mis à jour à chaque message. Le registre
  11. est dans memories/registre.json, à côté de l'historique (MEMORY_DIR
  12. pour un autre dossier), et n'est réécrit que si quelque chose change.
  13. Rika tient une fiche par membre (memories/membres/<id>.md) et un
  14. fichier général du serveur (memories/serveur.md), avec un outil
  15. « memoire » exécuté par le bot : lire, ajouter, remplacer ou réécrire,
  16. dans ces seuls fichiers. Elle note en style télégraphique, une ligne
  17. par fait, avec la source quand l'info vient d'un autre membre. Une
  18. fiche est limitée à 3000 caractères (MEMORY_MEMBER_LIMIT) et le
  19. fichier général à 5000 (MEMORY_SERVER_LIMIT) : une note de trop est
  20. refusée, et Rika réécrit alors le fichier en plus court. Au plus 5
  21. lectures ou écritures par réponse (MEMORY_MAX_OPERATIONS). Quand elle
  22. a noté quelque chose, elle ajoute 📝 au message auquel elle répond
  23. (permission « Ajouter des réactions » nécessaire). Outil maison plutôt
  24. que celui d'Anthropic, qui lui ferait relire tout le dossier avant
  25. chaque réponse (un appel de plus à chaque message).
  26. Le bot joint lui-même à chaque message les fiches des membres
  27. concernés (auteurs, membres mentionnés, auteur du message cité), sans
  28. appel supplémentaire ; elles ne sont pas enregistrées dans
  29. l'historique, et le cache s'arrête juste avant elles pour que
  30. l'historique reste relu en cache au message suivant. Le prompt
  31. contient aussi la liste des membres, avec tous leurs noms (pseudo,
  32. nom d'utilisateur, surnoms de la fiche, anciens pseudos) et le chemin
  33. de leur fiche, ce qui permet à Rika de noter une info sur quelqu'un
  34. cité par son seul nom ou surnom ; ainsi que le fichier général. Les
  35. membres qui ont désactivé la mémoire n'y figurent pas.
  36. Divers
  37. - /reset et /skip sont réservés aux membres qui ont la permission
  38. Administrateur (avant : aussi aux modérateurs, avec « Gérer les
  39. messages »). Les commandes sont renvoyées à Discord au premier
  40. démarrage de la 5.10.
  41. Version 5.9
  42. -----------
  43. Nouveautés
  44. - Emojis du serveur : Rika reçoit automatiquement la liste des emojis du
  45. serveur et peut tous les utiliser, sans qu'il faille les recopier dans
  46. la personnalité ; un emoji ajouté ou retiré est pris en compte tout de
  47. suite. Elle les écrit par leur nom (:hap:), et le bot les remplace par
  48. l'emoji avant l'envoi : plus d'identifiant inventé, et environ 3 fois
  49. moins de tokens par emoji. Les emojis animés sont compris (un bot n'a
  50. pas besoin de Nitro) ; seuls ceux réservés à des rôles qu'elle n'a pas
  51. sont exclus, y compris quand elle répond à un emoji seul. Dans sa
  52. mémoire et dans les messages qu'elle
  53. lit, les emojis apparaissent aussi par leur nom.
  54. La personnalité dit seulement quand en mettre, par exemple : « Tu
  55. termines chaque message par un seul emoji du serveur, directement
  56. après le dernier mot. » Une ancienne liste de codes (<:hap:123…>)
  57. fonctionne encore, mais n'est plus utile.
  58. - Statut Discord gardé entre deux redémarrages : Rika reprend son statut
  59. là où elle en serait si elle ne s'était pas arrêtée, comme s'il avait
  60. continué pendant l'arrêt. Après un redémarrage rapide, elle regarde
  61. toujours le même épisode ou joue au même jeu ; après un arrêt plus
  62. long, l'anime a avancé d'autant d'épisodes et la playlist d'autant de
  63. morceaux. Absente ou en « Ne pas déranger », elle le reste : les
  64. messages en attente gardent leur réponse différée. Un statut terminé
  65. pendant l'arrêt, coupé par la nuit ou désactivé depuis dans
  66. PRESENCE_WEIGHTS laisse place à un nouveau, et ses derniers statuts
  67. personnalisés ne sont pas répétés. Le statut est gardé dans
  68. presence_state.json, à côté de l'historique.
  69. - /skip : abandonne le statut Discord en cours (l'anime ou la playlist
  70. entière) et en tire un nouveau tout de suite, selon les mêmes règles.
  71. Réservé aux modérateurs et administrateurs, comme /reset ; seul celui
  72. qui lance la commande voit le nouveau statut et sa durée. Si Rika
  73. était absente et passe en ligne, elle répond aussitôt aux messages en
  74. attente ; si elle s'éloigne en pleine conversation, elle prévient son
  75. salon. Sans effet la nuit, et absente avec PRESENCE=off. La commande
  76. est envoyée à Discord au premier démarrage de la 5.9.
  77. - Statuts plus variés : un nouveau statut ne peut plus être du même type
  78. que les deux derniers (avant, seul le dernier était exclu), et le type
  79. d'avant revient deux fois moins souvent. Les suites comme anime /
  80. musique / anime deviennent impossibles : un type vu dans les 3
  81. derniers statuts revient dans 15 % des tirages au lieu de 37 %, et les
  82. chances de PRESENCE_WEIGHTS restent presque respectées. Si trop de
  83. statuts sont désactivés pour respecter la règle, elle s'assouplit.
  84. Les derniers types tirés sont gardés dans presence_state.json.
  85. Divers
  86. - Image Docker : Python 3.15 au lieu de 3.13. Toutes les dépendances
  87. ont leurs paquets précompilés pour cette version.
  88. Version 5.8
  89. -----------
  90. Nouveautés
  91. - Messages modifiés ou supprimés : dans son salon, Rika oublie le
  92. contenu d'un message supprimé (texte, pièces jointes) et sa citation
  93. dans les réponses qui le citaient. Elle se souvient seulement que
  94. quelqu'un a écrit un message à ce moment-là, supprimé depuis, et garde
  95. sa propre réponse : la conversation ne perd pas son fil. Un message
  96. modifié prend son nouveau texte, avec une mention indiquant qu'il a
  97. été modifié après sa réponse. Un message supprimé avant qu'elle y réponde (pendant une
  98. absence par exemple) ne reçoit plus de réponse, y compris une mention
  99. hors de son salon ; modifié, elle répond au nouveau texte.
  100. - Nouveau format de l'historique (version 3), plus lisible : chaque
  101. message Discord y garde son identifiant, et la date, l'auteur, la
  102. citation, le texte et les pièces jointes sont séparés. L'ancien
  103. fichier est converti automatiquement au premier lancement, sans
  104. réécrire le cache de prompt, et une copie en est gardée à côté
  105. (conversation_history.json.v2-<date>). Revenir à la 5.7 demande de
  106. remettre cette copie à la place du fichier : la 5.7 ne sait pas lire
  107. le nouveau format et repartirait d'une mémoire vide.
  108. Corrections
  109. - Réflexion affichée : quand le modèle commence sa réponse par sa
  110. réflexion (<think>…</think>, <reasoning>…, faux appel d'outil), elle
  111. est retirée avant l'envoi, et le log le signale. Seul un bloc complet
  112. tout au début est retiré : une balise plus loin dans le texte ou dans
  113. du code reste affichée. Celle déjà présente dans la mémoire est
  114. nettoyée au démarrage : en la relisant, le modèle l'imitait, et une
  115. fuite en entraînait d'autres.
  116. Version 5.7
  117. -----------
  118. Nouveautés
  119. - Quand Rika passe absente ou en « Ne pas déranger » (ou part dormir) en
  120. pleine conversation, elle prévient son salon dans un court message, en
  121. accord avec son statut. Elle ne le fait que si quelqu'un y a écrit dans
  122. les 3 dernières minutes, et après avoir fini sa réponse en cours ; elle
  123. s'en souvient ensuite.
  124. - PDF : Rika lit un PDF joint au message (texte, tableaux, schémas, pages
  125. scannées), dans son salon et quand on la mentionne. Un PDF par message,
  126. sans image ; 20 pages au plus (PDF_MAX_PAGES dans le .env, 0 pour
  127. refuser les PDF) et 20 Mo. Les PDF protégés par un mot de passe sont
  128. refusés. Comme pour les images, seul le nom du fichier reste en mémoire.
  129. Nouvelle dépendance : pypdf (pip install -r requirements.txt).
  130. - Mémoire moins chère : quand elle est pleine, elle n'oublie plus un
  131. échange à chaque message, mais plusieurs d'un coup. Elle grandit jusqu'à
  132. MAX_HISTORY_LENGTH + la moitié (20 → 30 messages), puis revient à
  133. MAX_HISTORY_LENGTH. Entre deux coupes, le début de la conversation reste
  134. dans le cache de prompt au lieu d'être réécrit à chaque message : dans
  135. une conversation animée, l'historique coûte environ 2 à 3 fois moins
  136. cher.
  137. - Fichiers texte : en plus des .txt, Rika lit les .md, .csv, .json, .log,
  138. sous-titres (.srt, .vtt), fichiers de configuration, pages HTML et le
  139. code (.py, .js, .java, .cpp, .cs…).
  140. Corrections
  141. - Les captures d'écran trop grandes restent en PNG au lieu d'être
  142. converties en JPEG, qui brouillait le texte (le JPEG ne sert plus que si
  143. le PNG dépasse la limite de l'API). Les images en palette (PNG optimisés,
  144. GIF) sont réduites proprement, et non plus au plus proche voisin.
  145. - Erreurs de l'API : une requête refusée n'est plus toujours présentée
  146. comme un problème de formulation (ou d'image dès qu'une image est
  147. jointe). Rika parle de l'image seulement si c'est elle qui pose
  148. problème, propose /reset si la conversation est trop longue, et demande
  149. de prévenir l'administrateur pour un réglage du .env refusé, un crédit
  150. épuisé, un modèle introuvable ou un accès refusé ; les logs en donnent
  151. la cause.
  152. - Les fichiers .txt enregistrés en « Unicode » par le Bloc-notes (UTF-16)
  153. sont lus, au lieu d'être refusés comme « pas du texte lisible ».
  154. - Stickers : un sticker accompagné de texte ou d'une pièce jointe n'efface
  155. plus le message (même pendant une absence) : Claude reçoit le texte et
  156. le nom du sticker. « Aucun sticker utilisable » et « Aucun emoji
  157. personnalisé » ne sont plus envoyés à chaque fois : si le serveur n'a
  158. rien d'utilisable, Rika répond avec des mots.
  159. - Si Discord refuse l'indicateur « en train d'écrire » (permission
  160. manquante, panne passagère), la réponse est quand même envoyée, au lieu
  161. d'être perdue.
  162. - Commandes slash : elles ne sont plus renvoyées à Discord à chaque
  163. démarrage (Discord limite ces envois), seulement quand elles ont changé.
  164. Leur empreinte est gardée dans slash_commands.sha256, à côté de
  165. l'historique (le supprimer force un nouvel envoi). Un échec de l'envoi
  166. n'empêche plus le bot de démarrer : il réessaie au démarrage suivant.
  167. - Historique : un fichier conversation_history.json d'une forme inattendue
  168. (liste, « channels » qui n'est pas un dictionnaire, mauvais encodage)
  169. n'empêche plus le bot de démarrer : il est mis de côté et Rika repart
  170. d'une mémoire vide. Les copies de secours sont datées
  171. (.corrompu-AAAA-MM-JJ_HH-MM-SS) et ne s'écrasent plus entre elles.
  172. - .env : API_TIMEOUT doit valoir au moins 1 seconde, et les prix
  173. (PRICE_*) ne peuvent plus être négatifs. « nan » et « inf » sont refusés
  174. pour tous les réglages décimaux, PRESENCE_SPEED compris. Une valeur
  175. invalide arrête le bot au démarrage avec un message clair.
  176. Version 5.6
  177. -----------
  178. Nouveautés
  179. - Statut Discord : sous son pseudo, Rika regarde un anime, écoute de la
  180. musique, joue à un jeu, affiche une pensée du moment, ou passe en « Ne pas
  181. déranger » ou absente.
  182. - Chances de chaque statut : anime 20 %, musique 20 %, pensée 10 %, jeu
  183. 20 %, en ligne sans activité 20 %, Ne pas déranger 5 %, absente 5 %
  184. (PRESENCE_WEIGHTS dans le .env). Chaque statut a sa propre durée, tirée
  185. au sort ; à la fin, un nouveau statut est tiré, jamais le même que le
  186. précédent.
  187. - Animes : un titre (romaji) au hasard dans le top 500 d'AniList. Rika
  188. regarde 1 à 5 épisodes à la suite, à partir d'un épisode précis, à la
  189. durée réelle d'un épisode (un film compte pour un épisode).
  190. - Musiques : 6 à 20 titres au hasard dans le Top Worldwide, le Top France
  191. et le Top Japan de Deezer, chacun à sa durée réelle.
  192. - Jeux : un jeu au hasard dans toute la boutique Steam (clé STEAM_API_KEY ;
  193. sans elle, pas de statut « joue à »), pendant 45 min à 2 h. Les jeux
  194. pour adultes sont écartés, et Rika connaît la présentation du jeu sur la
  195. boutique.
  196. - En ligne sans activité : 15 à 45 min.
  197. - Pensée du moment (30 à 90 min), raison d'une absence (10 à 60 min) ou
  198. d'un Ne pas déranger (30 à 90 min) : écrites par Claude avec la
  199. personnalité du bot, selon l'heure et la durée, sans reprendre les
  200. dernières.
  201. - De 2 h à 6 h, Rika est automatiquement absente (PRESENCE_NIGHT), quoi
  202. qu'elle soit en train de faire.
  203. - Quand on lui parle, Rika sait ce qu'elle est en train de faire, et pour
  204. combien de temps encore.
  205. - PRESENCE_SPEED=10 rend tous les statuts 10 fois plus courts, pour tester.
  206. - Les listes sont téléchargées au démarrage puis une fois par jour, et
  207. gardées dans presence_sources.json (à côté de l'historique) au cas où
  208. un site ne répondrait plus.
  209. - Absente (et la nuit), Rika ne répond plus avant son retour ; en « Ne pas
  210. déranger », elle répond au bout de 5 à 15 minutes, ou dès qu'elle change
  211. de statut.
  212. - Dans son salon, tous les messages arrivés entre-temps reçoivent une
  213. seule réponse groupée. Ailleurs, elle répond à chaque mention avec
  214. « Répondre », pour qu'on sache à quel message elle répond.
  215. - Elle sait qu'elle répond en retard, et pourquoi (absente, Ne pas
  216. déranger, la nuit, avec la raison affichée).
  217. - Elle ne réagit pas aux stickers ni aux emojis seuls pendant ce temps.
  218. - Les messages en attente sont gardés dans waiting_messages.json (à côté
  219. de l'historique) : après un redémarrage, Rika y répond quand même.
  220. Version 5.5
  221. -----------
  222. Corrections
  223. - Les avertissements de discord.py sur le vocal (PyNaCl et davey non
  224. installés) n'apparaissent plus à chaque démarrage : le bot n'utilise pas
  225. le vocal.
  226. - Réflexion affichée : avec Sonnet 5.5 et EFFORT=high, le modèle écrivait
  227. parfois sa réflexion dans sa réponse (faux appel d'outil
  228. <invoke name="think">…, raisonnement entre balises <reasoning>…), quand il
  229. choisissait de ne pas réfléchir. Ça n'arrive plus avec EFFORT=medium :
  230. c'est le réglage conseillé.
  231. - Les consignes ajoutées automatiquement à la personnalité suivent les
  232. recommandations d'Anthropic contre ces fuites : plus d'interdiction de
  233. commenter les recherches web (ce commentaire n'est de toute façon jamais
  234. affiché), et une consigne générale contre les balises internes.
  235. - Au démarrage, le log indique le modèle, la réflexion, l'effort et la
  236. recherche web réellement utilisés.
  237. - Logs : chaque requête HTTP vers l'API d'Anthropic n'est plus journalisée
  238. (le SDK 2.x passe par httpx2, qui n'était pas rendu silencieux).
  239. Version 5.4.0
  240. -------------
  241. Nouveautés
  242. - Changement de modèle facile : il suffit de modifier CLAUDE_MODEL dans le
  243. .env (claude-sonnet-5-5, claude-haiku-5-5 ou claude-opus-5-5) et de
  244. redémarrer le bot.
  245. - THINKING=off coupe la réflexion de la façon propre à chaque modèle
  246. (auparavant, tout autre modèle que Sonnet 5.5 était refusé par l'API).
  247. - Sur Opus 5.5, la réflexion ne peut pas être coupée : régler EFFORT=low.
  248. - Les tarifs utilisés pour le coût estimé dans les logs suivent le modèle
  249. choisi ; PRICE_INPUT_PER_MTOK et PRICE_OUTPUT_PER_MTOK ne sont plus à
  250. renseigner que pour un autre modèle (à vider dans le .env existant).
  251. - Messages transférés : dans le salon dédié, le bot lit le message transféré
  252. (son texte et son image).
  253. - Discussion entre bots : le bot répond aux autres bots quand ils le
  254. mentionnent ou répondent à l'un de ses messages ; le reste de ce qu'ils
  255. postent est toujours ignoré.
  256. - Messages regroupés : dans le salon dédié, les messages envoyés pendant que
  257. le bot répond ne reçoivent plus chacun leur réponse ; ils lui sont transmis
  258. ensemble (avec leurs images) et il y répond en une seule fois.
  259. Corrections
  260. - Les messages système (arrivée d'un membre, message épinglé, boost, fil
  261. créé…) et les messages sans rien à lire (sondages…) ne déclenchent plus de
  262. réponse payante de Claude.
  263. - /reset vidait mal la mémoire s'il était lancé pendant une réponse : l'échange
  264. en cours y était réécrit juste après. Le reset attend désormais la fin de la
  265. réponse avant de tout effacer.
  266. - Mentions moins chères : le contexte lu pour répondre à une mention n'est
  267. plus écrit dans le cache de prompt (surcoût de 25 %), puisqu'il change à
  268. chaque mention et n'y était jamais relu.
  269. - Mentions : l'image jointe à la mention elle-même est maintenant lue (seule
  270. celle du message cité l'était). Si les deux en ont une, c'est celle de la
  271. mention qui est envoyée à Claude.
  272. Version 5.3.0
  273. -------------
  274. Nouveautés
  275. - Accès à Internet (désactivé par défaut) : avec WEB_SEARCH=on dans le .env,
  276. le bot peut faire des recherches web et lire les liens partagés dans la
  277. conversation (outils web_search et web_fetch d'Anthropic).
  278. - Il ne cherche que si la question porte sur l'actualité ou une info qu'il
  279. ne connaît pas, et nomme sa source dans sa réponse (sans lien).
  280. - WEB_MAX_USES limite le nombre de recherches (et de pages lues) par message.
  281. - Seule la réponse finale est envoyée sur Discord, sans les commentaires
  282. écrits pendant les recherches.
  283. - Dans la mémoire, une mention indique au bot qu'il a réellement cherché,
  284. pour qu'il ne croie pas avoir inventé sa réponse au message suivant.
  285. - Avec la recherche activée, prévoir API_TIMEOUT=90.
  286. Améliorations
  287. - Cache de prompt : la personnalité, les outils et l'historique sont relus
  288. depuis le cache à 10 % du prix (pendant 5 minutes, prolongées à chaque
  289. message). Avec la recherche web activée, un message simple passe d'environ
  290. 0,015 $ à 0,002 $.
  291. - Le coût estimé dans les logs tient compte du cache (tokens lus et écrits)
  292. et des recherches web (PRICE_WEB_SEARCH_PER_1000).
  293. Version 5.2.0
  294. -------------
  295. Nouveautés
  296. - Fichiers texte : le bot lit un fichier .txt joint au message et en tient
  297. compte dans sa réponse.
  298. - Un fichier .txt par message (en plus d'une éventuelle image), 100 Ko maximum.
  299. - Fonctionne dans le salon dédié et en mode mention.
  300. - Encodage UTF-8 ou Windows (Bloc-notes) reconnu automatiquement.
  301. - Dans la mémoire, seul le nom du fichier est conservé, pas son contenu
  302. (comme pour les images), pour ne pas faire grimper le coût des messages
  303. suivants.
  304. - Personnalité perso : les fichiers *.local.txt sont exclus de GitHub
  305. (.gitignore). On peut y mettre une personnalité contenant des infos privées
  306. (ex. PERSONALITY_FILE=personality_prompt.local.txt dans le .env) ;
  307. personality_prompt.txt reste la personnalité par défaut publiée sur GitHub.
  308. Améliorations
  309. - Le bot n'utilise plus la fonction « Répondre » de Discord pour ses réponses :
  310. il écrit simplement à la suite dans le salon, comme un humain.
  311. - Les messages d'erreur (fichier non pris en charge, image en trop, etc.)
  312. restent en « Répondre », pour qu'on sache à qui ils s'adressent.
  313. Version 5.1.0
  314. -------------
  315. Nouveautés
  316. - Réponses aux messages : quand on utilise « Répondre » sur un message, même
  317. ancien, le bot lit le message cité et en tient compte dans sa réponse.
  318. - Si le message cité vient du bot, il sait qu'il s'agit de sa propre réponse.
  319. - Le texte cité est limité à 500 caractères.
  320. - Si le message cité contient une image, elle est aussi envoyée à Claude,
  321. sauf si la réponse contient déjà sa propre image (celle-ci est prioritaire).
  322. - Fonctionne dans le salon dédié et en mode mention.
  323. - En mode mention, le bot peut maintenant voir une image, celle du message cité.
  324. Améliorations
  325. - Le téléchargement et la préparation des images passent par une seule
  326. fonction, partagée entre le salon dédié et les messages cités.
  327. - Une image citée illisible ou trop lourde est simplement ignorée (avertissement
  328. dans bot.log) au lieu de bloquer la réponse.
  329. - La commande /reset est réservée aux modérateurs (permission « Gérer les
  330. messages ») et aux administrateurs du serveur.
  331. - Elle est masquée pour les autres membres et n'est plus disponible en
  332. messages privés.
  333. - Si un administrateur l'ouvre à tous dans les paramètres du serveur, le bot
  334. refuse quand même la commande (réponse visible uniquement par l'auteur) et
  335. note la tentative dans bot.log.
  336. Divers
  337. - discord.py 2.5 minimum est désormais requis (requirements.txt).
  338. - README : ajout de la fonctionnalité « Réponses ».
  339. - README : précision sur les droits nécessaires pour /reset.
  340. Version 5.0.0
  341. -------------
  342. Nouveautés
  343. - Passage de Mistral à Claude (Anthropic) pour générer les réponses.
  344. - Réécriture complète du Bot.
  345. Migration depuis la version 4 (Mistral)
  346. - L'ancien conversation_history.json est converti automatiquement au premier
  347. lancement (les images sont remplacées par un marqueur texte).
  348. - Dans le .env : MISTRAL_API_KEY devient ANTHROPIC_API_KEY, et MISTRAL_MODEL
  349. devient CLAUDE_MODEL.
  350. - L'intent Discord « Presence » n'est plus nécessaire.