Files
BotVPS/ai_agent.py

65 lines
2.7 KiB
Python

import os
import re
import httpx
import asyncio
import json
from tools import AVAILABLE_TOOLS
from llm_providers import call_llm, get_available_models, get_planner_llm
from config import get_config
async def get_llm_response_async(prompt: str, provider: str, cfg: dict) -> str:
"""Invoca o provedor de LLM centralizado em llm_providers."""
# Garante o modelo gemini-2.5-flash como padrão para o agente Legado
model = cfg.get("model") or "gemini-2.5-flash"
if provider == "ollama":
model = os.getenv("OLLAMA_MODEL", "llama3.2:1b")
return await call_llm(provider, model, prompt)
def query_agent(prompt: str, override_provider=None, chat_history=None) -> str:
"""Wrapper síncrono para query_agent_async."""
return asyncio.run(query_agent_async(prompt, override_provider, chat_history))
async def query_agent_async(prompt: str, override_provider=None, chat_history=None) -> str:
cfg = get_config()
provider = override_provider or cfg.get("active_provider", "gemini")
tools_desc = "\n".join([f"- {k}: {v['description']}" for k, v in AVAILABLE_TOOLS.items()])
system_prompt = f"""Você é o Antigravity VPS Agent. Root Admin da VPS do Marcos.
Responda em PORTUGUÊS. Seja técnico e direto.
### FERRAMENTAS:
{tools_desc}
### FORMATO:
Use [TOOL:nome] arg [/TOOL] para ações.
Finalize com <REFINED> resumo </REFINED>.
"""
history_str = ""
if chat_history:
for m in chat_history[-5:]:
history_str += f"\nUsuário: {m['user']}\nAgente: {m['bot']}\n"
history_str += f"\nUsuário: {prompt}\n"
current_history = history_str
for i in range(5): # Reduzido de 10 para 5 para economizar cota e evitar loops infinitos
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)
match = re.search(r"\[TOOL:(.*?)\](.*?)\[/TOOL\]", response, re.I | re.S)
if match:
t_name, arg = match.group(1).strip(), match.group(2).strip()
if t_name in AVAILABLE_TOOLS:
# Assume ferramentas são síncronas em tools.py (legado)
obs = func(arg) if arg else func()
# Trunca observação se for gigante para não estourar a cota
if len(str(obs)) > 2000:
obs = str(obs)[:2000] + "... [TRUNCATED]"
current_history += f"\nAgente: {response}\nSISTEMA ({t_name}): {obs}\n"
else:
current_history += f"\nAgente: {response}\nSISTEMA: Erro: Ferramenta inexistente.\n"
else:
return response
return "Limite de pensamento atingido."