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,613 @@
1
+ """
2
+ Refactored report generator with improved structure and readability.
3
+ This module generates HTML reports from evaluation results with a clean, modular architecture.
4
+ """
5
+
6
+ import json
7
+ import logging
8
+ from datetime import datetime
9
+ from dataclasses import dataclass, field
10
+ from typing import Dict, Any
11
+ from pathlib import Path
12
+
13
+ # Set up logging
14
+ logging.basicConfig(level=logging.INFO)
15
+ logger = logging.getLogger(__name__)
16
+
17
+ # Import configuration and data services
18
+ from .config_loader import ConfigLoader
19
+ from .report_data_processor import ReportDataProcessor
20
+
21
+
22
+ @dataclass
23
+ class ReportConfig:
24
+ """Centralized configuration for report generation."""
25
+
26
+ def __init__(self, config_data: Dict[str, Any], results_dir: Path):
27
+ self.config_data = config_data
28
+ self.results_dir_name = config_data.get("results_dir_name", "tests")
29
+
30
+ # Calculate paths
31
+ self.script_dir = Path(__file__).parent
32
+ self.results_dir = results_dir
33
+ self.templates_dir = self.script_dir / "report" / "templates"
34
+ self.report_dir = self.script_dir / "report"
35
+ self.output_path = self.results_dir / "report.html"
36
+
37
+ self._validate_config()
38
+
39
+ def _validate_config(self):
40
+ """Validate configuration and required directories."""
41
+ if not self.templates_dir.exists():
42
+ raise FileNotFoundError(
43
+ f"Templates directory not found: {self.templates_dir}"
44
+ )
45
+ if not self.report_dir.exists():
46
+ raise FileNotFoundError(f"Report directory not found: {self.report_dir}")
47
+
48
+
49
+ @dataclass
50
+ class TemplateAssets:
51
+ """Container for all template files and CSS content."""
52
+
53
+ header: str = ""
54
+ footer: str = ""
55
+ benchmark_info: str = ""
56
+ chart_section: str = ""
57
+ detailed_breakdown: str = ""
58
+ css_content: str = ""
59
+ modal_html: str = ""
60
+ modal_css: str = ""
61
+ modal_script_js: str = ""
62
+ modal_chart_functions_js: str = ""
63
+
64
+
65
+ @dataclass
66
+ class ReportMetadata:
67
+ """Report generation metadata."""
68
+
69
+ generation_time: str = field(
70
+ default_factory=lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S")
71
+ )
72
+ timestamp: str = field(
73
+ default_factory=lambda: datetime.now().strftime("%B %d, %Y at %I:%M %p")
74
+ )
75
+
76
+
77
+ class ConfigurationService:
78
+ """Handles configuration loading and validation."""
79
+
80
+ def __init__(self, config_path: str):
81
+ self.config_loader = ConfigLoader(config_path)
82
+ self._config_cache = None
83
+
84
+ def get_config(self) -> Dict[str, Any]:
85
+ """Get the main configuration."""
86
+ if self._config_cache is None:
87
+ self._config_cache = self.config_loader.load_config()
88
+ return self._config_cache
89
+
90
+ def create_report_config(self, results_dir: Path) -> ReportConfig:
91
+ """Create a ReportConfig instance."""
92
+ config_data = self.get_config()
93
+ return ReportConfig(config_data, results_dir)
94
+
95
+
96
+ class FileService:
97
+ """Handles all file I/O operations with proper error handling."""
98
+
99
+ @staticmethod
100
+ def read_file(filepath: Path, encoding: str = "utf-8") -> str:
101
+ """Read file content with error handling."""
102
+ try:
103
+ with open(filepath, "r", encoding=encoding) as f:
104
+ return f.read()
105
+ except FileNotFoundError:
106
+ logger.error(f"File not found: {filepath}")
107
+ raise
108
+ except Exception as e:
109
+ logger.error(f"Error reading file {filepath}: {e}")
110
+ raise
111
+
112
+ @staticmethod
113
+ def write_file(filepath: Path, content: str, encoding: str = "utf-8"):
114
+ """Write file content with error handling."""
115
+ try:
116
+ # Ensure directory exists
117
+ filepath.parent.mkdir(parents=True, exist_ok=True)
118
+
119
+ with open(filepath, "w", encoding=encoding) as f:
120
+ f.write(content)
121
+ logger.info(f"File written successfully: {filepath}")
122
+ except Exception as e:
123
+ logger.error(f"Error writing file {filepath}: {e}")
124
+ raise
125
+
126
+ @staticmethod
127
+ def file_exists(filepath: Path) -> bool:
128
+ """Check if file exists."""
129
+ return filepath.exists() and filepath.is_file()
130
+
131
+
132
+ class TemplateService:
133
+ """Manages HTML template loading and validation."""
134
+
135
+ def __init__(self, file_service: FileService):
136
+ self.file_service = file_service
137
+
138
+ def load_template(self, template_path: Path) -> str:
139
+ """Load a single template file."""
140
+ if not self.file_service.file_exists(template_path):
141
+ logger.warning(f"Template file not found: {template_path}")
142
+ return ""
143
+
144
+ try:
145
+ content = self.file_service.read_file(template_path)
146
+ logger.debug(f"Loaded template: {template_path}")
147
+ return content
148
+ except Exception as e:
149
+ logger.error(f"Failed to load template {template_path}: {e}")
150
+ return ""
151
+
152
+ def load_all_templates(self, config: ReportConfig) -> TemplateAssets:
153
+ """Load all required templates including modal components."""
154
+ logger.info("Loading HTML templates and modal components...")
155
+
156
+ assets = TemplateAssets()
157
+
158
+ # Define template files
159
+ template_files = {
160
+ "header": config.templates_dir / "header.html",
161
+ "footer": config.templates_dir / "footer.html",
162
+ "benchmark_info": config.report_dir / "benchmark_info.html",
163
+ "chart_section": config.report_dir / "chart_section.html",
164
+ "detailed_breakdown": config.report_dir / "detailed_breakdown.html",
165
+ "modal_html": config.report_dir / "modal.html",
166
+ }
167
+
168
+ # Load each template
169
+ for template_name, template_path in template_files.items():
170
+ content = self.load_template(template_path)
171
+ setattr(assets, template_name, content)
172
+
173
+ logger.info(f"Loaded {len(template_files)} templates")
174
+ return assets
175
+
176
+
177
+ class AssetService:
178
+ """Handles CSS and static asset management including modal assets."""
179
+
180
+ def __init__(self, file_service: FileService):
181
+ self.file_service = file_service
182
+
183
+ def load_css_content(self, report_dir: Path) -> str:
184
+ """Load CSS content for inlining."""
185
+ css_path = report_dir / "performance_metrics_styles.css"
186
+
187
+ if not self.file_service.file_exists(css_path):
188
+ logger.warning(f"CSS file not found: {css_path}")
189
+ return ""
190
+
191
+ try:
192
+ content = self.file_service.read_file(css_path)
193
+ logger.info(f"Loaded CSS content from: {css_path}")
194
+ return content
195
+ except Exception as e:
196
+ logger.error(f"Failed to load CSS content: {e}")
197
+ return ""
198
+
199
+ def load_modal_assets(self, report_dir: Path, assets: TemplateAssets):
200
+ """Load modal CSS and JavaScript files."""
201
+ logger.info("Loading modal assets...")
202
+
203
+ # Load modal CSS
204
+ modal_css_path = report_dir / "modal_styles.css"
205
+ if self.file_service.file_exists(modal_css_path):
206
+ try:
207
+ assets.modal_css = self.file_service.read_file(modal_css_path)
208
+ logger.info("Loaded modal CSS")
209
+ except Exception as e:
210
+ logger.error(f"Failed to load modal CSS: {e}")
211
+
212
+ # Load modal JavaScript files
213
+ modal_script_path = report_dir / "modal_script.js"
214
+ if self.file_service.file_exists(modal_script_path):
215
+ try:
216
+ assets.modal_script_js = self.file_service.read_file(modal_script_path)
217
+ logger.info("Loaded modal script JS")
218
+ except Exception as e:
219
+ logger.error(f"Failed to load modal script JS: {e}")
220
+
221
+ modal_chart_functions_path = report_dir / "modal_chart_functions.js"
222
+ if self.file_service.file_exists(modal_chart_functions_path):
223
+ try:
224
+ assets.modal_chart_functions_js = self.file_service.read_file(
225
+ modal_chart_functions_path
226
+ )
227
+ logger.info("Loaded modal chart functions JS")
228
+ except Exception as e:
229
+ logger.error(f"Failed to load modal chart functions JS: {e}")
230
+
231
+ logger.info("Modal assets loaded successfully")
232
+
233
+
234
+ class TemplateProcessor:
235
+ """Handles template rendering and placeholder replacement."""
236
+
237
+ @staticmethod
238
+ def replace_placeholders(template_content: str, data: Dict[str, Any]) -> str:
239
+ """Replace placeholders in template with actual data."""
240
+ try:
241
+ # Convert all values to strings for replacement
242
+ replacements = {}
243
+ for key, value in data.items():
244
+ if isinstance(value, (list, dict)):
245
+ replacements[key] = (
246
+ json.dumps(value) if key.endswith("_data") else str(value)
247
+ )
248
+ else:
249
+ replacements[key] = str(value) if value is not None else ""
250
+
251
+ # Perform replacements
252
+ processed_content = template_content
253
+ for placeholder, value in replacements.items():
254
+ # Handle different placeholder formats
255
+ placeholder_patterns = [
256
+ f"{{{{{placeholder.upper()}}}}}", # {{PLACEHOLDER}} (uppercase)
257
+ f"{{{{{placeholder}}}}}", # {{placeholder}} (original case)
258
+ f"{{{placeholder}}}", # {placeholder}
259
+ ]
260
+
261
+ for pattern in placeholder_patterns:
262
+ processed_content = processed_content.replace(pattern, value)
263
+
264
+ return processed_content
265
+
266
+ except Exception as e:
267
+ logger.error(f"Error replacing placeholders: {e}")
268
+ return template_content
269
+
270
+ def process_template_with_data(
271
+ self, template_content: str, data: Dict[str, Any]
272
+ ) -> str:
273
+ """Process a template with evaluation data."""
274
+ if not template_content:
275
+ logger.warning("Empty template content provided")
276
+ return ""
277
+
278
+ return self.replace_placeholders(template_content, data)
279
+
280
+
281
+ class CSSProcessor:
282
+ """Handles CSS processing and inlining including modal styles."""
283
+
284
+ @staticmethod
285
+ def inline_css(html_content: str, css_content: str) -> str:
286
+ """Inline CSS content into HTML."""
287
+ if not css_content:
288
+ return html_content
289
+
290
+ try:
291
+ # Replace CSS link with inline styles
292
+ css_link_pattern = (
293
+ '<link rel="stylesheet" href="performance_metrics_styles.css">'
294
+ )
295
+ inline_css_block = f"<style>\n{css_content}\n</style>"
296
+
297
+ processed_html = html_content.replace(css_link_pattern, inline_css_block)
298
+ logger.debug("CSS content inlined successfully")
299
+ return processed_html
300
+
301
+ except Exception as e:
302
+ logger.error(f"Error inlining CSS: {e}")
303
+ return html_content
304
+
305
+ @staticmethod
306
+ def inline_modal_assets(html_content: str, assets: TemplateAssets) -> str:
307
+ """Inline modal CSS and JavaScript into HTML."""
308
+ try:
309
+ # Combine all CSS (main + modal)
310
+ combined_css = assets.css_content
311
+ if assets.modal_css:
312
+ combined_css += f"\n\n/* Modal Styles */\n{assets.modal_css}"
313
+
314
+ # Replace CSS link with combined inline styles OR add to existing style block
315
+ css_link_pattern = (
316
+ '<link rel="stylesheet" href="performance_metrics_styles.css">'
317
+ )
318
+ if css_link_pattern in html_content:
319
+ inline_css_block = f"<style>\n{combined_css}\n</style>"
320
+ processed_html = html_content.replace(
321
+ css_link_pattern, inline_css_block
322
+ )
323
+ else:
324
+ # If no CSS link found, add styles to existing style block or create new one
325
+ if "<style>" in html_content:
326
+ # Add modal CSS to existing style block
327
+ if assets.modal_css:
328
+ style_end = html_content.find("</style>")
329
+ if style_end != -1:
330
+ processed_html = (
331
+ html_content[:style_end]
332
+ + f"\n\n/* Modal Styles */\n{assets.modal_css}\n"
333
+ + html_content[style_end:]
334
+ )
335
+ else:
336
+ processed_html = html_content
337
+ else:
338
+ processed_html = html_content
339
+ else:
340
+ # Create new style block in head
341
+ head_end = html_content.find("</head>")
342
+ if head_end != -1:
343
+ inline_css_block = f"<style>\n{combined_css}\n</style>\n"
344
+ processed_html = (
345
+ html_content[:head_end]
346
+ + inline_css_block
347
+ + html_content[head_end:]
348
+ )
349
+ else:
350
+ processed_html = html_content
351
+
352
+ # Add Chart.js CDN and modal HTML before closing body tag
353
+ chart_js_cdn = (
354
+ '<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>'
355
+ )
356
+ chart_js_boxplot_cdn = '<script src="https://cdn.jsdelivr.net/npm/@sgratzl/chartjs-chart-boxplot"></script>'
357
+
358
+ # Combine modal JavaScript
359
+ modal_js = ""
360
+ if assets.modal_chart_functions_js:
361
+ modal_js += f"\n<script>\n{assets.modal_chart_functions_js}\n</script>"
362
+ if assets.modal_script_js:
363
+ modal_js += f"\n<script>\n{assets.modal_script_js}\n</script>"
364
+
365
+ # Insert modal HTML and scripts before closing body tag
366
+ modal_content = ""
367
+ if assets.modal_html:
368
+ modal_content += f"\n{assets.modal_html}"
369
+
370
+ modal_content += f"\n{chart_js_cdn}"
371
+ modal_content += f"\n{chart_js_boxplot_cdn}"
372
+ modal_content += modal_js
373
+
374
+ # Insert before closing body tag
375
+ if "</body>" in processed_html:
376
+ processed_html = processed_html.replace(
377
+ "</body>", f"{modal_content}\n</body>"
378
+ )
379
+ else:
380
+ # Fallback: append to end
381
+ processed_html += modal_content
382
+
383
+ logger.debug("Modal assets inlined successfully")
384
+ return processed_html
385
+
386
+ except Exception as e:
387
+ logger.error(f"Error inlining modal assets: {e}")
388
+ return html_content
389
+
390
+
391
+ class HTMLAssembler:
392
+ """Assembles final HTML document from processed templates."""
393
+
394
+ def __init__(
395
+ self, template_processor: TemplateProcessor, css_processor: CSSProcessor
396
+ ):
397
+ self.template_processor = template_processor
398
+ self.css_processor = css_processor
399
+
400
+ def assemble_report(
401
+ self,
402
+ assets: TemplateAssets,
403
+ evaluation_data: Dict[str, Any],
404
+ detailed_data: Dict[str, Any],
405
+ ) -> str:
406
+ """Assemble the complete HTML report with modal functionality."""
407
+ logger.info("Assembling HTML report with modal functionality...")
408
+
409
+ try:
410
+ # Process each template with appropriate data
411
+ processed_templates = {}
412
+
413
+ # Process templates with evaluation data
414
+ eval_templates = ["header", "benchmark_info"]
415
+ for template_name in eval_templates:
416
+ template_content = getattr(assets, template_name)
417
+ processed_templates[template_name] = (
418
+ self.template_processor.process_template_with_data(
419
+ template_content, evaluation_data
420
+ )
421
+ )
422
+
423
+ # Process templates with detailed data
424
+ detail_templates = ["chart_section", "detailed_breakdown"]
425
+ for template_name in detail_templates:
426
+ template_content = getattr(assets, template_name)
427
+ processed_templates[template_name] = (
428
+ self.template_processor.process_template_with_data(
429
+ template_content, detailed_data
430
+ )
431
+ )
432
+
433
+ # Footer doesn't need data processing
434
+ processed_templates["footer"] = assets.footer
435
+
436
+ # Combine all templates in order
437
+ html_sections = [
438
+ processed_templates["header"],
439
+ processed_templates["benchmark_info"],
440
+ processed_templates["chart_section"],
441
+ processed_templates["detailed_breakdown"],
442
+ processed_templates["footer"],
443
+ ]
444
+
445
+ final_html = "".join(html_sections)
446
+
447
+ # Inline CSS and modal assets into the complete HTML
448
+ final_html = self.css_processor.inline_modal_assets(final_html, assets)
449
+
450
+ logger.info("HTML report with modal functionality assembled successfully")
451
+ return final_html
452
+
453
+ except Exception as e:
454
+ logger.error(f"Error assembling HTML report: {e}")
455
+ raise
456
+
457
+
458
+ class ReportSummaryService:
459
+ """Generates report summary information."""
460
+
461
+ @staticmethod
462
+ def generate_summary(
463
+ evaluation_data: Dict[str, Any], output_path: Path
464
+ ) -> Dict[str, str]:
465
+ """Generate summary information for logging."""
466
+ models = evaluation_data.get("models", [])
467
+ execution_time = evaluation_data.get(
468
+ "total_execution_time_formatted", "Not available"
469
+ )
470
+
471
+ return {
472
+ "output_path": str(output_path),
473
+ "models_evaluated": ", ".join(models) if models else "No models found",
474
+ "total_execution_time": execution_time,
475
+ "models_count": str(len(models)),
476
+ "generation_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
477
+ }
478
+
479
+
480
+ class ReportGenerator:
481
+ """Main orchestrator that coordinates the entire report generation process."""
482
+
483
+ def __init__(self, config_path: str):
484
+ # Initialize services
485
+ self.config_service = ConfigurationService(config_path)
486
+ self.file_service = FileService()
487
+ self.template_service = TemplateService(self.file_service)
488
+ self.asset_service = AssetService(self.file_service)
489
+ self.template_processor = TemplateProcessor()
490
+ self.css_processor = CSSProcessor()
491
+ self.html_assembler = HTMLAssembler(self.template_processor, self.css_processor)
492
+ self.summary_service = ReportSummaryService()
493
+
494
+ # Initialize data processor
495
+ self.data_processor = ReportDataProcessor()
496
+
497
+ def generate_report(self, results_dir: Path):
498
+ """Main entry point for report generation."""
499
+ logger.info("--- Starting HTML report generation ---")
500
+
501
+ try:
502
+ # Load configuration
503
+ config = self._load_configuration(results_dir)
504
+
505
+ # Load templates and assets
506
+ assets = self._load_assets(config)
507
+
508
+ # Get evaluation data
509
+ evaluation_data, detailed_data = self._get_evaluation_data(config)
510
+
511
+ # Generate HTML report
512
+ html_content = self._generate_html_content(
513
+ assets, evaluation_data, detailed_data
514
+ )
515
+
516
+ # Write report to file
517
+ self._write_report(html_content, config.output_path)
518
+
519
+ # Generate and log summary
520
+ self._log_summary(evaluation_data, config.output_path)
521
+
522
+ logger.info("--- HTML report generation completed successfully ---")
523
+
524
+ except Exception as e:
525
+ logger.error(f"Report generation failed: {e}")
526
+ raise
527
+
528
+ def _load_configuration(self, results_dir: Path) -> ReportConfig:
529
+ """Load and validate configuration."""
530
+ logger.info("Loading configuration...")
531
+ config = self.config_service.create_report_config(results_dir)
532
+ logger.info(f"Configuration loaded. Results directory: {config.results_dir}")
533
+ return config
534
+
535
+ def _load_assets(self, config: ReportConfig) -> TemplateAssets:
536
+ """Load all templates and assets including modal components."""
537
+ logger.info("Loading templates and assets...")
538
+
539
+ # Load templates
540
+ assets = self.template_service.load_all_templates(config)
541
+
542
+ # Load CSS content
543
+ assets.css_content = self.asset_service.load_css_content(config.report_dir)
544
+
545
+ # Load modal assets
546
+ self.asset_service.load_modal_assets(config.report_dir, assets)
547
+
548
+ logger.info("Templates and assets loaded successfully")
549
+ return assets
550
+
551
+ def _get_evaluation_data(
552
+ self, config: ReportConfig
553
+ ) -> tuple[Dict[str, Any], Dict[str, Any]]:
554
+ """Get evaluation data from the data processor."""
555
+ logger.info("Extracting evaluation data...")
556
+
557
+ evaluation_data = self.data_processor.get_evaluation_data(config.results_dir)
558
+ detailed_data = self.data_processor.get_detailed_evaluation_data(
559
+ config.results_dir
560
+ )
561
+
562
+ logger.info("Evaluation data extracted successfully")
563
+ return evaluation_data, detailed_data
564
+
565
+ def _generate_html_content(
566
+ self,
567
+ assets: TemplateAssets,
568
+ evaluation_data: Dict[str, Any],
569
+ detailed_data: Dict[str, Any],
570
+ ) -> str:
571
+ """Generate the complete HTML content."""
572
+ logger.info("Generating HTML content...")
573
+
574
+ html_content = self.html_assembler.assemble_report(
575
+ assets, evaluation_data, detailed_data
576
+ )
577
+
578
+ logger.info("HTML content generated successfully")
579
+ return html_content
580
+
581
+ def _write_report(self, html_content: str, output_path: Path):
582
+ """Write the HTML report to file."""
583
+ logger.info(f"Writing report to: {output_path}")
584
+ self.file_service.write_file(output_path, html_content)
585
+
586
+ def _log_summary(self, evaluation_data: Dict[str, Any], output_path: Path):
587
+ """Log summary information about the generated report."""
588
+ summary = self.summary_service.generate_summary(evaluation_data, output_path)
589
+
590
+ logger.info("--- Report Generation Summary ---")
591
+ logger.info(f"Report generated at: {summary['output_path']}")
592
+ logger.info(f"Models evaluated: {summary['models_evaluated']}")
593
+ logger.info(f"Total execution time: {summary['total_execution_time']}")
594
+ logger.info(f"Generation completed at: {summary['generation_time']}")
595
+
596
+
597
+ def main(config_path: str = "evaluation/test_suite_config.json"):
598
+ """Main entry point for the report generator."""
599
+ try:
600
+ generator = ReportGenerator(config_path)
601
+ # For standalone execution, calculate results_dir based on config
602
+ config_data = generator.config_service.get_config()
603
+ results_dir_name = config_data.get("results_dir_name", "tests")
604
+ script_dir = Path(__file__).parent
605
+ results_dir = script_dir / "results" / results_dir_name
606
+ generator.generate_report(results_dir)
607
+ except Exception as e:
608
+ logger.error(f"Report generation failed: {e}")
609
+ raise
610
+
611
+
612
+ if __name__ == "__main__":
613
+ main()