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
@@ -0,0 +1,113 @@
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 json
18
+ from typing import Any
19
+ from typing import TYPE_CHECKING
20
+
21
+ from google.genai import types
22
+ from typing_extensions import override
23
+
24
+ from .base_tool import BaseTool
25
+
26
+ if TYPE_CHECKING:
27
+ from ..models.llm_request import LlmRequest
28
+ from .tool_context import ToolContext
29
+
30
+
31
+ class LoadArtifactsTool(BaseTool):
32
+ """A tool that loads the artifacts and adds them to the session."""
33
+
34
+ def __init__(self):
35
+ super().__init__(
36
+ name='load_artifacts',
37
+ description='Loads the artifacts and adds them to the session.',
38
+ )
39
+
40
+ def _get_declaration(self) -> types.FunctionDeclaration | None:
41
+ return types.FunctionDeclaration(
42
+ name=self.name,
43
+ description=self.description,
44
+ parameters=types.Schema(
45
+ type=types.Type.OBJECT,
46
+ properties={
47
+ 'artifact_names': types.Schema(
48
+ type=types.Type.ARRAY,
49
+ items=types.Schema(
50
+ type=types.Type.STRING,
51
+ ),
52
+ )
53
+ },
54
+ ),
55
+ )
56
+
57
+ @override
58
+ async def run_async(
59
+ self, *, args: dict[str, Any], tool_context: ToolContext
60
+ ) -> Any:
61
+ artifact_names: list[str] = args.get('artifact_names', [])
62
+ return {'artifact_names': artifact_names}
63
+
64
+ @override
65
+ async def process_llm_request(
66
+ self, *, tool_context: ToolContext, llm_request: LlmRequest
67
+ ) -> None:
68
+ await super().process_llm_request(
69
+ tool_context=tool_context,
70
+ llm_request=llm_request,
71
+ )
72
+ self._append_artifacts_to_llm_request(
73
+ tool_context=tool_context, llm_request=llm_request
74
+ )
75
+
76
+ def _append_artifacts_to_llm_request(
77
+ self, *, tool_context: ToolContext, llm_request: LlmRequest
78
+ ):
79
+ artifact_names = tool_context.list_artifacts()
80
+ if not artifact_names:
81
+ return
82
+
83
+ # Tell the model about the available artifacts.
84
+ llm_request.append_instructions([f"""You have a list of artifacts:
85
+ {json.dumps(artifact_names)}
86
+
87
+ When the user asks questions about any of the artifacts, you should call the
88
+ `load_artifacts` function to load the artifact. Do not generate any text other
89
+ than the function call.
90
+ """])
91
+
92
+ # Attache the content of the artifacts if the model requests them.
93
+ # This only adds the content to the model request, instead of the session.
94
+ if llm_request.contents and llm_request.contents[-1].parts:
95
+ function_response = llm_request.contents[-1].parts[0].function_response
96
+ if function_response and function_response.name == 'load_artifacts':
97
+ artifact_names = function_response.response['artifact_names']
98
+ for artifact_name in artifact_names:
99
+ artifact = tool_context.load_artifact(artifact_name)
100
+ llm_request.contents.append(
101
+ types.Content(
102
+ role='user',
103
+ parts=[
104
+ types.Part.from_text(
105
+ text=f'Artifact {artifact_name} is:'
106
+ ),
107
+ artifact,
108
+ ],
109
+ )
110
+ )
111
+
112
+
113
+ load_artifacts_tool = LoadArtifactsTool()
@@ -0,0 +1,58 @@
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
+ from typing import TYPE_CHECKING
18
+
19
+ from typing_extensions import override
20
+
21
+ from .function_tool import FunctionTool
22
+ from .tool_context import ToolContext
23
+
24
+ if TYPE_CHECKING:
25
+ from ..models import LlmRequest
26
+ from ..memory.base_memory_service import MemoryResult
27
+
28
+
29
+ def load_memory(query: str, tool_context: ToolContext) -> 'list[MemoryResult]':
30
+ """Loads the memory for the current user."""
31
+ response = tool_context.search_memory(query)
32
+ return response.memories
33
+
34
+
35
+ class LoadMemoryTool(FunctionTool):
36
+ """A tool that loads the memory for the current user."""
37
+
38
+ def __init__(self):
39
+ super().__init__(load_memory)
40
+
41
+ @override
42
+ async def process_llm_request(
43
+ self,
44
+ *,
45
+ tool_context: ToolContext,
46
+ llm_request: LlmRequest,
47
+ ) -> None:
48
+ await super().process_llm_request(
49
+ tool_context=tool_context, llm_request=llm_request
50
+ )
51
+ # Tell the model about the memory.
52
+ llm_request.append_instructions(["""
53
+ You have memory. You can use it to answer questions. If any questions need
54
+ you to look up the memory, you should call load_memory function with a query.
55
+ """])
56
+
57
+
58
+ load_memory_tool = LoadMemoryTool()
@@ -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
+
15
+ """Tool for web browse."""
16
+
17
+ import requests
18
+
19
+
20
+ def load_web_page(url: str) -> str:
21
+ """Fetches the content in the url and returns the text in it.
22
+
23
+ Args:
24
+ url (str): The url to browse.
25
+
26
+ Returns:
27
+ str: The text content of the url.
28
+ """
29
+ from bs4 import BeautifulSoup
30
+
31
+ response = requests.get(url)
32
+
33
+ if response.status_code == 200:
34
+ soup = BeautifulSoup(response.content, 'lxml')
35
+ text = soup.get_text(separator='\n', strip=True)
36
+ else:
37
+ text = f'Failed to fetch url: {url}'
38
+
39
+ # Split the text into lines, filtering out very short lines
40
+ # (e.g., single words or short subtitles)
41
+ return '\n'.join(line for line in text.splitlines() if len(line.split()) > 3)
@@ -0,0 +1,39 @@
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 typing import Callable
16
+
17
+ from .function_tool import FunctionTool
18
+
19
+
20
+ class LongRunningFunctionTool(FunctionTool):
21
+ """A function tool that returns the result asynchronously.
22
+
23
+ This tool is used for long-running operations that may take a significant
24
+ amount of time to complete. The framework will call the function. Once the
25
+ function returns, the response will be returned asynchronously to the
26
+ framework which is identified by the function_call_id.
27
+
28
+ Example:
29
+ ```python
30
+ tool = LongRunningFunctionTool(a_long_running_function)
31
+ ```
32
+
33
+ Attributes:
34
+ is_long_running: Whether the tool is a long running operation.
35
+ """
36
+
37
+ def __init__(self, func: Callable):
38
+ super().__init__(func)
39
+ self.is_long_running = True
@@ -0,0 +1,42 @@
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
+ __all__ = []
16
+
17
+ try:
18
+ from .conversion_utils import adk_to_mcp_tool_type, gemini_to_json_schema
19
+ from .mcp_tool import MCPTool
20
+ from .mcp_toolset import MCPToolset
21
+
22
+ __all__.extend([
23
+ 'adk_to_mcp_tool_type',
24
+ 'gemini_to_json_schema',
25
+ 'MCPTool',
26
+ 'MCPToolset',
27
+ ])
28
+
29
+ except ImportError as e:
30
+ import logging
31
+ import sys
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+ if sys.version_info < (3, 10):
36
+ logger.warning(
37
+ 'MCP Tool requires Python 3.10 or above. Please upgrade your Python'
38
+ ' version.'
39
+ )
40
+ else:
41
+ logger.debug('MCP Tool is not installed')
42
+ logger.debug(e)
@@ -0,0 +1,161 @@
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 typing import Any, Dict
16
+ from google.genai.types import Schema, Type
17
+ import mcp.types as mcp_types
18
+ from ..base_tool import BaseTool
19
+
20
+
21
+ def adk_to_mcp_tool_type(tool: BaseTool) -> mcp_types.Tool:
22
+ """Convert a Tool in ADK into MCP tool type.
23
+
24
+ This function transforms an ADK tool definition into its equivalent
25
+ representation in the MCP (Model Control Plane) system.
26
+
27
+ Args:
28
+ tool: The ADK tool to convert. It should be an instance of a class derived
29
+ from `BaseTool`.
30
+
31
+ Returns:
32
+ An object of MCP Tool type, representing the converted tool.
33
+
34
+ Examples:
35
+ # Assuming 'my_tool' is an instance of a BaseTool derived class
36
+ mcp_tool = adk_to_mcp_tool_type(my_tool)
37
+ print(mcp_tool)
38
+ """
39
+ tool_declaration = tool._get_declaration()
40
+ if not tool_declaration:
41
+ input_schema = {}
42
+ else:
43
+ input_schema = gemini_to_json_schema(tool._get_declaration().parameters)
44
+ return mcp_types.Tool(
45
+ name=tool.name,
46
+ description=tool.description,
47
+ inputSchema=input_schema,
48
+ )
49
+
50
+
51
+ def gemini_to_json_schema(gemini_schema: Schema) -> Dict[str, Any]:
52
+ """Converts a Gemini Schema object into a JSON Schema dictionary.
53
+
54
+ Args:
55
+ gemini_schema: An instance of the Gemini Schema class.
56
+
57
+ Returns:
58
+ A dictionary representing the equivalent JSON Schema.
59
+
60
+ Raises:
61
+ TypeError: If the input is not an instance of the expected Schema class.
62
+ ValueError: If an invalid Gemini Type enum value is encountered.
63
+ """
64
+ if not isinstance(gemini_schema, Schema):
65
+ raise TypeError(
66
+ f"Input must be an instance of Schema, got {type(gemini_schema)}"
67
+ )
68
+
69
+ json_schema_dict: Dict[str, Any] = {}
70
+
71
+ # Map Type
72
+ gemini_type = getattr(gemini_schema, "type", None)
73
+ if gemini_type and gemini_type != Type.TYPE_UNSPECIFIED:
74
+ json_schema_dict["type"] = gemini_type.lower()
75
+ else:
76
+ json_schema_dict["type"] = "null"
77
+
78
+ # Map Nullable
79
+ if getattr(gemini_schema, "nullable", None) == True:
80
+ json_schema_dict["nullable"] = True
81
+
82
+ # --- Map direct fields ---
83
+ direct_mappings = {
84
+ "title": "title",
85
+ "description": "description",
86
+ "default": "default",
87
+ "enum": "enum",
88
+ "format": "format",
89
+ "example": "example",
90
+ }
91
+ for gemini_key, json_key in direct_mappings.items():
92
+ value = getattr(gemini_schema, gemini_key, None)
93
+ if value is not None:
94
+ json_schema_dict[json_key] = value
95
+
96
+ # String validation
97
+ if gemini_type == Type.STRING:
98
+ str_mappings = {
99
+ "pattern": "pattern",
100
+ "min_length": "minLength",
101
+ "max_length": "maxLength",
102
+ }
103
+ for gemini_key, json_key in str_mappings.items():
104
+ value = getattr(gemini_schema, gemini_key, None)
105
+ if value is not None:
106
+ json_schema_dict[json_key] = value
107
+
108
+ # Number/Integer validation
109
+ if gemini_type in (Type.NUMBER, Type.INTEGER):
110
+ num_mappings = {
111
+ "minimum": "minimum",
112
+ "maximum": "maximum",
113
+ }
114
+ for gemini_key, json_key in num_mappings.items():
115
+ value = getattr(gemini_schema, gemini_key, None)
116
+ if value is not None:
117
+ json_schema_dict[json_key] = value
118
+
119
+ # Array validation (Recursive call for items)
120
+ if gemini_type == Type.ARRAY:
121
+ items_schema = getattr(gemini_schema, "items", None)
122
+ if items_schema is not None:
123
+ json_schema_dict["items"] = gemini_to_json_schema(items_schema)
124
+
125
+ arr_mappings = {
126
+ "min_items": "minItems",
127
+ "max_items": "maxItems",
128
+ }
129
+ for gemini_key, json_key in arr_mappings.items():
130
+ value = getattr(gemini_schema, gemini_key, None)
131
+ if value is not None:
132
+ json_schema_dict[json_key] = value
133
+
134
+ # Object validation (Recursive call for properties)
135
+ if gemini_type == Type.OBJECT:
136
+ properties_dict = getattr(gemini_schema, "properties", None)
137
+ if properties_dict is not None:
138
+ json_schema_dict["properties"] = {
139
+ prop_name: gemini_to_json_schema(prop_schema)
140
+ for prop_name, prop_schema in properties_dict.items()
141
+ }
142
+
143
+ obj_mappings = {
144
+ "required": "required",
145
+ "min_properties": "minProperties",
146
+ "max_properties": "maxProperties",
147
+ # Note: Ignoring 'property_ordering' as it's not standard JSON Schema
148
+ }
149
+ for gemini_key, json_key in obj_mappings.items():
150
+ value = getattr(gemini_schema, gemini_key, None)
151
+ if value is not None:
152
+ json_schema_dict[json_key] = value
153
+
154
+ # Map anyOf (Recursive call for subschemas)
155
+ any_of_list = getattr(gemini_schema, "any_of", None)
156
+ if any_of_list is not None:
157
+ json_schema_dict["anyOf"] = [
158
+ gemini_to_json_schema(sub_schema) for sub_schema in any_of_list
159
+ ]
160
+
161
+ return json_schema_dict
@@ -0,0 +1,113 @@
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 typing import Optional
16
+
17
+ from google.genai.types import FunctionDeclaration
18
+ from typing_extensions import override
19
+
20
+ # Attempt to import MCP Tool from the MCP library, and hints user to upgrade
21
+ # their Python version to 3.10 if it fails.
22
+ try:
23
+ from mcp import ClientSession
24
+ from mcp.types import Tool as McpBaseTool
25
+ except ImportError as e:
26
+ import sys
27
+
28
+ if sys.version_info < (3, 10):
29
+ raise ImportError(
30
+ "MCP Tool requires Python 3.10 or above. Please upgrade your Python"
31
+ " version."
32
+ ) from e
33
+ else:
34
+ raise e
35
+
36
+ from ..base_tool import BaseTool
37
+ from ...auth.auth_credential import AuthCredential
38
+ from ...auth.auth_schemes import AuthScheme
39
+ from ..openapi_tool.openapi_spec_parser.rest_api_tool import to_gemini_schema
40
+ from ..tool_context import ToolContext
41
+
42
+
43
+ class MCPTool(BaseTool):
44
+ """Turns a MCP Tool into a Vertex Agent Framework Tool.
45
+
46
+ Internally, the tool initializes from a MCP Tool, and uses the MCP Session to
47
+ call the tool.
48
+ """
49
+
50
+ def __init__(
51
+ self,
52
+ mcp_tool: McpBaseTool,
53
+ mcp_session: ClientSession,
54
+ auth_scheme: Optional[AuthScheme] = None,
55
+ auth_credential: Optional[AuthCredential] | None = None,
56
+ ):
57
+ """Initializes a MCPTool.
58
+
59
+ This tool wraps a MCP Tool interface and an active MCP Session. It invokes
60
+ the MCP Tool through executing the tool from remote MCP Session.
61
+
62
+ Example:
63
+ tool = MCPTool(mcp_tool=mcp_tool, mcp_session=mcp_session)
64
+
65
+ Args:
66
+ mcp_tool: The MCP tool to wrap.
67
+ mcp_session: The MCP session to use to call the tool.
68
+ auth_scheme: The authentication scheme to use.
69
+ auth_credential: The authentication credential to use.
70
+
71
+ Raises:
72
+ ValueError: If mcp_tool or mcp_session is None.
73
+ """
74
+ if mcp_tool is None:
75
+ raise ValueError("mcp_tool cannot be None")
76
+ if mcp_session is None:
77
+ raise ValueError("mcp_session cannot be None")
78
+ self.name = mcp_tool.name
79
+ self.description = mcp_tool.description if mcp_tool.description else ""
80
+ self.mcp_tool = mcp_tool
81
+ self.mcp_session = mcp_session
82
+ # TODO(cheliu): Support passing auth to MCP Server.
83
+ self.auth_scheme = auth_scheme
84
+ self.auth_credential = auth_credential
85
+
86
+ @override
87
+ def _get_declaration(self) -> FunctionDeclaration:
88
+ """Gets the function declaration for the tool.
89
+
90
+ Returns:
91
+ FunctionDeclaration: The Gemini function declaration for the tool.
92
+ """
93
+ schema_dict = self.mcp_tool.inputSchema
94
+ parameters = to_gemini_schema(schema_dict)
95
+ function_decl = FunctionDeclaration(
96
+ name=self.name, description=self.description, parameters=parameters
97
+ )
98
+ return function_decl
99
+
100
+ @override
101
+ async def run_async(self, *, args, tool_context: ToolContext):
102
+ """Runs the tool asynchronously.
103
+
104
+ Args:
105
+ args: The arguments as a dict to pass to the tool.
106
+ tool_context: The tool context from upper level ADK agent.
107
+
108
+ Returns:
109
+ Any: The response from the tool.
110
+ """
111
+ # TODO(cheliu): Support passing tool context to MCP Server.
112
+ response = await self.mcp_session.call_tool(self.name, arguments=args)
113
+ return response