fix: Improve OpenClaw response handling and increase character limit

This commit is contained in:
Renato
2026-02-15 18:28:25 +01:00
parent 3bd9c10fc2
commit b5772e159e

View File

@@ -34,46 +34,57 @@ OPENCLAW_TOKEN = os.getenv("OPENCLAW_TOKEN", "wlillidan1-demo-token-12345")
async def chat_with_ai(message: str, session_id: str = "pymesbot") -> Optional[str]: async def chat_with_ai(message: str, session_id: str = "pymesbot") -> Optional[str]:
"""Send message to OpenClaw CLI""" """Send message to OpenClaw CLI"""
import subprocess import subprocess
import shlex
# Forzar al agente a dar respuesta completa
message_full = (
message
+ " Dame una respuesta completa con TODOS los productos del inventario, no resumas."
)
try: try:
# Usar OpenClaw CLI directamente # Usar OpenClaw CLI directamente
cmd = f"openclaw agent --agent main -m {shlex.quote(message)}"
result = subprocess.run( result = subprocess.run(
cmd, ["openclaw", "agent", "--agent", "main", "-m", message_full],
shell=True,
capture_output=True, capture_output=True,
text=True, text=True,
timeout=60, timeout=60,
cwd="/home/ren/openclaw", cwd="/home/ren/openclaw",
) )
# La CLI输出 puede tener logs al principio, buscar la respuesta
output = result.stdout
# Buscar la respuesta real (ignorar logs de gateway) # Buscar la respuesta real (ignorar logs de gateway)
output = result.stdout + result.stderr
# Tomar todo después de la última línea de logs
lines = output.split("\n") lines = output.split("\n")
response_lines = [] response_lines = []
in_response = False capture = False
for line in lines: for line in lines:
# Ignorar líneas de logs # Empezar a capturar después de estos patrones
if "Gateway agent" in line or "gateway" in line.lower(): if "Bind:" in line or "Gateway agent" in line:
capture = True
continue continue
if "error:" in line.lower(): if capture:
continue # Ignorar líneas de errores
if line.strip(): if "error:" in line.lower() and "Error:" in line:
continue
response_lines.append(line) response_lines.append(line)
if response_lines: # Limpiar response
return "\n".join(response_lines[-5:]) # Últimas 5 líneas response = "\n".join(response_lines).strip()
# Si no hay output, devolver el error # Si está vacío, usar todo el output
if result.stderr: if not response:
logger.error(f"[OpenClaw] Error: {result.stderr}") response = output
return "Disculpa, tuve un problema al procesar tu mensaje. ¿Podés reformularlo?"
return "Disculpa, no pude obtener una respuesta. ¿Podés intentarlo de nuevo?" # Limpiar caracteres especiales
response = response.encode().decode("utf-8", errors="ignore")
# Limitar a ~2000 caracteres para mostrar más productos
if len(response) > 2000:
response = response[:2000] + "..."
return response if response else "Disculpa, no pude obtener una respuesta."
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired:
logger.error("[OpenClaw] Timeout") logger.error("[OpenClaw] Timeout")