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.
Files changed (312) hide show
  1. google/adk/__init__.py +20 -0
  2. google/adk/agents/__init__.py +32 -0
  3. google/adk/agents/active_streaming_tool.py +38 -0
  4. google/adk/agents/base_agent.py +345 -0
  5. google/adk/agents/callback_context.py +112 -0
  6. google/adk/agents/invocation_context.py +181 -0
  7. google/adk/agents/langgraph_agent.py +140 -0
  8. google/adk/agents/live_request_queue.py +64 -0
  9. google/adk/agents/llm_agent.py +376 -0
  10. google/adk/agents/loop_agent.py +62 -0
  11. google/adk/agents/parallel_agent.py +96 -0
  12. google/adk/agents/readonly_context.py +46 -0
  13. google/adk/agents/remote_agent.py +50 -0
  14. google/adk/agents/run_config.py +87 -0
  15. google/adk/agents/sequential_agent.py +45 -0
  16. google/adk/agents/transcription_entry.py +34 -0
  17. google/adk/artifacts/__init__.py +23 -0
  18. google/adk/artifacts/base_artifact_service.py +128 -0
  19. google/adk/artifacts/gcs_artifact_service.py +195 -0
  20. google/adk/artifacts/in_memory_artifact_service.py +133 -0
  21. google/adk/auth/__init__.py +22 -0
  22. google/adk/auth/auth_credential.py +220 -0
  23. google/adk/auth/auth_handler.py +268 -0
  24. google/adk/auth/auth_preprocessor.py +116 -0
  25. google/adk/auth/auth_schemes.py +67 -0
  26. google/adk/auth/auth_tool.py +55 -0
  27. google/adk/cli/__init__.py +15 -0
  28. google/adk/cli/__main__.py +18 -0
  29. google/adk/cli/agent_graph.py +122 -0
  30. google/adk/cli/browser/adk_favicon.svg +17 -0
  31. google/adk/cli/browser/assets/audio-processor.js +51 -0
  32. google/adk/cli/browser/assets/config/runtime-config.json +3 -0
  33. google/adk/cli/browser/index.html +33 -0
  34. google/adk/cli/browser/main-XUU6OGCC.js +75 -0
  35. google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
  36. google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
  37. google/adk/cli/cli.py +181 -0
  38. google/adk/cli/cli_deploy.py +181 -0
  39. google/adk/cli/cli_eval.py +282 -0
  40. google/adk/cli/cli_tools_click.py +479 -0
  41. google/adk/cli/fast_api.py +774 -0
  42. google/adk/cli/media_streamer/__init__.py +19 -0
  43. google/adk/cli/media_streamer/index.html +228 -0
  44. google/adk/cli/utils/__init__.py +49 -0
  45. google/adk/cli/utils/envs.py +57 -0
  46. google/adk/cli/utils/evals.py +93 -0
  47. google/adk/cli/utils/logs.py +72 -0
  48. google/adk/code_executors/__init__.py +49 -0
  49. google/adk/code_executors/base_code_executor.py +97 -0
  50. google/adk/code_executors/code_execution_utils.py +256 -0
  51. google/adk/code_executors/code_executor_context.py +202 -0
  52. google/adk/code_executors/container_code_executor.py +196 -0
  53. google/adk/code_executors/unsafe_local_code_executor.py +71 -0
  54. google/adk/code_executors/vertex_ai_code_executor.py +234 -0
  55. google/adk/evaluation/__init__.py +31 -0
  56. google/adk/evaluation/agent_evaluator.py +329 -0
  57. google/adk/evaluation/evaluation_constants.py +24 -0
  58. google/adk/evaluation/evaluation_generator.py +270 -0
  59. google/adk/evaluation/response_evaluator.py +135 -0
  60. google/adk/evaluation/trajectory_evaluator.py +184 -0
  61. google/adk/events/__init__.py +21 -0
  62. google/adk/events/event.py +130 -0
  63. google/adk/events/event_actions.py +55 -0
  64. google/adk/examples/__init__.py +28 -0
  65. google/adk/examples/base_example_provider.py +35 -0
  66. google/adk/examples/example.py +27 -0
  67. google/adk/examples/example_util.py +123 -0
  68. google/adk/examples/vertex_ai_example_store.py +104 -0
  69. google/adk/flows/__init__.py +14 -0
  70. google/adk/flows/llm_flows/__init__.py +20 -0
  71. google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
  72. google/adk/flows/llm_flows/_code_execution.py +458 -0
  73. google/adk/flows/llm_flows/_nl_planning.py +129 -0
  74. google/adk/flows/llm_flows/agent_transfer.py +132 -0
  75. google/adk/flows/llm_flows/audio_transcriber.py +109 -0
  76. google/adk/flows/llm_flows/auto_flow.py +49 -0
  77. google/adk/flows/llm_flows/base_llm_flow.py +559 -0
  78. google/adk/flows/llm_flows/basic.py +72 -0
  79. google/adk/flows/llm_flows/contents.py +370 -0
  80. google/adk/flows/llm_flows/functions.py +486 -0
  81. google/adk/flows/llm_flows/identity.py +47 -0
  82. google/adk/flows/llm_flows/instructions.py +137 -0
  83. google/adk/flows/llm_flows/single_flow.py +57 -0
  84. google/adk/memory/__init__.py +35 -0
  85. google/adk/memory/base_memory_service.py +74 -0
  86. google/adk/memory/in_memory_memory_service.py +62 -0
  87. google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
  88. google/adk/models/__init__.py +31 -0
  89. google/adk/models/anthropic_llm.py +243 -0
  90. google/adk/models/base_llm.py +87 -0
  91. google/adk/models/base_llm_connection.py +76 -0
  92. google/adk/models/gemini_llm_connection.py +200 -0
  93. google/adk/models/google_llm.py +331 -0
  94. google/adk/models/lite_llm.py +673 -0
  95. google/adk/models/llm_request.py +98 -0
  96. google/adk/models/llm_response.py +111 -0
  97. google/adk/models/registry.py +102 -0
  98. google/adk/planners/__init__.py +23 -0
  99. google/adk/planners/base_planner.py +66 -0
  100. google/adk/planners/built_in_planner.py +75 -0
  101. google/adk/planners/plan_re_act_planner.py +208 -0
  102. google/adk/runners.py +456 -0
  103. google/adk/sessions/__init__.py +41 -0
  104. google/adk/sessions/base_session_service.py +133 -0
  105. google/adk/sessions/database_session_service.py +522 -0
  106. google/adk/sessions/in_memory_session_service.py +206 -0
  107. google/adk/sessions/session.py +54 -0
  108. google/adk/sessions/state.py +71 -0
  109. google/adk/sessions/vertex_ai_session_service.py +356 -0
  110. google/adk/telemetry.py +189 -0
  111. google/adk/tests/__init__.py +14 -0
  112. google/adk/tests/integration/.env.example +10 -0
  113. google/adk/tests/integration/__init__.py +18 -0
  114. google/adk/tests/integration/conftest.py +119 -0
  115. google/adk/tests/integration/fixture/__init__.py +14 -0
  116. google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
  117. google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
  118. google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
  119. google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
  120. google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
  121. google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
  122. google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
  123. google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
  124. google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
  125. google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
  126. google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
  127. google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
  128. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
  129. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
  130. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
  131. google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
  132. google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
  133. google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
  134. google/adk/tests/integration/fixture/flow_complex_spark/sample.debug.log +243 -0
  135. google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
  136. google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
  137. google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
  138. google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
  139. google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
  140. google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
  141. google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
  142. google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
  143. google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
  144. google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
  145. google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
  146. google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
  147. google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
  148. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
  149. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
  150. google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
  151. google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
  152. google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
  153. google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
  154. google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
  155. google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
  156. google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
  157. google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
  158. google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
  159. google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
  160. google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
  161. google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
  162. google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
  163. google/adk/tests/integration/models/__init__.py +14 -0
  164. google/adk/tests/integration/models/test_google_llm.py +65 -0
  165. google/adk/tests/integration/test_callback.py +70 -0
  166. google/adk/tests/integration/test_context_variable.py +67 -0
  167. google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
  168. google/adk/tests/integration/test_multi_agent.py +28 -0
  169. google/adk/tests/integration/test_multi_turn.py +42 -0
  170. google/adk/tests/integration/test_single_agent.py +23 -0
  171. google/adk/tests/integration/test_sub_agent.py +26 -0
  172. google/adk/tests/integration/test_system_instruction.py +177 -0
  173. google/adk/tests/integration/test_tools.py +287 -0
  174. google/adk/tests/integration/test_with_test_file.py +34 -0
  175. google/adk/tests/integration/tools/__init__.py +14 -0
  176. google/adk/tests/integration/utils/__init__.py +16 -0
  177. google/adk/tests/integration/utils/asserts.py +75 -0
  178. google/adk/tests/integration/utils/test_runner.py +97 -0
  179. google/adk/tests/unittests/__init__.py +14 -0
  180. google/adk/tests/unittests/agents/__init__.py +14 -0
  181. google/adk/tests/unittests/agents/test_base_agent.py +407 -0
  182. google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
  183. google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
  184. google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
  185. google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
  186. google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
  187. google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
  188. google/adk/tests/unittests/artifacts/__init__.py +14 -0
  189. google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
  190. google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
  191. google/adk/tests/unittests/conftest.py +73 -0
  192. google/adk/tests/unittests/fast_api/__init__.py +14 -0
  193. google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
  194. google/adk/tests/unittests/flows/__init__.py +14 -0
  195. google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
  196. google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
  197. google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
  198. google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
  199. google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
  200. google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
  201. google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
  202. google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
  203. google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
  204. google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
  205. google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
  206. google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
  207. google/adk/tests/unittests/models/__init__.py +14 -0
  208. google/adk/tests/unittests/models/test_google_llm.py +224 -0
  209. google/adk/tests/unittests/models/test_litellm.py +804 -0
  210. google/adk/tests/unittests/models/test_models.py +60 -0
  211. google/adk/tests/unittests/sessions/__init__.py +14 -0
  212. google/adk/tests/unittests/sessions/test_session_service.py +227 -0
  213. google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
  214. google/adk/tests/unittests/streaming/__init__.py +14 -0
  215. google/adk/tests/unittests/streaming/test_streaming.py +50 -0
  216. google/adk/tests/unittests/tools/__init__.py +14 -0
  217. google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
  218. google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
  219. google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
  220. google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
  221. google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
  222. google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
  223. google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
  224. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
  225. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
  226. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
  227. google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
  228. google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
  229. google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
  230. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
  231. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
  232. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
  233. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
  234. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
  235. google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
  236. google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
  237. google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
  238. google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
  239. google/adk/tests/unittests/tools/test_base_tool.py +141 -0
  240. google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
  241. google/adk/tests/unittests/utils.py +304 -0
  242. google/adk/tools/__init__.py +51 -0
  243. google/adk/tools/_automatic_function_calling_util.py +346 -0
  244. google/adk/tools/agent_tool.py +176 -0
  245. google/adk/tools/apihub_tool/__init__.py +19 -0
  246. google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
  247. google/adk/tools/apihub_tool/clients/__init__.py +13 -0
  248. google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
  249. google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
  250. google/adk/tools/application_integration_tool/__init__.py +19 -0
  251. google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
  252. google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
  253. google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
  254. google/adk/tools/base_tool.py +144 -0
  255. google/adk/tools/built_in_code_execution_tool.py +59 -0
  256. google/adk/tools/crewai_tool.py +72 -0
  257. google/adk/tools/example_tool.py +62 -0
  258. google/adk/tools/exit_loop_tool.py +23 -0
  259. google/adk/tools/function_parameter_parse_util.py +307 -0
  260. google/adk/tools/function_tool.py +87 -0
  261. google/adk/tools/get_user_choice_tool.py +28 -0
  262. google/adk/tools/google_api_tool/__init__.py +14 -0
  263. google/adk/tools/google_api_tool/google_api_tool.py +59 -0
  264. google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
  265. google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
  266. google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
  267. google/adk/tools/google_search_tool.py +68 -0
  268. google/adk/tools/langchain_tool.py +86 -0
  269. google/adk/tools/load_artifacts_tool.py +113 -0
  270. google/adk/tools/load_memory_tool.py +58 -0
  271. google/adk/tools/load_web_page.py +41 -0
  272. google/adk/tools/long_running_tool.py +39 -0
  273. google/adk/tools/mcp_tool/__init__.py +42 -0
  274. google/adk/tools/mcp_tool/conversion_utils.py +161 -0
  275. google/adk/tools/mcp_tool/mcp_tool.py +113 -0
  276. google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
  277. google/adk/tools/openapi_tool/__init__.py +21 -0
  278. google/adk/tools/openapi_tool/auth/__init__.py +19 -0
  279. google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
  280. google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
  281. google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
  282. google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
  283. google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
  284. google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
  285. google/adk/tools/openapi_tool/common/__init__.py +19 -0
  286. google/adk/tools/openapi_tool/common/common.py +300 -0
  287. google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
  288. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
  289. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
  290. google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
  291. google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
  292. google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
  293. google/adk/tools/preload_memory_tool.py +72 -0
  294. google/adk/tools/retrieval/__init__.py +36 -0
  295. google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
  296. google/adk/tools/retrieval/files_retrieval.py +33 -0
  297. google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
  298. google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
  299. google/adk/tools/tool_context.py +90 -0
  300. google/adk/tools/toolbox_tool.py +46 -0
  301. google/adk/tools/transfer_to_agent_tool.py +21 -0
  302. google/adk/tools/vertex_ai_search_tool.py +96 -0
  303. google/adk/version.py +16 -0
  304. google_adk-0.0.1.dist-info/LICENSE.txt → google_adk-0.0.2.dist-info/LICENSE +32 -0
  305. google_adk-0.0.2.dist-info/METADATA +73 -0
  306. google_adk-0.0.2.dist-info/RECORD +308 -0
  307. {google_adk-0.0.1.dist-info → google_adk-0.0.2.dist-info}/WHEEL +1 -2
  308. google_adk-0.0.2.dist-info/entry_points.txt +3 -0
  309. agent_kit/__init__.py +0 -0
  310. google_adk-0.0.1.dist-info/METADATA +0 -15
  311. google_adk-0.0.1.dist-info/RECORD +0 -6
  312. google_adk-0.0.1.dist-info/top_level.txt +0 -1
@@ -0,0 +1,5 @@
1
+ [{
2
+ "query": "Turn off device_2 in the Bedroom.",
3
+ "expected_tool_use": [{"tool_name": "set_device_info", "tool_input": {"location": "Bedroom", "device_id": "device_2", "status": "OFF"}}],
4
+ "reference": "I have set the device_2 status to off."
5
+ }]
@@ -0,0 +1,5 @@
1
+ [{
2
+ "query": "Turn off device_3 in the Bedroom.",
3
+ "expected_tool_use": [{"tool_name": "set_device_info", "tool_input": {"location": "Bedroom", "device_id": "device_3", "status": "OFF"}}],
4
+ "reference": "I have set the device_3 status to off."
5
+ }]
@@ -0,0 +1,5 @@
1
+ {
2
+ "criteria": {
3
+ "tool_trajectory_avg_score": 1.0
4
+ }
5
+ }
@@ -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,6 @@
1
+ {
2
+ "criteria": {
3
+ "tool_trajectory_avg_score": 1.0,
4
+ "response_match_score": 0.5
5
+ }
6
+ }
@@ -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,5 @@
1
+ [{
2
+ "query": "Turn off device_3 in the Bedroom.",
3
+ "expected_tool_use": [{"tool_name": "set_device_info", "tool_input": {"location": "Bedroom", "device_id": "device_3", "status": "OFF"}}],
4
+ "reference": "I have set the device_3 status to off."
5
+ }]
@@ -0,0 +1,5 @@
1
+ {
2
+ "criteria": {
3
+ "tool_trajectory_avg_score": 1.0
4
+ }
5
+ }
@@ -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,5 @@
1
+ {
2
+ "criteria": {
3
+ "response_match_score": 0.5
4
+ }
5
+ }
@@ -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,5 @@
1
+ {
2
+ "criteria": {
3
+ "response_match_score": 0.5
4
+ }
5
+ }
@@ -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