From a1e345b0c6f49bea07bc18d1ff7f81f974fac419 Mon Sep 17 00:00:00 2001 From: Zhongxuan Wang Date: Tue, 11 Aug 2026 14:41:16 -0700 Subject: [PATCH] fix: preserve Codex JSON-RPC code Signed-off-by: Zhongxuan Wang --- .../codex/src/nemo_fabric_adapters/codex/adapter.py | 6 +++++- tests/adapters/test_codex_adapter.py | 11 ++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/adapters/codex/src/nemo_fabric_adapters/codex/adapter.py b/adapters/codex/src/nemo_fabric_adapters/codex/adapter.py index e6d368f6..72c42f71 100644 --- a/adapters/codex/src/nemo_fabric_adapters/codex/adapter.py +++ b/adapters/codex/src/nemo_fabric_adapters/codex/adapter.py @@ -22,6 +22,7 @@ AsyncCodex, CodexConfig, CodexError, + JsonRpcError, Sandbox, TransportClosedError, is_retryable_error, @@ -793,11 +794,14 @@ def sdk_failure(error: BaseException) -> dict[str, Any]: "codex_connection_failed", "Codex SDK runtime connection closed" ) if isinstance(error, CodexError): + metadata = {"sdk_error": type(error).__name__} + if isinstance(error, JsonRpcError): + metadata["jsonrpc_code"] = error.code return _failure( "codex_sdk_failed", "Codex SDK request failed", retryable=is_retryable_error(error), - sdk_error=type(error).__name__, + **metadata, ) if isinstance(error, OSError): return _failure( diff --git a/tests/adapters/test_codex_adapter.py b/tests/adapters/test_codex_adapter.py index d47df4ae..9efb8beb 100644 --- a/tests/adapters/test_codex_adapter.py +++ b/tests/adapters/test_codex_adapter.py @@ -13,7 +13,7 @@ import pytest from nemo_fabric import Fabric from nemo_fabric_adapters.codex import adapter -from openai_codex import AsyncCodex, AsyncThread, AsyncTurnHandle +from openai_codex import AsyncCodex, AsyncThread, AsyncTurnHandle, JsonRpcError from openai_codex.types import TurnStatus @@ -711,6 +711,15 @@ def test_failed_sdk_turn_is_normalized_and_transport_is_closed( assert mock_codex.instances[0].closed is True +def test_sdk_failure_preserves_jsonrpc_code(): + output = adapter.sdk_failure(JsonRpcError(-32000, "provider failure")) + + assert output["error"]["metadata"] == { + "sdk_error": "JsonRpcError", + "jsonrpc_code": -32000, + } + + def test_incomplete_sdk_turn_is_failed(codex_payload, mock_codex): result = successful_result(response=None) mock_codex.next_result = result