1
0

changelog.txt 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. CHANGELOG — Chatbot Discord
  2. ===========================
  3. Version 5.11
  4. ------------
  5. Changements
  6. - Mémoire des membres à activer soi-même : elle est désactivée par
  7. défaut, et chaque membre qui le souhaite l'active avec /memoire,
  8. après avoir lu ce qu'elle retient et qui peut voir sa fiche. Le
  9. message de bienvenue, envoyé en message privé au premier message de
  10. chacun, disparaît. Rien n'est noté sur un membre qui ne l'a pas
  11. activée, même quand les autres parlent de lui. Au premier démarrage,
  12. la mémoire reste activée pour les membres qui avaient déjà une fiche
  13. et ne l'avaient pas désactivée ; elle est désactivée pour les autres.
  14. Corrections
  15. - Un modèle inconnu du bot (CLAUDE_MODEL mal écrit, par exemple) est
  16. signalé dans le log dès le démarrage, et plus seulement au premier
  17. message. Les messages d'erreur citent CLAUDE_MODEL (et non MODEL,
  18. une variable qui n'existe pas).
  19. - TIMEZONE mal formée (« Europe/Paris/ », « ../Paris ») ou trop
  20. longue : message d'erreur clair au démarrage, au lieu d'une trace
  21. Python.
  22. - Mémoire : le fichier général et la liste des membres sont présentés
  23. à Rika comme des notes, pas des consignes, et une note ne peut plus
  24. sortir de ce cadre, même avec une balise non fermée ou des chevrons
  25. pleine largeur. Rika ne note plus de règle qui s'appliquerait à
  26. tout le monde (façon d'écrire, sujet à éviter), même présentée comme
  27. votée ou venant d'un administrateur ; une préférence personnelle
  28. (« veut qu'on l'appelle Majesté ») se note toujours dans la fiche.
  29. Au plus 5 surnoms de 32 caractères par membre. Le texte écrit dans
  30. le fichier général apparaît dans le log, pour que l'administrateur
  31. puisse vérifier.
  32. - Mémoire : une information sur un membre ne se note plus que dans sa
  33. fiche. En désactivant la mémoire, un membre efface aussi les lignes
  34. du fichier général qui le citent.
  35. - Mémoire : une fiche effacée par « Désactiver la mémoire » ne peut
  36. plus être recréée par une note en cours ni par une fenêtre /memoire
  37. restée ouverte.
  38. - Plus d'usurpation par le pseudo : Rika voit chaque auteur avec son
  39. nom d'utilisateur Discord, unique (« Johnounet (johnk) »), quand il
  40. diffère de son pseudo, y compris pour l'auteur d'un message cité.
  41. Deux membres qui portent le même pseudo ne se confondent plus, et
  42. personne ne peut faire noter une info dans la fiche d'un autre en
  43. prenant son pseudo. Les fiches jointes indiquent celles des auteurs
  44. du message, et une fiche ne peut plus imiter l'en-tête d'une autre. Les messages déjà enregistrés gardent l'ancien format.
  45. - Mémoire moins coûteuse sur un grand serveur : le prompt ne liste plus
  46. que les membres qui ont une fiche, au lieu de tous ceux que le bot a
  47. vus ou qu'on a mentionnés. Au plus 5 fiches sont jointes à un message
  48. (les auteurs d'abord, puis l'auteur du message cité, puis les membres
  49. mentionnés) ; les autres sont seulement nommées, et Rika peut les
  50. lire si besoin.
  51. - Une fiche ou un fichier général illisible (enregistré à la main dans
  52. un autre encodage, problème de droits) ne bloque plus toutes les
  53. réponses du bot : il est signalé une fois dans le log, affiché avec
  54. « � » à la place des caractères invalides, et n'est plus modifié
  55. tant qu'il n'est pas corrigé. Une fiche enregistrée avec BOM
  56. (Bloc-notes) garde sa ligne « Surnoms ».
  57. - Le bot ne relit plus toutes les fiches à chaque message pour dresser
  58. la liste des membres : elles sont lues une fois au démarrage, puis
  59. suivies à chaque note. Avec 500 membres, chaque message bloquait le
  60. bot près d'une seconde (mesuré sous Windows). Une fiche modifiée
  61. directement sur le disque n'est prise en compte dans la liste qu'au
  62. redémarrage.
  63. - Données personnelles : Rika ne note plus les confidences ni ses
  64. jugements sur quelqu'un. Une information sensible (santé, sexualité,
  65. religion, opinions, origine, adresse, argent) ne se note que si le
  66. membre la donne lui-même, et elle ne l'évoque ensuite qu'avec lui.
  67. Elle se sert de ce qu'elle sait dans la conversation, mais ne récite
  68. plus la fiche d'un membre à quelqu'un d'autre. Les fiches déjà
  69. écrites ne sont pas modifiées.
  70. - Registre des membres illisible (memories/registre.json abîmé ou mal
  71. modifié à la main) : la mémoire des membres est coupée jusqu'à sa
  72. réparation, au lieu de repartir d'un registre vide qui réactivait la
  73. mémoire de ceux qui l'avaient désactivée. Le fichier n'est plus mis
  74. de côté ni réécrit ; le log et /memoire signalent la panne. Un
  75. registre corrigé à la main et enregistré avec BOM (Bloc-notes)
  76. reste lisible.
  77. - Les surnoms d'un membre sont reconnus même si la ligne « Surnoms : … »
  78. n'est pas la première de sa fiche (ajoutée à la fin, ou fiche
  79. modifiée à la main), avec ou sans puce ; plusieurs lignes « Surnoms »
  80. sont regroupées. Avant, elles étaient ignorées sans rien dire.
  81. « Surnom : … » au singulier et « **Surnoms :** … » en gras sont
  82. aussi reconnus.
  83. - Mémoire : le chemin « memories/membres/… » (sans « / » au début) est
  84. accepté par l'outil, comme « /memories/membres/… ».
  85. - Mémoire : en désactivant la mémoire, un membre ne peut plus vider le
  86. fichier général. Seuls ses noms Discord servent à retrouver les
  87. lignes qui le citent, plus les surnoms de sa fiche, qu'il écrit
  88. lui-même. Si plus de 3 lignes le citent (pseudo qui est un mot
  89. courant, comme « Soleil »), aucune n'est retirée et le log demande à
  90. l'administrateur de vérifier avec /memoire-serveur.
  91. - Mémoire : si le registre des membres ne peut pas être enregistré
  92. (disque plein, droits), « Désactiver la mémoire » et « Réactiver la
  93. mémoire » le disent, au lieu d'annoncer un réglage qui serait perdu
  94. au redémarrage du bot. Le réglage s'applique quand même, et la
  95. prochaine sauvegarde réussie du registre l'enregistre.
  96. - Le bot ne sert plus que le serveur de son salon (CHANNEL_ID). Invité
  97. sur un autre serveur, il ignore les messages et refuse les commandes :
  98. un administrateur de ce serveur pouvait lire et réécrire la mémoire
  99. du vrai serveur avec /memoire et /memoire-serveur, et les réponses
  100. étaient payées par le propriétaire du bot. Les messages privés sont
  101. aussi ignorés. Le log signale au démarrage les autres serveurs où se
  102. trouve le bot, et le README explique comment décocher Public Bot et
  103. User Install dans le portail Discord.
  104. - /memoire ne promet plus d'effacer plus qu'il ne le fait. Le bouton
  105. « Tout effacer » d'une fiche devient « Effacer la fiche », et la
  106. confirmation précise que ce qui a été dit récemment reste dans la
  107. conversation. « Désactiver la mémoire » ne dit plus que « plus rien
  108. ne sera retenu », et remplace maintenant le nom du membre par « un
  109. membre » là où il est cité comme source dans les fiches des autres
  110. (« d'après Bob », « selon Bob »).
  111. - Mémoire : les membres savent que les administrateurs du serveur
  112. peuvent voir et corriger leur fiche (avant d'activer la mémoire, et
  113. sous leur fiche dans /memoire). Chaque ouverture de la fiche d'un
  114. autre membre avec /memoire est notée dans le log, sans son contenu.
  115. - Mémoire : la fenêtre « Modifier » n'enregistre plus rien si le
  116. fichier a changé depuis son ouverture (note de Rika, désactivation
  117. d'un membre qui retire des lignes du fichier général). Avant, elle
  118. réécrivait le fichier tel qu'il était à l'ouverture : la note était
  119. perdue, ou la ligne retirée revenait. Quand un texte n'est pas
  120. enregistré (fichier changé, trop long…), il est renvoyé en fichier
  121. joint pour ne pas être perdu.
  122. - Mémoire : la fenêtre « Modifier » du fichier général n'accepte plus
  123. que 5000 caractères (MEMORY_SERVER_LIMIT) : sa deuxième zone de texte
  124. laissait en écrire 8000, refusés ensuite à l'enregistrement.
  125. - Mémoire : un fichier plus long que sa limite (MEMORY_*_LIMIT baissée,
  126. fichier modifié sur le disque) s'ouvre de nouveau dans « Modifier »,
  127. en entier, avec la limite rappelée pour le raccourcir. Avant, la
  128. fenêtre ne s'ouvrait pas (« Échec de l'interaction »). Au-delà de
  129. 20000 caractères, trop pour une fenêtre Discord, son contenu est
  130. envoyé en fichier joint.
  131. - Commandes et boutons : une erreur affiche « Une erreur est survenue »
  132. au lieu du seul « Échec de l'interaction » de Discord. Les boutons de
  133. /memoire se grisent au bout de 10 minutes, avec un message qui invite
  134. à relancer la commande, au lieu de rester affichés sans répondre. La
  135. fenêtre « Modifier » peut être validée pendant une heure, au lieu de
  136. 10 minutes.
  137. - Mémoire : la fiche d'un membre parti du serveur peut de nouveau être
  138. ouverte avec /memoire membre: (par son identifiant). Avant, la
  139. commande échouait, et lui-même ne pouvait plus la lancer : sa fiche
  140. restait pour toujours. Un administrateur peut aussi désactiver sa
  141. mémoire à sa place, ce qui efface tout comme s'il l'avait fait.
  142. - Mémoire : avant d'activer la mémoire, chacun est prévenu que les
  143. sources sont notées avec leur nom (« d'après Toto ») et visibles par
  144. la personne concernée : ce qu'on raconte sur un autre membre peut
  145. lui être montré dans sa fiche.
  146. - Mémoire : un membre ne peut plus prendre le nom Discord d'un autre
  147. (pseudo, nom d'utilisateur ou ancien pseudo) comme surnom dans sa
  148. fiche. Ce surnom est ignoré dans la liste des membres : Rika ne note
  149. plus dans sa fiche ce qu'on raconte sur l'autre.
  150. - Mémoire : un administrateur ne peut plus écrire la fiche d'un membre
  151. qui n'a pas activé la mémoire (« Modifier » grisé, avec une
  152. explication) ; il peut toujours l'effacer.
  153. - Mémoire : MAX_TOKENS vaut 4000 par défaut (1500 avant), assez pour
  154. que Rika réécrive le fichier général quand il est plein ; avant, la
  155. réécriture était coupée et la note perdue, à chaque nouvel essai.
  156. Le bot prévient au démarrage si MAX_TOKENS est trop petit pour
  157. MEMORY_SERVER_LIMIT, et le log signale un appel d'outil coupé.
  158. - Une réponse coupée avant son premier mot n'envoie plus « […] » seul
  159. sur Discord (ni dans l'historique), mais un message d'explication.
  160. Divers
  161. - Le token Discord et les clés Anthropic et Steam n'apparaissent plus
  162. quand la configuration est affichée (précaution : aucun log ne
  163. l'affiche aujourd'hui).
  164. - Premiers tests automatisés (mémoire des membres) : lancer
  165. « python -m unittest » à la racine du projet.
  166. - Fiches et registre des membres envoyés jusqu'au disque avant d'être
  167. remplacés : une coupure de courant ne laisse plus de fichier vide.
  168. Une écriture ratée ne laisse plus de fichier « .tmp » derrière elle.
  169. Version 5.10
  170. ------------
  171. Nouveautés
  172. - Mémoire des membres (MEMORY=on) : Rika tient une fiche sur chaque
  173. membre et un fichier général du serveur (blagues récurrentes,
  174. événements, habitudes). Elle décide seule de ce qui mérite d'être
  175. retenu, quelle que soit la personne qui le lui apprend, et note la
  176. source quand l'info vient d'un autre membre (« d'après Toto »). Elle
  177. écrit en style télégraphique, une ligne par fait, sans doublon, et met
  178. à jour une ligne plutôt que d'en ajouter une. Elle ne signale pas ce
  179. qu'elle note : on le découvre plus tard, quand elle s'en souvient.
  180. - Ce que Rika voit : le bot joint lui-même à chaque message les fiches
  181. des membres concernés (auteurs, membres mentionnés, auteur du message
  182. cité), sans appel supplémentaire. Son prompt contient aussi le fichier
  183. général et la liste des membres, avec tous leurs noms (pseudo, nom
  184. d'utilisateur, surnoms notés en tête de fiche, anciens pseudos) et le
  185. chemin de leur fiche : elle peut ainsi noter une info sur quelqu'un
  186. cité par son seul nom ou surnom, et lire sa fiche si besoin. Les
  187. fiches jointes ne sont pas enregistrées dans l'historique, et le cache
  188. s'arrête juste avant elles : l'historique reste relu en cache.
  189. - Comment elle écrit : avec un outil « memoire » exécuté par le bot
  190. (lire, ajouter, remplacer, réécrire), limité à ces seuls fichiers. Une
  191. fiche fait au plus 3000 caractères (MEMORY_MEMBER_LIMIT) et le fichier
  192. général 5000 (MEMORY_SERVER_LIMIT) : une note de trop est refusée, et
  193. Rika réécrit alors le fichier en plus court, en fusionnant et en
  194. retirant le moins important. Au plus 5 lectures ou écritures par
  195. réponse (MEMORY_MAX_OPERATIONS). Outil maison plutôt que celui
  196. d'Anthropic, qui lui ferait relire tout le dossier avant chaque
  197. réponse, soit un appel de plus à chaque message.
  198. - /memoire : chaque membre voit sa fiche, visible par lui seul, et peut
  199. la modifier dans une fenêtre déjà remplie, tout effacer ou désactiver
  200. la mémoire (avec confirmation : sa fiche est effacée, plus rien n'est
  201. retenu sur lui ni joint à ses messages). Il peut la réactiver au même
  202. endroit. Les administrateurs (permission Administrateur) voient,
  203. modifient et effacent la fiche de n'importe qui avec
  204. /memoire membre:@… ; seul le membre lui-même peut désactiver sa
  205. mémoire. /memoire-serveur, réservé aux administrateurs, fait de même
  206. pour le fichier général.
  207. - Présentation : au premier message d'un membre, le bot lui envoie une
  208. seule fois un message privé qui explique ce qu'il peut retenir et
  209. comment le voir, le modifier ou le désactiver avec /memoire. Si ses
  210. messages privés sont fermés, le message est posté dans le salon, avec
  211. son nom en mention mais sans notification, et s'efface au bout d'une
  212. minute. Les membres déjà actifs sont prévenus à leur premier message
  213. après le passage à la 5.10 ; un membre qui a déjà utilisé /memoire
  214. ne l'est pas.
  215. - Registre des membres : le bot garde, pour chaque membre vu, son nom
  216. d'utilisateur, son nom d'affichage, son pseudo sur le serveur et ses
  217. 5 derniers anciens pseudos, mis à jour à chaque message, ainsi que ses
  218. réglages de la mémoire. Tout est dans le dossier memories/, à côté de
  219. l'historique (MEMORY_DIR pour un autre dossier) : registre.json,
  220. serveur.md et membres/<id>.md. Avec Docker, il est donc sur le même
  221. volume que l'historique.
  222. - Mise en service : MEMORY=on dans le .env (ou la ConfigMap), sans
  223. nouvelle permission Discord. Avec MEMORY=off (par défaut), rien ne
  224. change, et /memoire et /memoire-serveur indiquent que la mémoire est
  225. coupée.
  226. MEMORY_MEMBER_LIMIT et MEMORY_SERVER_LIMIT ne peuvent pas dépasser
  227. 20000 (taille maximale de la fenêtre de modification).
  228. Divers
  229. - /reset et /skip sont réservés aux membres qui ont la permission
  230. Administrateur (avant : aussi aux modérateurs, avec « Gérer les
  231. messages »). Les commandes sont renvoyées à Discord au premier
  232. démarrage de la 5.10.
  233. Version 5.9
  234. -----------
  235. Nouveautés
  236. - Emojis du serveur : Rika reçoit automatiquement la liste des emojis du
  237. serveur et peut tous les utiliser, sans qu'il faille les recopier dans
  238. la personnalité ; un emoji ajouté ou retiré est pris en compte tout de
  239. suite. Elle les écrit par leur nom (:hap:), et le bot les remplace par
  240. l'emoji avant l'envoi : plus d'identifiant inventé, et environ 3 fois
  241. moins de tokens par emoji. Les emojis animés sont compris (un bot n'a
  242. pas besoin de Nitro) ; seuls ceux réservés à des rôles qu'elle n'a pas
  243. sont exclus, y compris quand elle répond à un emoji seul. Dans sa
  244. mémoire et dans les messages qu'elle
  245. lit, les emojis apparaissent aussi par leur nom.
  246. La personnalité dit seulement quand en mettre, par exemple : « Tu
  247. termines chaque message par un seul emoji du serveur, directement
  248. après le dernier mot. » Une ancienne liste de codes (<:hap:123…>)
  249. fonctionne encore, mais n'est plus utile.
  250. - Statut Discord gardé entre deux redémarrages : Rika reprend son statut
  251. là où elle en serait si elle ne s'était pas arrêtée, comme s'il avait
  252. continué pendant l'arrêt. Après un redémarrage rapide, elle regarde
  253. toujours le même épisode ou joue au même jeu ; après un arrêt plus
  254. long, l'anime a avancé d'autant d'épisodes et la playlist d'autant de
  255. morceaux. Absente ou en « Ne pas déranger », elle le reste : les
  256. messages en attente gardent leur réponse différée. Un statut terminé
  257. pendant l'arrêt, coupé par la nuit ou désactivé depuis dans
  258. PRESENCE_WEIGHTS laisse place à un nouveau, et ses derniers statuts
  259. personnalisés ne sont pas répétés. Le statut est gardé dans
  260. presence_state.json, à côté de l'historique.
  261. - /skip : abandonne le statut Discord en cours (l'anime ou la playlist
  262. entière) et en tire un nouveau tout de suite, selon les mêmes règles.
  263. Réservé aux modérateurs et administrateurs, comme /reset ; seul celui
  264. qui lance la commande voit le nouveau statut et sa durée. Si Rika
  265. était absente et passe en ligne, elle répond aussitôt aux messages en
  266. attente ; si elle s'éloigne en pleine conversation, elle prévient son
  267. salon. Sans effet la nuit, et absente avec PRESENCE=off. La commande
  268. est envoyée à Discord au premier démarrage de la 5.9.
  269. - Statuts plus variés : un nouveau statut ne peut plus être du même type
  270. que les deux derniers (avant, seul le dernier était exclu), et le type
  271. d'avant revient deux fois moins souvent. Les suites comme anime /
  272. musique / anime deviennent impossibles : un type vu dans les 3
  273. derniers statuts revient dans 15 % des tirages au lieu de 37 %, et les
  274. chances de PRESENCE_WEIGHTS restent presque respectées. Si trop de
  275. statuts sont désactivés pour respecter la règle, elle s'assouplit.
  276. Les derniers types tirés sont gardés dans presence_state.json.
  277. Divers
  278. - Image Docker : Python 3.15 au lieu de 3.13. Toutes les dépendances
  279. ont leurs paquets précompilés pour cette version.
  280. Version 5.8
  281. -----------
  282. Nouveautés
  283. - Messages modifiés ou supprimés : dans son salon, Rika oublie le
  284. contenu d'un message supprimé (texte, pièces jointes) et sa citation
  285. dans les réponses qui le citaient. Elle se souvient seulement que
  286. quelqu'un a écrit un message à ce moment-là, supprimé depuis, et garde
  287. sa propre réponse : la conversation ne perd pas son fil. Un message
  288. modifié prend son nouveau texte, avec une mention indiquant qu'il a
  289. été modifié après sa réponse. Un message supprimé avant qu'elle y réponde (pendant une
  290. absence par exemple) ne reçoit plus de réponse, y compris une mention
  291. hors de son salon ; modifié, elle répond au nouveau texte.
  292. - Nouveau format de l'historique (version 3), plus lisible : chaque
  293. message Discord y garde son identifiant, et la date, l'auteur, la
  294. citation, le texte et les pièces jointes sont séparés. L'ancien
  295. fichier est converti automatiquement au premier lancement, sans
  296. réécrire le cache de prompt, et une copie en est gardée à côté
  297. (conversation_history.json.v2-<date>). Revenir à la 5.7 demande de
  298. remettre cette copie à la place du fichier : la 5.7 ne sait pas lire
  299. le nouveau format et repartirait d'une mémoire vide.
  300. Corrections
  301. - Réflexion affichée : quand le modèle commence sa réponse par sa
  302. réflexion (<think>…</think>, <reasoning>…, faux appel d'outil), elle
  303. est retirée avant l'envoi, et le log le signale. Seul un bloc complet
  304. tout au début est retiré : une balise plus loin dans le texte ou dans
  305. du code reste affichée. Celle déjà présente dans la mémoire est
  306. nettoyée au démarrage : en la relisant, le modèle l'imitait, et une
  307. fuite en entraînait d'autres.
  308. Version 5.7
  309. -----------
  310. Nouveautés
  311. - Quand Rika passe absente ou en « Ne pas déranger » (ou part dormir) en
  312. pleine conversation, elle prévient son salon dans un court message, en
  313. accord avec son statut. Elle ne le fait que si quelqu'un y a écrit dans
  314. les 3 dernières minutes, et après avoir fini sa réponse en cours ; elle
  315. s'en souvient ensuite.
  316. - PDF : Rika lit un PDF joint au message (texte, tableaux, schémas, pages
  317. scannées), dans son salon et quand on la mentionne. Un PDF par message,
  318. sans image ; 20 pages au plus (PDF_MAX_PAGES dans le .env, 0 pour
  319. refuser les PDF) et 20 Mo. Les PDF protégés par un mot de passe sont
  320. refusés. Comme pour les images, seul le nom du fichier reste en mémoire.
  321. Nouvelle dépendance : pypdf (pip install -r requirements.txt).
  322. - Mémoire moins chère : quand elle est pleine, elle n'oublie plus un
  323. échange à chaque message, mais plusieurs d'un coup. Elle grandit jusqu'à
  324. MAX_HISTORY_LENGTH + la moitié (20 → 30 messages), puis revient à
  325. MAX_HISTORY_LENGTH. Entre deux coupes, le début de la conversation reste
  326. dans le cache de prompt au lieu d'être réécrit à chaque message : dans
  327. une conversation animée, l'historique coûte environ 2 à 3 fois moins
  328. cher.
  329. - Fichiers texte : en plus des .txt, Rika lit les .md, .csv, .json, .log,
  330. sous-titres (.srt, .vtt), fichiers de configuration, pages HTML et le
  331. code (.py, .js, .java, .cpp, .cs…).
  332. Corrections
  333. - Les captures d'écran trop grandes restent en PNG au lieu d'être
  334. converties en JPEG, qui brouillait le texte (le JPEG ne sert plus que si
  335. le PNG dépasse la limite de l'API). Les images en palette (PNG optimisés,
  336. GIF) sont réduites proprement, et non plus au plus proche voisin.
  337. - Erreurs de l'API : une requête refusée n'est plus toujours présentée
  338. comme un problème de formulation (ou d'image dès qu'une image est
  339. jointe). Rika parle de l'image seulement si c'est elle qui pose
  340. problème, propose /reset si la conversation est trop longue, et demande
  341. de prévenir l'administrateur pour un réglage du .env refusé, un crédit
  342. épuisé, un modèle introuvable ou un accès refusé ; les logs en donnent
  343. la cause.
  344. - Les fichiers .txt enregistrés en « Unicode » par le Bloc-notes (UTF-16)
  345. sont lus, au lieu d'être refusés comme « pas du texte lisible ».
  346. - Stickers : un sticker accompagné de texte ou d'une pièce jointe n'efface
  347. plus le message (même pendant une absence) : Claude reçoit le texte et
  348. le nom du sticker. « Aucun sticker utilisable » et « Aucun emoji
  349. personnalisé » ne sont plus envoyés à chaque fois : si le serveur n'a
  350. rien d'utilisable, Rika répond avec des mots.
  351. - Si Discord refuse l'indicateur « en train d'écrire » (permission
  352. manquante, panne passagère), la réponse est quand même envoyée, au lieu
  353. d'être perdue.
  354. - Commandes slash : elles ne sont plus renvoyées à Discord à chaque
  355. démarrage (Discord limite ces envois), seulement quand elles ont changé.
  356. Leur empreinte est gardée dans slash_commands.sha256, à côté de
  357. l'historique (le supprimer force un nouvel envoi). Un échec de l'envoi
  358. n'empêche plus le bot de démarrer : il réessaie au démarrage suivant.
  359. - Historique : un fichier conversation_history.json d'une forme inattendue
  360. (liste, « channels » qui n'est pas un dictionnaire, mauvais encodage)
  361. n'empêche plus le bot de démarrer : il est mis de côté et Rika repart
  362. d'une mémoire vide. Les copies de secours sont datées
  363. (.corrompu-AAAA-MM-JJ_HH-MM-SS) et ne s'écrasent plus entre elles.
  364. - .env : API_TIMEOUT doit valoir au moins 1 seconde, et les prix
  365. (PRICE_*) ne peuvent plus être négatifs. « nan » et « inf » sont refusés
  366. pour tous les réglages décimaux, PRESENCE_SPEED compris. Une valeur
  367. invalide arrête le bot au démarrage avec un message clair.
  368. Version 5.6
  369. -----------
  370. Nouveautés
  371. - Statut Discord : sous son pseudo, Rika regarde un anime, écoute de la
  372. musique, joue à un jeu, affiche une pensée du moment, ou passe en « Ne pas
  373. déranger » ou absente.
  374. - Chances de chaque statut : anime 20 %, musique 20 %, pensée 10 %, jeu
  375. 20 %, en ligne sans activité 20 %, Ne pas déranger 5 %, absente 5 %
  376. (PRESENCE_WEIGHTS dans le .env). Chaque statut a sa propre durée, tirée
  377. au sort ; à la fin, un nouveau statut est tiré, jamais le même que le
  378. précédent.
  379. - Animes : un titre (romaji) au hasard dans le top 500 d'AniList. Rika
  380. regarde 1 à 5 épisodes à la suite, à partir d'un épisode précis, à la
  381. durée réelle d'un épisode (un film compte pour un épisode).
  382. - Musiques : 6 à 20 titres au hasard dans le Top Worldwide, le Top France
  383. et le Top Japan de Deezer, chacun à sa durée réelle.
  384. - Jeux : un jeu au hasard dans toute la boutique Steam (clé STEAM_API_KEY ;
  385. sans elle, pas de statut « joue à »), pendant 45 min à 2 h. Les jeux
  386. pour adultes sont écartés, et Rika connaît la présentation du jeu sur la
  387. boutique.
  388. - En ligne sans activité : 15 à 45 min.
  389. - Pensée du moment (30 à 90 min), raison d'une absence (10 à 60 min) ou
  390. d'un Ne pas déranger (30 à 90 min) : écrites par Claude avec la
  391. personnalité du bot, selon l'heure et la durée, sans reprendre les
  392. dernières.
  393. - De 2 h à 6 h, Rika est automatiquement absente (PRESENCE_NIGHT), quoi
  394. qu'elle soit en train de faire.
  395. - Quand on lui parle, Rika sait ce qu'elle est en train de faire, et pour
  396. combien de temps encore.
  397. - PRESENCE_SPEED=10 rend tous les statuts 10 fois plus courts, pour tester.
  398. - Les listes sont téléchargées au démarrage puis une fois par jour, et
  399. gardées dans presence_sources.json (à côté de l'historique) au cas où
  400. un site ne répondrait plus.
  401. - Absente (et la nuit), Rika ne répond plus avant son retour ; en « Ne pas
  402. déranger », elle répond au bout de 5 à 15 minutes, ou dès qu'elle change
  403. de statut.
  404. - Dans son salon, tous les messages arrivés entre-temps reçoivent une
  405. seule réponse groupée. Ailleurs, elle répond à chaque mention avec
  406. « Répondre », pour qu'on sache à quel message elle répond.
  407. - Elle sait qu'elle répond en retard, et pourquoi (absente, Ne pas
  408. déranger, la nuit, avec la raison affichée).
  409. - Elle ne réagit pas aux stickers ni aux emojis seuls pendant ce temps.
  410. - Les messages en attente sont gardés dans waiting_messages.json (à côté
  411. de l'historique) : après un redémarrage, Rika y répond quand même.
  412. Version 5.5
  413. -----------
  414. Corrections
  415. - Les avertissements de discord.py sur le vocal (PyNaCl et davey non
  416. installés) n'apparaissent plus à chaque démarrage : le bot n'utilise pas
  417. le vocal.
  418. - Réflexion affichée : avec Sonnet 5.5 et EFFORT=high, le modèle écrivait
  419. parfois sa réflexion dans sa réponse (faux appel d'outil
  420. <invoke name="think">…, raisonnement entre balises <reasoning>…), quand il
  421. choisissait de ne pas réfléchir. Ça n'arrive plus avec EFFORT=medium :
  422. c'est le réglage conseillé.
  423. - Les consignes ajoutées automatiquement à la personnalité suivent les
  424. recommandations d'Anthropic contre ces fuites : plus d'interdiction de
  425. commenter les recherches web (ce commentaire n'est de toute façon jamais
  426. affiché), et une consigne générale contre les balises internes.
  427. - Au démarrage, le log indique le modèle, la réflexion, l'effort et la
  428. recherche web réellement utilisés.
  429. - Logs : chaque requête HTTP vers l'API d'Anthropic n'est plus journalisée
  430. (le SDK 2.x passe par httpx2, qui n'était pas rendu silencieux).
  431. Version 5.4.0
  432. -------------
  433. Nouveautés
  434. - Changement de modèle facile : il suffit de modifier CLAUDE_MODEL dans le
  435. .env (claude-sonnet-5-5, claude-haiku-5-5 ou claude-opus-5-5) et de
  436. redémarrer le bot.
  437. - THINKING=off coupe la réflexion de la façon propre à chaque modèle
  438. (auparavant, tout autre modèle que Sonnet 5.5 était refusé par l'API).
  439. - Sur Opus 5.5, la réflexion ne peut pas être coupée : régler EFFORT=low.
  440. - Les tarifs utilisés pour le coût estimé dans les logs suivent le modèle
  441. choisi ; PRICE_INPUT_PER_MTOK et PRICE_OUTPUT_PER_MTOK ne sont plus à
  442. renseigner que pour un autre modèle (à vider dans le .env existant).
  443. - Messages transférés : dans le salon dédié, le bot lit le message transféré
  444. (son texte et son image).
  445. - Discussion entre bots : le bot répond aux autres bots quand ils le
  446. mentionnent ou répondent à l'un de ses messages ; le reste de ce qu'ils
  447. postent est toujours ignoré.
  448. - Messages regroupés : dans le salon dédié, les messages envoyés pendant que
  449. le bot répond ne reçoivent plus chacun leur réponse ; ils lui sont transmis
  450. ensemble (avec leurs images) et il y répond en une seule fois.
  451. Corrections
  452. - Les messages système (arrivée d'un membre, message épinglé, boost, fil
  453. créé…) et les messages sans rien à lire (sondages…) ne déclenchent plus de
  454. réponse payante de Claude.
  455. - /reset vidait mal la mémoire s'il était lancé pendant une réponse : l'échange
  456. en cours y était réécrit juste après. Le reset attend désormais la fin de la
  457. réponse avant de tout effacer.
  458. - Mentions moins chères : le contexte lu pour répondre à une mention n'est
  459. plus écrit dans le cache de prompt (surcoût de 25 %), puisqu'il change à
  460. chaque mention et n'y était jamais relu.
  461. - Mentions : l'image jointe à la mention elle-même est maintenant lue (seule
  462. celle du message cité l'était). Si les deux en ont une, c'est celle de la
  463. mention qui est envoyée à Claude.
  464. Version 5.3.0
  465. -------------
  466. Nouveautés
  467. - Accès à Internet (désactivé par défaut) : avec WEB_SEARCH=on dans le .env,
  468. le bot peut faire des recherches web et lire les liens partagés dans la
  469. conversation (outils web_search et web_fetch d'Anthropic).
  470. - Il ne cherche que si la question porte sur l'actualité ou une info qu'il
  471. ne connaît pas, et nomme sa source dans sa réponse (sans lien).
  472. - WEB_MAX_USES limite le nombre de recherches (et de pages lues) par message.
  473. - Seule la réponse finale est envoyée sur Discord, sans les commentaires
  474. écrits pendant les recherches.
  475. - Dans la mémoire, une mention indique au bot qu'il a réellement cherché,
  476. pour qu'il ne croie pas avoir inventé sa réponse au message suivant.
  477. - Avec la recherche activée, prévoir API_TIMEOUT=90.
  478. Améliorations
  479. - Cache de prompt : la personnalité, les outils et l'historique sont relus
  480. depuis le cache à 10 % du prix (pendant 5 minutes, prolongées à chaque
  481. message). Avec la recherche web activée, un message simple passe d'environ
  482. 0,015 $ à 0,002 $.
  483. - Le coût estimé dans les logs tient compte du cache (tokens lus et écrits)
  484. et des recherches web (PRICE_WEB_SEARCH_PER_1000).
  485. Version 5.2.0
  486. -------------
  487. Nouveautés
  488. - Fichiers texte : le bot lit un fichier .txt joint au message et en tient
  489. compte dans sa réponse.
  490. - Un fichier .txt par message (en plus d'une éventuelle image), 100 Ko maximum.
  491. - Fonctionne dans le salon dédié et en mode mention.
  492. - Encodage UTF-8 ou Windows (Bloc-notes) reconnu automatiquement.
  493. - Dans la mémoire, seul le nom du fichier est conservé, pas son contenu
  494. (comme pour les images), pour ne pas faire grimper le coût des messages
  495. suivants.
  496. - Personnalité perso : les fichiers *.local.txt sont exclus de GitHub
  497. (.gitignore). On peut y mettre une personnalité contenant des infos privées
  498. (ex. PERSONALITY_FILE=personality_prompt.local.txt dans le .env) ;
  499. personality_prompt.txt reste la personnalité par défaut publiée sur GitHub.
  500. Améliorations
  501. - Le bot n'utilise plus la fonction « Répondre » de Discord pour ses réponses :
  502. il écrit simplement à la suite dans le salon, comme un humain.
  503. - Les messages d'erreur (fichier non pris en charge, image en trop, etc.)
  504. restent en « Répondre », pour qu'on sache à qui ils s'adressent.
  505. Version 5.1.0
  506. -------------
  507. Nouveautés
  508. - Réponses aux messages : quand on utilise « Répondre » sur un message, même
  509. ancien, le bot lit le message cité et en tient compte dans sa réponse.
  510. - Si le message cité vient du bot, il sait qu'il s'agit de sa propre réponse.
  511. - Le texte cité est limité à 500 caractères.
  512. - Si le message cité contient une image, elle est aussi envoyée à Claude,
  513. sauf si la réponse contient déjà sa propre image (celle-ci est prioritaire).
  514. - Fonctionne dans le salon dédié et en mode mention.
  515. - En mode mention, le bot peut maintenant voir une image, celle du message cité.
  516. Améliorations
  517. - Le téléchargement et la préparation des images passent par une seule
  518. fonction, partagée entre le salon dédié et les messages cités.
  519. - Une image citée illisible ou trop lourde est simplement ignorée (avertissement
  520. dans bot.log) au lieu de bloquer la réponse.
  521. - La commande /reset est réservée aux modérateurs (permission « Gérer les
  522. messages ») et aux administrateurs du serveur.
  523. - Elle est masquée pour les autres membres et n'est plus disponible en
  524. messages privés.
  525. - Si un administrateur l'ouvre à tous dans les paramètres du serveur, le bot
  526. refuse quand même la commande (réponse visible uniquement par l'auteur) et
  527. note la tentative dans bot.log.
  528. Divers
  529. - discord.py 2.5 minimum est désormais requis (requirements.txt).
  530. - README : ajout de la fonctionnalité « Réponses ».
  531. - README : précision sur les droits nécessaires pour /reset.
  532. Version 5.0.0
  533. -------------
  534. Nouveautés
  535. - Passage de Mistral à Claude (Anthropic) pour générer les réponses.
  536. - Réécriture complète du Bot.
  537. Migration depuis la version 4 (Mistral)
  538. - L'ancien conversation_history.json est converti automatiquement au premier
  539. lancement (les images sont remplacées par un marqueur texte).
  540. - Dans le .env : MISTRAL_API_KEY devient ANTHROPIC_API_KEY, et MISTRAL_MODEL
  541. devient CLAUDE_MODEL.
  542. - L'intent Discord « Presence » n'est plus nécessaire.