@@ -1125,6 +1125,54 @@ def _parse_usage_model(usage: typing.Union[pydantic.BaseModel, dict]):
11251125 if "output" in usage_model :
11261126 usage_model ["output" ] = max (0 , usage_model ["output" ] - value )
11271127
1128+ # Vertex AI
1129+ if "prompt_tokens_details" in usage_model and isinstance (
1130+ usage_model ["prompt_tokens_details" ], list
1131+ ):
1132+ prompt_tokens_details = usage_model .pop ("prompt_tokens_details" )
1133+
1134+ for item in prompt_tokens_details :
1135+ if (
1136+ isinstance (item , dict )
1137+ and "modality" in item
1138+ and "token_count" in item
1139+ ):
1140+ usage_model [f"input_modality_{ item ['modality' ]} " ] = item [
1141+ "token_count"
1142+ ]
1143+
1144+ # Vertex AI
1145+ if "candidates_tokens_details" in usage_model and isinstance (
1146+ usage_model ["candidates_tokens_details" ], list
1147+ ):
1148+ candidates_tokens_details = usage_model .pop ("candidates_tokens_details" )
1149+
1150+ for item in candidates_tokens_details :
1151+ if (
1152+ isinstance (item , dict )
1153+ and "modality" in item
1154+ and "token_count" in item
1155+ ):
1156+ usage_model [f"output_modality_{ item ['modality' ]} " ] = item [
1157+ "token_count"
1158+ ]
1159+
1160+ # Vertex AI
1161+ if "cache_tokens_details" in usage_model and isinstance (
1162+ usage_model ["cache_tokens_details" ], list
1163+ ):
1164+ cache_tokens_details = usage_model .pop ("cache_tokens_details" )
1165+
1166+ for item in cache_tokens_details :
1167+ if (
1168+ isinstance (item , dict )
1169+ and "modality" in item
1170+ and "token_count" in item
1171+ ):
1172+ usage_model [f"cached_modality_{ item ['modality' ]} " ] = item [
1173+ "token_count"
1174+ ]
1175+
11281176 return usage_model if usage_model else None
11291177
11301178
0 commit comments