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