@@ -70,7 +70,9 @@ def convert_a2a_part_to_genai_part(
7070 if isinstance (part .file , a2a_types .FileWithUri ):
7171 return genai_types .Part (
7272 file_data = genai_types .FileData (
73- file_uri = part .file .uri , mime_type = part .file .mime_type
73+ file_uri = part .file .uri ,
74+ mime_type = part .file .mime_type ,
75+ display_name = part .file .name ,
7476 )
7577 )
7678
@@ -79,6 +81,7 @@ def convert_a2a_part_to_genai_part(
7981 inline_data = genai_types .Blob (
8082 data = base64 .b64decode (part .file .bytes ),
8183 mime_type = part .file .mime_type ,
84+ display_name = part .file .name ,
8285 )
8386 )
8487 else :
@@ -104,10 +107,25 @@ def convert_a2a_part_to_genai_part(
104107 part .metadata [_get_adk_metadata_key (A2A_DATA_PART_METADATA_TYPE_KEY )]
105108 == A2A_DATA_PART_METADATA_TYPE_FUNCTION_CALL
106109 ):
110+ # Restore thought_signature if present
111+ thought_signature = None
112+ thought_sig_key = _get_adk_metadata_key ('thought_signature' )
113+ if thought_sig_key in part .metadata :
114+ sig_value = part .metadata [thought_sig_key ]
115+ if isinstance (sig_value , bytes ):
116+ thought_signature = sig_value
117+ elif isinstance (sig_value , str ):
118+ try :
119+ thought_signature = base64 .b64decode (sig_value )
120+ except Exception :
121+ logger .warning (
122+ 'Failed to decode thought_signature: %s' , sig_value
123+ )
107124 return genai_types .Part (
108125 function_call = genai_types .FunctionCall .model_validate (
109126 part .data , by_alias = True
110- )
127+ ),
128+ thought_signature = thought_signature ,
111129 )
112130 if (
113131 part .metadata [_get_adk_metadata_key (A2A_DATA_PART_METADATA_TYPE_KEY )]
@@ -173,6 +191,7 @@ def convert_genai_part_to_a2a_part(
173191 file = a2a_types .FileWithUri (
174192 uri = part .file_data .file_uri ,
175193 mime_type = part .file_data .mime_type ,
194+ name = part .file_data .display_name ,
176195 )
177196 )
178197 )
@@ -196,6 +215,7 @@ def convert_genai_part_to_a2a_part(
196215 file = a2a_types .FileWithBytes (
197216 bytes = base64 .b64encode (part .inline_data .data ).decode ('utf-8' ),
198217 mime_type = part .inline_data .mime_type ,
218+ name = part .inline_data .display_name ,
199219 )
200220 )
201221
@@ -214,16 +234,22 @@ def convert_genai_part_to_a2a_part(
214234 # TODO once A2A defined how to service such information, migrate below
215235 # logic accordingly
216236 if part .function_call :
237+ fc_metadata = {
238+ _get_adk_metadata_key (
239+ A2A_DATA_PART_METADATA_TYPE_KEY
240+ ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_CALL
241+ }
242+ # Preserve thought_signature if present
243+ if part .thought_signature is not None :
244+ fc_metadata [_get_adk_metadata_key ('thought_signature' )] = (
245+ base64 .b64encode (part .thought_signature ).decode ('utf-8' )
246+ )
217247 return a2a_types .Part (
218248 root = a2a_types .DataPart (
219249 data = part .function_call .model_dump (
220250 by_alias = True , exclude_none = True
221251 ),
222- metadata = {
223- _get_adk_metadata_key (
224- A2A_DATA_PART_METADATA_TYPE_KEY
225- ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_CALL
226- },
252+ metadata = fc_metadata ,
227253 )
228254 )
229255
0 commit comments