11import asyncio
22import logging
3+
34from collections import namedtuple
45from collections .abc import AsyncGenerator
5- from typing import Dict
66from urllib .parse import parse_qs , urlparse
77
88from google .adk import Runner
2727from a2a .utils .errors import ServerError
2828from a2a .utils .message import new_agent_text_message
2929
30+
3031logger = logging .getLogger (__name__ )
3132logger .setLevel (logging .DEBUG )
3233
4243class ADKAgentExecutor (AgentExecutor ):
4344 """An AgentExecutor that runs an ADK-based Agent."""
4445
45- _awaiting_auth : Dict [str , asyncio .Future ]
46+ _awaiting_auth : dict [str , asyncio .Future ]
4647
4748 def __init__ (self , runner : Runner , card : AgentCard ):
4849 self .runner = runner
@@ -95,13 +96,13 @@ async def _process_request(
9596 # Break out of event handling loop -- no more work will be done until the authorization
9697 # is received.
9798 break
98- elif event .is_final_response ():
99+ if event .is_final_response ():
99100 parts = convert_genai_parts_to_a2a (event .content .parts )
100101 logger .debug ('Yielding final response: %s' , parts )
101102 task_updater .add_artifact (parts )
102103 task_updater .complete ()
103104 break
104- elif not event .get_function_calls ():
105+ if not event .get_function_calls ():
105106 logger .debug ('Yielding update response' )
106107 task_updater .update_status (
107108 TaskState .working ,
@@ -245,23 +246,21 @@ def convert_a2a_part_to_genai(part: Part) -> types.Part:
245246 part = part .root
246247 if isinstance (part , TextPart ):
247248 return types .Part (text = part .text )
248- elif isinstance (part , FilePart ):
249+ if isinstance (part , FilePart ):
249250 if isinstance (part .file , FileWithUri ):
250251 return types .Part (
251252 file_data = types .FileData (
252253 file_uri = part .file .uri , mime_type = part .file .mime_type
253254 )
254255 )
255- elif isinstance (part .file , FileWithBytes ):
256+ if isinstance (part .file , FileWithBytes ):
256257 return types .Part (
257258 inline_data = types .Blob (
258259 data = part .file .bytes , mime_type = part .file .mime_type
259260 )
260261 )
261- else :
262- raise ValueError (f'Unsupported file type: { type (part .file )} ' )
263- else :
264- raise ValueError (f'Unsupported part type: { type (part )} ' )
262+ raise ValueError (f'Unsupported file type: { type (part .file )} ' )
263+ raise ValueError (f'Unsupported part type: { type (part )} ' )
265264
266265
267266def convert_genai_parts_to_a2a (parts : list [types .Part ]) -> list [Part ]:
@@ -277,14 +276,14 @@ def convert_genai_part_to_a2a(part: types.Part) -> Part:
277276 """Convert a single Google GenAI Part type into an A2A Part type."""
278277 if part .text :
279278 return TextPart (text = part .text )
280- elif part .file_data :
279+ if part .file_data :
281280 return FilePart (
282281 file = FileWithUri (
283282 uri = part .file_data .file_uri ,
284283 mime_type = part .file_data .mime_type ,
285284 )
286285 )
287- elif part .inline_data :
286+ if part .inline_data :
288287 return Part (
289288 root = FilePart (
290289 file = FileWithBytes (
@@ -293,14 +292,13 @@ def convert_genai_part_to_a2a(part: types.Part) -> Part:
293292 )
294293 )
295294 )
296- else :
297- raise ValueError (f'Unsupported part type: { part } ' )
295+ raise ValueError (f'Unsupported part type: { part } ' )
298296
299297
300298def get_auth_request_function_call (event : Event ) -> types .FunctionCall :
301299 """Get the special auth request function call from the event"""
302300 if not (event .content and event .content .parts ):
303- return
301+ return None
304302 for part in event .content .parts :
305303 if (
306304 part
0 commit comments