@@ -173,8 +173,9 @@ def on_chain_end(
173173 ** kwargs : Any ,
174174 ):
175175 """Capture a completed LangChain chain run as a trace or span."""
176- self ._log_debug_event ("on_chain_end" , run_id , parent_run_id , outputs = outputs )
177- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , outputs )
176+ self ._capture_trace_or_span_run (
177+ "on_chain_end" , "outputs" , outputs , run_id , parent_run_id
178+ )
178179
179180 def on_chain_error (
180181 self ,
@@ -185,8 +186,9 @@ def on_chain_error(
185186 ** kwargs : Any ,
186187 ):
187188 """Capture a failed LangChain chain run as a trace or span."""
188- self ._log_debug_event ("on_chain_error" , run_id , parent_run_id , error = error )
189- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , error )
189+ self ._capture_trace_or_span_run (
190+ "on_chain_error" , "error" , error , run_id , parent_run_id
191+ )
190192
191193 def on_chat_model_start (
192194 self ,
@@ -243,10 +245,9 @@ def on_llm_end(
243245 """
244246 The callback works for both streaming and non-streaming runs. For streaming runs, the chain must set `stream_usage=True` in the LLM.
245247 """
246- self ._log_debug_event (
247- "on_llm_end" , run_id , parent_run_id , response = response , kwargs = kwargs
248+ self ._capture_generation_run (
249+ "on_llm_end" , "response" , response , run_id , parent_run_id , kwargs = kwargs
248250 )
249- self ._pop_run_and_capture_generation (run_id , parent_run_id , response )
250251
251252 def on_llm_error (
252253 self ,
@@ -257,8 +258,9 @@ def on_llm_error(
257258 ** kwargs : Any ,
258259 ):
259260 """Capture a failed LLM run as a PostHog AI generation event."""
260- self ._log_debug_event ("on_llm_error" , run_id , parent_run_id , error = error )
261- self ._pop_run_and_capture_generation (run_id , parent_run_id , error )
261+ self ._capture_generation_run (
262+ "on_llm_error" , "error" , error , run_id , parent_run_id
263+ )
262264
263265 def on_tool_start (
264266 self ,
@@ -288,8 +290,9 @@ def on_tool_end(
288290 ** kwargs : Any ,
289291 ) -> Any :
290292 """Capture a completed LangChain tool run as a span."""
291- self ._log_debug_event ("on_tool_end" , run_id , parent_run_id , output = output )
292- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , output )
293+ self ._capture_trace_or_span_run (
294+ "on_tool_end" , "output" , output , run_id , parent_run_id
295+ )
293296
294297 def on_tool_error (
295298 self ,
@@ -301,8 +304,9 @@ def on_tool_error(
301304 ** kwargs : Any ,
302305 ) -> Any :
303306 """Capture a failed LangChain tool run as a span."""
304- self ._log_debug_event ("on_tool_error" , run_id , parent_run_id , error = error )
305- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , error )
307+ self ._capture_trace_or_span_run (
308+ "on_tool_error" , "error" , error , run_id , parent_run_id
309+ )
306310
307311 def on_retriever_start (
308312 self ,
@@ -330,10 +334,9 @@ def on_retriever_end(
330334 ** kwargs : Any ,
331335 ):
332336 """Capture a completed LangChain retriever run as a span."""
333- self ._log_debug_event (
334- "on_retriever_end" , run_id , parent_run_id , documents = documents
337+ self ._capture_trace_or_span_run (
338+ "on_retriever_end" , "documents" , documents , run_id , parent_run_id
335339 )
336- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , documents )
337340
338341 def on_retriever_error (
339342 self ,
@@ -345,8 +348,9 @@ def on_retriever_error(
345348 ** kwargs : Any ,
346349 ) -> Any :
347350 """Run when Retriever errors."""
348- self ._log_debug_event ("on_retriever_error" , run_id , parent_run_id , error = error )
349- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , error )
351+ self ._capture_trace_or_span_run (
352+ "on_retriever_error" , "error" , error , run_id , parent_run_id
353+ )
350354
351355 def on_agent_action (
352356 self ,
@@ -370,8 +374,36 @@ def on_agent_finish(
370374 ** kwargs : Any ,
371375 ) -> Any :
372376 """Capture a completed LangChain agent action as a span."""
373- self ._log_debug_event ("on_agent_finish" , run_id , parent_run_id , finish = finish )
374- self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , finish )
377+ self ._capture_trace_or_span_run (
378+ "on_agent_finish" , "finish" , finish , run_id , parent_run_id
379+ )
380+
381+ def _capture_trace_or_span_run (
382+ self ,
383+ event_name : str ,
384+ payload_name : str ,
385+ payload : Any ,
386+ run_id : UUID ,
387+ parent_run_id : Optional [UUID ],
388+ ):
389+ self ._log_debug_event (
390+ event_name , run_id , parent_run_id , ** {payload_name : payload }
391+ )
392+ self ._pop_run_and_capture_trace_or_span (run_id , parent_run_id , payload )
393+
394+ def _capture_generation_run (
395+ self ,
396+ event_name : str ,
397+ payload_name : str ,
398+ payload : Any ,
399+ run_id : UUID ,
400+ parent_run_id : Optional [UUID ],
401+ ** extra : Any ,
402+ ):
403+ self ._log_debug_event (
404+ event_name , run_id , parent_run_id , ** {payload_name : payload }, ** extra
405+ )
406+ self ._pop_run_and_capture_generation (run_id , parent_run_id , payload )
375407
376408 def _set_parent_of_run (self , run_id : UUID , parent_run_id : Optional [UUID ] = None ):
377409 """
0 commit comments