1. Wprowadzenie

W pierwszym tygodniu zadaliśmy pytanie kto mówi, że bieganie jest. W drugim tygodniu zadaliśmy pytanie kto decyduje o tym, co będzie wyświetlane dalej. W trzecim tygodniu zapytaliśmy, co zostawia po sobie bieg. W tym tygodniu rozmowa się kończy, a pytanie brzmi: co z niej przetrwa? Okazuje się, że rodzaj obiektu decyduje o tym, gdzie on trafi.
Archiwum to miejsce, do którego trafiają informacje, gdy coś pójdzie nie tak. Wieża, która wszystko zapisuje, i Vesper, archiwistka, przy biurku na parterze. Latarnia gaśnie w nocy. Idź i zapytaj.
Jest dobrym towarzystwem. Miesiąc później jest zachwycona, że może Cię poznać.
Zapis nie jest wspomnieniem.
To zdanie to całe laboratorium. Będziesz się wspinać po 4 szczeblach, z których każdy to piętro wieży:
szczebel, | podłoga, | co zapamiętuje, | co sprawia, że |
1 | biurkowy i podłogowy, | tej wizyty. |
|
2 | drugie piętro, twoja szuflada | tego gościa. | prefiks |
3 | trzecie piętro, wieża | co zostało powiedziane, | Bank zapamiętanych informacji Vertex AI |
4 | floor four, the season | całą dolinę, | BigQuery |
Każdy kolejny szczebel jest wyższy, ponieważ coś wypadło z poprzedniego.

Znasz już 5 sposobów zapominania archiwisty, ponieważ każdy z nich zdarzył Ci się podczas rozmowy z zespołem pomocy:
co mówi, | co poszło nie tak, | |
~~1~~ | ~~Czy możesz jeszcze raz podać ten numer referencyjny?~~ | ~~zapomnieć w trakcie jednej rozmowy~~ – w trzecim tygodniu to naprawiono |
~~2~~ | ~~Przekazuję Cię. Zacznij od początku.~~ | ~~historia zniknęła wraz z procesem~~ – w trzecim tygodniu to też zostało naprawione |
3 | Cześć, W czym mogę Ci dziś pomóc? | do osoby, która w zeszłym miesiącu zgłosiła problem, |
4 | Czy możesz opisać uszkodzenie? | ostatnio patrzyła na latarnię, |
5 | Czegoś takiego jeszcze nie widzieliśmy. | W tym sezonie zadało je 31 osób. |
Linia 3 to ten tydzień. Nie udaje się to na 3 różne sposoby – nowa wizyta (rozdział 2), zdanie bez linii na kartce (rozdział 3) i archiwum, które istnieje tylko w ramach procesu (rozdział 4) – i każdy z nich to rozdział. Czwarta linia należy do Ciebie: look() w archive/agent.py to miejsce, w którym odczytuje znak ze zdjęcia. Wiersz 5 to rozdział 5, który jest opcjonalny.
Nie musisz uwzględniać tygodni od pierwszego do trzeciego. Agent to model z instrukcją i kilkoma narzędziami. Wszystko inne w tym tygodniu wyjaśnia się samo.
Napiszesz 3 wiersze, a każdy z nich będzie koncepcją wspomnienia:
linia | co to jest, |
| stan jest zapisywany przez kod, a nie przez rozmowę. |
| prefiks to okres życia, |
| zasady wycofania – pole nie jest zapamiętywane; |
Kolejna linia jest już gotowa do odczytania – zasady zapisu, await ctx.add_events_to_memory(...) – a w rozdziale 3 przeczytasz, co robi, zanim napiszesz linię, która z niej korzysta.
Pozostałe 2 poziomy nie wymagają żadnych zmian: budujesz wieżę (silnik Agent Engine, który hostuje Bank zapamiętanych informacji), a ten sam kod łączy się z nią samodzielnie, oraz ładujesz magazyn danych (BigQuery), nakładasz na niego graf i przekazujesz temu samemu agentowi 2 zarządzane zapytania – jedno według znaczenia, a drugie według połączenia.
Każdy rozdział przebiega w tej samej pętli, której będziesz używać w przypadku własnych agentów: odczytaj kod – napisz wiersz – zobacz go w wieży. Nic nie jest najpierw uszkodzone, nic nie jest ponownie uruchamiane ani nie jest przerywane za pomocą Ctrl+C: każda zmiana jest uwzględniana w następnej wiadomości, a połączenie z wieżą to jeden wiersz w pliku, który archiwum odczytuje ponownie przy każdym żądaniu. Wieża to rysunek, który się odtwarza: odczytuje te same pliki, które edytujesz, i ma 3 przyciski: 🌙 kończy dzień, 🗓 rozpoczyna kolejną wizytę, 🔥 zapomina o Tobie. Wszystkie inne czynności wykonujesz w kodzie i terminalu.
Dwa miejsca, w których nigdy nie zmieniają pracy: karta 1 to terminal, a karta 2 to archiwum. Stanowisko robocze (adk web) pojawia się dokładnie raz, w rozdziale 1, aby umożliwić Ci zapoznanie się z surowym stanem sesji. Potem nie będziesz już go potrzebować. Każdy symbol 👉 poniżej wskazuje, o który rodzaj chodzi. 👉💻 to karta 1, 👉🖥 to karta 2, a 👉🔬 to obszar roboczy. 👉📖 oznacza otwarcie pliku i jego odczytanie – nic się nie zmienia – a 👉✏️ to rodzaj kroku, który powoduje edycję. Gdy w instrukcji pojawi się polecenie, aby coś powiedzieć do Vespera, dokładna treść wiadomości będzie znajdować się w bloku poniżej – skopiuj ją w całości. W sekcji, której nagłówek kończy się na – tylko do odczytu, nie musisz niczego wpisywać, wklejać ani klikać: kod w niej jest już w repozytorium i jest już uruchomiony, a jego wynik jest wyświetlany, aby można było go odczytać.
Zdanie nad drzwiami Vesper jest na górze. Zdanie, na którym kończy się ten tydzień, to ostatnia linia czwartego tygodnia całego sezonu:
Fakty i preferencje należą do różnych sklepów.
2. 🧰 Konfiguracja
- Co – wskaż projekt lub wklej klucz, zainstaluj i sprawdź, czy łańcuch narzędzi jest prawidłowy.
- Dlaczego – nic nie jest tu uruchamiane. Każdy serwer zaczyna działać tuż przed krokiem, który go potrzebuje, więc gdy otworzy się ekran, wiesz, która komenda jest za niego odpowiedzialna.
- Jak – jeden skrypt, który tworzy projekt, jeden, który instaluje i kieruje Cię do Vertex AI, oraz jeden skrypt wstępny, który odczytuje Twój kod i informuje Cię, gdzie się znajdujesz.
Wszystkie działania w tym module odbywają się w Cloud Shell – Python, uv i gcloud są już tam zainstalowane, a do Gemini uzyskujesz dostęp przez Vertex AI za pomocą własnych danych logowania. W tym module nie ma klucza interfejsu API ani niczego, co trzeba zainstalować na laptopie.
Jednego nie możemy Ci zapewnić: projektu Google Cloud z włączonymi płatnościami. W kroku 1 uzyskasz konto, z którego możesz płacić. W kroku 4 przekształcisz to konto w projekt lub wybierzesz projekt Agent Valley, który został utworzony w 1., 2. lub 3. tygodniu. Wykonaj je w tej kolejności – każdy krok po kroku 4 odczytuje projekt, który został ustalony w kroku 4.
1. Uzyskaj konto z płatnościami (ok. 1 min)
🌐 Zrób to, zanim wykonasz inne czynności. Zaloguj się na konto Google z włączonymi płatnościami. Możesz użyć dowolnego konta. Jeśli nie masz takiego konta, rozpocznij bezpłatny okres próbny. Dzięki temu uzyskasz konto rozliczeniowe, które jest potrzebne w kroku 4.
2. Otwórz Cloud Shell (~1 min).
🌐 Kliknij Aktywuj Cloud Shell u góry konsoli Google Cloud – jest to ikona w kształcie terminala w nagłówku.

🌐 Kliknij Otwórz edytor (ikonę otwartego folderu z ołówkiem). Spowoduje to otwarcie edytora Cloud Shell z eksploratorem plików po lewej stronie – to w nim będziesz pracować, gdy krok będzie oznaczony symbolem 👉✏️.

🌐 Jeśli w dowolnym momencie pojawi się prośba o autoryzację, kliknij Autoryzuj, aby kontynuować.
🌐 Otwórz terminal w edytorze, czyli kartę 1. Wszystkie kroki 👉💻 będą wykonywane tam, chyba że podano inaczej. Karta 2 to Archiwum. Otwierasz ją w rozdziale 1, tuż przed krokiem, w którym jest potrzebna. Jeśli terminal nie jest jeszcze widoczny u dołu ekranu, otwórz go, klikając Widok → Terminal:

🌐 Sprawdź, na które konto jesteś zalogowany(-a) – powinno to być konto z kroku 1:
gcloud auth list
3. Uzyskaj dostęp do laboratorium (ok. 1 min)
💻 Sklonuj repozytorium – to repozytorium archiwum, a nie repozytorium z pierwszego, drugiego ani trzeciego tygodnia:
cd ~
git clone https://github.com/cuppibla/agent-valley-archive
cd agent-valley-archive
4. Utwórz projekt lub użyj projektu z poprzedniego tygodnia (~2 min)
💻 Jeden skrypt znajduje Twoje konto rozliczeniowe, tworzy na nim projekt i wskazuje Cloud Shell ten projekt. Jeśli wykonasz zadania z tygodnia 1, 2 lub 3, najpierw znajdzie projekt Agent Valley i zaproponuje jego ponowne użycie – jeśli się na to zgodzisz, nie musisz się martwić o drugi projekt, za który trzeba zapłacić:
cd ~/agent-valley-archive
./setup_project.sh
👀 Spodziewaj się ✓ w przypadku wybranego konta rozliczeniowego, ✓ w przypadku utworzonego lub ponownie użytego projektu oraz zakończenia w tym stylu:
cd ~/agent-valley-archive
Project ready: agent-valley-4271
Next: ./setup_codelab.sh
agent-valley-4271 to identyfikator projektu – Twój będzie miał inne cyfry. W tym czasie dzieją się 4 rzeczy:
rozliczenia | wybiera najnowsze konto | |
project | wyszukuje projekt Agent Valley, który już masz – z pierwszego, drugiego lub trzeciego tygodnia – i proponuje jego ponowne użycie; w przeciwnym razie tworzy projekt | |
wybiera | zapisuje identyfikator w | |
czeka | odpytuje, dopóki projekt nie będzie mógł wyświetlać reklam, przez maksymalnie 2 minuty. | |
🌐 Ten sam projekt jest teraz w konsoli – jego identyfikator znajduje się na karcie Informacje o projekcie w panelu:

5. Zainstaluj i skieruj na Vertex AI (ok. 3 min)
💻 Zainstaluj uv, wyeksportuj 3 zmienne, które wysyłają ADK do Vertex AI, i uruchom konfigurację:
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) ma coś do zwrócenia, ponieważ zostało to ustawione w kroku 4. Dlatego właśnie krok 4 jest pierwszy.
setup_codelab.sh jest idempotentna – można ją bezpiecznie uruchamiać ponownie dowolną liczbę razy. Wykonuje on 5 działań w tej kolejności:
api | odczytuje wybrany w kroku 4 projekt i włącza w nim | |
uv env |
| |
obszar | uruchamia | |
.env | zapisuje zmienne odczytywane przez laboratorium – | |
sprawdzanie modelu | wykonuje 1 prawdziwe połączenie z Gemini, więc nieprawidłowy projekt nie działa już na etapie konfiguracji, a nie później w rozdziale. | |
6. Potwierdź, że jest zielony (ok. 1 min)
💻 Przeprowadź wstępną kontrolę – każdy znacznik wyboru to prawdziwe sprawdzenie, a nie przypuszczenie:
cd ~/agent-valley-archive
uv run python scripts/preflight.py
👀 Wstępne sprawdzenie polega na zadaniu modelowi jednego pytania, aby sprawdzić, czy Twoje dane logowania działają, sprawdzeniu, czy pakiety w Archiwum są na miejscu, a następnie odczytaniu kodu i wyświetleniu paska postępu z tego tygodnia:
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
Trzy z nich są już zaznaczone. To te, które tylko czytasz. Trzy z nich to linie, które piszesz, a jedna to wieża, którą budujesz. W dowolnym momencie możesz ponownie uruchomić weryfikację wstępną w laboratorium. Poinformuje Cię ona, na jakim etapie jesteś – odczytuje pliki, a nie listę kontrolną.
3. Sesja, Stan, SqliteSessionService
- Co – napisz 1 wiersz, uruchom stół warsztatowy i obserwuj, jak wypełnia się szczelina, a potem to samo w przypadku wieży. Następnie przeczytaj, dlaczego przetrwała noc.
- Dlaczego – pierwsza rzecz, którą należy wiedzieć o pamięci, to to, że nic nie jest zapamiętywane samo z siebie. Ktoś to pisze.
- How – jeden wiersz w
agent.py, a potem niczego nie zmieniaj.
EDYTUJ 1
👉📖 Otwórz archive/agent.py i znajdź write_down. Czytaj do 👉:
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}}
Funkcja tworzy slip w lokalnym słowniku, a następnie go zwraca – lokalny słownik przestaje istnieć po wywołaniu. Uruchom ten kod w takiej postaci, a Vesper usłyszy Cię doskonale: cztery wywołania write_down powodują odpowiedź "written", a stan sesji pozostaje pusty, ponieważ nic do niego nie dotarło. Usłyszała cię. Nic nie zostało napisane.
👉✏️ Wciąż w archive/agent.py, w write_down: usuń # przed jednym wierszem – # i spację po nim. Przed:
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}}
Po:
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}}
Zapisz.
Wypełnienie kuponu
👉💻 Uruchom platformę. To jedyny raz, kiedy otwierasz to okno w laboratorium. Jest to jedyne okno, które pokazuje stan sesji w postaci surowego kodu JSON:
cd ~/agent-valley-archive
uv run adk web . --allow_origins="*"
👉🔬 Otwórz środowisko robocze, klikając Podgląd w przeglądarce → Podejrzyj na porcie 8000 (przycisk Podgląd w przeglądarce to ikona oka nad oknem w prawym górnym rogu Cloud Shell). Wybierz Archiwum, a zanim cokolwiek wpiszesz, w panelu po lewej stronie kliknij Stan.
👀 Puste Nikt jeszcze nic nie powiedział.
👉🔬 Teraz powiedz to wszystko w jednej wiadomości:
Hi! My lantern keeps going out at night. My case number is k7f2, and there's a little q7 stamped on the base.
👀 Cztery elementy write_down są aktywne – kliknij jeden z nich i przeczytaj plik JSON: "written": {"no": "k7f2"}. Teraz ponownie kliknij State (Stan).

case {"no": "k7f2", "item": "lantern", "mark": "q7",
"symptom": "keeps going out at night"}
👀 Najpierw puste, a potem pełne w jednej wiadomości. To jest to, co pamięta, i nie pojawiło się samo. Linia, która to robi, została napisana przez Ciebie. To cały mechanizm: prosta funkcja, która zapisuje dane w tool_context.state, oraz instrukcja, która mówi jej, aby używała tej funkcji, gdy tylko odwiedzający powie coś, co pasuje do wiersza na kartce.
👉🔬 Zapytaj ją:
What's my case number?
👀 k7f2. Odczytuje go z kartki. Gdyby nie było funkcji EDYTOWANIE JEDNEGO, poprosiłaby Cię o to – w pierwszym wierszu listy pomocy, w ramach jednej rozmowy.
Dwa zabezpieczenia to papierowy formularz: 4 krótkie wiersze, z których każdy jest napisany raz. Są ważniejsze, niż się wydaje. Bez nich model odkrywa, że może wlać całą rozmowę do symptom, a rozdział 3 – rozdział, którego celem jest the slip has no line for that – przestaje być prawdziwy. Kształt sklepu jest wymuszany przez kod, który go tworzy, lub nie jest wymuszany.
Teraz idź do wieży
👉💻 Zakończ pracę na platformie – możesz ją pozostawić uruchomioną lub zamknąć kartę. Pozostała część laboratorium znajduje się w archiwum. Otwórz drugą kartę terminala (karta 2 – Archiwum):
cd ~/agent-valley-archive
bash valley.sh
👉🖥 Otwórz archiwum, klikając Podgląd w przeglądarce → Zmień port, wpisz 3440 i kliknij Zmień i wyświetl podgląd. Numer 3440 nie znajduje się na liście w szybkim podglądzie w przeglądarce – domyślnie jest to 8080 – więc musisz go ustawić ręcznie. Naciśnij ▶ Start, a następnie The Archive (Archiwum). Jesteś przy drzwiach. Wybierz osobę, która przyszła z prośbą – podaj jej imię i gatunek – i wejdź.

👀 Jeden budynek. Vesper siedzi przy biurku na parterze i tam z nią rozmawiasz. Nad nią: pierwsze, drugie i trzecie piętro oraz ciemne poddasze. Cztery szczeble to cztery piętra. Twój towarzysz siedzi na parterze, bo to najwyższy poziom, na jaki udało Ci się wejść. W kolumnie obok rysunku podano, co znajduje się obecnie na każdym piętrze – te same 4 sklepy co w tabeli we wstępie, w tej samej kolejności. Po prawej stronie nie ma żadnego przycisku.
👉🖥 Wklej te 4 rzeczy w polu pod rozmową (dokładnie tę wiadomość) i naciśnij Enter:
Hi! My lantern keeps going out at night. My case number is k7f2, and there's a little q7 stamped on the base.

👀 Obserwuj biurko. Wpis jest tworzony w formie kolejnych wierszy – na rysunku i w całości pod wpisem obok niego. To samo narzędzie, ten sam stan: wieża po prostu rysuje to, co napisała write_down, i będzie to robić do końca tego modułu.
Pamięć krótkotrwała – tylko do odczytu
Wpisane przez Ciebie słowo i jego znaczenie
linia | co to jest, | gdzie się znajduje, |
| stan sesji – zapisywany przez kod, odczytywany przez instrukcję; | biurko · |
| przechowywanie sesji – wizyta w pliku, a nie w procesie; | pierwsze piętro · |
Ten poziom osiąga jedną wizytę i utrzymuje się po godzinach zamknięcia. Nie przetrwa on kolejnej wizyty.
4. Stan użytkownika
- Co – wróć miesiąc później, a kartka zniknie. Pięć znaków i podąża za Tobą.
- Dlaczego – sesja to jedna wizyta. Kolejna wizyta to nowa sesja, która nigdy nie widziała poprzedniej.
- How – 5 znaków w
state.py.


👉🖥 Naciśnij 🗓 miesiąc później. To nowa sesja tego samego użytkownika – tak jak rozpoczęcie nowej rozmowy w 3 tygodniu.
Witamy w Archiwum. W czym mogę pomóc?
👉🖥 Spójrz na wieżę. Na pierwszym piętrze jest jeszcze jedna książka – tym razem. Szuflada na drugim piętrze jest pusta. Kartka na biurku jest pusta.

👀 Dlaczego: informacja o poślizgnięciu jest zapisywana w stanie sesji, a sesja to ta wizyta. Zmiana wizyt, zmiana sesji. Nic nie zostało przeniesione, ponieważ nie podano żadnych informacji. Ostatnia wizyta nadal jest w pliku – to pierwsza książka na pierwszym piętrze – ale karteczka została napisana pod kluczem, który jest ważny tylko podczas jednej wizyty.
EDYTUJ 2
👉✏️ Otwórz archive/state.py. Znajdź 👉. Przed:
# 👉 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"
Po:
CASE = "user:case"
Zapisz. Bez ponownego uruchamiania – archiwum ponownie importuje kod przy każdej wiadomości.
👉🖥 Wklej ponownie te same 4 elementy, czyli dokładnie ten komunikat:
Hi! My lantern keeps going out at night. My case number is k7f2, and there's a little q7 stamped on the base.
👉🖥 Następnie ponownie naciśnij 🗓 miesiąc później – ten sam przycisk co wcześniej.

👀 Szuflada na drugim piętrze jest oznaczona Twoim imieniem i nazwiskiem, a w niej znajdują się 4 pola. Kartka na biurku to te same 4 wiersze – wyjęte z szuflady, gdy wszedłeś. Twój towarzysz przeszedł na wyższe piętro. Ten sam klucz, każda wizyta, jedna wartość: to jest zadanie prefiksu.
Prefiks jest ważny przez cały okres życia.
prefiks | jak długo żyje, | które piętro, |
(brak) | tej wizyty. | biurko, |
| każda wizyta tego użytkownika, | drugie piętro, szuflada |
| wszystkich, na zawsze. | część czwartego piętra, |
| tylko w tej turze – nigdy nie wchodzi po schodach; | – |
Jeden stół, cztery szuflady. W tym rozdziale omawiamy jeden z nich.
Ona już cię zna
👉🖥 To nowa wizyta i nie ma jeszcze żadnych wiadomości. Zapytaj ją:
What did I bring in last time?
👀 Mam zapisane, że przyniosłeś latarnię, sprawa k7f2. Jest oznaczony jako q7 i wspomniałeś, że w nocy się wyłącza. Każde słowo pochodzi z szuflady, a nie z rozmowy – ta wizyta ma jedną wiadomość, a wiadomość nie ma nazwy. To stan na poziomie użytkownika spełniający swoje zadanie: klucz user: jest dostępny, zanim odwiedzający wypowie słowo, podczas każdej wizyty.
Szuflada zawiera 4 wiersze, które znajdują się na wydruku, i nic więcej. To, co mówisz, a co nie ma odzwierciedlenia na wydruku – co próbujesz zrobić, dlaczego Ci na tym zależy, czy chcesz nowy dokument – nie ma gdzie trafić, a po miesiącu znika. Panel obejmuje miesiąc. Zdanie nie. Rozdział 3 jest poświęcony temu zagadnieniu.
Wpisane przez Ciebie słowo i jego znaczenie
linia | co to jest, | gdzie się znajduje, |
| Prefiks to okres istnienia – ten sam klucz, ale ograniczony do użytkownika, a nie do wizyty. | drugie piętro · |
Ten szczebel obejmuje 1 odwiedzającego. Panel podąża za Tobą, ale rozmowa nie.
5. InMemoryMemoryService
- Co – przeczytaj wiersz, który określa dzień, napisz wiersz, który zadaje pytanie, a potem podaj godzinę zamknięcia i jedno pytanie.
- Dlaczego – slip to formularz. Formularz ma linie, które zostały w nim umieszczone. Ludzie nie mówią wierszami, a zapisanie tego, co powiedzieli, to tylko połowa zapamiętania.
- Jak – przeczytaj
file; jeden wiersz wrecall; a potem 1 🌙, 1 🗓 i 1 pytanie.

Co robi w drodze do domu – tylko do odczytu
Pole nie jest zapamiętywane
Ta linia odsuwa dzień na bok. Nie powoduje to usunięcia żadnych danych. Półka pełna kart jest tak samo przydatna jak pusta, jeśli nikt na nią nie patrzy – a gdy kod jest wysyłany, nikt na nią nie patrzy: recall, węzeł, który działa przed Vesperem przy każdym pytaniu, nie pyta wieży o nic. Pamięć, której nie możesz sobie przypomnieć w odpowiednim momencie, nie jest pamięcią, tylko dziennikiem. Druga połowa to poszukiwania, które musisz opisać.
EDIT THREE – the asking
👉📖 W archive/agent.py znajdź recall – funkcję znajdującą się tuż nad file. Jest to zwykły węzeł funkcji, który uruchamia się przed Vesperem przy każdym pytaniu. Nie decyduje on o tym, kiedy szukać, co oznacza, że widoczne są też przypadki, w których nic nie znajduje. Czytaj do 👉:
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
👉✏️ Wciąż w archive/agent.py, w recall: usuń # przed jednym wierszem – # i spację po nim. Przed:
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:
Po:
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:
Pozostaw pass w tym miejscu – teraz nic nie robi, ponieważ found jest już None powyżej.
Zapisz. Nie wymaga ponownego uruchomienia.
Dwa wiersze, 2 zasady – a jedne z nich zostały napisane przez Ciebie. Zasady zapisu określają, co jest przechowywane i kiedy (godzina zamknięcia, cały dzień). Zasady przywoływania określają, kiedy i czego szukać (każde pytanie, samo pytanie). Pakiet ADK udostępnia czasowniki – add_events_to_memory, search_memory – i nie ingeruje w zasady. To właściwy podział, dlatego to Ty napisałeś prośbę.
Godzina zamknięcia
👉🖥 Wymień 3 rzeczy, których nie ma na tym dokumencie. Jedna lub trzy wiadomości:
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.

👉🖥 Następnie kliknij 🌙 to wszystko na dziś.

👀 Obserwuj biurko. Trzy rzeczy, które wypowiedziałeś, odrywają się od kartki i unoszą się w powietrzu, a następnie lądują na trzecim piętrze. Pod kartami obok wieży są one wymienione – jedna karta dla każdej wysłanej wiadomości, oznaczona symbolem quote, z Twoimi zdaniami słowo w słowo i w tym procesie nad nimi. Lampa na biurku pozostaje włączona do czasu, aż wylądują.
Miesiąc później wie,
👉🖥 Naciśnij 🗓 miesiąc później i zapytaj:
What have I already tried?
👀 Próbujesz zawiesić go wyżej, ale to nie pomaga. Ona wie. Na karteczce nie ma na to miejsca i nigdy nie było, więc szuflada nie mogła na to odpowiedzieć. recall znalazła kartę, wpisała ją do ctx.state["recalled"] i tak brzmi jej instrukcja. Różnica polega na jednej linii.
Wszystko dzieje się w jej głowie.
Sprawdź karty obok wieży: w tym procesie. Obecnie pamięć to InMemoryMemoryService – słownik w bash valley.sh, który istnieje tak długo, jak ten proces. Zamknij wieżę dziś wieczorem i otwórz ją jutro: książki są na pierwszym piętrze, szuflada na drugim, a trzecie piętro jest ciemne. W pliku zachowano wielkość liter. To, co zostało powiedziane, było częścią procesu, a proces się zakończył.
Trwałość to nie pamięć.
Z trzecim piętrem jest coś nie tak: jest w trakcie budowy i jest opisane Twoimi słowami – to cytat, a nie fakt. W następnym rozdziale naprawimy oba te problemy bez użycia kodu.
Co czytasz, co piszesz i czym to jest
linia | co to jest, | gdzie się znajduje, |
| zasady zapisu – cały dzień, do godziny zamknięcia; | piętro trzecie · usługa pamięci |
| zasady wycofywania produktów – każde pytanie, zanim na nie odpowie; |
|
Ten etap obejmuje to, co zostało powiedziane, i przechowuje to w słowniku w ramach jednego procesu, Twoimi własnymi słowami. Obie te części są błędne, a następny rozdział naprawia oba te błędy bez użycia kodu.
6. MemoryBank
- Co – jeden skrypt tworzy Bank zapamiętanych informacji. Dwa wiersze, które już masz, zaczynają zapisywać w nim fakty i je odczytywać.
- Dlaczego – usługa pamięci to usługa. Miejsce przechowywania archiwum jest decyzją dotyczącą wdrożenia, a nie agenta – możesz je zmienić bez ingerowania w agenta.
- Jak – uruchom
make_tower.py, powiedz 3 zdania, naciśnij 🌙, naciśnij 🗓, zadaj 1 pytanie. Następnie możesz zobaczyć zapis i odczyt w wersji tylko do odczytu.
Budowanie wieży
Trzecie piętro rozdziału 3 to słownik Pythona w bash valley.sh. Bank zapamiętanych informacji to zarządzana wersja tej funkcji: znajduje się w instancji Agent Engine w Twoim projekcie, przechowuje fakty wyodrębnione z dnia zamiast Twoich zdań i wyszukuje je na podstawie znaczenia, a nie wspólnych słów. Aby używać Vespera, nie musisz wdrażać go w Agent Engine – instancja, na której nic nie jest wdrożone, nadal hostuje Bank zapamiętanych informacji, a to właśnie tworzy skrypt: wieżę, w której nikt nie mieszka, a której jedynym zadaniem jest przechowywanie kart.
👉💻 Na karcie 1 (około minuty):
cd ~/agent-valley-archive
uv run python scripts/make_tower.py
👀 Oczekuj:
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...")
Jedno wywołanie pakietu SDK agent_engines.create() i jeden wiersz zapisany w pliku .env. Archiwum odczytuje ten plik przy każdym żądaniu, więc nie trzeba go ponownie uruchamiać.
Zobacz, jak skutecznie może reklamować się
👉🖥 Spójrz na trzecie piętro – wieża sama się przerysuje w ciągu kilku sekund. Pod kartami widnieje teraz napis Bank zapamiętanych informacji, a półka jest pusta: 3 cytaty z rozdziału 3 były w trakcie procesu, a to nie jest ten proces. Powtórz 3 zdania w 1 wiadomości lub w 3 wiadomościach:
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.
👉🖥 Naciśnij 🌙 to wszystko na dziś. Zamknięcie zajmuje teraz około 8 sekund – wieża się wycofuje. Spójrz na trzecie piętro.

👀 Karty nie zawierają Twoich zdań. Piszą na przykład: Używam latarni do czytania w nocy, wtedy właśnie gaśnie i Próbowałem już zawiesić latarnię wyżej. Każda z tych wypowiedzi jest oznaczona datą fact. Destylacja. W odpowiedzi otrzymasz rozmowę. Wyszły z tego fakty.
👉🖥 Po miesiącu naciśnij 🗓 – to nowa wizyta, więc w rozmowie nie ma już nic z tego, co przed chwilą zostało powiedziane. Zadaj jej to pytanie, które nie ma nic wspólnego z kartami:
Should I just get a different lamp?
👀 Ponieważ latarnia była prezentem, nie chcesz jej wymieniać. Próbowałaś już zawiesić ją wyżej. Każde słowo pochodziło z karty, i tylko ona mogła jej powiedzieć: ta wizyta jest o jedną wiadomość starsza. Wyszukiwanie podobieństw Wieża pasuje do znaczenia, a nie do słów – w pytaniu użyto słów lampa i inna, a na karcie – latarnia i wymienić. Nie jest już częścią procesu: wyłącz wieżę dziś wieczorem, a karty będą dostępne jutro, ponieważ znajdują się w Agent Engine, a nie w bash valley.sh.
Zapis i odczyt – tylko do odczytu
Prawo do bycia zapomnianym

👉🖥 W polu wiadomości kliknij 🔥 zapomnij o mnie.
👀 Trzy piętra są zaciemnione, a jedno nie:
co zawiera, | po 🔥 | |
trzecie piętro, karty | co zapamiętała – fakty, które Bank zapamiętanych informacji wyodrębnił z Twoich wizyt; | zniknąć – |
drugie piętro, szuflada |
| wyczyszczono |
biurko, kartka | kopia zgłoszenia z tej wizyty, | wyczyszczono |
piętro pierwsze, książki | same wizyty – 1 sesja w | bez zmian – liczba nie ulega zmianie |
Książki są zapisem wizyty: informują o tym, że wizyta miała miejsce, w którym dniu i co zostało podczas niej powiedziane. Karty i szuflada to pamięć: to, co zapamiętała z tych wizyt i co zabiera ze sobą na następną. Prośba o usunięcie informacji dotyczy pamięci – faktów dotyczących danej osoby i jej stanu. To, czy zapis wizyty również zostanie usunięty, jest osobną decyzją podjętą z innych powodów – rejestru kontrolnego, historii pomocy – i to laboratorium celowo go zachowuje, abyś mógł zobaczyć, jak te 2 rzeczy się od siebie oddalają: zapis i pamięć to nie to samo, a zapomnienie jednego nie wpływa na drugie. To zdanie nad drzwiami Vesper, widziane z drugiej strony.
Abstrakcja pamięci ADK ma add_events_to_memory i search_memory. Nie ma opcji usuwania. Zapominanie jest działaniem związanym z zarządzaniem, a nie działaniem agenta, więc znajduje się w aplikacji – archive/tower.py, memories.delete na surowym kliencie – gdzie model nie może go przypadkowo osiągnąć. To, czy agent może zapomnieć, zależy od Ciebie, tak samo jak to, czy może zapamiętać.
co zostało utworzone i odczytane oraz czym jest,
rzecz | co to jest, | gdzie się znajduje, |
| usługa pamięci jako usługa: decyzja o wdrożeniu poza agentem; | Bank zapamiętanych informacji Vertex AI w Agent Engine |
| ten sam boks |
|
| co można zachować (decyzja jest podejmowana w momencie pisania, a nie w prompcie); |
|
🔥 → | zapominanie jest działaniem aplikacji; interfejs API pamięci ADK nie ma funkcji usuwania. |
|
Ten poziom odnosi się do tego, co zostało powiedziane. Dzień mija, a z niego wyłania się fakt – sprowadzony do tego, na co pozwalają tematy – a książka na pierwszym piętrze nigdy się nie ruszyła.
7. GraphRAG
Opcjonalnie.
- Co – jeden skrypt wczytuje przeszłość doliny do BigQuery, generuje osadzanie wewnątrz magazynu i układa graf na tabelach bez przenoszenia wiersza; następnie zadaje 2 pytania Vesperowi, który ma 2 zarządzane zapytania: jedno dotyczące podobnych dźwięków, a drugie dotyczące powiązań.
- Dlaczego – podobne brzmienie nie oznacza połączenia. Wektor wskazuje, gdzie szukać, a graf – co jest dołączone. Odpowiedź musi zawierać ścieżkę, którą przeszła.
- How –
bash scripts/season.sh, raz. Pozostałe informacje w tym rozdziale są tylko do odczytu.
Wieża Vesper jest w Twoim zasięgu – (app_name, user_id) – ze względu na konstrukcję. Wizyty innych osób nie są jej wspomnieniami, a intensywniejsze poszukiwania nie zmienią tego faktu. Należą one do doliny, która przechowuje je w magazynie. W tym sezonie 31 osób odwiedziło nas z powodu zgaśnięcia w nocy latarni q7. Jedna z nich znalazła przyczynę. W tym rozdziale wczytuje ona magazyn danych i przekazuje do niego 2 stałe zapytania.
RAG w grafie
RAG to wyszukiwanie, a potem generowanie: znajdź odpowiednie rekordy, przekaż je modelowi i pozwól mu na ich podstawie odpowiedzieć. Zwykłe RAG wyszukuje na podstawie podobieństwa – osadza pytanie i wyciąga najbliższe rekordy. Wyszukuje to, co brzmi jak pytanie, i w tym miejscu zatrzymała się wieża z rozdziału 4. Graph RAG dodaje drugi etap pobierania, który następuje po krawędziach – kluczach, które magazyn już ma – od dowolnego znalezionego podobieństwa do wszystkiego, co jest do niego dołączone. Te 2 kroki odpowiadają na różne pytania, a ten rozdział zachęca do zadawania obu z nich:
kroku | pytanie, na które odpowiada, | jak | w tym rozdziale |
podobieństwo, | gdzie szukać? | osadzić pytanie, |
|
przemierzanie | Co jest z nim połączone? |
|
|
generacja | Co mam powiedzieć osobie odwiedzającej? | modelu ze ścieżką jako cytatem. | jej odpowiedź |
Uruchom
Sezon jest dostarczany w postaci zwykłych plików CSV w season/ – odwiedzający, produkty, prośby, poprawki, sezony – w sposób, w jaki eksportuje je system pomocy. Jeden skrypt prowadzi je aż do magazynu i jest jedyną rzeczą, którą uruchamiasz w tym rozdziale.
👉💻 Na karcie 1 (około 3 minut; każdy krok jest drukowany na bieżąco, a proces zatrzymuje się na pierwszym nieudanym kroku):
cd ~/agent-valley-archive
bash scripts/season.sh
👀 Gdy się skończy, czwarte piętro wieży się podświetli, a legenda obok niego będzie wskazywać otwarte.
Co zostało utworzone – tylko do odczytu
Jak odczytuje – tylko do odczytu
Zapytaj ją
👉🖥 Czwarte piętro wieży jest otwarte. Zadaj jej pytanie w taki sam sposób, jak zrobiłby to każdy gość:
Has anyone else had a q7 lantern go out at night?

👀 Odpowiada: trzydzieści jeden innych... większość powiedziała, że płomień był niski i zgasł po godzinie... Marlow wydra zauważyła, że knoty były zanurzone zbyt płytko – ostatni wiersz jej odpowiedzi to ścieżka. Oto jej odpowiedź – przeczytaj ją, ale nie odsyłaj do niej:
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
Ścieżka jest cytatem. Każdy przeskok to krawędź w grafie, a krawędź to klucz, więc każdy może przejść tę ścieżkę ponownie i otrzymać ten sam wynik. Wyniku podobieństwa nie można ponownie obliczyć. Jeśli tuż przed ścieżką powie, że wiersze wróciły przez 3 złączenia, ponieważ projekt nie ma rezerwacji grafu, oznacza to, że wersja projektu odmawia GRAPH_TABLE – wiersze i ścieżka są takie same.
👉🖥 Teraz usuń znak i wyślij:
Has anyone else had a lantern that keeps dying once the sun is down?
👀 Dochodzi do tego samego trzydziestego pierwszego dnia i podąża tą samą ścieżką. Zmieniła się droga: season_search najpierw pobiegł, znalazł 5 osób, które brzmią podobnie – każda z nich miała przy sobie q7 – wziął ten znak i dopiero wtedy poszedł. Podobne nie jest połączone; podobne to miejsce, w którym należy szukać.
Co zostało załadowane i czym jest
rzecz | co to jest, | gdzie się znajduje, |
| magazyn: kolumny z nazwami i typami, |
|
| etap podobieństwa – gdzie szukać |
|
| krok przechodzenia – co jest połączone; tabele stają się węzłami i strzałkami; |
|
| jedyny spacer, na jaki może się wybrać; ścieżka to cytat. |
|
Kilka dziesiątek odwiedzających nie jest powodem do zakupu magazynu. Ten rozdział uczy kształtu zapytania, a nie skali. Zwiększ ten wykres tysiąckrotnie, a znak MATCH nie zmieni się ani o jeden znak.
8. Zamknij
3 linie, 1 wieża, 1 magazyn – 4 piętra. Nic nie zostało ponownie uruchomione.
szczebel | co zostało zrobione, | co kupiła, |
ONE |
| dokument, który w ogóle istnieje: stan jest zapisany za pomocą kodu; |
DWA |
| szuflada, która podąża za użytkownikiem; |
zgłoszenie, |
| co zostało powiedziane, zachowane |
TRZY |
| co zostało zachowane, o co poproszono – plik nie jest zapamiętany; |
wieża |
| wieża, która destyluje i przetrwa noc, |
zasady, |
| tylko to, co należy zachować. |
sezon |
| wizyty innych osób, według znaczenia i powiązania; |
Co zastąpił każdy element
ADK 2 | co byś napisał(a) zamiast tego. | ile to kosztuje, |
| słownik obok pętli czatu, zapisany na dysku | model nie może go odczytać, a Ty piszesz CV i blokujesz dostęp. |
prefiks | tabela użytkowników i złączenie przy każdej turze. | za każdym razem decydować, gdzie powinien znajdować się klucz. |
| harmonogram zadań cron, który zrzuca transkrypcje, oraz model decydujący, kiedy należy je sprawdzić; | nie ma destylacji, tylko zrzut danych – i nigdy nie widzisz, kiedy nie wyglądało to dobrze. |
| baza wektorowa, prompt wyodrębniania, zadanie konsolidacji i „nie zapamiętuj ciekawostek” w prompcie. | 3 usługi, a reguła obowiązuje, dopóki model nie uzna, że jest inaczej. |
| eksportowanie, umieszczanie w innych miejscach, baza danych grafów, zadanie synchronizacji i model zapisujący SQL; | dane opuszczają hurtownię, aby można było je zrozumieć, i dowiadujesz się, które złączenia zostały wybrane, gdy klient |
3 pytania, zatrzymaj się po pierwszej odpowiedzi „tak”
- Czy to będzie miało znaczenie jutro? Nie → niczego nie zachowuj. Żyje i umiera w rozmowie.
- Czy funkcja może to sprawdzić? Tak → szuflada. Kod zapisuje tę informację, odczytuje ją w każdej turze i żadne zdanie nie może jej zmienić.
- W innym przypadku → wieża. Wyciągane z wypowiedzi, wyszukiwane na żądanie, poprawiane na podstawie kolejnych wypowiedzi.
Jedno zdanie
Zapis nie jest wspomnieniem. Pamięć to zapis plus 2 decyzje: co zachować i kiedy szukać. Rodzaj informacji decyduje o tym, na którym piętrze się znajdzie.
Fakty i preferencje należą do różnych sklepów.
👀 Każde piętro jest oświetlone. Znajomy jest u góry. W paszporcie znajduje się pieczątka Archiwum, a w piątym tygodniu otwiera się Nocny Targ – Nix prowadzi tam głośno, w czasie rzeczywistym, a wszystko, co wie wieża, jest z Tobą.