fix: Improve OpenClaw response handling and increase character limit
This commit is contained in:
@@ -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]:
|
||||
"""Send message to OpenClaw CLI"""
|
||||
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:
|
||||
# Usar OpenClaw CLI directamente
|
||||
cmd = f"openclaw agent --agent main -m {shlex.quote(message)}"
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
shell=True,
|
||||
["openclaw", "agent", "--agent", "main", "-m", message_full],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60,
|
||||
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)
|
||||
output = result.stdout + result.stderr
|
||||
|
||||
# Tomar todo después de la última línea de logs
|
||||
lines = output.split("\n")
|
||||
response_lines = []
|
||||
in_response = False
|
||||
capture = False
|
||||
|
||||
for line in lines:
|
||||
# Ignorar líneas de logs
|
||||
if "Gateway agent" in line or "gateway" in line.lower():
|
||||
# Empezar a capturar después de estos patrones
|
||||
if "Bind:" in line or "Gateway agent" in line:
|
||||
capture = True
|
||||
continue
|
||||
if "error:" in line.lower():
|
||||
if capture:
|
||||
# Ignorar líneas de errores
|
||||
if "error:" in line.lower() and "Error:" in line:
|
||||
continue
|
||||
if line.strip():
|
||||
response_lines.append(line)
|
||||
|
||||
if response_lines:
|
||||
return "\n".join(response_lines[-5:]) # Últimas 5 líneas
|
||||
# Limpiar response
|
||||
response = "\n".join(response_lines).strip()
|
||||
|
||||
# Si no hay output, devolver el error
|
||||
if result.stderr:
|
||||
logger.error(f"[OpenClaw] Error: {result.stderr}")
|
||||
return "Disculpa, tuve un problema al procesar tu mensaje. ¿Podés reformularlo?"
|
||||
# Si está vacío, usar todo el output
|
||||
if not response:
|
||||
response = output
|
||||
|
||||
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:
|
||||
logger.error("[OpenClaw] Timeout")
|
||||
|
||||
Reference in New Issue
Block a user