google-adk 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. google/adk/._version.py +0 -0
  2. google/adk/__init__.py +20 -0
  3. google/adk/agents/__init__.py +32 -0
  4. google/adk/agents/active_streaming_tool.py +38 -0
  5. google/adk/agents/base_agent.py +345 -0
  6. google/adk/agents/callback_context.py +112 -0
  7. google/adk/agents/invocation_context.py +181 -0
  8. google/adk/agents/langgraph_agent.py +140 -0
  9. google/adk/agents/live_request_queue.py +64 -0
  10. google/adk/agents/llm_agent.py +376 -0
  11. google/adk/agents/loop_agent.py +62 -0
  12. google/adk/agents/parallel_agent.py +96 -0
  13. google/adk/agents/readonly_context.py +46 -0
  14. google/adk/agents/remote_agent.py +50 -0
  15. google/adk/agents/run_config.py +87 -0
  16. google/adk/agents/sequential_agent.py +45 -0
  17. google/adk/agents/transcription_entry.py +34 -0
  18. google/adk/artifacts/__init__.py +23 -0
  19. google/adk/artifacts/base_artifact_service.py +128 -0
  20. google/adk/artifacts/gcs_artifact_service.py +195 -0
  21. google/adk/artifacts/in_memory_artifact_service.py +133 -0
  22. google/adk/auth/__init__.py +22 -0
  23. google/adk/auth/auth_credential.py +220 -0
  24. google/adk/auth/auth_handler.py +268 -0
  25. google/adk/auth/auth_preprocessor.py +116 -0
  26. google/adk/auth/auth_schemes.py +67 -0
  27. google/adk/auth/auth_tool.py +55 -0
  28. google/adk/cli/__init__.py +15 -0
  29. google/adk/cli/__main__.py +18 -0
  30. google/adk/cli/agent_graph.py +148 -0
  31. google/adk/cli/browser/adk_favicon.svg +17 -0
  32. google/adk/cli/browser/assets/audio-processor.js +51 -0
  33. google/adk/cli/browser/assets/config/runtime-config.json +3 -0
  34. google/adk/cli/browser/index.html +33 -0
  35. google/adk/cli/browser/main-SY2WYYGV.js +75 -0
  36. google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
  37. google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
  38. google/adk/cli/cli.py +181 -0
  39. google/adk/cli/cli_deploy.py +181 -0
  40. google/adk/cli/cli_eval.py +282 -0
  41. google/adk/cli/cli_tools_click.py +524 -0
  42. google/adk/cli/fast_api.py +784 -0
  43. google/adk/cli/utils/__init__.py +49 -0
  44. google/adk/cli/utils/envs.py +57 -0
  45. google/adk/cli/utils/evals.py +93 -0
  46. google/adk/cli/utils/logs.py +72 -0
  47. google/adk/code_executors/__init__.py +49 -0
  48. google/adk/code_executors/base_code_executor.py +97 -0
  49. google/adk/code_executors/code_execution_utils.py +256 -0
  50. google/adk/code_executors/code_executor_context.py +202 -0
  51. google/adk/code_executors/container_code_executor.py +196 -0
  52. google/adk/code_executors/unsafe_local_code_executor.py +71 -0
  53. google/adk/code_executors/vertex_ai_code_executor.py +234 -0
  54. google/adk/docs/Makefile +20 -0
  55. google/adk/docs/build/doctrees/google-adk.doctree +0 -0
  56. google/adk/docs/build/html/_sources/google-adk.rst.txt +98 -0
  57. google/adk/docs/build/html/_sources/index.rst.txt +7 -0
  58. google/adk/docs/build/html/_static/autodoc_pydantic.css +27 -0
  59. google/adk/docs/build/html/_static/basic.css +925 -0
  60. google/adk/docs/build/html/_static/debug.css +85 -0
  61. google/adk/docs/build/html/_static/doctools.js +156 -0
  62. google/adk/docs/build/html/_static/documentation_options.js +29 -0
  63. google/adk/docs/build/html/_static/file.png +0 -0
  64. google/adk/docs/build/html/_static/language_data.js +199 -0
  65. google/adk/docs/build/html/_static/minus.png +0 -0
  66. google/adk/docs/build/html/_static/plus.png +0 -0
  67. google/adk/docs/build/html/_static/pygments.css +274 -0
  68. google/adk/docs/build/html/_static/scripts/furo-extensions.js +16 -0
  69. google/adk/docs/build/html/_static/scripts/furo.js +19 -0
  70. google/adk/docs/build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  71. google/adk/docs/build/html/_static/scripts/furo.js.map +1 -0
  72. google/adk/docs/build/html/_static/searchtools.js +620 -0
  73. google/adk/docs/build/html/_static/skeleton.css +312 -0
  74. google/adk/docs/build/html/_static/sphinx_highlight.js +170 -0
  75. google/adk/docs/build/html/_static/styles/furo-extensions.css +18 -0
  76. google/adk/docs/build/html/_static/styles/furo-extensions.css.map +1 -0
  77. google/adk/docs/build/html/_static/styles/furo.css +18 -0
  78. google/adk/docs/build/html/_static/styles/furo.css.map +1 -0
  79. google/adk/docs/build/html/genindex.html +861 -0
  80. google/adk/docs/build/html/google-adk.html +5461 -0
  81. google/adk/docs/build/html/index.html +567 -0
  82. google/adk/docs/build/html/objects.inv +0 -0
  83. google/adk/docs/build/html/py-modindex.html +373 -0
  84. google/adk/docs/build/html/search.html +333 -0
  85. google/adk/docs/build/html/searchindex.js +17 -0
  86. google/adk/docs/source/conf.py +133 -0
  87. google/adk/docs/source/google-adk.rst +98 -0
  88. google/adk/docs/source/index.rst +7 -0
  89. google/adk/evaluation/__init__.py +31 -0
  90. google/adk/evaluation/agent_evaluator.py +329 -0
  91. google/adk/evaluation/evaluation_constants.py +24 -0
  92. google/adk/evaluation/evaluation_generator.py +270 -0
  93. google/adk/evaluation/response_evaluator.py +135 -0
  94. google/adk/evaluation/trajectory_evaluator.py +184 -0
  95. google/adk/events/__init__.py +21 -0
  96. google/adk/events/event.py +130 -0
  97. google/adk/events/event_actions.py +55 -0
  98. google/adk/examples/__init__.py +28 -0
  99. google/adk/examples/base_example_provider.py +35 -0
  100. google/adk/examples/example.py +27 -0
  101. google/adk/examples/example_util.py +123 -0
  102. google/adk/examples/vertex_ai_example_store.py +104 -0
  103. google/adk/flows/__init__.py +14 -0
  104. google/adk/flows/llm_flows/__init__.py +20 -0
  105. google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
  106. google/adk/flows/llm_flows/_code_execution.py +458 -0
  107. google/adk/flows/llm_flows/_nl_planning.py +129 -0
  108. google/adk/flows/llm_flows/agent_transfer.py +132 -0
  109. google/adk/flows/llm_flows/audio_transcriber.py +109 -0
  110. google/adk/flows/llm_flows/auto_flow.py +49 -0
  111. google/adk/flows/llm_flows/base_llm_flow.py +559 -0
  112. google/adk/flows/llm_flows/basic.py +72 -0
  113. google/adk/flows/llm_flows/contents.py +370 -0
  114. google/adk/flows/llm_flows/functions.py +486 -0
  115. google/adk/flows/llm_flows/identity.py +47 -0
  116. google/adk/flows/llm_flows/instructions.py +137 -0
  117. google/adk/flows/llm_flows/single_flow.py +57 -0
  118. google/adk/memory/__init__.py +35 -0
  119. google/adk/memory/base_memory_service.py +74 -0
  120. google/adk/memory/in_memory_memory_service.py +62 -0
  121. google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
  122. google/adk/models/__init__.py +31 -0
  123. google/adk/models/anthropic_llm.py +243 -0
  124. google/adk/models/base_llm.py +87 -0
  125. google/adk/models/base_llm_connection.py +76 -0
  126. google/adk/models/gemini_llm_connection.py +200 -0
  127. google/adk/models/google_llm.py +331 -0
  128. google/adk/models/lite_llm.py +673 -0
  129. google/adk/models/llm_request.py +98 -0
  130. google/adk/models/llm_response.py +111 -0
  131. google/adk/models/registry.py +102 -0
  132. google/adk/planners/__init__.py +23 -0
  133. google/adk/planners/base_planner.py +66 -0
  134. google/adk/planners/built_in_planner.py +75 -0
  135. google/adk/planners/plan_re_act_planner.py +208 -0
  136. google/adk/runners.py +456 -0
  137. google/adk/sessions/__init__.py +41 -0
  138. google/adk/sessions/base_session_service.py +133 -0
  139. google/adk/sessions/database_session_service.py +522 -0
  140. google/adk/sessions/in_memory_session_service.py +206 -0
  141. google/adk/sessions/session.py +54 -0
  142. google/adk/sessions/state.py +71 -0
  143. google/adk/sessions/vertex_ai_session_service.py +356 -0
  144. google/adk/telemetry.py +189 -0
  145. google/adk/tests/__init__.py +14 -0
  146. google/adk/tests/integration/.env.example +10 -0
  147. google/adk/tests/integration/__init__.py +18 -0
  148. google/adk/tests/integration/conftest.py +119 -0
  149. google/adk/tests/integration/fixture/__init__.py +14 -0
  150. google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
  151. google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
  152. google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
  153. google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
  154. google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
  155. google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
  156. google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
  157. google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
  158. google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
  159. google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
  160. google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
  161. google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
  162. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
  163. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
  164. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
  165. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
  166. google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
  167. google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
  168. google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
  169. google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
  170. google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
  171. google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
  172. google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
  173. google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
  174. google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
  175. google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
  176. google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
  177. google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
  178. google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
  179. google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
  180. google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
  181. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
  182. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
  183. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
  184. google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
  185. google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
  186. google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
  187. google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
  188. google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
  189. google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
  190. google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
  191. google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
  192. google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
  193. google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
  194. google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
  195. google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
  196. google/adk/tests/integration/models/__init__.py +14 -0
  197. google/adk/tests/integration/models/test_google_llm.py +65 -0
  198. google/adk/tests/integration/test_callback.py +70 -0
  199. google/adk/tests/integration/test_context_variable.py +67 -0
  200. google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
  201. google/adk/tests/integration/test_multi_agent.py +28 -0
  202. google/adk/tests/integration/test_multi_turn.py +42 -0
  203. google/adk/tests/integration/test_single_agent.py +23 -0
  204. google/adk/tests/integration/test_sub_agent.py +26 -0
  205. google/adk/tests/integration/test_system_instruction.py +177 -0
  206. google/adk/tests/integration/test_tools.py +287 -0
  207. google/adk/tests/integration/test_with_test_file.py +34 -0
  208. google/adk/tests/integration/tools/__init__.py +14 -0
  209. google/adk/tests/integration/utils/__init__.py +16 -0
  210. google/adk/tests/integration/utils/asserts.py +75 -0
  211. google/adk/tests/integration/utils/test_runner.py +97 -0
  212. google/adk/tests/unittests/__init__.py +14 -0
  213. google/adk/tests/unittests/agents/__init__.py +14 -0
  214. google/adk/tests/unittests/agents/test_base_agent.py +407 -0
  215. google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
  216. google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
  217. google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
  218. google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
  219. google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
  220. google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
  221. google/adk/tests/unittests/artifacts/__init__.py +14 -0
  222. google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
  223. google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
  224. google/adk/tests/unittests/conftest.py +73 -0
  225. google/adk/tests/unittests/fast_api/__init__.py +14 -0
  226. google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
  227. google/adk/tests/unittests/flows/__init__.py +14 -0
  228. google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
  229. google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
  230. google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
  231. google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
  232. google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
  233. google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
  234. google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
  235. google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
  236. google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
  237. google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
  238. google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
  239. google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
  240. google/adk/tests/unittests/models/__init__.py +14 -0
  241. google/adk/tests/unittests/models/test_google_llm.py +224 -0
  242. google/adk/tests/unittests/models/test_litellm.py +804 -0
  243. google/adk/tests/unittests/models/test_models.py +60 -0
  244. google/adk/tests/unittests/sessions/__init__.py +14 -0
  245. google/adk/tests/unittests/sessions/test_session_service.py +227 -0
  246. google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
  247. google/adk/tests/unittests/streaming/__init__.py +14 -0
  248. google/adk/tests/unittests/streaming/test_streaming.py +50 -0
  249. google/adk/tests/unittests/tools/__init__.py +14 -0
  250. google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
  251. google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
  252. google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
  253. google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
  254. google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
  255. google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
  256. google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
  257. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
  258. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
  259. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
  260. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
  261. google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
  262. google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
  263. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
  264. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
  265. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
  266. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
  267. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
  268. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
  269. google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
  270. google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
  271. google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
  272. google/adk/tests/unittests/tools/test_base_tool.py +141 -0
  273. google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
  274. google/adk/tests/unittests/utils.py +304 -0
  275. google/adk/tools/__init__.py +51 -0
  276. google/adk/tools/_automatic_function_calling_util.py +346 -0
  277. google/adk/tools/agent_tool.py +176 -0
  278. google/adk/tools/apihub_tool/__init__.py +19 -0
  279. google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
  280. google/adk/tools/apihub_tool/clients/__init__.py +13 -0
  281. google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
  282. google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
  283. google/adk/tools/application_integration_tool/__init__.py +19 -0
  284. google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
  285. google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
  286. google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
  287. google/adk/tools/base_tool.py +144 -0
  288. google/adk/tools/built_in_code_execution_tool.py +59 -0
  289. google/adk/tools/crewai_tool.py +72 -0
  290. google/adk/tools/example_tool.py +62 -0
  291. google/adk/tools/exit_loop_tool.py +23 -0
  292. google/adk/tools/function_parameter_parse_util.py +307 -0
  293. google/adk/tools/function_tool.py +87 -0
  294. google/adk/tools/get_user_choice_tool.py +28 -0
  295. google/adk/tools/google_api_tool/__init__.py +14 -0
  296. google/adk/tools/google_api_tool/google_api_tool.py +59 -0
  297. google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
  298. google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
  299. google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
  300. google/adk/tools/google_search_tool.py +68 -0
  301. google/adk/tools/langchain_tool.py +86 -0
  302. google/adk/tools/load_artifacts_tool.py +113 -0
  303. google/adk/tools/load_memory_tool.py +58 -0
  304. google/adk/tools/load_web_page.py +41 -0
  305. google/adk/tools/long_running_tool.py +39 -0
  306. google/adk/tools/mcp_tool/__init__.py +42 -0
  307. google/adk/tools/mcp_tool/conversion_utils.py +161 -0
  308. google/adk/tools/mcp_tool/mcp_tool.py +113 -0
  309. google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
  310. google/adk/tools/openapi_tool/__init__.py +21 -0
  311. google/adk/tools/openapi_tool/auth/__init__.py +19 -0
  312. google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
  313. google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
  314. google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
  315. google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
  316. google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
  317. google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
  318. google/adk/tools/openapi_tool/common/__init__.py +19 -0
  319. google/adk/tools/openapi_tool/common/common.py +300 -0
  320. google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
  321. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
  322. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
  323. google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
  324. google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
  325. google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
  326. google/adk/tools/preload_memory_tool.py +72 -0
  327. google/adk/tools/retrieval/__init__.py +36 -0
  328. google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
  329. google/adk/tools/retrieval/files_retrieval.py +33 -0
  330. google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
  331. google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
  332. google/adk/tools/tool_context.py +90 -0
  333. google/adk/tools/toolbox_tool.py +46 -0
  334. google/adk/tools/transfer_to_agent_tool.py +21 -0
  335. google/adk/tools/vertex_ai_search_tool.py +96 -0
  336. google/adk/version.py +16 -0
  337. google_adk-0.0.3.dist-info/METADATA +73 -0
  338. google_adk-0.0.3.dist-info/RECORD +340 -0
  339. {google_adk-0.0.1.dist-info → google_adk-0.0.3.dist-info}/WHEEL +1 -2
  340. google_adk-0.0.3.dist-info/entry_points.txt +3 -0
  341. agent_kit/__init__.py +0 -0
  342. google_adk-0.0.1.dist-info/LICENSE.txt +0 -170
  343. google_adk-0.0.1.dist-info/METADATA +0 -15
  344. google_adk-0.0.1.dist-info/RECORD +0 -6
  345. google_adk-0.0.1.dist-info/top_level.txt +0 -1
google/adk/runners.py ADDED
@@ -0,0 +1,456 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import asyncio
18
+ import logging
19
+ import queue
20
+ import threading
21
+ from typing import AsyncGenerator
22
+ from typing import Generator
23
+ from typing import Optional
24
+
25
+ from deprecated import deprecated
26
+ from google.genai import types
27
+
28
+ from .agents.active_streaming_tool import ActiveStreamingTool
29
+ from .agents.base_agent import BaseAgent
30
+ from .agents.invocation_context import InvocationContext
31
+ from .agents.invocation_context import new_invocation_context_id
32
+ from .agents.live_request_queue import LiveRequestQueue
33
+ from .agents.llm_agent import LlmAgent
34
+ from .agents.run_config import RunConfig
35
+ from .agents.run_config import StreamingMode
36
+ from .artifacts.base_artifact_service import BaseArtifactService
37
+ from .artifacts.in_memory_artifact_service import InMemoryArtifactService
38
+ from .events.event import Event
39
+ from .memory.base_memory_service import BaseMemoryService
40
+ from .memory.in_memory_memory_service import InMemoryMemoryService
41
+ from .sessions.base_session_service import BaseSessionService
42
+ from .sessions.in_memory_session_service import InMemorySessionService
43
+ from .sessions.session import Session
44
+ from .telemetry import tracer
45
+ from .tools.built_in_code_execution_tool import built_in_code_execution
46
+
47
+ logger = logging.getLogger(__name__)
48
+
49
+
50
+ class Runner:
51
+ """The Runner class is used to run agents.
52
+
53
+ It manages the execution of an agent within a session, handling message
54
+ processing, event generation, and interaction with various services like
55
+ artifact storage, session management, and memory.
56
+
57
+ Attributes:
58
+ app_name: The application name of the runner.
59
+ agent: The root agent to run.
60
+ artifact_service: The artifact service for the runner.
61
+ session_service: The session service for the runner.
62
+ memory_service: The memory service for the runner.
63
+ """
64
+
65
+ app_name: str
66
+ """The app name of the runner."""
67
+ agent: BaseAgent
68
+ """The root agent to run."""
69
+ artifact_service: Optional[BaseArtifactService] = None
70
+ """The artifact service for the runner."""
71
+ session_service: BaseSessionService
72
+ """The session service for the runner."""
73
+ memory_service: Optional[BaseMemoryService] = None
74
+ """The memory service for the runner."""
75
+
76
+ def __init__(
77
+ self,
78
+ *,
79
+ app_name: str,
80
+ agent: BaseAgent,
81
+ artifact_service: Optional[BaseArtifactService] = None,
82
+ session_service: BaseSessionService,
83
+ memory_service: Optional[BaseMemoryService] = None,
84
+ ):
85
+ """Initializes the Runner.
86
+
87
+ Args:
88
+ app_name: The application name of the runner.
89
+ agent: The root agent to run.
90
+ artifact_service: The artifact service for the runner.
91
+ session_service: The session service for the runner.
92
+ memory_service: The memory service for the runner.
93
+ """
94
+ self.app_name = app_name
95
+ self.agent = agent
96
+ self.artifact_service = artifact_service
97
+ self.session_service = session_service
98
+ self.memory_service = memory_service
99
+
100
+ def run(
101
+ self,
102
+ *,
103
+ user_id: str,
104
+ session_id: str,
105
+ new_message: types.Content,
106
+ run_config: RunConfig = RunConfig(),
107
+ ) -> Generator[Event, None, None]:
108
+ """Runs the agent.
109
+
110
+ NOTE: This sync interface is only for local testing and convenience purpose.
111
+ Consider to use `run_async` for production usage.
112
+
113
+ Args:
114
+ user_id: The user ID of the session.
115
+ session_id: The session ID of the session.
116
+ new_message: A new message to append to the session.
117
+ run_config: The run config for the agent.
118
+
119
+ Yields:
120
+ The events generated by the agent.
121
+ """
122
+ event_queue = queue.Queue()
123
+
124
+ async def _invoke_run_async():
125
+ try:
126
+ async for event in self.run_async(
127
+ user_id=user_id,
128
+ session_id=session_id,
129
+ new_message=new_message,
130
+ run_config=run_config,
131
+ ):
132
+ event_queue.put(event)
133
+ finally:
134
+ event_queue.put(None)
135
+
136
+ def _asyncio_thread_main():
137
+ try:
138
+ asyncio.run(_invoke_run_async())
139
+ finally:
140
+ event_queue.put(None)
141
+
142
+ thread = threading.Thread(target=_asyncio_thread_main)
143
+ thread.start()
144
+
145
+ # consumes and re-yield the events from background thread.
146
+ while True:
147
+ event = event_queue.get()
148
+ if event is None:
149
+ break
150
+ else:
151
+ yield event
152
+
153
+ thread.join()
154
+
155
+ async def run_async(
156
+ self,
157
+ *,
158
+ user_id: str,
159
+ session_id: str,
160
+ new_message: types.Content,
161
+ run_config: RunConfig = RunConfig(),
162
+ ) -> AsyncGenerator[Event, None]:
163
+ """Main entry method to run the agent in this runner.
164
+
165
+ Args:
166
+ user_id: The user ID of the session.
167
+ session_id: The session ID of the session.
168
+ new_message: A new message to append to the session.
169
+ run_config: The run config for the agent.
170
+
171
+ Yields:
172
+ The events generated by the agent.
173
+ """
174
+ with tracer.start_as_current_span('invocation'):
175
+ session = self.session_service.get_session(
176
+ app_name=self.app_name, user_id=user_id, session_id=session_id
177
+ )
178
+ if not session:
179
+ raise ValueError(f'Session not found: {session_id}')
180
+
181
+ invocation_context = self._new_invocation_context(
182
+ session,
183
+ new_message=new_message,
184
+ run_config=run_config,
185
+ )
186
+ root_agent = self.agent
187
+
188
+ if new_message:
189
+ self._append_new_message_to_session(
190
+ session,
191
+ new_message,
192
+ invocation_context,
193
+ run_config.save_input_blobs_as_artifacts,
194
+ )
195
+
196
+ invocation_context.agent = self._find_agent_to_run(session, root_agent)
197
+ async for event in invocation_context.agent.run_async(invocation_context):
198
+ if not event.partial:
199
+ self.session_service.append_event(session=session, event=event)
200
+ yield event
201
+
202
+ def _append_new_message_to_session(
203
+ self,
204
+ session: Session,
205
+ new_message: types.Content,
206
+ invocation_context: InvocationContext,
207
+ save_input_blobs_as_artifacts: bool = False,
208
+ ):
209
+ """Appends a new message to the session.
210
+
211
+ Args:
212
+ session: The session to append the message to.
213
+ new_message: The new message to append.
214
+ invocation_context: The invocation context for the message.
215
+ save_input_blobs_as_artifacts: Whether to save input blobs as artifacts.
216
+ """
217
+ if not new_message.parts:
218
+ raise ValueError('No parts in the new_message.')
219
+
220
+ if self.artifact_service and save_input_blobs_as_artifacts:
221
+ # The runner directly saves the artifacts (if applicable) in the
222
+ # user message and replaces the artifact data with a file name
223
+ # placeholder.
224
+ for i, part in enumerate(new_message.parts):
225
+ if part.inline_data is None:
226
+ continue
227
+ file_name = f'artifact_{invocation_context.invocation_id}_{i}'
228
+ self.artifact_service.save_artifact(
229
+ app_name=self.app_name,
230
+ user_id=session.user_id,
231
+ session_id=session.id,
232
+ filename=file_name,
233
+ artifact=part,
234
+ )
235
+ new_message.parts[i] = types.Part(
236
+ text=f'Uploaded file: {file_name}. It is saved into artifacts'
237
+ )
238
+ # Appends only. We do not yield the event because it's not from the model.
239
+ event = Event(
240
+ invocation_id=invocation_context.invocation_id,
241
+ author='user',
242
+ content=new_message,
243
+ )
244
+ self.session_service.append_event(session=session, event=event)
245
+
246
+ async def run_live(
247
+ self,
248
+ *,
249
+ session: Session,
250
+ live_request_queue: LiveRequestQueue,
251
+ run_config: RunConfig = RunConfig(),
252
+ ) -> AsyncGenerator[Event, None]:
253
+ """Runs the agent in live mode (experimental feature).
254
+
255
+ Args:
256
+ session: The session to use.
257
+ live_request_queue: The queue for live requests.
258
+ run_config: The run config for the agent.
259
+
260
+ Yields:
261
+ The events generated by the agent.
262
+ """
263
+ # TODO: right now, only works for a single audio agent without FC.
264
+ invocation_context = self._new_invocation_context_for_live(
265
+ session,
266
+ live_request_queue=live_request_queue,
267
+ run_config=run_config,
268
+ )
269
+
270
+ root_agent = self.agent
271
+ invocation_context.agent = self._find_agent_to_run(session, root_agent)
272
+
273
+ invocation_context.active_streaming_tools = {}
274
+ # TODO(hangfei): switch to use canonical_tools.
275
+ for tool in invocation_context.agent.tools:
276
+ # replicate a LiveRequestQueue for streaming tools that relis on
277
+ # LiveRequestQueue
278
+ from typing import get_type_hints
279
+
280
+ type_hints = get_type_hints(tool)
281
+ for arg_type in type_hints.values():
282
+ if arg_type is LiveRequestQueue:
283
+ if not invocation_context.active_streaming_tools:
284
+ invocation_context.active_streaming_tools = {}
285
+ active_streaming_tools = ActiveStreamingTool(
286
+ stream=LiveRequestQueue()
287
+ )
288
+ invocation_context.active_streaming_tools[tool.__name__] = (
289
+ active_streaming_tools
290
+ )
291
+
292
+ async for event in invocation_context.agent.run_live(invocation_context):
293
+ self.session_service.append_event(session=session, event=event)
294
+ yield event
295
+
296
+ def close_session(self, session: Session):
297
+ """Closes a session and adds it to the memory service (experimental feature).
298
+
299
+ Args:
300
+ session: The session to close.
301
+ """
302
+ if self.memory_service:
303
+ self.memory_service.add_session_to_memory(session)
304
+ self.session_service.close_session(session=session)
305
+
306
+ def _find_agent_to_run(
307
+ self, session: Session, root_agent: BaseAgent
308
+ ) -> BaseAgent:
309
+ """Finds the agent to run to continue the session.
310
+
311
+ A qualified agent must be either of:
312
+ - The root agent;
313
+ - An LlmAgent who replied last and is capable to transfer to any other agent
314
+ in the agent hierarchy.
315
+
316
+ Args:
317
+ session: The session to find the agent for.
318
+ root_agent: The root agent of the runner.
319
+
320
+ Returns:
321
+ The agent of the last message in the session or the root agent.
322
+ """
323
+ for event in filter(lambda e: e.author != 'user', reversed(session.events)):
324
+ if event.author == root_agent.name:
325
+ # Found root agent.
326
+ return root_agent
327
+ if not (agent := root_agent.find_sub_agent(event.author)):
328
+ # Agent not found, continue looking.
329
+ logger.warning(
330
+ 'Event from an unknown agent: %s, event id: %s',
331
+ event.author,
332
+ event.id,
333
+ )
334
+ continue
335
+ if self._is_transferable_across_agent_tree(agent):
336
+ return agent
337
+ # Falls back to root agent if no suitable agents are found in the session.
338
+ return root_agent
339
+
340
+ def _is_transferable_across_agent_tree(self, agent_to_run: BaseAgent) -> bool:
341
+ """Whether the agent to run can transfer to any other agent in the agent tree.
342
+
343
+ This typically means all agent_to_run's parent through root agent can
344
+ transfer to their parent_agent.
345
+
346
+ Args:
347
+ agent_to_run: The agent to check for transferability.
348
+
349
+ Returns:
350
+ True if the agent can transfer, False otherwise.
351
+ """
352
+ agent = agent_to_run
353
+ while agent:
354
+ if not isinstance(agent, LlmAgent):
355
+ # Only LLM-based Agent can provider agent transfer capability.
356
+ return False
357
+ if agent.disallow_transfer_to_parent:
358
+ return False
359
+ agent = agent.parent_agent
360
+ return True
361
+
362
+ def _new_invocation_context(
363
+ self,
364
+ session: Session,
365
+ *,
366
+ new_message: Optional[types.Content] = None,
367
+ live_request_queue: Optional[LiveRequestQueue] = None,
368
+ run_config: RunConfig = RunConfig(),
369
+ ) -> InvocationContext:
370
+ """Creates a new invocation context.
371
+
372
+ Args:
373
+ session: The session for the context.
374
+ new_message: The new message for the context.
375
+ live_request_queue: The live request queue for the context.
376
+ run_config: The run config for the context.
377
+
378
+ Returns:
379
+ The new invocation context.
380
+ """
381
+ invocation_id = new_invocation_context_id()
382
+
383
+ if run_config.support_cfc and isinstance(self.agent, LlmAgent):
384
+ model_name = self.agent.canonical_model.model
385
+ if not model_name.startswith('gemini-2'):
386
+ raise ValueError(
387
+ f'CFC is not supported for model: {model_name} in agent:'
388
+ f' {self.agent.name}'
389
+ )
390
+ if built_in_code_execution not in self.agent.canonical_tools:
391
+ self.agent.tools.append(built_in_code_execution)
392
+
393
+ return InvocationContext(
394
+ artifact_service=self.artifact_service,
395
+ session_service=self.session_service,
396
+ memory_service=self.memory_service,
397
+ invocation_id=invocation_id,
398
+ agent=self.agent,
399
+ session=session,
400
+ user_content=new_message,
401
+ live_request_queue=live_request_queue,
402
+ run_config=run_config,
403
+ )
404
+
405
+ def _new_invocation_context_for_live(
406
+ self,
407
+ session: Session,
408
+ *,
409
+ live_request_queue: Optional[LiveRequestQueue] = None,
410
+ run_config: RunConfig = RunConfig(),
411
+ ) -> InvocationContext:
412
+ """Creates a new invocation context for live multi-agent."""
413
+
414
+ # For live multi-agent, we need model's text transcription as context for
415
+ # next agent.
416
+ if self.agent.sub_agents and live_request_queue:
417
+ if not run_config.response_modalities:
418
+ # default
419
+ run_config.response_modalities = ['AUDIO', 'TEXT']
420
+ elif 'TEXT' not in run_config.response_modalities:
421
+ run_config.response_modalities.append('TEXT')
422
+ return self._new_invocation_context(
423
+ session,
424
+ live_request_queue=live_request_queue,
425
+ run_config=run_config,
426
+ )
427
+
428
+
429
+ class InMemoryRunner(Runner):
430
+ """An in-memory Runner for testing and development.
431
+
432
+ This runner uses in-memory implementations for artifact, session, and memory
433
+ services, providing a lightweight and self-contained environment for agent
434
+ execution.
435
+
436
+ Attributes:
437
+ agent: The root agent to run.
438
+ app_name: The application name of the runner. Defaults to
439
+ 'InMemoryRunner'.
440
+ """
441
+
442
+ def __init__(self, agent: LlmAgent, *, app_name: str = 'InMemoryRunner'):
443
+ """Initializes the InMemoryRunner.
444
+
445
+ Args:
446
+ agent: The root agent to run.
447
+ app_name: The application name of the runner. Defaults to
448
+ 'InMemoryRunner'.
449
+ """
450
+ super().__init__(
451
+ app_name=app_name,
452
+ agent=agent,
453
+ artifact_service=InMemoryArtifactService(),
454
+ session_service=InMemorySessionService(),
455
+ memory_service=InMemoryMemoryService(),
456
+ )
@@ -0,0 +1,41 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import logging
15
+
16
+ from .base_session_service import BaseSessionService
17
+ from .in_memory_session_service import InMemorySessionService
18
+ from .session import Session
19
+ from .state import State
20
+ from .vertex_ai_session_service import VertexAiSessionService
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ __all__ = [
26
+ 'BaseSessionService',
27
+ 'InMemorySessionService',
28
+ 'Session',
29
+ 'State',
30
+ 'VertexAiSessionService',
31
+ ]
32
+
33
+ try:
34
+ from .database_session_service import DatabaseSessionService
35
+
36
+ __all__.append('DatabaseSessionService')
37
+ except ImportError:
38
+ logger.debug(
39
+ 'DatabaseSessionService require sqlalchemy>=2.0, please ensure it is'
40
+ ' installed correctly.'
41
+ )
@@ -0,0 +1,133 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import abc
16
+ from typing import Any
17
+ from typing import Optional
18
+
19
+ from pydantic import BaseModel
20
+ from pydantic import Field
21
+
22
+ from ..events.event import Event
23
+ from .session import Session
24
+ from .state import State
25
+
26
+
27
+ class GetSessionConfig(BaseModel):
28
+ """The configuration of getting a session."""
29
+ num_recent_events: Optional[int] = None
30
+ after_timestamp: Optional[float] = None
31
+
32
+
33
+ class ListSessionsResponse(BaseModel):
34
+ """The response of listing sessions.
35
+
36
+ The events and states are not set within each Session object.
37
+ """
38
+ sessions: list[Session] = Field(default_factory=list)
39
+
40
+
41
+ class ListEventsResponse(BaseModel):
42
+ """The response of listing events in a session."""
43
+ events: list[Event] = Field(default_factory=list)
44
+ next_page_token: Optional[str] = None
45
+
46
+
47
+ class BaseSessionService(abc.ABC):
48
+ """Base class for session services.
49
+
50
+ The service provides a set of methods for managing sessions and events.
51
+ """
52
+
53
+ @abc.abstractmethod
54
+ def create_session(
55
+ self,
56
+ *,
57
+ app_name: str,
58
+ user_id: str,
59
+ state: Optional[dict[str, Any]] = None,
60
+ session_id: Optional[str] = None,
61
+ ) -> Session:
62
+ """Creates a new session.
63
+
64
+ Args:
65
+ app_name: the name of the app.
66
+ user_id: the id of the user.
67
+ state: the initial state of the session.
68
+ session_id: the client-provided id of the session. If not provided, a
69
+ generated ID will be used.
70
+
71
+ Returns:
72
+ session: The newly created session instance.
73
+ """
74
+ pass
75
+
76
+ @abc.abstractmethod
77
+ def get_session(
78
+ self,
79
+ *,
80
+ app_name: str,
81
+ user_id: str,
82
+ session_id: str,
83
+ config: Optional[GetSessionConfig] = None,
84
+ ) -> Optional[Session]:
85
+ """Gets a session."""
86
+ pass
87
+
88
+ @abc.abstractmethod
89
+ def list_sessions(
90
+ self, *, app_name: str, user_id: str
91
+ ) -> ListSessionsResponse:
92
+ """Lists all the sessions."""
93
+ pass
94
+
95
+ @abc.abstractmethod
96
+ def delete_session(
97
+ self, *, app_name: str, user_id: str, session_id: str
98
+ ) -> None:
99
+ """Deletes a session."""
100
+ pass
101
+
102
+ @abc.abstractmethod
103
+ def list_events(
104
+ self,
105
+ *,
106
+ app_name: str,
107
+ user_id: str,
108
+ session_id: str,
109
+ ) -> ListEventsResponse:
110
+ """Lists events in a session."""
111
+ pass
112
+
113
+ def close_session(self, *, session: Session):
114
+ """Closes a session."""
115
+ # TODO: determine whether we want to finalize the session here.
116
+ pass
117
+
118
+ def append_event(self, session: Session, event: Event) -> Event:
119
+ """Appends an event to a session object."""
120
+ if event.partial:
121
+ return event
122
+ self.__update_session_state(session, event)
123
+ session.events.append(event)
124
+ return event
125
+
126
+ def __update_session_state(self, session: Session, event: Event):
127
+ """Updates the session state based on the event."""
128
+ if not event.actions or not event.actions.state_delta:
129
+ return
130
+ for key, value in event.actions.state_delta.items():
131
+ if key.startswith(State.TEMP_PREFIX):
132
+ continue
133
+ session.state.update({key: value})