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`:
```python
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`:
```python
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`:
```python
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
```python
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
```python
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
```python
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
```python
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:
```python
# 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`:
```python
# 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:
```python
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):
```python
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):
```python
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:
```markdown
## 🎭 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
```python
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
```python
# 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
```python
# 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
```python
# 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
```python
# 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
```python
# FAÇA ISTO
from config import get_current_time_string
hora = get_current_time_string() # Sempre compensada
```
---
### ❌ ERRADO: Não injetar SYSTEM_PROMPT
```python
# NÃO FAÇA ISTO
messages = [
{"role": "user", "content": user_prompt} # Sem system!
]
```
### ✅ CORRETO: Sempre injetar
```python
# 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