1
This commit is contained in:
68
ai_agent.py
68
ai_agent.py
@@ -29,7 +29,7 @@ def get_llm_response(prompt: str, provider: str, cfg: dict) -> str:
|
||||
|
||||
return "Provedor desconhecido."
|
||||
|
||||
def query_agent(prompt: str, override_provider: str = None) -> str:
|
||||
def query_agent(prompt: str, override_provider: str = None, chat_history: list = None) -> str:
|
||||
"""
|
||||
Motor Agente em Loop (ReAct): Pensamento -> Ação -> Observação -> Resposta Final.
|
||||
"""
|
||||
@@ -39,41 +39,57 @@ def query_agent(prompt: str, override_provider: str = None) -> str:
|
||||
# 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.
|
||||
# Prompt especializado reformulado para evitar alucinações
|
||||
system_prompt_base = """Você é o [Antigravity VPS Agent], o SysAdmin de elite do Marcos.
|
||||
Você tem acesso root completo à VPS e deve agir de forma profissional e precisa.
|
||||
|
||||
### REGRAS:
|
||||
### REGRAS DE OURO:
|
||||
1. Responda em PORTUGUÊS (Brasil).
|
||||
2. Para agir, use o formato: [TOOL:nome_da_ferramenta] argumento [/TOOL]. Rode UMA ferramenta por vez.
|
||||
3. Para comandos de terminal, use a ferramenta 'run_bash_command'. Exemplo: [TOOL:run_bash_command] ls -la [/TOOL].
|
||||
4. Para ler arquivos do host, use 'read_vps_file'. Exemplo: [TOOL:read_vps_file] /etc/hosts [/TOOL].
|
||||
5. Após usar a ferramenta, você receberá a saída. O seu objetivo é resolver a solicitação do usuário.
|
||||
6. 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.
|
||||
7. Se for solicitado exibir uma imagem (ex: um logo, foto) que você achou no host, **exiba-a dentro da tag <REFINED>** usando markdown de imagem com o endpoint `/api/host_file?path=`. Exemplo: ``
|
||||
2. Se o usuário pedir o status da VPS, SEMPRE use a ferramenta 'get_system_health'.
|
||||
3. Se o usuário pedir algo sobre containers, use 'get_docker_stats'.
|
||||
4. Antes de decidir que um arquivo não existe, use 'run_bash_command' com 'ls' para verificar o diretório.
|
||||
5. NUCA invente que buscou por arquivos (como syslog.conf) se o usuário não pediu especificamente por eles.
|
||||
6. A seção <REFINED> deve conter apenas as informações solicitadas. Se não houver imagem relevante, não inclua tags de imagem.
|
||||
|
||||
### FORMATO DE AÇÃO:
|
||||
Use: [TOOL:nome_da_ferramenta] argumento [/TOOL]
|
||||
Rode UMA ferramenta por vez. Aguarde a saída do SISTEMA antes de concluir.
|
||||
|
||||
### RESPOSTA FINAL:
|
||||
Sua resposta terminada deve ter:
|
||||
- Um resumo técnico.
|
||||
- Uma seção <REFINED> ... </REFINED> com Markdown limpo.
|
||||
- **DICA**: Só use imagens em <REFINED> se o usuário pediu para ver um arquivo de imagem específico que você localizou.
|
||||
|
||||
### FERRAMENTAS DISPONÍVEIS:
|
||||
{TOOLS_LIST}
|
||||
|
||||
### EXEMPLO DE REFINAMENTO VISUAL:
|
||||
Relatório: Coletei os dados solicitados.
|
||||
### EXEMPLO DE SUCESSO:
|
||||
Usuário: qual o uso de ram agora?
|
||||
Agente: [TOOL:get_system_health] [/TOOL]
|
||||
SISTEMA: CPU: 5% | RAM Usada: 20% | Disco Usado: 40%
|
||||
Resposta: A memória RAM está operando com 20% de uso.
|
||||
<REFINED>
|
||||
### 📊 Status Global
|
||||
- **CPU**: 10%
|
||||
- **RAM**: 500MB livre
|
||||
|
||||

|
||||
### 📊 Memória e CPU
|
||||
- **RAM Utilizada**: 20%
|
||||
- **CPU**: 5%
|
||||
</REFINED>
|
||||
"""
|
||||
system_prompt = system_prompt_base.replace("{TOOLS_LIST}", tools_desc)
|
||||
|
||||
history = f"\nUsuário: {prompt}\n"
|
||||
max_loops = 10
|
||||
# Constrói o histórico da conversa (memória de curto prazo)
|
||||
history_str = ""
|
||||
if chat_history:
|
||||
for msg in chat_history[-5:]: # Pega as últimas 5 interações
|
||||
history_str += f"\nUsuário: {msg['user']}\nAgente: {msg['bot']}\n"
|
||||
|
||||
history_str += f"\nUsuário: {prompt}\n"
|
||||
|
||||
current_iteration_history = history_str
|
||||
max_loops = 8
|
||||
|
||||
for _ in range(max_loops):
|
||||
full_prompt = system_prompt + history
|
||||
full_prompt = system_prompt + current_iteration_history
|
||||
response = get_llm_response(full_prompt, provider, cfg)
|
||||
|
||||
# Procura por chamadas de ferramentas na resposta
|
||||
@@ -91,10 +107,10 @@ Relatório: Coletei os dados solicitados.
|
||||
else:
|
||||
observation = AVAILABLE_TOOLS[tool_name]["func"](arg)
|
||||
else:
|
||||
observation = f"Erro: Ferramenta '{tool_name}' não encontrada. Use as ferramentas listadas ou 'run_bash_command'."
|
||||
observation = f"Erro: Ferramenta '{tool_name}' não encontrada."
|
||||
|
||||
# Adiciona ao histórico para a IA ler na próxima rodada
|
||||
history += f"\nAgente (Ação): {response}\nSISTEMA (Saída de {tool_name}): {observation}\n"
|
||||
# Adiciona ao histórico do loop atual
|
||||
current_iteration_history += f"\nAgente (Ação): {response}\nSISTEMA (Saída de {tool_name}): {observation}\n"
|
||||
else:
|
||||
# Se não tem comando, é a resposta final
|
||||
return response
|
||||
|
||||
Reference in New Issue
Block a user