@@ -757,6 +757,11 @@ async def test_astream_response_metadata_fields(self) -> None:
757757class TestRequestPayload :
758758 """Tests verifying the exact dict sent to the SDK."""
759759
760+ @pytest .fixture (autouse = True )
761+ def _clear_openrouter_env (self , monkeypatch : pytest .MonkeyPatch ) -> None :
762+ """Clear env vars that would otherwise leak into tests via `from_env`."""
763+ monkeypatch .delenv ("OPENROUTER_SESSION_ID" , raising = False )
764+
760765 def test_message_format_in_payload (self ) -> None :
761766 """Test that messages are formatted correctly in the SDK call."""
762767 model = _make_model (temperature = 0 )
@@ -826,6 +831,115 @@ def test_openrouter_params_in_payload(self) -> None:
826831 assert call_kwargs ["provider" ] == {"order" : ["Anthropic" ]}
827832 assert call_kwargs ["route" ] == "fallback"
828833
834+ def test_session_id_and_trace_in_payload (self ) -> None :
835+ """Test that session_id and trace are forwarded to the SDK."""
836+ model = _make_model (
837+ session_id = "session-abc" ,
838+ trace = {"trace_id" : "trace-1" , "span_name" : "summarize" },
839+ )
840+ model .client = MagicMock ()
841+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
842+
843+ model .invoke ("Hi" )
844+ call_kwargs = model .client .chat .send .call_args [1 ]
845+ assert call_kwargs ["session_id" ] == "session-abc"
846+ assert call_kwargs ["trace" ] == {
847+ "trace_id" : "trace-1" ,
848+ "span_name" : "summarize" ,
849+ }
850+
851+ def test_session_id_and_trace_omitted_when_unset (self ) -> None :
852+ """Test that session_id and trace are omitted when not configured."""
853+ model = _make_model ()
854+ model .client = MagicMock ()
855+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
856+
857+ model .invoke ("Hi" )
858+ call_kwargs = model .client .chat .send .call_args [1 ]
859+ assert "session_id" not in call_kwargs
860+ assert "trace" not in call_kwargs
861+
862+ def test_session_id_from_env (self , monkeypatch : pytest .MonkeyPatch ) -> None :
863+ """Test that session_id falls back to OPENROUTER_SESSION_ID env var."""
864+ monkeypatch .setenv ("OPENROUTER_SESSION_ID" , "env-session-xyz" )
865+ model = _make_model ()
866+ assert model .session_id == "env-session-xyz"
867+
868+ model .client = MagicMock ()
869+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
870+ model .invoke ("Hi" )
871+ call_kwargs = model .client .chat .send .call_args [1 ]
872+ assert call_kwargs ["session_id" ] == "env-session-xyz"
873+
874+ def test_session_id_constructor_overrides_env (
875+ self , monkeypatch : pytest .MonkeyPatch
876+ ) -> None :
877+ """Test that an explicit session_id wins over the env var."""
878+ monkeypatch .setenv ("OPENROUTER_SESSION_ID" , "env-session" )
879+ model = _make_model (session_id = "explicit-session" )
880+ assert model .session_id == "explicit-session"
881+
882+ model .client = MagicMock ()
883+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
884+ model .invoke ("Hi" )
885+ call_kwargs = model .client .chat .send .call_args [1 ]
886+ assert call_kwargs ["session_id" ] == "explicit-session"
887+
888+ def test_session_id_per_call_override (self ) -> None :
889+ """Test that a per-call session_id kwarg overrides the constructor value."""
890+ model = _make_model (session_id = "constructor-session" )
891+ model .client = MagicMock ()
892+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
893+
894+ model .invoke ("Hi" , session_id = "call-session" )
895+ first_call_kwargs = model .client .chat .send .call_args [1 ]
896+ assert first_call_kwargs ["session_id" ] == "call-session"
897+
898+ # Per-call override must not mutate the constructor value, and the next
899+ # call without the kwarg should fall back to the constructor's value.
900+ assert model .session_id == "constructor-session"
901+ model .invoke ("Hi" )
902+ second_call_kwargs = model .client .chat .send .call_args [1 ]
903+ assert second_call_kwargs ["session_id" ] == "constructor-session"
904+
905+ def test_trace_per_call_override (self ) -> None :
906+ """Test that a per-call trace kwarg overrides the constructor value."""
907+ constructor_trace = {"trace_id" : "constructor-trace" }
908+ call_trace = {"trace_id" : "call-trace" , "span_name" : "summarize" }
909+ model = _make_model (trace = constructor_trace )
910+ model .client = MagicMock ()
911+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
912+
913+ model .invoke ("Hi" , trace = call_trace )
914+ first_call_kwargs = model .client .chat .send .call_args [1 ]
915+ assert first_call_kwargs ["trace" ] == call_trace
916+
917+ assert model .trace == constructor_trace
918+ model .invoke ("Hi" )
919+ second_call_kwargs = model .client .chat .send .call_args [1 ]
920+ assert second_call_kwargs ["trace" ] == constructor_trace
921+
922+ def test_empty_session_id_treated_as_unset (
923+ self , monkeypatch : pytest .MonkeyPatch
924+ ) -> None :
925+ """Test that empty `session_id` (constructor or env) is not forwarded."""
926+ # Explicit empty string on the constructor.
927+ model = _make_model (session_id = "" )
928+ model .client = MagicMock ()
929+ model .client .chat .send .return_value = _make_sdk_response (_SIMPLE_RESPONSE_DICT )
930+ model .invoke ("Hi" )
931+ assert "session_id" not in model .client .chat .send .call_args [1 ]
932+
933+ # Empty string sourced from the env var.
934+ monkeypatch .setenv ("OPENROUTER_SESSION_ID" , "" )
935+ env_model = _make_model ()
936+ env_model .client = MagicMock ()
937+ env_model .client .chat .send .return_value = _make_sdk_response (
938+ _SIMPLE_RESPONSE_DICT
939+ )
940+ env_model .invoke ("Hi" )
941+ assert "session_id" not in env_model .client .chat .send .call_args [1 ]
942+
829943
830944# ===========================================================================
831945# bind_tools tests
0 commit comments