🔥 Gestão de Sessão com Firestore¶
✅ Implementação Completa¶
A gestão de sessão do agente foi migrada de InMemorySessionService (efêmero) para FirestoreSessionService (persistente).
📦 Arquivos Modificados¶
1. session/session_manager.py - ⭐ Novo¶
Implementação completa de SessionService usando Firestore:
- ✅
create_session()- Cria nova sessão - ✅
get_session()- Recupera sessão existente - ✅
update_session()- Adiciona mensagens à sessão - ✅
delete_session()- Remove sessão - ✅
list_sessions()- Lista sessões de um usuário - ✅
cleanup_expired_sessions()- Remove sessões expiradas
Recursos:
- TTL configurável (padrão: 60 minutos)
- Persistência automática no Firestore
- Renovação automática do TTL a cada mensagem
- Conversão automática de Content para formato serializável
2. agent.py¶
# ANTES
from google.adk.sessions import InMemorySessionService
session_service = InMemorySessionService()
# DEPOIS
from busca_produtos.session.session_manager import FirestoreSessionService
session_service = FirestoreSessionService(
collection_name="adk_sessions",
session_ttl_minutes=60
)
3. slack_bot.py¶
# ANTES
session_service = InMemorySessionService()
# DEPOIS
session_service = FirestoreSessionService(
collection_name="slack_bot_sessions",
session_ttl_minutes=60
)
4. requirements.txt¶
Adicionado:
google-cloud-firestore
5. session/__init__.py - Novo¶
Exporta FirestoreSessionService para facilitar imports.
🗄️ Estrutura no Firestore¶
Coleção: slack_bot_sessions¶
Cada documento representa uma sessão:
{
"app_name": "ifriend_busca_produtos_slack",
"user_id": "U09M2V38S75",
"session_id": "U09M2V38S75_slack_C123456",
"created_at": "2025-11-12T10:30:00Z",
"updated_at": "2025-11-12T10:35:00Z",
"expires_at": "2025-11-12T11:35:00Z",
"messages": [
{
"role": "user",
"parts": [{"text": "Buscar passeios em Roma"}],
"timestamp": "2025-11-12T10:30:00Z"
},
{
"role": "model",
"parts": [{"text": "Encontrei 5 passeios..."}],
"timestamp": "2025-11-12T10:30:15Z"
}
]
}
🎯 Benefícios¶
✅ Antes (InMemorySessionService)¶
- ❌ Sessões perdidas a cada restart do container
- ❌ Sem histórico de conversas
- ❌ Usuário perde contexto se container reiniciar
- ❌ Não escalável (memória local)
✅ Depois (FirestoreSessionService)¶
- ✅ Sessões persistem mesmo com restart
- ✅ Histórico completo de conversas
- ✅ Usuário mantém contexto entre restarts
- ✅ Escalável (Firestore distribuído)
- ✅ TTL automático para limpeza
- ✅ Query por usuário para analytics
🔧 Configuração¶
TTL (Time to Live)¶
Por padrão, sessões expiram após 60 minutos de inatividade.
Para alterar:
session_service = FirestoreSessionService(
collection_name="slack_bot_sessions",
session_ttl_minutes=120 # 2 horas
)
Limpeza de Sessões Expiradas¶
Opcional - pode rodar periodicamente:
# Remove todas as sessões expiradas
count = await session_service.cleanup_expired_sessions()
print(f"Removidas {count} sessões expiradas")
🔐 Permissões Firestore¶
Certifique-se de que a service account tem permissões:
roles/datastore.user
Ou mais específico:
datastore.entities.create
datastore.entities.delete
datastore.entities.get
datastore.entities.list
datastore.entities.update
🧪 Testando¶
1. Teste Local¶
python agent.py
2. Verifique no Firestore Console¶
https://console.firebase.google.com/project/ifriend-platform/firestore
Coleção: slack_bot_sessions
3. Query de Sessões¶
from busca_produtos.session.session_manager import FirestoreSessionService
session_service = FirestoreSessionService()
# Listar todas as sessões de um usuário
sessions = await session_service.list_sessions(
app_name="ifriend_busca_produtos_slack",
user_id="U09M2V38S75"
)
📊 Monitoramento¶
Ver sessões ativas¶
gcloud firestore collections get slack_bot_sessions
Ver documento específico¶
gcloud firestore documents get \
slack_bot_sessions/U09M2V38S75_slack_C123456
🚀 Deploy¶
Após as mudanças, faça o deploy:
./deploy.sh
O Firestore será inicializado automaticamente pela service account configurada no Cloud Run.
📝 Notas Importantes¶
-
Service Account: O Cloud Run já tem a service account
ifriend-product-matcher@ifriend-platform.iam.gserviceaccount.comconfigurada, que deve ter acesso ao Firestore. -
Primeira Mensagem: A primeira mensagem de um usuário criará automaticamente uma nova sessão.
-
Renovação de TTL: Cada mensagem renova o TTL da sessão, então uma conversa ativa nunca expira.
-
Sessão por Canal: Cada canal do Slack tem uma sessão separada (formato:
{user_id}_slack_{channel_id}).
🎉 Pronto!¶
Agora o bot mantém contexto completo das conversas, mesmo com restarts do container! 🚀