google-adk 0.0.1__py3-none-any.whl → 0.0.2__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 (312) hide show
  1. google/adk/__init__.py +20 -0
  2. google/adk/agents/__init__.py +32 -0
  3. google/adk/agents/active_streaming_tool.py +38 -0
  4. google/adk/agents/base_agent.py +345 -0
  5. google/adk/agents/callback_context.py +112 -0
  6. google/adk/agents/invocation_context.py +181 -0
  7. google/adk/agents/langgraph_agent.py +140 -0
  8. google/adk/agents/live_request_queue.py +64 -0
  9. google/adk/agents/llm_agent.py +376 -0
  10. google/adk/agents/loop_agent.py +62 -0
  11. google/adk/agents/parallel_agent.py +96 -0
  12. google/adk/agents/readonly_context.py +46 -0
  13. google/adk/agents/remote_agent.py +50 -0
  14. google/adk/agents/run_config.py +87 -0
  15. google/adk/agents/sequential_agent.py +45 -0
  16. google/adk/agents/transcription_entry.py +34 -0
  17. google/adk/artifacts/__init__.py +23 -0
  18. google/adk/artifacts/base_artifact_service.py +128 -0
  19. google/adk/artifacts/gcs_artifact_service.py +195 -0
  20. google/adk/artifacts/in_memory_artifact_service.py +133 -0
  21. google/adk/auth/__init__.py +22 -0
  22. google/adk/auth/auth_credential.py +220 -0
  23. google/adk/auth/auth_handler.py +268 -0
  24. google/adk/auth/auth_preprocessor.py +116 -0
  25. google/adk/auth/auth_schemes.py +67 -0
  26. google/adk/auth/auth_tool.py +55 -0
  27. google/adk/cli/__init__.py +15 -0
  28. google/adk/cli/__main__.py +18 -0
  29. google/adk/cli/agent_graph.py +122 -0
  30. google/adk/cli/browser/adk_favicon.svg +17 -0
  31. google/adk/cli/browser/assets/audio-processor.js +51 -0
  32. google/adk/cli/browser/assets/config/runtime-config.json +3 -0
  33. google/adk/cli/browser/index.html +33 -0
  34. google/adk/cli/browser/main-XUU6OGCC.js +75 -0
  35. google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
  36. google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
  37. google/adk/cli/cli.py +181 -0
  38. google/adk/cli/cli_deploy.py +181 -0
  39. google/adk/cli/cli_eval.py +282 -0
  40. google/adk/cli/cli_tools_click.py +479 -0
  41. google/adk/cli/fast_api.py +774 -0
  42. google/adk/cli/media_streamer/__init__.py +19 -0
  43. google/adk/cli/media_streamer/index.html +228 -0
  44. google/adk/cli/utils/__init__.py +49 -0
  45. google/adk/cli/utils/envs.py +57 -0
  46. google/adk/cli/utils/evals.py +93 -0
  47. google/adk/cli/utils/logs.py +72 -0
  48. google/adk/code_executors/__init__.py +49 -0
  49. google/adk/code_executors/base_code_executor.py +97 -0
  50. google/adk/code_executors/code_execution_utils.py +256 -0
  51. google/adk/code_executors/code_executor_context.py +202 -0
  52. google/adk/code_executors/container_code_executor.py +196 -0
  53. google/adk/code_executors/unsafe_local_code_executor.py +71 -0
  54. google/adk/code_executors/vertex_ai_code_executor.py +234 -0
  55. google/adk/evaluation/__init__.py +31 -0
  56. google/adk/evaluation/agent_evaluator.py +329 -0
  57. google/adk/evaluation/evaluation_constants.py +24 -0
  58. google/adk/evaluation/evaluation_generator.py +270 -0
  59. google/adk/evaluation/response_evaluator.py +135 -0
  60. google/adk/evaluation/trajectory_evaluator.py +184 -0
  61. google/adk/events/__init__.py +21 -0
  62. google/adk/events/event.py +130 -0
  63. google/adk/events/event_actions.py +55 -0
  64. google/adk/examples/__init__.py +28 -0
  65. google/adk/examples/base_example_provider.py +35 -0
  66. google/adk/examples/example.py +27 -0
  67. google/adk/examples/example_util.py +123 -0
  68. google/adk/examples/vertex_ai_example_store.py +104 -0
  69. google/adk/flows/__init__.py +14 -0
  70. google/adk/flows/llm_flows/__init__.py +20 -0
  71. google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
  72. google/adk/flows/llm_flows/_code_execution.py +458 -0
  73. google/adk/flows/llm_flows/_nl_planning.py +129 -0
  74. google/adk/flows/llm_flows/agent_transfer.py +132 -0
  75. google/adk/flows/llm_flows/audio_transcriber.py +109 -0
  76. google/adk/flows/llm_flows/auto_flow.py +49 -0
  77. google/adk/flows/llm_flows/base_llm_flow.py +559 -0
  78. google/adk/flows/llm_flows/basic.py +72 -0
  79. google/adk/flows/llm_flows/contents.py +370 -0
  80. google/adk/flows/llm_flows/functions.py +486 -0
  81. google/adk/flows/llm_flows/identity.py +47 -0
  82. google/adk/flows/llm_flows/instructions.py +137 -0
  83. google/adk/flows/llm_flows/single_flow.py +57 -0
  84. google/adk/memory/__init__.py +35 -0
  85. google/adk/memory/base_memory_service.py +74 -0
  86. google/adk/memory/in_memory_memory_service.py +62 -0
  87. google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
  88. google/adk/models/__init__.py +31 -0
  89. google/adk/models/anthropic_llm.py +243 -0
  90. google/adk/models/base_llm.py +87 -0
  91. google/adk/models/base_llm_connection.py +76 -0
  92. google/adk/models/gemini_llm_connection.py +200 -0
  93. google/adk/models/google_llm.py +331 -0
  94. google/adk/models/lite_llm.py +673 -0
  95. google/adk/models/llm_request.py +98 -0
  96. google/adk/models/llm_response.py +111 -0
  97. google/adk/models/registry.py +102 -0
  98. google/adk/planners/__init__.py +23 -0
  99. google/adk/planners/base_planner.py +66 -0
  100. google/adk/planners/built_in_planner.py +75 -0
  101. google/adk/planners/plan_re_act_planner.py +208 -0
  102. google/adk/runners.py +456 -0
  103. google/adk/sessions/__init__.py +41 -0
  104. google/adk/sessions/base_session_service.py +133 -0
  105. google/adk/sessions/database_session_service.py +522 -0
  106. google/adk/sessions/in_memory_session_service.py +206 -0
  107. google/adk/sessions/session.py +54 -0
  108. google/adk/sessions/state.py +71 -0
  109. google/adk/sessions/vertex_ai_session_service.py +356 -0
  110. google/adk/telemetry.py +189 -0
  111. google/adk/tests/__init__.py +14 -0
  112. google/adk/tests/integration/.env.example +10 -0
  113. google/adk/tests/integration/__init__.py +18 -0
  114. google/adk/tests/integration/conftest.py +119 -0
  115. google/adk/tests/integration/fixture/__init__.py +14 -0
  116. google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
  117. google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
  118. google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
  119. google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
  120. google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
  121. google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
  122. google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
  123. google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
  124. google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
  125. google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
  126. google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
  127. google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
  128. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
  129. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
  130. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
  131. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
  132. google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
  133. google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
  134. google/adk/tests/integration/fixture/flow_complex_spark/sample.debug.log +243 -0
  135. google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
  136. google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
  137. google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
  138. google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
  139. google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
  140. google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
  141. google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
  142. google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
  143. google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
  144. google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
  145. google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
  146. google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
  147. google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
  148. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
  149. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
  150. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
  151. google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
  152. google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
  153. google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
  154. google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
  155. google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
  156. google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
  157. google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
  158. google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
  159. google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
  160. google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
  161. google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
  162. google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
  163. google/adk/tests/integration/models/__init__.py +14 -0
  164. google/adk/tests/integration/models/test_google_llm.py +65 -0
  165. google/adk/tests/integration/test_callback.py +70 -0
  166. google/adk/tests/integration/test_context_variable.py +67 -0
  167. google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
  168. google/adk/tests/integration/test_multi_agent.py +28 -0
  169. google/adk/tests/integration/test_multi_turn.py +42 -0
  170. google/adk/tests/integration/test_single_agent.py +23 -0
  171. google/adk/tests/integration/test_sub_agent.py +26 -0
  172. google/adk/tests/integration/test_system_instruction.py +177 -0
  173. google/adk/tests/integration/test_tools.py +287 -0
  174. google/adk/tests/integration/test_with_test_file.py +34 -0
  175. google/adk/tests/integration/tools/__init__.py +14 -0
  176. google/adk/tests/integration/utils/__init__.py +16 -0
  177. google/adk/tests/integration/utils/asserts.py +75 -0
  178. google/adk/tests/integration/utils/test_runner.py +97 -0
  179. google/adk/tests/unittests/__init__.py +14 -0
  180. google/adk/tests/unittests/agents/__init__.py +14 -0
  181. google/adk/tests/unittests/agents/test_base_agent.py +407 -0
  182. google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
  183. google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
  184. google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
  185. google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
  186. google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
  187. google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
  188. google/adk/tests/unittests/artifacts/__init__.py +14 -0
  189. google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
  190. google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
  191. google/adk/tests/unittests/conftest.py +73 -0
  192. google/adk/tests/unittests/fast_api/__init__.py +14 -0
  193. google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
  194. google/adk/tests/unittests/flows/__init__.py +14 -0
  195. google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
  196. google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
  197. google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
  198. google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
  199. google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
  200. google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
  201. google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
  202. google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
  203. google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
  204. google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
  205. google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
  206. google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
  207. google/adk/tests/unittests/models/__init__.py +14 -0
  208. google/adk/tests/unittests/models/test_google_llm.py +224 -0
  209. google/adk/tests/unittests/models/test_litellm.py +804 -0
  210. google/adk/tests/unittests/models/test_models.py +60 -0
  211. google/adk/tests/unittests/sessions/__init__.py +14 -0
  212. google/adk/tests/unittests/sessions/test_session_service.py +227 -0
  213. google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
  214. google/adk/tests/unittests/streaming/__init__.py +14 -0
  215. google/adk/tests/unittests/streaming/test_streaming.py +50 -0
  216. google/adk/tests/unittests/tools/__init__.py +14 -0
  217. google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
  218. google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
  219. google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
  220. google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
  221. google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
  222. google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
  223. google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
  224. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
  225. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
  226. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
  227. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
  228. google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
  229. google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
  230. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
  231. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
  232. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
  233. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
  234. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
  235. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
  236. google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
  237. google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
  238. google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
  239. google/adk/tests/unittests/tools/test_base_tool.py +141 -0
  240. google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
  241. google/adk/tests/unittests/utils.py +304 -0
  242. google/adk/tools/__init__.py +51 -0
  243. google/adk/tools/_automatic_function_calling_util.py +346 -0
  244. google/adk/tools/agent_tool.py +176 -0
  245. google/adk/tools/apihub_tool/__init__.py +19 -0
  246. google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
  247. google/adk/tools/apihub_tool/clients/__init__.py +13 -0
  248. google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
  249. google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
  250. google/adk/tools/application_integration_tool/__init__.py +19 -0
  251. google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
  252. google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
  253. google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
  254. google/adk/tools/base_tool.py +144 -0
  255. google/adk/tools/built_in_code_execution_tool.py +59 -0
  256. google/adk/tools/crewai_tool.py +72 -0
  257. google/adk/tools/example_tool.py +62 -0
  258. google/adk/tools/exit_loop_tool.py +23 -0
  259. google/adk/tools/function_parameter_parse_util.py +307 -0
  260. google/adk/tools/function_tool.py +87 -0
  261. google/adk/tools/get_user_choice_tool.py +28 -0
  262. google/adk/tools/google_api_tool/__init__.py +14 -0
  263. google/adk/tools/google_api_tool/google_api_tool.py +59 -0
  264. google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
  265. google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
  266. google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
  267. google/adk/tools/google_search_tool.py +68 -0
  268. google/adk/tools/langchain_tool.py +86 -0
  269. google/adk/tools/load_artifacts_tool.py +113 -0
  270. google/adk/tools/load_memory_tool.py +58 -0
  271. google/adk/tools/load_web_page.py +41 -0
  272. google/adk/tools/long_running_tool.py +39 -0
  273. google/adk/tools/mcp_tool/__init__.py +42 -0
  274. google/adk/tools/mcp_tool/conversion_utils.py +161 -0
  275. google/adk/tools/mcp_tool/mcp_tool.py +113 -0
  276. google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
  277. google/adk/tools/openapi_tool/__init__.py +21 -0
  278. google/adk/tools/openapi_tool/auth/__init__.py +19 -0
  279. google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
  280. google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
  281. google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
  282. google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
  283. google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
  284. google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
  285. google/adk/tools/openapi_tool/common/__init__.py +19 -0
  286. google/adk/tools/openapi_tool/common/common.py +300 -0
  287. google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
  288. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
  289. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
  290. google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
  291. google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
  292. google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
  293. google/adk/tools/preload_memory_tool.py +72 -0
  294. google/adk/tools/retrieval/__init__.py +36 -0
  295. google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
  296. google/adk/tools/retrieval/files_retrieval.py +33 -0
  297. google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
  298. google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
  299. google/adk/tools/tool_context.py +90 -0
  300. google/adk/tools/toolbox_tool.py +46 -0
  301. google/adk/tools/transfer_to_agent_tool.py +21 -0
  302. google/adk/tools/vertex_ai_search_tool.py +96 -0
  303. google/adk/version.py +16 -0
  304. google_adk-0.0.1.dist-info/LICENSE.txt → google_adk-0.0.2.dist-info/LICENSE +32 -0
  305. google_adk-0.0.2.dist-info/METADATA +73 -0
  306. google_adk-0.0.2.dist-info/RECORD +308 -0
  307. {google_adk-0.0.1.dist-info → google_adk-0.0.2.dist-info}/WHEEL +1 -2
  308. google_adk-0.0.2.dist-info/entry_points.txt +3 -0
  309. agent_kit/__init__.py +0 -0
  310. google_adk-0.0.1.dist-info/METADATA +0 -15
  311. google_adk-0.0.1.dist-info/RECORD +0 -6
  312. google_adk-0.0.1.dist-info/top_level.txt +0 -1
@@ -0,0 +1,307 @@
1
+ # Copyright 2024 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
+
16
+ import inspect
17
+ import logging
18
+ import types as typing_types
19
+ from typing import _GenericAlias
20
+ from typing import Any
21
+ from typing import get_args
22
+ from typing import get_origin
23
+ from typing import Literal
24
+ from typing import Union
25
+
26
+ from google.genai import types
27
+ import pydantic
28
+
29
+ _py_builtin_type_to_schema_type = {
30
+ str: types.Type.STRING,
31
+ int: types.Type.INTEGER,
32
+ float: types.Type.NUMBER,
33
+ bool: types.Type.BOOLEAN,
34
+ list: types.Type.ARRAY,
35
+ dict: types.Type.OBJECT,
36
+ }
37
+
38
+ logger = logging.getLogger(__name__)
39
+
40
+
41
+ def _is_builtin_primitive_or_compound(
42
+ annotation: inspect.Parameter.annotation,
43
+ ) -> bool:
44
+ return annotation in _py_builtin_type_to_schema_type.keys()
45
+
46
+
47
+ def _raise_for_any_of_if_mldev(schema: types.Schema):
48
+ if schema.any_of:
49
+ raise ValueError(
50
+ 'AnyOf is not supported in function declaration schema for Google AI.'
51
+ )
52
+
53
+
54
+ def _update_for_default_if_mldev(schema: types.Schema):
55
+ if schema.default is not None:
56
+ # TODO(kech): Remove this walkaround once mldev supports default value.
57
+ schema.default = None
58
+ logger.warning(
59
+ 'Default value is not supported in function declaration schema for'
60
+ ' Google AI.'
61
+ )
62
+
63
+
64
+ def _raise_if_schema_unsupported(variant: str, schema: types.Schema):
65
+ if not variant == 'VERTEX_AI':
66
+ _raise_for_any_of_if_mldev(schema)
67
+ _update_for_default_if_mldev(schema)
68
+
69
+
70
+ def _is_default_value_compatible(
71
+ default_value: Any, annotation: inspect.Parameter.annotation
72
+ ) -> bool:
73
+ # None type is expected to be handled external to this function
74
+ if _is_builtin_primitive_or_compound(annotation):
75
+ return isinstance(default_value, annotation)
76
+
77
+ if (
78
+ isinstance(annotation, _GenericAlias)
79
+ or isinstance(annotation, typing_types.GenericAlias)
80
+ or isinstance(annotation, typing_types.UnionType)
81
+ ):
82
+ origin = get_origin(annotation)
83
+ if origin in (Union, typing_types.UnionType):
84
+ return any(
85
+ _is_default_value_compatible(default_value, arg)
86
+ for arg in get_args(annotation)
87
+ )
88
+
89
+ if origin is dict:
90
+ return isinstance(default_value, dict)
91
+
92
+ if origin is list:
93
+ if not isinstance(default_value, list):
94
+ return False
95
+ # most tricky case, element in list is union type
96
+ # need to apply any logic within all
97
+ # see test case test_generic_alias_complex_array_with_default_value
98
+ # a: typing.List[int | str | float | bool]
99
+ # default_value: [1, 'a', 1.1, True]
100
+ return all(
101
+ any(
102
+ _is_default_value_compatible(item, arg)
103
+ for arg in get_args(annotation)
104
+ )
105
+ for item in default_value
106
+ )
107
+
108
+ if origin is Literal:
109
+ return default_value in get_args(annotation)
110
+
111
+ # return False for any other unrecognized annotation
112
+ # let caller handle the raise
113
+ return False
114
+
115
+
116
+ def _parse_schema_from_parameter(
117
+ variant: str, param: inspect.Parameter, func_name: str
118
+ ) -> types.Schema:
119
+ """parse schema from parameter.
120
+
121
+ from the simplest case to the most complex case.
122
+ """
123
+ schema = types.Schema()
124
+ default_value_error_msg = (
125
+ f'Default value {param.default} of parameter {param} of function'
126
+ f' {func_name} is not compatible with the parameter annotation'
127
+ f' {param.annotation}.'
128
+ )
129
+ if _is_builtin_primitive_or_compound(param.annotation):
130
+ if param.default is not inspect.Parameter.empty:
131
+ if not _is_default_value_compatible(param.default, param.annotation):
132
+ raise ValueError(default_value_error_msg)
133
+ schema.default = param.default
134
+ schema.type = _py_builtin_type_to_schema_type[param.annotation]
135
+ _raise_if_schema_unsupported(variant, schema)
136
+ return schema
137
+ if (
138
+ get_origin(param.annotation) is Union
139
+ # only parse simple UnionType, example int | str | float | bool
140
+ # complex types.UnionType will be invoked in raise branch
141
+ and all(
142
+ (_is_builtin_primitive_or_compound(arg) or arg is type(None))
143
+ for arg in get_args(param.annotation)
144
+ )
145
+ ):
146
+ schema.type = types.Type.OBJECT
147
+ schema.any_of = []
148
+ unique_types = set()
149
+ for arg in get_args(param.annotation):
150
+ if arg.__name__ == 'NoneType': # Optional type
151
+ schema.nullable = True
152
+ continue
153
+ schema_in_any_of = _parse_schema_from_parameter(
154
+ variant,
155
+ inspect.Parameter(
156
+ 'item', inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=arg
157
+ ),
158
+ func_name,
159
+ )
160
+ if (
161
+ schema_in_any_of.model_dump_json(exclude_none=True)
162
+ not in unique_types
163
+ ):
164
+ schema.any_of.append(schema_in_any_of)
165
+ unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True))
166
+ if len(schema.any_of) == 1: # param: list | None -> Array
167
+ schema.type = schema.any_of[0].type
168
+ schema.any_of = None
169
+ if (
170
+ param.default is not inspect.Parameter.empty
171
+ and param.default is not None
172
+ ):
173
+ if not _is_default_value_compatible(param.default, param.annotation):
174
+ raise ValueError(default_value_error_msg)
175
+ schema.default = param.default
176
+ _raise_if_schema_unsupported(variant, schema)
177
+ return schema
178
+ if isinstance(param.annotation, _GenericAlias) or isinstance(
179
+ param.annotation, typing_types.GenericAlias
180
+ ):
181
+ origin = get_origin(param.annotation)
182
+ args = get_args(param.annotation)
183
+ if origin is dict:
184
+ schema.type = types.Type.OBJECT
185
+ if param.default is not inspect.Parameter.empty:
186
+ if not _is_default_value_compatible(param.default, param.annotation):
187
+ raise ValueError(default_value_error_msg)
188
+ schema.default = param.default
189
+ _raise_if_schema_unsupported(variant, schema)
190
+ return schema
191
+ if origin is Literal:
192
+ if not all(isinstance(arg, str) for arg in args):
193
+ raise ValueError(
194
+ f'Literal type {param.annotation} must be a list of strings.'
195
+ )
196
+ schema.type = types.Type.STRING
197
+ schema.enum = list(args)
198
+ if param.default is not inspect.Parameter.empty:
199
+ if not _is_default_value_compatible(param.default, param.annotation):
200
+ raise ValueError(default_value_error_msg)
201
+ schema.default = param.default
202
+ _raise_if_schema_unsupported(variant, schema)
203
+ return schema
204
+ if origin is list:
205
+ schema.type = types.Type.ARRAY
206
+ schema.items = _parse_schema_from_parameter(
207
+ variant,
208
+ inspect.Parameter(
209
+ 'item',
210
+ inspect.Parameter.POSITIONAL_OR_KEYWORD,
211
+ annotation=args[0],
212
+ ),
213
+ func_name,
214
+ )
215
+ if param.default is not inspect.Parameter.empty:
216
+ if not _is_default_value_compatible(param.default, param.annotation):
217
+ raise ValueError(default_value_error_msg)
218
+ schema.default = param.default
219
+ _raise_if_schema_unsupported(variant, schema)
220
+ return schema
221
+ if origin is Union:
222
+ schema.any_of = []
223
+ schema.type = types.Type.OBJECT
224
+ unique_types = set()
225
+ for arg in args:
226
+ if arg.__name__ == 'NoneType': # Optional type
227
+ schema.nullable = True
228
+ continue
229
+ schema_in_any_of = _parse_schema_from_parameter(
230
+ variant,
231
+ inspect.Parameter(
232
+ 'item',
233
+ inspect.Parameter.POSITIONAL_OR_KEYWORD,
234
+ annotation=arg,
235
+ ),
236
+ func_name,
237
+ )
238
+ if (
239
+ len(param.annotation.__args__) == 2
240
+ and type(None) in param.annotation.__args__
241
+ ): # Optional type
242
+ for optional_arg in param.annotation.__args__:
243
+ if (
244
+ hasattr(optional_arg, '__origin__')
245
+ and optional_arg.__origin__ is list
246
+ ):
247
+ # Optional type with list, for example Optional[list[str]]
248
+ schema.items = schema_in_any_of.items
249
+ if (
250
+ schema_in_any_of.model_dump_json(exclude_none=True)
251
+ not in unique_types
252
+ ):
253
+ schema.any_of.append(schema_in_any_of)
254
+ unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True))
255
+ if len(schema.any_of) == 1: # param: Union[List, None] -> Array
256
+ schema.type = schema.any_of[0].type
257
+ schema.any_of = None
258
+ if (
259
+ param.default is not None
260
+ and param.default is not inspect.Parameter.empty
261
+ ):
262
+ if not _is_default_value_compatible(param.default, param.annotation):
263
+ raise ValueError(default_value_error_msg)
264
+ schema.default = param.default
265
+ _raise_if_schema_unsupported(variant, schema)
266
+ return schema
267
+ # all other generic alias will be invoked in raise branch
268
+ if (
269
+ inspect.isclass(param.annotation)
270
+ # for user defined class, we only support pydantic model
271
+ and issubclass(param.annotation, pydantic.BaseModel)
272
+ ):
273
+ if (
274
+ param.default is not inspect.Parameter.empty
275
+ and param.default is not None
276
+ ):
277
+ schema.default = param.default
278
+ schema.type = types.Type.OBJECT
279
+ schema.properties = {}
280
+ for field_name, field_info in param.annotation.model_fields.items():
281
+ schema.properties[field_name] = _parse_schema_from_parameter(
282
+ variant,
283
+ inspect.Parameter(
284
+ field_name,
285
+ inspect.Parameter.POSITIONAL_OR_KEYWORD,
286
+ annotation=field_info.annotation,
287
+ ),
288
+ func_name,
289
+ )
290
+ _raise_if_schema_unsupported(variant, schema)
291
+ return schema
292
+ raise ValueError(
293
+ f'Failed to parse the parameter {param} of function {func_name} for'
294
+ ' automatic function calling.Automatic function calling works best with'
295
+ ' simpler function signature schema,consider manually parse your'
296
+ f' function declaration for function {func_name}.'
297
+ )
298
+
299
+
300
+ def _get_required_fields(schema: types.Schema) -> list[str]:
301
+ if not schema.properties:
302
+ return
303
+ return [
304
+ field_name
305
+ for field_name, field_schema in schema.properties.items()
306
+ if not field_schema.nullable and field_schema.default is None
307
+ ]
@@ -0,0 +1,87 @@
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 inspect
16
+ from typing import Any
17
+ from typing import Callable
18
+ from typing import Optional
19
+
20
+ from google.genai import types
21
+ from typing_extensions import override
22
+
23
+ from ._automatic_function_calling_util import build_function_declaration
24
+ from .base_tool import BaseTool
25
+ from .tool_context import ToolContext
26
+
27
+
28
+ class FunctionTool(BaseTool):
29
+ """A tool that wraps a user-defined Python function.
30
+
31
+ Attributes:
32
+ func: The function to wrap.
33
+ """
34
+
35
+ def __init__(self, func: Callable[..., Any]):
36
+ super().__init__(name=func.__name__, description=func.__doc__)
37
+ self.func = func
38
+
39
+ @override
40
+ def _get_declaration(self) -> Optional[types.FunctionDeclaration]:
41
+ function_decl = types.FunctionDeclaration.model_validate(
42
+ build_function_declaration(
43
+ func=self.func,
44
+ # The model doesn't understand the function context.
45
+ # input_stream is for streaming tool
46
+ ignore_params=['tool_context', 'input_stream'],
47
+ variant=self._api_variant,
48
+ )
49
+ )
50
+
51
+ return function_decl
52
+
53
+ @override
54
+ async def run_async(
55
+ self, *, args: dict[str, Any], tool_context: ToolContext
56
+ ) -> Any:
57
+ args_to_call = args.copy()
58
+ signature = inspect.signature(self.func)
59
+ if 'tool_context' in signature.parameters:
60
+ args_to_call['tool_context'] = tool_context
61
+
62
+ if inspect.iscoroutinefunction(self.func):
63
+ return await self.func(**args_to_call) or {}
64
+ else:
65
+ return self.func(**args_to_call) or {}
66
+
67
+ # TODO(hangfei): fix call live for function stream.
68
+ async def _call_live(
69
+ self,
70
+ *,
71
+ args: dict[str, Any],
72
+ tool_context: ToolContext,
73
+ invocation_context,
74
+ ) -> Any:
75
+ args_to_call = args.copy()
76
+ signature = inspect.signature(self.func)
77
+ if (
78
+ self.name in invocation_context.active_streaming_tools
79
+ and invocation_context.active_streaming_tools[self.name].stream
80
+ ):
81
+ args_to_call['input_stream'] = invocation_context.active_streaming_tools[
82
+ self.name
83
+ ].stream
84
+ if 'tool_context' in signature.parameters:
85
+ args_to_call['tool_context'] = tool_context
86
+ async for item in self.func(**args_to_call):
87
+ yield item
@@ -0,0 +1,28 @@
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
+ from .long_running_tool import LongRunningFunctionTool
17
+ from .tool_context import ToolContext
18
+
19
+
20
+ def get_user_choice(
21
+ options: list[str], tool_context: ToolContext
22
+ ) -> Optional[str]:
23
+ """Provides the options to the user and asks them to choose one."""
24
+ tool_context.actions.skip_summarization = True
25
+ return None
26
+
27
+
28
+ get_user_choice_tool = LongRunningFunctionTool(func=get_user_choice)
@@ -0,0 +1,14 @@
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
+ from .google_api_tool_sets import calendar_tool_set
@@ -0,0 +1,59 @@
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
16
+ from typing import Dict
17
+ from typing import Optional
18
+
19
+ from google.genai.types import FunctionDeclaration
20
+ from typing_extensions import override
21
+
22
+ from ...auth import AuthCredential
23
+ from ...auth import AuthCredentialTypes
24
+ from ...auth import OAuth2Auth
25
+ from .. import BaseTool
26
+ from ..openapi_tool import RestApiTool
27
+ from ..tool_context import ToolContext
28
+
29
+
30
+ class GoogleApiTool(BaseTool):
31
+
32
+ def __init__(self, rest_api_tool: RestApiTool):
33
+ super().__init__(
34
+ name=rest_api_tool.name,
35
+ description=rest_api_tool.description,
36
+ is_long_running=rest_api_tool.is_long_running,
37
+ )
38
+ self.rest_api_tool = rest_api_tool
39
+
40
+ @override
41
+ def _get_declaration(self) -> FunctionDeclaration:
42
+ return self.rest_api_tool._get_declaration()
43
+
44
+ @override
45
+ async def run_async(
46
+ self, *, args: dict[str, Any], tool_context: Optional[ToolContext]
47
+ ) -> Dict[str, Any]:
48
+ return await self.rest_api_tool.run_async(
49
+ args=args, tool_context=tool_context
50
+ )
51
+
52
+ def configure_auth(self, client_id: str, client_secret: str):
53
+ self.rest_api_tool.auth_credential = AuthCredential(
54
+ auth_type=AuthCredentialTypes.OPEN_ID_CONNECT,
55
+ oauth2=OAuth2Auth(
56
+ client_id=client_id,
57
+ client_secret=client_secret,
58
+ ),
59
+ )
@@ -0,0 +1,107 @@
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 inspect
15
+ import os
16
+ from typing import Any
17
+ from typing import Dict
18
+ from typing import Final
19
+ from typing import List
20
+ from typing import Optional
21
+ from typing import Type
22
+
23
+ from ...auth import OpenIdConnectWithConfig
24
+ from ..openapi_tool import OpenAPIToolset
25
+ from ..openapi_tool import RestApiTool
26
+ from .google_api_tool import GoogleApiTool
27
+ from .googleapi_to_openapi_converter import GoogleApiToOpenApiConverter
28
+
29
+
30
+ class GoogleApiToolSet:
31
+
32
+ def __init__(self, tools: List[RestApiTool]):
33
+ self.tools: Final[List[GoogleApiTool]] = [
34
+ GoogleApiTool(tool) for tool in tools
35
+ ]
36
+
37
+ def get_tools(self) -> List[GoogleApiTool]:
38
+ """Get all tools in the toolset."""
39
+ return self.tools
40
+
41
+ def get_tool(self, tool_name: str) -> Optional[GoogleApiTool]:
42
+ """Get a tool by name."""
43
+ matching_tool = filter(lambda t: t.name == tool_name, self.tools)
44
+ return next(matching_tool, None)
45
+
46
+ @staticmethod
47
+ def _load_tool_set_with_oidc_auth(
48
+ spec_file: str = None,
49
+ spec_dict: Dict[str, Any] = None,
50
+ scopes: list[str] = None,
51
+ ) -> Optional[OpenAPIToolset]:
52
+ spec_str = None
53
+ if spec_file:
54
+ # Get the frame of the caller
55
+ caller_frame = inspect.stack()[1]
56
+ # Get the filename of the caller
57
+ caller_filename = caller_frame.filename
58
+ # Get the directory of the caller
59
+ caller_dir = os.path.dirname(os.path.abspath(caller_filename))
60
+ # Join the directory path with the filename
61
+ yaml_path = os.path.join(caller_dir, spec_file)
62
+ with open(yaml_path, 'r', encoding='utf-8') as file:
63
+ spec_str = file.read()
64
+ tool_set = OpenAPIToolset(
65
+ spec_dict=spec_dict,
66
+ spec_str=spec_str,
67
+ spec_str_type='yaml',
68
+ auth_scheme=OpenIdConnectWithConfig(
69
+ authorization_endpoint=(
70
+ 'https://accounts.google.com/o/oauth2/v2/auth'
71
+ ),
72
+ token_endpoint='https://oauth2.googleapis.com/token',
73
+ userinfo_endpoint=(
74
+ 'https://openidconnect.googleapis.com/v1/userinfo'
75
+ ),
76
+ revocation_endpoint='https://oauth2.googleapis.com/revoke',
77
+ token_endpoint_auth_methods_supported=[
78
+ 'client_secret_post',
79
+ 'client_secret_basic',
80
+ ],
81
+ grant_types_supported=['authorization_code'],
82
+ scopes=scopes,
83
+ ),
84
+ )
85
+ return tool_set
86
+
87
+ def configure_auth(self, client_id: str, client_secret: str):
88
+ for tool in self.tools:
89
+ tool.configure_auth(client_id, client_secret)
90
+
91
+ @classmethod
92
+ def load_tool_set(
93
+ cl: Type['GoogleApiToolSet'],
94
+ api_name: str,
95
+ api_version: str,
96
+ ) -> 'GoogleApiToolSet':
97
+ spec_dict = GoogleApiToOpenApiConverter(api_name, api_version).convert()
98
+ scope = list(
99
+ spec_dict['components']['securitySchemes']['oauth2']['flows'][
100
+ 'authorizationCode'
101
+ ]['scopes'].keys()
102
+ )[0]
103
+ return cl(
104
+ cl._load_tool_set_with_oidc_auth(
105
+ spec_dict=spec_dict, scopes=[scope]
106
+ ).get_tools()
107
+ )
@@ -0,0 +1,55 @@
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
+
16
+ import logging
17
+
18
+ from .google_api_tool_set import GoogleApiToolSet
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ calendar_tool_set = GoogleApiToolSet.load_tool_set(
23
+ api_name="calendar",
24
+ api_version="v3",
25
+ )
26
+
27
+ bigquery_tool_set = GoogleApiToolSet.load_tool_set(
28
+ api_name="bigquery",
29
+ api_version="v2",
30
+ )
31
+
32
+ gmail_tool_set = GoogleApiToolSet.load_tool_set(
33
+ api_name="gmail",
34
+ api_version="v1",
35
+ )
36
+
37
+ youtube_tool_set = GoogleApiToolSet.load_tool_set(
38
+ api_name="youtube",
39
+ api_version="v3",
40
+ )
41
+
42
+ slides_tool_set = GoogleApiToolSet.load_tool_set(
43
+ api_name="slides",
44
+ api_version="v1",
45
+ )
46
+
47
+ sheets_tool_set = GoogleApiToolSet.load_tool_set(
48
+ api_name="sheets",
49
+ api_version="v4",
50
+ )
51
+
52
+ docs_tool_set = GoogleApiToolSet.load_tool_set(
53
+ api_name="docs",
54
+ api_version="v1",
55
+ )