@@ -1114,6 +1114,54 @@ def _parse_usage_model(usage: typing.Union[pydantic.BaseModel, dict]):
11141114 if "output" in usage_model :
11151115 usage_model ["output" ] = max (0 , usage_model ["output" ] - value )
11161116
1117+ # Vertex AI
1118+ if "prompt_tokens_details" in usage_model and isinstance (
1119+ usage_model ["prompt_tokens_details" ], list
1120+ ):
1121+ prompt_tokens_details = usage_model .pop ("prompt_tokens_details" )
1122+
1123+ for item in prompt_tokens_details :
1124+ if (
1125+ isinstance (item , dict )
1126+ and "modality" in item
1127+ and "token_count" in item
1128+ ):
1129+ usage_model [f"input_modality_{ item ['modality' ]} " ] = item [
1130+ "token_count"
1131+ ]
1132+
1133+ # Vertex AI
1134+ if "candidates_tokens_details" in usage_model and isinstance (
1135+ usage_model ["candidates_tokens_details" ], list
1136+ ):
1137+ candidates_tokens_details = usage_model .pop ("candidates_tokens_details" )
1138+
1139+ for item in candidates_tokens_details :
1140+ if (
1141+ isinstance (item , dict )
1142+ and "modality" in item
1143+ and "token_count" in item
1144+ ):
1145+ usage_model [f"output_modality_{ item ['modality' ]} " ] = item [
1146+ "token_count"
1147+ ]
1148+
1149+ # Vertex AI
1150+ if "cache_tokens_details" in usage_model and isinstance (
1151+ usage_model ["cache_tokens_details" ], list
1152+ ):
1153+ cache_tokens_details = usage_model .pop ("cache_tokens_details" )
1154+
1155+ for item in cache_tokens_details :
1156+ if (
1157+ isinstance (item , dict )
1158+ and "modality" in item
1159+ and "token_count" in item
1160+ ):
1161+ usage_model [f"cached_modality_{ item ['modality' ]} " ] = item [
1162+ "token_count"
1163+ ]
1164+
11171165 return usage_model if usage_model else None
11181166
11191167
0 commit comments