From 1b8c27b292b75c06d30afd02931f6482a6295c59 Mon Sep 17 00:00:00 2001 From: Simbiot Harness Date: Wed, 30 Sep 2026 04:19:04 +0000 Subject: [PATCH] =?UTF-8?q?fix(worker):=20null=5Fcallback=5Fhandler=20?= =?UTF-8?q?=E2=80=94=20BrokenPipe=20=D1=83=D0=B1=D0=B8=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=20=D1=82=D0=B8=D0=BA=D0=B8=20=D1=81=2004:11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Симптом: DigestWritten min с пустым text при живом агенте (15 tool-вызовов, BudgetSpent писались). Корень: PrintingCallbackHandler стримит в stdout воркера; scheduler читает capture_output=True; длинный вывод (reasoning + Tool #N на каждый вызов) переполнял pipe → BrokenPipeError внутри stream_async → ok=False, текст тика потерян. Воркер перезапускался каждый тик — падения шли серией, мин-дайджесты пустые. Результат тика живёт в JSON-файле (result_path) — печать не нужна вовсе: create_harness(callback_handler=null_callback_handler). E2E: воркер с 2 shell-вызовами, stdout 0 байт, ok=True, текст на месте. --- harness/_llm_worker.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/harness/_llm_worker.py b/harness/_llm_worker.py index 8a7318a..d4eea92 100644 --- a/harness/_llm_worker.py +++ b/harness/_llm_worker.py @@ -220,12 +220,18 @@ def main(): tools.append(_rag_tool_for(level, trace_id)) except Exception: pass # RAG — best effort: вендор не должен валить тик + # stdout воркера не читается (subprocess.run с capture_output и + # длинным выводом переполняет pipe → BrokenPipeError в печати, + # результат тика терялся, дайджесты 04:11-04:17 ушли пустыми). + # Результат живёт в JSON-файле (result_path), печать не нужна. + from strands.handlers.callback_handler import null_callback_handler agent = create_harness( model=build_level_model_from_payload(payload), effort="auto", # effort уже в параметрах модели instructions=payload.get("instructions", ""), session=None, tools=tools, + callback_handler=null_callback_handler, builtin_tools=("read", "write", "edit", "shell") if payload.get("can_shell") else [], memory=False, skills=False,