AKIRA-SOFTEDGE / GUIA_CONTEXTO_DATETIME.md
akra35567's picture
Upload 55 files
13091b9 verified
|
Raw
History Blame Contribute Delete
14.6 kB

📚 GUIA DE USO - NOVO SISTEMA DE CONTEXTO ANGOLA + DATETIME

Versão: 1.0
Data: 10/04/2026
Para: Desenvolvedores integrando com novo sistema de contexto


🎯 VISÃO GERAL

Este guia explica como usar as 3 novas features adicionadas ao config.py:

  1. Contexto Padrão Angola - Sempre que não especificado
  2. Datetime Compensado - +1h para ajustar nuvem
  3. System Prompt Melhorado - Injeção garantida em todos os provedores

📍 FEATURE 1: CONTEXTO PADRÃO ANGOLA

O que é?

Quando Akira não tem informação explícita sobre localização, assume Angola/Luanda como padrão.

Como Usar:

Em web_search.py:

from config import DEFAULT_CONTEXT_COUNTRY, DEFAULT_CONTEXT_CITY

def buscar_noticias(query: str, pais: Optional[str] = None) -> List[str]:
    """Busca notícias, com Angola como padrão"""
    pais_busca = pais or DEFAULT_CONTEXT_COUNTRY  # "Angola"
    cidade_busca = DEFAULT_CONTEXT_CITY  # "Luanda"
    
    # Construir query com localização
    query_final = f"{query} {pais_busca} {cidade_busca}"
    # Executar busca...

Em context_builder.py:

from config import DEFAULT_CONTEXT_COUNTRY, DEFAULT_CONTEXT_CITY, DEFAULT_CONTEXT_TIMEZONE

def construir_contexto_usuario(usuario_id: str, conversas: List[dict]) -> dict:
    """Constrói contexto com informações de localização"""
    contexto = {
        "usuario_id": usuario_id,
        "pais_padrao": DEFAULT_CONTEXT_COUNTRY,
        "cidade_padrao": DEFAULT_CONTEXT_CITY,
        "timezone_padrao": DEFAULT_CONTEXT_TIMEZONE,
        # ... resto do contexto
    }
    return contexto

Em reply_context_handler.py:

from config import DEFAULT_CONTEXT_COUNTRY, DEFAULT_CONTEXT_CITY

def processar_pergunta_localizacao(pergunta: str) -> dict:
    """Processa perguntas sobre localização/clima/política"""
    
    # Se pergunta não menciona país específico
    if "pais" not in pergunta.lower():
        pais = DEFAULT_CONTEXT_COUNTRY  # Angola
        cidade = DEFAULT_CONTEXT_CITY    # Luanda
    else:
        # Extrair país da pergunta
        pais, cidade = extrair_localizacao(pergunta)
    
    return {
        "pais": pais,
        "cidade": cidade,
        "deve_buscar": True
    }

Exemplos de Comportamento:

Usuário: "Qual é o tempo?"
└─ Pais padrão: Angola ✅
└─ Cidade padrão: Luanda ✅
└─ Busca: tempo em Luanda


Usuário: "Qual é o tempo em Maputo?"
└─ Pais detectado: Moçambique
└─ Cidade detectada: Maputo
└─ Busca: tempo em Maputo (respeita preferência)


Usuário: "Quem é o presidente?"
└─ Pais padrão: Angola ✅
└─ Busca: presidente de Angola


Usuário: "Quem é o presidente de Portugal?"
└─ Pais detectado: Portugal
└─ Busca: presidente de Portugal (respeita preferência)

⏰ FEATURE 2: DATETIME COMPENSADO (+1h)

O que é?

Railway/Render têm ~1h de atraso. Estas funções compensam automaticamente.

Cloud reporta: 12:15
Função retorna: 13:15 ✅ (Real)

Como Usar:

Função 1: get_current_time_string() - HH:MM Format

from config import get_current_time_string

def responder_que_horas_sao() -> str:
    """Quando usuário pergunta 'que horas são?'"""
    hora_agora = get_current_time_string()  # "13:45"
    return f"São {hora_agora}"
    
    # Resultado:
    # "São 13:45"

Função 2: get_current_date_string() - DD/MM/YYYY Format

from config import get_current_date_string

def responder_que_dia_eh() -> str:
    """Quando usuário pergunta 'que dia é?'"""
    data_agora = get_current_date_string()  # "10/04/2026"
    return f"Hoje é {data_agora}"
    
    # Resultado:
    # "Hoje é 10/04/2026"

Função 3: get_current_datetime_compensated() - Objeto datetime

from config import get_current_datetime_compensated
from datetime import timedelta

def calcular_tempo_faltante(data_evento: str) -> str:
    """Calcula tempo até um evento"""
    agora = get_current_datetime_compensated()  # datetime compensado
    evento = datetime.strptime(data_evento, "%d/%m/%Y")
    
    diferenca = evento - agora
    dias_faltantes = diferenca.days
    
    return f"Faltam {dias_faltantes} dias"

Função 4: get_current_datetime_iso() - ISO 8601

from config import get_current_datetime_iso

def logar_interacao(usuario_id: str, mensagem: str):
    """Loga interação com timestamp ISO"""
    timestamp = get_current_datetime_iso()  # "2026-04-10T13:45:32.123456"
    
    log_entry = {
        "usuario": usuario_id,
        "mensagem": mensagem,
        "timestamp": timestamp
    }
    salvar_log(log_entry)

Exemplos de Uso Real:

# Exemplo 1: Responder pergunta de horário
Usuário: "Que horas são?"
get_current_time_string() → "13:15"
Resposta Akira: "13:15"

# Exemplo 2: Responder pergunta de data
Usuário: "Que dia é hoje?"
get_current_date_string() → "10/04/2026"
Resposta Akira: "Hoje é 10/04/2026"

# Exemplo 3: Calcular diferença de tempo
Usuário: "Quanto tempo falta para eleições em Angola?" (data: 11/08/2027)
agora = get_current_datetime_compensated()  # 10/04/2026 13:15
falta ≈ 488 dias
Resposta Akira: "Faltam 488 dias pra eleições"

# Exemplo 4: Log com timestamp
Log de API: timestamp=2026-04-10T13:15:32.123456
(visível em logs, totalmente transparente)

Integração em api.py:

# Em classes de API (Mistral, Gemini, etc.)
from config import SYSTEM_PROMPT, get_current_time_string

class LLMManager:
    def call_llm(self, sistema_prompt: str, user_prompt: str):
        # SYSTEM_PROMPT já vem com data/hora dinâmicas
        # Exemplo de conteúdo após f-string evaluation:
        # "Hora Atual (Compensada): 13:15"
        # "Data Atual: 10/04/2026"
        
        messages = [
            {"role": "system", "content": sistema_prompt},
            {"role": "user", "content": user_prompt}
        ]
        # ... chamar API

🔥 FEATURE 3: SYSTEM PROMPT MELHORADO

O que é?

SYSTEM_PROMPT agora contém:

  • ✅ Contexto padrão Angola explícito
  • ✅ Instruções de injeção para TODOS os provedores
  • ✅ Data/Hora dinâmicas (atualizadas no tempo de geração)
  • ✅ Regras de ouro para contexto padrão

Como Garantir Injeção Correta:

Em api.py - Para Mistral, Groq, Grok, Together, OpenRouter:

from config import SYSTEM_PROMPT

def _call_mistral(self, context_history, user_prompt):
    """CORRETO: Injetar como system role"""
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},  # ✅ CORRETO
        {"role": "user", "content": user_prompt}
    ]
    # Chamar API Mistral com esta estrutura

Em api.py - Para Gemini (usa system_instruction):

from config import SYSTEM_PROMPT

def _call_gemini(self, context_history, user_prompt):
    """CORRETO: Usar system_instruction"""
    response = client.generate_content(
        user_prompt,
        system_instruction=SYSTEM_PROMPT,  # ✅ CORRETO
        **outros_parametros
    )
    return response

Em api.py - Para Cohere (sem suporte a system role):

from config import SYSTEM_PROMPT

def _call_cohere(self, context_history, user_prompt):
    """FALLBACK: Concatenar no início"""
    full_message = SYSTEM_PROMPT + "\n\n" + user_prompt  # ✅ CORRETO
    
    response = cohere_client.generate(
        prompt=full_message,
        # ... outros parametros
    )
    return response

Verificação em Cada Provedor:

Provedor Método Status
Mistral system_role em messages ✅ Implementado
Gemini system_instruction ✅ Implementado
Groq system_role em messages ✅ Implementado
Grok system_role em messages ✅ Implementado
OpenRouter system_role em messages ✅ Implementado
Together system_role em messages ✅ Implementado
Cohere Concatenado no início ✅ Fallback
Local LLM Pode usar system_prompt ✅ Support

O que Está no SYSTEM_PROMPT Agora:

## 🎭 PERFIL: AKIRA V21 ULTIMATE - CONTEXTO PADRÃO ANGOLA
### 🌍 INFORMAÇÕES DE CONTEXTO (OBRIGATÓRIO SEMPRE)
**Localização Geográfica Padrão:**
* **País:** Angola 🇦🇴
* **Cidade:** Luanda
* **Timezone:** WAT (UTC+1)
* **Hora Atual (Compensada):** 13:15
* **Data Atual:** 10/04/2026
* **Idioma Preferido:** português (português angolano preferido)

✅ **REGRA DE OURO:** Quando o usuário fizer perguntas sobre:
- **Tempo/Clima:** Sempre se refira ao tempo em Luanda, Angola
- **Política/Notícias:** Sempre considere Angola como contexto padrão
- **Eventos locais:** Sempre em Luanda, Angola
- **Pesquisas Web:** Quando não especificado, buscar primeiro informações sobre Angola
- **Horas/Horários:** Sempre em WAT (13:15 agora)

### CONTEXTO DE HORÁRIO E LOCALIZAÇÃO**Hora/Data Atual:** 13:15 em Luanda (10/04/2026)
- Se o usuário pergunta "que horas são": Responda com 13:15 (hora de Angola compensada)
- Se o usuário pergunta "que dia é": Responda com 10/04/2026 (data compensada)
...

Note que:

  • 13:15 é dinâmico (atualizado quando prompt é gerado)
  • 10/04/2026 é dinâmico
  • Luanda, Angola está explícito em múltiplos lugares

🧪 CHECKLIST DE IMPLEMENTAÇÃO

Ao integrar estas features, verificar:

✅ Imports

from config import (
    DEFAULT_CONTEXT_COUNTRY,
    DEFAULT_CONTEXT_CITY,
    DEFAULT_CONTEXT_TIMEZONE,
    CLOUD_TIMEZONE_OFFSET_HOURS,
    get_current_datetime_compensated,
    get_current_time_string,
    get_current_date_string,
    get_current_datetime_iso,
    SYSTEM_PROMPT
)

✅ Em api.py

  • Todas as _call_* funções usam SYSTEM_PROMPT como system role/message?
  • Gemini usa system_instruction?
  • Cohere concatena SYSTEM_PROMPT no início?
  • Fallback está implementado se provedor não suportar system role?

✅ Em web_search.py

  • Buscas sem país especificado usam DEFAULT_CONTEXT_COUNTRY?
  • Buscas de clima/cidades usam DEFAULT_CONTEXT_CITY?

✅ Em context_builder.py

  • Contexto global inclui país/cidade/timezone padrão?
  • Usa get_current_datetime_compensated() para timestamps?

✅ Em reply_context_handler.py

  • Perguntas sobre "que horas são" usam get_current_time_string()?
  • Perguntas sobre "que dia é" usam get_current_date_string()?

✅ Logging

  • Usa get_current_datetime_iso() para timestamps em logs?

🎓 EXEMPLOS PRÁTICOS COMPLETOS

Exemplo 1: Pergunta Simples

# Usuário envia: "Qual é o tempo?"
def processar_pergunta(user_mensagem: str):
    # 1. Detectar tipo de pergunta
    if "tempo" in user_mensagem.lower():
        # 2. Usar contexto padrão Angola
        pais = DEFAULT_CONTEXT_COUNTRY  # "Angola"
        cidade = DEFAULT_CONTEXT_CITY   # "Luanda"
        
        # 3. Fazer busca
        resultado_tempo = buscar_tempo_weather_api(cidade, pais)
        
        # 4. Construir resposta via LLM
        system_msg = SYSTEM_PROMPT  # Já tem contexto Angola
        user_msg = f"O usuário perguntou: {user_mensagem}. Responda sobre o tempo em {cidade}."
        
        resposta = chamar_llm(system_msg, [user_msg])
        # Resposta mencionará Luanda, Angola automaticamente
        
        return resposta

Exemplo 2: Pergunta de Horário

# Usuário envia: "Que horas são agora?"
def responder_horario():
    hora_compensada = get_current_time_string()  # "13:15"
    
    # LLM pode responder naturalmente:
    return f"São {hora_compensada}"
    
    # Ou pode construir via contexto:
    system_msg = SYSTEM_PROMPT  # Contém: "Hora Atual (Compensada): 13:15"
    user_msg = "Que horas são agora?"
    
    resposta = chamar_llm(system_msg, [user_msg])
    # LLM responderá "13:15" ou similar, sempre correto

Exemplo 3: Pergunta Explícita Diferente

# Usuário envia: "Qual é o tempo em Lisboa?"
def processar_pergunta_com_localizacao(user_mensagem: str):
    # 1. Extrair localização explícita: "Lisboa"
    localizacoes_detectadas = extrair_localizacoes(user_mensagem)  # ["Lisboa"]
    
    # 2. Respeitar preferência do usuário
    if localizacoes_detectadas:
        cidade = localizacoes_detectadas[0]  # "Lisboa"
        pais = "Portugal"
    else:
        # Fallback para padrão
        cidade = DEFAULT_CONTEXT_CITY  # "Luanda"
        pais = DEFAULT_CONTEXT_COUNTRY  # "Angola"
    
    # 3. Buscar tempo para localização correcta
    resultado = buscar_tempo(cidade, pais)
    
    return resultado

⚠️ ERROS COMUNS

❌ ERRADO: Usar datetime.now() direto

# NÃO FAÇA ISTO
from datetime import datetime
hora = datetime.now().strftime("%H:%M")  # Pode estar 1h atrasada

✅ CORRETO: Usar funcões de config

# FAÇA ISTO
from config import get_current_time_string
hora = get_current_time_string()  # Sempre compensada

❌ ERRADO: Não injetar SYSTEM_PROMPT

# NÃO FAÇA ISTO
messages = [
    {"role": "user", "content": user_prompt}  # Sem system!
]

✅ CORRETO: Sempre injetar

# FAÇA ISTO
from config import SYSTEM_PROMPT
messages = [
    {"role": "system", "content": SYSTEM_PROMPT},
    {"role": "user", "content": user_prompt}
]

📞 SUPORTE

Se tiver dúvidas sobre implementação:

  1. Contexto Angola não está sendo respeitado?

    • Verificar se DEFAULT_CONTEXT_COUNTRY está sendo usado em buscas
    • Verificar se SYSTEM_PROMPT está sendo injetado
  2. Hora está 1h atrasada?

    • Verificar se está usando get_current_time_string()
    • Não usar datetime.now() direto
  3. API está rejeitando system_prompt?

    • Alguns provedores usam nomes diferentes
    • Consultar documentação do provedor
    • Usar fallback: concatenar no início

Versão: 1.0
Atualização: 2026-04-10
Status: ✅ Pronto para Uso