aidial_adapter_vertexai/utils/protobuf.py (30 lines of code) (raw):
import proto
from google.protobuf import json_format
from proto.marshal.collections import maps, repeated
def message_to_string(message: proto.Message) -> str:
return json_format.MessageToJson(message._pb)
def message_to_dict(message: proto.Message) -> dict:
return json_format.MessageToDict(message._pb)
# Borrowed from helper functions
# https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/function-calling/function_calling_data_structures.ipynb
def recurse_proto_repeated_composite(repeated_object):
repeated_list = []
for item in repeated_object:
if isinstance(item, repeated.RepeatedComposite):
item = recurse_proto_repeated_composite(item)
repeated_list.append(item)
elif isinstance(item, maps.MapComposite):
item = recurse_proto_marshal_to_dict(item)
repeated_list.append(item)
else:
repeated_list.append(item)
return repeated_list
def recurse_proto_marshal_to_dict(marshal_object):
new_dict = {}
for k, v in marshal_object.items():
if not v:
continue
elif isinstance(v, maps.MapComposite):
v = recurse_proto_marshal_to_dict(v)
elif isinstance(v, repeated.RepeatedComposite):
v = recurse_proto_repeated_composite(v)
new_dict[k] = v
return new_dict