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
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Router for handling authentication-related endpoints.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from fastapi import (
|
|
6
|
+
APIRouter,
|
|
7
|
+
Request as FastAPIRequest,
|
|
8
|
+
Depends,
|
|
9
|
+
HTTPException,
|
|
10
|
+
Response,
|
|
11
|
+
)
|
|
12
|
+
from fastapi.responses import RedirectResponse
|
|
13
|
+
import httpx
|
|
14
|
+
import secrets
|
|
15
|
+
from urllib.parse import urlencode
|
|
16
|
+
|
|
17
|
+
from ...http_sse.dependencies import get_sac_component, get_api_config
|
|
18
|
+
from solace_ai_connector.common.log import log
|
|
19
|
+
|
|
20
|
+
router = APIRouter()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@router.get("/auth/login")
|
|
24
|
+
async def initiate_login(
|
|
25
|
+
request: FastAPIRequest, config: dict = Depends(get_api_config)
|
|
26
|
+
):
|
|
27
|
+
"""
|
|
28
|
+
Initiates the login flow by redirecting to the external authorization service.
|
|
29
|
+
"""
|
|
30
|
+
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
31
|
+
callback_url = config.get(
|
|
32
|
+
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
params = {
|
|
36
|
+
"provider": config.get("external_auth_provider", "azure"),
|
|
37
|
+
"redirect_uri": callback_url,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
login_url = f"{external_auth_url}/login?{urlencode(params)}"
|
|
41
|
+
log.info(f"Redirecting to external authorization service: {login_url}")
|
|
42
|
+
|
|
43
|
+
return RedirectResponse(url=login_url)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@router.get("/csrf-token")
|
|
47
|
+
async def get_csrf_token(
|
|
48
|
+
response: Response, component: "WebUIBackendComponent" = Depends(get_sac_component)
|
|
49
|
+
):
|
|
50
|
+
"""
|
|
51
|
+
Generates and returns a CSRF token, setting it as a readable cookie and returning it in the response.
|
|
52
|
+
"""
|
|
53
|
+
csrf_token = secrets.token_urlsafe(32)
|
|
54
|
+
|
|
55
|
+
response.set_cookie(
|
|
56
|
+
key="csrf_token",
|
|
57
|
+
value=csrf_token,
|
|
58
|
+
httponly=False,
|
|
59
|
+
secure=False,
|
|
60
|
+
samesite="lax",
|
|
61
|
+
max_age=3600,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return {"message": "CSRF token set", "csrf_token": csrf_token}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@router.get("/auth/callback")
|
|
68
|
+
async def auth_callback(
|
|
69
|
+
request: FastAPIRequest,
|
|
70
|
+
config: dict = Depends(get_api_config),
|
|
71
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
72
|
+
):
|
|
73
|
+
"""
|
|
74
|
+
Handles the callback from the OIDC provider by calling an external exchange service.
|
|
75
|
+
"""
|
|
76
|
+
code = request.query_params.get("code")
|
|
77
|
+
|
|
78
|
+
if not code:
|
|
79
|
+
raise HTTPException(status_code=400, detail="Missing authorization code")
|
|
80
|
+
|
|
81
|
+
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
82
|
+
exchange_url = f"{external_auth_url}/exchange-code"
|
|
83
|
+
redirect_uri = config.get(
|
|
84
|
+
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
async with httpx.AsyncClient() as client:
|
|
88
|
+
try:
|
|
89
|
+
response = await client.post(
|
|
90
|
+
exchange_url,
|
|
91
|
+
json={
|
|
92
|
+
"code": code,
|
|
93
|
+
"provider": config.get("external_auth_provider", "azure"),
|
|
94
|
+
"redirect_uri": redirect_uri,
|
|
95
|
+
},
|
|
96
|
+
timeout=20.0,
|
|
97
|
+
)
|
|
98
|
+
response.raise_for_status()
|
|
99
|
+
token_data = response.json()
|
|
100
|
+
except httpx.HTTPStatusError as e:
|
|
101
|
+
log.error(f"Failed to exchange code: {e.response.text}")
|
|
102
|
+
raise HTTPException(
|
|
103
|
+
status_code=e.response.status_code,
|
|
104
|
+
detail=f"Failed to exchange code: {e.response.text}",
|
|
105
|
+
)
|
|
106
|
+
except Exception as e:
|
|
107
|
+
log.error(f"Error during code exchange: {e}")
|
|
108
|
+
raise HTTPException(status_code=500, detail="Error during code exchange")
|
|
109
|
+
|
|
110
|
+
access_token = token_data.get("access_token")
|
|
111
|
+
refresh_token = token_data.get("refresh_token")
|
|
112
|
+
|
|
113
|
+
if not access_token:
|
|
114
|
+
raise HTTPException(
|
|
115
|
+
status_code=400, detail="Access token not in response from exchange service"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
request.session["access_token"] = access_token
|
|
119
|
+
if refresh_token:
|
|
120
|
+
request.session["refresh_token"] = refresh_token
|
|
121
|
+
log.debug("Tokens stored directly in session.")
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
async with httpx.AsyncClient() as client:
|
|
125
|
+
user_info_response = await client.get(
|
|
126
|
+
f"{external_auth_url}/user_info",
|
|
127
|
+
params={"provider": config.get("external_auth_provider", "azure")},
|
|
128
|
+
headers={"Authorization": f"Bearer {access_token}"},
|
|
129
|
+
)
|
|
130
|
+
user_info_response.raise_for_status()
|
|
131
|
+
user_info = user_info_response.json()
|
|
132
|
+
|
|
133
|
+
user_id = user_info.get("email", "authenticated_user")
|
|
134
|
+
if user_id:
|
|
135
|
+
session_manager = component.get_session_manager()
|
|
136
|
+
session_manager.store_user_id(request, user_id)
|
|
137
|
+
else:
|
|
138
|
+
log.warning("Could not find 'email' in user info response.")
|
|
139
|
+
|
|
140
|
+
except httpx.HTTPStatusError as e:
|
|
141
|
+
log.error(f"Failed to get user info: {e.response.text}")
|
|
142
|
+
|
|
143
|
+
except Exception as e:
|
|
144
|
+
log.error(f"Error getting user info: {e}")
|
|
145
|
+
|
|
146
|
+
frontend_base_url = config.get("frontend_redirect_url", "http://localhost:3000")
|
|
147
|
+
|
|
148
|
+
hash_params = {"access_token": access_token}
|
|
149
|
+
if refresh_token:
|
|
150
|
+
hash_params["refresh_token"] = refresh_token
|
|
151
|
+
|
|
152
|
+
hash_fragment = urlencode(hash_params)
|
|
153
|
+
|
|
154
|
+
frontend_redirect_url = f"{frontend_base_url}/auth-callback.html#{hash_fragment}"
|
|
155
|
+
return RedirectResponse(url=frontend_redirect_url)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@router.post("/auth/refresh")
|
|
159
|
+
async def refresh_token(
|
|
160
|
+
request: FastAPIRequest,
|
|
161
|
+
config: dict = Depends(get_api_config),
|
|
162
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
163
|
+
):
|
|
164
|
+
"""
|
|
165
|
+
Refreshes an access token using the external authorization service.
|
|
166
|
+
"""
|
|
167
|
+
data = await request.json()
|
|
168
|
+
refresh_token = data.get("refresh_token")
|
|
169
|
+
if not refresh_token:
|
|
170
|
+
raise HTTPException(status_code=400, detail="Missing refresh_token")
|
|
171
|
+
|
|
172
|
+
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
173
|
+
refresh_url = f"{external_auth_url}/refresh_token"
|
|
174
|
+
|
|
175
|
+
async with httpx.AsyncClient() as client:
|
|
176
|
+
try:
|
|
177
|
+
response = await client.post(
|
|
178
|
+
refresh_url,
|
|
179
|
+
json={
|
|
180
|
+
"refresh_token": refresh_token,
|
|
181
|
+
"provider": config.get("external_auth_provider", "azure"),
|
|
182
|
+
},
|
|
183
|
+
timeout=20.0,
|
|
184
|
+
)
|
|
185
|
+
response.raise_for_status()
|
|
186
|
+
token_data = response.json()
|
|
187
|
+
except httpx.HTTPStatusError as e:
|
|
188
|
+
log.error(f"Failed to refresh token: {e.response.text}")
|
|
189
|
+
raise HTTPException(
|
|
190
|
+
status_code=e.response.status_code,
|
|
191
|
+
detail=f"Failed to refresh token: {e.response.text}",
|
|
192
|
+
)
|
|
193
|
+
except Exception as e:
|
|
194
|
+
log.error(f"Error during token refresh: {e}")
|
|
195
|
+
raise HTTPException(status_code=500, detail="Error during token refresh")
|
|
196
|
+
|
|
197
|
+
access_token = token_data.get("access_token")
|
|
198
|
+
new_refresh_token = token_data.get("refresh_token")
|
|
199
|
+
|
|
200
|
+
if not access_token:
|
|
201
|
+
raise HTTPException(
|
|
202
|
+
status_code=400, detail="Access token not in response from refresh service"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
session_manager = component.get_session_manager()
|
|
206
|
+
session_manager.store_auth_tokens(request, access_token, new_refresh_token)
|
|
207
|
+
log.info("Successfully refreshed and updated tokens in session.")
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
"access_token": access_token,
|
|
211
|
+
"refresh_token": new_refresh_token,
|
|
212
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API Router for providing frontend configuration.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from fastapi import APIRouter, Depends, HTTPException, status
|
|
6
|
+
from typing import Dict, Any
|
|
7
|
+
|
|
8
|
+
from solace_ai_connector.common.log import log
|
|
9
|
+
|
|
10
|
+
from ....gateway.http_sse.dependencies import get_sac_component
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from gateway.http_sse.component import WebUIBackendComponent
|
|
15
|
+
|
|
16
|
+
router = APIRouter()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@router.get("/config", response_model=Dict[str, Any])
|
|
20
|
+
async def get_app_config(
|
|
21
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
22
|
+
):
|
|
23
|
+
"""
|
|
24
|
+
Provides configuration settings needed by the frontend application.
|
|
25
|
+
"""
|
|
26
|
+
log_prefix = "[GET /api/v1/config] "
|
|
27
|
+
log.info("%sRequest received.", log_prefix)
|
|
28
|
+
try:
|
|
29
|
+
config_data = {
|
|
30
|
+
"frontend_server_url": "",
|
|
31
|
+
"frontend_auth_login_url": component.get_config(
|
|
32
|
+
"frontend_auth_login_url", ""
|
|
33
|
+
),
|
|
34
|
+
"frontend_use_authorization": component.get_config(
|
|
35
|
+
"frontend_use_authorization", False
|
|
36
|
+
),
|
|
37
|
+
"frontend_welcome_message": component.get_config(
|
|
38
|
+
"frontend_welcome_message", ""
|
|
39
|
+
),
|
|
40
|
+
"frontend_redirect_url": component.get_config("frontend_redirect_url", ""),
|
|
41
|
+
"frontend_collect_feedback": component.get_config(
|
|
42
|
+
"frontend_collect_feedback", False
|
|
43
|
+
),
|
|
44
|
+
"frontend_bot_name": component.get_config("frontend_bot_name", "A2A Agent"),
|
|
45
|
+
}
|
|
46
|
+
log.info("%sReturning frontend configuration.", log_prefix)
|
|
47
|
+
return config_data
|
|
48
|
+
except Exception as e:
|
|
49
|
+
log.exception(
|
|
50
|
+
"%sError retrieving configuration for frontend: %s", log_prefix, e
|
|
51
|
+
)
|
|
52
|
+
raise HTTPException(
|
|
53
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
54
|
+
detail="Internal server error retrieving configuration.",
|
|
55
|
+
)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API endpoints for people-related features, such as user search for autocomplete.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Any, Dict, List
|
|
6
|
+
|
|
7
|
+
from fastapi import APIRouter, Depends, Query
|
|
8
|
+
from solace_ai_connector.common.log import log
|
|
9
|
+
|
|
10
|
+
from ..dependencies import get_people_service
|
|
11
|
+
from ..services.people_service import PeopleService
|
|
12
|
+
|
|
13
|
+
router = APIRouter()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@router.get("/people/search", response_model=List[Dict[str, Any]])
|
|
17
|
+
async def search_people(
|
|
18
|
+
q: str = Query(
|
|
19
|
+
...,
|
|
20
|
+
min_length=2,
|
|
21
|
+
max_length=50,
|
|
22
|
+
description="Search query for user name/email.",
|
|
23
|
+
),
|
|
24
|
+
limit: int = Query(
|
|
25
|
+
10, ge=1, le=25, description="Maximum number of results to return."
|
|
26
|
+
),
|
|
27
|
+
people_service: PeopleService = Depends(get_people_service),
|
|
28
|
+
):
|
|
29
|
+
"""
|
|
30
|
+
Searches for users to populate frontend autocomplete suggestions (e.g., for @mentions).
|
|
31
|
+
"""
|
|
32
|
+
log.debug("Endpoint /people/search called with query: '%s'", q)
|
|
33
|
+
results = await people_service.search_for_users(query=q, limit=limit)
|
|
34
|
+
return results
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
API endpoints for people-related features, such as user search for autocomplete.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
from typing import Any, Dict, List
|
|
42
|
+
|
|
43
|
+
from fastapi import APIRouter, Depends, Query
|
|
44
|
+
from solace_ai_connector.common.log import log
|
|
45
|
+
from ..dependencies import get_people_service
|
|
46
|
+
from ..services.people_service import PeopleService
|
|
47
|
+
|
|
48
|
+
router = APIRouter()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@router.get("/people/search", response_model=List[Dict[str, Any]])
|
|
52
|
+
async def search_people(
|
|
53
|
+
q: str = Query(
|
|
54
|
+
...,
|
|
55
|
+
min_length=2,
|
|
56
|
+
max_length=50,
|
|
57
|
+
description="Search query for user name/email.",
|
|
58
|
+
),
|
|
59
|
+
limit: int = Query(
|
|
60
|
+
10, ge=1, le=25, description="Maximum number of results to return."
|
|
61
|
+
),
|
|
62
|
+
people_service: PeopleService = Depends(get_people_service),
|
|
63
|
+
):
|
|
64
|
+
"""
|
|
65
|
+
Searches for users to populate frontend autocomplete suggestions (e.g., for @mentions).
|
|
66
|
+
"""
|
|
67
|
+
log.debug("Endpoint /people/search called with query: '%s'", q)
|
|
68
|
+
results = await people_service.search_for_users(query=q, limit=limit)
|
|
69
|
+
return results
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Here is the DEVELOPER GUIDE for the `routers` directory.
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
The `routers` directory contains FastAPI `APIRouter` modules that define the REST API endpoints for the HTTP SSE Gateway. Each file groups endpoints by a specific domain of functionality, such as agent discovery, artifact management, user authentication, task submission, and real-time event streaming. These routers are the primary interface for frontend applications and other clients to interact with the gateway.
|
|
5
|
+
|
|
6
|
+
## Files Overview
|
|
7
|
+
- `__init__.py`: Marks the directory as a Python package.
|
|
8
|
+
- `agents.py`: API endpoints for discovering available A2A agents.
|
|
9
|
+
- `artifacts.py`: REST endpoints for managing session-specific artifacts (upload, download, list, delete).
|
|
10
|
+
- `auth.py`: Endpoints for handling the user authentication flow (login, callback, refresh, CSRF).
|
|
11
|
+
- `config.py`: API endpoint for providing configuration settings to the frontend application.
|
|
12
|
+
- `people.py`: API endpoints for user search functionality, typically for autocomplete features.
|
|
13
|
+
- `sessions.py`: API endpoints for managing user sessions (creating new sessions, getting current session info).
|
|
14
|
+
- `sse.py`: The Server-Sent Events (SSE) endpoint for streaming real-time task updates to the client.
|
|
15
|
+
- `tasks.py`: API endpoints for submitting tasks to agents and managing their lifecycle (e.g., cancellation).
|
|
16
|
+
- `users.py`: API endpoint for retrieving information about the currently authenticated user.
|
|
17
|
+
- `visualization.py`: API endpoints for managing A2A message visualization streams for monitoring and debugging.
|
|
18
|
+
|
|
19
|
+
## Developer API Reference
|
|
20
|
+
|
|
21
|
+
### agents.py
|
|
22
|
+
**Purpose:** Provides REST endpoints for agent discovery.
|
|
23
|
+
**Import:** `from src.solace_agent_mesh.gateway.http_sse.routers.agents import router`
|
|
24
|
+
|
|
25
|
+
**Functions:**
|
|
26
|
+
- `get_discovered_agents() -> List[AgentCard]`: Retrieves a list of all currently discovered and available A2A agents. The `AgentCard` type contains details about each agent.
|
|
27
|
+
|
|
28
|
+
**Usage Examples:**
|
|
29
|
+
```python
|
|
30
|
+
# To include this router in a FastAPI application
|
|
31
|
+
from fastapi import FastAPI
|
|
32
|
+
from src.solace_agent_mesh.gateway.http_sse.routers.agents import router
|
|
33
|
+
|
|
34
|
+
app = FastAPI()
|
|
35
|
+
app.include_router(router, prefix="/api/v1")
|
|
36
|
+
|
|
37
|
+
# A client would make a GET request to /api/v1/agents
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API Router for managing user sessions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from fastapi import APIRouter, Depends, HTTPException, Request as FastAPIRequest, status
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from solace_ai_connector.common.log import log
|
|
9
|
+
from ....gateway.http_sse.session_manager import SessionManager
|
|
10
|
+
from ....gateway.http_sse.dependencies import get_session_manager
|
|
11
|
+
from ....common.types import JSONRPCResponse, InternalError
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from ....gateway.http_sse.component import WebUIBackendComponent
|
|
15
|
+
|
|
16
|
+
router = APIRouter()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@router.post("/new", response_model=JSONRPCResponse)
|
|
20
|
+
async def create_new_session(
|
|
21
|
+
request: FastAPIRequest,
|
|
22
|
+
session_manager: SessionManager = Depends(get_session_manager),
|
|
23
|
+
):
|
|
24
|
+
"""
|
|
25
|
+
Forces creation of a new A2A session, replacing any existing one.
|
|
26
|
+
Returns the new session ID.
|
|
27
|
+
"""
|
|
28
|
+
log_prefix = "[POST /api/v1/sessions/new] "
|
|
29
|
+
log.info("%sReceived new session creation request", log_prefix)
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
new_session_id = session_manager.start_new_a2a_session(request)
|
|
33
|
+
|
|
34
|
+
log.info("%sCreated new A2A session: %s", log_prefix, new_session_id)
|
|
35
|
+
|
|
36
|
+
return JSONRPCResponse(
|
|
37
|
+
result={
|
|
38
|
+
"sessionId": new_session_id,
|
|
39
|
+
"message": "New A2A session created successfully",
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
except Exception as e:
|
|
44
|
+
log.exception("%sError creating new session: %s", log_prefix, e)
|
|
45
|
+
error_resp = InternalError(message=f"Failed to create new session: {e}")
|
|
46
|
+
raise HTTPException(
|
|
47
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
48
|
+
detail=error_resp.model_dump(exclude_none=True),
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@router.get("/current", response_model=JSONRPCResponse)
|
|
53
|
+
async def get_current_session(
|
|
54
|
+
request: FastAPIRequest,
|
|
55
|
+
session_manager: SessionManager = Depends(get_session_manager),
|
|
56
|
+
):
|
|
57
|
+
"""
|
|
58
|
+
Returns information about the current session.
|
|
59
|
+
"""
|
|
60
|
+
log_prefix = "[GET /api/v1/sessions/current] "
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
client_id = session_manager.get_a2a_client_id(request)
|
|
64
|
+
session_id = session_manager.get_a2a_session_id(request)
|
|
65
|
+
|
|
66
|
+
return JSONRPCResponse(
|
|
67
|
+
result={
|
|
68
|
+
"clientId": client_id,
|
|
69
|
+
"sessionId": session_id,
|
|
70
|
+
"hasActiveSession": session_id is not None,
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
except Exception as e:
|
|
75
|
+
log.exception("%sError getting current session info: %s", log_prefix, e)
|
|
76
|
+
error_resp = InternalError(message=f"Failed to get session info: {e}")
|
|
77
|
+
raise HTTPException(
|
|
78
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
79
|
+
detail=error_resp.model_dump(exclude_none=True),
|
|
80
|
+
)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API Router for Server-Sent Events (SSE) subscriptions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
from fastapi import APIRouter, Depends, Request as FastAPIRequest, HTTPException, status
|
|
8
|
+
|
|
9
|
+
from solace_ai_connector.common.log import log
|
|
10
|
+
|
|
11
|
+
from sse_starlette.sse import EventSourceResponse
|
|
12
|
+
|
|
13
|
+
from ....gateway.http_sse.sse_manager import SSEManager
|
|
14
|
+
from ....gateway.http_sse.dependencies import get_sse_manager
|
|
15
|
+
|
|
16
|
+
router = APIRouter()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@router.get("/subscribe/{task_id}")
|
|
20
|
+
async def subscribe_to_task_events(
|
|
21
|
+
task_id: str,
|
|
22
|
+
request: FastAPIRequest,
|
|
23
|
+
sse_manager: SSEManager = Depends(get_sse_manager),
|
|
24
|
+
):
|
|
25
|
+
"""
|
|
26
|
+
Establishes an SSE connection to receive real-time updates for a specific task.
|
|
27
|
+
"""
|
|
28
|
+
log_prefix = "[GET /api/v1/sse/subscribe/%s] " % task_id
|
|
29
|
+
log.info("%sClient requesting SSE subscription.", log_prefix)
|
|
30
|
+
|
|
31
|
+
connection_queue: asyncio.Queue = None
|
|
32
|
+
try:
|
|
33
|
+
connection_queue = await sse_manager.create_sse_connection(task_id)
|
|
34
|
+
log.info("%sSSE connection queue created.", log_prefix)
|
|
35
|
+
|
|
36
|
+
async def event_generator():
|
|
37
|
+
nonlocal connection_queue
|
|
38
|
+
log.debug("%sSSE event generator started.", log_prefix)
|
|
39
|
+
try:
|
|
40
|
+
yield {"comment": "SSE connection established"}
|
|
41
|
+
log.debug("%sSent initial SSE comment.", log_prefix)
|
|
42
|
+
|
|
43
|
+
loop_count = 0
|
|
44
|
+
while True:
|
|
45
|
+
loop_count += 1
|
|
46
|
+
log.debug(
|
|
47
|
+
"%sEvent generator loop iteration: %d", log_prefix, loop_count
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
disconnected = await request.is_disconnected()
|
|
51
|
+
log.debug(
|
|
52
|
+
"%sRequest disconnected status: %s", log_prefix, disconnected
|
|
53
|
+
)
|
|
54
|
+
if disconnected:
|
|
55
|
+
log.info("%sClient disconnected. Breaking loop.", log_prefix)
|
|
56
|
+
break
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
log.debug("%sWaiting for event from queue...", log_prefix)
|
|
60
|
+
event_payload = await asyncio.wait_for(
|
|
61
|
+
connection_queue.get(), timeout=120
|
|
62
|
+
)
|
|
63
|
+
log.debug(
|
|
64
|
+
"%sReceived from queue: %s",
|
|
65
|
+
log_prefix,
|
|
66
|
+
event_payload is not None,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if event_payload is None:
|
|
70
|
+
log.info(
|
|
71
|
+
"%sReceived None sentinel. Closing connection. Breaking loop.",
|
|
72
|
+
log_prefix,
|
|
73
|
+
)
|
|
74
|
+
break
|
|
75
|
+
log.debug(
|
|
76
|
+
"%sYielding event_payload: %s", log_prefix, event_payload
|
|
77
|
+
)
|
|
78
|
+
yield event_payload
|
|
79
|
+
connection_queue.task_done()
|
|
80
|
+
log.debug(
|
|
81
|
+
"%sSent event: %s", log_prefix, event_payload.get("event")
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
except asyncio.TimeoutError:
|
|
85
|
+
log.debug(
|
|
86
|
+
"%sSSE queue wait timed out (iteration %d), checking disconnect status.",
|
|
87
|
+
log_prefix,
|
|
88
|
+
loop_count,
|
|
89
|
+
)
|
|
90
|
+
continue
|
|
91
|
+
except asyncio.CancelledError:
|
|
92
|
+
log.info(
|
|
93
|
+
"%sSSE event generator cancelled. Breaking loop.",
|
|
94
|
+
log_prefix,
|
|
95
|
+
)
|
|
96
|
+
break
|
|
97
|
+
except Exception as q_err:
|
|
98
|
+
log.error(
|
|
99
|
+
"%sError getting event from queue: %s. Breaking loop.",
|
|
100
|
+
log_prefix,
|
|
101
|
+
q_err,
|
|
102
|
+
exc_info=True,
|
|
103
|
+
)
|
|
104
|
+
yield {
|
|
105
|
+
"event": "error",
|
|
106
|
+
"data": json.dumps({"error": "Internal queue error"}),
|
|
107
|
+
}
|
|
108
|
+
break
|
|
109
|
+
|
|
110
|
+
except asyncio.CancelledError:
|
|
111
|
+
log.info(
|
|
112
|
+
"%sSSE event generator explicitly cancelled. Breaking loop.",
|
|
113
|
+
log_prefix,
|
|
114
|
+
)
|
|
115
|
+
except Exception as gen_err:
|
|
116
|
+
log.error(
|
|
117
|
+
"%sError in SSE event generator: %s",
|
|
118
|
+
log_prefix,
|
|
119
|
+
gen_err,
|
|
120
|
+
exc_info=True,
|
|
121
|
+
)
|
|
122
|
+
finally:
|
|
123
|
+
log.info("%sSSE event generator finished.", log_prefix)
|
|
124
|
+
if connection_queue:
|
|
125
|
+
await sse_manager.remove_sse_connection(task_id, connection_queue)
|
|
126
|
+
log.info("%sRemoved SSE connection queue from manager.", log_prefix)
|
|
127
|
+
|
|
128
|
+
return EventSourceResponse(event_generator())
|
|
129
|
+
|
|
130
|
+
except Exception as e:
|
|
131
|
+
log.exception("%sError establishing SSE connection: %s", log_prefix, e)
|
|
132
|
+
|
|
133
|
+
if connection_queue:
|
|
134
|
+
await sse_manager.remove_sse_connection(task_id, connection_queue)
|
|
135
|
+
raise HTTPException(
|
|
136
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
137
|
+
detail="Failed to establish SSE connection: %s" % e,
|
|
138
|
+
)
|