🚀 Auto-deploy: BotVPS atualizado em 29/04/2026 11:32:43
This commit is contained in:
62
ai_agent.py
62
ai_agent.py
@@ -32,26 +32,44 @@ async def query_agent_async(prompt: str, override_provider=None, chat_history=No
|
|||||||
tools_desc = "\n".join([f"- {k}: {v.get('description') or v.get('desc')}" for k, v in ALL_TOOLS.items()])
|
tools_desc = "\n".join([f"- {k}: {v.get('description') or v.get('desc')}" for k, v in ALL_TOOLS.items()])
|
||||||
|
|
||||||
# Identifica o modelo para o prompt do sistema
|
# Identifica o modelo para o prompt do sistema
|
||||||
current_model = cfg.get("model") or "qwen/qwen-2.5-72b-instruct"
|
current_model = cfg.get("model") or "inclusionai/ling-2.6-flash:free"
|
||||||
|
|
||||||
system_prompt = f"""Antigravity (VPS Marcos). Mestre em Linux/GWS.
|
system_prompt = f"""Você é o Antigravity, um assistente de IA de alto desempenho operando na VPS do Marcos.
|
||||||
|
Seu modelo base atual é o **{current_model}** via OpenRouter.
|
||||||
|
|
||||||
DIRETRIZES TÉCNICAS:
|
Sua natureza é dual:
|
||||||
- Mestre em Linux, Docker e Google Workspace (GWS).
|
1. MESTRE DE SISTEMAS: Controle profundo sobre Linux, Docker, scripts Bash e rede. Seja preciso, seguro e eficiente em tarefas técnicas.
|
||||||
- Use `[TOOL:nome] argumento [/TOOL]` ou `[TOOL:run] comando [/TOOL]` para tarefas.
|
2. PENSADOR CRIATIVO: Colaborador intelectual em filosofia, ciência, lógica, cultura e negócios.
|
||||||
- GWS: Use `gws-mr` (Marcos), `gws-adm` (Empresa), `gws-4r` (Familiar).
|
|
||||||
- NUNCA invente dados. Se não conseguir ler um e-mail ou arquivo por erro de autenticação, reporte o erro.
|
|
||||||
- E-mails: Use `gws-mr gmail +triage` para ver os últimos e-mails.
|
|
||||||
|
|
||||||
REGRAS DE OURO:
|
DIRETRIZES:
|
||||||
- FOCO NO PRESENTE: Ignore tarefas técnicas anteriores se o pedido atual mudar.
|
- Você é o MESTRE do Google Workspace (GWS). Use `run_bash_command` para QUALQUER tarefa de automação.
|
||||||
- COOLIFY: Use `coolify_status` como fonte única para deploys.
|
- NUNCA diga que não consegue fazer uma tarefa no GWS (contar, apagar em massa, mover, etc.). Encontre o comando `gws` correto.
|
||||||
- NUNCA tente instalar pacotes ou inventar tokens.
|
- CONTAS GWS (Pode usar apelidos):
|
||||||
|
* `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)
|
||||||
|
- 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 DE CHAMADA DE FERRAMENTA (CRÍTICO): Você DEVE usar `[TOOL:nome_ferramenta] argumento [/TOOL]`. NUNCA esqueça os colchetes `[` e `]`.
|
||||||
|
- Se quiser rodar um comando bash, use o atalho: `[TOOL:run] comando [/TOOL]`.
|
||||||
|
|
||||||
FERRAMENTAS:
|
### FERRAMENTAS DISPONÍVEIS:
|
||||||
{tools_desc}
|
{tools_desc}
|
||||||
|
|
||||||
RESPOSTA FINAL: Use SEMPRE o prefixo `RESUMO:` para a conclusão. """
|
### REGRAS DE OURO:
|
||||||
|
- FOCO NO PRESENTE: O histórico é para CONTEXTO. Foque SEMPRE no pedido ATUAL (última mensagem). Se o usuário disser "bom dia" ou mudar de assunto, não repita tarefas técnicas anteriores.
|
||||||
|
- COOLIFY: NUNCA tente adivinhar caminhos de logs ou usar comandos `psql` genéricos. Use SEMPRE a ferramenta `coolify_status`. Ela é a fonte da verdade para deploies.
|
||||||
|
- NUNCA tente instalar pacotes (`apt`, `npm install`, etc) ou usar tokens fictícios como `<YOUR_TOKEN>`.
|
||||||
|
- Se o usuário perguntar sobre o "app mais recente", use `coolify_status` e analise a coluna `application` e `created_at`.
|
||||||
|
- Seja direto e técnico. Menos conversa, mais execução.
|
||||||
|
- NUNCA INVENTE DADOS. Se não conseguir ler algo, reporte o erro.
|
||||||
|
|
||||||
|
### FORMATO DE RESPOSTA FINAL (OBRIGATÓRIO):
|
||||||
|
- Use SEMPRE o prefixo `RESUMO:` para sua conclusão final amigável.
|
||||||
|
- Exemplo: `RESUMO: Tudo pronto! O último app a receber deploy foi o VOXDO.`
|
||||||
|
"""
|
||||||
|
|
||||||
history_str = ""
|
history_str = ""
|
||||||
if chat_history:
|
if chat_history:
|
||||||
@@ -66,19 +84,19 @@ RESPOSTA FINAL: Use SEMPRE o prefixo `RESUMO:` para a conclusão. """
|
|||||||
final_model = current_model
|
final_model = current_model
|
||||||
|
|
||||||
for i in range(max_iterations):
|
for i in range(max_iterations):
|
||||||
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: {current_model})...")
|
||||||
try:
|
try:
|
||||||
res_dict = await call_llm(provider, current_model, system_prompt + current_history)
|
res_dict = await call_llm(provider, current_model, system_prompt + current_history)
|
||||||
|
|
||||||
# Lógica de FALLBACK: Se o Qwen falhar ou retornar erro de API, tenta o Ling-2.6-flash
|
# Lógica de FALLBACK: Se o Ling falhar (especialmente por ser free/busy), tenta o Qwen 2.5-72B
|
||||||
if res_dict["content"].startswith("Erro OpenRouter") and provider == "openrouter" and current_model == "qwen/qwen-2.5-72b-instruct":
|
if (res_dict.get("content", "").startswith("Erro OpenRouter") or "error" in res_dict.get("content", "").lower()) and provider == "openrouter":
|
||||||
backup_model = "inclusionai/ling-2.6-flash:free"
|
backup_model = "qwen/qwen-2.5-72b-instruct"
|
||||||
print(f"⚠️ [FALLBACK CHAT] Falha no Qwen. Tentando {backup_model}...")
|
print(f"⚠️ [FALLBACK CHAT] Falha no Ling. Tentando {backup_model}...")
|
||||||
res_dict = await call_llm("openrouter", backup_model, system_prompt + current_history)
|
res_dict = await call_llm("openrouter", backup_model, system_prompt + current_history)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if provider == "openrouter" and current_model == "qwen/qwen-2.5-72b-instruct":
|
if provider == "openrouter":
|
||||||
backup_model = "inclusionai/ling-2.6-flash:free"
|
backup_model = "qwen/qwen-2.5-72b-instruct"
|
||||||
print(f"⚠️ [FALLBACK CHAT] Exceção no Qwen ({str(e)}). Tentando {backup_model}...")
|
print(f"⚠️ [FALLBACK CHAT] Exceção no Ling ({str(e)}). Tentando {backup_model}...")
|
||||||
res_dict = await call_llm("openrouter", backup_model, system_prompt + current_history)
|
res_dict = await call_llm("openrouter", backup_model, system_prompt + current_history)
|
||||||
else:
|
else:
|
||||||
return f"Erro Crítico no Agente: {str(e)}"
|
return f"Erro Crítico no Agente: {str(e)}"
|
||||||
|
|||||||
Reference in New Issue
Block a user