solace-agent-mesh 0.2.3__py3-none-any.whl → 1.0.1__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.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (518) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  2. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  3. solace_agent_mesh/agent/adk/callbacks.py +1694 -0
  4. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  5. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  6. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  7. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  8. solace_agent_mesh/agent/adk/runner.py +353 -0
  9. solace_agent_mesh/agent/adk/services.py +240 -0
  10. solace_agent_mesh/agent/adk/setup.py +751 -0
  11. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  12. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  13. solace_agent_mesh/agent/agent_llm.txt +41 -0
  14. solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
  15. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  16. solace_agent_mesh/agent/sac/app.py +640 -0
  17. solace_agent_mesh/agent/sac/component.py +3388 -0
  18. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  19. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  20. solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
  21. solace_agent_mesh/agent/testing/__init__.py +3 -0
  22. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  23. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  24. solace_agent_mesh/agent/tools/__init__.py +14 -0
  25. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  26. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  27. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  28. solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
  29. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  30. solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
  31. solace_agent_mesh/agent/tools/registry.py +36 -0
  32. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  33. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  34. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  35. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  36. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  37. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  38. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  39. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  40. solace_agent_mesh/assets/docs/404.html +16 -0
  41. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  42. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  43. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  54. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  57. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  104. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
  132. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
  133. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  165. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  167. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  168. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  170. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  171. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
  172. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  173. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  175. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  176. solace_agent_mesh/cli/__init__.py +1 -1
  177. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  178. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  179. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  180. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  181. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  183. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  184. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  185. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  186. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  187. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  188. solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
  189. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  190. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
  191. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  192. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  193. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  194. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  201. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  202. solace_agent_mesh/cli/main.py +17 -294
  203. solace_agent_mesh/cli/utils.py +135 -204
  204. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  205. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  210. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  211. solace_agent_mesh/common/__init__.py +1 -0
  212. solace_agent_mesh/common/a2a_protocol.py +564 -0
  213. solace_agent_mesh/common/agent_registry.py +42 -0
  214. solace_agent_mesh/common/client/__init__.py +4 -0
  215. solace_agent_mesh/common/client/card_resolver.py +21 -0
  216. solace_agent_mesh/common/client/client.py +85 -0
  217. solace_agent_mesh/common/client/client_llm.txt +133 -0
  218. solace_agent_mesh/common/common_llm.txt +144 -0
  219. solace_agent_mesh/common/constants.py +1 -14
  220. solace_agent_mesh/common/middleware/__init__.py +12 -0
  221. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  222. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  223. solace_agent_mesh/common/middleware/registry.py +125 -0
  224. solace_agent_mesh/common/server/__init__.py +4 -0
  225. solace_agent_mesh/common/server/server.py +122 -0
  226. solace_agent_mesh/common/server/server_llm.txt +169 -0
  227. solace_agent_mesh/common/server/task_manager.py +291 -0
  228. solace_agent_mesh/common/server/utils.py +28 -0
  229. solace_agent_mesh/common/services/__init__.py +4 -0
  230. solace_agent_mesh/common/services/employee_service.py +162 -0
  231. solace_agent_mesh/common/services/identity_service.py +129 -0
  232. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  233. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  234. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  235. solace_agent_mesh/common/services/services_llm.txt +132 -0
  236. solace_agent_mesh/common/types.py +411 -0
  237. solace_agent_mesh/common/utils/__init__.py +7 -0
  238. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  239. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  240. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  241. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  242. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  243. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  244. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  245. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  246. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  247. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  248. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  249. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  250. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  251. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  252. solace_agent_mesh/config_portal/backend/common.py +66 -24
  253. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
  254. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
  258. solace_agent_mesh/config_portal/backend/server.py +550 -140
  259. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
  260. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  267. solace_agent_mesh/core_a2a/__init__.py +1 -0
  268. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  269. solace_agent_mesh/core_a2a/service.py +331 -0
  270. solace_agent_mesh/evaluation/config_loader.py +657 -0
  271. solace_agent_mesh/evaluation/evaluator.py +667 -0
  272. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  273. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  274. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  275. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  276. solace_agent_mesh/evaluation/report/modal.html +59 -0
  277. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  278. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  279. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  280. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  281. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  282. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  283. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  284. solace_agent_mesh/evaluation/report_generator.py +613 -0
  285. solace_agent_mesh/evaluation/run.py +613 -0
  286. solace_agent_mesh/evaluation/subscriber.py +872 -0
  287. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  288. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  289. solace_agent_mesh/gateway/base/__init__.py +1 -0
  290. solace_agent_mesh/gateway/base/app.py +266 -0
  291. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  292. solace_agent_mesh/gateway/base/component.py +1542 -0
  293. solace_agent_mesh/gateway/base/task_context.py +74 -0
  294. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  295. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  296. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  297. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  298. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  299. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  300. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  301. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  302. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  303. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  304. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  305. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
  306. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  307. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  308. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  309. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  310. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  311. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  312. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  313. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  314. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  315. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  316. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  317. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  318. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  319. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  320. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  321. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  322. solace_agent_mesh/llm.txt +228 -0
  323. solace_agent_mesh/llm_detail.txt +2835 -0
  324. solace_agent_mesh/templates/agent_template.yaml +53 -0
  325. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  326. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  327. solace_agent_mesh/templates/gateway_component_template.py +400 -0
  328. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  329. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  330. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  331. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  332. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  333. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  334. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  335. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  336. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  337. solace_agent_mesh/templates/shared_config.yaml +66 -0
  338. solace_agent_mesh/templates/templates_llm.txt +147 -0
  339. solace_agent_mesh/templates/webui.yaml +53 -0
  340. solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
  341. solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
  342. solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
  343. {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
  344. solace_agent_mesh/agents/base_agent_component.py +0 -226
  345. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  346. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  347. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  348. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  349. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  350. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  351. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  352. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  353. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  354. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  355. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  356. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  357. solace_agent_mesh/agents/slack/__init__.py +0 -1
  358. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  359. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  360. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  361. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  362. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  363. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  364. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  365. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  366. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  367. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  368. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  369. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  370. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  371. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  372. solace_agent_mesh/cli/commands/add/add.py +0 -88
  373. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  374. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  375. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  376. solace_agent_mesh/cli/commands/build.py +0 -670
  377. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  378. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  379. solace_agent_mesh/cli/commands/config.py +0 -29
  380. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  382. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  383. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  384. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  385. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  386. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  387. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  388. solace_agent_mesh/cli/commands/init/init.py +0 -92
  389. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  390. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  391. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  392. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  393. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  394. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  395. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  396. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  397. solace_agent_mesh/cli/commands/run.py +0 -68
  398. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  399. solace_agent_mesh/cli/config.py +0 -85
  400. solace_agent_mesh/common/action.py +0 -91
  401. solace_agent_mesh/common/action_list.py +0 -37
  402. solace_agent_mesh/common/action_response.py +0 -340
  403. solace_agent_mesh/common/mysql_database.py +0 -40
  404. solace_agent_mesh/common/postgres_database.py +0 -85
  405. solace_agent_mesh/common/prompt_templates.py +0 -28
  406. solace_agent_mesh/common/stimulus_utils.py +0 -152
  407. solace_agent_mesh/common/time.py +0 -24
  408. solace_agent_mesh/common/utils.py +0 -712
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DMmCawWe.js +0 -42
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-dd988f05.js +0 -1
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  414. solace_agent_mesh/configs/agent_global.yaml +0 -74
  415. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  416. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  417. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  418. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  419. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  420. solace_agent_mesh/configs/monitor.yaml +0 -0
  421. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  422. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  423. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  424. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  425. solace_agent_mesh/configs/service_llm.yaml +0 -265
  426. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  427. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  428. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  429. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  430. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  431. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  432. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  433. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  434. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  435. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  436. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  437. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  438. solace_agent_mesh/orchestrator/__init__.py +0 -0
  439. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  440. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  441. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  442. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  443. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  444. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  445. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  446. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  447. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  448. solace_agent_mesh/services/__init__.py +0 -0
  449. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  450. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  451. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  452. solace_agent_mesh/services/common/__init__.py +0 -4
  453. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  454. solace_agent_mesh/services/common/singleton.py +0 -18
  455. solace_agent_mesh/services/file_service/__init__.py +0 -14
  456. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  457. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  458. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  459. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  460. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  461. solace_agent_mesh/services/file_service/file_service.py +0 -437
  462. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  463. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  464. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  465. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  466. solace_agent_mesh/services/history_service/__init__.py +0 -3
  467. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  468. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  469. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  470. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  471. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  472. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  473. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  474. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  475. solace_agent_mesh/services/history_service/history_service.py +0 -413
  476. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  477. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  478. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  479. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  480. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  481. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  482. solace_agent_mesh/templates/action.py +0 -38
  483. solace_agent_mesh/templates/agent.py +0 -29
  484. solace_agent_mesh/templates/agent.yaml +0 -70
  485. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  486. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  487. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  488. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  489. solace_agent_mesh/templates/gateway_base.py +0 -15
  490. solace_agent_mesh/templates/gateway_input.py +0 -98
  491. solace_agent_mesh/templates/gateway_output.py +0 -71
  492. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  493. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  494. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  495. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  496. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  497. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  498. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  499. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  500. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  501. solace_agent_mesh/templates/web-flows.yaml +0 -76
  502. solace_agent_mesh/tools/__init__.py +0 -0
  503. solace_agent_mesh/tools/components/__init__.py +0 -0
  504. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  505. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  506. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  507. solace_agent_mesh-0.2.3.dist-info/METADATA +0 -172
  508. solace_agent_mesh-0.2.3.dist-info/RECORD +0 -193
  509. solace_agent_mesh-0.2.3.dist-info/entry_points.txt +0 -3
  510. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  511. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  512. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  513. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  517. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  518. {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,111 @@
1
+ # =============================================================================
2
+ # ADK PATCHES - Two separate patches to modify ADK behavior
3
+ # =============================================================================
4
+
5
+ # =============================================================================
6
+ # PATCH 1: Event Content Processing
7
+ # Purpose: Fix event filtering and function response handling in LLM flows
8
+ # =============================================================================
9
+ import google.adk.flows.llm_flows.contents
10
+ from google.adk.flows.llm_flows.contents import _is_event_belongs_to_branch
11
+ from google.adk.flows.llm_flows.contents import _is_auth_event
12
+ from google.adk.flows.llm_flows.contents import _convert_foreign_event
13
+ from google.adk.flows.llm_flows.contents import _is_other_agent_reply
14
+ from google.adk.flows.llm_flows.contents import _rearrange_events_for_async_function_responses_in_history
15
+ from google.adk.flows.llm_flows.contents import remove_client_function_call_id
16
+ from google.adk.events.event import Event
17
+
18
+ import copy
19
+ from typing import Optional
20
+
21
+ from google.genai import types
22
+
23
+ def _patch_get_contents(
24
+ current_branch: Optional[str], events: list[Event], agent_name: str = ''
25
+ ) -> list[types.Content]:
26
+ """Get the contents for the LLM request.
27
+
28
+ Applies filtering, rearrangement, and content processing to events.
29
+
30
+ Args:
31
+ current_branch: The current branch of the agent.
32
+ events: Events to process.
33
+ agent_name: The name of the agent.
34
+
35
+ Returns:
36
+ A list of processed contents.
37
+ """
38
+ filtered_events = []
39
+ # Parse the events, leaving the contents and the function calls and
40
+ # responses from the current agent.
41
+ for event in events:
42
+ if (
43
+ not event.content
44
+ or not event.content.role
45
+ or not event.content.parts
46
+ or (event.content.parts[0].text == '' and not event.content.parts[0].function_response)
47
+ ):
48
+ # Skip events without content, or generated neither by user nor by model
49
+ # or has empty text.
50
+ # E.g. events purely for mutating session states.
51
+
52
+ continue
53
+ if not _is_event_belongs_to_branch(current_branch, event):
54
+ # Skip events not belong to current branch.
55
+ continue
56
+ if _is_auth_event(event):
57
+ # Skip auth events.
58
+ continue
59
+ filtered_events.append(
60
+ _convert_foreign_event(event)
61
+ if _is_other_agent_reply(agent_name, event)
62
+ else event
63
+ )
64
+
65
+ # Rearrange events for proper function call/response pairing
66
+ result_events = filtered_events
67
+ result_events = _rearrange_events_for_async_function_responses_in_history(
68
+ result_events
69
+ )
70
+
71
+ # Convert events to contents
72
+ contents = []
73
+ for event in result_events:
74
+ content = copy.deepcopy(event.content)
75
+ remove_client_function_call_id(content)
76
+ contents.append(content)
77
+ return contents
78
+
79
+ # =============================================================================
80
+ # PATCH 2: Long-Running Tool Support
81
+ # Purpose: Modify BaseLlmFlow.run_async to properly handle long-running tools
82
+ # =============================================================================
83
+ from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow
84
+ from google.adk.agents.invocation_context import InvocationContext
85
+ from typing import AsyncGenerator
86
+
87
+ async def patch_run_async(
88
+ self, invocation_context: InvocationContext
89
+ ) -> AsyncGenerator[Event, None]:
90
+ """Runs the flow."""
91
+ while True:
92
+ last_event = None
93
+ has_long_running_call = False
94
+ async for event in self._run_one_step_async(invocation_context):
95
+ last_event = event
96
+ if event.long_running_tool_ids:
97
+ has_long_running_call = True
98
+ yield event
99
+ if not last_event or last_event.is_final_response() or has_long_running_call:
100
+ break
101
+ if last_event.partial:
102
+ # TODO: handle this in BaseLlm level.
103
+ raise ValueError(
104
+ f"Last event shouldn't be partial. LLM max output limit may be"
105
+ f' reached.'
106
+ )
107
+
108
+ def patch_adk():
109
+ """Patch the ADK to use the custom get_contents and run_async methods."""
110
+ google.adk.flows.llm_flows.contents._get_contents = _patch_get_contents
111
+ BaseLlmFlow.run_async = patch_run_async
@@ -0,0 +1,105 @@
1
+ ## Quick Summary
2
+ The `sac` (Solace AI Connector) directory provides the core implementation for hosting a Google ADK (Agent Development Kit) agent within the Solace AI Connector framework. It acts as a bridge, enabling ADK agents to communicate using the A2A (Agent-to-Agent) protocol over Solace messaging. This allows for the creation of distributed, collaborative agent systems where agents can delegate tasks, share information, and work together to solve complex problems.
3
+
4
+ The main components are `SamAgentApp`, which handles the initial setup and configuration, and `SamAgentComponent`, which hosts the ADK agent instance, manages its lifecycle, and translates between the A2A protocol and the ADK's internal event model.
5
+
6
+ ## Files Overview
7
+ - `__init__.py`: An empty file that marks the `sac` directory as a Python package.
8
+ - `app.py`: Defines a custom SAC `App` class that automatically configures Solace subscriptions and broker settings for A2A communication.
9
+ - `component.py`: The main SAC `Component` that hosts the ADK agent, manages its lifecycle, and handles all A2A protocol messaging.
10
+ - `patch_adk.py`: Contains runtime patches for the Google ADK library to enhance or correct its behavior for this specific use case.
11
+ - `task_execution_context.py`: A state management class that encapsulates all runtime information for a single, in-flight A2A task.
12
+
13
+ ## Developer API Reference
14
+
15
+ ---
16
+ ### __init__.py
17
+ **Purpose:** A standard Python file that makes the `sac` directory a package, allowing its modules to be imported.
18
+ **Import:** This file is not meant to be imported from directly.
19
+
20
+ ---
21
+ ### app.py
22
+ **Purpose:** Provides a custom SAC `App` class (`SamAgentApp`) that simplifies the configuration of an A2A agent. It automatically generates the required Solace topic subscriptions and configures the message broker based on the provided `namespace` and `agent_name` in the configuration file. This class is the main entry point for running an agent host.
23
+ **Import:** `from src.solace_agent_mesh.agent.sac.app import SamAgentApp`
24
+
25
+ **Classes:**
26
+ - `SamAgentApp(app_info: Dict[str, Any], **kwargs)` - A custom App class for the SAM Agent Host. It handles namespace prefixing, automatic subscription generation, and programmatic definition of the `SamAgentComponent`.
27
+ - `app_schema: Dict` - A class attribute that defines the comprehensive configuration schema for the agent host. This schema is used by the SAC framework to validate the application's YAML configuration file, ensuring all required parameters are present and correctly typed.
28
+
29
+ **Constants/Variables:**
30
+ - `info: Dict[str, str]` - A dictionary containing metadata about the `SamAgentApp` class, required by the SAC framework for discovery.
31
+
32
+ **Usage Examples:**
33
+ ```python
34
+ # The SamAgentApp is typically instantiated by the Solace AI Connector framework,
35
+ # not directly by a developer. The framework reads a YAML configuration file,
36
+ # validates it against the app_schema, and passes the resulting configuration
37
+ # to the SamAgentApp constructor.
38
+
39
+ # --- Example agent-config.yaml ---
40
+ # app:
41
+ # class_name: src.solace_agent_mesh.agent.sac.app.SamAgentApp
42
+ # app_config:
43
+ # namespace: "my-org/production"
44
+ # agent_name: "customer-support-agent"
45
+ # model: "gemini-1.5-pro-latest"
46
+ # tools:
47
+ # - tool_type: "builtin"
48
+ # tool_name: "file_search"
49
+ # agent_card:
50
+ # description: "An agent that can answer questions about customer accounts."
51
+ # agent_card_publishing:
52
+ # interval_seconds: 60
53
+ # agent_discovery:
54
+ # enabled: true
55
+ # inter_agent_communication:
56
+ # allow_list: ["*"]
57
+ # request_timeout_seconds: 45
58
+ # session_service:
59
+ # type: "memory"
60
+ # # ... other configuration parameters
61
+ ```
62
+
63
+ ---
64
+ ### component.py
65
+ **Purpose:** This is the core component that hosts a Google ADK agent and bridges its communication to the A2A protocol over Solace. It handles incoming task requests, manages the agent's lifecycle, processes ADK events, orchestrates tool calls (including peer agent delegation), and sends status updates and final responses. Developers can interact with this component's state and lifecycle via custom initialization and cleanup functions.
66
+ **Import:** `from src.solace_agent_mesh.agent.sac.component import SamAgentComponent`
67
+
68
+ **Classes:**
69
+ - `SamAgentComponent(**kwargs)` - A Solace AI Connector component that hosts a Google ADK agent and communicates via the A2A protocol.
70
+ - `process_event(self, event: Event)` - The main entry point for all events from the SAC framework (e.g., incoming messages, timers). This method orchestrates the processing of A2A requests.
71
+ - `handle_timer_event(self, timer_data: Dict[str, Any])` - Handles scheduled timer events, primarily used for periodically publishing the agent's discovery card.
72
+ - `handle_cache_expiry_event(self, cache_data: Dict[str, Any])` - Handles cache expiry events, used to detect timeouts for requests sent to peer agents.
73
+ - `finalize_task_success(self, a2a_context: Dict)` - An async method that finalizes a task successfully, sending the final `COMPLETED` response.
74
+ - `finalize_task_canceled(self, a2a_context: Dict)` - Finalizes a task as `CANCELED` and sends the corresponding response.
75
+ - `finalize_task_error(self, exception: Exception, a2a_context: Dict)` - An async method that finalizes a task as `FAILED`, sending an error response.
76
+ - `cleanup(self)` - Cleans up all resources when the component is shut down, including stopping the async loop and calling any custom cleanup functions.
77
+ - `set_agent_specific_state(self, key: str, value: Any)` - Sets a key-value pair in a dedicated state dictionary. This is intended for use within a custom `agent_init_function` to store state (e.g., database connections, API clients) that can be accessed by tools.
78
+ - `get_agent_specific_state(self, key: str, default: Optional[Any] = None) -> Any` - Retrieves a value from the agent-specific state dictionary. This is intended for use by tools or a custom `agent_cleanup_function`.
79
+ - `get_async_loop(self) -> Optional[asyncio.AbstractEventLoop]` - Returns the dedicated asyncio event loop used by the component for all its asynchronous operations. This is useful for scheduling custom async work from synchronous code (e.g., tools).
80
+ - `set_agent_system_instruction_string(self, instruction_string: str) -> None` - Sets a static string to be injected into the agent's system prompt. This should be called from a custom `agent_init_function`.
81
+ - `set_agent_system_instruction_callback(self, callback_function: Callable[[CallbackContext, LlmRequest], Optional[str]]) -> None` - Sets a callback function to dynamically generate parts of the system prompt at runtime. This should be called from a custom `agent_init_function`.
82
+ - `get_gateway_id(self) -> str` - Returns a unique identifier for this agent host instance, typically the agent's name.
83
+ - `submit_a2a_task(self, target_agent_name: str, a2a_message: A2AMessage, original_session_id: str, main_logical_task_id: str, user_id: str, user_config: Dict[str, Any], sub_task_id: str, function_call_id: Optional[str] = None) -> str` - Submits a task to a peer agent in a non-blocking way. This is the core mechanism for agent delegation. Returns the `sub_task_id` used for correlation.
84
+ - `get_agent_context(self) -> Dict[str, Any]` - Returns a dictionary containing context about the agent, used for interactions with the middleware system.
85
+
86
+ **Constants/Variables:**
87
+ - `info: Dict` - A dictionary containing metadata about the `SamAgentComponent` class, required by the SAC framework.
88
+ - `CORRELATION_DATA_PREFIX: str` - A public constant string used as a prefix for cache keys when tracking peer-to-peer requests.
89
+ - `HOST_COMPONENT_VERSION: str` - The version string of the host component.
90
+
91
+ **Usage Examples:**
92
+ ```python
93
+ # This component is instantiated by the SamAgentApp. Developers interact with it
94
+ # primarily through custom init/cleanup functions and by building tools that
95
+ # may need access to its state or methods.
96
+
97
+ # --- In a custom init module (e.g., my_agent_init.py) ---
98
+ import asyncio
99
+ from src.solace_agent_mesh.agent.sac.component import SamAgentComponent
100
+ from src.solace_agent_mesh.common.types import A2AMessage, TextPart
101
+
102
+ # This function would be configured in the agent's YAML config
103
+ def initialize_my_agent(host_component: SamAgentComponent, config: dict):
104
+ """Custom initialization function for the agent."""
105
+ print("Initializing my custom agent...")
@@ -0,0 +1,176 @@
1
+ """
2
+ Encapsulates the runtime state for a single, in-flight agent task.
3
+ """
4
+
5
+ import asyncio
6
+ import threading
7
+ from typing import Any, Dict, List, Optional
8
+
9
+
10
+ class TaskExecutionContext:
11
+ """
12
+ A class to hold all runtime state and control mechanisms for a single agent task.
13
+ This object is created when a task is initiated and destroyed when it completes,
14
+ ensuring that all state is properly encapsulated and cleaned up.
15
+ """
16
+
17
+ def __init__(self, task_id: str, a2a_context: Dict[str, Any]):
18
+ """
19
+ Initializes the TaskExecutionContext.
20
+
21
+ Args:
22
+ task_id: The unique logical ID of the task.
23
+ a2a_context: The original, rich context dictionary from the A2A request.
24
+ """
25
+ self.task_id: str = task_id
26
+ self.a2a_context: Dict[str, Any] = a2a_context
27
+ self.cancellation_event: asyncio.Event = asyncio.Event()
28
+ self.streaming_buffer: str = ""
29
+ self.run_based_response_buffer: str = ""
30
+ self.peer_sub_tasks: List[Dict[str, Any]] = []
31
+ self.parallel_tool_calls: Dict[str, Dict[str, Any]] = {}
32
+ self.produced_artifacts: List[Dict[str, Any]] = []
33
+ self.artifact_signals_to_return: List[Dict[str, Any]] = []
34
+ self.event_loop: Optional[asyncio.AbstractEventLoop] = None
35
+ self.lock: threading.Lock = threading.Lock()
36
+
37
+ def cancel(self) -> None:
38
+ """Signals that the task should be cancelled."""
39
+ self.cancellation_event.set()
40
+
41
+ def is_cancelled(self) -> bool:
42
+ """Checks if the cancellation event has been set."""
43
+ return self.cancellation_event.is_set()
44
+
45
+ def append_to_streaming_buffer(self, text: str) -> None:
46
+ """Appends a chunk of text to the main streaming buffer."""
47
+ with self.lock:
48
+ self.streaming_buffer += text
49
+
50
+ def flush_streaming_buffer(self) -> str:
51
+ """Returns the entire content of the streaming buffer and clears it."""
52
+ with self.lock:
53
+ content = self.streaming_buffer
54
+ self.streaming_buffer = ""
55
+ return content
56
+
57
+ def get_streaming_buffer_content(self) -> str:
58
+ """Returns the current buffer content without clearing it."""
59
+ with self.lock:
60
+ return self.streaming_buffer
61
+
62
+ def append_to_run_based_buffer(self, text: str) -> None:
63
+ """Appends a chunk of processed text to the run-based response buffer."""
64
+ with self.lock:
65
+ self.run_based_response_buffer += text
66
+
67
+ def register_peer_sub_task(self, sub_task_id: str, peer_agent_name: str) -> None:
68
+ """Adds a new peer sub-task to the tracking list."""
69
+ with self.lock:
70
+ self.peer_sub_tasks.append(
71
+ {"sub_task_id": sub_task_id, "peer_agent_name": peer_agent_name}
72
+ )
73
+
74
+ def register_parallel_call_sent(self, invocation_id: str) -> None:
75
+ """
76
+ Registers that a new parallel tool call has been sent for a specific invocation.
77
+ Initializes the tracking dictionary for the invocation if it's the first call,
78
+ otherwise increments the total.
79
+ """
80
+ with self.lock:
81
+ if invocation_id not in self.parallel_tool_calls:
82
+ self.parallel_tool_calls[invocation_id] = {
83
+ "total": 1,
84
+ "completed": 0,
85
+ "results": [],
86
+ }
87
+ else:
88
+ self.parallel_tool_calls[invocation_id]["total"] += 1
89
+
90
+ def handle_peer_timeout(
91
+ self,
92
+ sub_task_id: str,
93
+ correlation_data: Dict,
94
+ timeout_sec: int,
95
+ invocation_id: str,
96
+ ) -> bool:
97
+ """
98
+ Handles a timeout for a specific peer sub-task for a given invocation.
99
+
100
+ Updates the parallel call tracker with a formatted error message and returns
101
+ True if all peer calls for that invocation are now complete.
102
+
103
+ Args:
104
+ sub_task_id: The ID of the sub-task that timed out.
105
+ correlation_data: The correlation data associated with the sub-task.
106
+ timeout_sec: The timeout duration in seconds.
107
+ invocation_id: The ID of the invocation that initiated the parallel calls.
108
+
109
+ Returns:
110
+ A boolean indicating if all parallel calls for the invocation are now complete.
111
+ """
112
+ peer_tool_name = correlation_data.get("peer_tool_name", "unknown_tool")
113
+ timeout_message = f"Request to peer agent tool '{peer_tool_name}' timed out after {timeout_sec} seconds."
114
+
115
+ # The payload must be a dictionary with a 'result' key containing the simple string.
116
+ # This ensures the ADK framework presents it to the LLM as a simple text response.
117
+ simple_error_payload = {"result": timeout_message}
118
+
119
+ current_result = {
120
+ "adk_function_call_id": correlation_data.get("adk_function_call_id"),
121
+ "peer_tool_name": peer_tool_name,
122
+ "payload": simple_error_payload,
123
+ }
124
+ return self.record_parallel_result(current_result, invocation_id)
125
+
126
+ def record_parallel_result(self, result: Dict, invocation_id: str) -> bool:
127
+ """
128
+ Records a result for a parallel tool call for a specific invocation
129
+ and returns True if all calls for that invocation are now complete.
130
+ """
131
+ with self.lock:
132
+ invocation_state = self.parallel_tool_calls.get(invocation_id)
133
+ if not invocation_state:
134
+ # This can happen if a response arrives after a timeout has cleaned up.
135
+ return False
136
+
137
+ invocation_state["results"].append(result)
138
+ invocation_state["completed"] += 1
139
+ return invocation_state["completed"] >= invocation_state["total"]
140
+
141
+ def clear_parallel_invocation_state(self, invocation_id: str) -> None:
142
+ """
143
+ Removes the state for a completed parallel tool call invocation.
144
+ """
145
+ with self.lock:
146
+ if invocation_id in self.parallel_tool_calls:
147
+ del self.parallel_tool_calls[invocation_id]
148
+
149
+ def register_produced_artifact(self, filename: str, version: int) -> None:
150
+ """Adds a newly created artifact to the tracking list."""
151
+ with self.lock:
152
+ self.produced_artifacts.append({"filename": filename, "version": version})
153
+
154
+ def add_artifact_signal(self, signal: Dict[str, Any]) -> None:
155
+ """Adds an artifact return signal to the list in a thread-safe manner."""
156
+ with self.lock:
157
+ self.artifact_signals_to_return.append(signal)
158
+
159
+ def get_and_clear_artifact_signals(self) -> List[Dict[str, Any]]:
160
+ """
161
+ Retrieves all pending artifact signals and clears the list atomically.
162
+ """
163
+ with self.lock:
164
+ signals = list(self.artifact_signals_to_return) # Create a copy
165
+ self.artifact_signals_to_return.clear()
166
+ return signals
167
+
168
+ def set_event_loop(self, loop: asyncio.AbstractEventLoop) -> None:
169
+ """Stores a reference to the task's event loop."""
170
+ with self.lock:
171
+ self.event_loop = loop
172
+
173
+ def get_event_loop(self) -> Optional[asyncio.AbstractEventLoop]:
174
+ """Retrieves the stored event loop."""
175
+ with self.lock:
176
+ return self.event_loop
@@ -0,0 +1,3 @@
1
+ """
2
+ Contains utilities for testing the A2A agent framework.
3
+ """
@@ -0,0 +1,135 @@
1
+ """
2
+ Provides debugging utilities for the declarative test framework,
3
+ including a pretty-printer for A2A event history.
4
+ """
5
+
6
+ import json
7
+ from datetime import datetime
8
+ from typing import List, Dict, Any
9
+
10
+
11
+ def _truncate(s: str, max_len: int) -> str:
12
+ """Truncates a string if it exceeds max_len, appending '...'."""
13
+ if not isinstance(s, str):
14
+ s = str(s)
15
+ if max_len <= 0 or len(s) <= max_len:
16
+ return s
17
+ if max_len <= 3:
18
+ return s[:max_len]
19
+ return s[: max_len - 3] + "..."
20
+
21
+
22
+ def _format_a2a_parts(parts: List[Dict], max_string_length: int) -> str:
23
+ """Helper to format A2A message parts into a readable string."""
24
+ if not parts:
25
+ return "[No Parts]"
26
+
27
+ formatted_parts = []
28
+ for part in parts:
29
+ part_type = part.get("type", "unknown")
30
+ if part_type == "text":
31
+ text = part.get("text", "")
32
+ formatted_parts.append(
33
+ f" - [Text]: '{_truncate(text, max_string_length)}'"
34
+ )
35
+ elif part_type == "data":
36
+ data_content = json.dumps(part.get("data", {}))
37
+ formatted_parts.append(
38
+ f" - [Data]: {_truncate(data_content, max_string_length)}"
39
+ )
40
+ elif part_type == "file":
41
+ file_info = part.get("file", {})
42
+ name = file_info.get("name", "N/A")
43
+ mime = file_info.get("mimeType", "N/A")
44
+ formatted_parts.append(
45
+ f" - [File]: {_truncate(name, max_string_length)} ({mime})"
46
+ )
47
+ else:
48
+ part_str = json.dumps(part)
49
+ formatted_parts.append(
50
+ f" - [Unknown Part]: {_truncate(part_str, max_string_length)}"
51
+ )
52
+ return "\n".join(formatted_parts)
53
+
54
+
55
+ def _truncate_dict_strings(data: Any, max_len: int) -> Any:
56
+ """Recursively traverses a dict/list and truncates all string values."""
57
+ if max_len <= 0:
58
+ return data
59
+ if isinstance(data, dict):
60
+ return {k: _truncate_dict_strings(v, max_len) for k, v in data.items()}
61
+ elif isinstance(data, list):
62
+ return [_truncate_dict_strings(item, max_len) for item in data]
63
+ elif isinstance(data, str):
64
+ return _truncate(data, max_len)
65
+ else:
66
+ return data
67
+
68
+
69
+ def pretty_print_event_history(
70
+ event_history: List[Dict[str, Any]], max_string_length: int = 200
71
+ ):
72
+ """
73
+ Formats and prints a list of A2A event payloads for debugging.
74
+ """
75
+ if not event_history:
76
+ print("\n" + "=" * 25 + " NO EVENTS RECORDED " + "=" * 25)
77
+ print("--- The test failed before any events were received from the agent. ---")
78
+ print("=" * 70 + "\n")
79
+ return
80
+
81
+ print("\n" + "=" * 25 + " TASK EVENT HISTORY " + "=" * 25)
82
+ for i, event_payload in enumerate(event_history):
83
+ print(f"\n--- Event {i+1} ---")
84
+
85
+ event_type = "Unknown Event"
86
+ details = ""
87
+
88
+ result = event_payload.get("result", {})
89
+ error = event_payload.get("error")
90
+
91
+ if error:
92
+ event_type = "Error Response"
93
+ details += f" Error Code: {error.get('code')}\n"
94
+ details += f" Error Message: {_truncate(error.get('message'), max_string_length)}\n"
95
+
96
+ elif result.get("status") and result.get("final") is not None:
97
+ event_type = "Task Status Update"
98
+ status = result.get("status", {})
99
+ state = status.get("state", "UNKNOWN")
100
+ message = status.get("message", {})
101
+ parts = message.get("parts", [])
102
+ details += f" State: {state}\n"
103
+ details += f" Parts:\n{_format_a2a_parts(parts, max_string_length)}\n"
104
+
105
+ elif result.get("status") and result.get("sessionId"):
106
+ event_type = "Final Task Response"
107
+ status = result.get("status", {})
108
+ state = status.get("state", "UNKNOWN")
109
+ message = status.get("message", {})
110
+ parts = message.get("parts", [])
111
+ details += f" Final State: {state}\n"
112
+ details += (
113
+ f" Final Parts:\n{_format_a2a_parts(parts, max_string_length)}\n"
114
+ )
115
+ if result.get("artifacts"):
116
+ artifacts_str = json.dumps(result.get("artifacts"))
117
+ details += (
118
+ f" Artifacts: {_truncate(artifacts_str, max_string_length)}\n"
119
+ )
120
+
121
+ elif result.get("artifact"):
122
+ event_type = "Task Artifact Update"
123
+ artifact = result.get("artifact", {})
124
+ details += f" Artifact Name: {_truncate(artifact.get('name'), max_string_length)}\n"
125
+ details += f" Artifact Parts:\n{_format_a2a_parts(artifact.get('parts', []), max_string_length)}\n"
126
+
127
+ print(f"Type: {event_type}")
128
+ if details:
129
+ print(details, end="")
130
+
131
+ print("Raw Payload:")
132
+ truncated_payload = _truncate_dict_strings(event_payload, max_string_length)
133
+ print(json.dumps(truncated_payload, indent=2))
134
+
135
+ print("=" * 70 + "\n")
@@ -0,0 +1,90 @@
1
+ ## Quick Summary
2
+
3
+ The `testing` directory provides a suite of utilities designed to facilitate the testing of the A2A (Agent-to-Agent) framework. Its primary function is to offer tools that simplify debugging and validation of agent interactions during test runs, particularly for declarative tests.
4
+
5
+ ## Files Overview
6
+
7
+ - `__init__.py`: Marks the directory as a Python package.
8
+ - `debug_utils.py`: Provides helper functions for debugging test failures, most notably a pretty-printer for A2A event histories.
9
+
10
+ ## Developer API Reference
11
+
12
+ ### debug_utils.py
13
+
14
+ **Purpose:** This module contains utilities to help developers debug failing tests by providing human-readable representations of complex data structures, such as the event history from an A2A task.
15
+
16
+ **Import:** `from agent.testing.debug_utils import pretty_print_event_history`
17
+
18
+ **Functions:**
19
+
20
+ - `pretty_print_event_history(event_history: List[Dict[str, Any]], max_string_length: int = 200) -> None`
21
+ Formats and prints a list of A2A event payloads to the console in a structured, readable format. It intelligently parses different event types (status updates, final responses, errors) and truncates long strings to keep the output concise. This is invaluable for quickly diagnosing why a test failed by inspecting the sequence of events leading up to the failure.
22
+
23
+ **Usage Examples:**
24
+
25
+ ```python
26
+ # Show how to import and use the main classes/functions
27
+ from agent.testing.debug_utils import pretty_print_event_history
28
+ from typing import List, Dict, Any
29
+
30
+ # Example event history captured during a test run
31
+ sample_event_history: List[Dict[str, Any]] = [
32
+ {
33
+ "result": {
34
+ "status": {
35
+ "state": "EXECUTING",
36
+ "message": {
37
+ "parts": [
38
+ {"type": "text", "text": "Okay, I am starting the process to find the latest sales report."}
39
+ ]
40
+ },
41
+ },
42
+ "final": False,
43
+ }
44
+ },
45
+ {
46
+ "result": {
47
+ "artifact": {
48
+ "name": "sales_report_q4.pdf",
49
+ "parts": [
50
+ {
51
+ "type": "file",
52
+ "file": {
53
+ "name": "sales_report_q4.pdf",
54
+ "mimeType": "application/pdf",
55
+ "uri": "file://path/to/sales_report_q4.pdf"
56
+ }
57
+ }
58
+ ]
59
+ }
60
+ }
61
+ },
62
+ {
63
+ "error": {
64
+ "code": "INTERNAL_ERROR",
65
+ "message": "Failed to access the database due to a connection timeout. The database server at db.example.com might be down or unreachable. Please check the server status and network connectivity."
66
+ }
67
+ },
68
+ {
69
+ "result": {
70
+ "status": {
71
+ "state": "FAILED",
72
+ "message": {
73
+ "parts": [
74
+ {"type": "text", "text": "I encountered an error and could not complete the task."}
75
+ ]
76
+ }
77
+ },
78
+ "sessionId": "task-12345",
79
+ }
80
+ }
81
+ ]
82
+
83
+ # In a test's `tearDown` or `except` block, you can print the history.
84
+ print("A test failed! Dumping the event history for review:")
85
+ pretty_print_event_history(sample_event_history, max_string_length=100)
86
+
87
+ # Example with no events
88
+ print("\n--- Example with no events ---")
89
+ pretty_print_event_history([])
90
+ ```
@@ -0,0 +1,14 @@
1
+ """
2
+ This __init__.py file ensures that all built-in tool modules are imported
3
+ when the 'tools' package is loaded. This is crucial for the declarative
4
+ tool registration pattern, as it triggers the `tool_registry.register()`
5
+ calls within each tool module.
6
+ """
7
+
8
+ from . import builtin_artifact_tools
9
+ from . import builtin_data_analysis_tools
10
+ from . import general_agent_tools
11
+ from . import audio_tools
12
+ from . import image_tools
13
+ from . import web_tools
14
+ from . import test_tools