Skip to content

🔥 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

  1. Service Account: O Cloud Run já tem a service account ifriend-product-matcher@ifriend-platform.iam.gserviceaccount.com configurada, que deve ter acesso ao Firestore.

  2. Primeira Mensagem: A primeira mensagem de um usuário criará automaticamente uma nova sessão.

  3. Renovação de TTL: Cada mensagem renova o TTL da sessão, então uma conversa ativa nunca expira.

  4. 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! 🚀