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,903 @@
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 json
16
+ import time
17
+ from typing import Any, Dict, List, Optional, Tuple
18
+
19
+ import google.auth
20
+ from google.auth import default as default_service_credential
21
+ from google.auth.transport.requests import Request
22
+ from google.oauth2 import service_account
23
+ import requests
24
+
25
+
26
+ class ConnectionsClient:
27
+ """Utility class for interacting with Google Cloud Connectors API."""
28
+
29
+ def __init__(
30
+ self,
31
+ project: str,
32
+ location: str,
33
+ connection: str,
34
+ service_account_json: Optional[str] = None,
35
+ ):
36
+ """Initializes the ConnectionsClient.
37
+
38
+ Args:
39
+ project: The Google Cloud project ID.
40
+ location: The Google Cloud location (e.g., us-central1).
41
+ connection: The connection name.
42
+ service_account_json: The service account configuration as a dictionary.
43
+ Required if not using default service credential. Used for fetching
44
+ connection details.
45
+ """
46
+ self.project = project
47
+ self.location = location
48
+ self.connection = connection
49
+ self.connector_url = "https://connectors.googleapis.com"
50
+ self.service_account_json = service_account_json
51
+ self.credential_cache = None
52
+
53
+ def get_connection_details(self) -> Dict[str, Any]:
54
+ """Retrieves service details (service name and host) for a given connection.
55
+
56
+ Also returns if auth override is enabled for the connection.
57
+
58
+ Returns:
59
+ tuple: A tuple containing (service_name, host).
60
+
61
+ Raises:
62
+ PermissionError: If there are credential issues.
63
+ ValueError: If there's a request error.
64
+ Exception: For any other unexpected errors.
65
+ """
66
+ url = f"{self.connector_url}/v1/projects/{self.project}/locations/{self.location}/connections/{self.connection}?view=BASIC"
67
+
68
+ response = self._execute_api_call(url)
69
+
70
+ connection_data = response.json()
71
+ service_name = connection_data.get("serviceDirectory", "")
72
+ host = connection_data.get("host", "")
73
+ if host:
74
+ service_name = connection_data.get("tlsServiceDirectory", "")
75
+ auth_override_enabled = connection_data.get("authOverrideEnabled", False)
76
+ return {
77
+ "serviceName": service_name,
78
+ "host": host,
79
+ "authOverrideEnabled": auth_override_enabled,
80
+ }
81
+
82
+ def get_entity_schema_and_operations(
83
+ self, entity: str
84
+ ) -> Tuple[Dict[str, Any], List[str]]:
85
+ """Retrieves the JSON schema for a given entity in a connection.
86
+
87
+ Args:
88
+ entity (str): The entity name.
89
+
90
+ Returns:
91
+ tuple: A tuple containing (schema, operations).
92
+
93
+ Raises:
94
+ PermissionError: If there are credential issues.
95
+ ValueError: If there's a request or processing error.
96
+ Exception: For any other unexpected errors.
97
+ """
98
+ url = f"{self.connector_url}/v1/projects/{self.project}/locations/{self.location}/connections/{self.connection}/connectionSchemaMetadata:getEntityType?entityId={entity}"
99
+
100
+ response = self._execute_api_call(url)
101
+ operation_id = response.json().get("name")
102
+
103
+ if not operation_id:
104
+ raise ValueError(
105
+ f"Failed to get entity schema and operations for entity: {entity}"
106
+ )
107
+
108
+ operation_response = self._poll_operation(operation_id)
109
+
110
+ schema = operation_response.get("response", {}).get("jsonSchema", {})
111
+ operations = operation_response.get("response", {}).get("operations", [])
112
+ return schema, operations
113
+
114
+ def get_action_schema(self, action: str) -> Dict[str, Any]:
115
+ """Retrieves the input and output JSON schema for a given action in a connection.
116
+
117
+ Args:
118
+ action (str): The action name.
119
+
120
+ Returns:
121
+ tuple: A tuple containing (input_schema, output_schema).
122
+
123
+ Raises:
124
+ PermissionError: If there are credential issues.
125
+ ValueError: If there's a request or processing error.
126
+ Exception: For any other unexpected errors.
127
+ """
128
+ url = f"{self.connector_url}/v1/projects/{self.project}/locations/{self.location}/connections/{self.connection}/connectionSchemaMetadata:getAction?actionId={action}"
129
+
130
+ response = self._execute_api_call(url)
131
+
132
+ operation_id = response.json().get("name")
133
+
134
+ if not operation_id:
135
+ raise ValueError(f"Failed to get action schema for action: {action}")
136
+
137
+ operation_response = self._poll_operation(operation_id)
138
+
139
+ input_schema = operation_response.get("response", {}).get(
140
+ "inputJsonSchema", {}
141
+ )
142
+ output_schema = operation_response.get("response", {}).get(
143
+ "outputJsonSchema", {}
144
+ )
145
+ description = operation_response.get("response", {}).get("description", "")
146
+ display_name = operation_response.get("response", {}).get("displayName", "")
147
+ return {
148
+ "inputSchema": input_schema,
149
+ "outputSchema": output_schema,
150
+ "description": description,
151
+ "displayName": display_name,
152
+ }
153
+
154
+ @staticmethod
155
+ def get_connector_base_spec() -> Dict[str, Any]:
156
+ return {
157
+ "openapi": "3.0.1",
158
+ "info": {
159
+ "title": "ExecuteConnection",
160
+ "description": "This tool can execute a query on connection",
161
+ "version": "4",
162
+ },
163
+ "servers": [{"url": "https://integrations.googleapis.com"}],
164
+ "security": [
165
+ {"google_auth": ["https://www.googleapis.com/auth/cloud-platform"]}
166
+ ],
167
+ "paths": {},
168
+ "components": {
169
+ "schemas": {
170
+ "operation": {
171
+ "type": "string",
172
+ "default": "LIST_ENTITIES",
173
+ "description": (
174
+ "Operation to execute. Possible values are"
175
+ " LIST_ENTITIES, GET_ENTITY, CREATE_ENTITY,"
176
+ " UPDATE_ENTITY, DELETE_ENTITY in case of entities."
177
+ " EXECUTE_ACTION in case of actions. and EXECUTE_QUERY"
178
+ " in case of custom queries."
179
+ ),
180
+ },
181
+ "entityId": {
182
+ "type": "string",
183
+ "description": "Name of the entity",
184
+ },
185
+ "connectorInputPayload": {"type": "object"},
186
+ "filterClause": {
187
+ "type": "string",
188
+ "default": "",
189
+ "description": "WHERE clause in SQL query",
190
+ },
191
+ "pageSize": {
192
+ "type": "integer",
193
+ "default": 50,
194
+ "description": (
195
+ "Number of entities to return in the response"
196
+ ),
197
+ },
198
+ "pageToken": {
199
+ "type": "string",
200
+ "default": "",
201
+ "description": (
202
+ "Page token to return the next page of entities"
203
+ ),
204
+ },
205
+ "connectionName": {
206
+ "type": "string",
207
+ "default": "",
208
+ "description": (
209
+ "Connection resource name to run the query for"
210
+ ),
211
+ },
212
+ "serviceName": {
213
+ "type": "string",
214
+ "default": "",
215
+ "description": "Service directory for the connection",
216
+ },
217
+ "host": {
218
+ "type": "string",
219
+ "default": "",
220
+ "description": "Host name incase of tls service directory",
221
+ },
222
+ "entity": {
223
+ "type": "string",
224
+ "default": "Issues",
225
+ "description": "Entity to run the query for",
226
+ },
227
+ "action": {
228
+ "type": "string",
229
+ "default": "ExecuteCustomQuery",
230
+ "description": "Action to run the query for",
231
+ },
232
+ "query": {
233
+ "type": "string",
234
+ "default": "",
235
+ "description": "Custom Query to execute on the connection",
236
+ },
237
+ "dynamicAuthConfig": {
238
+ "type": "object",
239
+ "default": {},
240
+ "description": "Dynamic auth config for the connection",
241
+ },
242
+ "timeout": {
243
+ "type": "integer",
244
+ "default": 120,
245
+ "description": (
246
+ "Timeout in seconds for execution of custom query"
247
+ ),
248
+ },
249
+ "connectorOutputPayload": {"type": "object"},
250
+ "nextPageToken": {"type": "string"},
251
+ "execute-connector_Response": {
252
+ "required": ["connectorOutputPayload"],
253
+ "type": "object",
254
+ "properties": {
255
+ "connectorOutputPayload": {
256
+ "$ref": (
257
+ "#/components/schemas/connectorOutputPayload"
258
+ )
259
+ },
260
+ "nextPageToken": {
261
+ "$ref": "#/components/schemas/nextPageToken"
262
+ },
263
+ },
264
+ },
265
+ },
266
+ "securitySchemes": {
267
+ "google_auth": {
268
+ "type": "oauth2",
269
+ "flows": {
270
+ "implicit": {
271
+ "authorizationUrl": (
272
+ "https://accounts.google.com/o/oauth2/auth"
273
+ ),
274
+ "scopes": {
275
+ "https://www.googleapis.com/auth/cloud-platform": (
276
+ "Auth for google cloud services"
277
+ )
278
+ },
279
+ }
280
+ },
281
+ }
282
+ },
283
+ },
284
+ }
285
+
286
+ @staticmethod
287
+ def get_action_operation(
288
+ action: str,
289
+ operation: str,
290
+ action_display_name: str,
291
+ tool_name: str = "",
292
+ tool_instructions: str = "",
293
+ ) -> Dict[str, Any]:
294
+ description = (
295
+ f"Use this tool with" f' action = "{action}" and'
296
+ ) + f' operation = "{operation}" only. Dont ask these values from user.'
297
+ if operation == "EXECUTE_QUERY":
298
+ description = (
299
+ (f"Use this tool with" f' action = "{action}" and')
300
+ + f' operation = "{operation}" only. Dont ask these values from user.'
301
+ " Use pageSize = 50 and timeout = 120 until user specifies a"
302
+ " different value otherwise. If user provides a query in natural"
303
+ " language, convert it to SQL query and then execute it using the"
304
+ " tool."
305
+ )
306
+ return {
307
+ "post": {
308
+ "summary": f"{action_display_name}",
309
+ "description": f"{description} {tool_instructions}",
310
+ "operationId": f"{tool_name}_{action_display_name}",
311
+ "requestBody": {
312
+ "content": {
313
+ "application/json": {
314
+ "schema": {
315
+ "$ref": (
316
+ f"#/components/schemas/{action_display_name}_Request"
317
+ )
318
+ }
319
+ }
320
+ }
321
+ },
322
+ "responses": {
323
+ "200": {
324
+ "description": "Success response",
325
+ "content": {
326
+ "application/json": {
327
+ "schema": {
328
+ "$ref": (
329
+ f"#/components/schemas/{action_display_name}_Response"
330
+ ),
331
+ }
332
+ }
333
+ },
334
+ }
335
+ },
336
+ }
337
+ }
338
+
339
+ @staticmethod
340
+ def list_operation(
341
+ entity: str,
342
+ schema_as_string: str = "",
343
+ tool_name: str = "",
344
+ tool_instructions: str = "",
345
+ ) -> Dict[str, Any]:
346
+ return {
347
+ "post": {
348
+ "summary": f"List {entity}",
349
+ "description": (
350
+ f"Returns all entities of type {entity}. Use this tool with"
351
+ + f' entity = "{entity}" and'
352
+ + ' operation = "LIST_ENTITIES" only. Dont ask these values'
353
+ " from"
354
+ + ' user. Always use ""'
355
+ + ' as filter clause and ""'
356
+ + " as page token and 50 as page size until user specifies a"
357
+ " different value otherwise. Use single quotes for strings in"
358
+ f" filter clause. {tool_instructions}"
359
+ ),
360
+ "operationId": f"{tool_name}_list_{entity}",
361
+ "requestBody": {
362
+ "content": {
363
+ "application/json": {
364
+ "schema": {
365
+ "$ref": (
366
+ f"#/components/schemas/list_{entity}_Request"
367
+ )
368
+ }
369
+ }
370
+ }
371
+ },
372
+ "responses": {
373
+ "200": {
374
+ "description": "Success response",
375
+ "content": {
376
+ "application/json": {
377
+ "schema": {
378
+ "description": (
379
+ f"Returns a list of {entity} of json"
380
+ f" schema: {schema_as_string}"
381
+ ),
382
+ "$ref": (
383
+ "#/components/schemas/execute-connector_Response"
384
+ ),
385
+ }
386
+ }
387
+ },
388
+ }
389
+ },
390
+ }
391
+ }
392
+
393
+ @staticmethod
394
+ def get_operation(
395
+ entity: str,
396
+ schema_as_string: str = "",
397
+ tool_name: str = "",
398
+ tool_instructions: str = "",
399
+ ) -> Dict[str, Any]:
400
+ return {
401
+ "post": {
402
+ "summary": f"Get {entity}",
403
+ "description": (
404
+ (
405
+ f"Returns the details of the {entity}. Use this tool with"
406
+ f' entity = "{entity}" and'
407
+ )
408
+ + ' operation = "GET_ENTITY" only. Dont ask these values from'
409
+ f" user. {tool_instructions}"
410
+ ),
411
+ "operationId": f"{tool_name}_get_{entity}",
412
+ "requestBody": {
413
+ "content": {
414
+ "application/json": {
415
+ "schema": {
416
+ "$ref": f"#/components/schemas/get_{entity}_Request"
417
+ }
418
+ }
419
+ }
420
+ },
421
+ "responses": {
422
+ "200": {
423
+ "description": "Success response",
424
+ "content": {
425
+ "application/json": {
426
+ "schema": {
427
+ "description": (
428
+ f"Returns {entity} of json schema:"
429
+ f" {schema_as_string}"
430
+ ),
431
+ "$ref": (
432
+ "#/components/schemas/execute-connector_Response"
433
+ ),
434
+ }
435
+ }
436
+ },
437
+ }
438
+ },
439
+ }
440
+ }
441
+
442
+ @staticmethod
443
+ def create_operation(
444
+ entity: str, tool_name: str = "", tool_instructions: str = ""
445
+ ) -> Dict[str, Any]:
446
+ return {
447
+ "post": {
448
+ "summary": f"Create {entity}",
449
+ "description": (
450
+ (
451
+ f"Creates a new entity of type {entity}. Use this tool with"
452
+ f' entity = "{entity}" and'
453
+ )
454
+ + ' operation = "CREATE_ENTITY" only. Dont ask these values'
455
+ " from"
456
+ + " user. Follow the schema of the entity provided in the"
457
+ f" instructions to create {entity}. {tool_instructions}"
458
+ ),
459
+ "operationId": f"{tool_name}_create_{entity}",
460
+ "requestBody": {
461
+ "content": {
462
+ "application/json": {
463
+ "schema": {
464
+ "$ref": (
465
+ f"#/components/schemas/create_{entity}_Request"
466
+ )
467
+ }
468
+ }
469
+ }
470
+ },
471
+ "responses": {
472
+ "200": {
473
+ "description": "Success response",
474
+ "content": {
475
+ "application/json": {
476
+ "schema": {
477
+ "$ref": (
478
+ "#/components/schemas/execute-connector_Response"
479
+ )
480
+ }
481
+ }
482
+ },
483
+ }
484
+ },
485
+ }
486
+ }
487
+
488
+ @staticmethod
489
+ def update_operation(
490
+ entity: str, tool_name: str = "", tool_instructions: str = ""
491
+ ) -> Dict[str, Any]:
492
+ return {
493
+ "post": {
494
+ "summary": f"Update {entity}",
495
+ "description": (
496
+ (
497
+ f"Updates an entity of type {entity}. Use this tool with"
498
+ f' entity = "{entity}" and'
499
+ )
500
+ + ' operation = "UPDATE_ENTITY" only. Dont ask these values'
501
+ " from"
502
+ + " user. Use entityId to uniquely identify the entity to"
503
+ " update. Follow the schema of the entity provided in the"
504
+ f" instructions to update {entity}. {tool_instructions}"
505
+ ),
506
+ "operationId": f"{tool_name}_update_{entity}",
507
+ "requestBody": {
508
+ "content": {
509
+ "application/json": {
510
+ "schema": {
511
+ "$ref": (
512
+ f"#/components/schemas/update_{entity}_Request"
513
+ )
514
+ }
515
+ }
516
+ }
517
+ },
518
+ "responses": {
519
+ "200": {
520
+ "description": "Success response",
521
+ "content": {
522
+ "application/json": {
523
+ "schema": {
524
+ "$ref": (
525
+ "#/components/schemas/execute-connector_Response"
526
+ )
527
+ }
528
+ }
529
+ },
530
+ }
531
+ },
532
+ }
533
+ }
534
+
535
+ @staticmethod
536
+ def delete_operation(
537
+ entity: str, tool_name: str = "", tool_instructions: str = ""
538
+ ) -> Dict[str, Any]:
539
+ return {
540
+ "post": {
541
+ "summary": f"Delete {entity}",
542
+ "description": (
543
+ (
544
+ f"Deletes an entity of type {entity}. Use this tool with"
545
+ f' entity = "{entity}" and'
546
+ )
547
+ + ' operation = "DELETE_ENTITY" only. Dont ask these values'
548
+ " from"
549
+ f" user. {tool_instructions}"
550
+ ),
551
+ "operationId": f"{tool_name}_delete_{entity}",
552
+ "requestBody": {
553
+ "content": {
554
+ "application/json": {
555
+ "schema": {
556
+ "$ref": (
557
+ f"#/components/schemas/delete_{entity}_Request"
558
+ )
559
+ }
560
+ }
561
+ }
562
+ },
563
+ "responses": {
564
+ "200": {
565
+ "description": "Success response",
566
+ "content": {
567
+ "application/json": {
568
+ "schema": {
569
+ "$ref": (
570
+ "#/components/schemas/execute-connector_Response"
571
+ )
572
+ }
573
+ }
574
+ },
575
+ }
576
+ },
577
+ }
578
+ }
579
+
580
+ @staticmethod
581
+ def create_operation_request(entity: str) -> Dict[str, Any]:
582
+ return {
583
+ "type": "object",
584
+ "required": [
585
+ "connectorInputPayload",
586
+ "operation",
587
+ "connectionName",
588
+ "serviceName",
589
+ "host",
590
+ "entity",
591
+ ],
592
+ "properties": {
593
+ "connectorInputPayload": {
594
+ "$ref": f"#/components/schemas/connectorInputPayload_{entity}"
595
+ },
596
+ "operation": {"$ref": "#/components/schemas/operation"},
597
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
598
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
599
+ "host": {"$ref": "#/components/schemas/host"},
600
+ "entity": {"$ref": "#/components/schemas/entity"},
601
+ },
602
+ }
603
+
604
+ @staticmethod
605
+ def update_operation_request(entity: str) -> Dict[str, Any]:
606
+ return {
607
+ "type": "object",
608
+ "required": [
609
+ "connectorInputPayload",
610
+ "entityId",
611
+ "operation",
612
+ "connectionName",
613
+ "serviceName",
614
+ "host",
615
+ "entity",
616
+ ],
617
+ "properties": {
618
+ "connectorInputPayload": {
619
+ "$ref": f"#/components/schemas/connectorInputPayload_{entity}"
620
+ },
621
+ "entityId": {"$ref": "#/components/schemas/entityId"},
622
+ "operation": {"$ref": "#/components/schemas/operation"},
623
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
624
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
625
+ "host": {"$ref": "#/components/schemas/host"},
626
+ "entity": {"$ref": "#/components/schemas/entity"},
627
+ },
628
+ }
629
+
630
+ @staticmethod
631
+ def get_operation_request() -> Dict[str, Any]:
632
+ return {
633
+ "type": "object",
634
+ "required": [
635
+ "entityId",
636
+ "operation",
637
+ "connectionName",
638
+ "serviceName",
639
+ "host",
640
+ "entity",
641
+ ],
642
+ "properties": {
643
+ "entityId": {"$ref": "#/components/schemas/entityId"},
644
+ "operation": {"$ref": "#/components/schemas/operation"},
645
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
646
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
647
+ "host": {"$ref": "#/components/schemas/host"},
648
+ "entity": {"$ref": "#/components/schemas/entity"},
649
+ },
650
+ }
651
+
652
+ @staticmethod
653
+ def delete_operation_request() -> Dict[str, Any]:
654
+ return {
655
+ "type": "object",
656
+ "required": [
657
+ "entityId",
658
+ "operation",
659
+ "connectionName",
660
+ "serviceName",
661
+ "host",
662
+ "entity",
663
+ ],
664
+ "properties": {
665
+ "entityId": {"$ref": "#/components/schemas/entityId"},
666
+ "operation": {"$ref": "#/components/schemas/operation"},
667
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
668
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
669
+ "host": {"$ref": "#/components/schemas/host"},
670
+ "entity": {"$ref": "#/components/schemas/entity"},
671
+ },
672
+ }
673
+
674
+ @staticmethod
675
+ def list_operation_request() -> Dict[str, Any]:
676
+ return {
677
+ "type": "object",
678
+ "required": [
679
+ "operation",
680
+ "connectionName",
681
+ "serviceName",
682
+ "host",
683
+ "entity",
684
+ ],
685
+ "properties": {
686
+ "filterClause": {"$ref": "#/components/schemas/filterClause"},
687
+ "pageSize": {"$ref": "#/components/schemas/pageSize"},
688
+ "pageToken": {"$ref": "#/components/schemas/pageToken"},
689
+ "operation": {"$ref": "#/components/schemas/operation"},
690
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
691
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
692
+ "host": {"$ref": "#/components/schemas/host"},
693
+ "entity": {"$ref": "#/components/schemas/entity"},
694
+ },
695
+ }
696
+
697
+ @staticmethod
698
+ def action_request(action: str) -> Dict[str, Any]:
699
+ return {
700
+ "type": "object",
701
+ "required": [
702
+ "operation",
703
+ "connectionName",
704
+ "serviceName",
705
+ "host",
706
+ "action",
707
+ "connectorInputPayload",
708
+ ],
709
+ "properties": {
710
+ "operation": {"$ref": "#/components/schemas/operation"},
711
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
712
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
713
+ "host": {"$ref": "#/components/schemas/host"},
714
+ "action": {"$ref": "#/components/schemas/action"},
715
+ "connectorInputPayload": {
716
+ "$ref": f"#/components/schemas/connectorInputPayload_{action}"
717
+ },
718
+ },
719
+ }
720
+
721
+ @staticmethod
722
+ def action_response(action: str) -> Dict[str, Any]:
723
+ return {
724
+ "type": "object",
725
+ "properties": {
726
+ "connectorOutputPayload": {
727
+ "$ref": f"#/components/schemas/connectorOutputPayload_{action}"
728
+ },
729
+ },
730
+ }
731
+
732
+ @staticmethod
733
+ def execute_custom_query_request() -> Dict[str, Any]:
734
+ return {
735
+ "type": "object",
736
+ "required": [
737
+ "operation",
738
+ "connectionName",
739
+ "serviceName",
740
+ "host",
741
+ "action",
742
+ "query",
743
+ "timeout",
744
+ "pageSize",
745
+ ],
746
+ "properties": {
747
+ "operation": {"$ref": "#/components/schemas/operation"},
748
+ "connectionName": {"$ref": "#/components/schemas/connectionName"},
749
+ "serviceName": {"$ref": "#/components/schemas/serviceName"},
750
+ "host": {"$ref": "#/components/schemas/host"},
751
+ "action": {"$ref": "#/components/schemas/action"},
752
+ "query": {"$ref": "#/components/schemas/query"},
753
+ "timeout": {"$ref": "#/components/schemas/timeout"},
754
+ "pageSize": {"$ref": "#/components/schemas/pageSize"},
755
+ },
756
+ }
757
+
758
+ def connector_payload(self, json_schema: Dict[str, Any]) -> Dict[str, Any]:
759
+ return self._convert_json_schema_to_openapi_schema(json_schema)
760
+
761
+ def _convert_json_schema_to_openapi_schema(self, json_schema):
762
+ """Converts a JSON schema dictionary to an OpenAPI schema dictionary, handling variable types, properties, items, nullable, and description.
763
+
764
+ Args:
765
+ json_schema (dict): The input JSON schema dictionary.
766
+
767
+ Returns:
768
+ dict: The converted OpenAPI schema dictionary.
769
+ """
770
+ openapi_schema = {}
771
+
772
+ if "description" in json_schema:
773
+ openapi_schema["description"] = json_schema["description"]
774
+
775
+ if "type" in json_schema:
776
+ if isinstance(json_schema["type"], list):
777
+ if "null" in json_schema["type"]:
778
+ openapi_schema["nullable"] = True
779
+ other_types = [t for t in json_schema["type"] if t != "null"]
780
+ if other_types:
781
+ openapi_schema["type"] = other_types[0]
782
+ else:
783
+ openapi_schema["type"] = json_schema["type"][0]
784
+ else:
785
+ openapi_schema["type"] = json_schema["type"]
786
+
787
+ if openapi_schema.get("type") == "object" and "properties" in json_schema:
788
+ openapi_schema["properties"] = {}
789
+ for prop_name, prop_schema in json_schema["properties"].items():
790
+ openapi_schema["properties"][prop_name] = (
791
+ self._convert_json_schema_to_openapi_schema(prop_schema)
792
+ )
793
+
794
+ elif openapi_schema.get("type") == "array" and "items" in json_schema:
795
+ if isinstance(json_schema["items"], list):
796
+ openapi_schema["items"] = [
797
+ self._convert_json_schema_to_openapi_schema(item)
798
+ for item in json_schema["items"]
799
+ ]
800
+ else:
801
+ openapi_schema["items"] = self._convert_json_schema_to_openapi_schema(
802
+ json_schema["items"]
803
+ )
804
+
805
+ return openapi_schema
806
+
807
+ def _get_access_token(self) -> str:
808
+ """Gets the access token for the service account.
809
+
810
+ Returns:
811
+ The access token.
812
+ """
813
+ if self.credential_cache and not self.credential_cache.expired:
814
+ return self.credential_cache.token
815
+
816
+ if self.service_account_json:
817
+ credentials = service_account.Credentials.from_service_account_info(
818
+ json.loads(self.service_account_json),
819
+ scopes=["https://www.googleapis.com/auth/cloud-platform"],
820
+ )
821
+ else:
822
+ try:
823
+ credentials, _ = default_service_credential()
824
+ except:
825
+ credentials = None
826
+
827
+ if not credentials:
828
+ raise ValueError(
829
+ "Please provide a service account that has the required permissions"
830
+ " to access the connection."
831
+ )
832
+
833
+ credentials.refresh(Request())
834
+ self.credential_cache = credentials
835
+ return credentials.token
836
+
837
+ def _execute_api_call(self, url):
838
+ """Executes an API call to the given URL.
839
+
840
+ Args:
841
+ url (str): The URL to call.
842
+
843
+ Returns:
844
+ requests.Response: The response object from the API call.
845
+
846
+ Raises:
847
+ PermissionError: If there are credential issues.
848
+ ValueError: If there's a request error.
849
+ Exception: For any other unexpected errors.
850
+ """
851
+ try:
852
+ headers = {
853
+ "Content-Type": "application/json",
854
+ "Authorization": f"Bearer {self._get_access_token()}",
855
+ }
856
+
857
+ response = requests.get(url, headers=headers)
858
+ response.raise_for_status()
859
+ return response
860
+
861
+ except google.auth.exceptions.DefaultCredentialsError as e:
862
+ raise PermissionError(f"Credentials error: {e}") from e
863
+
864
+ except requests.exceptions.RequestException as e:
865
+ if (
866
+ "404" in str(e)
867
+ or "Not found" in str(e)
868
+ or "400" in str(e)
869
+ or "Bad request" in str(e)
870
+ ):
871
+ raise ValueError(
872
+ "Invalid request. Please check the provided"
873
+ f" values of project({self.project}), location({self.location}),"
874
+ f" connection({self.connection})."
875
+ ) from e
876
+ raise ValueError(f"Request error: {e}") from e
877
+
878
+ except Exception as e:
879
+ raise Exception(f"An unexpected error occurred: {e}") from e
880
+
881
+ def _poll_operation(self, operation_id: str) -> Dict[str, Any]:
882
+ """Polls an operation until it is done.
883
+
884
+ Args:
885
+ operation_id: The ID of the operation to poll.
886
+
887
+ Returns:
888
+ The final response of the operation.
889
+
890
+ Raises:
891
+ PermissionError: If there are credential issues.
892
+ ValueError: If there's a request error.
893
+ Exception: For any other unexpected errors.
894
+ """
895
+ operation_done: bool = False
896
+ operation_response: Dict[str, Any] = {}
897
+ while not operation_done:
898
+ get_operation_url = f"{self.connector_url}/v1/{operation_id}"
899
+ response = self._execute_api_call(get_operation_url)
900
+ operation_response = response.json()
901
+ operation_done = operation_response.get("done", False)
902
+ time.sleep(1)
903
+ return operation_response