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,613 @@
1
+ """
2
+ Refactored evaluation runner with improved structure and readability.
3
+ This module orchestrates the evaluation of AI models against test cases.
4
+ """
5
+
6
+ import json
7
+ import os
8
+ import sys
9
+ import time
10
+ import subprocess
11
+ import requests
12
+ import uuid
13
+ import shutil
14
+ import mimetypes
15
+ import threading
16
+ from pathlib import Path
17
+
18
+ from typing import Dict, List, Optional, Tuple, Any
19
+ from dataclasses import dataclass
20
+ from dotenv import load_dotenv
21
+ from .config_loader import ConfigLoader
22
+ from .message_organizer import MessageOrganizer
23
+ from .summary_builder import SummaryBuilder
24
+ from .subscriber import Subscriber
25
+ from .evaluator import EvaluationOrchestrator
26
+ from .report_generator import ReportGenerator
27
+
28
+ SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
29
+
30
+
31
+ @dataclass
32
+ class EvaluationConfig:
33
+ """Centralized configuration with validation and defaults."""
34
+
35
+ # Constants
36
+ DEFAULT_STARTUP_WAIT_TIME = 20
37
+ DEFAULT_TEST_TIMEOUT = 60
38
+
39
+ def __init__(self, config_data: Dict[str, Any]):
40
+ load_dotenv()
41
+ host = os.getenv("REST_API_HOST", "0.0.0.0")
42
+ port = os.getenv("REST_API_PORT", "8080")
43
+ self.API_BASE_URL = f"http://{host}:{port}/api/v2"
44
+ self.config_data = config_data
45
+ self.agents = config_data.get("agents", [])
46
+ self.test_cases = config_data.get("test_cases", [])
47
+ self.llm_models = config_data.get("llm_models", [])
48
+ self.runs = config_data.get("runs", 1)
49
+ self.results_dir_name = config_data.get("results_dir_name", "tests")
50
+
51
+ self._validate_config()
52
+
53
+ def _validate_config(self):
54
+ """Validate required configuration fields."""
55
+ if not self.agents:
56
+ raise ValueError("'agents' configuration is required and cannot be empty")
57
+ if not self.test_cases:
58
+ raise ValueError(
59
+ "'test_cases' configuration is required and cannot be empty"
60
+ )
61
+ if not self.llm_models:
62
+ raise ValueError(
63
+ "'llm_models' configuration is required and cannot be empty"
64
+ )
65
+
66
+
67
+ @dataclass
68
+ class TestRun:
69
+ """Represents a single test execution with all necessary parameters."""
70
+
71
+ agent: str
72
+ query: str
73
+ artifacts: List[str]
74
+ wait_time: int
75
+ test_case_file: str
76
+ run_num: int
77
+
78
+ @property
79
+ def test_case_id(self) -> str:
80
+ """Extract test case ID from filename."""
81
+ base_name = os.path.basename(self.test_case_file)
82
+ return os.path.splitext(base_name)[0].replace(".test", "")
83
+
84
+
85
+ class ProcessManager:
86
+ """Manages subprocess lifecycle for the Solace AI Connector."""
87
+
88
+ def __init__(self, config: EvaluationConfig):
89
+ self.config = config
90
+ self.process: Optional[subprocess.Popen] = None
91
+ self.namespace: Optional[str] = None
92
+
93
+ def start_services(self) -> Tuple[subprocess.Popen, str]:
94
+ """Start the Solace AI Connector and return process and namespace."""
95
+ load_dotenv()
96
+ self.namespace = f"eval-{uuid.uuid4()}"
97
+ os.environ["NAMESPACE"] = self.namespace
98
+
99
+ agent_files = self.config.agents
100
+
101
+ command = [sys.executable, "-m", "solace_ai_connector.main", *agent_files]
102
+
103
+ print("Starting Solace AI Connector as a subprocess...")
104
+ project_root = os.path.abspath(os.path.join(SCRIPT_DIR, ".."))
105
+
106
+ self.process = subprocess.Popen(
107
+ command, stdout=sys.stdout, stderr=sys.stderr, cwd=project_root
108
+ )
109
+
110
+ print(
111
+ f"Waiting for server to start... ({self.config.DEFAULT_STARTUP_WAIT_TIME} seconds)"
112
+ )
113
+ time.sleep(self.config.DEFAULT_STARTUP_WAIT_TIME)
114
+
115
+ return self.process, self.namespace
116
+
117
+ def stop_services(self, subscriber: Optional[Subscriber] = None):
118
+ """Clean up running processes."""
119
+ if subscriber:
120
+ print("--- Terminating subscriber ---")
121
+ subscriber.stop()
122
+ subscriber.join()
123
+ print("Subscriber terminated.")
124
+
125
+ if self.process:
126
+ print("--- Terminating subprocess ---")
127
+ self.process.terminate()
128
+ try:
129
+ self.process.wait(timeout=5)
130
+ print("Subprocess terminated.")
131
+ except subprocess.TimeoutExpired:
132
+ print("Subprocess did not terminate gracefully, killing.")
133
+ self.process.kill()
134
+
135
+ print("Process cleanup completed.")
136
+
137
+
138
+ class TaskService:
139
+ """Handles task submission and tracking."""
140
+
141
+ def __init__(self, config: EvaluationConfig):
142
+ self.config = config
143
+ self.base_url = config.API_BASE_URL
144
+
145
+ def submit_task(
146
+ self, agent_name: str, message: str, artifact_paths: Optional[List[str]] = None
147
+ ) -> Optional[str]:
148
+ """Submit a test case to the agent and return the task ID."""
149
+ print("--- Sending test request ---")
150
+ url = f"{self.base_url}/tasks"
151
+ data = {
152
+ "agent_name": agent_name,
153
+ "prompt": message,
154
+ }
155
+
156
+ files_to_upload = []
157
+ if artifact_paths:
158
+ files_to_upload = self._prepare_file_uploads(artifact_paths)
159
+
160
+ try:
161
+ with requests.Session() as session:
162
+ response = session.post(url, data=data, files=files_to_upload)
163
+
164
+ response.raise_for_status()
165
+ task_id = response.json()["taskId"]
166
+ print(f"Task submitted with ID: {task_id}")
167
+ return task_id
168
+
169
+ except requests.RequestException as e:
170
+ print(f"Failed to submit task: {e}")
171
+ return None
172
+ finally:
173
+ self._close_file_uploads(files_to_upload)
174
+
175
+ def _prepare_file_uploads(self, artifact_paths: List[str]) -> List[Tuple]:
176
+ """Prepare file uploads for the request."""
177
+ files_to_upload = []
178
+ for path in artifact_paths:
179
+ mimetype, _ = mimetypes.guess_type(path)
180
+ if mimetype is None:
181
+ mimetype = "text/plain"
182
+ files_to_upload.append(
183
+ ("files", (os.path.basename(path), open(path, "rb"), mimetype))
184
+ )
185
+ return files_to_upload
186
+
187
+ def _close_file_uploads(self, files_to_upload: List[Tuple]):
188
+ """Close file handles after upload."""
189
+ for _, file_tuple in files_to_upload:
190
+ file_tuple[1].close()
191
+
192
+
193
+ class FileService:
194
+ """Handles file operations and path management."""
195
+
196
+ @staticmethod
197
+ def ensure_directory(path: str):
198
+ """Ensure directory exists, create if necessary."""
199
+ os.makedirs(path, exist_ok=True)
200
+
201
+ @staticmethod
202
+ def remove_directory(path: str):
203
+ """Remove directory and all contents."""
204
+ if os.path.exists(path):
205
+ shutil.rmtree(path)
206
+
207
+ @staticmethod
208
+ def save_json(data: Any, filepath: str):
209
+ """Save data as JSON to file."""
210
+ with open(filepath, "w") as f:
211
+ json.dump(data, f, indent=4)
212
+
213
+ @staticmethod
214
+ def load_json(filepath: str) -> Any:
215
+ """Load JSON data from file."""
216
+ with open(filepath, "r") as f:
217
+ return json.load(f)
218
+
219
+
220
+ class TestRunBuilder:
221
+ """Builds test run configurations from test cases."""
222
+
223
+ def __init__(self, config: EvaluationConfig):
224
+ self.config = config
225
+
226
+ def build_test_runs(self) -> List[TestRun]:
227
+ """Build all test runs from configuration."""
228
+ test_runs = []
229
+
230
+ for test_case_path in self.config.test_cases:
231
+ test_case = FileService.load_json(test_case_path)
232
+
233
+ artifact_paths = self._get_artifact_paths(test_case, test_case_path)
234
+
235
+ test_case_file = os.path.basename(test_case_path)
236
+ for run_num in range(1, self.config.runs + 1):
237
+ test_run = TestRun(
238
+ agent=test_case["target_agent"],
239
+ query=test_case["query"],
240
+ artifacts=artifact_paths,
241
+ wait_time=test_case.get(
242
+ "wait_time", self.config.DEFAULT_TEST_TIMEOUT
243
+ ),
244
+ test_case_file=test_case_path,
245
+ run_num=run_num,
246
+ )
247
+ test_runs.append(test_run)
248
+
249
+ return test_runs
250
+
251
+ def _get_artifact_paths(self, test_case: Dict, test_case_path: str) -> List[str]:
252
+ """Extract artifact paths from test case."""
253
+ artifact_paths = []
254
+ if "artifacts" in test_case:
255
+ test_case_dir = os.path.dirname(test_case_path)
256
+ for artifact in test_case["artifacts"]:
257
+ if artifact.get("type") == "file":
258
+ artifact_paths.append(os.path.join(test_case_dir, artifact["path"]))
259
+ return artifact_paths
260
+
261
+
262
+ class TestExecutor:
263
+ """Executes individual test runs."""
264
+
265
+ def __init__(self, task_service: TaskService, file_service: FileService):
266
+ self.task_service = task_service
267
+ self.file_service = file_service
268
+
269
+ def execute_test(
270
+ self,
271
+ test_run: TestRun,
272
+ model_results_path: str,
273
+ task_mappings: Dict[str, str],
274
+ subscriber: Subscriber,
275
+ ) -> bool:
276
+ """Execute a single test case and wait for completion."""
277
+ print(
278
+ f"--- Starting test: {test_run.test_case_file} (run {test_run.run_num}) ---"
279
+ )
280
+
281
+ # Submit the task
282
+ task_id = self.task_service.submit_task(
283
+ test_run.agent, test_run.query, test_run.artifacts
284
+ )
285
+
286
+ if not task_id:
287
+ print(
288
+ f"Failed to start test case: {test_run.test_case_file} (run {test_run.run_num})"
289
+ )
290
+ return False
291
+
292
+ # Set up result directory
293
+ run_dir = os.path.join(
294
+ model_results_path, test_run.test_case_id, f"run_{test_run.run_num}"
295
+ )
296
+ self.file_service.ensure_directory(run_dir)
297
+
298
+ # Save test case path for summary builder
299
+ test_info = {"path": test_run.test_case_file}
300
+ self.file_service.save_json(
301
+ test_info, os.path.join(run_dir, "test_case_info.json")
302
+ )
303
+
304
+ # Track the task
305
+ task_mappings[task_id] = run_dir
306
+ subscriber.active_tasks.add(task_id)
307
+
308
+ # Wait for completion
309
+ return self._wait_for_completion(task_id, test_run.wait_time, subscriber)
310
+
311
+ def _wait_for_completion(
312
+ self, task_id: str, wait_time: int, subscriber: Subscriber
313
+ ) -> bool:
314
+ """Wait for task completion with timeout."""
315
+ print(
316
+ f"Waiting for task {task_id} to complete (timeout: {wait_time} seconds)..."
317
+ )
318
+
319
+ start_time = time.time()
320
+ while task_id in subscriber.active_tasks:
321
+ if time.time() - start_time > wait_time:
322
+ print(f"Task {task_id} timed out after {wait_time} seconds")
323
+ subscriber.active_tasks.discard(task_id)
324
+ return False
325
+ time.sleep(1)
326
+
327
+ print(f"Task {task_id} completed successfully")
328
+ return True
329
+
330
+
331
+ class ModelEvaluator:
332
+ """Handles the evaluation of a single model."""
333
+
334
+ def __init__(self, config: EvaluationConfig):
335
+ self.config = config
336
+ self.process_manager = ProcessManager(config)
337
+ self.task_service = TaskService(config)
338
+ self.file_service = FileService()
339
+ self.test_builder = TestRunBuilder(config)
340
+ self.test_executor = TestExecutor(self.task_service, self.file_service)
341
+
342
+ def evaluate_model(
343
+ self, model_config: Dict[str, Any], base_results_path: str
344
+ ) -> float:
345
+ """Evaluate a single model and return execution time."""
346
+ model_name = model_config["name"]
347
+ print(f"--- Starting evaluation for model: {model_name} ---")
348
+ start_time = time.time()
349
+
350
+ # Set environment variables for the model
351
+ self._set_model_environment(model_config)
352
+
353
+ # Set up paths
354
+ model_results_path = os.path.join(base_results_path, model_name)
355
+ self.file_service.ensure_directory(model_results_path)
356
+
357
+ # Start services
358
+ app_process, namespace = self.process_manager.start_services()
359
+
360
+ # Set up subscriber
361
+ subscriber = self._setup_subscriber(namespace, model_results_path)
362
+
363
+ try:
364
+ # Execute tests
365
+ successful_tests = self._execute_all_tests(model_results_path, subscriber)
366
+ print(f"--- Completed {successful_tests} tests successfully ---")
367
+
368
+ except Exception as e:
369
+ print(f"Error during test case execution for model {model_name}: {e}")
370
+ finally:
371
+ # Cleanup
372
+ task_mappings = getattr(self, "_task_mappings", {})
373
+ self._cleanup_model_evaluation(
374
+ app_process, subscriber, model_results_path, task_mappings
375
+ )
376
+
377
+ end_time = time.time()
378
+ execution_time = end_time - start_time
379
+ print(
380
+ f"--- Evaluation for model: {model_name} complete in {execution_time:.2f} seconds ---"
381
+ )
382
+
383
+ return execution_time
384
+
385
+ def _set_model_environment(self, model_config: Dict[str, Any]):
386
+ """Set environment variables for the model."""
387
+ for key, value in model_config.get("env", {}).items():
388
+ os.environ[key] = value
389
+
390
+ def _setup_subscriber(self, namespace: str, model_results_path: str) -> Subscriber:
391
+ """Set up and start the subscriber."""
392
+ subscription_ready_event = threading.Event()
393
+ subscriber = Subscriber(
394
+ namespace, set(), None, subscription_ready_event, model_results_path
395
+ )
396
+ subscriber.start()
397
+
398
+ print("Waiting for subscriber to be ready...")
399
+ subscription_ready_event.wait()
400
+ print("Subscriber is ready.")
401
+
402
+ return subscriber
403
+
404
+ def _execute_all_tests(
405
+ self, model_results_path: str, subscriber: Subscriber
406
+ ) -> int:
407
+ """Execute all test cases and return count of successful tests."""
408
+ test_runs = self.test_builder.build_test_runs()
409
+
410
+ self._task_mappings = {}
411
+ total_tests = len(test_runs)
412
+ successful_tests = 0
413
+
414
+ print(f"--- Starting sequential execution of {total_tests} tests ---")
415
+
416
+ for i, test_run in enumerate(test_runs, 1):
417
+ print(f"--- Test {i}/{total_tests} ---")
418
+ success = self.test_executor.execute_test(
419
+ test_run, model_results_path, self._task_mappings, subscriber
420
+ )
421
+ if success:
422
+ successful_tests += 1
423
+ else:
424
+ print(f"Test {i} failed or timed out")
425
+
426
+ return successful_tests
427
+
428
+ def _cleanup_model_evaluation(
429
+ self,
430
+ app_process: subprocess.Popen,
431
+ subscriber: Subscriber,
432
+ model_results_path: str,
433
+ task_mappings: Dict[str, str],
434
+ ):
435
+ """Clean up after model evaluation."""
436
+ self.process_manager.stop_services(subscriber)
437
+
438
+ # Save task mappings
439
+ mappings_file = os.path.join(model_results_path, "task_mappings.json")
440
+ self.file_service.save_json(task_mappings, mappings_file)
441
+ print(f"Task mappings saved to {mappings_file}")
442
+
443
+
444
+ class ResultsProcessor:
445
+ """Handles post-processing of evaluation results."""
446
+
447
+ def __init__(self, file_service: FileService):
448
+ self.file_service = file_service
449
+ self.summary_builder = SummaryBuilder()
450
+
451
+ def summarize_results(self, base_results_path: str):
452
+ """Generate summaries for all test results."""
453
+ print("--- Summarizing results ---")
454
+
455
+ for model_name in os.listdir(base_results_path):
456
+ model_path = os.path.join(base_results_path, model_name)
457
+ if not os.path.isdir(model_path):
458
+ continue
459
+
460
+ self._process_model_results(model_path)
461
+
462
+ def _process_model_results(self, model_path: str):
463
+ """Process results for a single model."""
464
+ for test_case_name in os.listdir(model_path):
465
+ test_case_path = os.path.join(model_path, test_case_name)
466
+ if not os.path.isdir(test_case_path):
467
+ continue
468
+
469
+ self._process_test_case_results(test_case_path)
470
+
471
+ def _process_test_case_results(self, test_case_path: str):
472
+ """Process results for a single test case."""
473
+ for run_name in os.listdir(test_case_path):
474
+ run_path = os.path.join(test_case_path, run_name)
475
+ if not os.path.isdir(run_path):
476
+ continue
477
+
478
+ messages_file = os.path.join(run_path, "messages.json")
479
+ if os.path.exists(messages_file):
480
+ summary_data = self.summary_builder.summarize_run(messages_file)
481
+ summary_file = os.path.join(run_path, "summary.json")
482
+ self.file_service.save_json(summary_data, summary_file)
483
+ print(f"Summary created for {run_path}")
484
+
485
+
486
+ class EvaluationRunner:
487
+ """Main orchestrator that coordinates the entire evaluation process."""
488
+
489
+ def __init__(self):
490
+ self.config: Optional[EvaluationConfig] = None
491
+ self.file_service = FileService()
492
+ self.results_processor = ResultsProcessor(self.file_service)
493
+ self.report_generator: Optional[ReportGenerator] = None
494
+
495
+ def run_evaluation(self, config_path: str):
496
+ """Main entry point for the evaluation process."""
497
+ start_time = time.time()
498
+
499
+ try:
500
+ # Load and validate configuration
501
+ self._load_configuration(config_path)
502
+
503
+ # Set up results directory in the current working directory
504
+ base_results_path = Path.cwd() / "results" / self.config.results_dir_name
505
+ self._setup_results_directory(base_results_path)
506
+
507
+ # Run model evaluations
508
+ model_execution_times = self._evaluate_all_models(str(base_results_path))
509
+
510
+ # Post-process results
511
+ self._post_process_results(
512
+ str(base_results_path), model_execution_times, config_path
513
+ )
514
+
515
+ # Save overall statistics
516
+ self._save_execution_stats(str(base_results_path), start_time)
517
+
518
+ # Generate reports
519
+ self._generate_reports(config_path, base_results_path)
520
+
521
+ except Exception as e:
522
+ print(f"Evaluation failed: {e}")
523
+ raise
524
+
525
+ def _load_configuration(self, config_path: str):
526
+ """Load and validate the evaluation configuration."""
527
+ config_loader = ConfigLoader(config_path)
528
+ config_data = config_loader.load_config()
529
+ self.config = EvaluationConfig(config_data)
530
+ self.report_generator = ReportGenerator(config_path)
531
+ print("Configuration loaded and validated successfully.")
532
+
533
+ def _setup_results_directory(self, base_results_path: Path):
534
+ """Set up the results directory."""
535
+ # Clean up existing results
536
+ self.file_service.remove_directory(str(base_results_path))
537
+ self.file_service.ensure_directory(str(base_results_path))
538
+
539
+ print(f"Results directory set up at: {base_results_path}")
540
+
541
+ def _evaluate_all_models(self, base_results_path: str) -> Dict[str, float]:
542
+ """Evaluate all configured models."""
543
+ model_execution_times = {}
544
+
545
+ for model_config in self.config.llm_models:
546
+ model_evaluator = ModelEvaluator(self.config)
547
+ execution_time = model_evaluator.evaluate_model(
548
+ model_config, base_results_path
549
+ )
550
+ model_execution_times[model_config["name"]] = execution_time
551
+
552
+ return model_execution_times
553
+
554
+ def _post_process_results(
555
+ self,
556
+ base_results_path: str,
557
+ model_execution_times: Dict[str, float],
558
+ config_path: str,
559
+ ):
560
+ """Post-process evaluation results."""
561
+ # Categorize messages using the refactored categorizer
562
+ print("--- Categorizing messages ---")
563
+ message_organizer = MessageOrganizer()
564
+ categorization_results = message_organizer.categorize_all_messages(
565
+ base_results_path
566
+ )
567
+ print("--- Message categorization finished ---")
568
+
569
+ # Generate summaries
570
+ self.results_processor.summarize_results(base_results_path)
571
+
572
+ # Run evaluation
573
+ print("--- Starting evaluation of results ---")
574
+ evaluation_orchestrator = EvaluationOrchestrator(config_path)
575
+ evaluation_orchestrator.run_evaluation(base_results_path, model_execution_times)
576
+ print("--- Evaluation of results finished ---")
577
+
578
+ def _generate_reports(self, config_path: str, base_results_path: Path):
579
+ """Generate evaluation reports."""
580
+ if self.report_generator:
581
+ self.report_generator.generate_report(base_results_path)
582
+
583
+ def _save_execution_stats(self, base_results_path: str, start_time: float):
584
+ """Save overall execution statistics."""
585
+ end_time = time.time()
586
+ total_execution_time = end_time - start_time
587
+
588
+ stats = {"total_execution_time": total_execution_time}
589
+ stats_path = os.path.join(base_results_path, "stats.json")
590
+ self.file_service.save_json(stats, stats_path)
591
+
592
+ print(f"Overall stats written to {stats_path}")
593
+ print(f"Total execution time: {total_execution_time:.2f} seconds")
594
+
595
+
596
+ def main(config_path: str):
597
+ """Main entry point for the evaluation script."""
598
+ orchestrator = EvaluationRunner()
599
+ orchestrator.run_evaluation(config_path)
600
+
601
+
602
+ if __name__ == "__main__":
603
+ # This allows the script to be run standalone with a config path argument
604
+ import argparse
605
+
606
+ parser = argparse.ArgumentParser(description="Run the SAM evaluation suite.")
607
+ parser.add_argument(
608
+ "test_suite_config_path",
609
+ type=str,
610
+ help="Path to the evaluation test_suite_config.json file.",
611
+ )
612
+ args = parser.parse_args()
613
+ main(args.test_suite_config_path)