66 StateType ,
77)
88from langfuse .utils import _get_timestamp
9- from langfuse .model import ModelUsage
109from ._context import InstrumentorContext
1110from uuid import uuid4 as create_uuid
1211
@@ -119,12 +118,12 @@ def update_generation_from_end_event(
119118 }
120119
121120 self ._get_generation_client (event .span_id ).update (
122- usage = usage , end_time = _get_timestamp ()
121+ usage = usage , usage_details = usage , end_time = _get_timestamp ()
123122 )
124123
125124 def _parse_token_usage (
126125 self , response : Union [ChatResponse , CompletionResponse ]
127- ) -> Optional [ModelUsage ]:
126+ ) -> Optional [dict ]:
128127 if (
129128 (raw := getattr (response , "raw" , None ))
130129 and hasattr (raw , "get" )
@@ -154,15 +153,15 @@ def _get_generation_client(self, id: str) -> StatefulGenerationClient:
154153
155154def _parse_usage_from_mapping (
156155 usage : Union [object , Mapping [str , Any ]],
157- ) -> ModelUsage :
156+ ):
158157 if isinstance (usage , Mapping ):
159158 return _get_token_counts_from_mapping (usage )
160159
161160 return _parse_usage_from_object (usage )
162161
163162
164- def _parse_usage_from_object (usage : object ) -> ModelUsage :
165- model_usage : ModelUsage = {
163+ def _parse_usage_from_object (usage : object ):
164+ model_usage = {
166165 "unit" : None ,
167166 "input" : None ,
168167 "output" : None ,
@@ -179,26 +178,43 @@ def _parse_usage_from_object(usage: object) -> ModelUsage:
179178 if (total_tokens := getattr (usage , "total_tokens" , None )) is not None :
180179 model_usage ["total" ] = total_tokens
181180
181+ if (
182+ prompt_tokens_details := getattr (usage , "prompt_tokens_details" , None )
183+ ) is not None and isinstance (prompt_tokens_details , dict ):
184+ for key , value in prompt_tokens_details .items ():
185+ model_usage [f"input_{ key } " ] = value
186+
187+ if (
188+ completion_tokens_details := getattr (usage , "completion_tokens_details" , None )
189+ ) is not None and isinstance (completion_tokens_details , dict ):
190+ for key , value in completion_tokens_details .items ():
191+ model_usage [f"output_{ key } " ] = value
192+
182193 return model_usage
183194
184195
185196def _get_token_counts_from_mapping (
186197 usage_mapping : Mapping [str , Any ],
187- ) -> ModelUsage :
188- model_usage : ModelUsage = {
189- "unit" : None ,
190- "input" : None ,
191- "output" : None ,
192- "total" : None ,
193- "input_cost" : None ,
194- "output_cost" : None ,
195- "total_cost" : None ,
196- }
198+ ):
199+ model_usage = {}
200+
197201 if (prompt_tokens := usage_mapping .get ("prompt_tokens" )) is not None :
198202 model_usage ["input" ] = prompt_tokens
199203 if (completion_tokens := usage_mapping .get ("completion_tokens" )) is not None :
200204 model_usage ["output" ] = completion_tokens
201205 if (total_tokens := usage_mapping .get ("total_tokens" )) is not None :
202206 model_usage ["total" ] = total_tokens
203207
208+ if (
209+ prompt_tokens_details := usage_mapping .get ("prompt_tokens_details" )
210+ ) is not None and isinstance (prompt_tokens_details , dict ):
211+ for key , value in prompt_tokens_details .items ():
212+ model_usage [f"input_{ key } " ] = value
213+
214+ if (
215+ completion_tokens_details := usage_mapping .get ("completion_tokens_details" )
216+ ) is not None and isinstance (completion_tokens_details , dict ):
217+ for key , value in completion_tokens_details .items ():
218+ model_usage [f"output_{ key } " ] = value
219+
204220 return model_usage
0 commit comments