06-sep: [fix] opencode_bot sin verbose, texto final + tiempo, sin duplicados entre turnos
This commit is contained in:
@@ -400,40 +400,30 @@ def procesar_texto(chat, texto):
|
||||
enviar(chat, f"❌ Error al lanzar OpenCode: {resp}")
|
||||
return
|
||||
|
||||
vistos_texto = set()
|
||||
vistos_tool = set()
|
||||
# Respuesta SIN verbose: no se envian los comandos/tools intermedios ni
|
||||
# fragmentos de streaming. Solo se recoge el texto del assistant generado
|
||||
# en este turno (filtrado por t0 para no repetir mensajes de turnos
|
||||
# anteriores) y se entrega al terminar junto con el tiempo empleado.
|
||||
trozos = {} # pid -> (start, texto)
|
||||
comienzo = time.time()
|
||||
terminado = False
|
||||
while time.time() - comienzo < 900:
|
||||
time.sleep(3)
|
||||
code, hist = oc_get(f"/session/{sid}/message?limit=4")
|
||||
time.sleep(2)
|
||||
code, hist = oc_get(f"/session/{sid}/message?limit=10")
|
||||
if code == 200 and isinstance(hist, list):
|
||||
for item in reversed(hist[-4:]):
|
||||
for item in reversed(hist[-10:]):
|
||||
info = item.get("info") or {}
|
||||
if info.get("role") != "assistant":
|
||||
continue
|
||||
for p in item.get("parts") or []:
|
||||
t = p.get("type")
|
||||
pid = p.get("id") or ""
|
||||
if t == "text" and p.get("text") and pid not in vistos_texto:
|
||||
vistos_texto.add(pid)
|
||||
enviar(chat, formatear_html(p["text"]))
|
||||
elif t == "tool" and pid not in vistos_tool:
|
||||
vistos_tool.add(pid)
|
||||
comando = ((p.get("state") or {}).get("input")
|
||||
or {}).get("command")
|
||||
if comando:
|
||||
corto = comando.strip().replace("\n", " ")[:90]
|
||||
try:
|
||||
import requests as _rq
|
||||
_rq.post(f"{API}/sendMessage",
|
||||
data={"chat_id": chat, "text":
|
||||
f"⚙️ <i>{html.escape(corto)}</i>",
|
||||
"parse_mode": "HTML"},
|
||||
timeout=10)
|
||||
except Exception:
|
||||
pass
|
||||
# fin del turno: la sesion deja de estar busy (tras un margen inicial)
|
||||
if p.get("type") != "text" or not p.get("text"):
|
||||
continue
|
||||
inicio = (p.get("time") or {}).get("start") or 0
|
||||
if inicio and inicio < t0:
|
||||
continue # parte de un turno anterior: ignorar
|
||||
pid = p.get("id") or f"{inicio}-{len(p['text'])}"
|
||||
if pid not in trozos:
|
||||
trozos[pid] = (inicio, p["text"])
|
||||
code2, sts = oc_get("/session/status", timeout=10)
|
||||
transcurrido = time.time() - comienzo
|
||||
if (code2 == 200 and isinstance(sts, dict)
|
||||
@@ -448,6 +438,14 @@ def procesar_texto(chat, texto):
|
||||
"para cortarla y empezar de nuevo.")
|
||||
return
|
||||
|
||||
# Texto consolidado del turno, ordenado por tiempo de inicio.
|
||||
texto_final = "\n".join(t for _, t in
|
||||
sorted(trozos.values(), key=lambda x: x[0]))
|
||||
if texto_final.strip():
|
||||
seg = time.time() - comienzo
|
||||
enviar(chat, formatear_html(texto_final.strip()))
|
||||
enviar(chat, f"⏱️ Hecho en <b>{seg:.1f}s</b>")
|
||||
|
||||
# ficheros tocados en el turno
|
||||
adjuntos = []
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user