solace-agent-mesh 0.2.4__py3-none-any.whl → 1.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (521) hide show
  1. solace_agent_mesh/__init__.py +5 -0
  2. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  3. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  4. solace_agent_mesh/agent/adk/callbacks.py +1716 -0
  5. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  6. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  7. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  8. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  9. solace_agent_mesh/agent/adk/runner.py +357 -0
  10. solace_agent_mesh/agent/adk/services.py +240 -0
  11. solace_agent_mesh/agent/adk/setup.py +751 -0
  12. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  13. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  14. solace_agent_mesh/agent/agent_llm.txt +41 -0
  15. solace_agent_mesh/agent/protocol/event_handlers.py +1444 -0
  16. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  17. solace_agent_mesh/agent/sac/app.py +640 -0
  18. solace_agent_mesh/agent/sac/component.py +3496 -0
  19. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  20. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  21. solace_agent_mesh/agent/sac/task_execution_context.py +185 -0
  22. solace_agent_mesh/agent/testing/__init__.py +3 -0
  23. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  24. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  25. solace_agent_mesh/agent/tools/__init__.py +14 -0
  26. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  27. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  28. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  29. solace_agent_mesh/agent/tools/general_agent_tools.py +571 -0
  30. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  31. solace_agent_mesh/agent/tools/peer_agent_tool.py +290 -0
  32. solace_agent_mesh/agent/tools/registry.py +36 -0
  33. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  34. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  35. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  38. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  39. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  40. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  41. solace_agent_mesh/assets/docs/404.html +16 -0
  42. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  43. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  46. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  54. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  55. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  57. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  58. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  105. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/f897a61a.f8c53b0f.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js +2 -0
  132. solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js.LICENSE.txt +81 -0
  133. solace_agent_mesh/assets/docs/assets/js/runtime~main.d5133813.js +1 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +77 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  165. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  167. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  168. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  170. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  171. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  172. solace_agent_mesh/assets/docs/lunr-index-1754075282978.json +1 -0
  173. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc-1754075282978.json +1 -0
  175. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  176. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  177. solace_agent_mesh/cli/__init__.py +1 -1
  178. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  179. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  181. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  183. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  184. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  185. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  186. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  187. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  188. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  189. solace_agent_mesh/cli/commands/init_cmd/env_step.py +205 -0
  190. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  191. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +407 -0
  192. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  193. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  194. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +139 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
  201. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  202. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  203. solace_agent_mesh/cli/main.py +17 -294
  204. solace_agent_mesh/cli/utils.py +135 -204
  205. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-D11Lmy9p.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/assets/main-Gfk3BYn5.js +663 -0
  210. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  211. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  212. solace_agent_mesh/common/__init__.py +1 -0
  213. solace_agent_mesh/common/a2a_protocol.py +564 -0
  214. solace_agent_mesh/common/agent_registry.py +42 -0
  215. solace_agent_mesh/common/client/__init__.py +4 -0
  216. solace_agent_mesh/common/client/card_resolver.py +21 -0
  217. solace_agent_mesh/common/client/client.py +85 -0
  218. solace_agent_mesh/common/client/client_llm.txt +133 -0
  219. solace_agent_mesh/common/common_llm.txt +144 -0
  220. solace_agent_mesh/common/constants.py +1 -14
  221. solace_agent_mesh/common/middleware/__init__.py +12 -0
  222. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  223. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  224. solace_agent_mesh/common/middleware/registry.py +125 -0
  225. solace_agent_mesh/common/server/__init__.py +4 -0
  226. solace_agent_mesh/common/server/server.py +122 -0
  227. solace_agent_mesh/common/server/server_llm.txt +169 -0
  228. solace_agent_mesh/common/server/task_manager.py +291 -0
  229. solace_agent_mesh/common/server/utils.py +28 -0
  230. solace_agent_mesh/common/services/__init__.py +4 -0
  231. solace_agent_mesh/common/services/employee_service.py +162 -0
  232. solace_agent_mesh/common/services/identity_service.py +129 -0
  233. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  234. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  235. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  236. solace_agent_mesh/common/services/services_llm.txt +132 -0
  237. solace_agent_mesh/common/types.py +411 -0
  238. solace_agent_mesh/common/utils/__init__.py +7 -0
  239. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  240. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  241. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  242. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  243. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  244. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  245. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  246. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  247. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  248. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  249. solace_agent_mesh/common/utils/initializer.py +51 -0
  250. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  251. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  252. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  253. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  254. solace_agent_mesh/config_portal/backend/common.py +66 -24
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +164 -0
  258. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
  259. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
  260. solace_agent_mesh/config_portal/backend/server.py +551 -181
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-_7yox_eh.js +48 -0
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-e5c3acfe.js +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  267. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  268. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  269. solace_agent_mesh/core_a2a/__init__.py +1 -0
  270. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  271. solace_agent_mesh/core_a2a/service.py +331 -0
  272. solace_agent_mesh/evaluation/config_loader.py +657 -0
  273. solace_agent_mesh/evaluation/evaluator.py +667 -0
  274. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  275. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  276. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  277. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  278. solace_agent_mesh/evaluation/report/modal.html +59 -0
  279. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  280. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  281. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  282. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  283. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  284. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  285. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  286. solace_agent_mesh/evaluation/report_generator.py +613 -0
  287. solace_agent_mesh/evaluation/run.py +613 -0
  288. solace_agent_mesh/evaluation/subscriber.py +872 -0
  289. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  290. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  291. solace_agent_mesh/gateway/base/__init__.py +1 -0
  292. solace_agent_mesh/gateway/base/app.py +266 -0
  293. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  294. solace_agent_mesh/gateway/base/component.py +1542 -0
  295. solace_agent_mesh/gateway/base/task_context.py +74 -0
  296. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  297. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  298. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  299. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  300. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  301. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  302. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  303. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  304. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  305. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  306. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  307. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +827 -0
  308. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  309. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  310. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  311. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  312. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  313. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  314. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  315. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  316. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  317. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  318. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  319. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  320. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  321. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  322. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  323. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  324. solace_agent_mesh/llm.txt +228 -0
  325. solace_agent_mesh/llm_detail.txt +2835 -0
  326. solace_agent_mesh/templates/agent_template.yaml +53 -0
  327. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  328. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  329. solace_agent_mesh/templates/gateway_component_template.py +431 -0
  330. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  331. solace_agent_mesh/templates/logging_config_template.ini +64 -0
  332. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  333. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  334. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  335. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  336. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  337. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  338. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  339. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  340. solace_agent_mesh/templates/shared_config.yaml +66 -0
  341. solace_agent_mesh/templates/templates_llm.txt +147 -0
  342. solace_agent_mesh/templates/webui.yaml +53 -0
  343. solace_agent_mesh-1.0.2.dist-info/METADATA +432 -0
  344. solace_agent_mesh-1.0.2.dist-info/RECORD +361 -0
  345. solace_agent_mesh-1.0.2.dist-info/entry_points.txt +3 -0
  346. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.dist-info}/licenses/LICENSE +1 -1
  347. solace_agent_mesh/agents/base_agent_component.py +0 -256
  348. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  349. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  350. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  351. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  352. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  353. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  354. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  355. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  356. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  357. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  358. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  359. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  360. solace_agent_mesh/agents/slack/__init__.py +0 -1
  361. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  362. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  363. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  364. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  365. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  366. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  367. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  368. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  369. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  370. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  371. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  372. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  373. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  374. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  375. solace_agent_mesh/cli/commands/add/add.py +0 -88
  376. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  377. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  378. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  379. solace_agent_mesh/cli/commands/build.py +0 -670
  380. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  382. solace_agent_mesh/cli/commands/config.py +0 -29
  383. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  384. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  385. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  386. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  387. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  388. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  389. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  390. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  391. solace_agent_mesh/cli/commands/init/init.py +0 -92
  392. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  393. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  394. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  395. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  396. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  397. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  398. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  399. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  400. solace_agent_mesh/cli/commands/run.py +0 -68
  401. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  402. solace_agent_mesh/cli/config.py +0 -85
  403. solace_agent_mesh/common/action.py +0 -91
  404. solace_agent_mesh/common/action_list.py +0 -37
  405. solace_agent_mesh/common/action_response.py +0 -340
  406. solace_agent_mesh/common/mysql_database.py +0 -40
  407. solace_agent_mesh/common/postgres_database.py +0 -85
  408. solace_agent_mesh/common/prompt_templates.py +0 -28
  409. solace_agent_mesh/common/stimulus_utils.py +0 -152
  410. solace_agent_mesh/common/time.py +0 -24
  411. solace_agent_mesh/common/utils.py +0 -712
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-a-zJ6rLx.js +0 -46
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  414. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  415. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-44c41103.js +0 -1
  416. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  417. solace_agent_mesh/configs/agent_global.yaml +0 -74
  418. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  419. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  420. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  421. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  422. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  423. solace_agent_mesh/configs/monitor.yaml +0 -0
  424. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  425. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  426. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  427. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  428. solace_agent_mesh/configs/service_llm.yaml +0 -265
  429. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  430. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  431. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  432. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  433. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  434. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  435. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  436. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  437. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  438. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  439. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  440. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  441. solace_agent_mesh/orchestrator/__init__.py +0 -0
  442. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  443. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  444. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  445. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  446. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  447. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  448. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  449. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  450. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  451. solace_agent_mesh/services/__init__.py +0 -0
  452. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  453. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  454. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  455. solace_agent_mesh/services/common/__init__.py +0 -4
  456. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  457. solace_agent_mesh/services/common/singleton.py +0 -18
  458. solace_agent_mesh/services/file_service/__init__.py +0 -14
  459. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  460. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  461. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  462. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  463. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  464. solace_agent_mesh/services/file_service/file_service.py +0 -437
  465. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  466. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  467. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  468. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  469. solace_agent_mesh/services/history_service/__init__.py +0 -3
  470. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  471. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  472. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  473. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  474. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  475. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  476. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  477. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  478. solace_agent_mesh/services/history_service/history_service.py +0 -413
  479. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  480. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  481. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  482. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  483. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  484. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  485. solace_agent_mesh/templates/action.py +0 -38
  486. solace_agent_mesh/templates/agent.py +0 -29
  487. solace_agent_mesh/templates/agent.yaml +0 -70
  488. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  489. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  490. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  491. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  492. solace_agent_mesh/templates/gateway_base.py +0 -15
  493. solace_agent_mesh/templates/gateway_input.py +0 -98
  494. solace_agent_mesh/templates/gateway_output.py +0 -71
  495. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  496. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  497. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  498. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  499. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  500. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  501. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  502. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  503. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  504. solace_agent_mesh/templates/web-flows.yaml +0 -76
  505. solace_agent_mesh/tools/__init__.py +0 -0
  506. solace_agent_mesh/tools/components/__init__.py +0 -0
  507. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  508. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  509. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  510. solace_agent_mesh-0.2.4.dist-info/METADATA +0 -176
  511. solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
  512. solace_agent_mesh-0.2.4.dist-info/entry_points.txt +0 -3
  513. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  517. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  518. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  519. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  520. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  521. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.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,185 @@
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.active_peer_sub_tasks: Dict[str, 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(
68
+ self, sub_task_id: str, correlation_data: Dict[str, Any]
69
+ ) -> None:
70
+ """Adds a new peer sub-task's correlation data to the tracking dictionary."""
71
+ with self.lock:
72
+ self.active_peer_sub_tasks[sub_task_id] = correlation_data
73
+
74
+ def claim_sub_task_completion(self, sub_task_id: str) -> Optional[Dict[str, Any]]:
75
+ """
76
+ Atomically retrieves and removes a sub-task's correlation data.
77
+ This is the core atomic operation to prevent race conditions.
78
+ Returns the correlation data if the claim is successful, otherwise None.
79
+ """
80
+ with self.lock:
81
+ return self.active_peer_sub_tasks.pop(sub_task_id, None)
82
+
83
+ def register_parallel_call_sent(self, invocation_id: str) -> None:
84
+ """
85
+ Registers that a new parallel tool call has been sent for a specific invocation.
86
+ Initializes the tracking dictionary for the invocation if it's the first call,
87
+ otherwise increments the total.
88
+ """
89
+ with self.lock:
90
+ if invocation_id not in self.parallel_tool_calls:
91
+ self.parallel_tool_calls[invocation_id] = {
92
+ "total": 1,
93
+ "completed": 0,
94
+ "results": [],
95
+ }
96
+ else:
97
+ self.parallel_tool_calls[invocation_id]["total"] += 1
98
+
99
+ def handle_peer_timeout(
100
+ self,
101
+ sub_task_id: str,
102
+ correlation_data: Dict,
103
+ timeout_sec: int,
104
+ invocation_id: str,
105
+ ) -> bool:
106
+ """
107
+ Handles a timeout for a specific peer sub-task for a given invocation.
108
+
109
+ Updates the parallel call tracker with a formatted error message and returns
110
+ True if all peer calls for that invocation are now complete.
111
+
112
+ Args:
113
+ sub_task_id: The ID of the sub-task that timed out.
114
+ correlation_data: The correlation data associated with the sub-task.
115
+ timeout_sec: The timeout duration in seconds.
116
+ invocation_id: The ID of the invocation that initiated the parallel calls.
117
+
118
+ Returns:
119
+ A boolean indicating if all parallel calls for the invocation are now complete.
120
+ """
121
+ peer_tool_name = correlation_data.get("peer_tool_name", "unknown_tool")
122
+ timeout_message = f"Request to peer agent tool '{peer_tool_name}' timed out after {timeout_sec} seconds."
123
+
124
+ # The payload must be a dictionary with a 'result' key containing the simple string.
125
+ # This ensures the ADK framework presents it to the LLM as a simple text response.
126
+ simple_error_payload = {"result": timeout_message}
127
+
128
+ current_result = {
129
+ "adk_function_call_id": correlation_data.get("adk_function_call_id"),
130
+ "peer_tool_name": peer_tool_name,
131
+ "payload": simple_error_payload,
132
+ }
133
+ return self.record_parallel_result(current_result, invocation_id)
134
+
135
+ def record_parallel_result(self, result: Dict, invocation_id: str) -> bool:
136
+ """
137
+ Records a result for a parallel tool call for a specific invocation
138
+ and returns True if all calls for that invocation are now complete.
139
+ """
140
+ with self.lock:
141
+ invocation_state = self.parallel_tool_calls.get(invocation_id)
142
+ if not invocation_state:
143
+ # This can happen if a response arrives after a timeout has cleaned up.
144
+ return False
145
+
146
+ invocation_state["results"].append(result)
147
+ invocation_state["completed"] += 1
148
+ return invocation_state["completed"] >= invocation_state["total"]
149
+
150
+ def clear_parallel_invocation_state(self, invocation_id: str) -> None:
151
+ """
152
+ Removes the state for a completed parallel tool call invocation.
153
+ """
154
+ with self.lock:
155
+ if invocation_id in self.parallel_tool_calls:
156
+ del self.parallel_tool_calls[invocation_id]
157
+
158
+ def register_produced_artifact(self, filename: str, version: int) -> None:
159
+ """Adds a newly created artifact to the tracking list."""
160
+ with self.lock:
161
+ self.produced_artifacts.append({"filename": filename, "version": version})
162
+
163
+ def add_artifact_signal(self, signal: Dict[str, Any]) -> None:
164
+ """Adds an artifact return signal to the list in a thread-safe manner."""
165
+ with self.lock:
166
+ self.artifact_signals_to_return.append(signal)
167
+
168
+ def get_and_clear_artifact_signals(self) -> List[Dict[str, Any]]:
169
+ """
170
+ Retrieves all pending artifact signals and clears the list atomically.
171
+ """
172
+ with self.lock:
173
+ signals = list(self.artifact_signals_to_return) # Create a copy
174
+ self.artifact_signals_to_return.clear()
175
+ return signals
176
+
177
+ def set_event_loop(self, loop: asyncio.AbstractEventLoop) -> None:
178
+ """Stores a reference to the task's event loop."""
179
+ with self.lock:
180
+ self.event_loop = loop
181
+
182
+ def get_event_loop(self) -> Optional[asyncio.AbstractEventLoop]:
183
+ """Retrieves the stored event loop."""
184
+ with self.lock:
185
+ 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