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,307 @@
|
|
1
|
+
# Copyright 2024 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
#
|
15
|
+
|
16
|
+
import inspect
|
17
|
+
import logging
|
18
|
+
import types as typing_types
|
19
|
+
from typing import _GenericAlias
|
20
|
+
from typing import Any
|
21
|
+
from typing import get_args
|
22
|
+
from typing import get_origin
|
23
|
+
from typing import Literal
|
24
|
+
from typing import Union
|
25
|
+
|
26
|
+
from google.genai import types
|
27
|
+
import pydantic
|
28
|
+
|
29
|
+
_py_builtin_type_to_schema_type = {
|
30
|
+
str: types.Type.STRING,
|
31
|
+
int: types.Type.INTEGER,
|
32
|
+
float: types.Type.NUMBER,
|
33
|
+
bool: types.Type.BOOLEAN,
|
34
|
+
list: types.Type.ARRAY,
|
35
|
+
dict: types.Type.OBJECT,
|
36
|
+
}
|
37
|
+
|
38
|
+
logger = logging.getLogger(__name__)
|
39
|
+
|
40
|
+
|
41
|
+
def _is_builtin_primitive_or_compound(
|
42
|
+
annotation: inspect.Parameter.annotation,
|
43
|
+
) -> bool:
|
44
|
+
return annotation in _py_builtin_type_to_schema_type.keys()
|
45
|
+
|
46
|
+
|
47
|
+
def _raise_for_any_of_if_mldev(schema: types.Schema):
|
48
|
+
if schema.any_of:
|
49
|
+
raise ValueError(
|
50
|
+
'AnyOf is not supported in function declaration schema for Google AI.'
|
51
|
+
)
|
52
|
+
|
53
|
+
|
54
|
+
def _update_for_default_if_mldev(schema: types.Schema):
|
55
|
+
if schema.default is not None:
|
56
|
+
# TODO(kech): Remove this walkaround once mldev supports default value.
|
57
|
+
schema.default = None
|
58
|
+
logger.warning(
|
59
|
+
'Default value is not supported in function declaration schema for'
|
60
|
+
' Google AI.'
|
61
|
+
)
|
62
|
+
|
63
|
+
|
64
|
+
def _raise_if_schema_unsupported(variant: str, schema: types.Schema):
|
65
|
+
if not variant == 'VERTEX_AI':
|
66
|
+
_raise_for_any_of_if_mldev(schema)
|
67
|
+
_update_for_default_if_mldev(schema)
|
68
|
+
|
69
|
+
|
70
|
+
def _is_default_value_compatible(
|
71
|
+
default_value: Any, annotation: inspect.Parameter.annotation
|
72
|
+
) -> bool:
|
73
|
+
# None type is expected to be handled external to this function
|
74
|
+
if _is_builtin_primitive_or_compound(annotation):
|
75
|
+
return isinstance(default_value, annotation)
|
76
|
+
|
77
|
+
if (
|
78
|
+
isinstance(annotation, _GenericAlias)
|
79
|
+
or isinstance(annotation, typing_types.GenericAlias)
|
80
|
+
or isinstance(annotation, typing_types.UnionType)
|
81
|
+
):
|
82
|
+
origin = get_origin(annotation)
|
83
|
+
if origin in (Union, typing_types.UnionType):
|
84
|
+
return any(
|
85
|
+
_is_default_value_compatible(default_value, arg)
|
86
|
+
for arg in get_args(annotation)
|
87
|
+
)
|
88
|
+
|
89
|
+
if origin is dict:
|
90
|
+
return isinstance(default_value, dict)
|
91
|
+
|
92
|
+
if origin is list:
|
93
|
+
if not isinstance(default_value, list):
|
94
|
+
return False
|
95
|
+
# most tricky case, element in list is union type
|
96
|
+
# need to apply any logic within all
|
97
|
+
# see test case test_generic_alias_complex_array_with_default_value
|
98
|
+
# a: typing.List[int | str | float | bool]
|
99
|
+
# default_value: [1, 'a', 1.1, True]
|
100
|
+
return all(
|
101
|
+
any(
|
102
|
+
_is_default_value_compatible(item, arg)
|
103
|
+
for arg in get_args(annotation)
|
104
|
+
)
|
105
|
+
for item in default_value
|
106
|
+
)
|
107
|
+
|
108
|
+
if origin is Literal:
|
109
|
+
return default_value in get_args(annotation)
|
110
|
+
|
111
|
+
# return False for any other unrecognized annotation
|
112
|
+
# let caller handle the raise
|
113
|
+
return False
|
114
|
+
|
115
|
+
|
116
|
+
def _parse_schema_from_parameter(
|
117
|
+
variant: str, param: inspect.Parameter, func_name: str
|
118
|
+
) -> types.Schema:
|
119
|
+
"""parse schema from parameter.
|
120
|
+
|
121
|
+
from the simplest case to the most complex case.
|
122
|
+
"""
|
123
|
+
schema = types.Schema()
|
124
|
+
default_value_error_msg = (
|
125
|
+
f'Default value {param.default} of parameter {param} of function'
|
126
|
+
f' {func_name} is not compatible with the parameter annotation'
|
127
|
+
f' {param.annotation}.'
|
128
|
+
)
|
129
|
+
if _is_builtin_primitive_or_compound(param.annotation):
|
130
|
+
if param.default is not inspect.Parameter.empty:
|
131
|
+
if not _is_default_value_compatible(param.default, param.annotation):
|
132
|
+
raise ValueError(default_value_error_msg)
|
133
|
+
schema.default = param.default
|
134
|
+
schema.type = _py_builtin_type_to_schema_type[param.annotation]
|
135
|
+
_raise_if_schema_unsupported(variant, schema)
|
136
|
+
return schema
|
137
|
+
if (
|
138
|
+
get_origin(param.annotation) is Union
|
139
|
+
# only parse simple UnionType, example int | str | float | bool
|
140
|
+
# complex types.UnionType will be invoked in raise branch
|
141
|
+
and all(
|
142
|
+
(_is_builtin_primitive_or_compound(arg) or arg is type(None))
|
143
|
+
for arg in get_args(param.annotation)
|
144
|
+
)
|
145
|
+
):
|
146
|
+
schema.type = types.Type.OBJECT
|
147
|
+
schema.any_of = []
|
148
|
+
unique_types = set()
|
149
|
+
for arg in get_args(param.annotation):
|
150
|
+
if arg.__name__ == 'NoneType': # Optional type
|
151
|
+
schema.nullable = True
|
152
|
+
continue
|
153
|
+
schema_in_any_of = _parse_schema_from_parameter(
|
154
|
+
variant,
|
155
|
+
inspect.Parameter(
|
156
|
+
'item', inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=arg
|
157
|
+
),
|
158
|
+
func_name,
|
159
|
+
)
|
160
|
+
if (
|
161
|
+
schema_in_any_of.model_dump_json(exclude_none=True)
|
162
|
+
not in unique_types
|
163
|
+
):
|
164
|
+
schema.any_of.append(schema_in_any_of)
|
165
|
+
unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True))
|
166
|
+
if len(schema.any_of) == 1: # param: list | None -> Array
|
167
|
+
schema.type = schema.any_of[0].type
|
168
|
+
schema.any_of = None
|
169
|
+
if (
|
170
|
+
param.default is not inspect.Parameter.empty
|
171
|
+
and param.default is not None
|
172
|
+
):
|
173
|
+
if not _is_default_value_compatible(param.default, param.annotation):
|
174
|
+
raise ValueError(default_value_error_msg)
|
175
|
+
schema.default = param.default
|
176
|
+
_raise_if_schema_unsupported(variant, schema)
|
177
|
+
return schema
|
178
|
+
if isinstance(param.annotation, _GenericAlias) or isinstance(
|
179
|
+
param.annotation, typing_types.GenericAlias
|
180
|
+
):
|
181
|
+
origin = get_origin(param.annotation)
|
182
|
+
args = get_args(param.annotation)
|
183
|
+
if origin is dict:
|
184
|
+
schema.type = types.Type.OBJECT
|
185
|
+
if param.default is not inspect.Parameter.empty:
|
186
|
+
if not _is_default_value_compatible(param.default, param.annotation):
|
187
|
+
raise ValueError(default_value_error_msg)
|
188
|
+
schema.default = param.default
|
189
|
+
_raise_if_schema_unsupported(variant, schema)
|
190
|
+
return schema
|
191
|
+
if origin is Literal:
|
192
|
+
if not all(isinstance(arg, str) for arg in args):
|
193
|
+
raise ValueError(
|
194
|
+
f'Literal type {param.annotation} must be a list of strings.'
|
195
|
+
)
|
196
|
+
schema.type = types.Type.STRING
|
197
|
+
schema.enum = list(args)
|
198
|
+
if param.default is not inspect.Parameter.empty:
|
199
|
+
if not _is_default_value_compatible(param.default, param.annotation):
|
200
|
+
raise ValueError(default_value_error_msg)
|
201
|
+
schema.default = param.default
|
202
|
+
_raise_if_schema_unsupported(variant, schema)
|
203
|
+
return schema
|
204
|
+
if origin is list:
|
205
|
+
schema.type = types.Type.ARRAY
|
206
|
+
schema.items = _parse_schema_from_parameter(
|
207
|
+
variant,
|
208
|
+
inspect.Parameter(
|
209
|
+
'item',
|
210
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
211
|
+
annotation=args[0],
|
212
|
+
),
|
213
|
+
func_name,
|
214
|
+
)
|
215
|
+
if param.default is not inspect.Parameter.empty:
|
216
|
+
if not _is_default_value_compatible(param.default, param.annotation):
|
217
|
+
raise ValueError(default_value_error_msg)
|
218
|
+
schema.default = param.default
|
219
|
+
_raise_if_schema_unsupported(variant, schema)
|
220
|
+
return schema
|
221
|
+
if origin is Union:
|
222
|
+
schema.any_of = []
|
223
|
+
schema.type = types.Type.OBJECT
|
224
|
+
unique_types = set()
|
225
|
+
for arg in args:
|
226
|
+
if arg.__name__ == 'NoneType': # Optional type
|
227
|
+
schema.nullable = True
|
228
|
+
continue
|
229
|
+
schema_in_any_of = _parse_schema_from_parameter(
|
230
|
+
variant,
|
231
|
+
inspect.Parameter(
|
232
|
+
'item',
|
233
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
234
|
+
annotation=arg,
|
235
|
+
),
|
236
|
+
func_name,
|
237
|
+
)
|
238
|
+
if (
|
239
|
+
len(param.annotation.__args__) == 2
|
240
|
+
and type(None) in param.annotation.__args__
|
241
|
+
): # Optional type
|
242
|
+
for optional_arg in param.annotation.__args__:
|
243
|
+
if (
|
244
|
+
hasattr(optional_arg, '__origin__')
|
245
|
+
and optional_arg.__origin__ is list
|
246
|
+
):
|
247
|
+
# Optional type with list, for example Optional[list[str]]
|
248
|
+
schema.items = schema_in_any_of.items
|
249
|
+
if (
|
250
|
+
schema_in_any_of.model_dump_json(exclude_none=True)
|
251
|
+
not in unique_types
|
252
|
+
):
|
253
|
+
schema.any_of.append(schema_in_any_of)
|
254
|
+
unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True))
|
255
|
+
if len(schema.any_of) == 1: # param: Union[List, None] -> Array
|
256
|
+
schema.type = schema.any_of[0].type
|
257
|
+
schema.any_of = None
|
258
|
+
if (
|
259
|
+
param.default is not None
|
260
|
+
and param.default is not inspect.Parameter.empty
|
261
|
+
):
|
262
|
+
if not _is_default_value_compatible(param.default, param.annotation):
|
263
|
+
raise ValueError(default_value_error_msg)
|
264
|
+
schema.default = param.default
|
265
|
+
_raise_if_schema_unsupported(variant, schema)
|
266
|
+
return schema
|
267
|
+
# all other generic alias will be invoked in raise branch
|
268
|
+
if (
|
269
|
+
inspect.isclass(param.annotation)
|
270
|
+
# for user defined class, we only support pydantic model
|
271
|
+
and issubclass(param.annotation, pydantic.BaseModel)
|
272
|
+
):
|
273
|
+
if (
|
274
|
+
param.default is not inspect.Parameter.empty
|
275
|
+
and param.default is not None
|
276
|
+
):
|
277
|
+
schema.default = param.default
|
278
|
+
schema.type = types.Type.OBJECT
|
279
|
+
schema.properties = {}
|
280
|
+
for field_name, field_info in param.annotation.model_fields.items():
|
281
|
+
schema.properties[field_name] = _parse_schema_from_parameter(
|
282
|
+
variant,
|
283
|
+
inspect.Parameter(
|
284
|
+
field_name,
|
285
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
286
|
+
annotation=field_info.annotation,
|
287
|
+
),
|
288
|
+
func_name,
|
289
|
+
)
|
290
|
+
_raise_if_schema_unsupported(variant, schema)
|
291
|
+
return schema
|
292
|
+
raise ValueError(
|
293
|
+
f'Failed to parse the parameter {param} of function {func_name} for'
|
294
|
+
' automatic function calling.Automatic function calling works best with'
|
295
|
+
' simpler function signature schema,consider manually parse your'
|
296
|
+
f' function declaration for function {func_name}.'
|
297
|
+
)
|
298
|
+
|
299
|
+
|
300
|
+
def _get_required_fields(schema: types.Schema) -> list[str]:
|
301
|
+
if not schema.properties:
|
302
|
+
return
|
303
|
+
return [
|
304
|
+
field_name
|
305
|
+
for field_name, field_schema in schema.properties.items()
|
306
|
+
if not field_schema.nullable and field_schema.default is None
|
307
|
+
]
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
import inspect
|
16
|
+
from typing import Any
|
17
|
+
from typing import Callable
|
18
|
+
from typing import Optional
|
19
|
+
|
20
|
+
from google.genai import types
|
21
|
+
from typing_extensions import override
|
22
|
+
|
23
|
+
from ._automatic_function_calling_util import build_function_declaration
|
24
|
+
from .base_tool import BaseTool
|
25
|
+
from .tool_context import ToolContext
|
26
|
+
|
27
|
+
|
28
|
+
class FunctionTool(BaseTool):
|
29
|
+
"""A tool that wraps a user-defined Python function.
|
30
|
+
|
31
|
+
Attributes:
|
32
|
+
func: The function to wrap.
|
33
|
+
"""
|
34
|
+
|
35
|
+
def __init__(self, func: Callable[..., Any]):
|
36
|
+
super().__init__(name=func.__name__, description=func.__doc__)
|
37
|
+
self.func = func
|
38
|
+
|
39
|
+
@override
|
40
|
+
def _get_declaration(self) -> Optional[types.FunctionDeclaration]:
|
41
|
+
function_decl = types.FunctionDeclaration.model_validate(
|
42
|
+
build_function_declaration(
|
43
|
+
func=self.func,
|
44
|
+
# The model doesn't understand the function context.
|
45
|
+
# input_stream is for streaming tool
|
46
|
+
ignore_params=['tool_context', 'input_stream'],
|
47
|
+
variant=self._api_variant,
|
48
|
+
)
|
49
|
+
)
|
50
|
+
|
51
|
+
return function_decl
|
52
|
+
|
53
|
+
@override
|
54
|
+
async def run_async(
|
55
|
+
self, *, args: dict[str, Any], tool_context: ToolContext
|
56
|
+
) -> Any:
|
57
|
+
args_to_call = args.copy()
|
58
|
+
signature = inspect.signature(self.func)
|
59
|
+
if 'tool_context' in signature.parameters:
|
60
|
+
args_to_call['tool_context'] = tool_context
|
61
|
+
|
62
|
+
if inspect.iscoroutinefunction(self.func):
|
63
|
+
return await self.func(**args_to_call) or {}
|
64
|
+
else:
|
65
|
+
return self.func(**args_to_call) or {}
|
66
|
+
|
67
|
+
# TODO(hangfei): fix call live for function stream.
|
68
|
+
async def _call_live(
|
69
|
+
self,
|
70
|
+
*,
|
71
|
+
args: dict[str, Any],
|
72
|
+
tool_context: ToolContext,
|
73
|
+
invocation_context,
|
74
|
+
) -> Any:
|
75
|
+
args_to_call = args.copy()
|
76
|
+
signature = inspect.signature(self.func)
|
77
|
+
if (
|
78
|
+
self.name in invocation_context.active_streaming_tools
|
79
|
+
and invocation_context.active_streaming_tools[self.name].stream
|
80
|
+
):
|
81
|
+
args_to_call['input_stream'] = invocation_context.active_streaming_tools[
|
82
|
+
self.name
|
83
|
+
].stream
|
84
|
+
if 'tool_context' in signature.parameters:
|
85
|
+
args_to_call['tool_context'] = tool_context
|
86
|
+
async for item in self.func(**args_to_call):
|
87
|
+
yield item
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from typing import Optional
|
16
|
+
from .long_running_tool import LongRunningFunctionTool
|
17
|
+
from .tool_context import ToolContext
|
18
|
+
|
19
|
+
|
20
|
+
def get_user_choice(
|
21
|
+
options: list[str], tool_context: ToolContext
|
22
|
+
) -> Optional[str]:
|
23
|
+
"""Provides the options to the user and asks them to choose one."""
|
24
|
+
tool_context.actions.skip_summarization = True
|
25
|
+
return None
|
26
|
+
|
27
|
+
|
28
|
+
get_user_choice_tool = LongRunningFunctionTool(func=get_user_choice)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
from .google_api_tool_sets import calendar_tool_set
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from typing import Any
|
16
|
+
from typing import Dict
|
17
|
+
from typing import Optional
|
18
|
+
|
19
|
+
from google.genai.types import FunctionDeclaration
|
20
|
+
from typing_extensions import override
|
21
|
+
|
22
|
+
from ...auth import AuthCredential
|
23
|
+
from ...auth import AuthCredentialTypes
|
24
|
+
from ...auth import OAuth2Auth
|
25
|
+
from .. import BaseTool
|
26
|
+
from ..openapi_tool import RestApiTool
|
27
|
+
from ..tool_context import ToolContext
|
28
|
+
|
29
|
+
|
30
|
+
class GoogleApiTool(BaseTool):
|
31
|
+
|
32
|
+
def __init__(self, rest_api_tool: RestApiTool):
|
33
|
+
super().__init__(
|
34
|
+
name=rest_api_tool.name,
|
35
|
+
description=rest_api_tool.description,
|
36
|
+
is_long_running=rest_api_tool.is_long_running,
|
37
|
+
)
|
38
|
+
self.rest_api_tool = rest_api_tool
|
39
|
+
|
40
|
+
@override
|
41
|
+
def _get_declaration(self) -> FunctionDeclaration:
|
42
|
+
return self.rest_api_tool._get_declaration()
|
43
|
+
|
44
|
+
@override
|
45
|
+
async def run_async(
|
46
|
+
self, *, args: dict[str, Any], tool_context: Optional[ToolContext]
|
47
|
+
) -> Dict[str, Any]:
|
48
|
+
return await self.rest_api_tool.run_async(
|
49
|
+
args=args, tool_context=tool_context
|
50
|
+
)
|
51
|
+
|
52
|
+
def configure_auth(self, client_id: str, client_secret: str):
|
53
|
+
self.rest_api_tool.auth_credential = AuthCredential(
|
54
|
+
auth_type=AuthCredentialTypes.OPEN_ID_CONNECT,
|
55
|
+
oauth2=OAuth2Auth(
|
56
|
+
client_id=client_id,
|
57
|
+
client_secret=client_secret,
|
58
|
+
),
|
59
|
+
)
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
import inspect
|
15
|
+
import os
|
16
|
+
from typing import Any
|
17
|
+
from typing import Dict
|
18
|
+
from typing import Final
|
19
|
+
from typing import List
|
20
|
+
from typing import Optional
|
21
|
+
from typing import Type
|
22
|
+
|
23
|
+
from ...auth import OpenIdConnectWithConfig
|
24
|
+
from ..openapi_tool import OpenAPIToolset
|
25
|
+
from ..openapi_tool import RestApiTool
|
26
|
+
from .google_api_tool import GoogleApiTool
|
27
|
+
from .googleapi_to_openapi_converter import GoogleApiToOpenApiConverter
|
28
|
+
|
29
|
+
|
30
|
+
class GoogleApiToolSet:
|
31
|
+
|
32
|
+
def __init__(self, tools: List[RestApiTool]):
|
33
|
+
self.tools: Final[List[GoogleApiTool]] = [
|
34
|
+
GoogleApiTool(tool) for tool in tools
|
35
|
+
]
|
36
|
+
|
37
|
+
def get_tools(self) -> List[GoogleApiTool]:
|
38
|
+
"""Get all tools in the toolset."""
|
39
|
+
return self.tools
|
40
|
+
|
41
|
+
def get_tool(self, tool_name: str) -> Optional[GoogleApiTool]:
|
42
|
+
"""Get a tool by name."""
|
43
|
+
matching_tool = filter(lambda t: t.name == tool_name, self.tools)
|
44
|
+
return next(matching_tool, None)
|
45
|
+
|
46
|
+
@staticmethod
|
47
|
+
def _load_tool_set_with_oidc_auth(
|
48
|
+
spec_file: str = None,
|
49
|
+
spec_dict: Dict[str, Any] = None,
|
50
|
+
scopes: list[str] = None,
|
51
|
+
) -> Optional[OpenAPIToolset]:
|
52
|
+
spec_str = None
|
53
|
+
if spec_file:
|
54
|
+
# Get the frame of the caller
|
55
|
+
caller_frame = inspect.stack()[1]
|
56
|
+
# Get the filename of the caller
|
57
|
+
caller_filename = caller_frame.filename
|
58
|
+
# Get the directory of the caller
|
59
|
+
caller_dir = os.path.dirname(os.path.abspath(caller_filename))
|
60
|
+
# Join the directory path with the filename
|
61
|
+
yaml_path = os.path.join(caller_dir, spec_file)
|
62
|
+
with open(yaml_path, 'r', encoding='utf-8') as file:
|
63
|
+
spec_str = file.read()
|
64
|
+
tool_set = OpenAPIToolset(
|
65
|
+
spec_dict=spec_dict,
|
66
|
+
spec_str=spec_str,
|
67
|
+
spec_str_type='yaml',
|
68
|
+
auth_scheme=OpenIdConnectWithConfig(
|
69
|
+
authorization_endpoint=(
|
70
|
+
'https://accounts.google.com/o/oauth2/v2/auth'
|
71
|
+
),
|
72
|
+
token_endpoint='https://oauth2.googleapis.com/token',
|
73
|
+
userinfo_endpoint=(
|
74
|
+
'https://openidconnect.googleapis.com/v1/userinfo'
|
75
|
+
),
|
76
|
+
revocation_endpoint='https://oauth2.googleapis.com/revoke',
|
77
|
+
token_endpoint_auth_methods_supported=[
|
78
|
+
'client_secret_post',
|
79
|
+
'client_secret_basic',
|
80
|
+
],
|
81
|
+
grant_types_supported=['authorization_code'],
|
82
|
+
scopes=scopes,
|
83
|
+
),
|
84
|
+
)
|
85
|
+
return tool_set
|
86
|
+
|
87
|
+
def configure_auth(self, client_id: str, client_secret: str):
|
88
|
+
for tool in self.tools:
|
89
|
+
tool.configure_auth(client_id, client_secret)
|
90
|
+
|
91
|
+
@classmethod
|
92
|
+
def load_tool_set(
|
93
|
+
cl: Type['GoogleApiToolSet'],
|
94
|
+
api_name: str,
|
95
|
+
api_version: str,
|
96
|
+
) -> 'GoogleApiToolSet':
|
97
|
+
spec_dict = GoogleApiToOpenApiConverter(api_name, api_version).convert()
|
98
|
+
scope = list(
|
99
|
+
spec_dict['components']['securitySchemes']['oauth2']['flows'][
|
100
|
+
'authorizationCode'
|
101
|
+
]['scopes'].keys()
|
102
|
+
)[0]
|
103
|
+
return cl(
|
104
|
+
cl._load_tool_set_with_oidc_auth(
|
105
|
+
spec_dict=spec_dict, scopes=[scope]
|
106
|
+
).get_tools()
|
107
|
+
)
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
import logging
|
17
|
+
|
18
|
+
from .google_api_tool_set import GoogleApiToolSet
|
19
|
+
|
20
|
+
logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
calendar_tool_set = GoogleApiToolSet.load_tool_set(
|
23
|
+
api_name="calendar",
|
24
|
+
api_version="v3",
|
25
|
+
)
|
26
|
+
|
27
|
+
bigquery_tool_set = GoogleApiToolSet.load_tool_set(
|
28
|
+
api_name="bigquery",
|
29
|
+
api_version="v2",
|
30
|
+
)
|
31
|
+
|
32
|
+
gmail_tool_set = GoogleApiToolSet.load_tool_set(
|
33
|
+
api_name="gmail",
|
34
|
+
api_version="v1",
|
35
|
+
)
|
36
|
+
|
37
|
+
youtube_tool_set = GoogleApiToolSet.load_tool_set(
|
38
|
+
api_name="youtube",
|
39
|
+
api_version="v3",
|
40
|
+
)
|
41
|
+
|
42
|
+
slides_tool_set = GoogleApiToolSet.load_tool_set(
|
43
|
+
api_name="slides",
|
44
|
+
api_version="v1",
|
45
|
+
)
|
46
|
+
|
47
|
+
sheets_tool_set = GoogleApiToolSet.load_tool_set(
|
48
|
+
api_name="sheets",
|
49
|
+
api_version="v4",
|
50
|
+
)
|
51
|
+
|
52
|
+
docs_tool_set = GoogleApiToolSet.load_tool_set(
|
53
|
+
api_name="docs",
|
54
|
+
api_version="v1",
|
55
|
+
)
|