solace-agent-mesh 1.11.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solace_agent_mesh/__init__.py +0 -0
- solace_agent_mesh/agent/__init__.py +0 -0
- solace_agent_mesh/agent/adk/__init__.py +0 -0
- solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +52 -0
- solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
- solace_agent_mesh/agent/adk/callbacks.py +2318 -0
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
- solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
- solace_agent_mesh/agent/adk/runner.py +390 -0
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +468 -0
- solace_agent_mesh/agent/adk/setup.py +1325 -0
- solace_agent_mesh/agent/adk/stream_parser.py +415 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
- solace_agent_mesh/agent/agent_llm.txt +369 -0
- solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
- solace_agent_mesh/agent/protocol/__init__.py +0 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +100 -0
- solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
- solace_agent_mesh/agent/proxies/base/component.py +816 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
- solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
- solace_agent_mesh/agent/sac/__init__.py +0 -0
- solace_agent_mesh/agent/sac/app.py +595 -0
- solace_agent_mesh/agent/sac/component.py +3668 -0
- solace_agent_mesh/agent/sac/patch_adk.py +103 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +415 -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 +58 -0
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
- solace_agent_mesh/agent/tools/__init__.py +16 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
- solace_agent_mesh/agent/tools/image_tools.py +1185 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
- solace_agent_mesh/agent/tools/registry.py +38 -0
- solace_agent_mesh/agent/tools/test_tools.py +136 -0
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
- solace_agent_mesh/agent/tools/tool_definition.py +53 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
- solace_agent_mesh/agent/tools/web_tools.py +392 -0
- solace_agent_mesh/agent/utils/__init__.py +0 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
- solace_agent_mesh/agent/utils/config_parser.py +49 -0
- solace_agent_mesh/agent/utils/context_helpers.py +77 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.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/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.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/15ba94aa.92fea363.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.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/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
- solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.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/3a6c6137.f5940cfa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.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/509e993c.a1fbf45a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.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/5c2bd65f.90a87880.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.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/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.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/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.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/8024126c.fa0e7186.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.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.5d015485.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.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.6c1dbf0c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.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/9bb13469.b2333011.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +345 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +144 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +37 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +247 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +184 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -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/sam-enterprise-credentials.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1765810064709.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 -0
- solace_agent_mesh/cli/commands/__init__.py +0 -0
- 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 +729 -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 +102 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -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 +119 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
- solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -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 +215 -0
- solace_agent_mesh/cli/main.py +52 -0
- solace_agent_mesh/cli/utils.py +262 -0
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a/__init__.py +241 -0
- solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
- solace_agent_mesh/common/a2a/artifact.py +368 -0
- solace_agent_mesh/common/a2a/events.py +213 -0
- solace_agent_mesh/common/a2a/message.py +375 -0
- solace_agent_mesh/common/a2a/protocol.py +689 -0
- solace_agent_mesh/common/a2a/task.py +127 -0
- solace_agent_mesh/common/a2a/translation.py +655 -0
- solace_agent_mesh/common/a2a/types.py +55 -0
- solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
- solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
- solace_agent_mesh/common/agent_registry.py +122 -0
- solace_agent_mesh/common/common_llm.txt +230 -0
- solace_agent_mesh/common/common_llm_detail.txt +2562 -0
- solace_agent_mesh/common/constants.py +6 -0
- solace_agent_mesh/common/data_parts.py +150 -0
- solace_agent_mesh/common/exceptions.py +49 -0
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +132 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
- solace_agent_mesh/common/middleware/registry.py +127 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/sac/__init__.py +0 -0
- solace_agent_mesh/common/sac/sac_llm.txt +71 -0
- solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
- solace_agent_mesh/common/sac/sam_component_base.py +730 -0
- solace_agent_mesh/common/sam_events/__init__.py +9 -0
- solace_agent_mesh/common/sam_events/event_service.py +208 -0
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +164 -0
- solace_agent_mesh/common/services/identity_service.py +134 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
- solace_agent_mesh/common/services/services_llm.txt +368 -0
- solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/artifact_utils.py +31 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +56 -0
- solace_agent_mesh/common/utils/embeds/converter.py +447 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
- solace_agent_mesh/common/utils/embeds/types.py +23 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/initializer.py +52 -0
- solace_agent_mesh/common/utils/log_formatters.py +64 -0
- solace_agent_mesh/common/utils/message_utils.py +80 -0
- solace_agent_mesh/common/utils/mime_helpers.py +172 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
- solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/common/utils/type_utils.py +28 -0
- solace_agent_mesh/common/utils/utils_llm.txt +335 -0
- solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
- solace_agent_mesh/config_portal/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/common.py +77 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
- 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 +166 -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 +644 -0
- solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
- solace_agent_mesh/core_a2a/service.py +307 -0
- solace_agent_mesh/evaluation/__init__.py +0 -0
- solace_agent_mesh/evaluation/evaluator.py +691 -0
- solace_agent_mesh/evaluation/message_organizer.py +553 -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 +970 -0
- solace_agent_mesh/evaluation/report_generator.py +607 -0
- solace_agent_mesh/evaluation/run.py +954 -0
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +776 -0
- solace_agent_mesh/evaluation/summary_builder.py +880 -0
- solace_agent_mesh/gateway/__init__.py +0 -0
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +143 -0
- solace_agent_mesh/gateway/adapter/types.py +221 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +345 -0
- solace_agent_mesh/gateway/base/base_llm.txt +226 -0
- solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
- solace_agent_mesh/gateway/base/component.py +2030 -0
- solace_agent_mesh/gateway/base/task_context.py +75 -0
- solace_agent_mesh/gateway/gateway_llm.txt +369 -0
- solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +727 -0
- solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
- solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +161 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
- solace_agent_mesh/gateway/http_sse/app.py +351 -0
- solace_agent_mesh/gateway/http_sse/component.py +2360 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
- solace_agent_mesh/gateway/http_sse/main.py +789 -0
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +66 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
- solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
- solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +53 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +308 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +15 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
- solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
- solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
- solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
- solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
- solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
- solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
- solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
- solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
- solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
- solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
- solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
- solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
- solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
- solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
- solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
- solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +18 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +147 -0
- solace_agent_mesh/services/platform/api/main.py +280 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
- solace_agent_mesh/services/platform/app.py +114 -0
- solace_agent_mesh/services/platform/component.py +235 -0
- solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -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 +75 -0
- solace_agent_mesh/templates/gateway_component_template.py +484 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +66 -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 +60 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
- solace_agent_mesh/templates/plugin_readme_template.md +12 -0
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +112 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +177 -0
- solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
- solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
- solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
- solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
- solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Speech API routes for STT and TTS functionality.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from fastapi import APIRouter, Depends, File, Form, HTTPException, UploadFile
|
|
7
|
+
from fastapi.responses import StreamingResponse, Response
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from solace_ai_connector.common.log import log
|
|
11
|
+
|
|
12
|
+
from ..services.audio_service import AudioService
|
|
13
|
+
from ..dependencies import get_audio_service
|
|
14
|
+
from ..shared.auth_utils import get_current_user
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
router = APIRouter()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TTSRequest(BaseModel):
|
|
21
|
+
"""Request model for text-to-speech"""
|
|
22
|
+
input: str
|
|
23
|
+
voice: Optional[str] = None
|
|
24
|
+
messageId: Optional[str] = None
|
|
25
|
+
provider: Optional[str] = None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class StreamTTSRequest(BaseModel):
|
|
29
|
+
"""Request model for streaming text-to-speech"""
|
|
30
|
+
input: str
|
|
31
|
+
voice: Optional[str] = None
|
|
32
|
+
runId: Optional[str] = None
|
|
33
|
+
provider: Optional[str] = None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@router.post("/stt")
|
|
37
|
+
async def speech_to_text(
|
|
38
|
+
audio: UploadFile = File(...),
|
|
39
|
+
provider: Optional[str] = Form(None),
|
|
40
|
+
language: Optional[str] = Form(None),
|
|
41
|
+
user: dict = Depends(get_current_user),
|
|
42
|
+
audio_service: AudioService = Depends(get_audio_service)
|
|
43
|
+
):
|
|
44
|
+
"""
|
|
45
|
+
Transcribe audio to text using configured STT service.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
audio: Audio file (wav, mp3, webm, ogg)
|
|
49
|
+
provider: Optional provider override (openai, azure)
|
|
50
|
+
language: Optional language code (e.g., "en-US", "es-ES")
|
|
51
|
+
user: Current authenticated user
|
|
52
|
+
audio_service: Audio service instance
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
JSON with transcribed text:
|
|
56
|
+
{
|
|
57
|
+
"text": "transcribed text",
|
|
58
|
+
"language": "en",
|
|
59
|
+
"duration": 5.2
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
HTTPException: If transcription fails
|
|
64
|
+
"""
|
|
65
|
+
log.info(
|
|
66
|
+
"[SpeechAPI] STT request from user=%s, filename=%s, provider=%s, language=%s",
|
|
67
|
+
user.get("user_id"),
|
|
68
|
+
audio.filename,
|
|
69
|
+
provider,
|
|
70
|
+
language
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
# Validate content type
|
|
75
|
+
if not audio.content_type or not audio.content_type.startswith("audio/"):
|
|
76
|
+
raise HTTPException(
|
|
77
|
+
415,
|
|
78
|
+
f"Unsupported media type: {audio.content_type}. Expected audio/*"
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
result = await audio_service.transcribe_audio(
|
|
82
|
+
audio_file=audio,
|
|
83
|
+
user_id=user.get("user_id", "anonymous"),
|
|
84
|
+
session_id=user.get("session_id", "default"),
|
|
85
|
+
app_name=user.get("app_name", "webui"),
|
|
86
|
+
provider=provider,
|
|
87
|
+
language=language
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
return result.to_dict()
|
|
91
|
+
|
|
92
|
+
except HTTPException:
|
|
93
|
+
raise
|
|
94
|
+
except Exception as e:
|
|
95
|
+
log.exception("[SpeechAPI] STT error: %s", e)
|
|
96
|
+
raise HTTPException(500, f"Transcription failed: {str(e)}")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@router.post("/tts")
|
|
100
|
+
async def text_to_speech(
|
|
101
|
+
request: TTSRequest,
|
|
102
|
+
user: dict = Depends(get_current_user),
|
|
103
|
+
audio_service: AudioService = Depends(get_audio_service)
|
|
104
|
+
):
|
|
105
|
+
"""
|
|
106
|
+
Convert text to speech using configured TTS service.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
request: TTS request with text and voice
|
|
110
|
+
user: Current authenticated user
|
|
111
|
+
audio_service: Audio service instance
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Audio data as MP3
|
|
115
|
+
|
|
116
|
+
Raises:
|
|
117
|
+
HTTPException: If generation fails
|
|
118
|
+
"""
|
|
119
|
+
log.info(
|
|
120
|
+
"[SpeechAPI] TTS request from user=%s, text_len=%d, voice=%s",
|
|
121
|
+
user.get("user_id"),
|
|
122
|
+
len(request.input),
|
|
123
|
+
request.voice
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
# Validate input
|
|
128
|
+
if not request.input or not request.input.strip():
|
|
129
|
+
raise HTTPException(400, "Input text is required")
|
|
130
|
+
|
|
131
|
+
if len(request.input) > 10000:
|
|
132
|
+
raise HTTPException(
|
|
133
|
+
413,
|
|
134
|
+
"Text too long (max 10000 characters). Use /tts/stream for longer text."
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
audio_data = await audio_service.generate_speech(
|
|
138
|
+
text=request.input,
|
|
139
|
+
voice=request.voice,
|
|
140
|
+
user_id=user.get("user_id", "anonymous"),
|
|
141
|
+
session_id=user.get("session_id", "default"),
|
|
142
|
+
app_name=user.get("app_name", "webui"),
|
|
143
|
+
message_id=request.messageId,
|
|
144
|
+
provider=request.provider # NEW: Pass provider from request
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return Response(
|
|
148
|
+
content=audio_data,
|
|
149
|
+
media_type="audio/mpeg"
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
except HTTPException:
|
|
153
|
+
raise
|
|
154
|
+
except Exception as e:
|
|
155
|
+
log.exception("[SpeechAPI] TTS error: %s", e)
|
|
156
|
+
raise HTTPException(500, f"TTS generation failed: {str(e)}")
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@router.post("/tts/stream")
|
|
160
|
+
async def stream_audio(
|
|
161
|
+
request: StreamTTSRequest,
|
|
162
|
+
user: dict = Depends(get_current_user),
|
|
163
|
+
audio_service: AudioService = Depends(get_audio_service)
|
|
164
|
+
):
|
|
165
|
+
"""
|
|
166
|
+
Stream TTS audio for long text (>4096 chars).
|
|
167
|
+
Uses chunking and streaming for better UX.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
request: Stream TTS request with text and voice
|
|
171
|
+
user: Current authenticated user
|
|
172
|
+
audio_service: Audio service instance
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
Streaming audio response
|
|
176
|
+
|
|
177
|
+
Raises:
|
|
178
|
+
HTTPException: If generation fails
|
|
179
|
+
"""
|
|
180
|
+
log.info(
|
|
181
|
+
"[SpeechAPI] TTS stream request from user=%s, text_len=%d",
|
|
182
|
+
user.get("user_id"),
|
|
183
|
+
len(request.input)
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
try:
|
|
187
|
+
# Validate input
|
|
188
|
+
if not request.input or not request.input.strip():
|
|
189
|
+
raise HTTPException(400, "Input text is required")
|
|
190
|
+
|
|
191
|
+
# Add max length validation to prevent abuse (100KB max for streaming)
|
|
192
|
+
if len(request.input) > 100000:
|
|
193
|
+
raise HTTPException(
|
|
194
|
+
413,
|
|
195
|
+
"Text too long (max 100000 characters for streaming)"
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
async def audio_generator():
|
|
199
|
+
async for chunk in audio_service.stream_speech(
|
|
200
|
+
text=request.input,
|
|
201
|
+
voice=request.voice,
|
|
202
|
+
user_id=user.get("user_id", "anonymous"),
|
|
203
|
+
session_id=user.get("session_id", "default"),
|
|
204
|
+
app_name=user.get("app_name", "webui"),
|
|
205
|
+
provider=request.provider # Pass provider from request
|
|
206
|
+
):
|
|
207
|
+
yield chunk
|
|
208
|
+
|
|
209
|
+
return StreamingResponse(
|
|
210
|
+
audio_generator(),
|
|
211
|
+
media_type="audio/mpeg",
|
|
212
|
+
headers={
|
|
213
|
+
"Content-Disposition": f"inline; filename=tts_stream_{request.runId or 'audio'}.mp3",
|
|
214
|
+
"Cache-Control": "no-cache"
|
|
215
|
+
}
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
except HTTPException:
|
|
219
|
+
raise
|
|
220
|
+
except Exception as e:
|
|
221
|
+
log.exception("[SpeechAPI] TTS stream error: %s", e)
|
|
222
|
+
raise HTTPException(500, f"TTS streaming failed: {str(e)}")
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@router.get("/voices")
|
|
226
|
+
async def get_voices(
|
|
227
|
+
provider: Optional[str] = None, # NEW: Accept provider as query parameter
|
|
228
|
+
user: dict = Depends(get_current_user),
|
|
229
|
+
audio_service: AudioService = Depends(get_audio_service)
|
|
230
|
+
):
|
|
231
|
+
"""
|
|
232
|
+
Get available TTS voices based on configuration and provider.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
provider: Optional provider filter (azure, gemini)
|
|
236
|
+
user: Current authenticated user
|
|
237
|
+
audio_service: Audio service instance
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
JSON with available voices:
|
|
241
|
+
{
|
|
242
|
+
"voices": ["Kore", "Puck", "Zephyr", ...],
|
|
243
|
+
"default": "Kore"
|
|
244
|
+
}
|
|
245
|
+
"""
|
|
246
|
+
log.debug("[SpeechAPI] Voices request from user=%s, provider=%s", user.get("user_id"), provider)
|
|
247
|
+
|
|
248
|
+
try:
|
|
249
|
+
voices = await audio_service.get_available_voices(provider=provider) # Pass provider
|
|
250
|
+
|
|
251
|
+
# Get default voice from config
|
|
252
|
+
config = audio_service.get_speech_config()
|
|
253
|
+
default_voice = config.get("voice", "Kore")
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
"voices": voices,
|
|
257
|
+
"default": default_voice
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
except Exception as e:
|
|
261
|
+
log.exception("[SpeechAPI] Error getting voices: %s", e)
|
|
262
|
+
raise HTTPException(500, f"Failed to get voices: {str(e)}")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
@router.get("/config")
|
|
266
|
+
async def get_speech_config(
|
|
267
|
+
user: dict = Depends(get_current_user),
|
|
268
|
+
audio_service: AudioService = Depends(get_audio_service)
|
|
269
|
+
):
|
|
270
|
+
"""
|
|
271
|
+
Get speech configuration for frontend initialization.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
user: Current authenticated user
|
|
275
|
+
audio_service: Audio service instance
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
JSON with speech configuration:
|
|
279
|
+
{
|
|
280
|
+
"sttExternal": true,
|
|
281
|
+
"ttsExternal": true,
|
|
282
|
+
"speechToText": true,
|
|
283
|
+
"textToSpeech": true,
|
|
284
|
+
"engineSTT": "external",
|
|
285
|
+
"engineTTS": "external",
|
|
286
|
+
"voice": "Kore",
|
|
287
|
+
"playbackRate": 1.0,
|
|
288
|
+
"cacheTTS": true,
|
|
289
|
+
...
|
|
290
|
+
}
|
|
291
|
+
"""
|
|
292
|
+
log.debug("[SpeechAPI] Config request from user=%s", user.get("user_id"))
|
|
293
|
+
|
|
294
|
+
try:
|
|
295
|
+
config = audio_service.get_speech_config()
|
|
296
|
+
return config
|
|
297
|
+
|
|
298
|
+
except Exception as e:
|
|
299
|
+
log.exception("[SpeechAPI] Error getting config: %s", e)
|
|
300
|
+
raise HTTPException(500, f"Failed to get config: {str(e)}")
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
@router.post("/voice-sample")
|
|
304
|
+
async def get_voice_sample(
|
|
305
|
+
voice: str = Form(...),
|
|
306
|
+
provider: Optional[str] = Form(None),
|
|
307
|
+
user: dict = Depends(get_current_user),
|
|
308
|
+
audio_service: AudioService = Depends(get_audio_service)
|
|
309
|
+
):
|
|
310
|
+
"""
|
|
311
|
+
Generate a sample audio for a specific voice to preview before selection.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
voice: Voice name to sample
|
|
315
|
+
provider: Optional provider (azure, gemini)
|
|
316
|
+
user: Current authenticated user
|
|
317
|
+
audio_service: Audio service instance
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
Audio data as MP3
|
|
321
|
+
|
|
322
|
+
Raises:
|
|
323
|
+
HTTPException: If generation fails
|
|
324
|
+
"""
|
|
325
|
+
log.debug("[SpeechAPI] Voice sample request from user=%s, voice=%s, provider=%s",
|
|
326
|
+
user.get("user_id"), voice, provider)
|
|
327
|
+
|
|
328
|
+
try:
|
|
329
|
+
# Validate voice parameter
|
|
330
|
+
if not voice or not voice.strip():
|
|
331
|
+
raise HTTPException(400, "Voice parameter is required")
|
|
332
|
+
|
|
333
|
+
# Generate a sample text based on provider
|
|
334
|
+
sample_text = "Hello! This is a sample of my voice. I hope you find it pleasant to listen to."
|
|
335
|
+
|
|
336
|
+
audio_data = await audio_service.generate_speech(
|
|
337
|
+
text=sample_text,
|
|
338
|
+
voice=voice,
|
|
339
|
+
user_id=user.get("user_id", "anonymous"),
|
|
340
|
+
session_id=user.get("session_id", "default"),
|
|
341
|
+
app_name=user.get("app_name", "webui"),
|
|
342
|
+
message_id=f"voice_sample_{voice}",
|
|
343
|
+
provider=provider
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
return Response(
|
|
347
|
+
content=audio_data,
|
|
348
|
+
media_type="audio/mpeg"
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
except HTTPException:
|
|
352
|
+
raise
|
|
353
|
+
except Exception as e:
|
|
354
|
+
log.exception("[SpeechAPI] Voice sample error: %s", e)
|
|
355
|
+
raise HTTPException(500, f"Voice sample generation failed: {str(e)}")
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API Router for Server-Sent Events (SSE) subscriptions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import asyncio
|
|
7
|
+
import json
|
|
8
|
+
from fastapi import APIRouter, Depends, Request as FastAPIRequest, HTTPException, status, Query
|
|
9
|
+
from sqlalchemy.orm import Session as DBSession
|
|
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, get_db
|
|
15
|
+
from ....gateway.http_sse.repository.task_repository import TaskRepository
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
trace_logger = logging.getLogger("sam_trace")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
router = APIRouter()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@router.get("/subscribe/{task_id}")
|
|
25
|
+
async def subscribe_to_task_events(
|
|
26
|
+
task_id: str,
|
|
27
|
+
request: FastAPIRequest,
|
|
28
|
+
reconnect: bool = Query(False, description="Whether this is a reconnection attempt"),
|
|
29
|
+
last_event_timestamp: int = Query(0, description="Timestamp of last received event for replay"),
|
|
30
|
+
sse_manager: SSEManager = Depends(get_sse_manager),
|
|
31
|
+
db: DBSession = Depends(get_db),
|
|
32
|
+
):
|
|
33
|
+
"""
|
|
34
|
+
Establishes an SSE connection to receive real-time updates for a specific task.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
task_id: The task to monitor
|
|
38
|
+
reconnect: If true, replay missed events before streaming live
|
|
39
|
+
last_event_timestamp: Timestamp of last received event (for replay)
|
|
40
|
+
"""
|
|
41
|
+
log_prefix = "[GET /api/v1/sse/subscribe/%s] " % task_id
|
|
42
|
+
log.debug("%sClient requesting SSE subscription (reconnect=%s).", log_prefix, reconnect)
|
|
43
|
+
|
|
44
|
+
connection_queue: asyncio.Queue = None
|
|
45
|
+
try:
|
|
46
|
+
# Check if this is a background task
|
|
47
|
+
repo = TaskRepository()
|
|
48
|
+
task = repo.find_by_id(db, task_id)
|
|
49
|
+
is_background_task = task and task.background_execution_enabled
|
|
50
|
+
|
|
51
|
+
if is_background_task:
|
|
52
|
+
log.info("%sTask %s is a background task.", log_prefix, task_id)
|
|
53
|
+
|
|
54
|
+
connection_queue = await sse_manager.create_sse_connection(task_id)
|
|
55
|
+
log.debug("%sSSE connection queue created.", log_prefix)
|
|
56
|
+
|
|
57
|
+
async def event_generator():
|
|
58
|
+
nonlocal connection_queue
|
|
59
|
+
log.debug("%sSSE event generator started.", log_prefix)
|
|
60
|
+
try:
|
|
61
|
+
yield {"comment": "SSE connection established"}
|
|
62
|
+
log.debug("%sSent initial SSE comment.", log_prefix)
|
|
63
|
+
|
|
64
|
+
# If reconnecting, replay missed events from database
|
|
65
|
+
# For background tasks, always replay ALL events from the beginning
|
|
66
|
+
# to ensure the frontend can reconstruct the full message content
|
|
67
|
+
# after a browser refresh
|
|
68
|
+
if reconnect:
|
|
69
|
+
replay_from_timestamp = last_event_timestamp if last_event_timestamp > 0 else 0
|
|
70
|
+
|
|
71
|
+
# For background tasks, always replay from the beginning
|
|
72
|
+
# This handles the case where the browser was refreshed and
|
|
73
|
+
# the accumulated message content was lost
|
|
74
|
+
if is_background_task:
|
|
75
|
+
replay_from_timestamp = 0
|
|
76
|
+
log.info("%sBackground task reconnection - replaying ALL events from beginning", log_prefix)
|
|
77
|
+
else:
|
|
78
|
+
log.info("%sReplaying events since timestamp %d", log_prefix, replay_from_timestamp)
|
|
79
|
+
|
|
80
|
+
task_with_events = repo.find_by_id_with_events(db, task_id)
|
|
81
|
+
if task_with_events:
|
|
82
|
+
_, events = task_with_events
|
|
83
|
+
# Use >= for timestamp 0 to include all events
|
|
84
|
+
missed_events = [e for e in events if e.created_time > replay_from_timestamp]
|
|
85
|
+
log.info("%sReplaying %d missed events", log_prefix, len(missed_events))
|
|
86
|
+
|
|
87
|
+
for event in missed_events:
|
|
88
|
+
# The payload is already a JSON-RPC response, just need to determine event type
|
|
89
|
+
# and yield it in the same format as live events
|
|
90
|
+
event_type = "status_update" # Default
|
|
91
|
+
|
|
92
|
+
# Determine event type from the payload structure
|
|
93
|
+
if event.direction == "response":
|
|
94
|
+
# Check if it's a final response (Task object) or status update
|
|
95
|
+
if "result" in event.payload:
|
|
96
|
+
result = event.payload.get("result", {})
|
|
97
|
+
if result.get("kind") == "task":
|
|
98
|
+
event_type = "final_response"
|
|
99
|
+
elif result.get("kind") == "status-update":
|
|
100
|
+
event_type = "status_update"
|
|
101
|
+
elif result.get("kind") == "artifact-update":
|
|
102
|
+
event_type = "artifact_update"
|
|
103
|
+
|
|
104
|
+
# Yield the event in SSE format
|
|
105
|
+
# The payload is already the complete JSON-RPC response
|
|
106
|
+
yield {
|
|
107
|
+
"event": event_type,
|
|
108
|
+
"data": json.dumps(event.payload)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
log.info("%sFinished replaying missed events", log_prefix)
|
|
112
|
+
|
|
113
|
+
loop_count = 0
|
|
114
|
+
while True:
|
|
115
|
+
loop_count += 1
|
|
116
|
+
log.debug(
|
|
117
|
+
"%sEvent generator loop iteration: %d", log_prefix, loop_count
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
disconnected = await request.is_disconnected()
|
|
121
|
+
log.debug(
|
|
122
|
+
"%sRequest disconnected status: %s", log_prefix, disconnected
|
|
123
|
+
)
|
|
124
|
+
if disconnected:
|
|
125
|
+
if is_background_task:
|
|
126
|
+
log.info(
|
|
127
|
+
"%sClient disconnected from background task %s. Draining buffers and exiting SSE stream.",
|
|
128
|
+
log_prefix,
|
|
129
|
+
task_id
|
|
130
|
+
)
|
|
131
|
+
# For background tasks, we need to drain the buffers to prevent overflow
|
|
132
|
+
# The task will continue running, but we stop consuming events
|
|
133
|
+
else:
|
|
134
|
+
log.info("%sClient disconnected. Breaking loop.", log_prefix)
|
|
135
|
+
break
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
log.debug("%sWaiting for event from queue...", log_prefix)
|
|
139
|
+
event_payload = await asyncio.wait_for(
|
|
140
|
+
connection_queue.get(), timeout=120
|
|
141
|
+
)
|
|
142
|
+
log.debug(
|
|
143
|
+
"%sReceived from queue: %s",
|
|
144
|
+
log_prefix,
|
|
145
|
+
event_payload is not None,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
if event_payload is None:
|
|
149
|
+
log.info(
|
|
150
|
+
"%sReceived None sentinel. Closing connection. Breaking loop.",
|
|
151
|
+
log_prefix,
|
|
152
|
+
)
|
|
153
|
+
break
|
|
154
|
+
if trace_logger.isEnabledFor(logging.DEBUG):
|
|
155
|
+
trace_logger.debug(
|
|
156
|
+
"%sYielding event_payload: %s",
|
|
157
|
+
log_prefix, event_payload
|
|
158
|
+
)
|
|
159
|
+
else:
|
|
160
|
+
log.debug(
|
|
161
|
+
"%sYielding event: %s",
|
|
162
|
+
log_prefix,
|
|
163
|
+
event_payload.get("event") if event_payload else "unknown"
|
|
164
|
+
)
|
|
165
|
+
yield event_payload
|
|
166
|
+
connection_queue.task_done()
|
|
167
|
+
log.debug(
|
|
168
|
+
"%sSent event: %s", log_prefix, event_payload.get("event")
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
except asyncio.TimeoutError:
|
|
172
|
+
log.debug(
|
|
173
|
+
"%sSSE queue wait timed out (iteration %d), checking disconnect status.",
|
|
174
|
+
log_prefix,
|
|
175
|
+
loop_count,
|
|
176
|
+
)
|
|
177
|
+
continue
|
|
178
|
+
except asyncio.CancelledError:
|
|
179
|
+
log.info(
|
|
180
|
+
"%sSSE event generator cancelled. Breaking loop.",
|
|
181
|
+
log_prefix,
|
|
182
|
+
)
|
|
183
|
+
break
|
|
184
|
+
except Exception as q_err:
|
|
185
|
+
log.error(
|
|
186
|
+
"%sError getting event from queue: %s. Breaking loop.",
|
|
187
|
+
log_prefix,
|
|
188
|
+
q_err,
|
|
189
|
+
exc_info=True,
|
|
190
|
+
)
|
|
191
|
+
yield {
|
|
192
|
+
"event": "error",
|
|
193
|
+
"data": json.dumps({"error": "Internal queue error"}),
|
|
194
|
+
}
|
|
195
|
+
break
|
|
196
|
+
|
|
197
|
+
except asyncio.CancelledError:
|
|
198
|
+
log.info(
|
|
199
|
+
"%sSSE event generator explicitly cancelled. Breaking loop.",
|
|
200
|
+
log_prefix,
|
|
201
|
+
)
|
|
202
|
+
except Exception as gen_err:
|
|
203
|
+
log.error(
|
|
204
|
+
"%sError in SSE event generator: %s",
|
|
205
|
+
log_prefix,
|
|
206
|
+
gen_err,
|
|
207
|
+
exc_info=True,
|
|
208
|
+
)
|
|
209
|
+
finally:
|
|
210
|
+
log.info("%sSSE event generator finished.", log_prefix)
|
|
211
|
+
if connection_queue:
|
|
212
|
+
await sse_manager.remove_sse_connection(task_id, connection_queue)
|
|
213
|
+
log.info("%sRemoved SSE connection queue from manager.", log_prefix)
|
|
214
|
+
|
|
215
|
+
# If this was a background task, drain the buffer to prevent overflow
|
|
216
|
+
if is_background_task:
|
|
217
|
+
await sse_manager.drain_buffer_for_background_task(task_id)
|
|
218
|
+
log.info("%sDrained buffer for background task %s", log_prefix, task_id)
|
|
219
|
+
|
|
220
|
+
return EventSourceResponse(event_generator())
|
|
221
|
+
|
|
222
|
+
except Exception as e:
|
|
223
|
+
log.exception("%sError establishing SSE connection: %s", log_prefix, e)
|
|
224
|
+
|
|
225
|
+
if connection_queue:
|
|
226
|
+
await sse_manager.remove_sse_connection(task_id, connection_queue)
|
|
227
|
+
raise HTTPException(
|
|
228
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
229
|
+
detail="Failed to establish SSE connection: %s" % e,
|
|
230
|
+
)
|