solace-agent-mesh 1.11.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.
Files changed (624) hide show
  1. solace_agent_mesh/__init__.py +0 -0
  2. solace_agent_mesh/agent/__init__.py +0 -0
  3. solace_agent_mesh/agent/adk/__init__.py +0 -0
  4. solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
  5. solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
  6. solace_agent_mesh/agent/adk/alembic/README +74 -0
  7. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  8. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  9. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  10. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  11. solace_agent_mesh/agent/adk/app_llm_agent.py +52 -0
  12. solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
  13. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
  14. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
  15. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
  16. solace_agent_mesh/agent/adk/callbacks.py +2318 -0
  17. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
  18. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
  19. solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
  20. solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
  21. solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
  22. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
  23. solace_agent_mesh/agent/adk/runner.py +390 -0
  24. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  25. solace_agent_mesh/agent/adk/services.py +468 -0
  26. solace_agent_mesh/agent/adk/setup.py +1325 -0
  27. solace_agent_mesh/agent/adk/stream_parser.py +415 -0
  28. solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
  29. solace_agent_mesh/agent/agent_llm.txt +369 -0
  30. solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
  31. solace_agent_mesh/agent/protocol/__init__.py +0 -0
  32. solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
  33. solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
  34. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
  35. solace_agent_mesh/agent/proxies/__init__.py +0 -0
  36. solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
  37. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
  38. solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
  39. solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
  40. solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
  41. solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
  42. solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
  43. solace_agent_mesh/agent/proxies/base/app.py +100 -0
  44. solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
  45. solace_agent_mesh/agent/proxies/base/component.py +816 -0
  46. solace_agent_mesh/agent/proxies/base/config.py +85 -0
  47. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
  48. solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
  49. solace_agent_mesh/agent/sac/__init__.py +0 -0
  50. solace_agent_mesh/agent/sac/app.py +595 -0
  51. solace_agent_mesh/agent/sac/component.py +3668 -0
  52. solace_agent_mesh/agent/sac/patch_adk.py +103 -0
  53. solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
  54. solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
  55. solace_agent_mesh/agent/sac/task_execution_context.py +415 -0
  56. solace_agent_mesh/agent/testing/__init__.py +3 -0
  57. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  58. solace_agent_mesh/agent/testing/testing_llm.txt +58 -0
  59. solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
  60. solace_agent_mesh/agent/tools/__init__.py +16 -0
  61. solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
  62. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
  63. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
  64. solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
  65. solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
  66. solace_agent_mesh/agent/tools/image_tools.py +1185 -0
  67. solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
  68. solace_agent_mesh/agent/tools/registry.py +38 -0
  69. solace_agent_mesh/agent/tools/test_tools.py +136 -0
  70. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  71. solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
  72. solace_agent_mesh/agent/tools/tool_definition.py +53 -0
  73. solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
  74. solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
  75. solace_agent_mesh/agent/tools/web_tools.py +392 -0
  76. solace_agent_mesh/agent/utils/__init__.py +0 -0
  77. solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
  78. solace_agent_mesh/agent/utils/config_parser.py +49 -0
  79. solace_agent_mesh/agent/utils/context_helpers.py +77 -0
  80. solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
  81. solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
  82. solace_agent_mesh/assets/docs/404.html +16 -0
  83. solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.css +1 -0
  84. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  85. solace_agent_mesh/assets/docs/assets/images/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
  86. solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  95. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  96. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  101. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
  102. solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
  104. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/509e993c.a1fbf45a.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  131. solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
  132. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  133. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  134. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  135. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  136. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
  137. solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +1 -0
  138. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  139. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  140. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  141. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  142. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  143. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  144. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  145. solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
  146. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  147. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  148. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  149. solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
  150. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  151. solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
  152. solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
  153. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  154. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  155. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
  156. solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
  157. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  158. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  159. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  160. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  161. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  162. solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js +2 -0
  163. solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js.LICENSE.txt +61 -0
  164. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  165. solace_agent_mesh/assets/docs/assets/js/8731.6c1dbf0c.js +1 -0
  166. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  167. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  168. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  169. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  170. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  171. solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
  172. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  173. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  174. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  175. solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +1 -0
  176. solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
  177. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  178. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  179. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
  180. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  181. solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
  182. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  183. solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
  184. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  185. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  186. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  187. solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
  188. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  189. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
  190. solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
  191. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  192. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  193. solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
  194. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  195. solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
  196. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
  197. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  198. solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
  199. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
  200. solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
  201. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  202. solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
  203. solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
  204. solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
  205. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
  206. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
  207. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
  208. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
  209. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
  210. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
  211. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
  212. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
  213. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
  214. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
  215. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
  216. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  217. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  218. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +345 -0
  219. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  220. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
  221. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
  222. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
  223. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
  224. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
  225. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
  226. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  227. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +144 -0
  228. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
  229. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
  230. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
  231. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
  232. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
  233. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
  234. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
  235. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
  236. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
  237. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
  238. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
  239. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
  240. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
  241. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
  242. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
  243. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  244. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  245. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  246. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +37 -0
  247. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
  248. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  249. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +247 -0
  250. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  251. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +184 -0
  252. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  253. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
  254. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
  255. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
  256. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
  257. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
  258. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
  259. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
  260. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
  261. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
  262. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
  263. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  264. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  265. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
  266. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -0
  267. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  268. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  269. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  270. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  271. solace_agent_mesh/assets/docs/img/sam-enterprise-credentials.png +0 -0
  272. solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
  273. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  274. solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
  275. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  276. solace_agent_mesh/assets/docs/search-doc-1765810064709.json +1 -0
  277. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  278. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  279. solace_agent_mesh/cli/__init__.py +1 -0
  280. solace_agent_mesh/cli/commands/__init__.py +0 -0
  281. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  282. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  283. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +729 -0
  284. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  285. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +102 -0
  286. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
  287. solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
  288. solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
  289. solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
  290. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  291. solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
  292. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  293. solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
  294. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  295. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -0
  296. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  297. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +119 -0
  298. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
  299. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
  300. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
  301. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  302. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
  303. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
  304. solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -0
  305. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
  306. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  307. solace_agent_mesh/cli/commands/run_cmd.py +215 -0
  308. solace_agent_mesh/cli/main.py +52 -0
  309. solace_agent_mesh/cli/utils.py +262 -0
  310. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
  311. solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
  312. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  313. solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
  314. solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
  315. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
  316. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
  317. solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
  318. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  319. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  320. solace_agent_mesh/common/__init__.py +1 -0
  321. solace_agent_mesh/common/a2a/__init__.py +241 -0
  322. solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
  323. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
  324. solace_agent_mesh/common/a2a/artifact.py +368 -0
  325. solace_agent_mesh/common/a2a/events.py +213 -0
  326. solace_agent_mesh/common/a2a/message.py +375 -0
  327. solace_agent_mesh/common/a2a/protocol.py +689 -0
  328. solace_agent_mesh/common/a2a/task.py +127 -0
  329. solace_agent_mesh/common/a2a/translation.py +655 -0
  330. solace_agent_mesh/common/a2a/types.py +55 -0
  331. solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
  332. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
  333. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
  334. solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
  335. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
  336. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  337. solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
  338. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
  339. solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
  340. solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
  341. solace_agent_mesh/common/agent_registry.py +122 -0
  342. solace_agent_mesh/common/common_llm.txt +230 -0
  343. solace_agent_mesh/common/common_llm_detail.txt +2562 -0
  344. solace_agent_mesh/common/constants.py +6 -0
  345. solace_agent_mesh/common/data_parts.py +150 -0
  346. solace_agent_mesh/common/exceptions.py +49 -0
  347. solace_agent_mesh/common/middleware/__init__.py +12 -0
  348. solace_agent_mesh/common/middleware/config_resolver.py +132 -0
  349. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  350. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
  351. solace_agent_mesh/common/middleware/registry.py +127 -0
  352. solace_agent_mesh/common/oauth/__init__.py +17 -0
  353. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  354. solace_agent_mesh/common/oauth/utils.py +50 -0
  355. solace_agent_mesh/common/sac/__init__.py +0 -0
  356. solace_agent_mesh/common/sac/sac_llm.txt +71 -0
  357. solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
  358. solace_agent_mesh/common/sac/sam_component_base.py +730 -0
  359. solace_agent_mesh/common/sam_events/__init__.py +9 -0
  360. solace_agent_mesh/common/sam_events/event_service.py +208 -0
  361. solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
  362. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
  363. solace_agent_mesh/common/services/__init__.py +4 -0
  364. solace_agent_mesh/common/services/employee_service.py +164 -0
  365. solace_agent_mesh/common/services/identity_service.py +134 -0
  366. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  367. solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
  368. solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
  369. solace_agent_mesh/common/services/services_llm.txt +368 -0
  370. solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
  371. solace_agent_mesh/common/utils/__init__.py +7 -0
  372. solace_agent_mesh/common/utils/artifact_utils.py +31 -0
  373. solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
  374. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  375. solace_agent_mesh/common/utils/embeds/constants.py +56 -0
  376. solace_agent_mesh/common/utils/embeds/converter.py +447 -0
  377. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
  378. solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
  379. solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
  380. solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
  381. solace_agent_mesh/common/utils/embeds/types.py +23 -0
  382. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  383. solace_agent_mesh/common/utils/initializer.py +52 -0
  384. solace_agent_mesh/common/utils/log_formatters.py +64 -0
  385. solace_agent_mesh/common/utils/message_utils.py +80 -0
  386. solace_agent_mesh/common/utils/mime_helpers.py +172 -0
  387. solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
  388. solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
  389. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  390. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  391. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  392. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  393. solace_agent_mesh/common/utils/type_utils.py +28 -0
  394. solace_agent_mesh/common/utils/utils_llm.txt +335 -0
  395. solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
  396. solace_agent_mesh/config_portal/__init__.py +0 -0
  397. solace_agent_mesh/config_portal/backend/__init__.py +0 -0
  398. solace_agent_mesh/config_portal/backend/common.py +77 -0
  399. solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
  400. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
  401. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  402. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +166 -0
  403. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
  404. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
  405. solace_agent_mesh/config_portal/backend/server.py +644 -0
  406. solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
  407. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
  408. solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
  414. solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
  415. solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
  416. solace_agent_mesh/core_a2a/__init__.py +1 -0
  417. solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
  418. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
  419. solace_agent_mesh/core_a2a/service.py +307 -0
  420. solace_agent_mesh/evaluation/__init__.py +0 -0
  421. solace_agent_mesh/evaluation/evaluator.py +691 -0
  422. solace_agent_mesh/evaluation/message_organizer.py +553 -0
  423. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  424. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  425. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  426. solace_agent_mesh/evaluation/report/modal.html +59 -0
  427. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  428. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  429. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  430. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  431. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  432. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  433. solace_agent_mesh/evaluation/report_data_processor.py +970 -0
  434. solace_agent_mesh/evaluation/report_generator.py +607 -0
  435. solace_agent_mesh/evaluation/run.py +954 -0
  436. solace_agent_mesh/evaluation/shared/__init__.py +92 -0
  437. solace_agent_mesh/evaluation/shared/constants.py +47 -0
  438. solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
  439. solace_agent_mesh/evaluation/shared/helpers.py +35 -0
  440. solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
  441. solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
  442. solace_agent_mesh/evaluation/subscriber.py +776 -0
  443. solace_agent_mesh/evaluation/summary_builder.py +880 -0
  444. solace_agent_mesh/gateway/__init__.py +0 -0
  445. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  446. solace_agent_mesh/gateway/adapter/base.py +143 -0
  447. solace_agent_mesh/gateway/adapter/types.py +221 -0
  448. solace_agent_mesh/gateway/base/__init__.py +1 -0
  449. solace_agent_mesh/gateway/base/app.py +345 -0
  450. solace_agent_mesh/gateway/base/base_llm.txt +226 -0
  451. solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
  452. solace_agent_mesh/gateway/base/component.py +2030 -0
  453. solace_agent_mesh/gateway/base/task_context.py +75 -0
  454. solace_agent_mesh/gateway/gateway_llm.txt +369 -0
  455. solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
  456. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  457. solace_agent_mesh/gateway/generic/app.py +50 -0
  458. solace_agent_mesh/gateway/generic/component.py +727 -0
  459. solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
  460. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
  461. solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
  462. solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
  463. solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
  464. solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
  465. solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
  466. solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
  467. solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
  468. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  469. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  470. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  471. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  472. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  473. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  474. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  475. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  476. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +161 -0
  477. solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
  478. solace_agent_mesh/gateway/http_sse/app.py +351 -0
  479. solace_agent_mesh/gateway/http_sse/component.py +2360 -0
  480. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  481. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
  482. solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
  483. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
  484. solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
  485. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
  486. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
  487. solace_agent_mesh/gateway/http_sse/main.py +789 -0
  488. solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
  489. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
  490. solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
  491. solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
  492. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
  493. solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
  494. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  495. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  496. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +66 -0
  497. solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
  498. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
  499. solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
  500. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
  501. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
  502. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
  503. solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
  504. solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
  505. solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
  506. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -0
  507. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  508. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  509. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  510. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +53 -0
  511. solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
  512. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
  513. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  514. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  515. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +308 -0
  516. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
  517. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
  518. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  519. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
  520. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
  521. solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
  522. solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
  523. solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
  524. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
  525. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  526. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  527. solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +15 -0
  528. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  529. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
  530. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
  531. solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
  532. solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
  533. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
  534. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  535. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
  536. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
  537. solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
  538. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  539. solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
  540. solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
  541. solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
  542. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
  543. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
  544. solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
  545. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  546. solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
  547. solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
  548. solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
  549. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  550. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
  551. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  552. solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
  553. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  554. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  555. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
  556. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
  557. solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
  558. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  559. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  560. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +303 -0
  561. solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
  562. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
  563. solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
  564. solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
  565. solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
  566. solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
  567. solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
  568. solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
  569. solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
  570. solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
  571. solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
  572. solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
  573. solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
  574. solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
  575. solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
  576. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
  577. solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
  578. solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
  579. solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
  580. solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
  581. solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
  582. solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
  583. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  584. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
  585. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
  586. solace_agent_mesh/llm.txt +228 -0
  587. solace_agent_mesh/llm_detail.txt +2835 -0
  588. solace_agent_mesh/services/__init__.py +0 -0
  589. solace_agent_mesh/services/platform/__init__.py +18 -0
  590. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  591. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  592. solace_agent_mesh/services/platform/alembic.ini +109 -0
  593. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  594. solace_agent_mesh/services/platform/api/dependencies.py +147 -0
  595. solace_agent_mesh/services/platform/api/main.py +280 -0
  596. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  597. solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
  598. solace_agent_mesh/services/platform/app.py +114 -0
  599. solace_agent_mesh/services/platform/component.py +235 -0
  600. solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
  601. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
  602. solace_agent_mesh/templates/agent_template.yaml +53 -0
  603. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  604. solace_agent_mesh/templates/gateway_app_template.py +75 -0
  605. solace_agent_mesh/templates/gateway_component_template.py +484 -0
  606. solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
  607. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  608. solace_agent_mesh/templates/main_orchestrator.yaml +66 -0
  609. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  610. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  611. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  612. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +60 -0
  613. solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
  614. solace_agent_mesh/templates/plugin_readme_template.md +12 -0
  615. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  616. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  617. solace_agent_mesh/templates/shared_config.yaml +112 -0
  618. solace_agent_mesh/templates/templates_llm.txt +147 -0
  619. solace_agent_mesh/templates/webui.yaml +177 -0
  620. solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
  621. solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
  622. solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
  623. solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
  624. solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,691 @@
1
+ """
2
+ Refactored evaluator with improved structure and readability.
3
+ This module evaluates AI model performance against test cases using multiple evaluation strategies.
4
+ """
5
+
6
+ import concurrent.futures
7
+ import json
8
+ import logging
9
+ import re
10
+ from abc import ABC, abstractmethod
11
+ from collections import defaultdict
12
+ from dataclasses import dataclass, field
13
+ from pathlib import Path
14
+
15
+ import litellm
16
+ import numpy as np
17
+ from rouge import Rouge
18
+
19
+ from .shared import (
20
+ EvaluationConfigLoader,
21
+ EvaluationOptions,
22
+ TestSuiteConfiguration,
23
+ load_test_case,
24
+ )
25
+
26
+ log = logging.getLogger(__name__)
27
+
28
+
29
+ @dataclass
30
+ class EvaluationResult:
31
+ """Represents the evaluation result for a single run."""
32
+
33
+ run_number: int
34
+ test_case_id: str
35
+ test_case_path: str
36
+ tool_match_score: float | None = None
37
+ response_match_score: float | None = None
38
+ llm_eval_score: float | None = None
39
+ llm_eval_reasoning: str | None = None
40
+ duration_seconds: float | None = None
41
+ errors: list[str] = field(default_factory=list)
42
+
43
+ def to_dict(self) -> dict[str, any]:
44
+ """Convert to dictionary format for JSON serialization."""
45
+ result = {
46
+ "run": self.run_number,
47
+ "test_case_id": self.test_case_id,
48
+ "test_case_path": self.test_case_path,
49
+ "duration_seconds": self.duration_seconds,
50
+ }
51
+
52
+ if self.tool_match_score is not None:
53
+ result["tool_match"] = self.tool_match_score
54
+
55
+ if self.response_match_score is not None:
56
+ result["response_match"] = self.response_match_score
57
+
58
+ if self.llm_eval_score is not None:
59
+ result["llm_eval"] = {
60
+ "score": self.llm_eval_score,
61
+ "reasoning": self.llm_eval_reasoning,
62
+ }
63
+
64
+ if self.errors:
65
+ result["errors"] = self.errors
66
+
67
+ return result
68
+
69
+
70
+ @dataclass
71
+ class ScoreStatistics:
72
+ """Statistical summary of evaluation scores."""
73
+
74
+ average: float
75
+ distribution: dict[str, float]
76
+
77
+ @classmethod
78
+ def from_scores(cls, scores: list[float]) -> "ScoreStatistics":
79
+ """Create statistics from a list of scores."""
80
+ if not scores:
81
+ return cls(
82
+ average=0.0,
83
+ distribution={"min": 0.0, "q1": 0.0, "q2": 0.0, "q3": 0.0, "max": 0.0},
84
+ )
85
+
86
+ return cls(
87
+ average=float(np.mean(scores)),
88
+ distribution={
89
+ "min": float(np.min(scores)),
90
+ "q1": float(np.percentile(scores, 25)),
91
+ "q2": float(np.median(scores)),
92
+ "q3": float(np.percentile(scores, 75)),
93
+ "max": float(np.max(scores)),
94
+ },
95
+ )
96
+
97
+
98
+ @dataclass
99
+ class TestCaseResults:
100
+ """Aggregated results for a test case across multiple runs."""
101
+
102
+ test_case_id: str
103
+ category: str
104
+ runs: list[EvaluationResult]
105
+ average_duration: float
106
+ tool_match_scores: ScoreStatistics
107
+ response_match_scores: ScoreStatistics
108
+ llm_eval_scores: ScoreStatistics
109
+
110
+ def to_dict(self) -> dict[str, any]:
111
+ """Convert to dictionary format for JSON serialization."""
112
+ return {
113
+ "test_case_id": self.test_case_id,
114
+ "category": self.category,
115
+ "runs": [run.to_dict() for run in self.runs],
116
+ "average_duration": self.average_duration,
117
+ "tool_match_scores": {
118
+ "average": self.tool_match_scores.average,
119
+ "distribution": self.tool_match_scores.distribution,
120
+ },
121
+ "response_match_scores": {
122
+ "average": self.response_match_scores.average,
123
+ "distribution": self.response_match_scores.distribution,
124
+ },
125
+ "llm_eval_scores": {
126
+ "average": self.llm_eval_scores.average,
127
+ "distribution": self.llm_eval_scores.distribution,
128
+ },
129
+ }
130
+
131
+
132
+ @dataclass
133
+ class ModelResults:
134
+ """Complete evaluation results for a model."""
135
+
136
+ model_name: str
137
+ total_execution_time: float | None
138
+ test_cases: list[TestCaseResults]
139
+
140
+ def to_dict(self) -> dict[str, any]:
141
+ """Convert to dictionary format for JSON serialization."""
142
+ return {
143
+ "model_name": self.model_name,
144
+ "total_execution_time": self.total_execution_time,
145
+ "test_cases": [tc.to_dict() for tc in self.test_cases],
146
+ }
147
+
148
+
149
+ class ConfigurationService:
150
+ """Handles configuration loading and validation."""
151
+
152
+ def __init__(self, config_path: str):
153
+ self.config_loader = EvaluationConfigLoader(config_path)
154
+ self._config_cache = None
155
+ self._evaluation_settings_cache = None
156
+
157
+ def get_config(self) -> TestSuiteConfiguration:
158
+ """Get the main configuration."""
159
+ if self._config_cache is None:
160
+ self._config_cache = self.config_loader.load_configuration()
161
+ return self._config_cache
162
+
163
+ def get_evaluation_settings(self) -> EvaluationOptions:
164
+ """Get evaluation settings."""
165
+ if self._evaluation_settings_cache is None:
166
+ self._evaluation_settings_cache = self.config_loader.get_evaluation_options()
167
+ return self._evaluation_settings_cache
168
+
169
+
170
+ class FileService:
171
+ """Handles file I/O operations."""
172
+
173
+ @staticmethod
174
+ def load_json(filepath: Path) -> any:
175
+ """Load JSON data from file."""
176
+ try:
177
+ with filepath.open() as f:
178
+ return json.load(f)
179
+ except (FileNotFoundError, json.JSONDecodeError) as e:
180
+ log.error(f"Failed to load JSON from {filepath}: {e}")
181
+ raise
182
+
183
+ @staticmethod
184
+ def save_json(data: any, filepath: Path):
185
+ """Save data as JSON to file."""
186
+ try:
187
+ filepath.parent.mkdir(parents=True, exist_ok=True)
188
+ with filepath.open("w") as f:
189
+ json.dump(data, f, indent=4)
190
+ except Exception as e:
191
+ log.error(f"Failed to save JSON to {filepath}: {e}")
192
+ raise
193
+
194
+ @staticmethod
195
+ def file_exists(filepath: Path) -> bool:
196
+ """Check if file exists."""
197
+ return filepath.exists()
198
+
199
+
200
+ class StatisticsService:
201
+ """Handles statistical calculations and aggregations."""
202
+
203
+ @staticmethod
204
+ def calculate_score_statistics(scores: list[float]) -> ScoreStatistics:
205
+ """Calculate statistical summary for a list of scores."""
206
+ return ScoreStatistics.from_scores(scores)
207
+
208
+ @staticmethod
209
+ def calculate_average_duration(durations: list[float]) -> float:
210
+ """Calculate average duration from a list of durations."""
211
+ if not durations:
212
+ return 0.0
213
+ return float(np.mean(durations))
214
+
215
+
216
+ class EvaluationStrategy(ABC):
217
+ """Abstract base class for evaluation strategies."""
218
+
219
+ @abstractmethod
220
+ def evaluate(
221
+ self, test_case: dict[str, any], summary_data: dict[str, any]
222
+ ) -> float | None:
223
+ """Evaluate a test case run and return a score."""
224
+ pass
225
+
226
+
227
+ class ToolMatchEvaluator(EvaluationStrategy):
228
+ """Evaluates tool usage against expected tools."""
229
+
230
+ def evaluate(
231
+ self, test_case: dict[str, any], summary_data: dict[str, any]
232
+ ) -> float | None:
233
+ """Evaluate tool matching score."""
234
+ try:
235
+ expected_tools = test_case["evaluation"]["expected_tools"]
236
+ actual_tools = [
237
+ tool["tool_name"] for tool in summary_data.get("tool_calls", [])
238
+ ]
239
+
240
+ expected_set = set(expected_tools)
241
+ actual_set = set(actual_tools)
242
+
243
+ if not expected_set:
244
+ return 1.0
245
+
246
+ found_tools = expected_set.intersection(actual_set)
247
+ return len(found_tools) / len(expected_set)
248
+
249
+ except (KeyError, TypeError) as e:
250
+ log.warning(f"Error in tool match evaluation: {e}")
251
+ return None
252
+
253
+
254
+ class ResponseMatchEvaluator(EvaluationStrategy):
255
+ """Evaluates response quality using ROUGE metrics."""
256
+
257
+ def __init__(self):
258
+ self.rouge = Rouge()
259
+
260
+ def evaluate(
261
+ self, test_case: dict[str, any], summary_data: dict[str, any]
262
+ ) -> float | None:
263
+ """Evaluate response matching score using a weighted ROUGE average."""
264
+ try:
265
+ expected_response = test_case["evaluation"]["expected_response"]
266
+ actual_response = summary_data.get("final_message", "")
267
+
268
+ if not actual_response or not expected_response:
269
+ return 0.0
270
+
271
+ scores = self.rouge.get_scores(actual_response, expected_response)[0]
272
+
273
+ # Weighted average of ROUGE-1, ROUGE-2, and ROUGE-L f-scores
274
+ rouge_1_f = scores.get("rouge-1", {}).get("f", 0.0)
275
+ rouge_2_f = scores.get("rouge-2", {}).get("f", 0.0)
276
+ rouge_l_f = scores.get("rouge-l", {}).get("f", 0.0)
277
+
278
+ weighted_score = (0.2 * rouge_1_f) + (0.3 * rouge_2_f) + (0.5 * rouge_l_f)
279
+
280
+ return weighted_score
281
+
282
+ except (ValueError, KeyError, TypeError) as e:
283
+ log.warning(f"Error in response match evaluation: {e}")
284
+ return 0.0
285
+
286
+
287
+ class LLMEvaluator(EvaluationStrategy):
288
+ """Evaluates responses using an LLM judge."""
289
+
290
+ def __init__(self, llm_config: dict[str, any]):
291
+ self.model = llm_config.get("LLM_SERVICE_PLANNING_MODEL_NAME")
292
+ self.api_key = llm_config.get("LLM_SERVICE_API_KEY")
293
+ self.api_base = llm_config.get("LLM_SERVICE_ENDPOINT")
294
+
295
+ if not all([self.model, self.api_key, self.api_base]):
296
+ raise ValueError(
297
+ "LLM evaluator requires model, api_key, and api_base configuration"
298
+ )
299
+
300
+ def evaluate(
301
+ self, test_case: dict[str, any], summary_data: dict[str, any]
302
+ ) -> dict[str, any] | None:
303
+ """Evaluate response using LLM and return score with reasoning."""
304
+ try:
305
+ query = test_case["query"]
306
+ expected_response = test_case["evaluation"]["expected_response"]
307
+ actual_response = summary_data.get("final_message", "")
308
+ criterion = test_case["evaluation"]["criterion"]
309
+ input_artifacts = summary_data.get("input_artifacts", [])
310
+ output_artifacts = summary_data.get("output_artifacts", [])
311
+
312
+ prompt = self._build_evaluation_prompt(
313
+ query,
314
+ expected_response,
315
+ actual_response,
316
+ criterion,
317
+ input_artifacts,
318
+ output_artifacts,
319
+ )
320
+
321
+ response = litellm.completion(
322
+ model=self.model,
323
+ messages=[{"role": "user", "content": prompt}],
324
+ api_key=self.api_key,
325
+ base_url=self.api_base,
326
+ )
327
+
328
+ response_content = response.choices[0].message.content.strip()
329
+ score = self._extract_score(response_content)
330
+ reasoning = self._extract_reasoning(response_content)
331
+
332
+ return {"score": score, "reasoning": reasoning}
333
+
334
+ except Exception as e:
335
+ log.error(f"Error in LLM evaluation: {e}")
336
+ return None
337
+
338
+ def _build_evaluation_prompt(
339
+ self,
340
+ query: str,
341
+ expected_response: str,
342
+ actual_response: str,
343
+ criterion: str,
344
+ input_artifacts: list[dict],
345
+ output_artifacts: list[dict],
346
+ ) -> str:
347
+ """Build the evaluation prompt for the LLM."""
348
+ return f"""
349
+ Original Query: {query}
350
+ Expected Response: {expected_response}
351
+ Actual Response: {actual_response}
352
+ Criterion: {criterion}
353
+ Input Artifacts: {input_artifacts}
354
+ Output Artifacts: {output_artifacts}
355
+
356
+ Based on the criterion, please evaluate the actual response.
357
+ Format your response exactly as:
358
+ Score: [0.0-1.0]
359
+ Reasoning: [Your detailed explanation of why you gave this score, considering both the response and any artifacts created]
360
+
361
+ Provide a score from 0.0 to 1.0 where:
362
+ - 1.0 = Excellent: Fully meets the criterion and expectations
363
+ - 0.8-0.9 = Good: Mostly meets the criterion with minor issues
364
+ - 0.6-0.7 = Adequate: Partially meets the criterion but has notable gaps
365
+ - 0.4-0.5 = Poor: Minimally meets the criterion with significant issues
366
+ - 0.0-0.3 = Very Poor: Fails to meet the criterion
367
+ """
368
+
369
+ def _extract_score(self, llm_response: str) -> float:
370
+ """Extract numerical score from LLM response."""
371
+ # Try to find "Score: X.X" pattern first
372
+ score_match = re.search(
373
+ r"Score:\s*([0-9]*\.?[0-9]+)", llm_response, re.IGNORECASE
374
+ )
375
+ if score_match:
376
+ try:
377
+ score = float(score_match.group(1))
378
+ return max(0.0, min(1.0, score))
379
+ except ValueError:
380
+ pass
381
+
382
+ # Fallback: look for any number between 0 and 1
383
+ number_match = re.search(r"\b([0-1]\.?[0-9]*)\b", llm_response)
384
+ if number_match:
385
+ try:
386
+ score = float(number_match.group(1))
387
+ if 0.0 <= score <= 1.0:
388
+ return score
389
+ except ValueError:
390
+ pass
391
+
392
+ return 0.0
393
+
394
+ def _extract_reasoning(self, llm_response: str) -> str:
395
+ """Extract reasoning from LLM response."""
396
+ reasoning_match = re.search(
397
+ r"Reasoning:\s*(.+)", llm_response, re.IGNORECASE | re.DOTALL
398
+ )
399
+ if reasoning_match:
400
+ return reasoning_match.group(1).strip()
401
+
402
+ return llm_response.strip()
403
+
404
+
405
+ class RunEvaluator:
406
+ """Evaluates individual test runs."""
407
+
408
+ def __init__(self, evaluation_settings: dict[str, any]):
409
+ self.evaluation_settings = evaluation_settings
410
+ self.file_service = FileService()
411
+
412
+ # Initialize evaluators based on settings
413
+ self.tool_evaluator = (
414
+ ToolMatchEvaluator()
415
+ if evaluation_settings["tool_match"]["enabled"]
416
+ else None
417
+ )
418
+ self.response_evaluator = (
419
+ ResponseMatchEvaluator()
420
+ if evaluation_settings["response_match"]["enabled"]
421
+ else None
422
+ )
423
+
424
+ self.llm_evaluator = None
425
+ if evaluation_settings["llm_evaluator"]["enabled"]:
426
+ try:
427
+ llm_config = evaluation_settings["llm_evaluator"]["env"]
428
+ self.llm_evaluator = LLMEvaluator(llm_config)
429
+ except Exception as e:
430
+ log.error(f"Failed to initialize LLM evaluator: {e}")
431
+
432
+ def evaluate_run(
433
+ self,
434
+ run_number: int,
435
+ run_path: Path,
436
+ test_case: dict[str, any],
437
+ test_case_path: str,
438
+ ) -> EvaluationResult | None:
439
+ """Evaluate a single test run."""
440
+ log.info(
441
+ f" - Evaluating run {run_number} for test case {test_case['test_case_id']}"
442
+ )
443
+
444
+ # Load summary data
445
+ summary_path = run_path / "summary.json"
446
+ log.info(f"Summary file path: {summary_path}")
447
+ if not self.file_service.file_exists(summary_path):
448
+ log.warning(
449
+ f" Summary file not found for run {run_number}, skipping."
450
+ )
451
+ return None
452
+
453
+ try:
454
+ summary_data = self.file_service.load_json(summary_path)
455
+ except Exception as e:
456
+ log.error(f" Error loading summary.json for run {run_number}: {e}")
457
+ return None
458
+
459
+ # Create evaluation result
460
+ result = EvaluationResult(
461
+ run_number=run_number,
462
+ test_case_id=test_case["test_case_id"],
463
+ test_case_path=test_case_path,
464
+ duration_seconds=summary_data.get("duration_seconds"),
465
+ )
466
+
467
+ # Run evaluations
468
+ if self.tool_evaluator:
469
+ result.tool_match_score = self.tool_evaluator.evaluate(
470
+ test_case, summary_data
471
+ )
472
+
473
+ if self.response_evaluator:
474
+ result.response_match_score = self.response_evaluator.evaluate(
475
+ test_case, summary_data
476
+ )
477
+
478
+ if self.llm_evaluator:
479
+ llm_result = self.llm_evaluator.evaluate(test_case, summary_data)
480
+ if llm_result:
481
+ result.llm_eval_score = llm_result["score"]
482
+ result.llm_eval_reasoning = llm_result["reasoning"]
483
+
484
+ return result
485
+
486
+
487
+ class ModelEvaluator:
488
+ """Evaluates all runs for a single model."""
489
+
490
+ def __init__(self, config: dict[str, any], evaluation_settings: dict[str, any]):
491
+ self.config = config
492
+ self.evaluation_settings = evaluation_settings
493
+ self.run_evaluator = RunEvaluator(evaluation_settings)
494
+ self.statistics_service = StatisticsService()
495
+
496
+ def evaluate_model(self, model_name: str, base_results_path: str) -> ModelResults:
497
+ """Evaluate all test cases for a model."""
498
+ log.info(f"Evaluating model: {model_name}")
499
+
500
+ model_results_path = Path(base_results_path) / model_name
501
+
502
+ # Collect all evaluation tasks
503
+ tasks = self._collect_evaluation_tasks(model_results_path)
504
+
505
+ # Run evaluations in parallel
506
+ model_results_data = defaultdict(list)
507
+ with concurrent.futures.ThreadPoolExecutor() as executor:
508
+ future_to_run = {
509
+ executor.submit(self.run_evaluator.evaluate_run, *task): task
510
+ for task in tasks
511
+ }
512
+
513
+ for future in concurrent.futures.as_completed(future_to_run):
514
+ try:
515
+ result = future.result()
516
+ if result:
517
+ model_results_data[result.test_case_id].append(result)
518
+ except Exception as e:
519
+ log.error(f"An error occurred during evaluation: {e}")
520
+
521
+ # Aggregate results by test case
522
+ test_case_results = []
523
+ for test_case_id, runs in model_results_data.items():
524
+ if runs:
525
+ test_case_result = self._aggregate_test_case_results(test_case_id, runs)
526
+ test_case_results.append(test_case_result)
527
+
528
+ return ModelResults(
529
+ model_name=model_name,
530
+ total_execution_time=None, # Will be set by orchestrator
531
+ test_cases=test_case_results,
532
+ )
533
+
534
+ def _collect_evaluation_tasks(
535
+ self, model_results_path: Path
536
+ ) -> list[tuple[int, Path, dict[str, any], str]]:
537
+ """Collect all evaluation tasks for the model."""
538
+ tasks = []
539
+
540
+ for test_case_path in self.config["test_cases"]:
541
+ test_case = load_test_case(test_case_path)
542
+ test_case_name = Path(test_case_path).stem.replace(".test", "")
543
+ test_case_results_path = model_results_path / test_case_name
544
+
545
+ for i in range(1, self.config["runs"] + 1):
546
+ run_path = test_case_results_path / f"run_{i}"
547
+ tasks.append((i, run_path, test_case, test_case_path))
548
+
549
+ return tasks
550
+
551
+ def _aggregate_test_case_results(
552
+ self, test_case_id: str, runs: list[EvaluationResult]
553
+ ) -> TestCaseResults:
554
+ """Aggregate results for a test case across multiple runs."""
555
+ # Load test case to get category
556
+ test_case_path = runs[0].test_case_path
557
+ test_case = load_test_case(test_case_path)
558
+
559
+ # Extract scores for statistics
560
+ tool_scores = [
561
+ r.tool_match_score for r in runs if r.tool_match_score is not None
562
+ ]
563
+ response_scores = [
564
+ r.response_match_score for r in runs if r.response_match_score is not None
565
+ ]
566
+ llm_scores = [r.llm_eval_score for r in runs if r.llm_eval_score is not None]
567
+ duration_scores = [
568
+ r.duration_seconds for r in runs if r.duration_seconds is not None
569
+ ]
570
+
571
+ return TestCaseResults(
572
+ test_case_id=test_case_id,
573
+ category=test_case["category"],
574
+ runs=runs,
575
+ average_duration=self.statistics_service.calculate_average_duration(
576
+ duration_scores
577
+ ),
578
+ tool_match_scores=self.statistics_service.calculate_score_statistics(
579
+ tool_scores
580
+ ),
581
+ response_match_scores=self.statistics_service.calculate_score_statistics(
582
+ response_scores
583
+ ),
584
+ llm_eval_scores=self.statistics_service.calculate_score_statistics(
585
+ llm_scores
586
+ ),
587
+ )
588
+
589
+
590
+ class ResultsWriter:
591
+ """Handles writing evaluation results to files."""
592
+
593
+ def __init__(self):
594
+ self.file_service = FileService()
595
+
596
+ def write_model_results(self, model_results: ModelResults, base_results_path: str):
597
+ """Write model results to file."""
598
+ results_path = (
599
+ Path(base_results_path) / model_results.model_name / "results.json"
600
+ )
601
+ self.file_service.save_json(model_results.to_dict(), results_path)
602
+ log.info(
603
+ f"Results for model {model_results.model_name} written to {results_path}"
604
+ )
605
+
606
+
607
+ class EvaluationOrchestrator:
608
+ """Main orchestrator that coordinates the entire evaluation process."""
609
+
610
+ def __init__(self, config_path: str):
611
+ self.config_service = ConfigurationService(config_path)
612
+ self.results_writer = ResultsWriter()
613
+
614
+ def run_evaluation(
615
+ self,
616
+ base_results_path: str,
617
+ model_execution_times: dict[str, float] | None = None,
618
+ ):
619
+ """Main entry point for the evaluation process."""
620
+ log.info("Starting evaluation")
621
+
622
+ # Resolve to an absolute path to ensure consistency
623
+ base_results_path = str(Path(base_results_path).resolve())
624
+
625
+ if model_execution_times is None:
626
+ model_execution_times = {}
627
+
628
+ config = self.config_service.get_config()
629
+ evaluation_settings = self.config_service.get_evaluation_settings()
630
+
631
+ # Convert evaluation settings to dict format for backwards compatibility
632
+ settings_dict = {
633
+ "tool_match": {"enabled": evaluation_settings.tool_matching_enabled},
634
+ "response_match": {"enabled": evaluation_settings.response_matching_enabled},
635
+ "llm_evaluator": {
636
+ "enabled": evaluation_settings.llm_evaluation_enabled,
637
+ "env": evaluation_settings.llm_evaluator_environment.variables if evaluation_settings.llm_evaluator_environment else {}
638
+ }
639
+ }
640
+
641
+ # Convert config to dict format for backwards compatibility
642
+ config_dict = {
643
+ "test_cases": config.test_case_files,
644
+ "runs": config.run_count
645
+ }
646
+
647
+ model_evaluator = ModelEvaluator(config_dict, settings_dict)
648
+
649
+ if config.remote:
650
+ # Handle remote evaluation
651
+ model_name = "remote"
652
+ model_results = model_evaluator.evaluate_model(model_name, base_results_path)
653
+ execution_time = model_execution_times.get(model_name)
654
+ if execution_time is not None:
655
+ model_results.total_execution_time = execution_time
656
+ self.results_writer.write_model_results(model_results, base_results_path)
657
+ else:
658
+ # Handle local evaluation
659
+ for model_config in config.model_configurations:
660
+ model_name = model_config.name
661
+
662
+ # Evaluate the model
663
+ model_results = model_evaluator.evaluate_model(
664
+ model_name, base_results_path
665
+ )
666
+
667
+ # Add execution time if available
668
+ execution_time = model_execution_times.get(model_name)
669
+ if execution_time is not None:
670
+ model_results.total_execution_time = execution_time
671
+
672
+ # Write results to file
673
+ self.results_writer.write_model_results(model_results, base_results_path)
674
+
675
+ log.info("--- Evaluation finished ---")
676
+
677
+
678
+ def main(config_path: str):
679
+ """Main entry point for command-line usage."""
680
+ orchestrator = EvaluationOrchestrator(config_path)
681
+ # Results path should be based on the current working directory, not the package location.
682
+ # This main function is for standalone testing.
683
+ config = orchestrator.config_service.get_config()
684
+ results_path = Path.cwd() / "results" / config.results_directory
685
+ results_path.mkdir(parents=True, exist_ok=True)
686
+ orchestrator.run_evaluation(str(results_path))
687
+
688
+
689
+ if __name__ == "__main__":
690
+ # This will be updated later to parse CLI args.
691
+ main()