@@ -604,10 +604,8 @@ def test_graph_state(mock_client):
604604 graph .add_edge ("fake_plain" , "fake_llm" )
605605 graph .add_edge ("fake_llm" , END )
606606
607- result = graph .compile ().invoke (
608- {"messages" : [HumanMessage (content = "What's a bar?" )], "xyz" : None },
609- config = config ,
610- )
607+ initial_state = {"messages" : [HumanMessage (content = "What's a bar?" )], "xyz" : None }
608+ result = graph .compile ().invoke (initial_state , config = config )
611609
612610 assert len (result ["messages" ]) == 3
613611 assert isinstance (result ["messages" ][0 ], HumanMessage )
@@ -617,26 +615,104 @@ def test_graph_state(mock_client):
617615 assert isinstance (result ["messages" ][2 ], AIMessage )
618616 assert result ["messages" ][2 ].content == "It's a type of greeble."
619617
620- assert mock_client .capture .call_count == 2
621- generation_args = mock_client .capture .call_args_list [0 ][1 ]
622- trace_args = mock_client .capture .call_args_list [1 ][1 ]
623- assert generation_args ["event" ] == "$ai_generation"
618+ assert mock_client .capture .call_count == 11
619+ calls = [call [1 ] for call in mock_client .capture .call_args_list ]
620+
621+ trace_args = calls [10 ]
622+ trace_props = calls [10 ]["properties" ]
623+
624+ # Events are captured in the reverse order.
625+ # Check all trace_ids
626+ for call in calls :
627+ assert call ["properties" ]["$ai_trace_id" ] == trace_props ["$ai_trace_id" ]
628+
629+ # First span, write the state
630+ assert calls [0 ]["event" ] == "$ai_span"
631+ assert calls [0 ]["properties" ]["$ai_parent_id" ] == calls [2 ]["properties" ]["$ai_span_id" ]
632+ assert "$ai_span_id" in calls [0 ]["properties" ]
633+ assert calls [0 ]["properties" ]["$ai_input_state" ] == initial_state
634+ assert calls [0 ]["properties" ]["$ai_output_state" ] == initial_state
635+
636+ # Second span, set the START node
637+ assert calls [1 ]["event" ] == "$ai_span"
638+ assert calls [1 ]["properties" ]["$ai_parent_id" ] == calls [2 ]["properties" ]["$ai_span_id" ]
639+ assert "$ai_span_id" in calls [1 ]["properties" ]
640+ assert calls [1 ]["properties" ]["$ai_input_state" ] == initial_state
641+ assert calls [1 ]["properties" ]["$ai_output_state" ] == initial_state
642+
643+ # Third span, finish initialization
644+ assert calls [2 ]["event" ] == "$ai_span"
645+ assert "$ai_span_id" in calls [2 ]["properties" ]
646+ assert calls [2 ]["properties" ]["$ai_span_name" ] == START
647+ assert calls [2 ]["properties" ]["$ai_parent_id" ] == trace_props ["$ai_trace_id" ]
648+ assert calls [2 ]["properties" ]["$ai_input_state" ] == initial_state
649+ assert calls [2 ]["properties" ]["$ai_output_state" ] == initial_state
650+
651+ # Fourth span, save the value of fake_plain during its execution
652+ second_state = {
653+ "messages" : [HumanMessage (content = "What's a bar?" ), AIMessage (content = "Let's explore bar." )],
654+ "xyz" : "abc" ,
655+ }
656+ assert calls [3 ]["event" ] == "$ai_span"
657+ assert calls [3 ]["properties" ]["$ai_parent_id" ] == calls [4 ]["properties" ]["$ai_span_id" ]
658+ assert "$ai_span_id" in calls [3 ]["properties" ]
659+ assert calls [3 ]["properties" ]["$ai_input_state" ] == second_state
660+ assert calls [3 ]["properties" ]["$ai_output_state" ] == second_state
661+
662+ # Fifth span, run the fake_plain node
663+ assert calls [4 ]["event" ] == "$ai_span"
664+ assert "$ai_span_id" in calls [4 ]["properties" ]
665+ assert calls [4 ]["properties" ]["$ai_span_name" ] == "fake_plain"
666+ assert calls [4 ]["properties" ]["$ai_parent_id" ] == trace_props ["$ai_trace_id" ]
667+ assert calls [4 ]["properties" ]["$ai_input_state" ] == initial_state
668+ assert calls [4 ]["properties" ]["$ai_output_state" ] == second_state
669+
670+ # Sixth span, chat prompt template
671+ assert calls [5 ]["event" ] == "$ai_span"
672+ assert calls [5 ]["properties" ]["$ai_parent_id" ] == calls [7 ]["properties" ]["$ai_span_id" ]
673+ assert "$ai_span_id" in calls [5 ]["properties" ]
674+ assert calls [5 ]["properties" ]["$ai_span_name" ] == "ChatPromptTemplate"
675+
676+ # 7. Generation, fake_llm
677+ assert calls [6 ]["event" ] == "$ai_generation"
678+ assert calls [6 ]["properties" ]["$ai_parent_id" ] == calls [7 ]["properties" ]["$ai_span_id" ]
679+ assert "$ai_generation_id" in calls [6 ]["properties" ]
680+ assert "$ai_span_name" not in calls [6 ]["properties" ]
681+
682+ # 8. Span, RunnableSequence
683+ assert calls [7 ]["event" ] == "$ai_span"
684+ assert calls [7 ]["properties" ]["$ai_parent_id" ] == calls [9 ]["properties" ]["$ai_span_id" ]
685+ assert "$ai_span_id" in calls [7 ]["properties" ]
686+ assert calls [7 ]["properties" ]["$ai_span_name" ] == "RunnableSequence"
687+
688+ # 9. Span, fake_llm write
689+ assert calls [8 ]["event" ] == "$ai_span"
690+ assert calls [8 ]["properties" ]["$ai_parent_id" ] == calls [9 ]["properties" ]["$ai_span_id" ]
691+ assert "$ai_span_id" in calls [8 ]["properties" ]
692+
693+ # 10. Span, fake_llm node
694+ assert calls [9 ]["event" ] == "$ai_span"
695+ assert calls [9 ]["properties" ]["$ai_parent_id" ] == trace_props ["$ai_trace_id" ]
696+ assert "$ai_span_id" in calls [9 ]["properties" ]
697+ assert calls [9 ]["properties" ]["$ai_span_name" ] == "fake_llm"
698+
699+ # 11. Trace
624700 assert trace_args ["event" ] == "$ai_trace"
625- assert trace_args [ "properties" ] ["$ai_trace_name" ] == "LangGraph"
626-
627- assert len (trace_args [ "properties" ] ["$ai_input_state" ]["messages" ]) == 1
628- assert isinstance (trace_args [ "properties" ] ["$ai_input_state" ]["messages" ][0 ], HumanMessage )
629- assert trace_args [ "properties" ] ["$ai_input_state" ]["messages" ][0 ].content == "What's a bar?"
630- assert trace_args [ "properties" ] ["$ai_input_state" ]["messages" ][0 ].type == "human"
631- assert trace_args [ "properties" ] ["$ai_input_state" ]["xyz" ] is None
632- assert len (trace_args [ "properties" ] ["$ai_output_state" ]["messages" ]) == 3
633-
634- assert isinstance (trace_args [ "properties" ] ["$ai_output_state" ]["messages" ][0 ], HumanMessage )
635- assert trace_args [ "properties" ] ["$ai_output_state" ]["messages" ][0 ].content == "What's a bar?"
636- assert isinstance (trace_args [ "properties" ] ["$ai_output_state" ]["messages" ][1 ], AIMessage )
637- assert trace_args [ "properties" ] ["$ai_output_state" ]["messages" ][1 ].content == "Let's explore bar."
638- assert isinstance (trace_args [ "properties" ] ["$ai_output_state" ]["messages" ][2 ], AIMessage )
639- assert trace_args [ "properties" ] ["$ai_output_state" ]["messages" ][2 ].content == "It's a type of greeble."
701+ assert trace_props ["$ai_trace_name" ] == "LangGraph"
702+
703+ assert len (trace_props ["$ai_input_state" ]["messages" ]) == 1
704+ assert isinstance (trace_props ["$ai_input_state" ]["messages" ][0 ], HumanMessage )
705+ assert trace_props ["$ai_input_state" ]["messages" ][0 ].content == "What's a bar?"
706+ assert trace_props ["$ai_input_state" ]["messages" ][0 ].type == "human"
707+ assert trace_props ["$ai_input_state" ]["xyz" ] is None
708+ assert len (trace_props ["$ai_output_state" ]["messages" ]) == 3
709+
710+ assert isinstance (trace_props ["$ai_output_state" ]["messages" ][0 ], HumanMessage )
711+ assert trace_props ["$ai_output_state" ]["messages" ][0 ].content == "What's a bar?"
712+ assert isinstance (trace_props ["$ai_output_state" ]["messages" ][1 ], AIMessage )
713+ assert trace_props ["$ai_output_state" ]["messages" ][1 ].content == "Let's explore bar."
714+ assert isinstance (trace_props ["$ai_output_state" ]["messages" ][2 ], AIMessage )
715+ assert trace_props ["$ai_output_state" ]["messages" ][2 ].content == "It's a type of greeble."
640716 assert trace_args ["properties" ]["$ai_output_state" ]["xyz" ] == "abc"
641717
642718
0 commit comments