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.
- google/adk/._version.py +0 -0
- google/adk/__init__.py +20 -0
- google/adk/agents/__init__.py +32 -0
- google/adk/agents/active_streaming_tool.py +38 -0
- google/adk/agents/base_agent.py +345 -0
- google/adk/agents/callback_context.py +112 -0
- google/adk/agents/invocation_context.py +181 -0
- google/adk/agents/langgraph_agent.py +140 -0
- google/adk/agents/live_request_queue.py +64 -0
- google/adk/agents/llm_agent.py +376 -0
- google/adk/agents/loop_agent.py +62 -0
- google/adk/agents/parallel_agent.py +96 -0
- google/adk/agents/readonly_context.py +46 -0
- google/adk/agents/remote_agent.py +50 -0
- google/adk/agents/run_config.py +87 -0
- google/adk/agents/sequential_agent.py +45 -0
- google/adk/agents/transcription_entry.py +34 -0
- google/adk/artifacts/__init__.py +23 -0
- google/adk/artifacts/base_artifact_service.py +128 -0
- google/adk/artifacts/gcs_artifact_service.py +195 -0
- google/adk/artifacts/in_memory_artifact_service.py +133 -0
- google/adk/auth/__init__.py +22 -0
- google/adk/auth/auth_credential.py +220 -0
- google/adk/auth/auth_handler.py +268 -0
- google/adk/auth/auth_preprocessor.py +116 -0
- google/adk/auth/auth_schemes.py +67 -0
- google/adk/auth/auth_tool.py +55 -0
- google/adk/cli/__init__.py +15 -0
- google/adk/cli/__main__.py +18 -0
- google/adk/cli/agent_graph.py +148 -0
- google/adk/cli/browser/adk_favicon.svg +17 -0
- google/adk/cli/browser/assets/audio-processor.js +51 -0
- google/adk/cli/browser/assets/config/runtime-config.json +3 -0
- google/adk/cli/browser/index.html +33 -0
- google/adk/cli/browser/main-SY2WYYGV.js +75 -0
- google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
- google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
- google/adk/cli/cli.py +181 -0
- google/adk/cli/cli_deploy.py +181 -0
- google/adk/cli/cli_eval.py +282 -0
- google/adk/cli/cli_tools_click.py +524 -0
- google/adk/cli/fast_api.py +784 -0
- google/adk/cli/utils/__init__.py +49 -0
- google/adk/cli/utils/envs.py +57 -0
- google/adk/cli/utils/evals.py +93 -0
- google/adk/cli/utils/logs.py +72 -0
- google/adk/code_executors/__init__.py +49 -0
- google/adk/code_executors/base_code_executor.py +97 -0
- google/adk/code_executors/code_execution_utils.py +256 -0
- google/adk/code_executors/code_executor_context.py +202 -0
- google/adk/code_executors/container_code_executor.py +196 -0
- google/adk/code_executors/unsafe_local_code_executor.py +71 -0
- google/adk/code_executors/vertex_ai_code_executor.py +234 -0
- google/adk/docs/Makefile +20 -0
- google/adk/docs/build/doctrees/google-adk.doctree +0 -0
- google/adk/docs/build/html/_sources/google-adk.rst.txt +98 -0
- google/adk/docs/build/html/_sources/index.rst.txt +7 -0
- google/adk/docs/build/html/_static/autodoc_pydantic.css +27 -0
- google/adk/docs/build/html/_static/basic.css +925 -0
- google/adk/docs/build/html/_static/debug.css +85 -0
- google/adk/docs/build/html/_static/doctools.js +156 -0
- google/adk/docs/build/html/_static/documentation_options.js +29 -0
- google/adk/docs/build/html/_static/file.png +0 -0
- google/adk/docs/build/html/_static/language_data.js +199 -0
- google/adk/docs/build/html/_static/minus.png +0 -0
- google/adk/docs/build/html/_static/plus.png +0 -0
- google/adk/docs/build/html/_static/pygments.css +274 -0
- google/adk/docs/build/html/_static/scripts/furo-extensions.js +16 -0
- google/adk/docs/build/html/_static/scripts/furo.js +19 -0
- google/adk/docs/build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
- google/adk/docs/build/html/_static/scripts/furo.js.map +1 -0
- google/adk/docs/build/html/_static/searchtools.js +620 -0
- google/adk/docs/build/html/_static/skeleton.css +312 -0
- google/adk/docs/build/html/_static/sphinx_highlight.js +170 -0
- google/adk/docs/build/html/_static/styles/furo-extensions.css +18 -0
- google/adk/docs/build/html/_static/styles/furo-extensions.css.map +1 -0
- google/adk/docs/build/html/_static/styles/furo.css +18 -0
- google/adk/docs/build/html/_static/styles/furo.css.map +1 -0
- google/adk/docs/build/html/genindex.html +861 -0
- google/adk/docs/build/html/google-adk.html +5461 -0
- google/adk/docs/build/html/index.html +567 -0
- google/adk/docs/build/html/objects.inv +0 -0
- google/adk/docs/build/html/py-modindex.html +373 -0
- google/adk/docs/build/html/search.html +333 -0
- google/adk/docs/build/html/searchindex.js +17 -0
- google/adk/docs/source/conf.py +133 -0
- google/adk/docs/source/google-adk.rst +98 -0
- google/adk/docs/source/index.rst +7 -0
- google/adk/evaluation/__init__.py +31 -0
- google/adk/evaluation/agent_evaluator.py +329 -0
- google/adk/evaluation/evaluation_constants.py +24 -0
- google/adk/evaluation/evaluation_generator.py +270 -0
- google/adk/evaluation/response_evaluator.py +135 -0
- google/adk/evaluation/trajectory_evaluator.py +184 -0
- google/adk/events/__init__.py +21 -0
- google/adk/events/event.py +130 -0
- google/adk/events/event_actions.py +55 -0
- google/adk/examples/__init__.py +28 -0
- google/adk/examples/base_example_provider.py +35 -0
- google/adk/examples/example.py +27 -0
- google/adk/examples/example_util.py +123 -0
- google/adk/examples/vertex_ai_example_store.py +104 -0
- google/adk/flows/__init__.py +14 -0
- google/adk/flows/llm_flows/__init__.py +20 -0
- google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
- google/adk/flows/llm_flows/_code_execution.py +458 -0
- google/adk/flows/llm_flows/_nl_planning.py +129 -0
- google/adk/flows/llm_flows/agent_transfer.py +132 -0
- google/adk/flows/llm_flows/audio_transcriber.py +109 -0
- google/adk/flows/llm_flows/auto_flow.py +49 -0
- google/adk/flows/llm_flows/base_llm_flow.py +559 -0
- google/adk/flows/llm_flows/basic.py +72 -0
- google/adk/flows/llm_flows/contents.py +370 -0
- google/adk/flows/llm_flows/functions.py +486 -0
- google/adk/flows/llm_flows/identity.py +47 -0
- google/adk/flows/llm_flows/instructions.py +137 -0
- google/adk/flows/llm_flows/single_flow.py +57 -0
- google/adk/memory/__init__.py +35 -0
- google/adk/memory/base_memory_service.py +74 -0
- google/adk/memory/in_memory_memory_service.py +62 -0
- google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
- google/adk/models/__init__.py +31 -0
- google/adk/models/anthropic_llm.py +243 -0
- google/adk/models/base_llm.py +87 -0
- google/adk/models/base_llm_connection.py +76 -0
- google/adk/models/gemini_llm_connection.py +200 -0
- google/adk/models/google_llm.py +331 -0
- google/adk/models/lite_llm.py +673 -0
- google/adk/models/llm_request.py +98 -0
- google/adk/models/llm_response.py +111 -0
- google/adk/models/registry.py +102 -0
- google/adk/planners/__init__.py +23 -0
- google/adk/planners/base_planner.py +66 -0
- google/adk/planners/built_in_planner.py +75 -0
- google/adk/planners/plan_re_act_planner.py +208 -0
- google/adk/runners.py +456 -0
- google/adk/sessions/__init__.py +41 -0
- google/adk/sessions/base_session_service.py +133 -0
- google/adk/sessions/database_session_service.py +522 -0
- google/adk/sessions/in_memory_session_service.py +206 -0
- google/adk/sessions/session.py +54 -0
- google/adk/sessions/state.py +71 -0
- google/adk/sessions/vertex_ai_session_service.py +356 -0
- google/adk/telemetry.py +189 -0
- google/adk/tests/__init__.py +14 -0
- google/adk/tests/integration/.env.example +10 -0
- google/adk/tests/integration/__init__.py +18 -0
- google/adk/tests/integration/conftest.py +119 -0
- google/adk/tests/integration/fixture/__init__.py +14 -0
- google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
- google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
- google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
- google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
- google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
- google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
- google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
- google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
- google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
- google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
- google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
- google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
- google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
- google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
- google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
- google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
- google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
- google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
- google/adk/tests/integration/models/__init__.py +14 -0
- google/adk/tests/integration/models/test_google_llm.py +65 -0
- google/adk/tests/integration/test_callback.py +70 -0
- google/adk/tests/integration/test_context_variable.py +67 -0
- google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
- google/adk/tests/integration/test_multi_agent.py +28 -0
- google/adk/tests/integration/test_multi_turn.py +42 -0
- google/adk/tests/integration/test_single_agent.py +23 -0
- google/adk/tests/integration/test_sub_agent.py +26 -0
- google/adk/tests/integration/test_system_instruction.py +177 -0
- google/adk/tests/integration/test_tools.py +287 -0
- google/adk/tests/integration/test_with_test_file.py +34 -0
- google/adk/tests/integration/tools/__init__.py +14 -0
- google/adk/tests/integration/utils/__init__.py +16 -0
- google/adk/tests/integration/utils/asserts.py +75 -0
- google/adk/tests/integration/utils/test_runner.py +97 -0
- google/adk/tests/unittests/__init__.py +14 -0
- google/adk/tests/unittests/agents/__init__.py +14 -0
- google/adk/tests/unittests/agents/test_base_agent.py +407 -0
- google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
- google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
- google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
- google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
- google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
- google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
- google/adk/tests/unittests/artifacts/__init__.py +14 -0
- google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
- google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
- google/adk/tests/unittests/conftest.py +73 -0
- google/adk/tests/unittests/fast_api/__init__.py +14 -0
- google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
- google/adk/tests/unittests/flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
- google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
- google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
- google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
- google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
- google/adk/tests/unittests/models/__init__.py +14 -0
- google/adk/tests/unittests/models/test_google_llm.py +224 -0
- google/adk/tests/unittests/models/test_litellm.py +804 -0
- google/adk/tests/unittests/models/test_models.py +60 -0
- google/adk/tests/unittests/sessions/__init__.py +14 -0
- google/adk/tests/unittests/sessions/test_session_service.py +227 -0
- google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
- google/adk/tests/unittests/streaming/__init__.py +14 -0
- google/adk/tests/unittests/streaming/test_streaming.py +50 -0
- google/adk/tests/unittests/tools/__init__.py +14 -0
- google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
- google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
- google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
- google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
- google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
- google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
- google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
- google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
- google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
- google/adk/tests/unittests/tools/test_base_tool.py +141 -0
- google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
- google/adk/tests/unittests/utils.py +304 -0
- google/adk/tools/__init__.py +51 -0
- google/adk/tools/_automatic_function_calling_util.py +346 -0
- google/adk/tools/agent_tool.py +176 -0
- google/adk/tools/apihub_tool/__init__.py +19 -0
- google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
- google/adk/tools/apihub_tool/clients/__init__.py +13 -0
- google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
- google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
- google/adk/tools/application_integration_tool/__init__.py +19 -0
- google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
- google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
- google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
- google/adk/tools/base_tool.py +144 -0
- google/adk/tools/built_in_code_execution_tool.py +59 -0
- google/adk/tools/crewai_tool.py +72 -0
- google/adk/tools/example_tool.py +62 -0
- google/adk/tools/exit_loop_tool.py +23 -0
- google/adk/tools/function_parameter_parse_util.py +307 -0
- google/adk/tools/function_tool.py +87 -0
- google/adk/tools/get_user_choice_tool.py +28 -0
- google/adk/tools/google_api_tool/__init__.py +14 -0
- google/adk/tools/google_api_tool/google_api_tool.py +59 -0
- google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
- google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
- google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
- google/adk/tools/google_search_tool.py +68 -0
- google/adk/tools/langchain_tool.py +86 -0
- google/adk/tools/load_artifacts_tool.py +113 -0
- google/adk/tools/load_memory_tool.py +58 -0
- google/adk/tools/load_web_page.py +41 -0
- google/adk/tools/long_running_tool.py +39 -0
- google/adk/tools/mcp_tool/__init__.py +42 -0
- google/adk/tools/mcp_tool/conversion_utils.py +161 -0
- google/adk/tools/mcp_tool/mcp_tool.py +113 -0
- google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
- google/adk/tools/openapi_tool/__init__.py +21 -0
- google/adk/tools/openapi_tool/auth/__init__.py +19 -0
- google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
- google/adk/tools/openapi_tool/common/__init__.py +19 -0
- google/adk/tools/openapi_tool/common/common.py +300 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
- google/adk/tools/preload_memory_tool.py +72 -0
- google/adk/tools/retrieval/__init__.py +36 -0
- google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
- google/adk/tools/retrieval/files_retrieval.py +33 -0
- google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
- google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
- google/adk/tools/tool_context.py +90 -0
- google/adk/tools/toolbox_tool.py +46 -0
- google/adk/tools/transfer_to_agent_tool.py +21 -0
- google/adk/tools/vertex_ai_search_tool.py +96 -0
- google/adk/version.py +16 -0
- google_adk-0.0.3.dist-info/METADATA +73 -0
- google_adk-0.0.3.dist-info/RECORD +340 -0
- {google_adk-0.0.1.dist-info → google_adk-0.0.3.dist-info}/WHEEL +1 -2
- google_adk-0.0.3.dist-info/entry_points.txt +3 -0
- agent_kit/__init__.py +0 -0
- google_adk-0.0.1.dist-info/LICENSE.txt +0 -170
- google_adk-0.0.1.dist-info/METADATA +0 -15
- google_adk-0.0.1.dist-info/RECORD +0 -6
- 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
|