agent-starter-pack 0.3.3__py3-none-any.whl → 0.21.0__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 (255) hide show
  1. agent_starter_pack/agents/README.md +7 -0
  2. agents/langgraph_base_react/template/.templateconfig.yaml → agent_starter_pack/agents/adk_a2a_base/.template/templateconfig.yaml +5 -10
  3. agent_starter_pack/agents/adk_a2a_base/README.md +37 -0
  4. src/deployment_targets/cloud_run/Dockerfile → agent_starter_pack/agents/adk_a2a_base/app/__init__.py +2 -14
  5. agent_starter_pack/agents/adk_a2a_base/app/agent.py +70 -0
  6. agent_starter_pack/agents/adk_a2a_base/notebooks/adk_a2a_app_testing.ipynb +583 -0
  7. agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb → agent_starter_pack/agents/adk_a2a_base/notebooks/evaluating_adk_agent.ipynb +163 -199
  8. {agents/adk_base → agent_starter_pack/agents/adk_a2a_base}/tests/integration/test_agent.py +2 -2
  9. agents/adk_base/template/.templateconfig.yaml → agent_starter_pack/agents/adk_base/.template/templateconfig.yaml +4 -1
  10. {agents → agent_starter_pack/agents}/adk_base/README.md +1 -1
  11. agent_starter_pack/agents/adk_base/app/__init__.py +17 -0
  12. {agents → agent_starter_pack/agents}/adk_base/app/agent.py +5 -2
  13. {agents → agent_starter_pack/agents}/adk_base/notebooks/adk_app_testing.ipynb +128 -82
  14. agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb → agent_starter_pack/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +181 -207
  15. agent_starter_pack/agents/adk_base/tests/integration/test_agent.py +58 -0
  16. agents/crewai_coding_crew/template/.templateconfig.yaml → agent_starter_pack/agents/adk_live/.template/templateconfig.yaml +5 -9
  17. agent_starter_pack/agents/adk_live/README.md +32 -0
  18. agent_starter_pack/agents/adk_live/app/__init__.py +17 -0
  19. agent_starter_pack/agents/adk_live/app/agent.py +51 -0
  20. agent_starter_pack/agents/adk_live/tests/unit/test_dummy.py +38 -0
  21. agents/agentic_rag/template/.templateconfig.yaml → agent_starter_pack/agents/agentic_rag/.template/templateconfig.yaml +7 -3
  22. {agents → agent_starter_pack/agents}/agentic_rag/README.md +1 -1
  23. agent_starter_pack/agents/agentic_rag/app/__init__.py +17 -0
  24. {agents → agent_starter_pack/agents}/agentic_rag/app/agent.py +8 -4
  25. {agents → agent_starter_pack/agents}/agentic_rag/notebooks/adk_app_testing.ipynb +128 -82
  26. agent_starter_pack/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +1535 -0
  27. {agents → agent_starter_pack/agents}/agentic_rag/tests/integration/test_agent.py +3 -3
  28. agent_starter_pack/agents/langgraph_base/.template/templateconfig.yaml +31 -0
  29. agent_starter_pack/agents/langgraph_base/README.md +30 -0
  30. agent_starter_pack/agents/langgraph_base/app/__init__.py +17 -0
  31. agent_starter_pack/agents/langgraph_base/app/agent.py +34 -0
  32. {agents/crewai_coding_crew → agent_starter_pack/agents/langgraph_base}/notebooks/evaluating_langgraph_agent.ipynb +30 -17
  33. {agents/langgraph_base_react → agent_starter_pack/agents/langgraph_base}/tests/integration/test_agent.py +2 -2
  34. {src → agent_starter_pack}/base_template/.gitignore +5 -3
  35. agent_starter_pack/base_template/GEMINI.md +5 -0
  36. agent_starter_pack/base_template/Makefile +339 -0
  37. agent_starter_pack/base_template/README.md +267 -0
  38. agent_starter_pack/base_template/deployment/README.md +11 -0
  39. {src → agent_starter_pack}/base_template/deployment/terraform/apis.tf +2 -2
  40. {src → agent_starter_pack}/base_template/deployment/terraform/dev/apis.tf +6 -1
  41. {src → agent_starter_pack}/base_template/deployment/terraform/dev/iam.tf +12 -11
  42. {src → agent_starter_pack}/base_template/deployment/terraform/dev/providers.tf +5 -1
  43. {src → agent_starter_pack}/base_template/deployment/terraform/dev/storage.tf +1 -1
  44. {src → agent_starter_pack}/base_template/deployment/terraform/dev/variables.tf +10 -10
  45. agent_starter_pack/base_template/deployment/terraform/dev/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +193 -0
  46. agent_starter_pack/base_template/deployment/terraform/github.tf +337 -0
  47. {src → agent_starter_pack}/base_template/deployment/terraform/iam.tf +20 -41
  48. {src → agent_starter_pack}/base_template/deployment/terraform/locals.tf +10 -3
  49. {src/resources/setup_cicd → agent_starter_pack/base_template/deployment/terraform}/providers.tf +8 -1
  50. {src → agent_starter_pack}/base_template/deployment/terraform/service_accounts.tf +7 -8
  51. agent_starter_pack/base_template/deployment/terraform/sql/completions.sql +138 -0
  52. {src → agent_starter_pack}/base_template/deployment/terraform/storage.tf +7 -16
  53. {src → agent_starter_pack}/base_template/deployment/terraform/variables.tf +61 -28
  54. {src → agent_starter_pack}/base_template/deployment/terraform/vars/env.tfvars +6 -1
  55. agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +43 -0
  56. src/base_template/deployment/terraform/build_triggers.tf → agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +55 -38
  57. agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +206 -0
  58. {src → agent_starter_pack}/base_template/pyproject.toml +24 -37
  59. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +132 -0
  60. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +65 -0
  61. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +259 -0
  62. src/base_template/deployment/cd/deploy-to-prod.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +38 -30
  63. src/base_template/deployment/ci/pr_checks.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +5 -5
  64. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +322 -0
  65. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/telemetry.py +96 -0
  66. {src/base_template/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/typing.py +7 -9
  67. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/__init__.py +25 -0
  68. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/part_converter.py +138 -0
  69. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/__init__.py +13 -0
  70. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/a2a_agent_executor.py +265 -0
  71. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/task_result_aggregator.py +152 -0
  72. agent_starter_pack/cli/commands/create.py +1256 -0
  73. agent_starter_pack/cli/commands/enhance.py +611 -0
  74. agent_starter_pack/cli/commands/list.py +203 -0
  75. agent_starter_pack/cli/commands/register_gemini_enterprise.py +1070 -0
  76. agent_starter_pack/cli/commands/setup_cicd.py +862 -0
  77. {src → agent_starter_pack}/cli/main.py +10 -2
  78. {src → agent_starter_pack}/cli/utils/cicd.py +139 -48
  79. agent_starter_pack/cli/utils/gcp.py +263 -0
  80. agent_starter_pack/cli/utils/logging.py +103 -0
  81. agent_starter_pack/cli/utils/remote_template.py +677 -0
  82. agent_starter_pack/cli/utils/template.py +1466 -0
  83. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/process_data.py +1 -1
  84. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +20 -6
  85. {src → agent_starter_pack}/data_ingestion/pyproject.toml +1 -0
  86. {src → agent_starter_pack}/data_ingestion/uv.lock +602 -494
  87. agent_starter_pack/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +484 -0
  88. agent_starter_pack/deployment_targets/agent_engine/tests/load_test/README.md +84 -0
  89. agent_starter_pack/deployment_targets/agent_engine/tests/load_test/load_test.py +424 -0
  90. agent_starter_pack/deployment_targets/agent_engine/tests/{% if cookiecutter.is_a2a %}helpers.py{% else %}unused_helpers.py{% endif %} +138 -0
  91. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +263 -0
  92. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/deploy.py +414 -0
  93. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_adk_live %}expose_app.py{% else %}unused_expose_app.py{% endif %} +519 -0
  94. agent_starter_pack/deployment_targets/cloud_run/Dockerfile +51 -0
  95. agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +243 -0
  96. agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/service.tf +417 -0
  97. agent_starter_pack/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +705 -0
  98. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +321 -0
  99. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/README.md +165 -0
  100. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/load_test.py +329 -0
  101. agent_starter_pack/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/fast_api_app.py +556 -0
  102. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package-lock.json +79 -1044
  103. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package.json +1 -9
  104. agent_starter_pack/frontends/adk_live_react/frontend/src/App.tsx +65 -0
  105. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/Logger.tsx +8 -3
  106. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/logger.scss +26 -0
  107. agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/SidePanel.tsx +516 -0
  108. agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/side-panel.scss +563 -0
  109. agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/TranscriptionPreview.tsx +106 -0
  110. agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/transcription-preview.scss +150 -0
  111. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-live-api.ts +8 -2
  112. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/multimodal-live-types.ts +40 -2
  113. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-recorder.ts +1 -1
  114. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-streamer.ts +1 -1
  115. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/multimodal-live-client.ts +210 -24
  116. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/utils.ts +27 -5
  117. agent_starter_pack/resources/docs/adk-cheatsheet.md +1628 -0
  118. agent_starter_pack/resources/locks/uv-adk_a2a_base-agent_engine.lock +4966 -0
  119. agent_starter_pack/resources/locks/uv-adk_a2a_base-cloud_run.lock +5011 -0
  120. agent_starter_pack/resources/locks/uv-adk_base-agent_engine.lock +4946 -0
  121. agent_starter_pack/resources/locks/uv-adk_base-cloud_run.lock +4991 -0
  122. agent_starter_pack/resources/locks/uv-adk_live-agent_engine.lock +4963 -0
  123. agent_starter_pack/resources/locks/uv-adk_live-cloud_run.lock +5006 -0
  124. agent_starter_pack/resources/locks/uv-agentic_rag-agent_engine.lock +5487 -0
  125. agent_starter_pack/resources/locks/uv-agentic_rag-cloud_run.lock +5532 -0
  126. agent_starter_pack/resources/locks/uv-langgraph_base-agent_engine.lock +5788 -0
  127. agent_starter_pack/resources/locks/uv-langgraph_base-cloud_run.lock +5811 -0
  128. {src → agent_starter_pack}/utils/generate_locks.py +15 -12
  129. {src → agent_starter_pack}/utils/lock_utils.py +4 -7
  130. {src → agent_starter_pack}/utils/watch_and_rebuild.py +2 -2
  131. agent_starter_pack-0.21.0.dist-info/METADATA +182 -0
  132. agent_starter_pack-0.21.0.dist-info/RECORD +171 -0
  133. agent_starter_pack-0.21.0.dist-info/entry_points.txt +2 -0
  134. llm.txt +362 -0
  135. agent_starter_pack-0.3.3.dist-info/METADATA +0 -164
  136. agent_starter_pack-0.3.3.dist-info/RECORD +0 -176
  137. agent_starter_pack-0.3.3.dist-info/entry_points.txt +0 -2
  138. agents/crewai_coding_crew/README.md +0 -34
  139. agents/crewai_coding_crew/app/agent.py +0 -86
  140. agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -39
  141. agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -37
  142. agents/crewai_coding_crew/app/crew/crew.py +0 -71
  143. agents/crewai_coding_crew/tests/integration/test_agent.py +0 -47
  144. agents/langgraph_base_react/README.md +0 -9
  145. agents/langgraph_base_react/app/agent.py +0 -73
  146. agents/live_api/README.md +0 -37
  147. agents/live_api/app/agent.py +0 -78
  148. agents/live_api/app/server.py +0 -196
  149. agents/live_api/app/templates.py +0 -51
  150. agents/live_api/app/vector_store.py +0 -55
  151. agents/live_api/template/.templateconfig.yaml +0 -29
  152. agents/live_api/tests/integration/test_server_e2e.py +0 -254
  153. agents/live_api/tests/load_test/load_test.py +0 -40
  154. agents/live_api/tests/unit/test_server.py +0 -143
  155. src/base_template/Makefile +0 -72
  156. src/base_template/README.md +0 -208
  157. src/base_template/app/__init__.py +0 -3
  158. src/base_template/app/utils/tracing.py +0 -155
  159. src/base_template/deployment/README.md +0 -126
  160. src/base_template/deployment/cd/staging.yaml +0 -216
  161. src/base_template/deployment/terraform/dev/log_sinks.tf +0 -63
  162. src/base_template/deployment/terraform/log_sinks.tf +0 -70
  163. src/base_template/deployment/terraform/providers.tf +0 -37
  164. src/cli/commands/create.py +0 -664
  165. src/cli/commands/setup_cicd.py +0 -829
  166. src/cli/utils/gcp.py +0 -117
  167. src/cli/utils/logging.py +0 -51
  168. src/cli/utils/template.py +0 -737
  169. src/deployment_targets/agent_engine/app/agent_engine_app.py +0 -336
  170. src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -1025
  171. src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -183
  172. src/deployment_targets/agent_engine/tests/load_test/README.md +0 -42
  173. src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -107
  174. src/deployment_targets/cloud_run/app/server.py +0 -154
  175. src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -249
  176. src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
  177. src/deployment_targets/cloud_run/tests/load_test/README.md +0 -83
  178. src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -118
  179. src/deployment_targets/cloud_run/uv.lock +0 -6952
  180. src/frontends/live_api_react/frontend/src/App.tsx +0 -205
  181. src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -217
  182. src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -201
  183. src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -161
  184. src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -285
  185. src/frontends/streamlit/frontend/side_bar.py +0 -214
  186. src/frontends/streamlit/frontend/streamlit_app.py +0 -265
  187. src/frontends/streamlit/frontend/style/app_markdown.py +0 -37
  188. src/frontends/streamlit/frontend/utils/chat_utils.py +0 -67
  189. src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -125
  190. src/frontends/streamlit/frontend/utils/message_editing.py +0 -59
  191. src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -217
  192. src/frontends/streamlit/frontend/utils/stream_handler.py +0 -301
  193. src/frontends/streamlit/frontend/utils/title_summary.py +0 -94
  194. src/frontends/streamlit_adk/frontend/side_bar.py +0 -214
  195. src/frontends/streamlit_adk/frontend/streamlit_app.py +0 -314
  196. src/frontends/streamlit_adk/frontend/style/app_markdown.py +0 -37
  197. src/frontends/streamlit_adk/frontend/utils/chat_utils.py +0 -84
  198. src/frontends/streamlit_adk/frontend/utils/local_chat_history.py +0 -110
  199. src/frontends/streamlit_adk/frontend/utils/message_editing.py +0 -61
  200. src/frontends/streamlit_adk/frontend/utils/multimodal_utils.py +0 -223
  201. src/frontends/streamlit_adk/frontend/utils/stream_handler.py +0 -311
  202. src/frontends/streamlit_adk/frontend/utils/title_summary.py +0 -129
  203. src/resources/containers/data_processing/Dockerfile +0 -27
  204. src/resources/containers/e2e-tests/Dockerfile +0 -19
  205. src/resources/idx/.idx/dev.nix +0 -57
  206. src/resources/idx/idx-template.json +0 -21
  207. src/resources/idx/idx-template.nix +0 -26
  208. src/resources/locks/uv-adk_base-agent_engine.lock +0 -5338
  209. src/resources/locks/uv-adk_base-cloud_run.lock +0 -5930
  210. src/resources/locks/uv-agentic_rag-agent_engine.lock +0 -5528
  211. src/resources/locks/uv-agentic_rag-cloud_run.lock +0 -6120
  212. src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +0 -6231
  213. src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +0 -6839
  214. src/resources/locks/uv-langgraph_base_react-agent_engine.lock +0 -5233
  215. src/resources/locks/uv-langgraph_base_react-cloud_run.lock +0 -5862
  216. src/resources/locks/uv-live_api-cloud_run.lock +0 -5832
  217. src/resources/setup_cicd/cicd_variables.tf +0 -41
  218. src/resources/setup_cicd/github.tf +0 -87
  219. {agents → agent_starter_pack/agents}/agentic_rag/app/retrievers.py +0 -0
  220. {agents → agent_starter_pack/agents}/agentic_rag/app/templates.py +0 -0
  221. {src → agent_starter_pack}/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
  222. {src → agent_starter_pack}/base_template/tests/unit/test_dummy.py +0 -0
  223. {src/deployment_targets/agent_engine/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/gcs.py +0 -0
  224. {src → agent_starter_pack}/cli/utils/__init__.py +0 -0
  225. {src → agent_starter_pack}/cli/utils/datastores.py +0 -0
  226. {src → agent_starter_pack}/cli/utils/version.py +0 -0
  227. {src → agent_starter_pack}/data_ingestion/README.md +0 -0
  228. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
  229. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
  230. {src → agent_starter_pack}/deployment_targets/agent_engine/deployment_metadata.json +0 -0
  231. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
  232. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/favicon.ico +0 -0
  233. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/index.html +0 -0
  234. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/robots.txt +0 -0
  235. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.scss +0 -0
  236. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.test.tsx +0 -0
  237. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
  238. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
  239. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/mock-logs.ts +0 -0
  240. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/contexts/LiveAPIContext.tsx +0 -0
  241. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-media-stream-mux.ts +0 -0
  242. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-screen-capture.ts +0 -0
  243. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-webcam.ts +0 -0
  244. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.css +0 -0
  245. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.tsx +0 -0
  246. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/react-app-env.d.ts +0 -0
  247. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/reportWebVitals.ts +0 -0
  248. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/setupTests.ts +0 -0
  249. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audioworklet-registry.ts +0 -0
  250. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/store-logger.ts +0 -0
  251. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/audio-processing.ts +0 -0
  252. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/vol-meter.ts +0 -0
  253. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/tsconfig.json +0 -0
  254. {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/WHEEL +0 -0
  255. {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,321 @@
1
+ import datetime
2
+ import logging
3
+ import os
4
+ import re
5
+ from collections.abc import AsyncGenerator
6
+ from dataclasses import dataclass
7
+ from typing import Literal
8
+
9
+ import google.auth
10
+ from google.adk.agents import LlmAgent, LoopAgent, SequentialAgent
11
+ from google.adk.agents.callback_context import CallbackContext
12
+ from google.adk.planners import BuiltInPlanner
13
+ from google.adk.tools import google_search
14
+ from google.genai import types as genai_types
15
+ from pydantic import BaseModel, Field
16
+
17
+ from google.adk.tools.agent_tool import AgentTool
18
+ from google.adk.agents import BaseAgent
19
+ from google.adk.agents.invocation_context import InvocationContext
20
+ from google.adk.events import Event, EventActions
21
+
22
+
23
+ _, project_id = google.auth.default()
24
+ os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
25
+ os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
26
+ os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")
27
+
28
+
29
+ # --- Centralized Configuration ---
30
+ @dataclass
31
+ class ResearchConfiguration:
32
+ critic_model: str = "gemini-2.5-pro"
33
+ worker_model: str = "gemini-2.5-flash"
34
+ max_search_iterations: int = 5
35
+
36
+
37
+ config = ResearchConfiguration()
38
+
39
+
40
+ # --- Structured Output Models ---
41
+ class SearchQuery(BaseModel):
42
+ search_query: str = Field(
43
+ description="A highly specific and targeted query for web search."
44
+ )
45
+
46
+
47
+ class Feedback(BaseModel):
48
+ grade: Literal["pass", "fail"] = Field(
49
+ description="Evaluation result. 'pass' if the research is sufficient, 'fail' if it needs revision."
50
+ )
51
+ comment: str = Field(
52
+ description="Detailed explanation of the evaluation, highlighting strengths and/or weaknesses of the research."
53
+ )
54
+ follow_up_queries: list[SearchQuery] | None = Field(
55
+ default=None,
56
+ description="A list of specific, targeted follow-up search queries needed to fix research gaps. This should be null or empty if the grade is 'pass'.",
57
+ )
58
+
59
+ # --- Callbacks ---
60
+ def collect_research_sources_callback(callback_context: CallbackContext) -> None:
61
+ session = callback_context._invocation_context.session
62
+ url_to_short_id = callback_context.state.get("url_to_short_id", {})
63
+ sources = callback_context.state.get("sources", {})
64
+ id_counter = len(url_to_short_id) + 1
65
+ for event in session.events:
66
+ if not (event.grounding_metadata and event.grounding_metadata.grounding_chunks):
67
+ continue
68
+ chunks_info = {}
69
+ for idx, chunk in enumerate(event.grounding_metadata.grounding_chunks):
70
+ if not chunk.web:
71
+ continue
72
+ url = chunk.web.uri
73
+ title = (
74
+ chunk.web.title
75
+ if chunk.web.title != chunk.web.domain
76
+ else chunk.web.domain
77
+ )
78
+ if url not in url_to_short_id:
79
+ short_id = f"src-{id_counter}"
80
+ url_to_short_id[url] = short_id
81
+ sources[short_id] = {
82
+ "short_id": short_id,
83
+ "title": title,
84
+ "url": url,
85
+ "domain": chunk.web.domain,
86
+ "supported_claims": [],
87
+ }
88
+ id_counter += 1
89
+ chunks_info[idx] = url_to_short_id[url]
90
+ if event.grounding_metadata.grounding_supports:
91
+ for support in event.grounding_metadata.grounding_supports:
92
+ confidence_scores = support.confidence_scores or []
93
+ chunk_indices = support.grounding_chunk_indices or []
94
+ for i, chunk_idx in enumerate(chunk_indices):
95
+ if chunk_idx in chunks_info:
96
+ short_id = chunks_info[chunk_idx]
97
+ confidence = (
98
+ confidence_scores[i] if i < len(confidence_scores) else 0.5
99
+ )
100
+ text_segment = support.segment.text if support.segment else ""
101
+ sources[short_id]["supported_claims"].append(
102
+ {
103
+ "text_segment": text_segment,
104
+ "confidence": confidence,
105
+ }
106
+ )
107
+ callback_context.state["url_to_short_id"] = url_to_short_id
108
+ callback_context.state["sources"] = sources
109
+
110
+
111
+ def citation_replacement_callback(callback_context: CallbackContext) -> genai_types.Content:
112
+ final_report = callback_context.state.get("final_cited_report", "")
113
+ sources = callback_context.state.get("sources", {})
114
+ def tag_replacer(match: re.Match) -> str:
115
+ short_id = match.group(1)
116
+ if not (source_info := sources.get(short_id)):
117
+ logging.warning(f"Invalid citation tag found and removed: {match.group(0)}")
118
+ return ""
119
+ display_text = source_info.get("title", source_info.get("domain", short_id))
120
+ return f" [{display_text}]({source_info['url']})"
121
+ processed_report = re.sub(
122
+ r'<cite\s+source\s*=\s*["\']?\s*(src-\d+)\s*["\']?\s*/>', tag_replacer, final_report
123
+ )
124
+ processed_report = re.sub(r'\s+([.,;:])', r'\1', processed_report)
125
+ callback_context.state["final_report_with_citations"] = processed_report
126
+ return genai_types.Content(parts=[genai_types.Part(text=processed_report)])
127
+
128
+
129
+ # --- Custom Agent for Loop Control ---
130
+ class EscalationChecker(BaseAgent):
131
+ """Checks research evaluation and escalates to stop the loop if grade is 'pass'."""
132
+ def __init__(self, name: str):
133
+ super().__init__(name=name)
134
+ async def _run_async_impl(self, ctx: InvocationContext) -> AsyncGenerator[Event, None]:
135
+ evaluation_result = ctx.session.state.get("research_evaluation")
136
+ if evaluation_result and evaluation_result.get("grade") == "pass":
137
+ logging.info(f"[{self.name}] Research evaluation passed. Escalating to stop loop.")
138
+ yield Event(author=self.name, actions=EventActions(escalate=True))
139
+ else:
140
+ logging.info(f"[{self.name}] Research evaluation failed or not found. Loop will continue.")
141
+ # Yielding an event without content or actions just lets the flow continue.
142
+ yield Event(author=self.name)
143
+
144
+
145
+ # --- AGENT DEFINITIONS ---
146
+
147
+ plan_generator = LlmAgent(
148
+ model=config.worker_model,
149
+ name="plan_generator",
150
+ description="Generates a 4-5 line action-oriented research plan, using minimal search only for topic clarification.",
151
+ instruction=f"""
152
+ You are a research strategist. Your job is to create a high-level RESEARCH PLAN, not a summary.
153
+ **RULE: Your output MUST be a bulleted list of 4-5 action-oriented research goals or key questions.**
154
+ - A good goal starts with a verb like "Analyze," "Identify," "Investigate."
155
+ - A bad output is a statement of fact like "The event was in April 2024."
156
+ **TOOL USE IS STRICTLY LIMITED:**
157
+ Your goal is to create a generic, high-quality plan *without searching*.
158
+ Only use `google_search` if a topic is ambiguous or time-sensitive and you absolutely cannot create a plan without a key piece of identifying information.
159
+ You are explicitly forbidden from researching the *content* or *themes* of the topic. That is the next agent's job. Your search is only to identify the subject, not to investigate it.
160
+ Current date: {datetime.datetime.now().strftime("%Y-%m-%d")}
161
+ """,
162
+ tools=[google_search],
163
+ )
164
+
165
+
166
+ section_planner = LlmAgent(
167
+ model=config.worker_model,
168
+ name="section_planner",
169
+ description="Breaks down the research plan into a structured markdown outline of report sections.",
170
+ instruction="""
171
+ You are an expert report architect. Using the research topic and the plan from the 'research_plan' state key, design a logical structure for the final report.
172
+ Your task is to create a markdown outline with 4-6 distinct sections that cover the topic comprehensively without overlap.
173
+ You can use any markdown format you prefer, but here's a suggested structure:
174
+ # Section Name
175
+ A brief overview of what this section covers
176
+ Feel free to add subsections or bullet points if needed to better organize the content.
177
+ Make sure your outline is clear and easy to follow.
178
+ Do not include a "References" or "Sources" section in your outline. Citations will be handled in-line.
179
+ """,
180
+ output_key="report_sections",
181
+ )
182
+
183
+
184
+ section_researcher = LlmAgent(
185
+ model=config.worker_model,
186
+ name="section_researcher",
187
+ description="Performs the crucial first pass of web research.",
188
+ planner=BuiltInPlanner(
189
+ thinking_config=genai_types.ThinkingConfig(include_thoughts=True)
190
+ ),
191
+ instruction="""
192
+ You are a diligent and exhaustive researcher. Your task is to perform the initial, broad information gathering for a report.
193
+ You will be provided with a list of sections in the 'report_sections' state key.
194
+ For each section where 'research' is marked as 'true', generate a comprehensive list of 4-5 targeted search queries to cover the topic from multiple angles.
195
+ Execute all of these queries using the 'google_search' tool and synthesize the results into a detailed summary for that section.
196
+ """,
197
+ tools=[google_search],
198
+ output_key="section_research_findings",
199
+ after_agent_callback=collect_research_sources_callback,
200
+ )
201
+
202
+ research_evaluator = LlmAgent(
203
+ model=config.critic_model,
204
+ name="research_evaluator",
205
+ description="Critically evaluates research and generates follow-up queries.",
206
+ instruction=f"""
207
+ You are a meticulous quality assurance analyst evaluating the research findings in 'section_research_findings'.
208
+
209
+ **CRITICAL RULES:**
210
+ 1. Assume the given research topic is correct. Do not question or try to verify the subject itself.
211
+ 2. Your ONLY job is to assess the quality, depth, and completeness of the research provided *for that topic*.
212
+ 3. Focus on evaluating: Comprehensiveness of coverage, logical flow and organization, use of credible sources, depth of analysis, and clarity of explanations.
213
+ 4. Do NOT fact-check or question the fundamental premise or timeline of the topic.
214
+ 5. If suggesting follow-up queries, they should dive deeper into the existing topic, not question its validity.
215
+
216
+ Be very critical about the QUALITY of research. If you find significant gaps in depth or coverage, assign a grade of "fail",
217
+ write a detailed comment about what's missing, and generate 5-7 specific follow-up queries to fill those gaps.
218
+ If the research thoroughly covers the topic, grade "pass".
219
+
220
+ Current date: {datetime.datetime.now().strftime("%Y-%m-%d")}
221
+ Your response must be a single, raw JSON object validating against the 'Feedback' schema.
222
+ """,
223
+ output_schema=Feedback,
224
+ output_key="research_evaluation",
225
+ )
226
+
227
+ enhanced_search_executor = LlmAgent(
228
+ model=config.worker_model,
229
+ name="enhanced_search_executor",
230
+ description="Executes follow-up searches and integrates new findings.",
231
+ planner=BuiltInPlanner(
232
+ thinking_config=genai_types.ThinkingConfig(include_thoughts=True)
233
+ ),
234
+ instruction="""
235
+ You are a specialist researcher executing a refinement pass.
236
+ You have been activated because the previous research was graded as 'fail'.
237
+
238
+ 1. Review the 'research_evaluation' state key to understand the feedback and required fixes.
239
+ 2. Execute EVERY query listed in 'follow_up_queries' using the 'google_search' tool.
240
+ 3. Synthesize the new findings and COMBINE them with the existing information in 'section_research_findings'.
241
+ 4. Your output MUST be the new, complete, and improved set of research findings.
242
+ """,
243
+ tools=[google_search],
244
+ output_key="section_research_findings",
245
+ after_agent_callback=collect_research_sources_callback,
246
+ )
247
+
248
+ report_composer = LlmAgent(
249
+ model=config.critic_model,
250
+ name="report_composer_with_citations",
251
+ include_contents="none",
252
+ description="Transforms research data and a markdown outline into a final, cited report.",
253
+ instruction="""
254
+ Transform the provided data into a polished, professional, and meticulously cited research report.
255
+
256
+ ---
257
+ ### INPUT DATA
258
+ * Research Plan: `{research_plan}`
259
+ * Research Findings: `{section_research_findings}`
260
+ * Citation Sources: `{sources}`
261
+ * Report Structure: `{report_sections}`
262
+
263
+ ---
264
+ ### CRITICAL: Citation System
265
+ To cite a source, you MUST insert a special citation tag directly after the claim it supports.
266
+
267
+ **The only correct format is:** `<cite source="src-ID_NUMBER" />`
268
+
269
+ ---
270
+ ### Final Instructions
271
+ Generate a comprehensive report using ONLY the `<cite source="src-ID_NUMBER" />` tag system for all citations.
272
+ The final report must strictly follow the structure provided in the **Report Structure** markdown outline.
273
+ Do not include a "References" or "Sources" section; all citations must be in-line.
274
+ """,
275
+ output_key="final_cited_report",
276
+ after_agent_callback=citation_replacement_callback,
277
+ )
278
+
279
+ research_pipeline = SequentialAgent(
280
+ name="research_pipeline",
281
+ description="Executes a pre-approved research plan. It performs iterative research, evaluation, and composes a final, cited report.",
282
+ sub_agents=[
283
+ section_planner,
284
+ section_researcher,
285
+ LoopAgent(
286
+ name="iterative_refinement_loop",
287
+ max_iterations=config.max_search_iterations,
288
+ sub_agents=[
289
+ research_evaluator,
290
+ EscalationChecker(name="escalation_checker"),
291
+ enhanced_search_executor,
292
+ ],
293
+ ),
294
+ report_composer,
295
+ ],
296
+ )
297
+
298
+ interactive_planner_agent = LlmAgent(
299
+ name="interactive_planner_agent",
300
+ model=config.worker_model,
301
+ description="The primary research assistant. It collaborates with the user to create a research plan, and then executes it upon approval.",
302
+ instruction=f"""
303
+ You are a research planning assistant. Your primary function is to convert ANY user request into a research plan.
304
+
305
+ **CRITICAL RULE: Never answer a question directly or refuse a request.** Your one and only first step is to use the `plan_generator` tool to propose a research plan for the user's topic.
306
+ If the user asks a question, you MUST immediately call `plan_generator` to create a plan to answer the question.
307
+
308
+ Your workflow is:
309
+ 1. **Plan:** Use `plan_generator` to create a draft plan and present it to the user.
310
+ 2. **Refine:** Incorporate user feedback until the plan is approved.
311
+ 3. **Execute:** Once the user gives EXPLICIT approval (e.g., "looks good, run it"), you MUST delegate the task to the `research_pipeline` agent, passing the approved plan.
312
+
313
+ Current date: {datetime.datetime.now().strftime("%Y-%m-%d")}
314
+ Do not perform any research yourself. Your job is to Plan, Refine, and Delegate.
315
+ """,
316
+ sub_agents=[research_pipeline],
317
+ tools=[AgentTool(plan_generator)],
318
+ output_key="research_plan",
319
+ )
320
+
321
+ root_agent = interactive_planner_agent
@@ -0,0 +1,165 @@
1
+ # Robust Load Testing for Generative AI Applications
2
+
3
+ This directory provides a comprehensive load testing framework for your Generative AI application, leveraging the power of [Locust](http://locust.io), a leading open-source load testing tool.
4
+ {%- if cookiecutter.agent_name == "adk_live" %}
5
+
6
+ ## Local Load Testing
7
+
8
+ Follow these steps to execute load tests on your local machine:
9
+
10
+ **1. Start the FastAPI Server:**
11
+
12
+ Launch the FastAPI server in a separate terminal:
13
+
14
+ ```bash
15
+ uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host 0.0.0.0 --port 8000 --reload
16
+ ```
17
+
18
+ **2. (In another tab) Create virtual environment with Locust**
19
+ Using another terminal tab, This is suggested to avoid conflicts with the existing application python environment.
20
+
21
+ ```bash
22
+ python3 -m venv .locust_env && source .locust_env/bin/activate && pip install locust==2.31.1 websockets
23
+ ```
24
+
25
+ **3. Execute the Load Test:**
26
+ Trigger the Locust load test with the following command:
27
+
28
+ ```bash
29
+ locust -f tests/load_test/load_test.py \
30
+ -H http://127.0.0.1:8000 \
31
+ --headless \
32
+ -t 30s -u 2 -r 2 \
33
+ --csv=tests/load_test/.results/results \
34
+ --html=tests/load_test/.results/report.html
35
+ ```
36
+
37
+ This command initiates a 30-second load test, simulating 2 users spawning per second, reaching a maximum of 60 concurrent users.
38
+
39
+ **Results:**
40
+
41
+ Comprehensive CSV and HTML reports detailing the load test performance will be generated and saved in the `tests/load_test/.results` directory.
42
+
43
+ ## Remote Load Testing (Targeting Cloud Run)
44
+
45
+ This framework also supports load testing against remote targets, such as a staging Cloud Run instance. This process is seamlessly integrated into the Continuous Delivery (CD) pipeline.
46
+
47
+ **Prerequisites:**
48
+
49
+ - **Dependencies:** Ensure your environment has the same dependencies required for local testing.
50
+ - **Cloud Run Invoker Role:** You'll need the `roles/run.invoker` role to invoke the Cloud Run service.
51
+
52
+ **Steps:**
53
+
54
+ **1. Start Cloud Run Proxy:**
55
+
56
+ Start the proxy in a separate terminal to expose your Cloud Run service on localhost. The proxy automatically handles IAM authentication:
57
+
58
+ ```bash
59
+ gcloud run services proxy YOUR_SERVICE_NAME --port=8080 --region us-central1 --quiet
60
+ ```
61
+
62
+ Replace `YOUR_SERVICE_NAME` with your Cloud Run service name. The `--quiet` flag auto-approves component installation prompts. You can optionally specify `--tag` to target a specific traffic tag.
63
+
64
+ **2. (In another tab) Create virtual environment with Locust:**
65
+
66
+ Using another terminal tab:
67
+
68
+ ```bash
69
+ python3 -m venv .locust_env && source .locust_env/bin/activate && pip install locust==2.31.1 websockets
70
+ ```
71
+
72
+ **3. Execute the Load Test:**
73
+
74
+ Execute load tests against the proxied service. The proxy handles authentication automatically:
75
+
76
+ ```bash
77
+ locust -f tests/load_test/load_test.py \
78
+ -H http://127.0.0.1:8080 \
79
+ --headless \
80
+ -t 30s -u 2 -r 2 \
81
+ --csv=tests/load_test/.results/results \
82
+ --html=tests/load_test/.results/report.html
83
+ ```
84
+ {%- else %}
85
+
86
+ ## Local Load Testing
87
+
88
+ Follow these steps to execute load tests on your local machine:
89
+
90
+ **1. Start the FastAPI Server:**
91
+
92
+ Launch the FastAPI server in a separate terminal:
93
+
94
+ ```bash
95
+ uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host 0.0.0.0 --port 8000 --reload
96
+ ```
97
+
98
+ **2. (In another tab) Create virtual environment with Locust**
99
+ Using another terminal tab, This is suggested to avoid conflicts with the existing application python environment.
100
+
101
+ ```bash
102
+ python3 -m venv .locust_env && source .locust_env/bin/activate && pip install locust==2.31.1{%- if cookiecutter.is_a2a %} a2a-sdk~=0.3.9{%- endif %}
103
+ ```
104
+
105
+ **3. Execute the Load Test:**
106
+ Trigger the Locust load test with the following command:
107
+
108
+ ```bash
109
+ locust -f tests/load_test/load_test.py \
110
+ -H http://127.0.0.1:8000 \
111
+ --headless \
112
+ -t 30s -u 10 -r 2 \
113
+ --csv=tests/load_test/.results/results \
114
+ --html=tests/load_test/.results/report.html
115
+ ```
116
+
117
+ This command initiates a 30-second load test, simulating 2 users spawning per second, reaching a maximum of 60 concurrent users.
118
+
119
+ **Results:**
120
+
121
+ Comprehensive CSV and HTML reports detailing the load test performance will be generated and saved in the `tests/load_test/.results` directory.
122
+
123
+ ## Remote Load Testing (Targeting Cloud Run)
124
+
125
+ This framework also supports load testing against remote targets, such as a staging Cloud Run instance. This process is seamlessly integrated into the Continuous Delivery (CD) pipeline.
126
+
127
+ **Prerequisites:**
128
+
129
+ - **Dependencies:** Ensure your environment has the same dependencies required for local testing.
130
+ - **Cloud Run Invoker Role:** You'll need the `roles/run.invoker` role to invoke the Cloud Run service.
131
+
132
+ **Steps:**
133
+
134
+ **1. Obtain Cloud Run Service URL:**
135
+
136
+ Navigate to the Cloud Run console, select your service, and copy the URL displayed at the top. Set this URL as an environment variable:
137
+
138
+ ```bash
139
+ export RUN_SERVICE_URL=https://your-cloud-run-service-url.run.app
140
+ ```
141
+
142
+ **2. Obtain ID Token:**
143
+
144
+ Retrieve the ID token required for authentication:
145
+
146
+ ```bash
147
+ export _ID_TOKEN=$(gcloud auth print-identity-token -q)
148
+ ```
149
+
150
+ **3. Execute the Load Test:**
151
+ Create virtual environment with Locust:
152
+ ```bash
153
+ python3 -m venv .locust_env && source .locust_env/bin/activate && pip install locust==2.31.1{%- if cookiecutter.is_a2a %} a2a-sdk~=0.3.9{%- endif %}
154
+ ```
155
+
156
+ Execute load tests. The following command executes the same load test parameters as the local test but targets your remote Cloud Run instance.
157
+ ```bash
158
+ locust -f tests/load_test/load_test.py \
159
+ -H $RUN_SERVICE_URL \
160
+ --headless \
161
+ -t 30s -u 60 -r 2 \
162
+ --csv=tests/load_test/.results/results \
163
+ --html=tests/load_test/.results/report.html
164
+ ```
165
+ {%- endif %}