diff --git a/ai_agent.py b/ai_agent.py index fde4cd8..6830d5e 100644 --- a/ai_agent.py +++ b/ai_agent.py @@ -37,25 +37,11 @@ DIRETRIZES: * `ma` ou `mr` -> gws-mr (Marcos / Particular - Email exato: m.reifonas@gmail.com) * `adm` ou `empresa` -> gws-adm (Empresarial/TrackSteel) * `4r` ou `fam` -> gws-4r (Familiar) -- SUPER-PODERES GMAIL: - * COMANDOS RÁPIDOS (Helpers): Use `gws-xxx gmail +COMANDO`. Exemplos: - - `+send`: Enviar novo e-mail. - - `+read`: Ler o conteúdo de um e-mail. - - `+triage`: Resumo de e-mails não lidos. - - `+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). +- GWS SUPER-PODERES: + * MARCADEIRA: Use `gmail_manage_label` para criar pastas (marcar). + * FILTRAGEM: Use `gmail_manage_filter` para automação futura. + * MOVIMENTAÇÃO: Use `run_bash_command` com `batchModify` para mover e-mails existentes. +- FORMATO OBRIGATÓRIO: `[TOOL:nome] arg [/TOOL]`. Use `[TOOL:run]` como atalho para `run_bash_command`. ### FERRAMENTAS DISPONÍVEIS: {tools_desc} @@ -82,11 +68,14 @@ DIRETRIZES: 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) print(f"[LLM RESPONSE]: {response}") - # Regex robusto que encontra o [TOOL:nome] e extrai o argumento mesmo sem [/TOOL] - match = re.search(r"\[TOOL:([^\]]+)\]", response, re.I) + # Regex mais flexível: tenta casar [TOOL:nome] e extrair o conteúdo até [/TOOL] ou final da string + match = re.search(r"\[TOOL:([\w_]+)\]", response, re.I) 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():] end_tag = re.search(r"\[/TOOL\]", content_after, re.I) @@ -94,15 +83,16 @@ DIRETRIZES: if t_name in AVAILABLE_TOOLS: 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() - print(f"[TOOL:{t_name}] Observation: {obs}") - # Trunca observação se for gigante para não estourar a cota - if len(str(obs)) > 2000: - obs = str(obs)[:2000] + "... [TRUNCATED]" + print(f"[TOOL:{t_name}] Observation: {obs[:100]}...") + + if len(str(obs)) > 3000: + obs = str(obs)[:3000] + "... [TRUNCATED]" current_history += f"\nAgente: {response}\nSISTEMA ({t_name}): {obs}\n" 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: # Se não há ferramenta, terminou o pensamento. return response