<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TechTown</title>
    <description>The latest articles on DEV Community by TechTown (@techtown-fr).</description>
    <link>https://dev.to/techtown-fr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12453%2F5ee5dead-26ed-49a6-9f18-deabc299ff06.png</url>
      <title>DEV Community: TechTown</title>
      <link>https://dev.to/techtown-fr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techtown-fr"/>
    <language>en</language>
    <item>
      <title>🤖 Comment structurer la mémoire de vos agents avec Google ADK</title>
      <dc:creator>Benjamin Bourgeois</dc:creator>
      <pubDate>Fri, 03 Apr 2026 13:09:58 +0000</pubDate>
      <link>https://dev.to/techtown-fr/comment-structurer-la-memoire-de-vos-agents-avec-google-adk-2o58</link>
      <guid>https://dev.to/techtown-fr/comment-structurer-la-memoire-de-vos-agents-avec-google-adk-2o58</guid>
      <description>&lt;p&gt;Le plus gros défi avec les LLMs, c'est qu'ils sont fondamentalement « stateless ». Sans une couche de gestion de session et de mémoire, chaque requête est une page blanche. Pour un développeur, la difficulté est de savoir &lt;strong&gt;quoi stocker&lt;/strong&gt;, &lt;strong&gt;où le stocker&lt;/strong&gt; et &lt;strong&gt;combien de temps&lt;/strong&gt; le garder.&lt;/p&gt;

&lt;p&gt;Pour transformer un simple chatbot en un agent intelligent, il faut mettre en place une architecture de contexte. &lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;Agent Development Kit&lt;/a&gt; (ADK) de Google répond à ce besoin en structurant la persistance autour de trois piliers : la &lt;strong&gt;Session&lt;/strong&gt;, le &lt;strong&gt;State&lt;/strong&gt; et la &lt;strong&gt;Memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En maîtrisant ces concepts, vous permettez à votre agent d'apprendre de ses interactions et de devenir plus pertinent au fil du temps, tout en gérant intelligemment la fenêtre de contexte limitée des modèles.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ Architecture du contexte dans ADK
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🚦 Session, State et Memory
&lt;/h3&gt;

&lt;p&gt;Il est crucial de différencier ces trois piliers pour ne pas surcharger la mémoire de travail de l'agent :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;« &lt;strong&gt;Session&lt;/strong&gt; » : Le conteneur de la discussion actuelle (le « thread »). Elle contient la liste chronologique des événements.&lt;/li&gt;
&lt;li&gt;« &lt;strong&gt;State&lt;/strong&gt; » : Le « bloc-notes » temporaire. On y stocke des données de travail (ex: un panier d'achat) qui disparaissent ou s'archivent à la fin de la discussion.&lt;/li&gt;
&lt;li&gt;« &lt;strong&gt;Memory&lt;/strong&gt; » : La bibliothèque d'archives inter-sessions. Elle est consultable via une recherche sémantique pour ramener du contexte passé dans le présent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Mémoire court-terme vs long-terme
&lt;/h3&gt;

&lt;p&gt;Pour concevoir un agent performant, il faut séparer les flux comme le fait le cerveau humain :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Short-Term Memory (Sessions &amp;amp; State)&lt;/strong&gt; : Mémoire de travail active uniquement durant la conversation en cours . Elle sert à suivre la progression ou stocker des calculs intermédiaires. Une fois la session fermée, cette mémoire disparaît (ou est envoyée vers l'archivage).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-Term Memory (Memory Bank)&lt;/strong&gt; : Elle ne contient pas le texte brut, mais des faits consolidés (ex: « L'utilisateur préfère Python »). L'agent consulte cette archive au début de chaque nouvelle session pour ne pas repartir de zéro.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🔄 SessionService : Garantir la continuité
&lt;/h3&gt;

&lt;p&gt;L'objet &lt;strong&gt;Session&lt;/strong&gt; est le composant fondamental du suivi. Sans lui, chaque interaction repartirait de zéro.&lt;/p&gt;

&lt;p&gt;Une session se définit par plusieurs propriétés clés :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identification&lt;/strong&gt; : Elle lie un identifiant unique (&lt;code&gt;id&lt;/code&gt;), un nom d'application (&lt;code&gt;app_name&lt;/code&gt;) et un identifiant utilisateur (&lt;code&gt;userId&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historique&lt;/strong&gt; (&lt;code&gt;events&lt;/code&gt;) : Une séquence chronologique de tous les objets Event (messages utilisateur, réponses de l'agent, appels d'outils) survenue dans ce thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;État&lt;/strong&gt; (&lt;code&gt;state&lt;/code&gt;) : Un dictionnaire de données temporaires servant de « bloc-notes » à l'agent durant l'interaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suivi d'activité&lt;/strong&gt; (&lt;code&gt;lastUpdateTime&lt;/code&gt;) : Un horodatage indiquant la dernière interaction dans la session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10q8tlghfqpf3109g77s.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10q8tlghfqpf3109g77s.webp" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le choix du service dépend de votre besoin de persistance et de contrôle :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Persistance&lt;/th&gt;
&lt;th&gt;Usage recommandé&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;InMemorySessionService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nulle&lt;/td&gt;
&lt;td&gt;Développement local et tests unitaires.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VertexAiSessionService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Élevée&lt;/td&gt;
&lt;td&gt;Production managée sur Google Cloud.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DatabaseSessionService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Élevée&lt;/td&gt;
&lt;td&gt;Contrôle total sur votre propre base (PostgreSQL, SQLite).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Le Rewind : Annuler et corriger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le Rewind permet de faire revenir une session à un état précédent via un &lt;code&gt;invocation_id&lt;/code&gt;. Cela restaure le &lt;strong&gt;State&lt;/strong&gt; tel qu'il était avant une erreur de l'agent, permettant de repartir sur une base saine sans perdre tout l'historique.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📝 State : Le bloc-notes dynamique de l'agent
&lt;/h3&gt;

&lt;p&gt;Dans ADK, l'attribut state d'une session est un dictionnaire clé-valeur servant de mémoire de travail. Contrairement à l'historique complet des événements, il stocke des détails structurés nécessaires au tour de conversation actuel (ex: statut d'authentification, étape d'un formulaire).&lt;/p&gt;

&lt;h4&gt;
  
  
  💡 Gestion de la portée via les préfixes
&lt;/h4&gt;

&lt;p&gt;ADK utilise des &lt;strong&gt;préfixes&lt;/strong&gt; pour définir automatiquement la visibilité et la durée de vie des données:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Préfixe&lt;/th&gt;
&lt;th&gt;Portée (Scope)&lt;/th&gt;
&lt;th&gt;Persistance&lt;/th&gt;
&lt;th&gt;Cas d'usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aucun&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Session actuelle&lt;/td&gt;
&lt;td&gt;Liée au service de session&lt;/td&gt;
&lt;td&gt;Étape d'un tunnel d'achat.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;user:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identité utilisateur&lt;/td&gt;
&lt;td&gt;Partagée entre toutes ses sessions&lt;/td&gt;
&lt;td&gt;Préférences, nom.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;app:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Application globale&lt;/td&gt;
&lt;td&gt;Partagée entre tous les utilisateurs&lt;/td&gt;
&lt;td&gt;Version API, code promo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;temp:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Invocation en cours&lt;/td&gt;
&lt;td&gt;Éphémère (effacée après la réponse)&lt;/td&gt;
&lt;td&gt;Calculs intermédiaires.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemple d'utilisation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The ADK automatically replaces {user:name} with the value found in state
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Greet the user by saying: Hello {user:name}!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Updating state within a tool safely
&lt;/span&gt;&lt;span class="nd"&gt;@adk.tool&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_preference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;adk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToolContext&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user:fav_color&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="c1"&gt;# Captured and persisted automatically
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Preference saved.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧠 MemoryService : Choisir son moteur de connaissances
&lt;/h3&gt;

&lt;p&gt;Dans ADK, le &lt;strong&gt;MemoryService&lt;/strong&gt; est l'interface qui gère l'archivage et la récupération des connaissances à long terme. Sa mission est double : ingérer les informations pertinentes d'une session terminée (&lt;code&gt;add_session_to_memory&lt;/code&gt;) et permettre à l'agent de les retrouver via une recherche (&lt;code&gt;search_memory&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Il existe deux implémentations principales selon vos besoins en persistance et en intelligence :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caractéristique&lt;/th&gt;
&lt;th&gt;InMemoryMemoryService&lt;/th&gt;
&lt;th&gt;VertexAiMemoryBankService&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nulle (perdue au redémarrage)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Élevée&lt;/strong&gt; (Managée par Vertex AI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stocke l'historique brut&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Intelligente&lt;/strong&gt; (extraite et consolidée par LLM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type de recherche&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mots-clés basiques&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Sémantique avancée&lt;/strong&gt; (Embeddings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usage idéal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prototypage et tests rapides&lt;/td&gt;
&lt;td&gt;Production et apprentissage continu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🚀 Le workflow complet&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pour bien comprendre comment ces composants interagissent, voici le cycle de vie d'une information, de sa captation à sa réutilisation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interaction&lt;/strong&gt; : L'utilisateur échange avec l'agent via une &lt;strong&gt;Session&lt;/strong&gt;. Chaque message et action est enregistré comme un &lt;strong&gt;Event&lt;/strong&gt;, et le &lt;strong&gt;State&lt;/strong&gt; gère les données de travail immédiates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archivage&lt;/strong&gt; : Lorsqu'une session est jugée riche en informations, l'application appelle &lt;code&gt;add_session_to_memory(session)&lt;/code&gt;. Le système extrait les faits marquants de l'historique et les consolide dans le &lt;code&gt;MemoryService&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mémoire&lt;/strong&gt; : Dans une session future, l'agent utilise un outil dédié (&lt;code&gt;LoadMemoryTool&lt;/code&gt; ou &lt;code&gt;PreloadMemoryTool&lt;/code&gt;) s'il détecte un besoin de contexte passé.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recherche Sémantique&lt;/strong&gt; : L'outil interroge le service de mémoire (&lt;code&gt;search_memory&lt;/code&gt;). S'il s'agit de la Memory Bank, une recherche par similarité vectorielle est effectuée pour trouver les souvenirs les plus proches du sens de la requête.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restitution &amp;amp; Réponse&lt;/strong&gt; : Le service renvoie les souvenirs pertinents (&lt;code&gt;MemoryResult&lt;/code&gt;). L'agent les intègre alors dans ses instructions système pour formuler une réponse personnalisée et historiquement cohérente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🤖 Vers une IA qui apprend vraiment
&lt;/h2&gt;

&lt;p&gt;En maîtrisant ce trio, &lt;strong&gt;Session&lt;/strong&gt;, &lt;strong&gt;State&lt;/strong&gt; et &lt;strong&gt;Memory&lt;/strong&gt;, vous sortez enfin du mode "stateless" des LLM. Cette architecture, propulsée par ADK et Google Cloud, garantit que vos agents ne se contentent pas de répondre, mais s'adaptent et valorisent chaque interaction sur le long terme.&lt;/p&gt;

</description>
      <category>adk</category>
      <category>googlecloud</category>
      <category>vertexai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
