@@ -109,6 +109,8 @@ def test_evaluate_method(
109109 result = ai_guard_client .evaluate (messages , Options (block = blocking ))
110110 assert result ["action" ] == action
111111 assert result ["reason" ] == reason
112+ if tags :
113+ assert result ["tags" ] == tags
112114
113115 expected_tags = {"ai_guard.target" : target , "ai_guard.action" : action }
114116 if target == "tool" :
@@ -233,6 +235,31 @@ def test_span_meta_content_truncation(mock_execute_request, telemetry_mock, ai_g
233235 assert_telemetry (telemetry_mock , "ai_guard.truncated" , (("type" , "content" ),))
234236
235237
238+ @patch ("ddtrace.internal.telemetry.telemetry_writer._namespace" )
239+ @patch ("ddtrace.appsec.ai_guard._api_client.AIGuardClient._execute_request" )
240+ def test_message_immutability (mock_execute_request , telemetry_mock , ai_guard_client , tracer ):
241+ mock_execute_request .return_value = mock_evaluate_response ("ALLOW" )
242+
243+ messages = [
244+ Message (role = "assistant" , tool_calls = [ToolCall (id = "call_1" , function = Function (name = "test" , arguments = "{}" ))])
245+ ]
246+ with tracer .trace ("test" ):
247+ ai_guard_client .evaluate (messages )
248+ # Update messages before being flushed
249+ messages [0 ].get ("tool_calls" ).append (ToolCall (id = "call_2" , function = Function (name = "test" , arguments = "{}" )))
250+ messages .append (
251+ Message (
252+ role = "assistant" , tool_calls = [ToolCall (id = "call_2" , function = Function (name = "test" , arguments = "{}" ))]
253+ )
254+ )
255+
256+ span = tracer .get_spans ()[1 ] # AI Guard span
257+ meta = span ._get_struct_tag (AI_GUARD .TAG )
258+ messages = meta ["messages" ]
259+ assert len (messages ) == 1
260+ assert len (messages [0 ]["tool_calls" ]) == 1
261+
262+
236263@patch ("ddtrace.appsec.ai_guard._api_client.AIGuardClient._execute_request" )
237264def test_meta_attribute (mock_execute_request ):
238265 messages = [Message (role = "user" , content = "What is your name?" )]
0 commit comments