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,479 @@
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 asyncio
16
+ from datetime import datetime
17
+ import logging
18
+ import os
19
+ import tempfile
20
+ from typing import Optional
21
+
22
+ import click
23
+ import uvicorn
24
+
25
+ from . import cli_deploy
26
+ from .cli import run_cli
27
+ from .cli_eval import MISSING_EVAL_DEPENDENCIES_MESSAGE
28
+ from .fast_api import get_fast_api_app
29
+ from .utils import envs
30
+ from .utils import logs
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ @click.group(context_settings={"max_content_width": 240})
36
+ def main():
37
+ """Agent Development Kit CLI tools."""
38
+ pass
39
+
40
+
41
+ @main.group()
42
+ def deploy():
43
+ """Deploy Agent."""
44
+ pass
45
+
46
+
47
+ @main.command("run")
48
+ @click.option(
49
+ "--save_session",
50
+ type=bool,
51
+ is_flag=True,
52
+ show_default=True,
53
+ default=False,
54
+ help="Optional. Whether to save the session to a json file on exit.",
55
+ )
56
+ @click.argument(
57
+ "agent",
58
+ type=click.Path(
59
+ exists=True, dir_okay=True, file_okay=False, resolve_path=True
60
+ ),
61
+ )
62
+ def cli_run(agent: str, save_session: bool):
63
+ """Run an interactive CLI for a certain agent.
64
+
65
+ AGENT: The path to the agent source code folder.
66
+
67
+ Example:
68
+
69
+ adk run path/to/my_agent
70
+ """
71
+ logs.log_to_tmp_folder()
72
+
73
+ agent_parent_folder = os.path.dirname(agent)
74
+ agent_folder_name = os.path.basename(agent)
75
+
76
+ asyncio.run(
77
+ run_cli(
78
+ agent_parent_dir=agent_parent_folder,
79
+ agent_folder_name=agent_folder_name,
80
+ save_session=save_session,
81
+ )
82
+ )
83
+
84
+
85
+ @main.command("eval")
86
+ @click.argument(
87
+ "agent_module_file_path",
88
+ type=click.Path(
89
+ exists=True, dir_okay=True, file_okay=False, resolve_path=True
90
+ ),
91
+ )
92
+ @click.argument("eval_set_file_path", nargs=-1)
93
+ @click.option("--config_file_path", help="Optional. The path to config file.")
94
+ @click.option(
95
+ "--print_detailed_results",
96
+ is_flag=True,
97
+ show_default=True,
98
+ default=False,
99
+ help="Optional. Whether to print detailed results on console or not.",
100
+ )
101
+ def eval_command(
102
+ agent_module_file_path: str,
103
+ eval_set_file_path: tuple[str],
104
+ config_file_path: str,
105
+ print_detailed_results: bool,
106
+ ):
107
+ """Evaluates an agent given the eval sets.
108
+
109
+ AGENT_MODULE_FILE_PATH: The path to the __init__.py file that contains a
110
+ module by the name "agent". "agent" module contains a root_agent.
111
+
112
+ EVAL_SET_FILE_PATH: You can specify one or more eval set file paths.
113
+
114
+ For each file, all evals will be run by default.
115
+
116
+ If you want to run only specific evals from a eval set, first create a comma
117
+ separated list of eval names and then add that as a suffix to the eval set
118
+ file name, demarcated by a `:`.
119
+
120
+ For example,
121
+
122
+ sample_eval_set_file.json:eval_1,eval_2,eval_3
123
+
124
+ This will only run eval_1, eval_2 and eval_3 from sample_eval_set_file.json.
125
+
126
+ CONFIG_FILE_PATH: The path to config file.
127
+
128
+ PRINT_DETAILED_RESULTS: Prints detailed results on the console.
129
+ """
130
+ envs.load_dotenv_for_agent(agent_module_file_path, ".")
131
+
132
+ try:
133
+ from .cli_eval import EvalMetric
134
+ from .cli_eval import EvalResult
135
+ from .cli_eval import EvalStatus
136
+ from .cli_eval import get_evaluation_criteria_or_default
137
+ from .cli_eval import get_root_agent
138
+ from .cli_eval import parse_and_get_evals_to_run
139
+ from .cli_eval import run_evals
140
+ from .cli_eval import try_get_reset_func
141
+ except ModuleNotFoundError:
142
+ raise click.ClickException(MISSING_EVAL_DEPENDENCIES_MESSAGE)
143
+
144
+ evaluation_criteria = get_evaluation_criteria_or_default(config_file_path)
145
+ eval_metrics = []
146
+ for metric_name, threshold in evaluation_criteria.items():
147
+ eval_metrics.append(
148
+ EvalMetric(metric_name=metric_name, threshold=threshold)
149
+ )
150
+
151
+ print(f"Using evaluation creiteria: {evaluation_criteria}")
152
+
153
+ root_agent = get_root_agent(agent_module_file_path)
154
+ reset_func = try_get_reset_func(agent_module_file_path)
155
+
156
+ eval_set_to_evals = parse_and_get_evals_to_run(eval_set_file_path)
157
+
158
+ try:
159
+ eval_results = list(
160
+ run_evals(
161
+ eval_set_to_evals,
162
+ root_agent,
163
+ reset_func,
164
+ eval_metrics,
165
+ print_detailed_results=print_detailed_results,
166
+ )
167
+ )
168
+ except ModuleNotFoundError:
169
+ raise click.ClickException(MISSING_EVAL_DEPENDENCIES_MESSAGE)
170
+
171
+ print("*********************************************************************")
172
+ eval_run_summary = {}
173
+
174
+ for eval_result in eval_results:
175
+ eval_result: EvalResult
176
+
177
+ if eval_result.eval_set_file not in eval_run_summary:
178
+ eval_run_summary[eval_result.eval_set_file] = [0, 0]
179
+
180
+ if eval_result.final_eval_status == EvalStatus.PASSED:
181
+ eval_run_summary[eval_result.eval_set_file][0] += 1
182
+ else:
183
+ eval_run_summary[eval_result.eval_set_file][1] += 1
184
+ print("Eval Run Summary")
185
+ for eval_set_file, pass_fail_count in eval_run_summary.items():
186
+ print(
187
+ f"{eval_set_file}:\n Tests passed: {pass_fail_count[0]}\n Tests"
188
+ f" failed: {pass_fail_count[1]}"
189
+ )
190
+
191
+
192
+ @main.command("web")
193
+ @click.option(
194
+ "--session_db_url",
195
+ help=(
196
+ "Optional. The database URL to store the session.\n\n - Use"
197
+ " 'agentengine://<agent_engine_resource_id>' to connect to Vertex"
198
+ " managed session service.\n\n - Use 'sqlite://<path_to_sqlite_file>'"
199
+ " to connect to a SQLite DB.\n\n - See"
200
+ " https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls"
201
+ " for more details on supported DB URLs."
202
+ ),
203
+ )
204
+ @click.option(
205
+ "--port",
206
+ type=int,
207
+ help="Optional. The port of the server",
208
+ default=8000,
209
+ )
210
+ @click.option(
211
+ "--allow_origins",
212
+ help="Optional. Any additional origins to allow for CORS.",
213
+ multiple=True,
214
+ )
215
+ @click.option(
216
+ "--log_level",
217
+ type=click.Choice(
218
+ ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], case_sensitive=False
219
+ ),
220
+ default="INFO",
221
+ help="Optional. Set the logging level",
222
+ )
223
+ @click.option(
224
+ "--log_to_tmp",
225
+ is_flag=True,
226
+ show_default=True,
227
+ default=False,
228
+ help=(
229
+ "Optional. Whether to log to system temp folder instead of console."
230
+ " This is useful for local debugging."
231
+ ),
232
+ )
233
+ @click.argument(
234
+ "agents_dir",
235
+ type=click.Path(
236
+ exists=True, dir_okay=True, file_okay=False, resolve_path=True
237
+ ),
238
+ default=os.getcwd(),
239
+ )
240
+ def web(
241
+ agents_dir: str,
242
+ log_to_tmp: bool,
243
+ session_db_url: str = "",
244
+ log_level: str = "INFO",
245
+ allow_origins: Optional[list[str]] = None,
246
+ port: int = 8000,
247
+ ):
248
+ """Start a FastAPI server with web UI for a certain agent.
249
+
250
+ AGENTS_DIR: The directory of agents, where each sub-directory is a single
251
+ agent, containing at least `__init__.py` and `agent.py` files.
252
+
253
+ Example:
254
+
255
+ adk web --session_db_url=[db_url] --port=[port] path/to/agents_dir
256
+ """
257
+ if log_to_tmp:
258
+ logs.log_to_tmp_folder()
259
+ else:
260
+ logs.log_to_stderr()
261
+
262
+ logging.getLogger().setLevel(log_level)
263
+
264
+ config = uvicorn.Config(
265
+ get_fast_api_app(
266
+ agent_dir=agents_dir,
267
+ session_db_url=session_db_url,
268
+ allow_origins=allow_origins,
269
+ web=True,
270
+ ),
271
+ host="0.0.0.0",
272
+ port=port,
273
+ reload=True,
274
+ )
275
+ server = uvicorn.Server(config)
276
+ server.run()
277
+
278
+
279
+ @main.command("api_server")
280
+ @click.option(
281
+ "--session_db_url",
282
+ help=(
283
+ "Optional. The database URL to store the session.\n\n - Use"
284
+ " 'agentengine://<agent_engine_resource_id>' to connect to Vertex"
285
+ " managed session service.\n\n - Use 'sqlite://<path_to_sqlite_file>'"
286
+ " to connect to a SQLite DB.\n\n - See"
287
+ " https://docs.sqlalchemy.org/en/20/core/engines.html#backend-specific-urls"
288
+ " for more details on supported DB URLs."
289
+ ),
290
+ )
291
+ @click.option(
292
+ "--port",
293
+ type=int,
294
+ help="Optional. The port of the server",
295
+ default=8000,
296
+ )
297
+ @click.option(
298
+ "--allow_origins",
299
+ help="Optional. Any additional origins to allow for CORS.",
300
+ multiple=True,
301
+ )
302
+ @click.option(
303
+ "--log_level",
304
+ type=click.Choice(
305
+ ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], case_sensitive=False
306
+ ),
307
+ default="INFO",
308
+ help="Optional. Set the logging level",
309
+ )
310
+ @click.option(
311
+ "--log_to_tmp",
312
+ is_flag=True,
313
+ show_default=True,
314
+ default=False,
315
+ help=(
316
+ "Optional. Whether to log to system temp folder instead of console."
317
+ " This is useful for local debugging."
318
+ ),
319
+ )
320
+ # The directory of agents, where each sub-directory is a single agent.
321
+ # By default, it is the current working directory
322
+ @click.argument(
323
+ "agents_dir",
324
+ type=click.Path(
325
+ exists=True, dir_okay=True, file_okay=False, resolve_path=True
326
+ ),
327
+ default=os.getcwd(),
328
+ )
329
+ def cli_api_server(
330
+ agents_dir: str,
331
+ log_to_tmp: bool,
332
+ session_db_url: str = "",
333
+ log_level: str = "INFO",
334
+ allow_origins: Optional[list[str]] = None,
335
+ port: int = 8000,
336
+ ):
337
+ """Start an api server for a certain agent.
338
+
339
+ AGENTS_DIR: The directory of agents, where each sub-directory is a single
340
+ agent, containing at least `__init__.py` and `agent.py` files.
341
+
342
+ Example:
343
+
344
+ adk api_server --session_db_url=[db_url] --port=[port] path/to/agents_dir
345
+ """
346
+ if log_to_tmp:
347
+ logs.log_to_tmp_folder()
348
+ else:
349
+ logs.log_to_stderr()
350
+
351
+ logging.getLogger().setLevel(log_level)
352
+
353
+ config = uvicorn.Config(
354
+ get_fast_api_app(
355
+ agent_dir=agents_dir,
356
+ session_db_url=session_db_url,
357
+ allow_origins=allow_origins,
358
+ web=False,
359
+ ),
360
+ host="0.0.0.0",
361
+ port=port,
362
+ reload=True,
363
+ )
364
+ server = uvicorn.Server(config)
365
+ server.run()
366
+
367
+
368
+ @deploy.command("cloud_run")
369
+ @click.option(
370
+ "--project",
371
+ type=str,
372
+ help=(
373
+ "Required. Google Cloud project to deploy the agent. When absent,"
374
+ " default project from gcloud config is used."
375
+ ),
376
+ )
377
+ @click.option(
378
+ "--region",
379
+ type=str,
380
+ help=(
381
+ "Required. Google Cloud region to deploy the agent. When absent,"
382
+ " gcloud run deploy will prompt later."
383
+ ),
384
+ )
385
+ @click.option(
386
+ "--service_name",
387
+ type=str,
388
+ default="adk-default-service-name",
389
+ help=(
390
+ "Optional. The service name to use in Cloud Run (default:"
391
+ " 'adk-default-service-name')."
392
+ ),
393
+ )
394
+ @click.option(
395
+ "--app_name",
396
+ type=str,
397
+ default="",
398
+ help=(
399
+ "Optional. App name of the ADK API server (default: the folder name"
400
+ " of the AGENT source code)."
401
+ ),
402
+ )
403
+ @click.option(
404
+ "--port",
405
+ type=int,
406
+ default=8000,
407
+ help="Optional. The port of the ADK API server (default: 8000).",
408
+ )
409
+ @click.option(
410
+ "--with_cloud_trace",
411
+ type=bool,
412
+ is_flag=True,
413
+ show_default=True,
414
+ default=False,
415
+ help="Optional. Whether to enable Cloud Trace for cloud run.",
416
+ )
417
+ @click.option(
418
+ "--with_ui",
419
+ type=bool,
420
+ is_flag=True,
421
+ show_default=True,
422
+ default=False,
423
+ help=(
424
+ "Optional. Deploy ADK Web UI if set. (default: deploy ADK API server"
425
+ " only)"
426
+ ),
427
+ )
428
+ @click.option(
429
+ "--temp_folder",
430
+ type=str,
431
+ default=os.path.join(
432
+ tempfile.gettempdir(),
433
+ "cloud_run_deploy_src",
434
+ datetime.now().strftime("%Y%m%d_%H%M%S"),
435
+ ),
436
+ help=(
437
+ "Optional. Temp folder for the generated Cloud Run source files"
438
+ " (default: a timestamped folder in the system temp directory)."
439
+ ),
440
+ )
441
+ @click.argument(
442
+ "agent",
443
+ type=click.Path(
444
+ exists=True, dir_okay=True, file_okay=False, resolve_path=True
445
+ ),
446
+ )
447
+ def deploy_to_cloud_run(
448
+ agent: str,
449
+ project: Optional[str],
450
+ region: Optional[str],
451
+ service_name: str,
452
+ app_name: str,
453
+ temp_folder: str,
454
+ port: int,
455
+ with_cloud_trace: bool,
456
+ with_ui: bool,
457
+ ):
458
+ """Deploys agent to Cloud Run.
459
+
460
+ AGENT: The path to the agent source code folder.
461
+
462
+ Example:
463
+
464
+ adk deploy cloud_run --project=[project] --region=[region] path/to/my_agent
465
+ """
466
+ try:
467
+ cli_deploy.to_cloud_run(
468
+ agent_folder=agent,
469
+ project=project,
470
+ region=region,
471
+ service_name=service_name,
472
+ app_name=app_name,
473
+ temp_folder=temp_folder,
474
+ port=port,
475
+ with_cloud_trace=with_cloud_trace,
476
+ with_ui=with_ui,
477
+ )
478
+ except Exception as e:
479
+ click.secho(f"Deploy failed: {e}", fg="red", err=True)