@@ -111,6 +111,7 @@ def _create_track_request_callable(
111111 input_variables ,
112112 group_id ,
113113 pl_run_span_id : Union [str , None ] = None ,
114+ request_start_time : Union [float , None ] = None ,
114115 ):
115116 def _track_request (** body ):
116117 track_request_kwargs = self ._prepare_track_request_kwargs (
@@ -120,6 +121,7 @@ def _track_request(**body):
120121 input_variables ,
121122 group_id ,
122123 pl_run_span_id ,
124+ request_start_time = request_start_time ,
123125 ** body ,
124126 )
125127 return track_request (self .base_url , self .throw_on_error , ** track_request_kwargs )
@@ -142,6 +144,8 @@ def _run_internal(
142144 provider : Union [str , None ] = None ,
143145 model : Union [str , None ] = None ,
144146 ) -> Dict [str , Any ]:
147+ import datetime
148+
145149 get_prompt_template_params = self ._prepare_get_prompt_template_params (
146150 prompt_version = prompt_version ,
147151 prompt_release_label = prompt_release_label ,
@@ -168,6 +172,9 @@ def _run_internal(
168172 stream = stream ,
169173 )
170174
175+ # Capture start time before making the LLM request
176+ request_start_time = datetime .datetime .now (datetime .timezone .utc ).timestamp ()
177+
171178 # response is just whatever the LLM call returns
172179 # streaming=False > Pydantic model instance
173180 # streaming=True > generator that yields ChatCompletionChunk pieces as they arrive
@@ -177,6 +184,9 @@ def _run_internal(
177184 function_kwargs = llm_data ["function_kwargs" ],
178185 )
179186
187+ # Capture end time after the LLM request completes
188+ request_end_time = datetime .datetime .now (datetime .timezone .utc ).timestamp ()
189+
180190 if stream :
181191 return stream_response (
182192 generator = response ,
@@ -186,6 +196,7 @@ def _run_internal(
186196 input_variables = input_variables ,
187197 group_id = group_id ,
188198 pl_run_span_id = pl_run_span_id ,
199+ request_start_time = request_start_time ,
189200 ),
190201 map_results = llm_data ["stream_function" ],
191202 metadata = llm_data ["prompt_blueprint" ]["metadata" ],
@@ -204,6 +215,8 @@ def _run_internal(
204215 pl_run_span_id ,
205216 metadata = metadata ,
206217 request_response = request_response ,
218+ request_start_time = request_start_time ,
219+ request_end_time = request_end_time ,
207220 )
208221
209222 return {
@@ -561,6 +574,7 @@ async def _create_track_request_callable(
561574 input_variables ,
562575 group_id ,
563576 pl_run_span_id : Union [str , None ] = None ,
577+ request_start_time : Union [float , None ] = None ,
564578 ):
565579 async def _track_request (** body ):
566580 track_request_kwargs = self ._prepare_track_request_kwargs (
@@ -570,6 +584,7 @@ async def _track_request(**body):
570584 input_variables ,
571585 group_id ,
572586 pl_run_span_id ,
587+ request_start_time = request_start_time ,
573588 ** body ,
574589 )
575590 return await atrack_request (self .base_url , self .throw_on_error , ** track_request_kwargs )
@@ -614,6 +629,8 @@ async def _run_internal(
614629 provider : Union [str , None ] = None ,
615630 model : Union [str , None ] = None ,
616631 ) -> Dict [str , Any ]:
632+ import datetime
633+
617634 get_prompt_template_params = self ._prepare_get_prompt_template_params (
618635 prompt_version = prompt_version ,
619636 prompt_release_label = prompt_release_label ,
@@ -641,12 +658,18 @@ async def _run_internal(
641658 is_async = True ,
642659 )
643660
661+ # Capture start time before making the LLM request
662+ request_start_time = datetime .datetime .now (datetime .timezone .utc ).timestamp ()
663+
644664 response = await llm_data ["request_function" ](
645665 prompt_blueprint = llm_data ["prompt_blueprint" ],
646666 client_kwargs = llm_data ["client_kwargs" ],
647667 function_kwargs = llm_data ["function_kwargs" ],
648668 )
649669
670+ # Capture end time after the LLM request completes
671+ request_end_time = datetime .datetime .now (datetime .timezone .utc ).timestamp ()
672+
650673 if hasattr (response , "model_dump" ):
651674 request_response = response .model_dump (mode = "json" )
652675 else :
@@ -659,6 +682,7 @@ async def _run_internal(
659682 input_variables = input_variables ,
660683 group_id = group_id ,
661684 pl_run_span_id = pl_run_span_id ,
685+ request_start_time = request_start_time ,
662686 )
663687 return astream_response (
664688 request_response ,
@@ -675,6 +699,8 @@ async def _run_internal(
675699 pl_run_span_id ,
676700 metadata = metadata ,
677701 request_response = request_response ,
702+ request_start_time = request_start_time ,
703+ request_end_time = request_end_time ,
678704 )
679705
680706 return {
0 commit comments