@@ -853,110 +853,8 @@ def test_langchain_openai_tools_agent_with_config(
853853 assert tx ["contexts" ]["trace" ]["origin" ] == "manual"
854854
855855 invoke_agent_span = next (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.invoke_agent" )
856- chat_spans = list (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.chat" )
857- tool_exec_span = next (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.execute_tool" )
858-
859- assert len (chat_spans ) == 2
860-
861- assert invoke_agent_span ["origin" ] == "auto.ai.langchain"
862- assert chat_spans [0 ]["origin" ] == "auto.ai.langchain"
863- assert chat_spans [1 ]["origin" ] == "auto.ai.langchain"
864- assert tool_exec_span ["origin" ] == "auto.ai.langchain"
865-
866856 assert invoke_agent_span ["data" ]["gen_ai.function_id" ] == "my-snazzy-pipeline"
867857
868- # We can't guarantee anything about the "shape" of the langchain execution graph
869- assert len (list (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.chat" )) > 0
870-
871- # Token usage is only available in newer versions of langchain (v0.2+)
872- # where usage_metadata is supported on AIMessageChunk
873- if "gen_ai.usage.input_tokens" in chat_spans [0 ]["data" ]:
874- assert chat_spans [0 ]["data" ]["gen_ai.usage.input_tokens" ] == 142
875- assert chat_spans [0 ]["data" ]["gen_ai.usage.output_tokens" ] == 50
876- assert chat_spans [0 ]["data" ]["gen_ai.usage.total_tokens" ] == 192
877-
878- if "gen_ai.usage.input_tokens" in chat_spans [1 ]["data" ]:
879- assert chat_spans [1 ]["data" ]["gen_ai.usage.input_tokens" ] == 89
880- assert chat_spans [1 ]["data" ]["gen_ai.usage.output_tokens" ] == 28
881- assert chat_spans [1 ]["data" ]["gen_ai.usage.total_tokens" ] == 117
882-
883- if send_default_pii and include_prompts :
884- assert "5" in chat_spans [0 ]["data" ][SPANDATA .GEN_AI_RESPONSE_TEXT ]
885- assert "word" in tool_exec_span ["data" ][SPANDATA .GEN_AI_TOOL_INPUT ]
886- assert 5 == int (tool_exec_span ["data" ][SPANDATA .GEN_AI_TOOL_OUTPUT ])
887-
888- param_id = request .node .callspec .id
889- if "string" in param_id :
890- assert [
891- {
892- "type" : "text" ,
893- "content" : "You are very powerful assistant, but don't know current events" ,
894- }
895- ] == json .loads (chat_spans [0 ]["data" ][SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS ])
896- else :
897- assert [
898- {
899- "type" : "text" ,
900- "content" : "You are a helpful assistant." ,
901- },
902- {
903- "type" : "text" ,
904- "content" : "Be concise and clear." ,
905- },
906- ] == json .loads (chat_spans [0 ]["data" ][SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS ])
907-
908- assert "5" in chat_spans [1 ]["data" ][SPANDATA .GEN_AI_RESPONSE_TEXT ]
909-
910- # Verify tool calls are recorded when PII is enabled
911- assert SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS in chat_spans [0 ].get ("data" , {}), (
912- "Tool calls should be recorded when send_default_pii=True and include_prompts=True"
913- )
914- tool_calls_data = chat_spans [0 ]["data" ][SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS ]
915- assert isinstance (tool_calls_data , (list , str )) # Could be serialized
916- if isinstance (tool_calls_data , str ):
917- assert "get_word_length" in tool_calls_data
918- elif isinstance (tool_calls_data , list ) and len (tool_calls_data ) > 0 :
919- # Check if tool calls contain expected function name
920- tool_call_str = str (tool_calls_data )
921- assert "get_word_length" in tool_call_str
922- else :
923- assert SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS not in chat_spans [0 ].get ("data" , {})
924- assert SPANDATA .GEN_AI_REQUEST_MESSAGES not in chat_spans [0 ].get ("data" , {})
925- assert SPANDATA .GEN_AI_RESPONSE_TEXT not in chat_spans [0 ].get ("data" , {})
926- assert SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS not in chat_spans [1 ].get ("data" , {})
927- assert SPANDATA .GEN_AI_REQUEST_MESSAGES not in chat_spans [1 ].get ("data" , {})
928- assert SPANDATA .GEN_AI_RESPONSE_TEXT not in chat_spans [1 ].get ("data" , {})
929- assert SPANDATA .GEN_AI_TOOL_INPUT not in tool_exec_span .get ("data" , {})
930- assert SPANDATA .GEN_AI_TOOL_OUTPUT not in tool_exec_span .get ("data" , {})
931-
932- # Verify tool calls are NOT recorded when PII is disabled
933- assert SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS not in chat_spans [0 ].get (
934- "data" , {}
935- ), (
936- f"Tool calls should NOT be recorded when send_default_pii={ send_default_pii } "
937- f"and include_prompts={ include_prompts } "
938- )
939- assert SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS not in chat_spans [1 ].get (
940- "data" , {}
941- ), (
942- f"Tool calls should NOT be recorded when send_default_pii={ send_default_pii } "
943- f"and include_prompts={ include_prompts } "
944- )
945-
946- # Verify finish_reasons is always an array of strings
947- assert chat_spans [0 ]["data" ][SPANDATA .GEN_AI_RESPONSE_FINISH_REASONS ] == [
948- "function_call"
949- ]
950- assert chat_spans [1 ]["data" ][SPANDATA .GEN_AI_RESPONSE_FINISH_REASONS ] == ["stop" ]
951-
952- # Verify that available tools are always recorded regardless of PII settings
953- for chat_span in chat_spans :
954- tools_data = chat_span ["data" ][SPANDATA .GEN_AI_REQUEST_AVAILABLE_TOOLS ]
955- assert tools_data is not None , (
956- "Available tools should always be recorded regardless of PII settings"
957- )
958- assert "get_word_length" in tools_data
959-
960858
961859@pytest .mark .parametrize (
962860 "send_default_pii, include_prompts" ,
@@ -1258,110 +1156,8 @@ def test_langchain_openai_tools_agent_stream_with_config(
12581156 assert tx ["contexts" ]["trace" ]["origin" ] == "manual"
12591157
12601158 invoke_agent_span = next (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.invoke_agent" )
1261- chat_spans = list (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.chat" )
1262- tool_exec_span = next (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.execute_tool" )
1263-
1264- assert len (chat_spans ) == 2
1265-
1266- assert invoke_agent_span ["origin" ] == "auto.ai.langchain"
1267- assert chat_spans [0 ]["origin" ] == "auto.ai.langchain"
1268- assert chat_spans [1 ]["origin" ] == "auto.ai.langchain"
1269- assert tool_exec_span ["origin" ] == "auto.ai.langchain"
1270-
12711159 assert invoke_agent_span ["data" ]["gen_ai.function_id" ] == "my-snazzy-pipeline"
12721160
1273- # We can't guarantee anything about the "shape" of the langchain execution graph
1274- assert len (list (x for x in tx ["spans" ] if x ["op" ] == "gen_ai.chat" )) > 0
1275-
1276- # Token usage is only available in newer versions of langchain (v0.2+)
1277- # where usage_metadata is supported on AIMessageChunk
1278- if "gen_ai.usage.input_tokens" in chat_spans [0 ]["data" ]:
1279- assert chat_spans [0 ]["data" ]["gen_ai.usage.input_tokens" ] == 142
1280- assert chat_spans [0 ]["data" ]["gen_ai.usage.output_tokens" ] == 50
1281- assert chat_spans [0 ]["data" ]["gen_ai.usage.total_tokens" ] == 192
1282-
1283- if "gen_ai.usage.input_tokens" in chat_spans [1 ]["data" ]:
1284- assert chat_spans [1 ]["data" ]["gen_ai.usage.input_tokens" ] == 89
1285- assert chat_spans [1 ]["data" ]["gen_ai.usage.output_tokens" ] == 28
1286- assert chat_spans [1 ]["data" ]["gen_ai.usage.total_tokens" ] == 117
1287-
1288- if send_default_pii and include_prompts :
1289- assert "5" in chat_spans [0 ]["data" ][SPANDATA .GEN_AI_RESPONSE_TEXT ]
1290- assert "word" in tool_exec_span ["data" ][SPANDATA .GEN_AI_TOOL_INPUT ]
1291- assert 5 == int (tool_exec_span ["data" ][SPANDATA .GEN_AI_TOOL_OUTPUT ])
1292-
1293- param_id = request .node .callspec .id
1294- if "string" in param_id :
1295- assert [
1296- {
1297- "type" : "text" ,
1298- "content" : "You are very powerful assistant, but don't know current events" ,
1299- }
1300- ] == json .loads (chat_spans [0 ]["data" ][SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS ])
1301- else :
1302- assert [
1303- {
1304- "type" : "text" ,
1305- "content" : "You are a helpful assistant." ,
1306- },
1307- {
1308- "type" : "text" ,
1309- "content" : "Be concise and clear." ,
1310- },
1311- ] == json .loads (chat_spans [0 ]["data" ][SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS ])
1312-
1313- assert "5" in chat_spans [1 ]["data" ][SPANDATA .GEN_AI_RESPONSE_TEXT ]
1314-
1315- # Verify tool calls are recorded when PII is enabled
1316- assert SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS in chat_spans [0 ].get ("data" , {}), (
1317- "Tool calls should be recorded when send_default_pii=True and include_prompts=True"
1318- )
1319- tool_calls_data = chat_spans [0 ]["data" ][SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS ]
1320- assert isinstance (tool_calls_data , (list , str )) # Could be serialized
1321- if isinstance (tool_calls_data , str ):
1322- assert "get_word_length" in tool_calls_data
1323- elif isinstance (tool_calls_data , list ) and len (tool_calls_data ) > 0 :
1324- # Check if tool calls contain expected function name
1325- tool_call_str = str (tool_calls_data )
1326- assert "get_word_length" in tool_call_str
1327- else :
1328- assert SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS not in chat_spans [0 ].get ("data" , {})
1329- assert SPANDATA .GEN_AI_REQUEST_MESSAGES not in chat_spans [0 ].get ("data" , {})
1330- assert SPANDATA .GEN_AI_RESPONSE_TEXT not in chat_spans [0 ].get ("data" , {})
1331- assert SPANDATA .GEN_AI_SYSTEM_INSTRUCTIONS not in chat_spans [1 ].get ("data" , {})
1332- assert SPANDATA .GEN_AI_REQUEST_MESSAGES not in chat_spans [1 ].get ("data" , {})
1333- assert SPANDATA .GEN_AI_RESPONSE_TEXT not in chat_spans [1 ].get ("data" , {})
1334- assert SPANDATA .GEN_AI_TOOL_INPUT not in tool_exec_span .get ("data" , {})
1335- assert SPANDATA .GEN_AI_TOOL_OUTPUT not in tool_exec_span .get ("data" , {})
1336-
1337- # Verify tool calls are NOT recorded when PII is disabled
1338- assert SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS not in chat_spans [0 ].get (
1339- "data" , {}
1340- ), (
1341- f"Tool calls should NOT be recorded when send_default_pii={ send_default_pii } "
1342- f"and include_prompts={ include_prompts } "
1343- )
1344- assert SPANDATA .GEN_AI_RESPONSE_TOOL_CALLS not in chat_spans [1 ].get (
1345- "data" , {}
1346- ), (
1347- f"Tool calls should NOT be recorded when send_default_pii={ send_default_pii } "
1348- f"and include_prompts={ include_prompts } "
1349- )
1350-
1351- # Verify finish_reasons is always an array of strings
1352- assert chat_spans [0 ]["data" ][SPANDATA .GEN_AI_RESPONSE_FINISH_REASONS ] == [
1353- "function_call"
1354- ]
1355- assert chat_spans [1 ]["data" ][SPANDATA .GEN_AI_RESPONSE_FINISH_REASONS ] == ["stop" ]
1356-
1357- # Verify that available tools are always recorded regardless of PII settings
1358- for chat_span in chat_spans :
1359- tools_data = chat_span ["data" ][SPANDATA .GEN_AI_REQUEST_AVAILABLE_TOOLS ]
1360- assert tools_data is not None , (
1361- "Available tools should always be recorded regardless of PII settings"
1362- )
1363- assert "get_word_length" in tools_data
1364-
13651161
13661162def test_langchain_error (sentry_init , capture_events ):
13671163 global llm_type
0 commit comments