Files
BotVPS/ai_agent.py

91 lines
3.5 KiB
Python

import os
import re
import requests
import json
from tools import AVAILABLE_TOOLS
from config import get_config
def get_llm_response(prompt: str, provider: str, cfg: dict) -> str:
"""Invoca o provedor de LLM configurado."""
if provider == "gemini":
api_key = cfg.get("gemini_api_key")
url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key={api_key}"
payload = {"contents": [{"parts": [{"text": prompt}]}]}
res = requests.post(url, json=payload)
if res.status_code == 200:
return res.json()["candidates"][0]["content"]["parts"][0]["text"]
return f"Erro Gemini: {res.text}"
elif provider == "ollama":
ollama_host = os.getenv("OLLAMA_HOST", "http://ollama-lw4s8g4gc8gss4gkc4gg0wk4:11434")
res = requests.post(f"{ollama_host}/api/generate", json={
"model": os.getenv("OLLAMA_MODEL", "qwen2.5-coder:1.5b"),
"prompt": prompt,
"stream": False
})
if res.status_code == 200:
return res.json().get("response", "")
return f"Erro Ollama: {res.text}"
return "Provedor desconhecido."
def query_agent(prompt: str, override_provider: str = None) -> str:
"""
Motor Agente em Loop (ReAct): Pensamento -> Ação -> Observação -> Resposta Final.
"""
cfg = get_config()
provider = override_provider or cfg.get("active_provider", "gemini")
# Contexto de Ferramentas para a IA
tools_desc = "\n".join([f"- {k}: {v['description']}" for k,v in AVAILABLE_TOOLS.items()])
# Prompt especializado (sem chaves complexas)
system_prompt_base = """Você é o [Antigravity VPS Agent].
Sua missão é ser o SysAdmin de elite do Marcos. Você tem acesso root.
### REGRAS:
1. Responda em PORTUGUÊS (Brasil).
2. Para agir, use: [CMD] comando [/CMD]. Rode UM comando por vez.
3. Seus comandos devem ser diretos (docker, git, ls, rm, mkdir).
4. Após o comando, você receberá a saída. O seu objetivo é resolver a solicitação do usuário.
5. Quando terminar, sua resposta FINAL deve ter:
- Um resumo técnico rápido.
- Uma seção entre tags <REFINED> ... </REFINED> com uma tabela Markdown limpa ou resumo em tópicos (Nome: Valor) para o usuário leigo.
### FERRAMENTAS DISPONÍVEIS:
{TOOLS_LIST}
### EXEMPLO DE REFINAMENTO VISUAL:
Relatório: Coletei os dados solicitados.
<REFINED>
### 📊 Status Global
- **CPU**: 10%
- **RAM**: 500MB livre
</REFINED>
"""
system_prompt = system_prompt_base.replace("{TOOLS_LIST}", tools_desc)
history = f"\nUsuário: {prompt}\n"
max_loops = 10
for _ in range(max_loops):
full_prompt = system_prompt + history
response = get_llm_response(full_prompt, provider, cfg)
# Procura por comandos na resposta
match = re.search(r"\[CMD\](.*?)\[/CMD\]", response, re.IGNORECASE | re.DOTALL)
if match:
cmd = match.group(1).strip()
# Executa a tool (por enquanto focada em bash que é a mais poderosa)
print(f"Agente executando: {cmd}")
observation = AVAILABLE_TOOLS["run_bash_command"]["func"](cmd)
# Adiciona ao histórico para a IA ler na próxima rodada
history += f"\nAgente (Pensamento/Ação): {response}\nSISTEMA (Saída do Terminal): {observation}\n"
else:
# Se não tem comando, é a resposta final
return response
return "O agente atingiu o limite de tentativas para esta tarefa."