diff --git a/ai_agent.py b/ai_agent.py
index 03639a8..8f95214 100644
--- a/ai_agent.py
+++ b/ai_agent.py
@@ -25,15 +25,24 @@ async def query_agent_async(prompt: str, override_provider=None, chat_history=No
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"""Sou o CLAW, auxiliar do Marcos. Gerencio a VPS.
-Responda em PORTUGUÊS de forma curta e direta.
+ system_prompt = f"""Você é o CLAW, um assistente de IA de alto desempenho operando na VPS do Marcos. Sua natureza é dual:
-### FERRAMENTAS:
+1. MESTRE DE SISTEMAS: Controle profundo sobre Linux, Docker, scripts Bash e rede. Seja preciso, seguro e eficiente em tarefas técnicas.
+2. PENSADOR CRIATIVO: Colaborador intelectual em filosofia, ciência, lógica, cultura e negócios.
+
+DIRETRIZES:
+- Se técnico, valide a segurança antes de sugerir comandos.
+- Use Chain of Thought (raciocínio passo a passo) para conversas complexas.
+- Nunca responda "fora de escopo" ou "limite atingido".
+- Tom profissional, adaptável e perspicaz. Responda em PORTUGUÊS.
+
+### FERRAMENTAS DISPONÍVEIS:
{tools_desc}
-### FORMATO:
-Use [TOOL:nome] arg [/TOOL] para ações.
-Finalize com resumo .
+### FORMATO DE RESPOSTA:
+- Use [TOOL:nome] arg [/TOOL] para ações.
+- Pense passo a passo se a tarefa for complexa.
+- Finalize sempre com resumo final para o usuário .
"""
history_str = ""
diff --git a/bot_logic.py b/bot_logic.py
index c83479d..fb50fde 100644
--- a/bot_logic.py
+++ b/bot_logic.py
@@ -113,8 +113,8 @@ async def process_logic(update: Update, context: ContextTypes.DEFAULT_TYPE, user
reply = await query_agent_async(user_msg, override_provider=cfg.get("active_provider"))
# Envia resposta (Texto)
- # Remove o bloco se houver, pois no Telegram polui
- reply_clean = re.sub(r'.*?', '', reply, flags=re.DOTALL).strip()
+ # Remove apenas as tags e , mantendo o conteúdo
+ reply_clean = reply.replace('', '').replace('', '').strip()
await update.message.reply_text(reply_clean)
# Se foi por voz, responde por voz também
diff --git a/llm_providers.py b/llm_providers.py
index d356199..0eb838c 100644
--- a/llm_providers.py
+++ b/llm_providers.py
@@ -211,7 +211,13 @@ async def _call_gemini_async(model: str, prompt: str, system_prompt: str = None)
if system_prompt:
contents.insert(0, {"role": "model", "parts": [{"text": system_prompt}]})
- payload = {"contents": contents}
+ payload = {
+ "contents": contents,
+ "generationConfig": {
+ "temperature": 0.7,
+ "maxOutputTokens": 4096
+ }
+ }
try:
async with httpx.AsyncClient() as client:
@@ -232,7 +238,12 @@ async def _call_openai_async(model: str, prompt: str, system_prompt: str = None)
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": prompt})
- payload = {"model": model, "messages": messages, "temperature": 0.7}
+ payload = {
+ "model": model,
+ "messages": messages,
+ "temperature": 0.7,
+ "max_completion_tokens": 4096
+ }
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
try:
@@ -258,7 +269,8 @@ async def _call_anthropic_async(model: str, prompt: str, system_prompt: str = No
payload = {
"model": model,
"max_tokens": 4096,
- "messages": [{"role": "user", "content": prompt}]
+ "messages": [{"role": "user", "content": prompt}],
+ "temperature": 0.7
}
if system_prompt: payload["system"] = system_prompt
@@ -278,7 +290,10 @@ async def _call_ollama_async(model: str, prompt: str, system_prompt: str = None)
"model": model,
"prompt": prompt,
"stream": False,
- "options": {"num_ctx": 4096}
+ "options": {
+ "num_ctx": 4096,
+ "temperature": 0.7
+ }
}
if system_prompt: payload["system"] = system_prompt
diff --git a/main.py b/main.py
index fa63fa4..d679b6e 100644
--- a/main.py
+++ b/main.py
@@ -154,8 +154,10 @@ async def web_chat_audio(audio: UploadFile = File(...), is_auth: bool = Depends(
reply = await query_agent_async(text)
# 4. Gera áudio da resposta (TTS)
- reply_clean = re.sub(r'.*?', '', reply, flags=re.DOTALL).strip()
- filename = await text_to_speech_async(reply_clean)
+ # Se houver , usa apenas ele para o áudio. Caso contrário, usa tudo.
+ refined_match = re.search(r'(.*?)', reply, flags=re.DOTALL)
+ audio_text = refined_match.group(1).strip() if refined_match else reply
+ filename = await text_to_speech_async(audio_text)
return {
"text": text,