From c16f86dc4c2570b61578fda0f0128b71ed385eee Mon Sep 17 00:00:00 2001 From: Alex Fournier Date: Thu, 23 Jul 2026 13:13:58 -0700 Subject: [PATCH] fix(relay): serialize rewritten tool results Signed-off-by: Alex Fournier --- agent/relay_tools.py | 4 +++- tests/agent/test_relay_tools.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/agent/relay_tools.py b/agent/relay_tools.py index 9f82483edb2..9fb3b487e7e 100644 --- a/agent/relay_tools.py +++ b/agent/relay_tools.py @@ -72,7 +72,9 @@ def execute( if "value" in raw_result and _json_equal(managed, raw_result["json"]): return raw_result["value"], observed_args - return managed, observed_args + if isinstance(managed, str): + return managed, observed_args + return json.dumps(_jsonable(managed), ensure_ascii=False), observed_args def _jsonable(value: Any) -> Any: diff --git a/tests/agent/test_relay_tools.py b/tests/agent/test_relay_tools.py index fb0caff6c04..785dddf2c45 100644 --- a/tests/agent/test_relay_tools.py +++ b/tests/agent/test_relay_tools.py @@ -2,6 +2,8 @@ from __future__ import annotations +import json + import pytest pytest.importorskip("nemo_relay") @@ -118,7 +120,8 @@ def test_request_rewrite_reaches_authorized_callback_once(relay_turn): assert callback_args == [{"path": "/approved/path"}] assert observed_args == {"path": "/approved/path"} - assert result == {"ok": True, "wrapped": True} + assert isinstance(result, str) + assert json.loads(result) == {"ok": True, "wrapped": True} def test_provider_error_identity_is_preserved(relay_turn):