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
google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"query": "Turn off device_2 in the Bedroom.",
|
4
|
+
"expected_tool_use": [{
|
5
|
+
"tool_name": "set_device_info",
|
6
|
+
"tool_input": {"location": "Bedroom", "status": "OFF", "device_id": "device_2"}
|
7
|
+
}],
|
8
|
+
"reference": "I have set the device 2 status to off."
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"query": "What's the status of device_2 in the Bedroom?",
|
12
|
+
"expected_tool_use": [{
|
13
|
+
"tool_name": "get_device_info",
|
14
|
+
"tool_input": {"device_id": "device_2"}
|
15
|
+
}],
|
16
|
+
"reference": "Status of device_2 is off."
|
17
|
+
}
|
18
|
+
]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"query": "Turn off device_2 in the Bedroom.",
|
4
|
+
"expected_tool_use": [
|
5
|
+
{
|
6
|
+
"tool_name": "set_device_info",
|
7
|
+
"tool_input": {"location": "Bedroom", "device_id": "device_2", "status": "OFF"}
|
8
|
+
}
|
9
|
+
],
|
10
|
+
"reference": "OK. I've turned off device_2 in the Bedroom. Anything else?\n"
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"query": "What's the command I just issued?",
|
14
|
+
"expected_tool_use": [],
|
15
|
+
"reference": "You asked me to turn off device_2 in the Bedroom.\n"
|
16
|
+
}
|
17
|
+
]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"query": "Turn off device_2 in the Bedroom.",
|
4
|
+
"expected_tool_use": [{
|
5
|
+
"tool_name": "set_device_info",
|
6
|
+
"tool_input": {"location": "Bedroom", "device_id": "device_2", "status": "OFF"}
|
7
|
+
}],
|
8
|
+
"reference": "I have set the device 2 status to off."
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"query": "Turn on device_2 in the Bedroom.",
|
12
|
+
"expected_tool_use": [{
|
13
|
+
"tool_name": "set_device_info",
|
14
|
+
"tool_input": {"location": "Bedroom", "status": "ON", "device_id": "device_2"}
|
15
|
+
}],
|
16
|
+
"reference": "I have set the device 2 status to on."
|
17
|
+
}
|
18
|
+
]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"query": "Turn off device_2 in the Bedroom.",
|
4
|
+
"expected_tool_use": [
|
5
|
+
{
|
6
|
+
"tool_name": "set_device_info",
|
7
|
+
"tool_input": {"location": "Bedroom", "device_id": "device_2", "status": "OFF"}
|
8
|
+
}
|
9
|
+
],
|
10
|
+
"reference": "OK. I've turned off device_2 in the Bedroom. Anything else?\n"
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"query": "What's the command I just issued?",
|
14
|
+
"expected_tool_use": [],
|
15
|
+
"reference": "You asked me to turn off device_2 in the Bedroom.\n"
|
16
|
+
}
|
17
|
+
]
|
@@ -0,0 +1,15 @@
|
|
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 . import agent
|
@@ -0,0 +1,218 @@
|
|
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 os
|
16
|
+
from typing import Any
|
17
|
+
|
18
|
+
from crewai_tools import DirectoryReadTool
|
19
|
+
from google.adk import Agent
|
20
|
+
from google.adk.tools.agent_tool import AgentTool
|
21
|
+
from google.adk.tools.crewai_tool import CrewaiTool
|
22
|
+
from google.adk.tools.langchain_tool import LangchainTool
|
23
|
+
from google.adk.tools.retrieval.files_retrieval import FilesRetrieval
|
24
|
+
from google.adk.tools.retrieval.vertex_ai_rag_retrieval import VertexAiRagRetrieval
|
25
|
+
from langchain_community.tools import ShellTool
|
26
|
+
from pydantic import BaseModel
|
27
|
+
|
28
|
+
|
29
|
+
class TestCase(BaseModel):
|
30
|
+
case: str
|
31
|
+
|
32
|
+
|
33
|
+
class Test(BaseModel):
|
34
|
+
test_title: list[str]
|
35
|
+
|
36
|
+
|
37
|
+
def simple_function(param: str) -> str:
|
38
|
+
if isinstance(param, str):
|
39
|
+
return "Called simple function successfully"
|
40
|
+
return "Called simple function with wrong param type"
|
41
|
+
|
42
|
+
|
43
|
+
def no_param_function() -> str:
|
44
|
+
return "Called no param function successfully"
|
45
|
+
|
46
|
+
|
47
|
+
def no_output_function(param: str):
|
48
|
+
return
|
49
|
+
|
50
|
+
|
51
|
+
def multiple_param_types_function(
|
52
|
+
param1: str, param2: int, param3: float, param4: bool
|
53
|
+
) -> str:
|
54
|
+
if (
|
55
|
+
isinstance(param1, str)
|
56
|
+
and isinstance(param2, int)
|
57
|
+
and isinstance(param3, float)
|
58
|
+
and isinstance(param4, bool)
|
59
|
+
):
|
60
|
+
return "Called multiple param types function successfully"
|
61
|
+
return "Called multiple param types function with wrong param types"
|
62
|
+
|
63
|
+
|
64
|
+
def throw_error_function(param: str) -> str:
|
65
|
+
raise ValueError("Error thrown by throw_error_function")
|
66
|
+
|
67
|
+
|
68
|
+
def list_str_param_function(param: list[str]) -> str:
|
69
|
+
if isinstance(param, list) and all(isinstance(item, str) for item in param):
|
70
|
+
return "Called list str param function successfully"
|
71
|
+
return "Called list str param function with wrong param type"
|
72
|
+
|
73
|
+
|
74
|
+
def return_list_str_function(param: str) -> list[str]:
|
75
|
+
return ["Called return list str function successfully"]
|
76
|
+
|
77
|
+
|
78
|
+
def complex_function_list_dict(
|
79
|
+
param1: dict[str, Any], param2: list[dict[str, Any]]
|
80
|
+
) -> list[Test]:
|
81
|
+
if (
|
82
|
+
isinstance(param1, dict)
|
83
|
+
and isinstance(param2, list)
|
84
|
+
and all(isinstance(item, dict) for item in param2)
|
85
|
+
):
|
86
|
+
return [
|
87
|
+
Test(test_title=["function test 1", "function test 2"]),
|
88
|
+
Test(test_title=["retrieval test"]),
|
89
|
+
]
|
90
|
+
raise ValueError("Wrong param")
|
91
|
+
|
92
|
+
|
93
|
+
def repetive_call_1(param: str):
|
94
|
+
return f"Call repetive_call_2 tool with param {param + '_repetive'}"
|
95
|
+
|
96
|
+
|
97
|
+
def repetive_call_2(param: str):
|
98
|
+
return param
|
99
|
+
|
100
|
+
|
101
|
+
test_case_retrieval = FilesRetrieval(
|
102
|
+
name="test_case_retrieval",
|
103
|
+
description="General guidence for agent test cases",
|
104
|
+
input_dir=os.path.join(os.path.dirname(__file__), "files"),
|
105
|
+
)
|
106
|
+
|
107
|
+
valid_rag_retrieval = VertexAiRagRetrieval(
|
108
|
+
name="valid_rag_retrieval",
|
109
|
+
rag_corpora=[
|
110
|
+
"projects/1096655024998/locations/us-central1/ragCorpora/4985766262475849728"
|
111
|
+
],
|
112
|
+
description="General guidence for agent test cases",
|
113
|
+
)
|
114
|
+
|
115
|
+
invalid_rag_retrieval = VertexAiRagRetrieval(
|
116
|
+
name="invalid_rag_retrieval",
|
117
|
+
rag_corpora=[
|
118
|
+
"projects/1096655024998/locations/us-central1/InValidRagCorporas/4985766262475849728"
|
119
|
+
],
|
120
|
+
description="Invalid rag retrieval resource name",
|
121
|
+
)
|
122
|
+
|
123
|
+
non_exist_rag_retrieval = VertexAiRagRetrieval(
|
124
|
+
name="non_exist_rag_retrieval",
|
125
|
+
rag_corpora=[
|
126
|
+
"projects/1096655024998/locations/us-central1/RagCorpora/1234567"
|
127
|
+
],
|
128
|
+
description="Non exist rag retrieval resource name",
|
129
|
+
)
|
130
|
+
|
131
|
+
shell_tool = LangchainTool(ShellTool())
|
132
|
+
|
133
|
+
docs_tool = CrewaiTool(
|
134
|
+
name="direcotry_read_tool",
|
135
|
+
description="use this to find files for you.",
|
136
|
+
tool=DirectoryReadTool(directory="."),
|
137
|
+
)
|
138
|
+
|
139
|
+
no_schema_agent = Agent(
|
140
|
+
model="gemini-1.5-flash",
|
141
|
+
name="no_schema_agent",
|
142
|
+
instruction="""Just say 'Hi'
|
143
|
+
""",
|
144
|
+
)
|
145
|
+
|
146
|
+
schema_agent = Agent(
|
147
|
+
model="gemini-1.5-flash",
|
148
|
+
name="schema_agent",
|
149
|
+
instruction="""
|
150
|
+
You will be given a test case.
|
151
|
+
Return a list of the received test case appended with '_success' and '_failure' as test_titles
|
152
|
+
""",
|
153
|
+
input_schema=TestCase,
|
154
|
+
output_schema=Test,
|
155
|
+
)
|
156
|
+
|
157
|
+
no_input_schema_agent = Agent(
|
158
|
+
model="gemini-1.5-flash",
|
159
|
+
name="no_input_schema_agent",
|
160
|
+
instruction="""
|
161
|
+
Just return ['Tools_success, Tools_failure']
|
162
|
+
""",
|
163
|
+
output_schema=Test,
|
164
|
+
)
|
165
|
+
|
166
|
+
no_output_schema_agent = Agent(
|
167
|
+
model="gemini-1.5-flash",
|
168
|
+
name="no_output_schema_agent",
|
169
|
+
instruction="""
|
170
|
+
Just say 'Hi'
|
171
|
+
""",
|
172
|
+
input_schema=TestCase,
|
173
|
+
)
|
174
|
+
|
175
|
+
single_function_agent = Agent(
|
176
|
+
model="gemini-1.5-flash",
|
177
|
+
name="single_function_agent",
|
178
|
+
description="An agent that calls a single function",
|
179
|
+
instruction="When calling tools, just return what the tool returns.",
|
180
|
+
tools=[simple_function],
|
181
|
+
)
|
182
|
+
|
183
|
+
root_agent = Agent(
|
184
|
+
model="gemini-1.5-flash",
|
185
|
+
name="tool_agent",
|
186
|
+
description="An agent that can call other tools",
|
187
|
+
instruction="When calling tools, just return what the tool returns.",
|
188
|
+
tools=[
|
189
|
+
simple_function,
|
190
|
+
no_param_function,
|
191
|
+
no_output_function,
|
192
|
+
multiple_param_types_function,
|
193
|
+
throw_error_function,
|
194
|
+
list_str_param_function,
|
195
|
+
return_list_str_function,
|
196
|
+
# complex_function_list_dict,
|
197
|
+
repetive_call_1,
|
198
|
+
repetive_call_2,
|
199
|
+
test_case_retrieval,
|
200
|
+
valid_rag_retrieval,
|
201
|
+
invalid_rag_retrieval,
|
202
|
+
non_exist_rag_retrieval,
|
203
|
+
shell_tool,
|
204
|
+
docs_tool,
|
205
|
+
AgentTool(
|
206
|
+
agent=no_schema_agent,
|
207
|
+
),
|
208
|
+
AgentTool(
|
209
|
+
agent=schema_agent,
|
210
|
+
),
|
211
|
+
AgentTool(
|
212
|
+
agent=no_input_schema_agent,
|
213
|
+
),
|
214
|
+
AgentTool(
|
215
|
+
agent=no_output_schema_agent,
|
216
|
+
),
|
217
|
+
],
|
218
|
+
)
|
@@ -0,0 +1,15 @@
|
|
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 . import agent
|
@@ -0,0 +1,110 @@
|
|
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
|
+
# https://github.com/crewAIInc/crewAI-examples/tree/main/trip_planner
|
16
|
+
|
17
|
+
from google.adk import Agent
|
18
|
+
|
19
|
+
# Agent that selects the best city for the trip.
|
20
|
+
identify_agent = Agent(
|
21
|
+
name='identify_agent',
|
22
|
+
description='Select the best city based on weather, season, and prices.',
|
23
|
+
instruction="""
|
24
|
+
Analyze and select the best city for the trip based
|
25
|
+
on specific criteria such as weather patterns, seasonal
|
26
|
+
events, and travel costs. This task involves comparing
|
27
|
+
multiple cities, considering factors like current weather
|
28
|
+
conditions, upcoming cultural or seasonal events, and
|
29
|
+
overall travel expenses.
|
30
|
+
|
31
|
+
Your final answer must be a detailed
|
32
|
+
report on the chosen city, and everything you found out
|
33
|
+
about it, including the actual flight costs, weather
|
34
|
+
forecast and attractions.
|
35
|
+
|
36
|
+
Traveling from: {origin}
|
37
|
+
City Options: {cities}
|
38
|
+
Trip Date: {range}
|
39
|
+
Traveler Interests: {interests}
|
40
|
+
""",
|
41
|
+
)
|
42
|
+
|
43
|
+
# Agent that gathers information about the city.
|
44
|
+
gather_agent = Agent(
|
45
|
+
name='gather_agent',
|
46
|
+
description='Provide the BEST insights about the selected city',
|
47
|
+
instruction="""
|
48
|
+
As a local expert on this city you must compile an
|
49
|
+
in-depth guide for someone traveling there and wanting
|
50
|
+
to have THE BEST trip ever!
|
51
|
+
Gather information about key attractions, local customs,
|
52
|
+
special events, and daily activity recommendations.
|
53
|
+
Find the best spots to go to, the kind of place only a
|
54
|
+
local would know.
|
55
|
+
This guide should provide a thorough overview of what
|
56
|
+
the city has to offer, including hidden gems, cultural
|
57
|
+
hotspots, must-visit landmarks, weather forecasts, and
|
58
|
+
high level costs.
|
59
|
+
|
60
|
+
The final answer must be a comprehensive city guide,
|
61
|
+
rich in cultural insights and practical tips,
|
62
|
+
tailored to enhance the travel experience.
|
63
|
+
|
64
|
+
Trip Date: {range}
|
65
|
+
Traveling from: {origin}
|
66
|
+
Traveler Interests: {interests}
|
67
|
+
""",
|
68
|
+
)
|
69
|
+
|
70
|
+
# Agent that plans the trip.
|
71
|
+
plan_agent = Agent(
|
72
|
+
name='plan_agent',
|
73
|
+
description="""Create the most amazing travel itineraries with budget and
|
74
|
+
packing suggestions for the city""",
|
75
|
+
instruction="""
|
76
|
+
Expand this guide into a full 7-day travel
|
77
|
+
itinerary with detailed per-day plans, including
|
78
|
+
weather forecasts, places to eat, packing suggestions,
|
79
|
+
and a budget breakdown.
|
80
|
+
|
81
|
+
You MUST suggest actual places to visit, actual hotels
|
82
|
+
to stay and actual restaurants to go to.
|
83
|
+
|
84
|
+
This itinerary should cover all aspects of the trip,
|
85
|
+
from arrival to departure, integrating the city guide
|
86
|
+
information with practical travel logistics.
|
87
|
+
|
88
|
+
Your final answer MUST be a complete expanded travel plan,
|
89
|
+
formatted as markdown, encompassing a daily schedule,
|
90
|
+
anticipated weather conditions, recommended clothing and
|
91
|
+
items to pack, and a detailed budget, ensuring THE BEST
|
92
|
+
TRIP EVER. Be specific and give it a reason why you picked
|
93
|
+
each place, what makes them special!
|
94
|
+
|
95
|
+
Trip Date: {range}
|
96
|
+
Traveling from: {origin}
|
97
|
+
Traveler Interests: {interests}
|
98
|
+
""",
|
99
|
+
)
|
100
|
+
|
101
|
+
root_agent = Agent(
|
102
|
+
model='gemini-2.0-flash-001',
|
103
|
+
name='trip_planner',
|
104
|
+
description='Plan the best trip ever',
|
105
|
+
instruction="""
|
106
|
+
Your goal is to plan the best trip according to information listed above.
|
107
|
+
You describe why did you choose the city, list top 3
|
108
|
+
attactions and provide a detailed itinerary for each day.""",
|
109
|
+
sub_agents=[identify_agent, gather_agent, plan_agent],
|
110
|
+
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"id": "test_id",
|
3
|
+
"app_name": "trip_planner_agent",
|
4
|
+
"user_id": "test_user",
|
5
|
+
"state": {
|
6
|
+
"origin": "San Francisco",
|
7
|
+
"interests": "Food, Shopping, Museums",
|
8
|
+
"range": "1000 miles",
|
9
|
+
"cities": ""
|
10
|
+
},
|
11
|
+
"events": [],
|
12
|
+
"last_update_time": 1741218714.258285
|
13
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"id": "test_id",
|
3
|
+
"app_name": "trip_planner_agent",
|
4
|
+
"user_id": "test_user",
|
5
|
+
"state": {
|
6
|
+
"origin": "San Francisco",
|
7
|
+
"interests": "Food, Shopping, Museums",
|
8
|
+
"range": "1000 miles",
|
9
|
+
"cities": ""
|
10
|
+
},
|
11
|
+
"events": [],
|
12
|
+
"last_update_time": 1741218714.258285
|
13
|
+
}
|
google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"query": "Based on my interests, where should I go, Yosemite national park or Los Angeles?",
|
4
|
+
"expected_tool_use": [],
|
5
|
+
"reference": "Given your interests in food, shopping, and museums, Los Angeles would be a better choice than Yosemite National Park. Yosemite is primarily focused on outdoor activities and natural landscapes, while Los Angeles offers a diverse range of culinary experiences, shopping districts, and world-class museums. I will now gather information to create an in-depth guide for your trip to Los Angeles.\n"
|
6
|
+
}
|
7
|
+
]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"query": "Hi, who are you? What can you do?",
|
4
|
+
"expected_tool_use": [],
|
5
|
+
"reference": "I am trip_planner, and my goal is to plan the best trip ever. I can describe why a city was chosen, list its top attractions, and provide a detailed itinerary for each day of the trip.\n"
|
6
|
+
},
|
7
|
+
{
|
8
|
+
"query": "I want to travel from San Francisco to an European country in fall next year. I am considering London and Paris. What is your advice?",
|
9
|
+
"expected_tool_use": [
|
10
|
+
{
|
11
|
+
"tool_name": "transfer_to_agent",
|
12
|
+
"tool_input": {
|
13
|
+
"agent_name": "indentify_agent"
|
14
|
+
}
|
15
|
+
}
|
16
|
+
],
|
17
|
+
"reference": "Okay, I can help you analyze London and Paris to determine which city is better for your trip next fall. I will consider weather patterns, seasonal events, travel costs (including flights from San Francisco), and your interests (food, shopping, and museums). After gathering this information, I'll provide a detailed report on my chosen city.\n"
|
18
|
+
}
|
19
|
+
]
|
@@ -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
|
+
|
@@ -0,0 +1,65 @@
|
|
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 google.adk.models import LlmRequest
|
16
|
+
from google.adk.models import LlmResponse
|
17
|
+
from google.adk.models.google_llm import Gemini
|
18
|
+
from google.genai import types
|
19
|
+
from google.genai.types import Content
|
20
|
+
from google.genai.types import Part
|
21
|
+
import pytest
|
22
|
+
|
23
|
+
|
24
|
+
@pytest.fixture
|
25
|
+
def gemini_llm():
|
26
|
+
return Gemini(model="gemini-1.5-flash")
|
27
|
+
|
28
|
+
|
29
|
+
@pytest.fixture
|
30
|
+
def llm_request():
|
31
|
+
return LlmRequest(
|
32
|
+
model="gemini-1.5-flash",
|
33
|
+
contents=[Content(role="user", parts=[Part.from_text(text="Hello")])],
|
34
|
+
config=types.GenerateContentConfig(
|
35
|
+
temperature=0.1,
|
36
|
+
response_modalities=[types.Modality.TEXT],
|
37
|
+
system_instruction="You are a helpful assistant",
|
38
|
+
),
|
39
|
+
)
|
40
|
+
|
41
|
+
|
42
|
+
@pytest.mark.asyncio
|
43
|
+
async def test_generate_content_async(gemini_llm, llm_request):
|
44
|
+
async for response in gemini_llm.generate_content_async(llm_request):
|
45
|
+
assert isinstance(response, LlmResponse)
|
46
|
+
assert response.content.parts[0].text
|
47
|
+
|
48
|
+
|
49
|
+
@pytest.mark.asyncio
|
50
|
+
async def test_generate_content_async_stream(gemini_llm, llm_request):
|
51
|
+
responses = [
|
52
|
+
resp
|
53
|
+
async for resp in gemini_llm.generate_content_async(
|
54
|
+
llm_request, stream=True
|
55
|
+
)
|
56
|
+
]
|
57
|
+
text = ""
|
58
|
+
for i in range(len(responses) - 1):
|
59
|
+
assert responses[i].partial is True
|
60
|
+
assert responses[i].content.parts[0].text
|
61
|
+
text += responses[i].content.parts[0].text
|
62
|
+
|
63
|
+
# Last message should be accumulated text
|
64
|
+
assert responses[-1].content.parts[0].text == text
|
65
|
+
assert not responses[-1].partial
|