From d6bfc0e99ef246bbd13e9078be71431b86b02a01 Mon Sep 17 00:00:00 2001 From: HeaTTap Date: Sat, 5 Sep 2026 08:04:01 +0000 Subject: [PATCH] fix: skip tool_use blocks lacking an id --- agentrace/parse.py | 4 +++- tests/test_agentrace.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/agentrace/parse.py b/agentrace/parse.py index aad029c..582f399 100644 --- a/agentrace/parse.py +++ b/agentrace/parse.py @@ -127,7 +127,9 @@ def parse_session(path: Path) -> Session: continue btype = block.get("type") if btype == "tool_use" and block.get("name") in ("Agent", "Task"): - uses[block["id"]] = {"input": block.get("input") or {}, "ts": rec.get("timestamp")} + bid = block.get("id") + if bid: + uses[bid] = {"input": block.get("input") or {}, "ts": rec.get("timestamp")} elif btype == "tool_result": tid = block.get("tool_use_id") if tid: diff --git a/tests/test_agentrace.py b/tests/test_agentrace.py index 879c572..d013eee 100644 --- a/tests/test_agentrace.py +++ b/tests/test_agentrace.py @@ -146,6 +146,24 @@ def test_non_agent_tools_are_ignored(tmp_path): assert parse_session(p).runs == [] +def test_tool_use_without_id_is_skipped(tmp_path): + """A tool_use block missing an id should be skipped rather than crashing with KeyError.""" + p = tmp_path / "s.jsonl" + p.write_text( + json.dumps( + { + "message": { + "content": [ + {"type": "tool_use", "name": "Agent", "input": {"prompt": "p"}} + ] + } + } + ) + ) + s = parse_session(p) + assert s.runs == [] + + # --------------------------------------------------------------------------- checks