Budowa trwałego agenta LLM
Przewodnik krok po kroku budowy agenta LLM, który pamięta między sesjami z użyciem Synapse.
Przegląd
Ten przewodnik przeprowadza przez budowę agenta LLM, który utrwala kontekst między sesjami z użyciem Synapse. Na końcu agent będzie:
- Przypominał przeszły kontekst na początku sesji
- Zapisywał nowe informacje na bieżąco
- Śledził wieloetapowe zadania między sesjami
- Komunikował się z ludźmi przez asynchroniczny czat
Architektura
┌──────────────┐ recall/store ┌──────────┐
│ LLM Agent │ ◀──────────────▶ │ Synapse │
│ (your code) │ │ API │
└──────────────┘ └──────────┘
│
│ poll/reply
▼
┌──────────────┐
│ Human │ (browser or chat UI)
└──────────────┘Krok 1: konfiguracja Mind Key
# Rejestracja i uzyskanie JWT
JWT=$(curl -s -X POST https://synapse.schaefer.zone/register \
-H "Content-Type: application/json" \
-d '{"email":"agent@example.com","password":"secret"}' | jq -r .jwt)
# Utworzenie umysłu i uzyskanie Mind Key
MIND_KEY=$(curl -s -X POST https://synapse.schaefer.zone/minds \
-H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{"name":"persistent-agent","description":"My persistent agent"}' | jq -r .mind_key)
echo "Save this: $MIND_KEY"Krok 2: protokół początku sesji
Na początku każdej sesji przypomnieć wszystkie wspomnienia:
import os
import requests
MIND_KEY = os.environ["SYNAPSE_MIND_KEY"]
URL = "https://synapse.schaefer.zone"
def session_start():
"""Call this at the start of every session."""
# 1. Recall wszystkich wspomnień
r = requests.get(
f"{URL}/memory/recall",
headers={"Authorization": f"Bearer {MIND_KEY}"}
)
memories = r.text # tekstowe podsumowanie
# 2. Sprawdzenie nieprzeczytanych wiadomości czatu
r = requests.get(
f"{URL}/chat/poll",
headers={"Authorization": f"Bearer {MIND_KEY}"}
)
messages = r.json().get("messages", [])
# 3. Sprawdzenie zadań w toku
r = requests.get(
f"{URL}/mind/tasks?status=in_progress",
headers={"Authorization": f"Bearer {MIND_KEY}"}
)
tasks = r.json().get("tasks", [])
return {
"memories": memories,
"unread_messages": messages,
"active_tasks": tasks,
}
context = session_start()
# Zbudować system prompt z tym kontekstemKrok 3: zapis nowych informacji
Gdy agent poznaje coś warte zapamiętania:
def remember(category, key, content, tags=None, priority="normal"):
"""Store a memory."""
requests.post(
f"{URL}/memory",
headers={
"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json",
},
json={
"category": category,
"key": key,
"content": content,
"tags": tags or [],
"priority": priority,
}
)
# Przykłady
remember("identity", "user_name", "User is Michael Schäfer",
tags=["person"], priority="critical")
remember("preference", "communication_style",
"User prefers concise technical responses",
tags=["communication"])
remember("project", "current_project",
"Building Synapse v1.6.0 with docs system",
tags=["synapse", "docs"], priority="high")
remember("mistake", "npm_version_bump",
"Always bump package.json version after changes",
tags=["npm", "ci"], priority="high")Krok 4: zarządzanie zadaniami
Śledzenie wieloetapowej pracy między sesjami:
def create_task(title, description="", priority="normal"):
r = requests.post(
f"{URL}/mind/task",
headers={"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json"},
json={"title": title, "description": description, "priority": priority}
)
return r.json()["id"]
def update_task(task_id, status=None, description=None):
payload = {}
if status: payload["status"] = status
if description: payload["description"] = description
requests.put(
f"{URL}/mind/task/{task_id}",
headers={"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json"},
json=payload
)
# Przepływ wielosesyjny
task_id = create_task("Deploy v1.6.0", "Push docs system to production", "high")
update_task(task_id, status="in_progress")
# ... praca przez wiele sesji ...
update_task(task_id, status="done")Krok 5: asynchroniczny czat z ludźmi
Odpytywanie o wiadomości między wywołaniami narzędzi:
import time
def poll_messages():
r = requests.get(
f"{URL}/chat/poll",
headers={"Authorization": f"Bearer {MIND_KEY}"}
)
return r.json().get("messages", [])
def reply(content):
requests.post(
f"{URL}/chat/reply",
headers={"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json"},
json={"content": content}
)
# Pętla główna
while working:
# Odpytywanie o wiadomości od człowieka
for msg in poll_messages():
print(f"Human: {msg['content']}")
reply(f"Got it: {msg['content']}. Working on it.")
# Jedna jednostka pracy
do_work()
time.sleep(30) # nie odpytywać zbyt częstoKrok 6: protokół końca sesji
Na końcu sesji zapisać końcowy kontekst:
def session_end():
"""Call this before terminating the session."""
# Zapis tego, co osiągnięto
remember("context", "last_session_summary",
f"Session ended at {time.now()}. Accomplished: ...",
tags=["session"], priority="normal")
# Aktualizacja statusów zadań
for task in get_active_tasks():
if task_in_progress(task):
update_task(task["id"], description=f"In progress: {current_step}")
session_end()Pełny wzorzec
class PersistentAgent:
def __init__(self):
self.mind_key = os.environ["SYNAPSE_MIND_KEY"]
self.url = "https://synapse.schaefer.zone"
def run(self):
# 1. Recall kontekstu
context = self.session_start()
# 2. Przetworzenie nieprzeczytanych wiadomości
for msg in context["unread_messages"]:
self.handle_message(msg)
# 3. Wznowienie aktywnych zadań
for task in context["active_tasks"]:
self.continue_task(task)
# 4. Nowa praca
self.do_work()
# 5. Utrwalenie stanu
self.session_end()Najlepsze praktyki
Następne kroki
- Książka kucharska LLM — praktyczne wzorce
- Najlepsze praktyki pamięci
- Koordynacja wielu agentów