✅ Passo 1 Completo: Session.events Carregado¶
🎯 Objetivo¶
Garantir que o Agent tenha acesso ao histórico completo de mensagens dentro da mesma sessão.
❌ Problema Anterior¶
# Antes: get_session() retornava Session com events VAZIO
session = Session(
id=session_id,
app_name=app_name,
user_id=user_id
) # ← session.events = []
✅ Solução Implementada¶
1. Import Event¶
from google.adk.sessions import BaseSessionService, Session, Event
from google.genai import types # Para criar Part objects
2. Método get_session() Atualizado¶
async def get_session(...) -> Optional[Session]:
# Carrega messages do Firestore
events = []
for msg in stored_messages:
# Converte dict → Event object
event = Event(
author=msg.get("role"),
role=msg.get("role"),
content=Content(parts=[types.Part(text=part["text"]) ...])
)
events.append(event)
# Retorna Session COM eventos carregados
session = Session(
id=session_id,
app_name=app_name,
user_id=user_id,
events=events # ← 🔑 KEY!
)
return session
3. Novo Método append_event()¶
async def append_event(session: Session, event: Event) -> None:
"""
Salva interações ao Firestore.
O Runner chama este método após cada resposta do Agent.
"""
# Converte Event → message dict
message_dict = {
"author": event.author,
"role": event.role,
"parts": [...], # Extrai texto do event.content
"timestamp": datetime.now(timezone.utc)
}
# Salva no Firestore
messages.append(message_dict)
doc_ref.update({"messages": messages, ...})
🔄 Fluxo Agora¶
1️⃣ Request 1:
- slack_bot.py chama: runner.run_async(user_id, session_id, mensagem)
- Runner chama: session_service.get_session()
- FirestoreSessionService retorna: Session(events=[])
- Agent processa e responde
- Runner chama: session_service.append_event(session, event_user)
- Runner chama: session_service.append_event(session, event_agent)
✅ Eventos salvos no Firestore
2️⃣ Request 2 (mesmo usuário):
- slack_bot.py chama: runner.run_async(user_id, session_id, nova_mensagem)
- Runner chama: session_service.get_session()
- FirestoreSessionService CARREGA eventos do Firestore
- Retorna: Session(events=[evento1, evento2, evento3])
- Runner passa events ao Agent
- Agent VÊ TODO O HISTÓRICO! ✅
🧪 Validação¶
Teste os métodos críticos:
cd busca_produtos
python -m pytest tests/test_session_service.py -v
Testes incluem:
- ✅ test_session_events_loaded_on_get() - Valida carregamento de eventos
- ✅ test_append_event_saves_to_firestore() - Valida salvamento de eventos
📋 Verificação de Integração¶
Seu código já faz isso CORRETAMENTE:
# slack_bot.py (linha ~30)
runner = Runner(
agent=root_agent,
app_name="ifriend_busca_produtos_slack",
session_service=session_service # ← Usa FirestoreSessionService
)
# slack_bot.py (linha ~110)
async for event in runner.run_async(
user_id=slack_user_id,
session_id=session_id, # Formato: "{user_id}_slack_{channel_id}"
new_message=content
):
# Runner automaticamente:
# 1. Chama get_session() - carrega eventos ✅
# 2. Passa session.events ao Agent ✅
# 3. Chama append_event() após resposta ✅
🎯 Resultado Final¶
ANTES:
Usuário: "Qual é o seu nome?"
Agent: "Sou um agente."
---
Usuário: "O que você respondeu antes?"
Agent: "Não lembro de nada." ❌
DEPOIS:
Usuário: "Qual é o seu nome?"
Agent: "Sou um agente."
---
Usuário: "O que você respondeu antes?"
Agent: "Respondi que sou um agente." ✅
🔄 Próximo: Passo 2¶
Agora que Passo 1 está ✅, implantaremos Passo 2: MemoryService para contexto ENTRE DIFERENTES SESSÕES: - Quando uma sessão termina → salvar em MemoryService - Quando Agent começa nova sessão → buscar contexto histórico - Exemplo: "Lembra quando você me ajudou com X semana passada?"