aba4934274
Older nemo-relay bindings reject metadata= on scope.pop, which aborted turn finalization and left scopes open. Filter kwargs to what the live binding accepts so close paths can complete.
122 lines
3.7 KiB
Python
122 lines
3.7 KiB
Python
"""Regression for #78993: scope.pop metadata kwarg on older NeMo Relay."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import inspect
|
|
import logging
|
|
import tempfile
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from agent import relay_runtime
|
|
|
|
|
|
def test_pop_relay_scope_omits_unsupported_metadata_kwarg():
|
|
calls: list[tuple[object, dict]] = []
|
|
|
|
def pop_without_metadata(handle, *, output=None):
|
|
calls.append((handle, {"output": output}))
|
|
|
|
relay = SimpleNamespace(scope=SimpleNamespace(pop=pop_without_metadata))
|
|
handle = ("scope", "hermes.turn", 1)
|
|
|
|
relay_runtime.pop_relay_scope(
|
|
relay,
|
|
handle,
|
|
output={"outcome": "success"},
|
|
metadata={"hermes.relay.schema_version": "hermes.relay.runtime.v1"},
|
|
)
|
|
|
|
assert calls == [(handle, {"output": {"outcome": "success"}})]
|
|
|
|
|
|
def test_pop_relay_scope_forwards_metadata_when_supported():
|
|
calls: list[tuple[object, dict]] = []
|
|
|
|
def pop_with_metadata(handle, *, output=None, metadata=None, timestamp=None):
|
|
calls.append(
|
|
(
|
|
handle,
|
|
{
|
|
"output": output,
|
|
"metadata": metadata,
|
|
"timestamp": timestamp,
|
|
},
|
|
)
|
|
)
|
|
|
|
relay = SimpleNamespace(scope=SimpleNamespace(pop=pop_with_metadata))
|
|
handle = ("scope", "hermes.turn", 2)
|
|
metadata = {"hermes.relay.runtime_instance": "abc"}
|
|
|
|
relay_runtime.pop_relay_scope(
|
|
relay,
|
|
handle,
|
|
output={"outcome": "error"},
|
|
metadata=metadata,
|
|
)
|
|
|
|
assert calls == [
|
|
(
|
|
handle,
|
|
{
|
|
"output": {"outcome": "error"},
|
|
"metadata": metadata,
|
|
"timestamp": None,
|
|
},
|
|
)
|
|
]
|
|
|
|
|
|
def test_end_turn_finalization_survives_pop_without_metadata(monkeypatch, caplog):
|
|
"""Mirror #78993: nemo-relay 0.3.x rejects metadata= on scope.pop."""
|
|
pytest.importorskip("nemo_relay")
|
|
|
|
monkeypatch.setenv("HERMES_HOME", tempfile.mkdtemp())
|
|
relay_runtime._reset_for_tests()
|
|
lease = relay_runtime.SESSION_COORDINATOR.acquire_conversation(
|
|
profile_key=relay_runtime.current_profile_key(),
|
|
session_id="session-78993",
|
|
platform="cli",
|
|
)
|
|
turn = relay_runtime.SESSION_COORDINATOR.begin_turn(
|
|
lease,
|
|
turn_id="turn-1",
|
|
task_id="task-1",
|
|
)
|
|
lease.host.retain_managed_execution("test.relay_scope_pop")
|
|
|
|
original_pop = lease.host.relay.scope.pop
|
|
assert "metadata" in inspect.signature(original_pop).parameters
|
|
|
|
def pop_without_metadata(handle, *, output=None, timestamp=None):
|
|
return original_pop(handle, output=output, timestamp=timestamp)
|
|
|
|
monkeypatch.setattr(lease.host.relay.scope, "pop", pop_without_metadata)
|
|
|
|
logical = lease.host.run_in_session(
|
|
lease.session,
|
|
lease.host.relay.scope.push,
|
|
"logical-llm",
|
|
lease.host.relay.ScopeType.Custom,
|
|
handle=turn.handle,
|
|
input={},
|
|
metadata={"hermes.test": True},
|
|
)
|
|
turn.logical_llm_calls["api-1"] = logical
|
|
|
|
with caplog.at_level(logging.WARNING, logger="agent.relay_runtime"):
|
|
relay_runtime.SESSION_COORDINATOR.end_turn(turn, outcome="success")
|
|
|
|
joined = "\n".join(record.getMessage() for record in caplog.records)
|
|
assert "unexpected keyword argument 'metadata'" not in joined
|
|
assert "turn finalization failed" not in joined
|
|
assert "logical LLM finalization failed" not in joined
|
|
assert turn.logical_llm_calls == {}
|
|
assert turn.closed is True
|
|
|
|
lease.host.release_managed_execution("test.relay_scope_pop")
|
|
relay_runtime.SESSION_COORDINATOR.release_conversation(lease)
|
|
relay_runtime._reset_for_tests()
|