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