🚀 Auto-deploy: BotVPS atualizado em 29/03/2026 17:52:35
This commit is contained in:
46
ai_agent.py
46
ai_agent.py
@@ -37,25 +37,11 @@ DIRETRIZES:
|
|||||||
* `ma` ou `mr` -> gws-mr (Marcos / Particular - Email exato: m.reifonas@gmail.com)
|
* `ma` ou `mr` -> gws-mr (Marcos / Particular - Email exato: m.reifonas@gmail.com)
|
||||||
* `adm` ou `empresa` -> gws-adm (Empresarial/TrackSteel)
|
* `adm` ou `empresa` -> gws-adm (Empresarial/TrackSteel)
|
||||||
* `4r` ou `fam` -> gws-4r (Familiar)
|
* `4r` ou `fam` -> gws-4r (Familiar)
|
||||||
- SUPER-PODERES GMAIL:
|
- GWS SUPER-PODERES:
|
||||||
* COMANDOS RÁPIDOS (Helpers): Use `gws-xxx gmail +COMANDO`. Exemplos:
|
* MARCADEIRA: Use `gmail_manage_label` para criar pastas (marcar).
|
||||||
- `+send`: Enviar novo e-mail.
|
* FILTRAGEM: Use `gmail_manage_filter` para automação futura.
|
||||||
- `+read`: Ler o conteúdo de um e-mail.
|
* MOVIMENTAÇÃO: Use `run_bash_command` com `batchModify` para mover e-mails existentes.
|
||||||
- `+triage`: Resumo de e-mails não lidos.
|
- FORMATO OBRIGATÓRIO: `[TOOL:nome] arg [/TOOL]`. Use `[TOOL:run]` como atalho para `run_bash_command`.
|
||||||
- `+reply` / `+reply-all` / `+forward`: Responder ou encaminhar mensagens.
|
|
||||||
* ORGANIZAR/MOVER: `gws-xxx gmail users labels create` (nova pasta) e `batchModify` (mover normal).
|
|
||||||
* LIXEIRA/APAGAR: NUNCA use `batchModify` para colocar na lixeira. Use sempre um loop individual:
|
|
||||||
`... | jq -r '.messages[].id' | xargs -I {{}} gws-xxx gmail users messages trash --params '{{"userId": "me", "id": "{{}}"}}'`
|
|
||||||
- SUPER-PODERES CALENDÁRIO:
|
|
||||||
* AGENDA: Use `calendar_agenda account timeframe` para ver compromissos de hoje, amanhã ou da semana.
|
|
||||||
* EVENTOS: Use `run_bash_command` com `gws-xxx calendar events create ...` para marcar reuniões ou `delete` para cancelar.
|
|
||||||
- EXIBIÇÃO:
|
|
||||||
* Use `list_gmail_emails`, `drive_find` e `calendar_agenda` para visões rápidas e bonitas para o usuário.
|
|
||||||
* Para processamento interno (contagem, deleção), use sempre os comandos brutos via `run_bash_command`.
|
|
||||||
- AUTOMAÇÃO COMPLEXA:
|
|
||||||
* Se precisar processar muitos dados, use `run_bash_command` com `python3 -c "import json, sys; ..."` para filtrar e agir em um único passo.
|
|
||||||
- Responda sempre em PORTUGUÊS do Brasil.
|
|
||||||
- CAMINHOS DO SISTEMA: `/root/Apps/BotVPS` (código), `/data/repositories/` (repos).
|
|
||||||
|
|
||||||
### FERRAMENTAS DISPONÍVEIS:
|
### FERRAMENTAS DISPONÍVEIS:
|
||||||
{tools_desc}
|
{tools_desc}
|
||||||
@@ -82,11 +68,14 @@ DIRETRIZES:
|
|||||||
print(f"[AGENT] Iteração {i+1} - Enviando para {provider} (modelo padrão)...")
|
print(f"[AGENT] Iteração {i+1} - Enviando para {provider} (modelo padrão)...")
|
||||||
response = await get_llm_response_async(system_prompt + current_history, provider, cfg)
|
response = await get_llm_response_async(system_prompt + current_history, provider, cfg)
|
||||||
print(f"[LLM RESPONSE]: {response}")
|
print(f"[LLM RESPONSE]: {response}")
|
||||||
# Regex robusto que encontra o [TOOL:nome] e extrai o argumento mesmo sem [/TOOL]
|
# Regex mais flexível: tenta casar [TOOL:nome] e extrair o conteúdo até [/TOOL] ou final da string
|
||||||
match = re.search(r"\[TOOL:([^\]]+)\]", response, re.I)
|
match = re.search(r"\[TOOL:([\w_]+)\]", response, re.I)
|
||||||
|
|
||||||
if match:
|
if match:
|
||||||
t_name = match.group(1).strip()
|
t_name = match.group(1).strip().lower()
|
||||||
|
# Mapeamento de conveniência/atalho
|
||||||
|
if t_name == "run": t_name = "run_bash_command"
|
||||||
|
|
||||||
content_after = response[match.end():]
|
content_after = response[match.end():]
|
||||||
end_tag = re.search(r"\[/TOOL\]", content_after, re.I)
|
end_tag = re.search(r"\[/TOOL\]", content_after, re.I)
|
||||||
|
|
||||||
@@ -94,15 +83,16 @@ DIRETRIZES:
|
|||||||
|
|
||||||
if t_name in AVAILABLE_TOOLS:
|
if t_name in AVAILABLE_TOOLS:
|
||||||
func = AVAILABLE_TOOLS[t_name]["func"]
|
func = AVAILABLE_TOOLS[t_name]["func"]
|
||||||
# Assume ferramentas são síncronas em tools.py (legado)
|
print(f"[AGENT] Executando {t_name} com argumento: {arg[:50]}...")
|
||||||
obs = func(arg) if arg else func()
|
obs = func(arg) if arg else func()
|
||||||
print(f"[TOOL:{t_name}] Observation: {obs}")
|
print(f"[TOOL:{t_name}] Observation: {obs[:100]}...")
|
||||||
# Trunca observação se for gigante para não estourar a cota
|
|
||||||
if len(str(obs)) > 2000:
|
if len(str(obs)) > 3000:
|
||||||
obs = str(obs)[:2000] + "... [TRUNCATED]"
|
obs = str(obs)[:3000] + "... [TRUNCATED]"
|
||||||
current_history += f"\nAgente: {response}\nSISTEMA ({t_name}): {obs}\n"
|
current_history += f"\nAgente: {response}\nSISTEMA ({t_name}): {obs}\n"
|
||||||
else:
|
else:
|
||||||
current_history += f"\nAgente: {response}\nSISTEMA: Erro: Ferramenta inexistente.\n"
|
print(f"[AGENT] Erro: Ferramenta '{t_name}' não encontrada.")
|
||||||
|
current_history += f"\nAgente: {response}\nSISTEMA: Erro: Ferramenta '{t_name}' inexistente no sistema.\n"
|
||||||
else:
|
else:
|
||||||
# Se não há ferramenta, terminou o pensamento.
|
# Se não há ferramenta, terminou o pensamento.
|
||||||
return response
|
return response
|
||||||
|
|||||||
Reference in New Issue
Block a user