mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
fix(relay): ignore rewrites after codec baseline failure
Signed-off-by: Alex Fournier <afournier@nvidia.com>
This commit is contained in:
parent
ec6c881453
commit
bfae9c2572
2 changed files with 79 additions and 5 deletions
|
|
@ -855,13 +855,13 @@ def _provider_request(
|
|||
request: Any,
|
||||
*,
|
||||
relay_request_body: dict[str, Any],
|
||||
codec_baseline_body: dict[str, Any],
|
||||
codec_baseline_body: dict[str, Any] | None,
|
||||
metadata: dict[str, Any] | None,
|
||||
) -> dict[str, Any]:
|
||||
content = getattr(request, "content", request)
|
||||
if not isinstance(content, dict):
|
||||
content = relay_request_body
|
||||
if _json_equal(content, relay_request_body):
|
||||
if codec_baseline_body is None or _json_equal(content, relay_request_body):
|
||||
final = dict(original)
|
||||
else:
|
||||
baseline = codec_baseline_body
|
||||
|
|
@ -1006,7 +1006,7 @@ def _codec_round_trip_request_body(
|
|||
*,
|
||||
relay_request_body: dict[str, Any],
|
||||
metadata: dict[str, Any] | None,
|
||||
) -> dict[str, Any]:
|
||||
) -> dict[str, Any] | None:
|
||||
"""Return the codec-only request shape used to identify real rewrites."""
|
||||
codec = _codec(relay, metadata)
|
||||
if codec is None:
|
||||
|
|
@ -1018,8 +1018,16 @@ def _codec_round_trip_request_body(
|
|||
if isinstance(content, dict):
|
||||
return _provider_request_body(content, metadata)
|
||||
except Exception:
|
||||
logger.debug("NeMo Relay request codec baseline failed", exc_info=True)
|
||||
return _provider_request_body(relay_request_body, metadata)
|
||||
logger.warning(
|
||||
"NeMo Relay request codec baseline failed; ignoring request rewrites",
|
||||
exc_info=True,
|
||||
)
|
||||
return None
|
||||
logger.warning(
|
||||
"NeMo Relay request codec returned an unsupported baseline; "
|
||||
"ignoring request rewrites"
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
def _provider_request_body(
|
||||
|
|
|
|||
|
|
@ -1349,6 +1349,72 @@ def test_request_rewrite_preserves_fields_dropped_by_codec(relay_turn, monkeypat
|
|||
]
|
||||
|
||||
|
||||
def test_request_rewrite_is_ignored_when_codec_baseline_fails(
|
||||
relay_turn, monkeypatch
|
||||
):
|
||||
relay, _turn = relay_turn
|
||||
captured_requests = []
|
||||
original = {
|
||||
"model": "test-model",
|
||||
"messages": [],
|
||||
"temperature": 0.0,
|
||||
"extra_body": {"routing": {"provider": "nim"}},
|
||||
}
|
||||
|
||||
async def lossy_execute(_name, request, callback, **_kwargs):
|
||||
rewritten = {
|
||||
key: value
|
||||
for key, value in request.content.items()
|
||||
if key != "extra_body"
|
||||
}
|
||||
rewritten["temperature"] = 0.25
|
||||
return callback(relay.LLMRequest(request.headers, rewritten))
|
||||
|
||||
monkeypatch.setattr(relay.llm, "execute", lossy_execute)
|
||||
monkeypatch.setattr(
|
||||
relay_llm,
|
||||
"_codec_round_trip_request_body",
|
||||
lambda *_args, **_kwargs: None,
|
||||
)
|
||||
|
||||
relay_llm.execute(
|
||||
original,
|
||||
lambda request: captured_requests.append(request) or {"content": "ok"},
|
||||
session_id="session-1",
|
||||
name="test-provider",
|
||||
model_name="test-model",
|
||||
metadata={
|
||||
"api_mode": "chat_completions",
|
||||
"api_request_id": "request-codec-failure",
|
||||
},
|
||||
)
|
||||
|
||||
assert captured_requests == [original]
|
||||
|
||||
|
||||
def test_codec_baseline_failure_is_explicit(relay_turn, monkeypatch, caplog):
|
||||
relay, _turn = relay_turn
|
||||
request_body = {"model": "test-model", "messages": []}
|
||||
request = relay.LLMRequest({}, request_body)
|
||||
|
||||
class FailingCodec:
|
||||
def decode(self, _request):
|
||||
raise RuntimeError("simulated codec failure")
|
||||
|
||||
monkeypatch.setattr(relay_llm, "_codec", lambda *_args, **_kwargs: FailingCodec())
|
||||
|
||||
with caplog.at_level("WARNING", logger="agent.relay_llm"):
|
||||
baseline = relay_llm._codec_round_trip_request_body(
|
||||
relay,
|
||||
request,
|
||||
relay_request_body=request_body,
|
||||
metadata={"api_mode": "chat_completions"},
|
||||
)
|
||||
|
||||
assert baseline is None
|
||||
assert "ignoring request rewrites" in caplog.text
|
||||
|
||||
|
||||
def test_request_rewrite_can_remove_codec_represented_field(relay_turn, monkeypatch):
|
||||
relay, _turn = relay_turn
|
||||
captured_requests = []
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue