akira / CHECKLIST_IMPLEMENTACAO.py
akra35567's picture
Upload 190 files
b259a65 verified
Raw
History Blame Contribute Delete
25.2 kB
"""
═══════════════════════════════════════════════════════════════════════
CHECKLIST DE IMPLEMENTAÇÃO β€” PASSO A PASSO
═══════════════════════════════════════════════════════════════════════
Guia prΓ‘tico para aplicar a soluΓ§Γ£o no seu ambiente
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 1: PREPARAÇÃO (30 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE1 = """
βœ“ PASSO 1.1: BACKUP DO CΓ“DIGO EXISTENTE
───────────────────────────────────────────────────────────────
Local: i:\\Isaac Quarenta\\ProgramaΓ§Γ£o\\AKIRA-SOFTEDGE\\
β–‘ Fazer backup de api.py
cp modules/api.py modules/api.py.backup.$(date +%Y%m%d_%H%M%S)
β–‘ Fazer backup de database.py
cp modules/database.py modules/database.py.backup.$(date +%Y%m%d_%H%M%S)
β–‘ Fazer backup de todo o diretΓ³rio modules/
ls -la modules/ > modules_backup_list.txt
βœ“ PASSO 1.2: VERIFICAR NOVOS ARQUIVOS
───────────────────────────────────────────────────────────────
β–‘ context_manager_v2.py βœ… EXISTS (jΓ‘ criado)
β–‘ listen_stream_processor.py βœ… EXISTS (jΓ‘ criado)
β–‘ INTEGRATION_GUIDE.md βœ… EXISTS (jΓ‘ criado)
β–‘ API_PATCH_DETAILED.md βœ… EXISTS (jΓ‘ criado)
β–‘ test_context_isolation.py βœ… EXISTS (jΓ‘ criado)
β–‘ SOLUCAO_ESCALAVEL_CONTEXT_ISOLATION.md βœ… EXISTS (jΓ‘ criado)
β–‘ ARQUITETURA_VISUAL.txt βœ… EXISTS (jΓ‘ criado)
βœ“ PASSO 1.3: VERIFICAR DEPENDÊNCIAS PYTHON
───────────────────────────────────────────────────────────────
NecessΓ‘rios (jΓ‘ devem existir):
β–‘ hashlib (built-in)
β–‘ threading (built-in)
β–‘ dataclasses (built-in)
β–‘ typing (built-in)
β–‘ datetime (built-in)
β–‘ enum (built-in)
β–‘ json (built-in)
β–‘ logging (built-in)
β–‘ re (built-in)
β–‘ time (built-in)
Comandos para verificar:
$ python -c "import hashlib, threading, dataclasses, enum; print('βœ… Tudo OK')"
βœ“ PASSO 1.4: REVISAR DOCUMENTAÇÃO
───────────────────────────────────────────────────────────────
β–‘ Ler ARQUITETURA_VISUAL.txt (compreender fluxo)
β–‘ Ler SOLUCAO_ESCALAVEL_CONTEXT_ISOLATION.md (entender problema/soluΓ§Γ£o)
β–‘ Ler INTEGRATION_GUIDE.md (entender integraΓ§Γ£o)
β–‘ Ler API_PATCH_DETAILED.md (ver modificaΓ§Γ΅es especΓ­ficas)
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 2: TESTES (20 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE2 = """
βœ“ PASSO 2.1: EXECUTAR TESTES ISOLADOS
───────────────────────────────────────────────────────────────
LocaΓ§Γ£o: i:\\Isaac Quarenta\\ProgramaΓ§Γ£o\\AKIRA-SOFTEDGE\\
β–‘ Execute os testes:
cd AKIRA-SOFTEDGE
python test_context_isolation.py
Esperado:
βœ… TEST 1 PASSED
βœ… TEST 2 PASSED
βœ… TEST 3 PASSED
βœ… TEST 4 PASSED
βœ… TEST 5 PASSED
πŸŽ‰ TODOS OS TESTES PASSARAM!
Se falhar:
- Verificar que context_manager_v2.py existe
- Verificar que listen_stream_processor.py existe
- Verificar que ambos estΓ£o em modules/
- Verificar mensagens de erro especΓ­ficas
βœ“ PASSO 2.2: TESTAR ISOLADAMENTE CADA MΓ“DULO
───────────────────────────────────────────────────────────────
β–‘ Testar context_manager_v2:
python -c "
from modules.context_manager_v2 import get_context_manager
cm = get_context_manager()
print('βœ… ContextManagerV2 carregado')
print(f'Stats: {cm.obter_stats()}')
"
β–‘ Testar listen_stream_processor:
python -c "
from modules.listen_stream_processor import get_listen_processor
lp = get_listen_processor()
print('βœ… ListenStreamProcessor carregado')
resultado = lp.processar_mensagem_chegando({
'usuario': 'teste',
'numero': '1234567890',
'texto': '@AKIRA teste',
'tipo_conversa': 'pv'
})
print(f'Resultado: {resultado}')
"
Se tudo OK β†’ continuar para Fase 3
βœ“ PASSO 2.3: VALIDAR ISOLAÇÃO
───────────────────────────────────────────────────────────────
β–‘ Executar test_context_isolation.py novamente
β–‘ Verificar que TEST 4 passa (isolaΓ§Γ£o Isaac vs StefΓ’nio)
β–‘ Se TEST 4 falhar, revisar logic em listen_stream_processor.py
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 3: INTEGRAÇÃO (45 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE3 = """
βœ“ PASSO 3.1: ADICIONAR IMPORTS NO api.py
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: modules/api.py (linha ~10-30)
ANTES:
```python
import json
import hashlib
import logging
from skills_registry import SkillsRegistry
...
```
DEPOIS (ADICIONAR):
```python
import json
import hashlib
import logging
from skills_registry import SkillsRegistry
# βœ… NOVOS IMPORTS PARA CONTEXT V2
from modules.context_manager_v2 import (
ContextManagerV2,
get_context_manager,
MessageType,
ContextType
)
from modules.listen_stream_processor import (
ListenStreamProcessor,
get_listen_processor
)
# Inicializa singletons
ctx_manager = get_context_manager()
listen_processor = get_listen_processor()
...
```
AΓ§Γ£o:
β–‘ Abrir modules/api.py
β–‘ Localizar seΓ§Γ£o de imports
β–‘ Adicionar imports acima
β–‘ SALVAR arquivo
βœ“ PASSO 3.2: MODIFICAR _get_user_context
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: modules/api.py::_get_user_context (line ~2311)
AÇÃO: Seguir API_PATCH_DETAILED.md seΓ§Γ£o "MODIFICATION 2"
β–‘ Abrir api.py
β–‘ Procurar funΓ§Γ£o "_get_user_context"
β–‘ Modificar assinatura (adicionar numero, tipo_conversa, grupo_id)
β–‘ Adicionar lΓ³gica de ContextManagerV2
β–‘ SALVAR e TESTAR
βœ“ PASSO 3.3: INTEGRAR LISTEN STREAM EM akira_endpoint
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: modules/api.py::akira_endpoint (line ~1224)
AÇÃO: Seguir API_PATCH_DETAILED.md seΓ§Γ£o "MODIFICATION 3"
Este Γ© o PRINCIPAL passo:
β–‘ Localizar onde se extrai dados (usuario, numero, texto, tipo_conversa)
β–‘ Adicionar extraΓ§Γ£o de novos campos (referenced_message_author, etc)
β–‘ ANTES de processar LLM:
β”œβ”€ Chamar listen_processor.processar_mensagem_chegando(evento)
β”œβ”€ Verificar resultado_processamento['deve_processar']
β”œβ”€ Se False: retornar jsonify com status 'contextual'
└─ Se True: continuar normalmente
β–‘ Usar listen_processor.obter_contexto_para_resposta() para histΓ³rico
β–‘ SALVAR e TESTAR
βœ“ PASSO 3.4: ACEITAR NOVOS CAMPOS NO PAYLOAD
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: modules/api.py::akira_endpoint (data extraction)
AÇÃO: Adicionar suporte aos novos campos
```python
# βœ… NOVOS CAMPOS PARA LISTEN STREAM
referenced_message_author = data.get('referenced_message_author',
data.get('quoted_author_name', ''))
referenced_message_texto = data.get('referenced_message_texto',
data.get('mensagem_citada', ''))
referenced_message_id = data.get('referenced_message_id',
data.get('message_id_citada', ''))
```
β–‘ Adicionar apΓ³s extraΓ§Γ£o de tipo_conversa/grupo_id
β–‘ SALVAR
βœ“ PASSO 3.5: ATUALIZAR RESPOSTA JSON
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: modules/api.py::akira_endpoint (return jsonify)
AÇÃO: Adicionar campos de debug
```python
return jsonify({
'resposta': resposta,
'modelo_usado': modelo,
'confidence': confidence,
'conversation_id': conversation_id, # βœ… NOVO
'tipo_message': resultado_processamento['tipo_message'], # βœ… NOVO
'participants': participants if tipo_conversa == 'grupo' else [], # βœ… NOVO
...
})
```
β–‘ Localizar primeiro return jsonify em akira_endpoint
β–‘ Adicionar campos acima
β–‘ SALVAR
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 4: ATUALIZAR discord-ts (15 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE4 = """
βœ“ PASSO 4.1: ATUALIZAR APIClient.ts
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: discord-ts/index/modules/APIClient.ts
Adicionar ao payload enviado:
β–‘ tipo_conversa: "pv" | "grupo"
└─ Se Γ© conversa privada ou grupo
β–‘ grupo_id: string | null
└─ ID do grupo (se aplicΓ‘vel)
β–‘ referenced_message_author: string | null
└─ Nome de quem foi mencionado/citado
β–‘ referenced_message_texto: string | null
└─ Texto da mensagem citada
Exemplo de novo payload:
```typescript
const payload = {
usuario: msg.author.username,
numero: msg.author.id,
texto: msg.content,
tipo_conversa: msg.channel.isDMBased() ? 'pv' : 'grupo',
grupo_id: !msg.channel.isDMBased() ? msg.channelId : null,
referenced_message_author: msg.reference?.author?.username || null,
referenced_message_texto: msg.reference?.content || null,
// ... resto dos campos
};
```
β–‘ Modificar APIClient.ts
β–‘ TESTAR com Discord
βœ“ PASSO 4.2: VERIFICAR BAILEYS (WhatsApp)
───────────────────────────────────────────────────────────────
LocalizaΓ§Γ£o: discord-ts/index/modules/BotCore.ts ou similar
Verificar se:
β–‘ tipo_conversa Γ© capturado corretamente
β–‘ grupo_id Γ© enviado quando em grupo
β–‘ quoted messages sΓ£o extraΓ­das
Se nΓ£o estΓ£o:
β–‘ Adicionar lΓ³gica similar ao Discord
β–‘ TESTAR com WhatsApp
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 5: TESTES DE INTEGRAÇÃO (30 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE5 = """
βœ“ PASSO 5.1: TESTE BÁSICO - CONVERSA PRIVADA
───────────────────────────────────────────────────────────────
β–‘ Enviar via POST /akira em conversa privada
Payload:
{
"usuario": "IsaacTest",
"numero": "test_123",
"texto": "Oi AKIRA",
"tipo_conversa": "pv"
}
Esperado:
βœ… deve_processar: true
βœ… tipo_message: "direct"
βœ… resposta: [alguma resposta]
βœ… conversation_id: [hash ΓΊnico]
βœ“ PASSO 5.2: TESTE COM MENÇÃO EM GRUPO
───────────────────────────────────────────────────────────────
β–‘ Enviar em grupo COM @AKIRA
Payload:
{
"usuario": "IsaacTest",
"numero": "test_123",
"texto": "@AKIRA qual Γ© a capital?",
"tipo_conversa": "grupo",
"grupo_id": "test_group_123"
}
Esperado:
βœ… deve_processar: true
βœ… tipo_message: "direct"
βœ… resposta: [resposta da pergunta]
βœ“ PASSO 5.3: TESTE SEM MENÇÃO EM GRUPO
───────────────────────────────────────────────────────────────
β–‘ Enviar em grupo SEM @AKIRA
Payload:
{
"usuario": "StefanioTest",
"numero": "test_456",
"texto": "Bacano",
"tipo_conversa": "grupo",
"grupo_id": "test_group_123"
}
Esperado:
βœ… deve_processar: false
βœ… tipo_message: "contextual"
βœ… resposta: "" (vazia)
βœ… status: "context_registered"
βœ“ PASSO 5.4: TESTE DE ISOLAÇÃO
───────────────────────────────────────────────────────────────
β–‘ Executar sequΓͺncia em grupo:
1. Isaac: "@AKIRA qual Γ© capital de PT?" (responde)
2. StefΓ’nio: "Bacano" (contextual, nΓ£o responde)
3. Isaac: "@AKIRA e da FR?" (responde)
ValidaΓ§Γ£o:
β–‘ AKIRA respondeu em 1 e 3 (ambas Isaac)
β–‘ AKIRA nΓ£o respondeu em 2
β–‘ Logs mostram "πŸ” ClassificaΓ§Γ£o Listen: direct/contextual"
β–‘ conversation_id de Isaac mantΓ©m isolado
βœ“ PASSO 5.5: MONITORAR LOGS
───────────────────────────────────────────────────────────────
Observar no logs:
β–‘ "πŸ“¨ Mensagem chegando: ..."
β–‘ "πŸ” ClassificaΓ§Γ£o Listen: ..."
β–‘ "βœ“ Mensagem contextual (escuta). NΓ£o respondendo." (quando aplicΓ‘vel)
β–‘ "πŸ“– Contexto obtido: X mensagens diretas"
Se tudo OK β†’ Fase 6
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 6: VALIDAÇÃO FINAL (15 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE6 = """
βœ“ PASSO 6.1: VERIFICAR STATS
───────────────────────────────────────────────────────────────
β–‘ Chamar ctx_manager.obter_stats()
Esperado:
{
'total_contexts': N,
'total_messages': M,
'average_msgs_per_context': M/N,
'cache_size': X,
'memory_estimate_mb': Y
}
Validar:
β–‘ memory_estimate_mb < 100MB (escalΓ‘vel)
β–‘ total_contexts growing mas nΓ£o explosivo
βœ“ PASSO 6.2: VERIFICAR ISOLAÇÃO REAL
───────────────────────────────────────────────────────────────
β–‘ Fazer teste completo com 2+ usuΓ‘rios em grupo real
β–‘ Verificar que mensagens de um nΓ£o contamina outro
β–‘ Verificar que AKIRA responde apenas quando mencionada
Exemplo:
- Isaac: "@AKIRA Python Γ© melhor que Java?"
- VocΓͺ em outro grupo: "@AKIRA Qual Γ© o melhor framework?"
- Isaac: "@AKIRA Ok valeu"
βœ“ Confirm: Cada um tem seu prΓ³prio contexto isolado
βœ“ PASSO 6.3: PERFORMANCE
───────────────────────────────────────────────────────────────
β–‘ Medir tempo de resposta com novo sistema
β–‘ Comparar com antes (deve ser ~5-10% mais rΓ‘pido)
β–‘ Verificar que nΓ£o hΓ‘ memory leaks apΓ³s 1 hora de uso
βœ“ PASSO 6.4: ROLLBACK PLAN
───────────────────────────────────────────────────────────────
Se algo der errado:
β–‘ Restaurar api.py do backup:
cp modules/api.py.backup.* modules/api.py
β–‘ Remover imports dos novos mΓ³dulos
β–‘ Reiniciar servidor
β–‘ Verificar que volta ao estado anterior
β–‘ Documentar problema encontrado para debug
"""
# ═══════════════════════════════════════════════════════════════════════
# FASE 7: DEPLOY (5 minutos)
# ═══════════════════════════════════════════════════════════════════════
FASE7 = """
βœ“ PASSO 7.1: DEPLOY EM STAGING
───────────────────────────────────────────────────────────────
β–‘ Deploy do novo cΓ³digo em staging
β–‘ Rodar Fase 5 (testes de integraΓ§Γ£o) em staging
β–‘ Monitorar por 2-4 horas
β–‘ Verificar que nΓ£o hΓ‘ errors no log
βœ“ PASSO 7.2: DEPLOY EM PRODUÇÃO
───────────────────────────────────────────────────────────────
β–‘ Fazer ΓΊltimo backup do api.py em produΓ§Γ£o
β–‘ Deploy da soluΓ§Γ£o
β–‘ Monitorar logs continuamente
β–‘ Se problema: executar rollback plan
βœ“ PASSO 7.3: MONITORAMENTO PΓ“S-DEPLOY
───────────────────────────────────────────────────────────────
β–‘ Primeira hora: Verificar a cada 5 minutos
β–‘ Primeiras 24h: Verificar a cada 30 minutos
β–‘ ApΓ³s 24h: Verificar diariamente
MΓ©tricas a monitorar:
β”œβ”€ Taxa de erro (deve ser < 0.1%)
β”œβ”€ Tempo mΓ©dio de resposta (deve ser < 2s)
β”œβ”€ Memory usage (deve ser estΓ‘vel)
β”œβ”€ Context isolation (validar com teste manual diΓ‘rio)
└─ User complaints (deve ser zero sobre context mix)
"""
# ═══════════════════════════════════════════════════════════════════════
# RESUMO DE TEMPO ESTIMADO
# ═══════════════════════════════════════════════════════════════════════
RESUMO_TEMPO = """
FASE 1 (PreparaΓ§Γ£o): 30 minutos
β”œβ”€ Backup
β”œβ”€ Verificar novos arquivos
β”œβ”€ Verificar dependΓͺncias
└─ Revisar documentaΓ§Γ£o
FASE 2 (Testes Isolados): 20 minutos
β”œβ”€ Executar test_context_isolation.py
β”œβ”€ Testar cada mΓ³dulo
└─ Validar isolaΓ§Γ£o
FASE 3 (IntegraΓ§Γ£o): 45 minutos
β”œβ”€ Adicionar imports
β”œβ”€ Modificar _get_user_context
β”œβ”€ Integrar listen stream
β”œβ”€ Aceitar novos campos
└─ Atualizar resposta JSON
FASE 4 (Atualizar discord-ts): 15 minutos
β”œβ”€ Atualizar APIClient.ts
└─ Verificar Baileys
FASE 5 (Testes de IntegraΓ§Γ£o): 30 minutos
β”œβ”€ Teste PV
β”œβ”€ Teste menΓ§Γ£o em grupo
β”œβ”€ Teste sem menΓ§Γ£o
β”œβ”€ Teste isolaΓ§Γ£o
└─ Monitorar logs
FASE 6 (ValidaΓ§Γ£o): 15 minutos
β”œβ”€ Verificar stats
β”œβ”€ Verificar isolaΓ§Γ£o real
β”œβ”€ Performance check
└─ Rollback plan
FASE 7 (Deploy): 5 minutos
β”œβ”€ Deploy staging
β”œβ”€ Deploy produΓ§Γ£o
└─ Monitoramento inicial
────────────────────────────────────────────────────────────────
TOTAL: ~2 horas 50 minutos (primeira vez)
PRΓ“XIMAS IMPLEMENTAÇÕES: ~30 minutos (depois de entender)
────────────────────────────────────────────────────────────────
"""
# ═══════════════════════════════════════════════════════════════════════
# TROUBLESHOOTING RÁPIDO
# ═══════════════════════════════════════════════════════════════════════
TROUBLESHOOTING = """
PROBLEMA: "ModuleNotFoundError: No module named 'context_manager_v2'"
SOLUÇÃO:
β–‘ Verificar que context_manager_v2.py estΓ‘ em modules/
β–‘ Verificar que __init__.py existe em modules/
β–‘ Adicionar modules/ ao PYTHONPATH se necessΓ‘rio
PROBLEMA: "NameError: name 'ctx_manager' is not defined"
SOLUÇÃO:
β–‘ Verificar que imports estΓ£o no top do api.py
β–‘ Verificar que get_context_manager() foi chamado
β–‘ Verificar que listen_processor tambΓ©m foi inicializado
PROBLEMA: "AKIRA ainda estΓ‘ respondendo mensagens contextuais"
SOLUÇÃO:
β–‘ Verificar que listen_processor.processar_mensagem_chegando() Γ© chamado
β–‘ Verificar que if not resultado_processamento['deve_processar']: Γ© respeitado
β–‘ Verificar logs: ver se πŸ” ClassificaΓ§Γ£o estΓ‘ correto
β–‘ Se classifica como CONTEXTUAL mas processa, debugar lΓ³gica
PROBLEMA: "Contextos ainda estΓ£o misturando"
SOLUÇÃO:
β–‘ Verificar que conversation_id Γ© ΓΊnico por usuΓ‘rio/grupo
β–‘ Rodar test_context_isolation.py especialmente TEST 4
β–‘ Debugar _gerar_conversation_id() em ContextManagerV2
β–‘ Verificar que ctx_manager.obter_historico_direto() estΓ‘ sendo usado
PROBLEMA: "Performance degradada apΓ³s integraΓ§Γ£o"
SOLUÇÃO:
β–‘ Verificar ctx_manager.obter_stats() para memory estimate
β–‘ Se > 100MB: implementar cleanup mais agressivo
β–‘ Verificar nΓΊmero de contextos: se > 10k, hΓ‘ problema
β–‘ Revisar TTL do cache (atualmente 300s, pode reduzir)
PROBLEMA: "Mensagens antigas nΓ£o aparecem"
SOLUÇÃO:
β–‘ Verificar TTL: contextos com last_access > 7 dias sΓ£o deletados
β–‘ Se precisa histΓ³rico mais longo: modificar max_age_days em cleanup
β–‘ Ou implementar persistΓͺncia em DB (fora do escopo atual)
"""
print(FASE1)
print("\n" + "="*70 + "\n")
print(FASE2)
print("\n" + "="*70 + "\n")
print(FASE3)
print("\n" + "="*70 + "\n")
print(FASE4)
print("\n" + "="*70 + "\n")
print(FASE5)
print("\n" + "="*70 + "\n")
print(FASE6)
print("\n" + "="*70 + "\n")
print(FASE7)
print("\n" + "="*70 + "\n")
print(RESUMO_TEMPO)
print("\n" + "="*70 + "\n")
print(TROUBLESHOOTING)
__all__ = ['FASE1', 'FASE2', 'FASE3', 'FASE4', 'FASE5', 'FASE6', 'FASE7', 'RESUMO_TEMPO', 'TROUBLESHOOTING']