Das Archiv – Memory im Agent Valley

1. Einführung

Vesper, die Archivarin, am Schreibtisch im Erdgeschoss

In der ersten Woche ging es darum, wer sagt, was läuft. In Woche 2 ging es darum, wer entscheidet, was als Nächstes läuft. In Woche 3 ging es darum, was ein Lauf hinterlässt. Diese Woche endet das Gespräch und die Frage ist, was davon übrig bleibt. Es stellt sich heraus, dass die Art der Sache darüber entscheidet, wohin sie geht.

Das Archiv ist der Ort, an dem das Tal beginnt, wenn etwas schiefgelaufen ist. Ein Turm, in dem alles aufgeschrieben wird, und Vesper, die Archivarin, am Schreibtisch im Erdgeschoss. Deine Laterne geht nachts aus. Du gehst hin und fragst.

Sie ist eine angenehme Gesellschaft. Einen Monat später freut sie sich, Sie kennenzulernen.

Eine Aufnahme ist keine Erinnerung.

Dieser Satz ist das gesamte Lab. Sie durchlaufen vier Stufen, wobei jede Stufe ein Stockwerk des Turms darstellt:

rung

Boden

Was sich Gemini merkt

Was hält es

1

den Schreibtisch und den Boden

diesen Besuch

session.state · SqliteSessionService

2

zweite Etage, deine Schublade

diesen Besucher

Das Präfix user:

3

3. Etage, Turm

Was wurde gesagt?

Vertex AI Memory Bank

4

Vierte Etage, die Jahreszeit

das ganze Tal

BigQuery

Jede Stufe ist das Ergebnis eines Problems auf der Stufe darunter.

Das Archiv, aufgeschnitten – fünf Etagen, und eine kleine Crew, die jede davon

Sie kennen die fünf Arten des Vergessens des Archivars bereits, da sie Ihnen alle schon in einem Supportanruf passiert sind:

was sie sagt

Was ist schiefgelaufen?

~~1~~

~~Could you give me that reference again?~~

~~in einem Gespräch vergessen~~ – in Woche 3 behoben

~~2~~

~~Ich habe dich weitergeleitet. Bitte fange von vorn an.~~

~~Der Verlauf ist mit dem Prozess verschwunden.~~ – In Woche 3 wurde auch dieses Problem behoben.

3

Was kann ich für Sie tun?

an jemanden mit einem offenen Fall aus dem letzten Monat

4

Können Sie den Schaden beschreiben?

Sie hat sich die Laterne zuletzt angesehen.

5

Das haben wir noch nie gesehen.

31 Personen haben in dieser Staffel gefragt

Zeile 3 bezieht sich auf diese Woche. Es gibt drei verschiedene Fehlerarten: ein neuer Besuch (Kapitel 2), ein Satz ohne Zeile auf dem Beleg (Kapitel 3) und ein Archiv, das nur innerhalb des Prozesses existiert (Kapitel 4). Jede Fehlerart ist ein Kapitel. Die vierte Zeile ist Ihnen überlassen: look() in archive/agent.py ist der Ort, an dem sie eine Markierung auf einem Foto vorliest. Zeile 5 ist Kapitel 5 und optional.

Sie benötigen die Wochen 1 bis 3 nicht. Ein Agent ist ein Modell mit einer Anweisung und einigen Tools. Alles andere erklärt sich diese Woche von selbst.

Sie schreiben drei Zeilen, die jeweils ein Erinnerungskonzept enthalten:

die Linie

Beschreibung

tool_context.state[CASE] = case

Der Status wird vom Code festgelegt, nicht von der Unterhaltung.

CASE = "user:case"

Ein Präfix ist ein Leben lang

found = await ctx.search_memory(query)

Die Rückrufrichtlinie – eingereicht wird nicht gespeichert

Eine weitere Zeile ist bereits vorhanden – die Schreibrichtlinie await ctx.add_events_to_memory(...) – und in Kapitel 3 erfahren Sie, was sie tut, bevor Sie die Zeile schreiben, in der sie verwendet wird.

Die anderen beiden Stufen sind überhaupt keine Bearbeitungen: Sie bauen einen Turm (eine Agent Engine, die Memory Bank hostet) und derselbe Code stellt von selbst eine Verbindung zu ihr her. Außerdem laden Sie ein Data Warehouse (BigQuery), legen einen Graphen darüber und übergeben demselben Agenten zwei kontrollierte Anfragen – eine nach Bedeutung und eine nach Verbindung.

In jedem Kapitel wird derselbe Ablauf durchlaufen, den Sie auch für Ihre eigenen Agents verwenden: Code lesen → Zeile schreiben → im Tower ansehen. Es wird nichts zuerst unterbrochen, nichts wird neu gestartet und nichts wird mit Strg+C beendet: Jede Änderung wird in der nächsten Nachricht berücksichtigt und die Verbindung zum Turm ist eine Zeile in einer Datei, die das Archiv bei jeder Anfrage neu liest. Der Turm ist eine Zeichnung, die neu gezeichnet wird: Sie liest dieselben Dateien, die Sie bearbeiten, und hat drei Schaltflächen: 🌙 beendet den Tag, 🗓 startet den nächsten Besuch, 🔥 vergisst Sie. Alles andere erledigen Sie im Code und im Terminal.

Zwei Orte, und sie wechseln nie den Job: Tab 1 ist das Terminal, Tab 2 ist das Archiv. Die Workbench (adk web) wird genau einmal in Kapitel 1 angezeigt, um den Rohsitzungsstatus zu sehen. Danach ist sie nicht mehr erforderlich. Bei jedem 👉 unten wird angegeben, welche. 👉💻 ist Tab 1, 👉🖥 ist Tab 2 und 👉🔬 ist die Workbench. 👉📖 ist eine Datei öffnen und lesen – hier muss nichts geändert werden – und 👉✏️ ist die einzige Art von Schritt, bei der etwas bearbeitet wird. Wenn Sie in einem Schritt aufgefordert werden, etwas zu Vesper zu sagen, finden Sie die genaue Nachricht im Block direkt darunter. Kopieren Sie sie so, wie sie ist. In einem Abschnitt, dessen Überschrift mit – nur lesen endet, müssen Sie nichts eingeben, einfügen oder anklicken: Der Code darin ist bereits im Repository und wird bereits ausgeführt. Er wird nur angezeigt, damit Sie ihn lesen können.

Der Satz über Vespers Tür ist der oben. Der Satz, mit dem diese Woche endet, ist die Schlusszeile der vierten Woche der gesamten Staffel:

Fakten und Einstellungen gehören in unterschiedliche Stores.

2. 🧰 Einrichtung

  • Was: Zeigen Sie auf ein Projekt oder fügen Sie einen Schlüssel ein, installieren Sie die Toolchain und weisen Sie nach, dass sie grün ist.
  • Warum: Hier wird nichts gebootet. Jeder Server wird kurz vor dem Schritt gestartet, für den er benötigt wird. Wenn also ein Bildschirm geöffnet wird, wissen Sie, welcher Befehl dafür verantwortlich ist.
  • Vorgehensweise: Ein Skript zum Erstellen des Projekts, eines zum Installieren und Verweisen auf Vertex AI und eines für den Preflight, das Ihren Code liest und Ihnen sagt, wo Sie sich befinden.

Alles in diesem Lab wird in der Cloud Shell ausgeführt. Python, uv und gcloud sind dort bereits installiert und Gemini wird über Vertex AI mit Ihren eigenen Anmeldedaten aufgerufen. In diesem Lab gibt es keinen API-Schlüssel und es muss nichts auf Ihrem Laptop installiert werden.

Eines kann Ihnen in diesem Lab nicht zur Verfügung gestellt werden: ein Google Cloud-Projekt mit aktivierter Abrechnung. In Schritt 1 erhalten Sie ein Konto, mit dem Sie bezahlen können. In Schritt 4 wird dieses Konto in ein Projekt umgewandelt oder das Projekt „Agent Valley“ verwendet, das Sie bereits in Woche 1, 2 oder 3 erstellt haben. Führen Sie die Schritte in dieser Reihenfolge aus. Bei jedem Schritt nach Schritt 4 wird das Projekt gelesen, das in Schritt 4 festgelegt wurde.

1. Konto mit Abrechnung erstellen (~1 Minute)

🌐 Führen Sie diese Schritte zuerst aus. Melden Sie sich mit einem Google-Konto an, für das die Abrechnung aktiviert ist. Jedes solche Konto funktioniert. Wenn Sie noch keines haben, können Sie ein kostenloses Probeabo starten. Damit erhalten Sie ein Rechnungskonto, das für Schritt 4 erforderlich ist.

2. Cloud Shell öffnen (ca. 1 Minute)

🌐 Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren. Das Symbol in der Kopfzeile sieht aus wie ein Terminal.

Cloud Shell über die Kopfzeile der Google Cloud Console aktivieren

🌐 Klicken Sie auf Editor öffnen (das Symbol mit einem geöffneten Ordner und einem Stift). Dadurch wird der Cloud Shell-Editor mit einem Datei-Explorer auf der linken Seite geöffnet. Dort arbeiten Sie immer, wenn ein Schritt mit 👉✏️ gekennzeichnet ist.

Cloud Shell-Editor öffnen

🌐 Wenn Sie heute an irgendeinem Punkt zur Autorisierung aufgefordert werden, klicken Sie auf Autorisieren, um fortzufahren.

🌐 Öffnen Sie ein Terminal im Editor – das ist Tab 1. Alle 👉💻-Schritte werden dort ausgeführt, sofern nicht anders angegeben. Tab 2 ist das Archiv. Sie öffnen es in Kapitel 1, direkt vor dem Schritt, in dem es benötigt wird. Wenn das Terminal noch nicht am unteren Bildschirmrand angezeigt wird, öffnen Sie es über Ansicht → Terminal:

Neues Terminal im Cloud Shell-Editor öffnen

🌐 Prüfen Sie, mit welchem Konto Sie angemeldet sind. Es sollte das Konto aus Schritt 1 sein:

gcloud auth list

3. Lab aufrufen (ca. 1 Minute)

💻 Klonen Sie das Repository. Es handelt sich um das Archiv-Repository, nicht um das Repository für Woche 1, Woche 2 oder Woche 3:

cd ~
git clone https://github.com/cuppibla/agent-valley-archive
cd agent-valley-archive

4. Projekt erstellen oder ein Projekt aus einer früheren Woche wiederverwenden (~2 Minuten)

💻 Ein Skript sucht Ihr Rechnungskonto, erstellt ein Projekt dafür und verweist Cloud Shell auf dieses Projekt. Wenn Sie Woche 1, Woche 2 oder Woche 3 abgeschlossen haben, wird das Projekt „Agent Valley“ zuerst gefunden und Sie werden gefragt, ob Sie es wiederverwenden möchten. Wenn Sie mit „Ja“ antworten, müssen Sie sich keine Gedanken über ein zweites abrechenbares Projekt machen:

cd ~/agent-valley-archive
./setup_project.sh

👀 Erwarte eine ✓ für das ausgewählte Rechnungskonto, eine ✓ für das erstellte oder wiederverwendete Projekt und einen Abschluss wie:

cd ~/agent-valley-archive
Project ready: agent-valley-4271
  Next:  ./setup_codelab.sh

agent-valley-4271 ist Ihre Projekt-ID. Ihre ID hat andere Ziffern. Dabei passieren vier Dinge:

billing

das neueste [YYYY-MM-DD] GDP Credit:-Konto, falls vorhanden, und ansonsten ein beliebiges anderes offenes Rechnungskonto verwendet.

project

sucht nach einem Agent Valley-Projekt, das Sie bereits besitzen (aus Woche 1, Woche 2 oder Woche 3), und bietet an, es wiederzuverwenden. Andernfalls wird agent-valley-XXXX erstellt und das Rechnungskonto damit verknüpft.

Auswahlen

schreibt die ID in ~/project_id.txt und führt gcloud config set project aus. Sie werden also nicht mehr aufgefordert, sie einzugeben.

Wartezeiten

bis zu zwei Minuten lang abfragt, ob das Projekt ausgeliefert werden darf.

🌐 Dasselbe Projekt ist jetzt in der Console verfügbar. Die ID befindet sich auf der Karte Projektinformationen im Dashboard:

Ihre Projekt-ID im Console-Dashboard

5. Installation und Verweis auf Vertex AI (ca. 3 Minuten)

💻 Installieren Sie uv, exportieren Sie die drei Variablen, die ADK an Vertex AI senden, und führen Sie die Einrichtung aus:

cd ~/agent-valley-archive
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.local/bin/env
export GOOGLE_GENAI_USE_VERTEXAI=TRUE
export GOOGLE_CLOUD_PROJECT=$(gcloud config get project)
export GOOGLE_CLOUD_LOCATION=global
./setup_codelab.sh

$(gcloud config get project) hat etwas zurückzugeben, da es in Schritt 4 festgelegt wurde. Das ist der Grund, warum Schritt 4 zuerst kommt.

setup_codelab.sh ist idempotent und kann beliebig oft ausgeführt werden. Dabei werden fünf Schritte in der folgenden Reihenfolge ausgeführt:

api

liest das in Schritt 4 ausgewählte Projekt und aktiviert aiplatform.googleapis.com (Vertex AI und die Agent Engine, auf der Memory Bank gehostet wird) und bigquery.googleapis.com (das Lager aus Kapitel 5) darauf.

uv env

uv venv erstellt .venv oder verwendet das bereits vorhandene. Dann installiert uv sync genau das, was uv.lock anpinnen – google-adk, google-genai und alles darunter.

site

wird npm ci in site/ ausgeführt – das Archiv selbst ist eine Next.js-App –, sodass in Kapitel 1 nichts mehr heruntergeladen werden muss. Der Schritt wird übersprungen, wenn die Pakete bereits vorhanden sind.bash valley.sh

.env

schreibt die Variablen, die im Lab gelesen werden – GOOGLE_GENAI_USE_VERTEXAI, GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION, MEMORY_BANK_LOCATION und BQ_DATASET – und nirgends einen API-Schlüssel.

Modellprüfung

Es wird ein echter Aufruf an Gemini ausgeführt. Ein fehlerhaftes Projekt schlägt also schon bei der Einrichtung fehl und nicht erst später in einem Kapitel.

6. Nachweis, dass es sich um ein grünes Produkt handelt (~1 Minute)

💻 Preflight ausführen – jeder Haken steht für eine tatsächliche Prüfung, nicht für eine Schätzung:

cd ~/agent-valley-archive
uv run python scripts/preflight.py

👀 Beim Preflight wird dem Modell eine Frage gestellt, um zu prüfen, ob Ihre Anmeldedaten funktionieren. Außerdem wird geprüft, ob die Pakete des Archivs vorhanden sind. Anschließend wird Ihr Code gelesen und die Fortschrittsanzeige für diese Woche ausgegeben:

cd ~/agent-valley-archive
  desk      ▢ the slip      · write_down writes nothing         chapter 1 · EDIT ONE
  floor 1   ✓ the file      · SqliteSessionService              chapter 1, read only
  floor 2   ▢ the drawer    · CASE = "case"                     chapter 2 · EDIT TWO
  floor 3   ✓ what was said · closing time files the day        chapter 3, read only
  floor 3   ▢ the asking    · recall never looks                chapter 3 · EDIT THREE
  floor 3   ▢ the tower     · InMemoryMemoryService             chapter 4 · built, not edited
  floor 3   ✓ the rules     · USER_PREFERENCES, LANTERN_CONTEXT chapter 4, read only

Drei sind bereits angekreuzt. Das sind die, die Sie nur lesen. Drei sind Zeilen, die Sie schreiben, eine ist ein Turm, den Sie bauen. Sie können den Preflight jederzeit im Lab noch einmal ausführen. Er zeigt Ihnen dann, wo Sie sich gerade befinden. Dazu werden Ihre Dateien gelesen, nicht eine Checkliste.

3. Sitzung, Status, SqliteSessionService

  • Was: Schreiben Sie eine Zeile. Starten Sie die Werkbank einmal und sehen Sie zu, wie sich der Zettel ausfüllt. Wiederholen Sie das Ganze dann im Turm und lesen Sie, warum der Zettel die Nacht übersteht.
  • Warum: Zuerst einmal ist es wichtig zu wissen, dass nichts von allein gespeichert wird. Jemand schreibt es.
  • Wie: eine Zeile in agent.py, sonst nichts ändern.

BEARBEITEN

👉📖 Öffnen Sie archive/agent.py und suchen Sie nach write_down. Lesen Sie bis zum 👉:

    case = dict(tool_context.state.get(CASE, {}))
    if case.get(field):
        return {"already_written": {field: case[field]}}
    case[field] = value
    # 👉 EDIT ONE — chapter 1. She heard you. Nothing was written. Delete the
    #    "# " in front of the next line, then save — the slip is session state,
    #    and state is written by code, never by the conversation:
    # tool_context.state[CASE] = case
    return {"written": {field: value}}

Die Funktion erstellt den Beleg in einem lokalen Dictionary und gibt ihn dann zurück. Ein lokales Dictionary wird mit dem Aufruf beendet. Wenn Sie diesen Code so ausführen, hört Vesper Sie perfekt: Es werden vier write_down-Anrufe ausgelöst, jeder antwortet mit "written" und der Sitzungsstatus bleibt leer, da nichts ihn erreicht hat. Sie hat dich gehört. Es wurde nichts geschrieben.

👉✏️ Löschen Sie in archive/agent.py innerhalb von write_down das # vor einer Zeile – das # und das Leerzeichen danach. Vorher:

    case[field] = value
    # 👉 EDIT ONE — chapter 1. She heard you. Nothing was written. Delete the
    #    "# " in front of the next line, then save — the slip is session state,
    #    and state is written by code, never by the conversation:
    # tool_context.state[CASE] = case
    return {"written": {field: value}}

Nachher

    case[field] = value
    # 👉 EDIT ONE — chapter 1. She heard you. Nothing was written. Delete the
    #    "# " in front of the next line, then save — the slip is session state,
    #    and state is written by code, never by the conversation:
    tool_context.state[CASE] = case
    return {"written": {field: value}}

Speichern.

Der Schein wird ausgefüllt

👉💻 Starten Sie die Workbench. Dies ist das einzige Mal im Lab, dass Sie es öffnen – es ist das einzige Fenster, in dem der Sitzungsstatus als das rohe JSON angezeigt wird, das er ist:

cd ~/agent-valley-archive
uv run adk web . --allow_origins="*"

👉🔬 Öffnen Sie die Workbench mit Webvorschau → Vorschau auf Port 8000. Der Button „Webvorschau“ ist das Symbol mit dem Auge über einem Fenster rechts oben in Cloud Shell. Wählen Sie Archiv aus und klicken Sie im linken Bereich auf Status, bevor Sie etwas eingeben.

👀 Leer Noch hat niemand etwas gesagt.

👉🔬 Fasse nun alles in einer Nachricht zusammen:

Hi! My lantern keeps going out at night. My case number is k7f2, and there's a little q7 stamped on the base.

👀 Vier write_down-Chips werden ausgelöst – klicken Sie auf einen und lesen Sie das JSON: "written": {"no": "k7f2"}. Klicken Sie noch einmal auf Bundesstaat.

Vier Dinge, vier Felder, eine Nachricht

case   {"no": "k7f2", "item": "lantern", "mark": "q7",
        "symptom": "keeps going out at night"}

👀 Erst leer, dann voll – alles in einer Nachricht. Das ist es, woran sie sich erinnert, und es ist nicht von selbst aufgetaucht. Sie haben die Zeile geschrieben, in der das passiert. Das ist der ganze Mechanismus: eine einfache Funktion, die in tool_context.state schreibt, und eine Anweisung, die ihr sagt, dass sie sie verwenden soll, wenn der Besucher etwas sagt, das zu einer Zeile auf dem Zettel passt.

👉🔬 Frage sie:

What's my case number?

👀 k7f2. Sie liest es vom Zettel ab. Ohne EDIT ONE hätte sie Sie danach gefragt – in Zeile 1 der Supportliste in einer Unterhaltung.

Die beiden Guards sind der Zettel als Papierformular: vier kurze Zeilen, die jeweils einmal geschrieben wurden. Sie sind wichtiger, als es den Anschein hat. Ohne sie stellt das Modell fest, dass es die gesamte Unterhaltung in symptom einfügen kann, und Kapitel 3 – das Kapitel, in dem es darum geht, dass auf dem Zettel keine Zeile dafür ist – ist nicht mehr zutreffend. Die Form eines Speichers wird durch den Code, der ihn schreibt, erzwungen oder nicht.

Geh jetzt zum Turm.

👉💻 Sie haben die Workbench abgeschlossen. Sie können sie weiterlaufen lassen oder den Tab schließen. Der Rest des Labs wird im Archiv ausgeführt. Öffnen Sie einen zweiten Terminaltab (Tab 2 – das Archiv):

cd ~/agent-valley-archive
bash valley.sh

👉🖥 Öffnen Sie das Archiv mit Webvorschau → Port ändern, geben Sie 3440 ein und klicken Sie auf Ändern und Vorschau. 3440 ist nicht in der Schnellliste der Webvorschau enthalten – 8080 ist der Standardport –, daher müssen Sie ihn einmal manuell festlegen. Drücken Sie auf ▶ Start und dann auf Das Archiv. Sie stehen vor der Tür. Wähle aus, wer angeklopft hat – ein Name und eine Spezies – und gehe hinein.

Der Turm, aufgeschnitten

👀 Ein Gebäude. Vesper sitzt am Schreibtisch im Erdgeschoss. Dort unterhalten Sie sich. Über ihr: das erste, zweite und dritte Stockwerk und ein dunkler Dachboden. Die vier Sprossen sind die vier Etagen. Dein Vertrauter sitzt im Erdgeschoss, weil du nicht höher gestiegen bist. In der Spalte neben der Zeichnung wird beschrieben, was sich derzeit auf jeder Etage befindet – dieselben vier Geschäfte wie in der Tabelle in der Einleitung, in derselben Reihenfolge. Rechts befindet sich keine Schaltfläche.

👉🖥 Fügen Sie genau diese Nachricht in das Feld unter der Unterhaltung ein und drücken Sie die Eingabetaste:

Hi! My lantern keeps going out at night. My case number is k7f2, and there's a little q7 stamped on the base.

Vier Zeilen auf dem Schreibtisch und dieselben vier daneben

👀 Behalte den Schreibtisch im Blick. Der Zettel schreibt sich selbst, Zeile für Zeile – auf der Zeichnung und daneben unter Der Zettel. Gleiches Tool, gleicher Status: Der Turm zeichnet nur, was write_down geschrieben hat, und wird das für den Rest des Labs auch weiterhin tun.

Sie erinnert sich über Nacht – Lesezugriff

Was Sie geschrieben haben und was es ist

die Linie

Was ist das?

wo sie sich befindet

tool_context.state[CASE] = case

Sitzungsstatus – wird von Code geschrieben, von der Anleitung gelesen

der Schreibtisch · session.state

SqliteSessionService(DB): Sie lesen die Nachricht nur.

der Sitzungsspeicher – ein Besuch in einer Datei, nicht in einem Prozess

1. Etage · archive.db

Diese Stufe erreicht einen Besuch und überdauert die Schließzeit. Sie wird beim nächsten Besuch nicht beibehalten.

4. Bundesstaat des Nutzers

  • Was: Kommen Sie einen Monat später wieder. Der Lieferschein ist nicht mehr da. Fünf Zeichen, die dir folgen.
  • Warum? Eine Sitzung entspricht einem Besuch. Der nächste Besuch ist eine neue Sitzung und hat die letzte Sitzung nie gesehen.
  • Wie: fünf Zeichen in state.py.

Einen Monat später. Schön, Sie kennenzulernen.

Hier drücken

👉 🖥 Klicken Sie einen Monat später auf 🗓. Das ist eine neue Sitzung für denselben Besucher – so wie Neue Unterhaltung starten in Woche 3.

Willkommen im Archiv. Was kann ich für Sie tun?

👉🖥 Sieh dir den Turm an. Auf der ersten Etage befindet sich bei diesem Besuch ein weiteres Buch. Die Schublade im zweiten Stock ist leer. Der Zettel auf dem Schreibtisch ist leer.

Ein weiteres Buch im ersten Stock; die Schublade leer; der Zettel leer

👀 Grund: Der Schlupf wird in den Sitzungsstatus geschrieben und eine Sitzung ist dieser Besuch. Besuche und Sitzungen ändern Es wurde nichts übertragen, da nichts gesagt wurde. Der letzte Besuch ist noch in der Datei – das ist das erste Buch von Etage 1 –, aber der Zettel wurde unter einem Schlüssel geschrieben, der nur für einen Besuch gilt.

BEARBEITEN 2

👉✏️ Öffnen Sie archive/state.py. Suchen Sie nach dem 👉. Vorher:

# 👉 EDIT TWO — chapter 2. Five characters. A key with no prefix lives for one
#    visit; `user:` follows the visitor into every visit after this.
CASE = "case"

Nachher

CASE = "user:case"

Speichern. Kein Neustart: Das Archiv importiert Ihren Code bei jeder Nachricht neu.

👉🖥 Fügen Sie die vier Elemente noch einmal ein – genau diese Nachricht:

Hi! My lantern keeps going out at night. My case number is k7f2, and there's a little q7 stamped on the base.

👉🖥 Drücke dann noch einmal 🗓 einen Monat später – dieselbe Taste wie zuvor.

Die Schublade mit einem Namen darauf

👀 In der Schublade im zweiten Stock steht dein Name und die vier Felder sind darin. Der Zettel auf dem Schreibtisch besteht aus denselben vier Zeilen, die du aus der Schublade gezogen hast, als du reingekommen bist. Dein Vertrauter ist eine Etage höher gezogen. Derselbe Schlüssel, jeder Besuch, ein Wert: Das ist die Aufgabe des Präfixes.

Das Präfix ist eine Lebensdauer.

Präfix

wie lange es lebt

Welche Etage

(keine)

diesem Besuch

der Schreibtisch

user:

bei jedem Besuch dieses Nutzers

zweite Etage, deine Schublade

app:

für alle, für immer

Teil des vierten Stockwerks

temp:

in dieser Runde nur – steigt nicht einmal die Treppe hinauf

–

Ein Tisch, vier Schubladen. In diesem Kapitel geht es um einen davon.

Sie kennt dich jetzt

👉🖥 Dieser Besuch ist ganz neu und Sie haben noch nichts gesagt. Fragen Sie sie:

What did I bring in last time?

👀 Ich habe hier notiert, dass du eine Laterne mitgebracht hast, Fall k7f2. Es ist mit q7 gekennzeichnet und du hast erwähnt, dass es nachts immer wieder ausgeht. Jedes Wort davon kam aus der Schublade, nicht aus dem Gespräch – dieser Besuch ist eine Nachricht alt und in der Nachricht wurde nichts genannt. Das ist der Nutzerstatus in Aktion: Ein user:-Schlüssel ist vor dem ersten Wort des Besuchers bei jedem Besuch vorhanden.

Die Schublade enthält die vier Zeilen des Belegs und nichts anderes. Was Sie sagen, was nicht auf dem Zettel steht – was Sie versucht haben, warum es Ihnen wichtig ist, ob Sie ein neues Gerät möchten – wird nicht erfasst und ist einen Monat später vergessen. Der Schubladeninhalt erstreckt sich über den Monatswechsel. Ein Satz nicht. Darum geht es in Kapitel 3.

Was Sie geschrieben haben und was es ist

die Linie

Was ist das?

wo sie sich befindet

CASE = "user:case"

Ein Präfix ist ein Lifetime-Schlüssel, der auf den Besucher statt auf den Besuch beschränkt ist.

zweite Etage · user:-Status

Diese Stufe erreicht einen Besucher. Die Seitenleiste folgt Ihnen, die Unterhaltung jedoch nicht.

5. InMemoryMemoryService

  • Was: Lies die Zeile vor, in der der Tag eingeordnet wird, schreibe die Zeile, in der gefragt wird, dann eine Schlusszeit und eine Frage.
  • Warum: Der Beleg ist ein Formular. Ein Formular enthält die von Ihnen angegebenen Zeilen. Menschen sprechen nicht in Zeilen – und das, was sie gesagt haben, zu dokumentieren, ist nur die halbe Miete.
  • Wie: Lies file vor; eine Zeile in recall; dann ein 🌙, ein 🗓 und eine Frage.

Geschäftsschluss Sie geht an den Regalen vorbei zurück.

Was sie auf dem Heimweg macht – nur lesen

Eingabe wird nicht gespeichert

Damit ist der Tag abgehakt. Es wird nichts abgezogen. Ein Regal voller Karten hilft genauso viel wie ein leeres, wenn niemand hinsieht – und wenn der Code ausgeliefert wird, sieht niemand hin: recall, der Knoten, der vor Vesper bei jeder Frage ausgeführt wird, fragt den Tower nichts. Informationen, an die Sie sich im richtigen Moment nicht erinnern können, sind kein Gedächtnis, sondern ein Protokoll. Die andere Hälfte ist das Suchen, und das ist Ihre Aufgabe.

DRITTER SCHNITT – Die Frage

👉📖 Suchen Sie in archive/agent.py nach recall, der Funktion direkt über file. Es handelt sich um einen einfachen Funktionsknoten, der vor Vesper bei jeder Frage ausgeführt wird. Das Modell entscheidet also nicht, wann es suchen soll. Das bedeutet, dass auch die Fälle sichtbar sind, in denen nichts gefunden wird. Lesen Sie bis zum 👉:

    if query.strip():
        try:
            # 👉 EDIT THREE — chapter 3. Filed is not remembered: the cards are on
            #    the shelf and nobody is looking at them. Delete the "# " in front
            #    of the next line, then save:
            # found = await ctx.search_memory(query)
            pass
        except ValueError:
            # no memory service wired on this runner — degrade, do not crash
            pass

👉✏️ Löschen Sie in archive/agent.py innerhalb von recall das # vor einer Zeile – das # und das Leerzeichen danach. Vorher:

        try:
            # 👉 EDIT THREE — chapter 3. Filed is not remembered: the cards are on
            #    the shelf and nobody is looking at them. Delete the "# " in front
            #    of the next line, then save:
            # found = await ctx.search_memory(query)
            pass
        except ValueError:

Nachher

        try:
            # 👉 EDIT THREE — chapter 3. Filed is not remembered: the cards are on
            #    the shelf and nobody is looking at them. Delete the "# " in front
            #    of the next line, then save:
            found = await ctx.search_memory(query)
            pass
        except ValueError:

Lassen Sie pass an der aktuellen Position. Es hat keine Auswirkungen, da found bereits None höher ist.

Speichern. Kein Neustart.

Zwei Zeilen, zwei Richtlinien – und Sie haben eine davon geschrieben. Die Schreibrichtlinie bestimmt, was und wann (Schlusszeit, ganzer Tag) beibehalten wird. Die Richtlinie zum Abrufen bestimmt, wann und womit gesucht wird (jede Frage, die Frage selbst). Das ADK stellt Ihnen die Verben add_events_to_memory und search_memory zur Verfügung und ist nicht Teil der Richtlinie. Das ist die richtige Aufteilung. Deshalb war es deine Aufgabe, die Frage zu formulieren.

Feierabend

👉🖥 Nenne drei Dinge, für die auf dem Zettel keine Zeile vorgesehen ist. Eine oder drei Nachrichten:

I read by it at night, so night is exactly when I need it.
I've tried hanging it higher. No change.
I don't want a new one — it was a gift.

Hier drücken

👉🖥 Drücke dann auf 🌙 Das war's für heute.

Die Worte steigen auf

👀 Behalte den Schreibtisch im Blick. Die drei Dinge, die du gesagt hast, heben sich vom Zettel ab und schweben nach oben und landen im dritten Stock. Unter den Karten neben dem Turm werden sie aufgeführt – eine Karte für jede Nachricht, die Sie gesendet haben, mit quote gekennzeichnet, Ihre Sätze Wort für Wort und in diesem Prozess darüber. Die Lampe auf dem Schreibtisch bleibt so lange an, bis sie gelandet sind.

Einen Monat später weiß sie

👉 🖥️ Drücke 🗓 einen Monat später und frage:

What have I already tried?

👀 Du hast versucht, sie höher aufzuhängen – das hat nicht geholfen. Sie weiß es. Auf dem Zettel gibt es dafür keine Zeile und gab es auch nie. Daher konnte die Schublade diese Frage nicht beantworten. recall hat die Karte gefunden, sie in ctx.state["recalled"] geschrieben und ihre Anweisung lautet so. Eine Zeile ist der Unterschied.

Und es ist alles in ihrem Kopf

Sehen Sie sich die Karten neben dem Turm an: in diesem Prozess. Derzeit ist der Speicher InMemoryMemoryService – ein Dictionary in bash valley.sh – und er ist genau so lange verfügbar wie dieser Prozess. Schließe den Turm heute Abend und öffne ihn morgen: Die Bücher sind im ersten Stock, die Schublade im zweiten und der dritte Stock ist dunkel. Der Fall ist in der Datei erhalten geblieben. Was Sie gesagt haben, ist im Prozess enthalten, und der Prozess ist vorbei.

Persistenz ist nicht gleich Speicher.

Es gibt zwei Probleme mit der dritten Ebene: Sie ist im Prozess und sie ist in Ihren eigenen Worten formuliert – ein Zitat, keine Tatsache. Im nächsten Kapitel wird beides ohne Code behoben.

Was Sie gelesen und geschrieben haben und worum es geht

die Linie

Was ist das?

wo sie sich befindet

await ctx.add_events_to_memory(events, custom_metadata=FILING): Sie lesen die Nachricht nur.

die Schreibrichtlinie – einen ganzen Tag, zum Geschäftsschluss

floor three · the memory service

found = await ctx.search_memory(query) – BEARBEITEN 3

die Rückrufrichtlinie – jede Frage, bevor sie antwortet

recall() → ctx.state["recalled"]

Auf dieser Stufe wird das Gesagte erfasst und in einem Wörterbuch innerhalb eines Prozesses in Ihren eigenen Worten gespeichert. Beide Hälften sind falsch und im nächsten Kapitel werden beide ohne Code behoben.

6. MemoryBank

  • Was: Ein Skript erstellt eine Memory Bank. Die beiden Zeilen, die Sie bereits haben, beginnen damit, Fakten in die Memory Bank zu schreiben und wieder auszulesen.
  • Warum: Ein Dienst für Erinnerungen ist ein Dienst. Wo das Archiv gespeichert wird, ist eine Bereitstellungsentscheidung und keine Agent-Entscheidung. Sie können es ändern, ohne den Agent zu bearbeiten.
  • Wie: Führe make_tower.py aus, sage drei Sätze, drücke auf 🌙, drücke auf 🗓 und stelle eine Frage. Dann ein schreibgeschützter Blick auf das Schreiben und Lesen.

Turm bauen

Die dritte Etage von Kapitel 3 war ein Python-Wörterbuch in bash valley.sh. Memory Bank ist die verwaltete Version dieses Flows: Sie befindet sich in einer Agent Engine-Instanz in Ihrem Projekt, speichert Fakten, die aus dem Tag abgeleitet wurden, anstelle Ihrer Sätze und findet sie anhand der Bedeutung statt anhand gemeinsamer Wörter. Sie müssen Vesper nicht in einer Agent Engine bereitstellen, um es zu verwenden. Eine Instanz, auf der nichts bereitgestellt ist, hostet weiterhin eine Memory Bank. Das ist es, was das Skript erstellt: einen Turm, in dem niemand wohnt und dessen einzige Aufgabe es ist, die Karten aufzubewahren.

👉💻 Tab 1 (ca. 1 Minute):

cd ~/agent-valley-archive
uv run python scripts/make_tower.py

👀 Erwartungen:

  building the tower in YOUR_PROJECT / us-central1 — about a minute...
  built, with the two topics in archive/topics.py configured on it.

  resource: projects/.../locations/us-central1/reasoningEngines/6792...
  AGENT_ENGINE written to .env

  Next — nothing to restart. The Archive reads .env on every message:
    look at floor three — under the cards it now says Memory Bank.
    (adk web, if you use it:  --memory_service_uri "agentengine://projects/.../reasoningEngines/6792...")

Ein SDK-Aufruf, agent_engines.create(), und eine Zeile, die in .env geschrieben wird. Das Archiv liest diese Datei bei jeder Anfrage neu, sodass kein Neustart erforderlich ist.

Videoanzeigen – einfach genial

👉🖥 Sehen Sie sich den dritten Stock an – der Turm wird innerhalb weniger Sekunden neu gezeichnet. Unter Die Karten steht jetzt Memory Bank und das Regal ist leer: Die drei Zitate aus Kapitel 3 waren im Prozess und das ist nicht der Prozess. Sagen Sie die drei Sätze noch einmal, entweder als eine oder als drei Nachrichten:

I read by it at night, so night is exactly when I need it.
I've tried hanging it higher. No change.
I don't want a new one — it was a gift.

👉 🖥 Drücke 🌙 das wars für heute. Das Schließen dauert jetzt etwa acht Sekunden – der Turm wird eingefahren. Sehen Sie sich dann die dritte Etage an.

Links: Was sie im Kopf behielt. Rechts: Was der Turm behält.

👀 Die Karten enthalten nicht Ihre Sätze. Sie schreiben z. B. Ich benutze meine Laterne nachts zum Lesen, dann geht sie immer aus und Ich habe schon versucht, die Laterne höher aufzuhängen. Beide Aussagen sind mit einem Datum fact versehen. Destillation: Was eingegeben wurde, war eine Unterhaltung. Dabei sind Fakten herausgekommen.

👉 🖥 Drücke einen Monat später – ein neuer Besuch, also ist nichts von dem, was du gerade gesagt hast, mehr in der Unterhaltung – und stelle ihr diese Frage, die kein einziges Wort mit den Karten gemeinsam hat:

Should I just get a different lamp?

👀 Da es sich um ein Geschenk handelt, möchten Sie die Laterne nicht ersetzen. Sie haben sie auch schon höher aufgehängt. Jedes Wort davon stammte von der Karte und nur die Karte konnte ihr sagen: Dieser Besuch ist eine Nachricht alt. Ähnlichkeitssuche: Der Turm entspricht der Bedeutung, nicht den Wörtern – in der Frage hieß es Lampe und anders, auf der Karte steht Laterne und ersetzen. Und es ist jetzt nicht mehr Teil des Prozesses: Schalte den Tower heute Abend aus und die Karten sind morgen da, weil sie in der Agent Engine und nicht in bash valley.sh gespeichert sind.

Schreiben und Lesezugriff – nur Lesezugriff

Das Recht auf Vergessenwerden

Hier drücken

👉 🖥 Klicken Sie unter dem Nachrichtenfeld auf 🔥 Vergiss mich.

👀 Drei Etagen werden dunkel, eine nicht:

Was ist enthalten?

nach 🔥

Etage 3, die Karten

was sie erinnert – die Fakten, die Memory Bank aus Ihren Besuchen extrahiert hat

gone – memories.delete, eine Karte nach der anderen

zweite Etage, die Schublade

user:case, der Beleg, der diesen Besucher von Besuch zu Besuch begleitet

gelöscht

der Desktop, der Zettel

Kopie des Falls für diesen Besuch

gelöscht

im ersten Stock, die Bücher

die Besuche selbst – eine Sitzung in archive.db pro Besuch, jede Nachricht darin

unverändert – die Anzahl bleibt gleich

Die Bücher sind der Nachweis dafür, dass ein Besuch stattgefunden hat, an welchem Tag und was gesagt wurde. Die Karten und die Schublade sind das Gedächtnis: Was sie aus diesen Besuchen gelernt hat und in den nächsten Besuch mitnimmt. Bei einem Antrag auf Vergessen geht es um das Gedächtnis – die Fakten, die über eine Person abgeleitet werden, und den Status, der sie begleitet. Ob der Besuch auch aufgezeichnet wird, ist eine separate Entscheidung, die aus separaten Gründen getroffen wird – ein Prüfpfad, ein Supportverlauf – und in diesem Lab wird sie absichtlich beibehalten, damit Sie sehen können, wie die beiden auseinandergehen: Die Aufzeichnung und die Erinnerung sind nicht dasselbe, und das Vergessen des einen berührt das andere nicht. Das ist der Satz über Vespers Tür, von der anderen Seite aus gesehen.

Die ADK-Speicherabstraktion hat add_events_to_memory und search_memory. Es gibt keine Löschfunktion. Das Vergessen ist eine Governance-Maßnahme, keine Agent-Maßnahme. Sie wird daher in der Anwendung – archive/tower.py, memories.delete auf dem Raw-Client – ausgeführt, wo das Modell nicht versehentlich darauf zugreifen kann. Ob ein Agent etwas vergessen kann, legen Sie fest – genau wie die Frage, ob er sich etwas merken kann.

Was Sie erstellt und gelesen haben und was es ist

das Ding

Beschreibung

Wo befindet sich die Datei?

make_tower.py → AGENT_ENGINE in .env – erstellt, nicht bearbeitet, nichts neu gestartet

Der Memory-Dienst als Dienst: eine Bereitstellungsentscheidung außerhalb des Agenten

Vertex AI Memory Bank in einer Agent Engine

tower_service(engine): Sie lesen die Nachricht nur.

derselbe Runner(memory_service=...)-Slot, ein anderes Zuhause

archive/service.py

"allowed_topics": TOPICS in FILING – Lesezugriff

was beibehalten werden soll, wird zum Zeitpunkt des Schreibens entschieden, nicht im Prompt.

archive/topics.py + die eigene Konfiguration des Turms

🔥 → memories.delete – gedrückt, nicht geschrieben

Das Vergessen ist eine Anwendungsaktion. Die Memory API des ADK hat keine Löschfunktion.

archive/tower.py

Diese Stufe entspricht dem Gesagten. Ein Tag geht rein, eine Tatsache kommt raus – destilliert auf das, was die Themen zulassen – und das Buch im ersten Stock hat sich nie bewegt.

7. GraphRAG

Optional.

  • Was: Ein Skript lädt die Vergangenheit des Tals in BigQuery, generiert Einbettungen im Data Warehouse und legt einen Graphen über die Tabellen, ohne eine Zeile zu verschieben. Dann werden zwei Fragen an Vesper gestellt, für die zwei geregelte Anfragen vorliegen: eine für ähnliche Begriffe und eine für zusammenhängende Begriffe.
  • Warum: „Klingt ähnlich“ ist nicht dasselbe wie „ist verbunden“. Ein Vektor findet, wo gesucht werden muss, ein Graph findet, was angehängt ist, und die Antwort muss den Pfad enthalten, den sie durchlaufen hat.
  • Wie: bash scripts/season.sh, einmal. Alles andere in diesem Kapitel hat Lesezugriff.

Der Vesper-Turm ist von vornherein auf Sie – (app_name, user_id) – ausgerichtet. Die Besuche anderer Personen sind nicht ihr Gedächtnis, und auch wenn sie sich mehr anstrengt, wird sich das nicht ändern. Sie gehören dem Tal und werden dort in einem Lager aufbewahrt. 31 Besucher in dieser Saison kamen wegen einer Q7-Laterne, die nachts ausging, und einer von ihnen fand die Ursache. In diesem Kapitel wird das Data Warehouse geladen und es werden zwei feste Abfragen übergeben.

Graph RAG

RAG ist abrufen und dann generieren: Die richtigen Datensätze werden gesucht, an das Modell übergeben und das Modell generiert darauf basierend eine Antwort. Bei einfachem RAG wird anhand von Ähnlichkeit abgerufen – die Frage wird eingebettet und die ähnlichsten Datensätze werden abgerufen. Damit werden Dinge gefunden, die wie die Frage klingen. Das ist der Punkt, an dem der Turm in Kapitel 4 endete. Bei Graph RAG wird ein zweiter Abrufschritt hinzugefügt, bei dem Kanten (Schlüssel, die bereits in einem Data Warehouse vorhanden sind) von der gefundenen Ähnlichkeit zu den zugehörigen Elementen verfolgt werden. Die beiden Schritte beantworten unterschiedliche Fragen. In diesem Kapitel werden Sie aufgefordert, beide zu stellen:

Schritt

die Frage, die beantwortet wird

wie

in diesem Kapitel

Ähnlichkeit

Wo genau finde ich diese Informationen?

die Frage einbetten: VECTOR_SEARCH

season_search – wenn der Besucher keine Markierung mitbringt

Durchlauf

Was ist damit verbunden?

MATCH ein Pfad durch eine Attributgrafik

season_known_issue – ein fester MATCH

Generation

Was soll ich dem Besucher sagen?

das Modell mit dem Pfad als Quellenangabe

ihrer Antwort

Ausführen

Die Saison wird als einfache CSV-Datei in season/ ausgeliefert – Besucher, Artikel, Anfragen, Korrekturen, Saisons – so, wie sie von einem Supportsystem exportiert würden. Ein Script führt sie bis ins Lager. Das ist das Einzige, was Sie in diesem Kapitel ausführen.

👉💻 Tab 1 (ca. 3 Minuten; jeder Schritt wird ausgegeben, sobald er ausgeführt wird, und der Vorgang wird beim ersten Fehler beendet):

cd ~/agent-valley-archive
bash scripts/season.sh

👀 Wenn die Show endet, leuchtet Etage 4 auf dem Turm auf und die Legende daneben zeigt Offen an.

Was wurde erstellt – nur Lesezugriff

Wie sie es liest – Lesezugriff

Sie fragen

👉🖥 Der vierte Stock ist geöffnet. Fragen Sie sie so, wie es jeder Besucher tun würde:

Has anyone else had a q7 lantern go out at night?

Sie antwortet und die letzte Zeile ist der Pfad.

👀 Sie antwortet: 31 andere haben geantwortet… die meisten sagten, dass die Flamme niedrig war und nach einer Stunde ausging… Marlow, das Otterweibchen, fand heraus, dass die Dochte zu flach eingetaucht waren. Die letzte Zeile ihrer Antwort ist der Pfad. Das ist ihre Antwort. Lies sie dir durch, aber sende sie nicht an sie zurück:

mark q7 → 31 visits this season → 10 different things said → the wicks in the q7 batch were dipped too shallow — they drown in the oil and starve in an hour

Der Pfad ist die Quellenangabe. Jeder Hop ist eine Kante im Diagramm und eine Kante ist ein Schlüssel. Jeder kann also den Weg noch einmal gehen und erhält dieselbe 31. Ein Ähnlichkeitswert kann von niemandem noch einmal durchlaufen werden. Wenn sie kurz vor dem Pfad sagt, dass die Zeilen durch drei Joins zurückgegeben wurden, weil das Projekt keine Graphreservierung hat, lehnt die Version Ihres Projekts GRAPH_TABLE ab – die Zeilen und der Pfad sind identisch.

👉🖥 Lass die Markierung jetzt weg – sende Folgendes:

Has anyone else had a lantern that keeps dying once the sun is down?

👀 Sie kommt auf dieselbe 31 und denselben Pfad. Geändert hat sich die Straße: season_search ist zuerst gelaufen, hat fünf Besucher gefunden, die ähnlich klingen – jeder mit q7 –, hat diese Markierung genommen und ist erst dann gegangen. Ähnlich ist nicht verbunden – ähnlich ist, wo Sie suchen müssen.

Was geladen wurde und was es ist

das Ding

Beschreibung

wo sie sich befindet

bq load mit expliziten Schemas – ausgeführt, nicht geschrieben

Ein Data Warehouse: Spalten mit Namen und Typen

archive.visitors / items / asks / fixes / seasons

ML.GENERATE_EMBEDDING + VECTOR_SEARCH

Ähnlichkeitsschritt – Wo genau finde ich diese Informationen?

archive.ask_embeddings, das Modell embedder

CREATE PROPERTY GRAPH – keine Zeile verschoben

der Traversierungsschritt – was verbunden ist; Tabellen werden zu Knoten und Pfeilen

archive.season_graph

GQL in archive/season/__init__.py – ein Parameter

der einzige Spaziergang, den sie machen darf; der Pfad ist die Quellenangabe

season_known_issue(mark)

Ein paar Dutzend Besucher sind kein Grund, ein Lager zu kaufen. In diesem Kapitel geht es um die Form der Anfrage, nicht um den Umfang. Wenn Sie diese Grafik tausendmal vergrößern, ändert sich die MATCH nicht um ein Zeichen.

8. Schließen

Drei Linien, ein Turm, ein Lager – vier Etagen. Es wurde nichts neu gestartet.

die Sprosse

Was Sie getan haben

was gekauft wurde

ONE

tool_context.state[CASE] = case – eine Änderung

Ein Beleg ist überhaupt vorhanden: Der Status wird durch Code geschrieben.

Zwei

CASE = "user:case" – eine Bearbeitung

Eine Schublade, die dem Besucher folgt

die Einreichung

await ctx.add_events_to_memory(..., custom_metadata=FILING) – gelesen, nicht geschrieben

Was gesagt wurde, wurde behalten

Drei

found = await ctx.search_memory(query) – eine Bearbeitung

Was wurde behalten, was wurde angefordert? – Die Ablage wird nicht gespeichert.

der Turm

make_tower.py, dann AGENT_ENGINE in .env – durch eine Linie verbunden, nichts neu gestartet

Ein Turm, der destilliert und die Nacht übersteht

die Regeln

allowed_topics in FILING – gelesen, nicht geschrieben

nur das, was behalten werden soll

die Saison

season.sh – geladen, eingebettet, ein Diagramm darüber, mit einem MATCH aufgenommen

Besuche aller anderen nach Bedeutung und Verbindung

Was wurde durch die einzelnen Teile ersetzt?

ADK 2

was Sie stattdessen schreiben würden

was das für Sie kostet

session.state + ein Tool, behalten von SqliteSessionService

ein Dictionary neben der Chat-Schleife, das Sie selbst auf der Festplatte gespeichert haben

Das Modell kann sie nicht lesen und Sie schreiben die Zusammenfassung und die Sperrung.

Das Präfix user:

eine Nutzertabelle und einen Join bei jedem Turn

jedes Mal entscheiden, wo ein Schlüssel hingehört.

add_events_to_memory + search_memory in einem Funktionsknoten

ein Cronjob, der Transkripte ausgibt, und das Modell, das entscheidet, wann es nachschlagen soll.

Es wird alles ausgegeben, aber nichts gefiltert. Sie sehen nie, wann nicht gesucht wurde.

VertexAiMemoryBankService + allowed_topics

einen Vektorspeicher, einen Extraktionsprompt, einen Konsolidierungsjob und „please don't remember trivia“ (bitte keine Trivia merken) im Prompt.

drei Dienste und die Regel gilt, bis das Modell etwas anderes vorschlägt.

VECTOR_SEARCH + eine feste GQL MATCH

Exportieren, an anderer Stelle einbetten, eine Graphdatenbank, ein Synchronisierungsjob und das Modell, das SQL schreibt

Die Daten verlassen das Data Warehouse, um analysiert zu werden. Sie sehen, welche Joins bei einer Kundenanfrage verwendet wurden.

Drei Fragen, bei der ersten Antwort „Ja“ aufhören

  1. Wird es morgen wichtig sein? Nein → nichts beibehalten. Es ist nur im Gespräch verfügbar.
  2. Kann eine Funktion das prüfen? Ja → die Schublade. Der Code schreibt ihn, bei jedem Zug wird er gelesen und kein Satz kann ihn ändern.
  3. Andernfalls → der Turm. Die Informationen werden aus dem Gesagten abgeleitet, bei Bedarf nachgeschlagen und anhand des Folgenden überarbeitet.

Der eine Satz

Eine Aufnahme ist keine Erinnerung. Ein Memory ist ein Datensatz plus zwei Entscheidungen: Was soll behalten werden und wann soll es angezeigt werden? Welche Art von Sache es ist, entscheidet, auf welcher Etage es angezeigt wird.

Fakten und Einstellungen gehören in unterschiedliche Stores.

👀 Jede Etage ist beleuchtet. Ihr Familiar wird oben angezeigt. Der Archivstempel befindet sich im Reisepass und in Woche 5 wird der Nachtmarkt eröffnet. Dort führt Nix lautstark und in Echtzeit durch das Programm und alles, was der Turm weiß, ist dabei.