solace-agent-mesh 0.2.3__py3-none-any.whl → 1.0.1__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (518) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  2. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  3. solace_agent_mesh/agent/adk/callbacks.py +1694 -0
  4. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  5. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  6. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  7. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  8. solace_agent_mesh/agent/adk/runner.py +353 -0
  9. solace_agent_mesh/agent/adk/services.py +240 -0
  10. solace_agent_mesh/agent/adk/setup.py +751 -0
  11. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  12. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  13. solace_agent_mesh/agent/agent_llm.txt +41 -0
  14. solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
  15. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  16. solace_agent_mesh/agent/sac/app.py +640 -0
  17. solace_agent_mesh/agent/sac/component.py +3388 -0
  18. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  19. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  20. solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
  21. solace_agent_mesh/agent/testing/__init__.py +3 -0
  22. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  23. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  24. solace_agent_mesh/agent/tools/__init__.py +14 -0
  25. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  26. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  27. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  28. solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
  29. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  30. solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
  31. solace_agent_mesh/agent/tools/registry.py +36 -0
  32. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  33. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  34. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  35. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  36. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  37. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  38. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  39. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  40. solace_agent_mesh/assets/docs/404.html +16 -0
  41. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  42. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  43. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  54. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  57. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  104. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
  132. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
  133. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  165. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  167. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  168. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  170. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  171. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
  172. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  173. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  175. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  176. solace_agent_mesh/cli/__init__.py +1 -1
  177. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  178. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  179. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  180. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  181. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  183. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  184. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  185. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  186. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  187. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  188. solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
  189. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  190. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
  191. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  192. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  193. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  194. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  201. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  202. solace_agent_mesh/cli/main.py +17 -294
  203. solace_agent_mesh/cli/utils.py +135 -204
  204. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  205. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  210. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  211. solace_agent_mesh/common/__init__.py +1 -0
  212. solace_agent_mesh/common/a2a_protocol.py +564 -0
  213. solace_agent_mesh/common/agent_registry.py +42 -0
  214. solace_agent_mesh/common/client/__init__.py +4 -0
  215. solace_agent_mesh/common/client/card_resolver.py +21 -0
  216. solace_agent_mesh/common/client/client.py +85 -0
  217. solace_agent_mesh/common/client/client_llm.txt +133 -0
  218. solace_agent_mesh/common/common_llm.txt +144 -0
  219. solace_agent_mesh/common/constants.py +1 -14
  220. solace_agent_mesh/common/middleware/__init__.py +12 -0
  221. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  222. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  223. solace_agent_mesh/common/middleware/registry.py +125 -0
  224. solace_agent_mesh/common/server/__init__.py +4 -0
  225. solace_agent_mesh/common/server/server.py +122 -0
  226. solace_agent_mesh/common/server/server_llm.txt +169 -0
  227. solace_agent_mesh/common/server/task_manager.py +291 -0
  228. solace_agent_mesh/common/server/utils.py +28 -0
  229. solace_agent_mesh/common/services/__init__.py +4 -0
  230. solace_agent_mesh/common/services/employee_service.py +162 -0
  231. solace_agent_mesh/common/services/identity_service.py +129 -0
  232. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  233. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  234. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  235. solace_agent_mesh/common/services/services_llm.txt +132 -0
  236. solace_agent_mesh/common/types.py +411 -0
  237. solace_agent_mesh/common/utils/__init__.py +7 -0
  238. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  239. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  240. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  241. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  242. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  243. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  244. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  245. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  246. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  247. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  248. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  249. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  250. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  251. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  252. solace_agent_mesh/config_portal/backend/common.py +66 -24
  253. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
  254. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
  258. solace_agent_mesh/config_portal/backend/server.py +550 -140
  259. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
  260. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  267. solace_agent_mesh/core_a2a/__init__.py +1 -0
  268. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  269. solace_agent_mesh/core_a2a/service.py +331 -0
  270. solace_agent_mesh/evaluation/config_loader.py +657 -0
  271. solace_agent_mesh/evaluation/evaluator.py +667 -0
  272. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  273. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  274. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  275. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  276. solace_agent_mesh/evaluation/report/modal.html +59 -0
  277. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  278. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  279. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  280. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  281. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  282. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  283. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  284. solace_agent_mesh/evaluation/report_generator.py +613 -0
  285. solace_agent_mesh/evaluation/run.py +613 -0
  286. solace_agent_mesh/evaluation/subscriber.py +872 -0
  287. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  288. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  289. solace_agent_mesh/gateway/base/__init__.py +1 -0
  290. solace_agent_mesh/gateway/base/app.py +266 -0
  291. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  292. solace_agent_mesh/gateway/base/component.py +1542 -0
  293. solace_agent_mesh/gateway/base/task_context.py +74 -0
  294. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  295. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  296. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  297. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  298. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  299. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  300. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  301. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  302. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  303. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  304. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  305. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
  306. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  307. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  308. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  309. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  310. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  311. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  312. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  313. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  314. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  315. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  316. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  317. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  318. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  319. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  320. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  321. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  322. solace_agent_mesh/llm.txt +228 -0
  323. solace_agent_mesh/llm_detail.txt +2835 -0
  324. solace_agent_mesh/templates/agent_template.yaml +53 -0
  325. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  326. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  327. solace_agent_mesh/templates/gateway_component_template.py +400 -0
  328. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  329. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  330. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  331. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  332. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  333. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  334. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  335. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  336. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  337. solace_agent_mesh/templates/shared_config.yaml +66 -0
  338. solace_agent_mesh/templates/templates_llm.txt +147 -0
  339. solace_agent_mesh/templates/webui.yaml +53 -0
  340. solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
  341. solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
  342. solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
  343. {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
  344. solace_agent_mesh/agents/base_agent_component.py +0 -226
  345. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  346. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  347. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  348. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  349. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  350. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  351. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  352. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  353. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  354. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  355. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  356. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  357. solace_agent_mesh/agents/slack/__init__.py +0 -1
  358. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  359. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  360. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  361. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  362. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  363. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  364. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  365. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  366. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  367. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  368. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  369. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  370. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  371. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  372. solace_agent_mesh/cli/commands/add/add.py +0 -88
  373. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  374. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  375. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  376. solace_agent_mesh/cli/commands/build.py +0 -670
  377. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  378. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  379. solace_agent_mesh/cli/commands/config.py +0 -29
  380. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  382. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  383. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  384. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  385. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  386. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  387. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  388. solace_agent_mesh/cli/commands/init/init.py +0 -92
  389. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  390. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  391. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  392. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  393. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  394. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  395. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  396. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  397. solace_agent_mesh/cli/commands/run.py +0 -68
  398. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  399. solace_agent_mesh/cli/config.py +0 -85
  400. solace_agent_mesh/common/action.py +0 -91
  401. solace_agent_mesh/common/action_list.py +0 -37
  402. solace_agent_mesh/common/action_response.py +0 -340
  403. solace_agent_mesh/common/mysql_database.py +0 -40
  404. solace_agent_mesh/common/postgres_database.py +0 -85
  405. solace_agent_mesh/common/prompt_templates.py +0 -28
  406. solace_agent_mesh/common/stimulus_utils.py +0 -152
  407. solace_agent_mesh/common/time.py +0 -24
  408. solace_agent_mesh/common/utils.py +0 -712
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DMmCawWe.js +0 -42
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-dd988f05.js +0 -1
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  414. solace_agent_mesh/configs/agent_global.yaml +0 -74
  415. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  416. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  417. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  418. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  419. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  420. solace_agent_mesh/configs/monitor.yaml +0 -0
  421. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  422. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  423. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  424. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  425. solace_agent_mesh/configs/service_llm.yaml +0 -265
  426. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  427. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  428. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  429. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  430. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  431. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  432. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  433. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  434. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  435. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  436. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  437. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  438. solace_agent_mesh/orchestrator/__init__.py +0 -0
  439. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  440. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  441. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  442. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  443. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  444. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  445. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  446. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  447. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  448. solace_agent_mesh/services/__init__.py +0 -0
  449. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  450. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  451. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  452. solace_agent_mesh/services/common/__init__.py +0 -4
  453. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  454. solace_agent_mesh/services/common/singleton.py +0 -18
  455. solace_agent_mesh/services/file_service/__init__.py +0 -14
  456. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  457. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  458. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  459. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  460. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  461. solace_agent_mesh/services/file_service/file_service.py +0 -437
  462. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  463. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  464. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  465. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  466. solace_agent_mesh/services/history_service/__init__.py +0 -3
  467. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  468. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  469. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  470. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  471. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  472. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  473. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  474. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  475. solace_agent_mesh/services/history_service/history_service.py +0 -413
  476. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  477. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  478. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  479. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  480. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  481. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  482. solace_agent_mesh/templates/action.py +0 -38
  483. solace_agent_mesh/templates/agent.py +0 -29
  484. solace_agent_mesh/templates/agent.yaml +0 -70
  485. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  486. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  487. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  488. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  489. solace_agent_mesh/templates/gateway_base.py +0 -15
  490. solace_agent_mesh/templates/gateway_input.py +0 -98
  491. solace_agent_mesh/templates/gateway_output.py +0 -71
  492. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  493. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  494. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  495. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  496. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  497. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  498. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  499. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  500. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  501. solace_agent_mesh/templates/web-flows.yaml +0 -76
  502. solace_agent_mesh/tools/__init__.py +0 -0
  503. solace_agent_mesh/tools/components/__init__.py +0 -0
  504. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  505. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  506. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  507. solace_agent_mesh-0.2.3.dist-info/METADATA +0 -172
  508. solace_agent_mesh-0.2.3.dist-info/RECORD +0 -193
  509. solace_agent_mesh-0.2.3.dist-info/entry_points.txt +0 -3
  510. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  511. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  512. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  513. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  517. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  518. {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
@@ -2,232 +2,642 @@ import sys
2
2
  from flask import Flask, jsonify, request, send_from_directory, send_file
3
3
  from flask_cors import CORS
4
4
  import os
5
- import sys
6
- from solace_agent_mesh.config_portal.backend.common import default_options, CONTAINER_RUN_COMMAND
5
+ from pathlib import Path
6
+ from .common import (
7
+ INIT_DEFAULT,
8
+ CONTAINER_RUN_COMMAND,
9
+ AGENT_DEFAULTS,
10
+ GATEWAY_DEFAULTS,
11
+ USE_DEFAULT_SHARED_ARTIFACT,
12
+ )
7
13
  from cli.utils import get_formatted_names
14
+
8
15
  import shutil
9
16
  import litellm
17
+ from collections import defaultdict
10
18
 
11
- litellm.suppress_debug_info = True
12
-
13
- #disable flask startup banner
14
19
  import logging
15
- log = logging.getLogger('werkzeug')
20
+
21
+ log = logging.getLogger("werkzeug")
16
22
  log.disabled = True
17
- cli = sys.modules['flask.cli']
18
- cli.show_server_banner = lambda *x: None
23
+ cli_flask = sys.modules["flask.cli"]
24
+ cli_flask.show_server_banner = lambda *x: None
25
+ litellm.suppress_debug_info = True
26
+
27
+ config_portal_host = "CONFIG_PORTAL_HOST"
28
+
29
+ try:
30
+ from solace_agent_mesh.agent.tools.registry import tool_registry
31
+ except ImportError as err:
32
+ try:
33
+ from src.solace_agent_mesh.agent.tools.registry import tool_registry
34
+ except ImportError as exc:
35
+ log.error(
36
+ "Importing tool_registry failed. Ensure all the dependencies are installed and the import paths are correct, Error: %s",
37
+ str(err),
38
+ )
39
+ raise err from exc
40
+
41
+ def get_agent_field_definitions():
42
+ fields = []
43
+ fields.append(
44
+ {
45
+ "name": "agent_name",
46
+ "label": "Agent Name",
47
+ "type": "text",
48
+ "required": True,
49
+ "description": "Unique name for this agent (will be CamelCased).",
50
+ "default": "MyNewAgent",
51
+ }
52
+ )
53
+ fields.append(
54
+ {
55
+ "name": "namespace",
56
+ "label": "A2A Namespace",
57
+ "type": "text",
58
+ "default": AGENT_DEFAULTS["namespace"],
59
+ "description": "A2A topic namespace (e.g., myorg/dev). Can use ${NAMESPACE}.",
60
+ }
61
+ )
62
+ fields.append(
63
+ {
64
+ "name": "supports_streaming",
65
+ "label": "Supports Streaming",
66
+ "type": "boolean",
67
+ "default": AGENT_DEFAULTS["supports_streaming"],
68
+ }
69
+ )
70
+ fields.append(
71
+ {
72
+ "name": "model_type",
73
+ "label": "Model Type",
74
+ "type": "select",
75
+ "options": [
76
+ "planning",
77
+ "general",
78
+ "image_gen",
79
+ "report_gen",
80
+ "multimodal",
81
+ "gemini_pro",
82
+ ],
83
+ "default": AGENT_DEFAULTS["model_type"],
84
+ }
85
+ )
86
+ fields.append(
87
+ {
88
+ "name": "instruction",
89
+ "label": "Instruction",
90
+ "type": "textarea",
91
+ "default": AGENT_DEFAULTS["instruction"].replace(
92
+ "__AGENT_NAME__", "__AGENT_NAME__"
93
+ ),
94
+ "description": "System instruction for the agent.",
95
+ }
96
+ )
97
+
98
+ fields.append(
99
+ {
100
+ "name": "session_service_type",
101
+ "label": "Session Service Type",
102
+ "type": "select",
103
+ "options": ["memory", "vertex_rag"],
104
+ "default": AGENT_DEFAULTS["session_service_type"],
105
+ }
106
+ )
107
+ fields.append(
108
+ {
109
+ "name": "session_service_behavior",
110
+ "label": "Session Service Behavior",
111
+ "type": "select",
112
+ "options": ["PERSISTENT", "RUN_BASED"],
113
+ "default": AGENT_DEFAULTS["session_service_behavior"],
114
+ }
115
+ )
116
+
117
+ fields.append(
118
+ {
119
+ "name": "artifact_service_type",
120
+ "label": "Artifact Service Type",
121
+ "type": "select",
122
+ "options": ["memory", "filesystem", "gcs"],
123
+ "default": AGENT_DEFAULTS["artifact_service_type"],
124
+ }
125
+ )
126
+ fields.append(
127
+ {
128
+ "name": "artifact_service_base_path",
129
+ "label": "Artifact Service Base Path (if filesystem)",
130
+ "type": "text",
131
+ "default": AGENT_DEFAULTS["artifact_service_base_path"],
132
+ "condition": {"field": "artifact_service_type", "value": "filesystem"},
133
+ }
134
+ )
135
+ fields.append(
136
+ {
137
+ "name": "artifact_service_scope",
138
+ "label": "Artifact Service Scope",
139
+ "type": "select",
140
+ "options": ["namespace", "app", "custom"],
141
+ "default": AGENT_DEFAULTS["artifact_service_scope"],
142
+ }
143
+ )
144
+
145
+ fields.append(
146
+ {
147
+ "name": "artifact_handling_mode",
148
+ "label": "Artifact Handling Mode",
149
+ "type": "select",
150
+ "options": ["ignore", "embed", "reference"],
151
+ "default": AGENT_DEFAULTS["artifact_handling_mode"],
152
+ }
153
+ )
154
+ fields.append(
155
+ {
156
+ "name": "enable_embed_resolution",
157
+ "label": "Enable Embed Resolution",
158
+ "type": "boolean",
159
+ "default": AGENT_DEFAULTS["enable_embed_resolution"],
160
+ }
161
+ )
162
+ fields.append(
163
+ {
164
+ "name": "enable_artifact_content_instruction",
165
+ "label": "Enable Artifact Content Instruction",
166
+ "type": "boolean",
167
+ "default": AGENT_DEFAULTS["enable_artifact_content_instruction"],
168
+ }
169
+ )
170
+ fields.append(
171
+ {
172
+ "name": "agent_card_description",
173
+ "label": "Agent Card Description",
174
+ "type": "textarea",
175
+ "default": AGENT_DEFAULTS["agent_card_description"],
176
+ }
177
+ )
178
+ fields.append(
179
+ {
180
+ "name": "agent_card_default_input_modes_str",
181
+ "label": "Agent Card Default Input Modes (comma-sep)",
182
+ "type": "text",
183
+ "default": ",".join(AGENT_DEFAULTS["agent_card_default_input_modes"]),
184
+ }
185
+ )
186
+ fields.append(
187
+ {
188
+ "name": "agent_card_default_output_modes_str",
189
+ "label": "Agent Card Default Output Modes (comma-sep)",
190
+ "type": "text",
191
+ "default": ",".join(AGENT_DEFAULTS["agent_card_default_output_modes"]),
192
+ }
193
+ )
194
+
195
+ fields.append(
196
+ {
197
+ "name": "agent_card_publishing_interval",
198
+ "label": "Agent Card Publishing Interval (s)",
199
+ "type": "number",
200
+ "default": AGENT_DEFAULTS["agent_card_publishing_interval"],
201
+ }
202
+ )
203
+ fields.append(
204
+ {
205
+ "name": "agent_discovery_enabled",
206
+ "label": "Enable Agent Discovery",
207
+ "type": "boolean",
208
+ "default": AGENT_DEFAULTS["agent_discovery_enabled"],
209
+ }
210
+ )
211
+
212
+ fields.append(
213
+ {
214
+ "name": "inter_agent_communication_allow_list_str",
215
+ "label": "Inter-Agent Allow List (comma-sep)",
216
+ "type": "text",
217
+ "default": ",".join(AGENT_DEFAULTS["inter_agent_communication_allow_list"]),
218
+ }
219
+ )
220
+ fields.append(
221
+ {
222
+ "name": "inter_agent_communication_deny_list_str",
223
+ "label": "Inter-Agent Deny List (comma-sep)",
224
+ "type": "text",
225
+ "default": ",".join(AGENT_DEFAULTS["inter_agent_communication_deny_list"]),
226
+ }
227
+ )
228
+ fields.append(
229
+ {
230
+ "name": "inter_agent_communication_timeout",
231
+ "label": "Inter-Agent Timeout (s)",
232
+ "type": "number",
233
+ "default": AGENT_DEFAULTS["inter_agent_communication_timeout"],
234
+ }
235
+ )
236
+
237
+ return fields
238
+
19
239
 
20
240
  def create_app(shared_config=None):
21
241
  """Factory function that creates the Flask application with configuration injected"""
22
242
  app = Flask(__name__)
23
- CORS(app, resources={r"/api/*": {"origins": ["http://localhost:5174", "http://127.0.0.1:5174"]}})
243
+ CORS(app, resources={r"/api/*": {"origins": "*"}})
24
244
 
25
- EXCLUDE_OPTIONS = ["config_dir", "module_dir", "env_file", "build_dir", "container_engine", "rest_api_enabled",
26
- "rest_api_server_input_port", "rest_api_server_host", "rest_api_server_input_endpoint",
27
- "rest_api_gateway_name", "webui_enabled", "webui_listen_port", "webui_host"]
245
+ EXCLUDE_OPTIONS = ["container_engine"]
28
246
 
29
- @app.route('/api/default_options', methods=['GET'])
247
+ @app.route("/api/default_options", methods=["GET"])
30
248
  def get_default_options():
31
- """Endpoint that returns the default options for form initialization"""
32
- path = request.args.get('path', 'advanced')
33
-
34
- modified_default_options = default_options.copy()
35
-
36
- # Base exclusions for all paths
249
+ """Endpoint that returns the default options for form initialization (init flow)"""
250
+ path = request.args.get("path", "advanced")
251
+
252
+ modified_default_options = INIT_DEFAULT.copy()
253
+
37
254
  base_exclude_options = EXCLUDE_OPTIONS.copy()
38
-
39
- # Additional exclusions for quick path
40
255
  quick_path_exclude_options = [
41
- "namespace", "broker_type", "broker_url", "broker_vpn",
42
- "broker_username", "broker_password", "container_engine",
43
- "built_in_agent", "file_service_provider", "file_service_config"
256
+ "broker_url",
257
+ "broker_vpn",
258
+ "broker_username",
259
+ "broker_password",
260
+ "container_engine",
44
261
  ]
45
-
46
- # Apply exclusions based on path
262
+
47
263
  exclude_options = base_exclude_options.copy()
48
- if path == 'quick':
264
+ if path == "quick":
49
265
  exclude_options.extend(quick_path_exclude_options)
50
-
51
- # Remove excluded options
266
+ modified_default_options["dev_mode"] = True
267
+ modified_default_options["broker_type"] = "3"
52
268
  for option in exclude_options:
53
269
  modified_default_options.pop(option, None)
54
-
55
- return jsonify({
56
- "default_options": modified_default_options,
57
- "status": "success"
58
- })
59
270
 
60
- @app.route('/api/save_config', methods=['POST'])
61
- def save_config():
271
+ return jsonify(
272
+ {"default_options": modified_default_options, "status": "success"}
273
+ )
274
+
275
+ @app.route("/api/form_schema", methods=["GET"])
276
+ def get_form_schema():
277
+ """
278
+ Endpoint that returns defaults and field definitions for a given component type.
279
+ """
280
+ component_type = request.args.get("type", "agent")
281
+
282
+ if component_type == "agent":
283
+ return jsonify(
284
+ {
285
+ "status": "success",
286
+ "schema_type": "agent",
287
+ "defaults": AGENT_DEFAULTS,
288
+ "field_definitions": get_agent_field_definitions(),
289
+ }
290
+ )
291
+ elif component_type == "gateway":
292
+ return jsonify(
293
+ {
294
+ "status": "success",
295
+ "schema_type": "gateway",
296
+ "defaults": GATEWAY_DEFAULTS,
297
+ "meta": {
298
+ "artifact_service_types": [
299
+ USE_DEFAULT_SHARED_ARTIFACT,
300
+ "memory",
301
+ "filesystem",
302
+ "gcs",
303
+ ],
304
+ "artifact_service_scopes": ["namespace", "app", "custom"],
305
+ },
306
+ }
307
+ )
308
+ else:
309
+ return (
310
+ jsonify({"status": "error", "message": "Invalid component type"}),
311
+ 400,
312
+ )
313
+
314
+ @app.route("/api/available_tools", methods=["GET"])
315
+ def get_available_tools():
316
+ """
317
+ Endpoint that returns a structured list of all available built-in tools and groups.
318
+ """
319
+ try:
320
+ all_tools = tool_registry.get_all_tools()
321
+
322
+ groups = defaultdict(lambda: {"description": "", "tools": []})
323
+ tools_map = {}
324
+
325
+ group_descriptions = {
326
+ "artifact_management": "Creating, loading, and managing files and artifacts.",
327
+ "data_analysis": "Querying, transforming, and visualizing data.",
328
+ "general": "General purpose utilities like file conversion and diagram generation.",
329
+ "web": "Interacting with web resources via HTTP requests.",
330
+ "audio": "Generating and transcribing audio content.",
331
+ "image": "Generating, describing, and editing images.",
332
+ "test": "Tools for testing and development purposes.",
333
+ }
334
+
335
+ for tool in sorted(all_tools, key=lambda t: (t.category, t.name)):
336
+ groups[tool.category]["tools"].append(tool.name)
337
+ if not groups[tool.category]["description"]:
338
+ groups[tool.category]["description"] = group_descriptions.get(
339
+ tool.category,
340
+ f"Tools related to {tool.category.replace('_', ' ').title()}.",
341
+ )
342
+ tools_map[tool.name] = {
343
+ "description": tool.description,
344
+ "category": tool.category,
345
+ }
346
+
347
+ return jsonify(
348
+ {"status": "success", "groups": dict(groups), "tools": tools_map}
349
+ )
350
+ except Exception as e:
351
+ app.logger.error(f"Error in get_available_tools: {e}", exc_info=True)
352
+ return jsonify({"status": "error", "message": str(e)}), 500
353
+
354
+ @app.route("/api/save_gateway_config", methods=["POST"])
355
+ def save_gateway_config_route():
62
356
  """
63
- Endpoint that accepts configuration data from the frontend,
64
- merges it with default options, and updates the shared configuration.
357
+ Accepts gateway configuration from frontend and passes it back to CLI via shared_config.
65
358
  """
359
+ try:
360
+ data = request.json
361
+ if not data:
362
+ return jsonify({"status": "error", "message": "No data received"}), 400
363
+
364
+ gateway_name_input = data.get("gateway_name_input")
365
+ config_options = data.get("config")
366
+
367
+ if not gateway_name_input or not isinstance(config_options, dict):
368
+ return (
369
+ jsonify(
370
+ {
371
+ "status": "error",
372
+ "message": "Missing gateway_name_input or config data",
373
+ }
374
+ ),
375
+ 400,
376
+ )
377
+
378
+ if "namespace" not in config_options:
379
+ config_options["namespace"] = GATEWAY_DEFAULTS.get(
380
+ "namespace", "${NAMESPACE}"
381
+ )
382
+
383
+ if shared_config is not None:
384
+ shared_config["status"] = "success_from_gui_save"
385
+ shared_config["gateway_name_input"] = gateway_name_input
386
+ shared_config["config"] = config_options
387
+
388
+ return jsonify(
389
+ {
390
+ "status": "success",
391
+ "message": "Gateway configuration data received by server. CLI will process.",
392
+ }
393
+ )
394
+
395
+ except Exception as e:
396
+ app.logger.error(f"Error in save_gateway_config_route: {e}", exc_info=True)
397
+ if shared_config is not None:
398
+ shared_config["status"] = "error_in_gui_save"
399
+ shared_config["message"] = str(e)
400
+ return jsonify({"status": "error", "message": str(e)}), 500
401
+
402
+ @app.route("/api/save_agent_config", methods=["POST"])
403
+ def save_agent_config_route():
404
+ """
405
+ Accepts agent configuration from frontend and passes it back to CLI via shared_config.
406
+ """
407
+ try:
408
+ data = request.json
409
+ if not data:
410
+ return jsonify({"status": "error", "message": "No data received"}), 400
411
+
412
+ agent_name_input = data.get("agent_name_input")
413
+ config_options = data.get("config")
414
+
415
+ if not agent_name_input or not config_options:
416
+ return (
417
+ jsonify(
418
+ {
419
+ "status": "error",
420
+ "message": "Missing agent_name_input or config data",
421
+ }
422
+ ),
423
+ 400,
424
+ )
425
+
426
+ str_list_keys_to_process = {
427
+ "agent_card_default_input_modes_str": "agent_card_default_input_modes",
428
+ "agent_card_default_output_modes_str": "agent_card_default_output_modes",
429
+ "inter_agent_communication_allow_list_str": "inter_agent_communication_allow_list",
430
+ "inter_agent_communication_deny_list_str": "inter_agent_communication_deny_list",
431
+ }
432
+ processed_options = config_options.copy()
433
+ for key_str, original_key in str_list_keys_to_process.items():
434
+ if key_str in processed_options and isinstance(
435
+ processed_options[key_str], str
436
+ ):
437
+ processed_options[original_key] = [
438
+ s.strip()
439
+ for s in processed_options[key_str].split(",")
440
+ if s.strip()
441
+ ]
442
+ elif original_key not in processed_options:
443
+ processed_options[original_key] = []
444
+
445
+ if "agent_card_skills" in processed_options and isinstance(
446
+ processed_options["agent_card_skills"], list
447
+ ):
448
+ if "agent_card_skills_str" in processed_options:
449
+ del processed_options["agent_card_skills_str"]
450
+ elif "agent_card_skills_str" in processed_options and isinstance(
451
+ processed_options["agent_card_skills_str"], str
452
+ ):
453
+ try:
454
+ import json
455
+
456
+ parsed_skills = json.loads(
457
+ processed_options["agent_card_skills_str"]
458
+ )
459
+ if isinstance(parsed_skills, list):
460
+ processed_options["agent_card_skills"] = parsed_skills
461
+ else:
462
+ app.logger.warn(
463
+ f"Parsed agent_card_skills_str was not a list: {parsed_skills}. Defaulting to empty list."
464
+ )
465
+ processed_options["agent_card_skills"] = []
466
+ except json.JSONDecodeError:
467
+ app.logger.warn(
468
+ f"Could not parse agent_card_skills_str: {processed_options['agent_card_skills_str']}. Defaulting to empty list."
469
+ )
470
+ processed_options["agent_card_skills"] = []
471
+ elif "agent_card_skills" not in processed_options:
472
+ processed_options["agent_card_skills"] = []
473
+
474
+ formatted_names = get_formatted_names(agent_name_input)
475
+ processed_options["agent_name"] = formatted_names["PASCAL_CASE_NAME"]
476
+ if shared_config is not None:
477
+ shared_config["status"] = "success_from_gui_save"
478
+ shared_config["agent_name_input"] = agent_name_input
479
+ shared_config["config"] = processed_options
480
+ return jsonify(
481
+ {
482
+ "status": "success",
483
+ "message": "Agent configuration data received by server. CLI will process.",
484
+ }
485
+ )
486
+
487
+ except Exception as e:
488
+ app.logger.error(f"Error in save_agent_config_route: {e}", exc_info=True)
489
+ if shared_config is not None:
490
+ shared_config["status"] = "error_in_gui_save"
491
+ shared_config["message"] = str(e)
492
+ return jsonify({"status": "error", "message": str(e)}), 500
493
+
494
+ @app.route("/api/save_config", methods=["POST"])
495
+ def save_config():
66
496
  try:
67
497
  received_data = request.json
68
- force = received_data.pop('force', False)
498
+ force = received_data.pop("force", False)
69
499
 
70
500
  if not received_data:
71
501
  return jsonify({"status": "error", "message": "No data received"}), 400
72
-
73
- complete_config = default_options.copy()
74
-
75
- # Update with the received data
502
+
503
+ complete_config = INIT_DEFAULT.copy()
76
504
  for key, value in received_data.items():
77
505
  if key in complete_config or key:
78
506
  complete_config[key] = value
79
-
80
- config_directory = complete_config["config_dir"]
81
- formatted_name = get_formatted_names(complete_config["rest_api_gateway_name"])
82
- gateway_directory = os.path.join(
83
- config_directory, "gateways", formatted_name["SNAKE_CASE_NAME"]
84
- )
85
-
86
- #Handle the case where the gateway directory for rest already exists
87
- if os.path.exists(gateway_directory) and not force:
88
- return jsonify({"status": "ask_confirmation", "message": f"Gateway directory {gateway_directory} already exists, it will be overwritten."}), 400
89
- elif os.path.exists(gateway_directory) and force:
90
- shutil.rmtree(gateway_directory)
91
507
 
92
- # Update the shared configuration if it exists
93
508
  if shared_config is not None:
94
509
  for key, value in complete_config.items():
95
510
  shared_config[key] = value
96
-
97
- return jsonify({
98
- "status": "success",
99
- })
100
-
511
+
512
+ return jsonify({"status": "success"})
513
+
101
514
  except Exception as e:
515
+ app.logger.error(f"Error in save_config: {e}", exc_info=True)
102
516
  return jsonify({"status": "error", "message": str(e)}), 500
103
-
104
- @app.route('/api/test_llm_config', methods=['POST'])
517
+
518
+ @app.route("/api/test_llm_config", methods=["POST"])
105
519
  def test_llm_config():
106
- """
107
- Endpoint that tests the LLM configuration given by the users"""
108
520
  llm_config = request.json
109
-
110
- #check for all values
111
- if not llm_config.get("model") or not llm_config.get("api_key") or not llm_config.get("base_url"):
112
- return jsonify({"status": "error", "message": "Please provide all the required values"}), 400
113
-
521
+ if (
522
+ not llm_config.get("model")
523
+ or not llm_config.get("api_key")
524
+ or not llm_config.get("base_url")
525
+ ):
526
+ return (
527
+ jsonify(
528
+ {
529
+ "status": "error",
530
+ "message": "Please provide all the required values",
531
+ }
532
+ ),
533
+ 400,
534
+ )
114
535
  try:
115
536
  response = litellm.completion(
116
537
  model=llm_config.get("model"),
117
538
  api_key=llm_config.get("api_key"),
118
539
  base_url=llm_config.get("base_url"),
119
- messages=[{"role":"user","content": "Say OK"}]
120
- )
540
+ messages=[{"role": "user", "content": "Say OK"}],
541
+ )
121
542
  message = response.get("choices")[0].get("message")
122
-
123
543
  if message is not None:
124
544
  return jsonify({"status": "success", "message": message.content}), 200
125
545
  else:
126
546
  raise ValueError("No response from LLM")
127
- except Exception:
547
+ except Exception:
128
548
  return jsonify({"status": "error", "message": "No response from LLM."}), 400
129
549
 
130
-
131
-
132
- @app.route('/api/runcontainer', methods=['POST'])
550
+ @app.route("/api/runcontainer", methods=["POST"])
133
551
  def runcontainer():
134
552
  try:
135
553
  data = request.json or {}
136
-
137
- # Check if the user has podman or docker installed
138
554
  has_podman = shutil.which("podman") is not None
139
555
  has_docker = shutil.which("docker") is not None
140
-
141
556
  if not has_podman and not has_docker:
142
- return jsonify({
143
- "status": "error",
144
- "message": "You need to have either podman or docker installed to use the container broker."
145
- }), 400
146
-
147
- # Determine which container engine to use
148
- container_engine = data.get('container_engine')
149
-
150
- # If both are available, default to podman
557
+ return (
558
+ jsonify(
559
+ {
560
+ "status": "error",
561
+ "message": "You need to have either podman or docker installed.",
562
+ }
563
+ ),
564
+ 400,
565
+ )
566
+
567
+ container_engine = data.get("container_engine")
151
568
  if not container_engine and has_podman and has_docker:
152
569
  container_engine = "podman"
153
- # If only one is available, use that one
154
570
  elif not container_engine:
155
571
  container_engine = "podman" if has_podman else "docker"
156
-
157
- # Validate the container engine selection
572
+
158
573
  if container_engine not in ["podman", "docker"]:
159
- return jsonify({
160
- "status": "error",
161
- "message": f"Invalid container engine: {container_engine}. Must be 'podman' or 'docker'."
162
- }), 400
163
-
574
+ return jsonify({"status": "error", "message": "Invalid engine."}), 400
164
575
  if container_engine == "podman" and not has_podman:
165
- return jsonify({
166
- "status": "error",
167
- "message": "Podman was selected but is not installed on this system."
168
- }), 400
169
-
576
+ return (
577
+ jsonify({"status": "error", "message": "Podman not installed."}),
578
+ 400,
579
+ )
170
580
  if container_engine == "docker" and not has_docker:
171
- return jsonify({
172
- "status": "error",
173
- "message": "Docker was selected but is not installed on this system."
174
- }), 400
175
-
176
- # Run command for the container start
581
+ return (
582
+ jsonify({"status": "error", "message": "Docker not installed."}),
583
+ 400,
584
+ )
585
+
177
586
  command = container_engine + CONTAINER_RUN_COMMAND
178
-
179
- # Execute the command and capture exit code
180
587
  response_status = os.system(command)
181
-
588
+
182
589
  if response_status != 0:
183
- return jsonify({
184
- "status": "error",
185
- "message": f"Failed to start container. Exit code: {response_status}"
186
- }), 500
187
-
188
- return jsonify({
189
- "status": "success",
190
- "message": f"Successfully started Solace PubSub+ broker container using {container_engine}",
191
- "container_engine": container_engine
192
- })
193
-
590
+ return (
591
+ jsonify(
592
+ {
593
+ "status": "error",
594
+ "message": "The creation of a new container failed. You can try switching to dev mode or existing broker mode. You can also check this url to find possible solutions https://docs.solace.com/Software-Broker/Container-Tasks/rootless-containers.htm#rootful-versus-rootless-containers",
595
+ }
596
+ ),
597
+ 500,
598
+ )
599
+ return jsonify(
600
+ {
601
+ "status": "success",
602
+ "message": f"Started container via {container_engine}",
603
+ "container_engine": container_engine,
604
+ }
605
+ )
194
606
  except Exception as e:
195
607
  return jsonify({"status": "error", "message": str(e)}), 500
196
608
 
197
-
198
- @app.route('/api/shutdown', methods=['POST'])
609
+ @app.route("/api/shutdown", methods=["POST"])
199
610
  def shutdown():
200
611
  """Kills this Flask process immediately"""
201
612
  response = jsonify({"message": "Server shutting down...", "status": "success"})
202
- os._exit(0)
613
+ os._exit(0)
203
614
  return response
204
-
205
615
 
616
+ frontend_static_dir = (
617
+ Path(__file__).resolve().parent.parent / "frontend" / "static" / "client"
618
+ )
206
619
 
207
620
  @app.route("/assets/<path:path>")
208
621
  def serve_assets(path):
209
- return send_from_directory("../frontend/static/client/assets", path)
622
+ return send_from_directory(frontend_static_dir / "assets", path)
210
623
 
211
624
  @app.route("/static/client/<path:path>")
212
625
  def serve_client_files(path):
213
- return send_from_directory("../frontend/static/client", path)
626
+ return send_from_directory(frontend_static_dir, path)
214
627
 
215
628
  @app.route("/", defaults={"path": ""})
216
- def serve(path):
217
- return send_file("../frontend/static/client/index.html")
218
-
219
629
  @app.route("/<path:path>")
220
- def serve_files(path):
221
- if path.endswith(('.png', '.jpg', '.jpeg', '.gif', '.ico')):
222
- return send_from_directory("../frontend/static/client", path)
223
- return send_file("../frontend/static/client/index.html")
224
-
630
+ def serve_index(path):
631
+ if os.path.splitext(path)[1] and os.path.exists(frontend_static_dir / path):
632
+ return send_from_directory(frontend_static_dir, path)
633
+ return send_file(frontend_static_dir / "index.html")
634
+
225
635
  return app
226
636
 
637
+
227
638
  def run_flask(host="127.0.0.1", port=5002, shared_config=None):
228
- """
229
- Run the Flask development server with dependency-injected shared configuration.
230
- """
639
+ host = os.environ.get(config_portal_host, host)
231
640
  app = create_app(shared_config)
641
+ app.logger.setLevel(logging.INFO)
642
+ app.logger.info(f"Starting Flask app on {host}:{port}")
232
643
  app.run(host=host, port=port, debug=False, use_reloader=False)
233
-