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,92 @@
1
+ # Expose constants and validation rules
2
+ from .constants import (
3
+ ALLOWED_TOPIC_INFIXES,
4
+ BLOCKED_TOPIC_INFIXES,
5
+ BROKER_REQUIRED_FIELDS,
6
+ DEFAULT_CATEGORY,
7
+ DEFAULT_CONNECTION_TIMEOUT,
8
+ DEFAULT_DESCRIPTION,
9
+ DEFAULT_RECONNECT_ATTEMPTS,
10
+ DEFAULT_RECONNECT_DELAY,
11
+ DEFAULT_RUN_COUNT,
12
+ DEFAULT_STARTUP_WAIT_TIME,
13
+ DEFAULT_TEST_TIMEOUT,
14
+ DEFAULT_WAIT_TIME,
15
+ DEFAULT_WORKERS,
16
+ EVALUATION_DIR,
17
+ MAX_ARTIFACT_SIZE_MB,
18
+ MAX_WAIT_TIME,
19
+ MAX_WORKERS,
20
+ MESSAGE_TIMEOUT,
21
+ REMOTE_REQUIRED_FIELDS,
22
+ ConnectionState,
23
+ )
24
+ from .exceptions import (
25
+ BrokerConnectionError,
26
+ CategorizationError,
27
+ ConfigurationError,
28
+ EvaluationError,
29
+ InvalidDataError,
30
+ MessageProcessingError,
31
+ MissingFileError,
32
+ SubscriberError,
33
+ TestCaseError,
34
+ TestCaseFileNotFoundError,
35
+ TestCaseParseError,
36
+ )
37
+ from .helpers import get_local_base_url
38
+
39
+ # Expose main loader classes and functions
40
+ from .test_case_loader import TestCase, load_test_case
41
+ from .test_suite_loader import (
42
+ BrokerConfig,
43
+ EvaluationConfigLoader,
44
+ EvaluationOptions,
45
+ TestSuiteConfiguration,
46
+ )
47
+
48
+ __all__ = [
49
+ # Constants
50
+ "DEFAULT_STARTUP_WAIT_TIME",
51
+ "DEFAULT_TEST_TIMEOUT",
52
+ "DEFAULT_CONNECTION_TIMEOUT",
53
+ "DEFAULT_RECONNECT_ATTEMPTS",
54
+ "DEFAULT_RECONNECT_DELAY",
55
+ "DEFAULT_WAIT_TIME",
56
+ "DEFAULT_RUN_COUNT",
57
+ "DEFAULT_WORKERS",
58
+ "MAX_WORKERS",
59
+ "DEFAULT_CATEGORY",
60
+ "DEFAULT_DESCRIPTION",
61
+ "EVALUATION_DIR",
62
+ "MAX_ARTIFACT_SIZE_MB",
63
+ "MAX_WAIT_TIME",
64
+ "BROKER_REQUIRED_FIELDS",
65
+ "REMOTE_REQUIRED_FIELDS",
66
+ "ALLOWED_TOPIC_INFIXES",
67
+ "BLOCKED_TOPIC_INFIXES",
68
+ "MESSAGE_TIMEOUT",
69
+ "ConnectionState",
70
+ # Test Case Loading
71
+ "TestCase",
72
+ "load_test_case",
73
+ # Test Suite Loading
74
+ "TestSuiteConfiguration",
75
+ "EvaluationConfigLoader",
76
+ "BrokerConfig",
77
+ "EvaluationOptions",
78
+ # Exceptions
79
+ "EvaluationError",
80
+ "TestCaseError",
81
+ "TestCaseFileNotFoundError",
82
+ "TestCaseParseError",
83
+ "SubscriberError",
84
+ "BrokerConnectionError",
85
+ "MessageProcessingError",
86
+ "ConfigurationError",
87
+ "CategorizationError",
88
+ "MissingFileError",
89
+ "InvalidDataError",
90
+ # Helpers
91
+ "get_local_base_url",
92
+ ]
@@ -0,0 +1,47 @@
1
+ from enum import Enum
2
+ from pathlib import Path
3
+
4
+ EVALUATION_DIR = Path(__file__).parent.resolve()
5
+
6
+ # Timeouts and Delays
7
+ DEFAULT_STARTUP_WAIT_TIME = 60
8
+ DEFAULT_TEST_TIMEOUT = 60
9
+ DEFAULT_CONNECTION_TIMEOUT = 30
10
+ DEFAULT_RECONNECT_ATTEMPTS = 3
11
+ DEFAULT_RECONNECT_DELAY = 1.0
12
+ DEFAULT_WAIT_TIME = 60
13
+
14
+ # Test Suite Defaults
15
+ DEFAULT_RUN_COUNT = 1
16
+ DEFAULT_WORKERS = 4
17
+ MAX_WORKERS = 8
18
+
19
+ # Test Case Defaults
20
+ DEFAULT_CATEGORY = "Other"
21
+ DEFAULT_DESCRIPTION = "No description provided."
22
+ MAX_WAIT_TIME = 300
23
+ MAX_ARTIFACT_SIZE_MB = 10
24
+
25
+ # Validation
26
+ BROKER_REQUIRED_FIELDS = ["host", "vpn_name", "username", "password"]
27
+ REMOTE_REQUIRED_FIELDS = ["EVAL_REMOTE_URL", "EVAL_NAMESPACE"]
28
+
29
+
30
+ # Subscription Defaults
31
+ ALLOWED_TOPIC_INFIXES: list[str] = [
32
+ "/agent/request/",
33
+ "/gateway/status/",
34
+ "/gateway/response/",
35
+ ]
36
+ BLOCKED_TOPIC_INFIXES: list[str] = ["/discovery/"]
37
+ MESSAGE_TIMEOUT: int = 1000
38
+
39
+
40
+ class ConnectionState(Enum):
41
+ """Represents the connection state of the subscriber."""
42
+
43
+ DISCONNECTED = "disconnected"
44
+ CONNECTING = "connecting"
45
+ CONNECTED = "connected"
46
+ DISCONNECTING = "disconnecting"
47
+ ERROR = "error"
@@ -0,0 +1,50 @@
1
+ """
2
+ Centralized custom exceptions for the evaluation module.
3
+ """
4
+
5
+ class EvaluationError(Exception):
6
+ """Base exception for all evaluation-related errors."""
7
+ pass
8
+
9
+ # Test Case Errors
10
+ class TestCaseError(EvaluationError):
11
+ """Base exception for test case-related errors."""
12
+ pass
13
+
14
+ class TestCaseFileNotFoundError(TestCaseError):
15
+ """Raised when the test case file is not found."""
16
+ pass
17
+
18
+ class TestCaseParseError(TestCaseError):
19
+ """Raised when the test case file cannot be parsed or validated."""
20
+ pass
21
+
22
+ # Subscriber Errors
23
+ class SubscriberError(EvaluationError):
24
+ """Base exception for subscriber-related errors."""
25
+ pass
26
+
27
+ class BrokerConnectionError(SubscriberError):
28
+ """Raised when broker connection fails."""
29
+ pass
30
+
31
+ class MessageProcessingError(SubscriberError):
32
+ """Raised when message processing fails."""
33
+ pass
34
+
35
+ class ConfigurationError(SubscriberError):
36
+ """Raised when configuration is invalid."""
37
+ pass
38
+
39
+ # Message Organizer Errors
40
+ class CategorizationError(EvaluationError):
41
+ """Base exception for categorization errors."""
42
+ pass
43
+
44
+ class MissingFileError(CategorizationError):
45
+ """Raised when required files are missing."""
46
+ pass
47
+
48
+ class InvalidDataError(CategorizationError):
49
+ """Raised when data format is invalid."""
50
+ pass
@@ -0,0 +1,35 @@
1
+ import logging
2
+ import os
3
+
4
+ from dotenv import load_dotenv
5
+
6
+ log = logging.getLogger(__name__)
7
+
8
+
9
+ def get_local_base_url() -> str:
10
+ """
11
+ Constructs the local API base URL from environment variables.
12
+ """
13
+ load_dotenv()
14
+ host = os.getenv("REST_API_HOST", "0.0.0.0")
15
+ port = os.getenv("REST_API_PORT", "8080")
16
+ return f"http://{host}:{port}"
17
+
18
+
19
+ def resolve_env_vars(data: dict) -> dict:
20
+ """
21
+ Resolves environment variables in a dictionary.
22
+ Looks for keys ending in _VAR and replaces them with the corresponding environment variable value.
23
+ """
24
+ resolved = {}
25
+ for key, value in data.items():
26
+ if key.endswith("_VAR"):
27
+ env_var_name = key[:-4] # Remove '_VAR' suffix
28
+ env_value = os.getenv(value)
29
+ if not env_value:
30
+ log.warning(f"Environment variable '{value}' not set for {env_var_name}")
31
+ resolved[env_var_name] = env_value
32
+ else:
33
+ # This is a direct value, include it as-is
34
+ resolved[key] = value
35
+ return resolved
@@ -0,0 +1,167 @@
1
+ """
2
+ Refactored test case loader with Pydantic-based validation.
3
+ This module provides robust test case loading and validation using Pydantic.
4
+ """
5
+
6
+ import json
7
+ import logging
8
+ import os
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Literal
12
+
13
+ from pydantic import BaseModel, Field, ValidationError, field_validator
14
+
15
+ from .constants import (
16
+ DEFAULT_CATEGORY,
17
+ DEFAULT_DESCRIPTION,
18
+ DEFAULT_WAIT_TIME,
19
+ MAX_WAIT_TIME,
20
+ )
21
+ from .exceptions import (
22
+ TestCaseError,
23
+ TestCaseFileNotFoundError,
24
+ TestCaseParseError,
25
+ )
26
+
27
+ log = logging.getLogger(__name__)
28
+
29
+
30
+ class Artifact(BaseModel):
31
+ """
32
+ Configuration for an individual artifact.
33
+ Uses Pydantic for built-in validation.
34
+ """
35
+ artifact_type: Literal["file", "url", "text"] = Field(..., alias="type")
36
+ path: str = Field(..., min_length=1)
37
+
38
+ @field_validator("path")
39
+ def validate_path_security(cls, v, values):
40
+ """
41
+ Validate file path security to prevent directory traversal.
42
+ """
43
+ if "artifact_type" in values.data and values.data["artifact_type"] == "file":
44
+ normalized_path = os.path.normpath(v)
45
+ if normalized_path.startswith("..") or os.path.isabs(normalized_path):
46
+ raise ValueError(
47
+ f"Artifact path '{v}' is not safe (no absolute paths or directory traversal)"
48
+ )
49
+ return v
50
+
51
+ class Config:
52
+ validate_by_name = True
53
+
54
+
55
+ class Evaluation(BaseModel):
56
+ """
57
+ Configuration for evaluation criteria.
58
+ """
59
+ expected_tools: list[str] = Field(default_factory=list)
60
+ expected_response: str = ""
61
+ criterion: str = ""
62
+
63
+ @field_validator("expected_tools")
64
+ def validate_tool_names(cls, tools: list[str]) -> list[str]:
65
+ """
66
+ Ensures that tool names are non-empty strings.
67
+ """
68
+ if any(not isinstance(tool, str) or not tool.strip() for tool in tools):
69
+ raise ValueError("All tool names must be non-empty strings.")
70
+ return tools
71
+
72
+ class TestCase(BaseModel):
73
+ """
74
+ Complete test case configuration using Pydantic for validation.
75
+ """
76
+ test_case_id: str = Field(..., min_length=1)
77
+ query: str = Field(..., min_length=1)
78
+ target_agent: str = Field(..., min_length=1)
79
+ category: str = DEFAULT_CATEGORY
80
+ description: str = DEFAULT_DESCRIPTION
81
+ wait_time: int = Field(DEFAULT_WAIT_TIME, gt=0, le=MAX_WAIT_TIME)
82
+ artifacts: list[Artifact] = Field(default_factory=list)
83
+ evaluation: Evaluation = Field(default_factory=Evaluation)
84
+
85
+ def to_dict(self) -> dict[str, any]:
86
+ """Convert test case to dictionary format for JSON serialization."""
87
+ return self.model_dump(by_alias=True)
88
+
89
+ def load_test_case(test_case_path: str) -> dict[str, any]:
90
+ """
91
+ Load a test case from a JSON file with Pydantic validation.
92
+
93
+ Args:
94
+ test_case_path: The full path to the test case file.
95
+
96
+ Returns:
97
+ A dictionary containing the validated test case data.
98
+
99
+ Raises:
100
+ TestCaseFileNotFoundError: If the file does not exist.
101
+ TestCaseParseError: If the file is not valid JSON or fails validation.
102
+ TestCaseError: For other unexpected errors.
103
+ """
104
+ path = Path(test_case_path)
105
+ if not path.is_file():
106
+ raise TestCaseFileNotFoundError(f"Test case file not found: {test_case_path}")
107
+
108
+ try:
109
+ with open(path) as f:
110
+ data = json.load(f)
111
+ test_case = TestCase.model_validate(data)
112
+ return test_case.to_dict()
113
+ except json.JSONDecodeError as e:
114
+ raise TestCaseParseError(f"Invalid JSON in test case file {test_case_path}: {e}") from e
115
+ except ValidationError as e:
116
+ raise TestCaseParseError(f"Test case validation failed for {test_case_path}:\n{e}") from e
117
+ except Exception as e:
118
+ raise TestCaseError(f"Error reading or processing test case file {test_case_path}: {e}") from e
119
+
120
+ def validate_test_case_file(test_case_path: str) -> None:
121
+ """
122
+ Validates a test case file and logs errors if any. Exits on failure.
123
+
124
+ Args:
125
+ test_case_path: The full path to the test case file.
126
+
127
+ Raises:
128
+ SystemExit: If validation fails.
129
+ """
130
+ try:
131
+ load_test_case(test_case_path)
132
+ log.info(f"Test case '{test_case_path}' validation successful.")
133
+ except (TestCaseFileNotFoundError, TestCaseParseError, TestCaseError) as e:
134
+ log.error(f"Error: {e}")
135
+ sys.exit(1)
136
+
137
+ def main():
138
+ """Main entry point for command-line usage and testing."""
139
+ if len(sys.argv) != 2:
140
+ log.error(f"Usage: python {sys.argv[0]} <path_to_test_case.json>")
141
+ log.error(f"Example: python {sys.argv[0]} /path/to/hello_world.test.json")
142
+ sys.exit(1)
143
+
144
+ test_case_path = sys.argv[1]
145
+
146
+ try:
147
+ # Load and validate test case
148
+ test_case_data = load_test_case(test_case_path)
149
+
150
+ log.info(f"Successfully loaded test case: {test_case_data['test_case_id']}")
151
+ log.info(f"Target Agent: {test_case_data['target_agent']}")
152
+ log.info(f"Category: {test_case_data['category']}")
153
+ query = test_case_data['query']
154
+ log.info(f"Query: {query[:100]}{'...' if len(query) > 100 else ''}")
155
+ log.info(f"Wait Time: {test_case_data['wait_time']} seconds")
156
+ log.info(f"Artifacts: {len(test_case_data['artifacts'])} artifact(s)")
157
+ log.info(f"Expected Tools: {len(test_case_data['evaluation']['expected_tools'])} tool(s)")
158
+
159
+ except (TestCaseFileNotFoundError, TestCaseParseError, TestCaseError) as e:
160
+ log.error(f"Error: {e}")
161
+ sys.exit(1)
162
+ except Exception as e:
163
+ log.error(f"An unexpected error occurred: {e}")
164
+ sys.exit(1)
165
+
166
+ if __name__ == "__main__":
167
+ main()
@@ -0,0 +1,280 @@
1
+ """
2
+ Modern Pydantic-based configuration loader with comprehensive validation.
3
+ Replaces complex custom validation with clean, declarative models.
4
+ """
5
+
6
+ import json
7
+ import logging
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator
12
+ from solace.messaging.config.solace_properties import (
13
+ authentication_properties,
14
+ service_properties,
15
+ transport_layer_properties,
16
+ transport_layer_security_properties,
17
+ )
18
+
19
+ from .constants import (
20
+ BROKER_REQUIRED_FIELDS,
21
+ DEFAULT_CONNECTION_TIMEOUT,
22
+ DEFAULT_RECONNECT_ATTEMPTS,
23
+ DEFAULT_RECONNECT_DELAY,
24
+ DEFAULT_RUN_COUNT,
25
+ DEFAULT_WORKERS,
26
+ MAX_WORKERS,
27
+ REMOTE_REQUIRED_FIELDS,
28
+ )
29
+ from .helpers import resolve_env_vars
30
+
31
+ log = logging.getLogger(__name__)
32
+
33
+
34
+ class EnvironmentVariables(BaseModel):
35
+ """Environment variable configuration with automatic resolution."""
36
+ variables: dict[str, str | None] = Field(default_factory=dict)
37
+
38
+ @model_validator(mode='before')
39
+ @classmethod
40
+ def build_variables(cls, data: any) -> any:
41
+ """Build a variables dictionary from raw data."""
42
+ if isinstance(data, dict) and 'variables' not in data:
43
+ return {"variables": resolve_env_vars(data)}
44
+ return data
45
+
46
+ def get(self, key: str, default: str | None = None) -> str | None:
47
+ """Get environment variable value with default."""
48
+ return self.variables.get(key, default)
49
+
50
+ def is_complete(self, required_vars: list[str]) -> bool:
51
+ """Check if all required environment variables are present."""
52
+ return all(self.variables.get(var) is not None for var in required_vars)
53
+
54
+
55
+ class ModelConfiguration(BaseModel):
56
+ """Individual LLM model configuration with validation."""
57
+ name: str = Field(min_length=1, description="Model name cannot be empty")
58
+ environment: EnvironmentVariables = Field(alias="env")
59
+
60
+ @model_validator(mode='after')
61
+ def validate_essential_vars(self):
62
+ """Ensure essential environment variables are present."""
63
+ essential_vars = ["LLM_SERVICE_PLANNING_MODEL_NAME"]
64
+ if not any(var in self.environment.variables for var in essential_vars):
65
+ raise ValueError(f"Model '{self.name}' must have at least one of: {essential_vars}")
66
+ return self
67
+
68
+
69
+ class RemoteConfig(BaseModel):
70
+ """Remote configuration with environment variable support."""
71
+ environment: EnvironmentVariables
72
+
73
+ @model_validator(mode='before')
74
+ @classmethod
75
+ def build_environment(cls, data: any) -> any:
76
+ if isinstance(data, dict):
77
+ # All fields are environment variables
78
+ return {"environment": data}
79
+ return data
80
+
81
+ @model_validator(mode='after')
82
+ def sanitize_namespace(self):
83
+ """Remove trailing slashes from EVAL_NAMESPACE."""
84
+ if self.environment and "EVAL_NAMESPACE" in self.environment.variables:
85
+ namespace = self.environment.variables.get("EVAL_NAMESPACE")
86
+ if namespace:
87
+ self.environment.variables["EVAL_NAMESPACE"] = namespace.rstrip("/")
88
+ return self
89
+
90
+
91
+ class BrokerConfig(BaseModel):
92
+ """Broker connection configuration with validation and environment variable resolution."""
93
+ host: str | None = Field(default=None, alias="SOLACE_BROKER_URL")
94
+ vpn_name: str | None = Field(default=None, alias="SOLACE_BROKER_VPN")
95
+ username: str | None = Field(default=None, alias="SOLACE_BROKER_USERNAME")
96
+ password: str | None = Field(default=None, alias="SOLACE_BROKER_PASSWORD")
97
+ cert_validated: bool = False
98
+ connection_timeout: int = DEFAULT_CONNECTION_TIMEOUT
99
+ reconnect_attempts: int = DEFAULT_RECONNECT_ATTEMPTS
100
+ reconnect_delay: float = DEFAULT_RECONNECT_DELAY
101
+
102
+ @model_validator(mode='before')
103
+ @classmethod
104
+ def resolve_env_vars(cls, data: dict) -> dict:
105
+ """Resolve environment variables for broker configuration."""
106
+ return resolve_env_vars(data)
107
+
108
+ @model_validator(mode='after')
109
+ def check_required_fields(self):
110
+ """Ensure all required broker fields are present."""
111
+ missing_fields = [field for field in BROKER_REQUIRED_FIELDS if getattr(self, field) is None]
112
+ if missing_fields:
113
+ raise ValueError(f"Broker configuration is missing required fields: {missing_fields}")
114
+ return self
115
+
116
+ def to_solace_properties(self) -> dict[str, any]:
117
+ """Convert to Solace messaging properties."""
118
+ return {
119
+ transport_layer_properties.HOST: self.host,
120
+ service_properties.VPN_NAME: self.vpn_name,
121
+ authentication_properties.SCHEME_BASIC_USER_NAME: self.username,
122
+ authentication_properties.SCHEME_BASIC_PASSWORD: self.password,
123
+ transport_layer_security_properties.CERT_VALIDATED: self.cert_validated,
124
+ }
125
+
126
+
127
+ class EvaluationOptions(BaseModel):
128
+ """Evaluation behavior settings with conditional validation."""
129
+ tool_matching_enabled: bool = Field(default=True)
130
+ response_matching_enabled: bool = Field(default=True)
131
+ llm_evaluation_enabled: bool = Field(default=False)
132
+ llm_evaluator_environment: EnvironmentVariables | None = Field(default=None)
133
+
134
+ @model_validator(mode='after')
135
+ def validate_llm_evaluator_config(self):
136
+ """Validate LLM evaluator configuration when enabled."""
137
+ if self.llm_evaluation_enabled:
138
+ if not self.llm_evaluator_environment:
139
+ raise ValueError("llm_evaluator_environment is required when llm_evaluation_enabled is true")
140
+
141
+ required_vars = [
142
+ "LLM_SERVICE_PLANNING_MODEL_NAME",
143
+ "LLM_SERVICE_ENDPOINT",
144
+ "LLM_SERVICE_API_KEY"
145
+ ]
146
+ if not self.llm_evaluator_environment.is_complete(required_vars):
147
+ raise ValueError(f"LLM evaluator requires environment variables: {required_vars}")
148
+ return self
149
+
150
+
151
+ class TestSuiteConfiguration(BaseModel):
152
+ """Complete test suite configuration with comprehensive validation."""
153
+ broker: BrokerConfig
154
+ agent_configs: list[str] | None = Field(default=None, min_length=1, alias="agents")
155
+ model_configurations: list[ModelConfiguration] | None = Field(default=None, min_length=1, alias="llm_models")
156
+ remote: RemoteConfig | None = Field(default=None)
157
+ test_case_files: list[str] = Field(min_length=1, alias="test_cases")
158
+ results_directory: str = Field(min_length=1, alias="results_dir_name")
159
+ run_count: int = Field(default=DEFAULT_RUN_COUNT, ge=1, alias="runs")
160
+ workers: int = Field(default=DEFAULT_WORKERS, ge=1, le=MAX_WORKERS)
161
+ evaluation_options: EvaluationOptions = Field(default_factory=EvaluationOptions, alias="evaluation_settings")
162
+
163
+ @field_validator('agent_configs', 'test_case_files', mode='before')
164
+ @classmethod
165
+ def resolve_relative_paths(cls, v: list[str], info) -> list[str]:
166
+ """Convert relative paths to absolute paths."""
167
+ if not v:
168
+ return v
169
+ config_dir = getattr(info.context, 'config_dir', Path.cwd())
170
+ return [str(config_dir / p) if not Path(p).is_absolute() else p for p in v]
171
+
172
+ @model_validator(mode='after')
173
+ def add_eval_backend_if_missing(self):
174
+ """Add eval_backend.yaml if not present in agent configs."""
175
+ if self.agent_configs and not any(Path(p).name == "eval_backend.yaml" for p in self.agent_configs):
176
+ project_root = Path.cwd()
177
+ eval_backend_path = str(project_root / "configs" / "eval_backend.yaml")
178
+ self.agent_configs.append(eval_backend_path)
179
+ return self
180
+
181
+ @model_validator(mode='after')
182
+ def validate_configuration_mode(self):
183
+ """Validate that either remote or local configuration is correctly provided."""
184
+ is_remote = self.remote is not None
185
+ is_local = self.agent_configs is not None and self.model_configurations is not None
186
+
187
+ if is_remote and is_local:
188
+ raise ValueError("Configuration cannot have both 'remote' and local settings ('agents', 'llm_models').")
189
+
190
+ if is_remote and (self.agent_configs or self.model_configurations):
191
+ raise ValueError("When 'remote' is provided, 'agents' and 'llm_models' must not be set.")
192
+
193
+ if is_remote and not self.remote.environment.is_complete(REMOTE_REQUIRED_FIELDS):
194
+ raise ValueError(f"Remote configuration requires environment variables: {REMOTE_REQUIRED_FIELDS}")
195
+
196
+ if not is_remote and not is_local:
197
+ raise ValueError("Configuration must include either 'remote' or local settings ('agents', 'llm_models').")
198
+
199
+ return self
200
+
201
+
202
+ class ConfigurationParser:
203
+ """Handles raw JSON parsing and transformation."""
204
+
205
+ def __init__(self, config_path: str):
206
+ self.config_path = Path(config_path)
207
+ self.config_dir = self.config_path.parent.resolve()
208
+
209
+ def load_raw_config(self) -> dict[str, any]:
210
+ """Load raw JSON configuration."""
211
+ try:
212
+ with open(self.config_path) as f:
213
+ return json.load(f)
214
+ except FileNotFoundError:
215
+ log.error(f"Configuration file not found: {self.config_path}")
216
+ sys.exit(1)
217
+ except json.JSONDecodeError as e:
218
+ log.error(f"Invalid JSON in configuration file: {e}")
219
+ sys.exit(1)
220
+
221
+ def transform_evaluation_settings(self, raw_settings: dict[str, any]) -> dict[str, any]:
222
+ """Transform nested evaluation settings structure."""
223
+ result = {
224
+ "tool_matching_enabled": raw_settings.get("tool_match", {}).get("enabled", True),
225
+ "response_matching_enabled": raw_settings.get("response_match", {}).get("enabled", True),
226
+ "llm_evaluation_enabled": raw_settings.get("llm_evaluator", {}).get("enabled", False),
227
+ "llm_evaluator_environment": None
228
+ }
229
+
230
+ # Handle LLM evaluator environment if enabled
231
+ if result["llm_evaluation_enabled"]:
232
+ env_data = raw_settings.get("llm_evaluator", {}).get("env", {})
233
+ if env_data:
234
+ result["llm_evaluator_environment"] = env_data
235
+
236
+ return result
237
+
238
+
239
+ class EvaluationConfigLoader:
240
+ """Modern configuration loader using Pydantic validation."""
241
+
242
+ def __init__(self, config_path: str):
243
+ self.parser = ConfigurationParser(config_path)
244
+
245
+ def load_configuration(self) -> TestSuiteConfiguration:
246
+ """Load and validate configuration, returning Pydantic model."""
247
+ try:
248
+ # Load raw JSON
249
+ raw_config = self.parser.load_raw_config()
250
+
251
+ # Transform evaluation settings structure
252
+ if "evaluation_settings" in raw_config:
253
+ raw_config["evaluation_settings"] = self.parser.transform_evaluation_settings(
254
+ raw_config["evaluation_settings"]
255
+ )
256
+
257
+ config = TestSuiteConfiguration.model_validate(
258
+ raw_config,
259
+ context={'config_dir': self.parser.config_dir}
260
+ )
261
+
262
+ log.info("Configuration loaded and validated successfully.")
263
+ return config
264
+
265
+ except ValidationError as e:
266
+ self._handle_validation_error(e)
267
+ sys.exit(1)
268
+
269
+ def get_evaluation_options(self) -> EvaluationOptions:
270
+ """Get evaluation options from configuration."""
271
+ config = self.load_configuration()
272
+ return config.evaluation_options
273
+
274
+ def _handle_validation_error(self, e: ValidationError):
275
+ """Convert Pydantic validation errors to user-friendly format."""
276
+ log.error("Configuration validation failed:")
277
+ for error in e.errors():
278
+ field_path = " -> ".join(str(loc) for loc in error['loc'])
279
+ message = error['msg']
280
+ log.error(f" Field '{field_path}': {message}")