The Archive — Memory at Agent Valley

1. Giriş

Arşivci Vesper, zemin kattaki masada

Birinci haftada kimin ne dediği soruluyordu. İkinci haftanın sorusu bir sonraki yayını kimin seçeceği idi. Üçüncü haftada koşunun geride ne bıraktığı soruldu. Bu hafta sohbet sona eriyor ve geriye ne kalacağı sorusu akla geliyor. Geriye kalacak olanın nereye gideceğine ise ne tür bir şey olduğu karar veriyor.

Arşiv, bir sorun oluştuğunda vadinin geldiği yerdir. Her şeyi yazan bir kule ve zemin kattaki masada arşivci Vesper. Feneriniz geceleri söner. Gidip sorabilirsiniz.

She is good company. Ayrıca bir ay sonra sizinle tanışmaktan da memnun olur.

Kayıt, anı değildir.

Bu cümle, laboratuvarın tamamını oluşturuyor. Kuleye dört basamakta tırmanacaksınız ve her basamak kulenin bir katını temsil edecek:

basamak

zemin

hatırladığı bilgiler

ne tutuyor

1

masa ve yer

bu ziyaret

session.state · SqliteSessionService

2

ikinci kat, çekmeceniz

bu ziyaretçi

user: öneki

3

üçüncü kat, kule

ne söylendiği

Vertex AI Memory Bank

4

floor four, the season

the whole valley

BigQuery

Her bir üst basamak, alttaki basamaktan bir şeyin düşmesiyle oluşur.

Arşiv, kesilmiş halde. Beş kat ve her birini koruyan küçük bir ekip.

Arşivcinin beş unutma yöntemini zaten biliyorsunuz. Çünkü bunların her biri bir destek görüşmesinde başınıza gelmiştir:

ne diyor

Sorun neydi?

~~1~~

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

~~Tek bir görüşmede unutulma~~: Üçüncü haftada bu sorun düzeltildi.

~~2~~

~~Sizi aktarıyorum. Lütfen baştan başlayın.~~

~~Geçmiş, işlemle birlikte siliniyordu~~ Üçüncü haftada bu sorun da düzeltildi.

3

Merhaba! Bugün size nasıl yardımcı olabilirim?

geçen ay açık bir destek kaydı olan bir kullanıcıya

4

Hasarı açıklayabilir misiniz?

En son fenerine bakıyordu.

5

Bunu daha önce hiç görmedik.

Bu sezon otuz bir kişi soru sordu

Üçüncü satır bu haftayı gösterir. Üç farklı şekilde başarısız oluyor: yeni ziyaret (2. bölüm), fişte satır olmayan cümle (3. bölüm) ve yalnızca süreç içinde var olan arşiv (4. bölüm). Her bir yol bir bölümü oluşturuyor. Dördüncü satır size bırakılıyor: archive/agent.py içindeki look(), kadının fotoğraftaki bir işareti okuduğu yerdir. Beşinci satır, 5. bölümü gösterir ve isteğe bağlıdır.

1-3. haftalara ihtiyacınız yoktur. Ajan, talimat ve birkaç araç içeren bir modeldir. Bu haftanın geri kalanını kendiniz keşfedin.

Üç satır yazacaksınız ve her biri bir anı kavramı olacak:

the line

Nedir?

tool_context.state[CASE] = case

durum, sohbet tarafından değil, kod tarafından yazılır.

CASE = "user:case"

bir önek bir ömürdür

found = await ctx.search_memory(query)

Geri çağırma politikası — dosya hatırlanmıyor

Okumanız için bir satır daha var: yazma politikası await ctx.add_events_to_memory(...). 3. bölümde, bu politikayı kullanan satırı yazmadan önce ne yaptığını okuyabilirsiniz.

Diğer iki basamak ise hiç düzenleme içermez: Bir kule inşa edersiniz (Bellek Bankası'nı barındıran bir Agent Engine) ve aynı kod kendi başına bu kuleye bağlanır. Ayrıca bir depo yüklersiniz (BigQuery), üzerine bir grafik yerleştirirsiniz ve aynı aracıya iki yönetilen sorgu gönderirsiniz (biri anlam, diğeri bağlantı ile ilgili).

Her bölüm aynı döngüyle çalışır ve kendi aracılarınızda kullanacağınız döngü de budur: Kodu okuma → satırı yazma → kulede izleme. Öncelikle hiçbir şey bozuk çalışmaz, hiçbir şey yeniden başlatılmaz ve hiçbir şey Ctrl+C ile kopyalanmaz: Her düzenleme bir sonraki mesajda alınır ve kuleyi bağlamak, Arşiv'in her istekte yeniden okuduğu bir dosyadaki tek satırdır. Kule, yeniden çizim yapan bir çizimdir: Düzenlediğiniz dosyaları okur ve üç düğmesi vardır: 🌙 günü sonlandırır, 🗓 sonraki ziyareti başlatır, 🔥 sizi unutur. Kod ve terminalde yaptığınız diğer her şey.

İki yer ve bunlar asla iş değiştirmez: Sekme 1 terminal, Sekme 2 ise arşivdir. Çalışma tezgahı (adk web), ham oturum durumuna göz atmak için 1. bölümde tam olarak bir kez görünür ve ardından işiniz biter. Aşağıdaki her 👉 simgesi, hangi cihazın kullanıldığını gösterir. 👉💻 1. sekme, 👉🖥 2. sekme, 👉🔬 ise çalışma tezgahıdır. 👉📖, dosya açma ve okuma (değiştirilecek bir şey yok) ve 👉✏️ ise düzenleme yapılan adım türüdür. Bir adımda Vesper'a bir şey söylemeniz gerektiğinde, tam mesaj hemen altındaki blokta yer alır. Bu mesajı olduğu gibi kopyalayın. Başlığı — read only ile biten bir bölümde ise yazılacak, yapıştırılacak veya tıklanacak bir şey yoktur. Buradaki kod, depoda zaten mevcuttur ve çalışmaktadır. Bu kod, okumanız için yazdırılmıştır.

Vesper'ın kapısının üzerindeki cümle en üstteki cümledir. Bu haftanın son cümlesi, sezonun dördüncü haftasının kapanış cümlesi:

Bilgiler ve tercihler farklı depolarda yer alır.

2. 🧰 Kurulum

  • Ne: Bir projeyi işaretleyin veya bir anahtar yapıştırın, yükleyin ve araç zincirinin yeşil olduğunu kanıtlayın.
  • Neden: Burada hiçbir şey başlatılmaz. Her sunucu, ihtiyaç duyduğu adımın hemen öncesinde başlatılır. Bu nedenle, bir ekran açıldığında hangi komutun sahibi olduğunu bilirsiniz.
  • Nasıl: Projeyi oluşturan, Vertex AI'ı yükleyip sizi yönlendiren ve kodunuzu okuyup nerede olduğunuzu söyleyen bir ön kontrol olmak üzere üç komut dosyası.

Bu laboratuvardaki her şey Cloud Shell'de çalışır. Python, uv ve gcloud zaten yüklenmiştir. Gemini'a ise kendi kimlik bilgilerinizi kullanarak Vertex AI üzerinden erişilir. Bu laboratuvarda API anahtarı yoktur ve dizüstü bilgisayarınıza yüklemeniz gereken bir şey yoktur.

Bu laboratuvarda size sunulamayan tek şey, faturalandırmanın etkin olduğu bir Google Cloud projesidir. 1. adımda, ödeme yapabilecek bir hesap oluşturursunuz. 4. adımda ise bu hesabı bir projeye dönüştürür veya 1., 2. ya da 3. haftada oluşturduğunuz Agent Valley projesini kullanırsınız. Bu adımları sırayla uygulayın. 4. adımdan sonraki her adım, 4. adımda belirlenen projeyi okur.

1. Faturalandırma özellikli bir hesap edinin (~1 dakika)

🌐 Bu işlemi diğer tüm işlemlerden önce yapın. Faturalandırmanın etkin olduğu bir Google Hesabı ile oturum açın. Bu tür hesapların herhangi biri kullanılabilir. Sizinki desteklemiyorsa ücretsiz deneme başlatın. Bu işlem, 4. adım için gereken faturalandırma hesabını oluşturur.

2 · Cloud Shell'i açın (~1 dakika)

🌐 Google Cloud Console'un üst kısmındaki Activate Cloud Shell'i (Cloud Shell'i etkinleştir) tıklayın. Bu, başlıktaki terminal şeklindeki simgedir.

Google Cloud Console üstbilgisinden Cloud Shell'i etkinleştirme

🌐 Open Editor'ı (Düzenleyiciyi aç) tıklayın (kalemli açık klasör simgesi). Bu işlem, sol tarafta dosya gezgininin bulunduğu Cloud Shell Düzenleyici'yi açar. 👉✏️ ile işaretlenen adımlarda bu düzenleyiciyi kullanırsınız.

Cloud Shell Düzenleyici'yi açma

🌐 Bugün herhangi bir noktada yetkilendirme yapmanız istenirse devam etmek için Yetkilendir'i tıklayın.

🌐 Düzenleyicide bir terminal açın. Bu terminal 1. sekmedir ve aksi belirtilmediği sürece her 👉💻 adım burada çalıştırılır. 2. Sekme, Arşiv'dir ve 1. bölümde, gerekli adımdan hemen önce açılır. Terminal ekranın alt kısmında değilse Görünüm → Terminal'i kullanarak açın:

Cloud Shell Düzenleyici'de yeni bir terminal açma

🌐 Hangi hesapta oturum açtığınızı kontrol edin. Bu hesap, 1. adımdaki hesap olmalıdır:

gcloud auth list

3. Laboratuvara katılın (~1 dakika)

💻 Depoyu klonlayın. Bu, 1., 2. veya 3. haftanın değil, Arşiv deposudur:

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

4. Projenizi oluşturun veya önceki haftalardan birini yeniden kullanın (~2 dakika)

💻 Bir komut dosyası, faturalandırma hesabınızı bulur, bu hesapta bir proje oluşturur ve Cloud Shell'i bu projeye yönlendirir. Birinci, ikinci veya üçüncü haftayı tamamladıysanız Agent Valley projesi önce bulunur ve yeniden kullanılması teklif edilir. Evet'i tıklayın. Böylece, faturalandırılabilir ikinci bir proje hakkında düşünmenize gerek kalmaz:

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

👀 Seçtiği faturalandırma hesabı için ✓, oluşturduğu veya yeniden kullandığı proje için ✓ ve şu şekilde bir son bekleyin:

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

agent-valley-4271, proje kimliğinizdir. Sizinki farklı rakamlardan oluşur. Bu aşamada dört şey olur:

faturalandırma

Varsa en yeni [YYYY-MM-DD] GDP Credit: hesabını, aksi takdirde açık olan diğer faturalandırma hesaplarını kullanır.

project

Daha önce sahip olduğunuz bir Agent Valley projesini (birinci, ikinci veya üçüncü haftanın projesi) arar ve bu projeyi yeniden kullanmayı teklif eder. Aksi takdirde agent-valley-XXXX oluşturur ve bu faturalandırma hesabını projeye bağlar.

seçer

Kimliği ~/project_id.txt dosyasına yazar ve gcloud config set project komutunu çalıştırır. Bu nedenle, bundan sonraki hiçbir işlemde kimliği yazmanız istenmez.

waits

projenin yayınlanmasına izin verilene kadar iki dakika boyunca anketler

🌐 Aynı proje artık konsolda. Projenin kimliği, kontrol panelindeki Proje bilgileri kartında yer alıyor:

Konsol kontrol panelindeki proje kimliğiniz

5. Vertex AI'ı yükleme ve Vertex AI'a yönlendirme (~3 dakika)

💻 uv yükleyin, ADK'yı Vertex AI'a gönderen üç değişkeni dışa aktarın ve kurulumu çalıştırın:

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

4. adımda ayarlandığı için $(gcloud config get project) döndürülecek bir değere sahip. 4. adımın ilk sırada yer almasının nedeni budur.

setup_codelab.sh, idempotent'tır. Yani herhangi bir sayıda yeniden çalıştırmak güvenlidir. Bu kod, sırasıyla beş işlem yapar:

api

4. adımda seçilen projeyi okur ve üzerinde aiplatform.googleapis.com (Vertex AI ve Memory Bank'ı barındıran Agent Engine) ile bigquery.googleapis.com (5. bölümdeki depo) hizmetlerini etkinleştirir.

uv env

uv venv, .venv oluşturur veya mevcut olanı yeniden kullanır, ardından uv sync, uv.lock'ın sabitlediği öğeleri (google-adk, google-genai ve bunların altındaki her şey) tam olarak yükler.

site

npm ci, site/ içinde çalışır. Arşivin kendisi bir Next.js uygulamasıdır. Bu nedenle, 1. bölümdeki bash valley.sh'ın indirmesi gereken bir şey kalmamıştır. Paketler zaten mevcutsa atlanır.

.env

Laboratuvarın okuduğu değişkenleri (GOOGLE_GENAI_USE_VERTEXAI, GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION, MEMORY_BANK_LOCATION ve BQ_DATASET) yazar ve hiçbir yerde API anahtarı bulunmaz.

model kontrolü

Gemini'a gerçek bir çağrı gönderir. Böylece kötü bir proje, kurulum sırasında başarısız olur ve daha sonra bölüm içinde başarısız olmaz.

6. Yeşil olduğunu kanıtlayın (~1 dakika)

💻 Aktarım öncesi denetimi çalıştırın. Her işaret, tahminden ziyade gerçek bir sorgudur:

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

👀 Ön kontrol, kimlik bilgilerinizin çalıştığını kanıtlamak için modele bir soru sorar, Arşiv'in paketlerinin yerinde olup olmadığını kontrol eder, ardından kodunuzu okur ve bu haftanın ilerleme çubuğunu yazdırır:

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

Üçü zaten işaretlenmiş. Bunlar yalnızca okuduğunuz e-postalardır. Üçü yazdığınız satırlar, biri ise inşa ettiğiniz kule. Laboratuvarın herhangi bir noktasında ön kontrolü tekrar çalıştırın. Ön kontrol, kontrol listesi değil dosyalarınızı okuyarak nerede olduğunuzu söyler.

3. Session, State, SqliteSessionService

  • Ne: Bir satır yazın, tezgahı bir kez başlatın ve fişin dolmasını izleyin, ardından aynısını kulede yapın, sonra da neden geceyi atlattığını okuyun.
  • Neden? Hafızayla ilgili ilk bilmeniz gereken şey, hiçbir şeyin kendi başına hatırlanmadığıdır. Bir kullanıcı tarafından yazılır.
  • Nasıl: agent.py içinde bir satır oluşturun ve başka hiçbir şeyi değiştirmeyin.

BİRİNİ DÜZENLE

👉📖 archive/agent.py uygulamasını açıp write_down öğesini bulun. Şu kişiye oku 👉:

    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}}

İşlev, yerel bir sözlükte fişi oluşturur ve ardından döndürür. Yerel sözlük, aramayla birlikte sona erer. Bu şekilde çalıştırıldığında Vesper sizi mükemmel bir şekilde anlıyor: dört write_down çağrısı yapılıyor, her biri "written" yanıtını veriyor ve oturum durumu boş kalıyor çünkü hiçbir zaman oturuma ulaşılmıyor. Seni duydu. Hiçbir şey yazılmadı.

👉✏️ archive/agent.py içinde, write_down bölümünde: Bir satırın önündeki # simgesini (# ve ardından gelen boşluk) silin. Önce:

    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}}

Sonra:

    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}}

Kaydet'i tıklayın.

Fiş doldurulur

👉💻 Çalışma alanını başlatın. Laboratuvarda bu pencereyi yalnızca bir kez açarsınız. Oturum durumunu olduğu gibi, ham JSON olarak gösteren tek pencere budur:

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

👉🔬 Web önizlemesi → 8000 bağlantı noktasında önizle'yi (Web önizlemesi düğmesi, Cloud Shell'in sağ üst kısmındaki pencere üzerinde göz simgesidir) kullanarak çalışma tezgahını açın. Arşivle'yi seçin ve herhangi bir şey yazmadan önce sol panelde Durum'u tıklayın.

👀 Boş. Henüz kimse bir şey söylemedi.

👉🔬 Şimdi tek bir mesajda şunları söyleyin:

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

👀 Dört write_down çip yanıyor. Birini tıklayıp JSON'ı okuyun: "written": {"no": "k7f2"}. Şimdi State'i (Durum) tekrar tıklayın.

Dört şey, dört alan, bir mesaj

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

👀 Bir mesajın içinde önce boş, sonra dolu. Bu, hatırladığı şeydir ve kendi başına görünmemiştir. Bunu yazan satırı siz yazdınız. Mekanizma tamamen bu şekildedir: tool_context.state içine yazan basit bir işlev ve ziyaretçi, fişteki bir satıra uyan bir şey söylediğinde bu işlevi kullanmasını söyleyen bir talimat.

👉🔬 Ona şunu sorun:

What's my case number?

👀 k7f2. Kız, kağıttan okuyor. Without EDIT ONE she would have asked you for it — line one of the support list, inside one conversation.

İki koruma, kağıt formunda olan fişlerdir: Her biri bir kez yazılmış dört kısa çizgi. Göründüğünden daha önemlidir. Bu bilgiler olmadan model, sohbetin tamamını symptom içine dökebileceğini keşfeder ve 3. bölüm (bütün amacı kayıt fişinde bunun için satır yok olan bölüm) sessizce doğru olmaktan çıkar. Bir mağazanın şekli, onu yazan kod tarafından zorunlu kılınır veya zorunlu kılınmaz.

Şimdi kuleye git

👉💻 Çalışma tezgahını tamamladınız. Çalışma tezgahını çalışır durumda bırakın veya sekmesini kapatın. Laboratuvarın geri kalanı Arşiv'de yer alır. İkinci bir terminal sekmesi (sekme 2: Arşiv) açın:

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

👉🖥 Arşivi Web Önizlemesi → Bağlantı noktasını değiştir ile açın, 3440 yazın ve Değiştir ve Önizle'yi tıklayın. 3440, Web Önizleme'nin hızlı listesinde yer almıyor. Varsayılan olarak 8080 kullanılıyor. Bu nedenle, bu bağlantı noktasını bir kez manuel olarak ayarlamanız gerekiyor. ▶ Başlat'a ve ardından Arşiv'e basın. Kapıdasınız. İsteyen kişiyi (ad ve tür) seçip içeri girin.

Kule, kesilmiş

👀 Bir bina. Vesper, zemin kattaki masada oturuyor ve orada konuşuyorsunuz. Üstünde: birinci kat, ikinci kat, üçüncü kat ve karanlık bir tavan arası. Dört basamak, dört katı temsil eder. Tırmandığınız kat sayısı kadar yukarı çıkabildiğiniz için tanıdığınız kişi zemin katta oturuyor. Çizimin yanındaki sütunda, her katta şu anda neler olduğu açıklanıyor. Girişteki tabloda yer alan dört mağaza aynı sırada gösteriliyor. Sağ taraftaki hiçbir şey düğme değildir.

👉🖥 Aynı dört şeyi (bu mesajın aynısını) sohbetin altındaki kutuya yapıştırıp Enter tuşuna basın:

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

Masanın üzerinde dört çizgi ve yanında aynı dört çizgi

👀 Masayı izleyin. Fiş, çizimin üzerinde ve yanındaki fiş bölümünde satır satır yazılır. Aynı araç, aynı durum: Kule yalnızca write_down'nın yazdıklarını çiziyor ve laboratuvarın geri kalanında da bunu yapmaya devam edecek.

She remembers overnight — read only

Yazdıklarınız ve anlamları

the line

Nedir?

nerede bulunur?

tool_context.state[CASE] = case

oturum durumu: kod tarafından yazılır, talimat tarafından okunur

masa · session.state

SqliteSessionService(DB): Yalnızca okuduğunuzda

Oturum deposu: Bir dosyada ziyaret, bir süreçte değil

birinci kat · archive.db

Bu basamak bir ziyarete ulaşıyor ve kapanış saatine kadar geçerliliğini koruyor. Bir sonraki ziyarette bu bilgiler kalıcı olmaz.

4. Kullanıcı durumu

  • Ne: Bir ay sonra geri geldiğinizde fişin kaybolduğunu görüyorsunuz. Beş karakter ve sizi takip ediyor.
  • Neden: Bir oturum, tek bir ziyarettir. Bir sonraki ziyaret yeni bir oturumdur ve son oturum hiç görülmemiştir.
  • Nasıl: state.py içinde beş karakter.

Bir ay sonra. Tanıştığımıza memnun oldum.

Buradan basın

👉🖥 1 ay sonra'ya basın. Bu, aynı ziyaretçi için yeni bir oturumdur. Yeni bir görüşme başlatma, üçüncü haftadaki gibi.

Arşive hoş geldiniz. Bugün size nasıl yardımcı olabilirim?

👉🖥 Kuleye bakın. Birinci katta bu ziyaretle ilgili başka bir kitap var. İkinci kattaki çekmece boş. Masanın üzerindeki kağıt boş.

Birinci katta başka bir kitap; çekmece boş; not kağıdı boş

👀 Neden: Fiş, oturum durumuna yazılır ve oturum bu ziyaret anlamına gelir. Ziyaret sayısı değiştiğinde, oturum sayısı değiştiğinde Hiçbir şey aktarılmadı çünkü aktarılması istenmedi. Son ziyaret hâlâ dosyada (yani birinci katın ilk kitabında) yer alıyor ancak fiş, tek ziyaretlik bir anahtarla yazılmış.

EDIT TWO

👉✏️ archive/state.py seçeneğini açın. 👉 simgesini bulun. Önce:

# 👉 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"

Sonra:

CASE = "user:case"

Kaydet'i tıklayın. Yeniden başlatma yok: Arşiv, her iletide kodunuzu yeniden içe aktarır.

👉🖥 Aynı dört şeyi tekrar yapıştırın. Bu mesajı aynen yapıştırın:

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

👉🖥 Ardından, 🗓 bir ay sonra düğmesine tekrar basın.

Üzerinde ad yazan çekmece

👀 İkinci kattaki çekmecenin üzerinde adınız yazıyor ve dört alan içinde. Masanın üzerindeki kağıt, siz içeri girdiğinizde çekmeceden çıkarılan aynı dört satırdan oluşuyor. Tanıdığınız kişi bir üst kata çıktı. Her ziyarette aynı anahtar, tek bir değer: İşte bu, önekin işini yapmasıdır.

Önek, ömür boyu geçerlidir.

önek

ne kadar süreyle yaşar?

hangi kat

(yok)

bu ziyaret

masa

user:

bu ziyaretçinin yaptığı her ziyaret

ikinci kat, çekmeceniz

app:

herkes, sonsuza kadar

dördüncü katın bir bölümü

temp:

bu dönüşte yalnızca — merdivenlere bile çıkmaz

—

Bir masa, dört çekmece. Bu bölümde bunlardan biri ele alınmaktadır.

She knows you now

👉🖥 Bu ziyaret yepyeni ve henüz hiçbir şey söylemediniz. Ona şunu sor:

What did I bring in last time?

👀 Fener getirdiğinizi not etmiştim, k7f2 numaralı destek kaydı. q7 ile işaretlenmiş ve gece sürekli kapandığını belirtmişsiniz. Bu ziyaret, bir mesajlık ve mesajın adı yok. Bu, kullanıcı düzeyinde durumun işini yapmasıdır: Ziyaretçi tek kelime etmeden önce, yaptığı her ziyarette bir user: anahtarı bulunur.

Çekmecede, fişteki dört satır dışında hiçbir şey yok. Fişte satırı olmayan şeyler (ne denediğiniz, neden önemsediğiniz, yeni bir tane isteyip istemediğiniz) hiçbir yere gitmez ve bir ay sonra kaybolur. Çekmece ayı geçiyor. Cümleler ise bu şekilde değildir. 3. Bölüm bu konuyu ele almaktadır.

Yazdıklarınız ve anlamları

the line

Nedir?

nerede bulunur?

CASE = "user:case"

Önek, yaşam boyu geçerlidir. Ziyaret yerine ziyaretçi kapsamlı aynı anahtar kullanılır.

ikinci kat · user: eyaleti

Bu basamak bir ziyaretçiye ulaşıyor. Çekmece sizi takip eder ancak görüşme takip etmez.

5. InMemoryMemoryService

  • Ne: Günü dolduran satırı okuyun, soran satırı yazın, ardından bir kapanış zamanı ve bir soru.
  • Neden: Fiş bir formdur. Form, verdiğiniz satırları içerir. İnsanlar satır satır konuşmaz ve söylediklerini kaydetmek, hatırlamanın sadece yarısıdır.
  • Nasıl: file okunur; recall içinde bir satır; ardından bir 🌙, bir 🗓 ve bir soru.

Kapanış saati. Rafların yanından geri yürüyor.

Eve giderken yaptıkları (yalnızca okuma)

Alan hatırlanmıyor

Bu satır, günü rafa kaldırır. Bu işlemde herhangi bir öğe kaldırılmaz. Kimse bakmıyorsa kartlarla dolu bir raf, boş bir raf kadar yardımcı olur. Kod gönderildiğinde de kimse bakmaz: recall, her soruda Vesper'dan önce çalışan düğüm, kuleye hiçbir şey sormaz. Doğru anda hatırlayamadığınız bilgiler bellek değil, günlüktür. İzleme ise diğer yarısıdır ve onu yazmak size kalmıştır.

ÜÇÜNCÜ BÖLÜM: Soru sorma

👉📖 archive/agent.py bölümünde, file'nin hemen üstündeki işlev olan recall'i bulun. Bu, her soruda Vesper'dan önce çalışan basit bir işlev düğümüdür. Ne zaman bakılacağına model karar vermez. Bu nedenle, hiçbir şey bulamadığı zamanlar da görünür. Şu kişiye oku 👉:

    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

👉✏️ archive/agent.py bölümünde, recall içinde: Bir satırın önündeki # simgesini ve ardından gelen boşluğu silin.# Önce:

        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:

Sonra:

        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:

pass'ı olduğu yerde bırakın. found zaten None üzerinde olduğundan şu anda hiçbir işe yaramaz.

Kaydet'i tıklayın. Yeniden başlatma yok.

İki satır, iki politika ve bunlardan birini siz yazdınız. Yazma politikası, nelerin ve ne zaman (kapanış zamanı, tüm gün) saklanacağına karar verir. Geri çağırma politikası, ne zaman ve neyle (her soru, sorunun kendisi) bakılacağına karar verir. ADK, fiilleri (add_events_to_memory, search_memory) sağlar ve politika kapsamı dışında kalır. Bu doğru bir bölümdür ve bu nedenle soruyu yazmak size düşer.

Kapanış saati

👉🖥 Fişte satırı olmayan üç şey söyle. Bir veya üç mesaj:

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.

Buraya basın

👉🖥 Ardından 🌙 Bugünlük bu kadar'a basın.

The words rise

👀 Masayı izleyin. Söylediğin üç şey kayıktan ayrılıp yukarı doğru süzülüyor ve üçüncü kata iniyor. Kulenin yanındaki kartlarda, gönderdiğiniz her mesaj için bir kart, quote işaretiyle işaretlenmiş, kelime kelime cümleleriniz ve üzerlerinde bu işlemde ifadesi yer alır. Masanın üzerindeki lamba, iniş yapılana kadar yanmaya devam eder.

Bir ay sonra,

👉🖥 🗓 Bir ay sonra'ya basın ve şunu sorun:

What have I already tried?

👀 Daha yükseğe asmayı denediniz ancak bu işe yaramadı. Biliyor. Fişte bunun için bir satır yoktu ve hiçbir zaman olmadı. Bu nedenle çekmece bu soruya yanıt veremezdi. recall kartı buldu, ctx.state["recalled"] içine yazdı ve talimatı bu şekilde. Tek satır fark vardır.

Ve her şey onun kafasında

Kulenin yanındaki kartlara bakın: bu işlemde. Şu anda bellek InMemoryMemoryService (bash valley.sh içindeki bir sözlük) olarak çalışıyor ve bu işlem devam ettiği sürece kullanılabiliyor. Kuleyi bu gece kapat ve yarın aç: Kitaplar birinci katta, çekmece ikinci katta ve üçüncü kat karanlık. Büyük/küçük harf durumu dosyada korunur. Söyledikleriniz süreçte yer alıyordu ve süreç sona erdi.

Kalıcılık, hafıza değildir.

Üçüncü kattaki iki sorun şunlardır: Süreç içinde olması ve kendi kelimelerinizle yazılmış olması (bir alıntı, olgu değil). Bir sonraki bölümde, hiç kod kullanmadan her ikisi de düzeltiliyor.

Okuduklarınız, yazdıklarınız ve ne olduğu

the line

Nedir?

nerede bulunur?

await ctx.add_events_to_memory(events, custom_metadata=FILING): Yalnızca okuduğunuzda

Yazma politikası: Kapanış saatinde tüm gün

üçüncü kat · bellek hizmeti

found = await ctx.search_memory(query) — EDIT THREE

her soruyu yanıtlamadan önce geri çağırma politikasını

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

Bu adım, söylenenleri yakalar ve kendi kelimelerinizle tek bir işlemde sözlükte saklar. Bu ifadenin her iki yarısı da yanlış ve sonraki bölümde her ikisi de hiç kod kullanılmadan düzeltiliyor.

6. MemoryBank

  • Ne: Bir komut dosyası, Hafıza Bankası oluşturur. Zaten sahip olduğunuz iki satır, bu dosyaya bilgi yazmaya ve bilgileri okumaya başlar.
  • Neden? Bir bellek hizmeti, hizmettir. Arşivin bulunduğu yer, ajanın değil dağıtımın kararıdır. Arşivi, ajana dokunmadan değiştirebilirsiniz.
  • Nasıl: make_tower.py simgesini çalıştırın, üç cümle söyleyin, 🌙 simgesine basın, 🗓 simgesine basın, bir soru sorun. Ardından, yazma ve okuma işlemlerine salt okunur bir bakış.

Kuleyi inşa etme

3. Bölüm'ün üçüncü katı, bash valley.sh içinde bir Python sözlüğüydü. Memory Bank, bu katın yönetilen sürümüdür: Projenizdeki bir Agent Engine örneğinde bulunur, cümleleriniz yerine o günden elde edilen bilgileri saklar ve bunları ortak kelimeler yerine anlamlarına göre bulur. Vesper'ı kullanmak için Agent Engine'e dağıtmanız gerekmez. Üzerine hiçbir şey dağıtılmamış bir örnekte yine de Memory Bank bulunur ve komut dosyası da bunu oluşturur: içinde kimsenin yaşamadığı, tek görevi kartları saklamak olan bir kule.

👉💻 1. sekmede (yaklaşık bir dakika içinde):

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

👀 Beklenen:

  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...")

Bir SDK çağrısı (agent_engines.create()) ve .env'ye yazılan bir satır. Arşiv, her istekte bu dosyayı yeniden okur. Bu nedenle yeniden başlatılacak bir işlem yoktur.

İşe yaradığını görün

👉🖥 Üçüncü kata bakın. Kule birkaç saniye içinde kendi kendine yeniden çiziliyor. Kartlar bölümünde artık Anı Bankası yazıyor ve raf boş: 3. bölümdeki üç alıntı süreçteydi ve bu süreçte değil. Üç cümleyi tekrar söyleyin (tek mesaj veya üç mesaj olarak):

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.

👉🖥 🌙 Bugünlük bu kadar'a basın. Kapanış işlemi artık yaklaşık sekiz saniye sürüyor. Kule çıkarılıyor. Ardından üçüncü kata bakın.

Sol: Aklında tuttuğu bilgiler. Doğru: Kulede kalanlar.

👀 Kartlar, cümleleriniz değildir. Geceleri okumak için fenerimi kullanıyorum ama sürekli sönüyor ve Fenerimi daha yükseğe asmayı denedim gibi ifadeler kullanıyorlar. Her biri fact ile işaretlenmiş ve tarih eklenmiş. Özetleme. Giriş olarak bir görüşme yapıldı. Elde edilen sonuçlar gerçeklere dayanır.

👉🖥 🗓 Bir ay sonra seçeneğine basın. Bu, yeni bir ziyaret olduğundan az önce söyledikleriniz artık sohbette yer almıyor. Ardından, kartlarla tek bir kelime bile paylaşmayan şu soruyu sorun:

Should I just get a different lamp?

👀 Hediye olduğu için fenerinizi değiştirmek istemediğinizi ve daha önce daha yükseğe asmayı denediğinizi belirtmişsiniz. Bu sözlerin her biri karttan geliyordu ve yalnızca kart ona bu ziyaretin bir mesajlık olduğunu söyleyebilirdi. Benzerlik araması Kule, kelimeleri değil anlamı eşleştiriyor. Soruda lamba ve farklı kelimeleri yer alırken kartta fener ve değiştir kelimeleri yer alıyor. Bu işlem artık geçerli değil: Kuleyi bu gece kapatın, kartlar yarın orada olur. Çünkü kartlar bash valley.sh'da değil, Agent Engine'de bulunur.

Yazma ve okuma (yalnızca okuma)

Unutulma hakkı

Buraya basın

👉🖥 Mesaj kutusunun altında 🔥 beni unut'a basın.

👀 Üç kat karanlık ve bir kat aydınlık:

içeriği

🔥 tarihinden sonra

üçüncü kat, kartlar

Ziyaretlerinizden elde edilen bilgileri Memory Bank'ın hatırladığı gerçekler

gone — memories.delete, one card at a time

ikinci kat, çekmece

user:case, bu ziyaretçiyi ziyaretten ziyarete takip eden fiş

temizlendi

masa, fiş

Bu ziyaretin destek kaydı kopyası

temizlendi

birinci kat, kitaplar

Ziyaretlerin kendisi: Ziyaret başına archive.db içinde bir oturum, oturumdaki her mesaj

değişmedi: Sayı değişmez.

Kitaplar, ziyaretin gerçekleştiği, hangi günde gerçekleştiği ve ziyarette ne konuşulduğuyla ilgili kayıtlardır. Kartlar ve çekmece, anıdır: Ziyaretlerden ne öğrendiği ve bir sonraki ziyarete ne taşıdığı. Unutulma talebi, anılarla (bir kişi hakkında elde edilen bilgiler ve bu bilgilerin yol açtığı durum) ilgilidir. Bir ziyaret kaydının da silinip silinmeyeceği, ayrı nedenlerle (denetim izi, destek geçmişi) verilen ayrı bir karardır. Bu laboratuvar, ikisinin ayrıldığını görebilmeniz için kaydı kasıtlı olarak tutar: Kayıt ve bellek aynı şey değildir ve birini unutmak diğerini etkilemez. Bu, Vesper'ın kapısının diğer tarafından görünen cümlesidir.

ADK bellek soyutlaması add_events_to_memory ve search_memory içerir. Silme seçeneği yoktur. Unutma, bir yönetici işlemidir ve temsilci işlemi değildir. Bu nedenle, modelin yanlışlıkla ulaşamayacağı, ham istemcideki archive/tower.py, memories.delete uygulamasında yer alır. Bir aracının unutma yeteneği, hatırlama yeteneği gibi sizin tasarladığınız bir özelliktir.

Oluşturduğunuz ve okuduğunuz içerikler ile bu içeriklerin ne olduğu

şey

Nedir?

nerede bulunur?

make_tower.py → .env'deki AGENT_ENGINE — oluşturuldu, düzenlenmedi, hiçbir şey yeniden başlatılmadı

Hizmet olarak bellek hizmeti: Aracı dışında bir dağıtım kararı

Agent Engine'de Vertex AI Memory Bank

tower_service(engine): Yalnızca okuduğunuzda

Aynı Runner(memory_service=...) yuvası, farklı bir ev

archive/service.py

FILING konumunda "allowed_topics": TOPICS — salt okunur

Nelerin saklanabileceği, istemde değil yazma sırasında belirlenir.

archive/topics.py + kulenin kendi yapılandırması

🔥 → memories.delete — basıldı, yazılmadı

Unutma, bir uygulama işlemidir. ADK'nın bellek API'sinde silme işlemi yoktur.

archive/tower.py

Bu basamak, söylenenlere ulaşıyor. Bir gün geçer, konuların izin verdiği ölçüde özetlenmiş bir bilgi ortaya çıkar ve birinci kattaki kitap hiç yerinden oynamaz.

7. GraphRAG

İsteğe bağlıdır.

  • Ne: Bir komut dosyası, vadinin geçmişini BigQuery'ye yükler, depoda yerleştirmeler oluşturur ve satır taşımadan tablolara grafik yerleştirir. Ardından, Vesper'a iki soru sorulur. Vesper'ın bu sorular için iki yönetilen sorgusu vardır: biri benzer sesler, diğeri ise bağlantılı olanlar için.
  • Neden? Benzer sesler, bağlı olmakla aynı şey değildir. Vektör, nereye bakılacağını; grafik, neyin eklendiğini bulur ve yanıt, izlediği yolu taşımalıdır.
  • Nasıl? — bash scripts/season.sh (bir kez). Bu bölümdeki diğer her şey salt okunurdur.

Vesper'ın kulesi, inşaat nedeniyle sizinle sınırlıdır. (app_name, user_id) Diğer kişilerin ziyaretleri onun anısı değildir ve daha fazla arama yapmak bunu değiştirmez. Bunlar vadinin malıdır ve vadi bunları bir depoda saklar. Bu sezon 31 ziyaretçi, gece Q7 fenerinin sönmesiyle ilgili bir sorunla karşılaştı ve bunlardan biri sorunun nedenini buldu. Bu bölümde, bu veri ambarı yüklenir ve iki sabit sorgu girilir.

Grafik RAG

RAG, önce al, sonra oluştur işlemidir: Doğru kayıtları bulup modele iletin ve bu kayıtlardan yanıt vermesini sağlayın. Düz RAG, benzerliğe göre alır. Soruyu yerleştirin ve en yakın kayıtları çekin. Bu, soruya benzeyen şeyleri bulur ve 4. bölümdeki kulenin durduğu yerdir. Graph RAG, kenarları (bir depoda zaten bulunan anahtarlar) izleyen ikinci bir bilgi getirme adımı ekler. Bu adımda, bulunan benzerliklerden, ona bağlı olan her şeye bilgi getirilir. İki adım farklı soruları yanıtlar ve bu bölümde her ikisini de sormanız sağlanır:

adım

Yanıtladığı soru

nasıl

bu bölümde

benzerlik

Nereye bakmalıyım?

soruyu yerleştirin, VECTOR_SEARCH

season_search — Ziyaretçi işaret getirmediğinde

geçiş

buna ne bağlı?

MATCH bir mülk grafiğindeki yol

season_known_issue — one fixed MATCH

nesil

Ziyaretçiye ne söylemeliyim?

modeli, alıntı olarak yoluyla birlikte

yanıtı

Uygulayın

Sezon, season/ içinde düz CSV'ler olarak gönderilir. Ziyaretçiler, öğeler, istekler, düzeltmeler ve sezonlar, bir destek sisteminin bunları dışa aktaracağı şekilde gönderilir. Bir komut dosyası, onları depoya kadar götürür ve bu bölümde çalıştırdığınız tek şeydir.

👉💻 1. sekmede (yaklaşık üç dakika sürer; her adımı ilerledikçe yazdırır ve başarısız olan ilk adımda durur):

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

👀 Etkinlik sona erdiğinde kulenin dördüncü katı ışıklandırılır ve yanındaki açıklamada açık yazar.

Ne oluşturuldu? (Salt okunur)

Nasıl okuduğu: Salt okunur

Ona sorun

👉🖥 Kulede dördüncü kat açık. Ziyaretçilerin sorduğu gibi sorun:

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

Yanıtlıyor ve son satırda yol gösteriliyor.

👀 Cevap veriyor: Otuz bir kişi daha... Çoğu, alevin alçakta kaldığını ve bir saat sonra söndüğünü söyledi... Su samuru Marlow, fitillerin çok sığ bir şekilde batırıldığını fark etti ve yanıtının son satırı yol tarifi. Bu, kullanıcının çıktısıdır. Okuyun ancak kullanıcıya geri göndermeyin:

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

Yol, alıntıdır. Bu grafikteki her adım bir kenardır ve kenar bir anahtar olduğundan herkes aynı adımları tekrar atarak aynı otuz biri elde edebilir. Benzerlik puanı, kimse tarafından tekrar incelenemez. Yolun hemen öncesinde, projenin grafik rezervasyonu olmadığı için satırların üç birleştirme yoluyla geri geldiğini söylüyorsa bu, projenizin sürümünün GRAPH_TABLE'ı reddettiği anlamına gelir. Satırlar ve yol aynıdır.

👉🖥 Şimdi işareti kaldırın ve şunu gönderin:

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

👀 Aynı otuz bir ve aynı yola ulaşıyor. Değişen şey yol oldu: season_search önce koştu, sesi birbirine benzeyen beş ziyaretçi buldu (her biri q7 taşıyordu), o işareti aldı ve ancak ondan sonra yürüdü. Benzer bağlı değil; benzer, bakılacak yerdir.

Yüklenen içerik ve içeriğin türü

şey

Nedir?

nerede bulunur?

bq load ile açık şemalar: Çalıştırıldı, yazılmadı

Bir depo: adları ve türleri olan sütunlar

archive.visitors / items / asks / fixes / seasons

ML.GENERATE_EMBEDDING + VECTOR_SEARCH

Benzerlik adımı: Nereye bakmalısınız?

archive.ask_embeddings, embedder modeli

CREATE PROPERTY GRAPH: Satır taşınmadı

geçiş adımı: neyin bağlı olduğu; tablolar düğüm, oklar ise kenar olur

archive.season_graph

GQL içinde archive/season/__init__.py: bir parametre

Yürüyebileceği tek yol; yol, alıntıdır

season_known_issue(mark)

Birkaç düzine ziyaretçi, depo satın almak için yeterli bir neden değildir. Bu bölümde, ölçek değil sorgunun şekli öğretilir. Bu grafiği bin kat büyüttüğünüzde MATCH bir karakter bile değişmez.

8. Kapat

Üç hat, bir kule, bir depo (dört katlı). Hiçbir şey yeniden başlatılmadı.

basamak

ne yaptığınız

ne satın aldığı

ONE

tool_context.state[CASE] = case — bir düzenleme

Herhangi bir hata var: Durum, kod tarafından yazılıyor

İKİ

CASE = "user:case" — bir düzenleme

Ziyaretçiyi takip eden bir çekmece

dosyalama

await ctx.add_events_to_memory(..., custom_metadata=FILING): Okundu, yazılmadı

ne söylendi, ne saklandı

ÜÇ

found = await ctx.search_memory(query) — bir düzenleme

ne saklandı, ne istendi? Dosya hatırlanmıyor.

kule

make_tower.py, ardından .env içinde AGENT_ENGINE — tek bir satırla oluşturulup bağlanır, hiçbir şey yeniden başlatılmaz

damıtma yapan ve geceyi atlatan bir kule

kurallar

FILING dilinde allowed_topics — yazılı değil, okunmuş

yalnızca saklanması gerekenler

sezon

season.sh — yüklü, yerleştirilmiş, üzerine grafik yerleştirilmiş, biriyle yürünmüş MATCH

Diğer kullanıcıların ziyaretleri (anlam ve bağlantıya göre)

Her parçanın yerine ne konulduğu

ADK 2

Bunun yerine ne yazacağınız

bunun size maliyeti

session.state + bir araç, SqliteSessionService tarafından saklanır

Sohbet döngüsünün yanında, kendiniz diske kaydedilmiş bir sözlük

Model bunu okuyamaz ve öz geçmişi ve kilitlemeyi siz yazarsınız.

user: öneki

kullanıcı tablosu ve her dönüşte birleştirme

Her seferinde bir anahtarın nereye ait olduğuna karar verme

İşlev düğümünde add_events_to_memory + search_memory

transkriptleri boşaltan bir cron ve ne zaman bakılacağına karar veren model

dökülür, hiçbir şey damıtılmaz ve hiçbir zaman iyi görünmediği zamanları görmezsiniz.

VertexAiMemoryBankService + allowed_topics

bir vektör deposu, bir çıkarma istemi, bir birleştirme işi ve istemde "lütfen trivia bilgilerini hatırlama"

üç hizmet ve model aksi yönde düşünene kadar kural geçerli olur

VECTOR_SEARCH + one fixed GQL MATCH

dışa aktarma, başka bir yere yerleştirme, grafik veritabanı, senkronizasyon işi ve modelin SQL yazması

Veriler, anlaşılmak üzere depodan ayrılır ve bir müşteri işlem yaptığında hangi birleştirmelerin tahmin edildiğini öğrenirsiniz.

Üç soru, ilk "evet" yanıtında durdurma

  1. Yarın bunun bir önemi olacak mı? Hayır → hiçbir şeyi saklamayın. Bu özellik, görüşmede etkinleştirilip devre dışı bırakılabilir.
  2. Bir işlev bunu kontrol edebilir mi? Evet → Çekmece Kod bunu yazar, her dönüşte okur ve hiçbir cümle bunu değiştiremez.
  3. Aksi halde → kule. Söylenenlerden damıtılır, istendiğinde bakılır, söylenenlerle revize edilir.

Tek cümle

Kayıt, anı değildir. Anılar, kayıtlar ve iki karardan (nelerin saklanacağı ve ne zaman bakılacağı) oluşur. Ne tür bir şey olduğu, hangi katta yer alacağını belirler.

Olgular ve tercihler farklı depolarda yer alır.

👀 Her kat aydınlatılmış. Tanıdığınız kişi en üstte gösterilir. Arşiv damgası pasaportta yer alır. Beşinci hafta ise Gece Pazarı'nın kapılarını açar. Burada Nix, kulede öğrendiği her şeyi kullanarak sahnede canlı ve yüksek sesli performans sergiler.