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,174 @@
|
|
|
1
|
+
Here is the DEVELOPER GUIDE for the `middleware` directory.
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
The `middleware` directory provides a pluggable framework for system components that can be extended or replaced at runtime. It offers a registry system to dynamically bind custom implementations for core functionalities like configuration resolution. The default implementations provide permissive behavior, making them suitable for development and testing environments where all features are enabled by default.
|
|
5
|
+
|
|
6
|
+
## Files Overview
|
|
7
|
+
- `__init__.py`: Exposes the main public classes of the middleware package for easy importing.
|
|
8
|
+
- `config_resolver.py`: Defines the default, permissive configuration resolution middleware.
|
|
9
|
+
- `registry.py`: Provides the `MiddlewareRegistry` for dynamically binding custom middleware implementations.
|
|
10
|
+
|
|
11
|
+
## Developer API Reference
|
|
12
|
+
|
|
13
|
+
### __init__.py
|
|
14
|
+
**Purpose:** This file serves as the entry point to the `middleware` package, exporting the primary public interfaces for developers to use.
|
|
15
|
+
|
|
16
|
+
**Usage Examples:**
|
|
17
|
+
```python
|
|
18
|
+
# Import the main classes directly from the middleware package
|
|
19
|
+
from solace_ai_connector.common.middleware import ConfigResolver, MiddlewareRegistry
|
|
20
|
+
|
|
21
|
+
# Now you can use ConfigResolver and MiddlewareRegistry
|
|
22
|
+
print(ConfigResolver)
|
|
23
|
+
print(MiddlewareRegistry)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
### config_resolver.py
|
|
29
|
+
**Purpose:** This file provides a pluggable interface for resolving user-specific configuration and determining feature availability. The default `ConfigResolver` class is permissive, allowing all operations and enabling all features, which is ideal for development or simple deployments.
|
|
30
|
+
|
|
31
|
+
**Import:** `from solace_ai_connector.common.middleware import ConfigResolver`
|
|
32
|
+
|
|
33
|
+
**Classes:**
|
|
34
|
+
- `ConfigResolver()` - A class containing static methods to resolve user-specific configuration and determine feature availability. This default implementation is permissive.
|
|
35
|
+
- `resolve_user_config(user_identity: Any, gateway_context: Dict[str, Any], base_config: Dict[str, Any]) -> Dict[str, Any]` - (async) Resolves user-specific configuration. The default implementation returns the `base_config` unchanged.
|
|
36
|
+
- `is_feature_enabled(user_config: Dict[str, Any], feature_descriptor: Dict[str, Any], context: Dict[str, Any]) -> bool` - Checks if a feature is enabled for a user. The default implementation always returns `True`.
|
|
37
|
+
- `validate_operation_config(user_config: Dict[str, Any], operation_spec: Dict[str, Any], validation_context: Dict[str, Any]) -> Dict[str, Any]` - Validates if an operation is allowed for a user. The default implementation always returns a dictionary with `{'valid': True}`.
|
|
38
|
+
- `filter_available_options(user_config: Dict[str, Any], available_options: List[Dict[str, Any]], filter_context: Dict[str, Any]) -> List[Dict[str, Any]]` - Filters a list of options based on user permissions. The default implementation returns the original `available_options` list.
|
|
39
|
+
|
|
40
|
+
**Usage Examples:**
|
|
41
|
+
```python
|
|
42
|
+
import asyncio
|
|
43
|
+
from solace_ai_connector.common.middleware import ConfigResolver
|
|
44
|
+
|
|
45
|
+
async def main():
|
|
46
|
+
# Example user identity and base configuration
|
|
47
|
+
user_id = "test-user@example.com"
|
|
48
|
+
base_conf = {"api_key": "default_key", "allowed_models": ["gpt-3.5-turbo"]}
|
|
49
|
+
|
|
50
|
+
# 1. Resolve user configuration (default implementation returns base_conf)
|
|
51
|
+
user_config = await ConfigResolver.resolve_user_config(
|
|
52
|
+
user_identity=user_id,
|
|
53
|
+
gateway_context={"gateway_id": "gw-1"},
|
|
54
|
+
base_config=base_conf
|
|
55
|
+
)
|
|
56
|
+
print(f"Resolved User Config: {user_config}")
|
|
57
|
+
|
|
58
|
+
# 2. Check if a feature is enabled (default is always True)
|
|
59
|
+
feature_desc = {"feature_type": "ai_tool", "function_name": "code_interpreter"}
|
|
60
|
+
is_enabled = ConfigResolver.is_feature_enabled(
|
|
61
|
+
user_config=user_config,
|
|
62
|
+
feature_descriptor=feature_desc,
|
|
63
|
+
context={}
|
|
64
|
+
)
|
|
65
|
+
print(f"Is Feature Enabled: {is_enabled}")
|
|
66
|
+
|
|
67
|
+
# 3. Validate an operation (default is always valid)
|
|
68
|
+
op_spec = {"operation_type": "model_inference", "model": "gpt-4"}
|
|
69
|
+
validation = ConfigResolver.validate_operation_config(
|
|
70
|
+
user_config=user_config,
|
|
71
|
+
operation_spec=op_spec,
|
|
72
|
+
validation_context={}
|
|
73
|
+
)
|
|
74
|
+
print(f"Operation Validation: {validation}")
|
|
75
|
+
|
|
76
|
+
# 4. Filter available options (default returns all options)
|
|
77
|
+
all_models = [
|
|
78
|
+
{"name": "gpt-3.5-turbo", "provider": "openai"},
|
|
79
|
+
{"name": "gpt-4", "provider": "openai"},
|
|
80
|
+
]
|
|
81
|
+
available_models = ConfigResolver.filter_available_options(
|
|
82
|
+
user_config=user_config,
|
|
83
|
+
available_options=all_models,
|
|
84
|
+
filter_context={"type": "language_model"}
|
|
85
|
+
)
|
|
86
|
+
print(f"Filtered Options: {available_models}")
|
|
87
|
+
|
|
88
|
+
if __name__ == "__main__":
|
|
89
|
+
asyncio.run(main())
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### registry.py
|
|
95
|
+
**Purpose:** This file provides the `MiddlewareRegistry`, a static class that allows developers to dynamically bind, or "plug in," their own custom middleware implementations at runtime. This is the core of the pluggable system.
|
|
96
|
+
|
|
97
|
+
**Import:** `from solace_ai_connector.common.middleware import MiddlewareRegistry`
|
|
98
|
+
|
|
99
|
+
**Classes:**
|
|
100
|
+
- `MiddlewareRegistry()` - A registry for managing middleware implementations. All methods are class methods.
|
|
101
|
+
- `bind_config_resolver(resolver_class: Type)` - Binds a custom class that implements the `ConfigResolver` interface. This new class will be used for all subsequent configuration resolution calls.
|
|
102
|
+
- `get_config_resolver() -> Type` - Returns the currently bound `ConfigResolver` class. If no custom resolver has been bound, it returns the default `ConfigResolver`.
|
|
103
|
+
- `register_initialization_callback(callback: callable)` - Registers a function to be executed when `initialize_middleware()` is called. Useful for setting up custom middleware components at application startup.
|
|
104
|
+
- `initialize_middleware()` - Executes all registered initialization callbacks. This should be called once during application startup.
|
|
105
|
+
- `reset_bindings()` - Resets all bindings back to their defaults. This is primarily useful for testing environments.
|
|
106
|
+
- `get_registry_status() -> Dict[str, Any]` - Returns a dictionary containing the current status of the registry, such as which resolver is bound.
|
|
107
|
+
|
|
108
|
+
**Usage Examples:**
|
|
109
|
+
```python
|
|
110
|
+
import asyncio
|
|
111
|
+
from typing import Any, Dict, List
|
|
112
|
+
from solace_ai_connector.common.middleware import MiddlewareRegistry, ConfigResolver
|
|
113
|
+
|
|
114
|
+
# 1. Define a custom ConfigResolver implementation
|
|
115
|
+
class MyCustomConfigResolver:
|
|
116
|
+
"""A custom resolver that only allows 'admin' users to use 'gpt-4'."""
|
|
117
|
+
@staticmethod
|
|
118
|
+
async def resolve_user_config(user_identity: Any, **kwargs) -> Dict[str, Any]:
|
|
119
|
+
if user_identity == "admin":
|
|
120
|
+
return {"role": "admin", "allowed_models": ["gpt-4", "gpt-3.5-turbo"]}
|
|
121
|
+
return {"role": "user", "allowed_models": ["gpt-3.5-turbo"]}
|
|
122
|
+
|
|
123
|
+
@staticmethod
|
|
124
|
+
def validate_operation_config(user_config: Dict, operation_spec: Dict, **kwargs) -> Dict:
|
|
125
|
+
model = operation_spec.get("model")
|
|
126
|
+
if model and model not in user_config.get("allowed_models", []):
|
|
127
|
+
return {"valid": False, "reason": f"Model '{model}' not allowed for this user."}
|
|
128
|
+
return {"valid": True}
|
|
129
|
+
|
|
130
|
+
# Inherit other methods from the default for simplicity
|
|
131
|
+
is_feature_enabled = ConfigResolver.is_feature_enabled
|
|
132
|
+
filter_available_options = ConfigResolver.filter_available_options
|
|
133
|
+
|
|
134
|
+
# 2. Define an initialization callback
|
|
135
|
+
def setup_custom_logging():
|
|
136
|
+
print("Custom middleware initialization logic is running!")
|
|
137
|
+
|
|
138
|
+
# 3. Bind the custom components
|
|
139
|
+
MiddlewareRegistry.bind_config_resolver(MyCustomConfigResolver)
|
|
140
|
+
MiddlewareRegistry.register_initialization_callback(setup_custom_logging)
|
|
141
|
+
|
|
142
|
+
# 4. Initialize the middleware (e.g., at application startup)
|
|
143
|
+
print("--- Initializing Middleware ---")
|
|
144
|
+
MiddlewareRegistry.initialize_middleware()
|
|
145
|
+
print("--- Initialization Complete ---")
|
|
146
|
+
|
|
147
|
+
# 5. Use the middleware system
|
|
148
|
+
async def check_permissions():
|
|
149
|
+
# The registry will now use MyCustomConfigResolver automatically
|
|
150
|
+
CurrentResolver = MiddlewareRegistry.get_config_resolver()
|
|
151
|
+
print(f"Current resolver is: {CurrentResolver.__name__}")
|
|
152
|
+
|
|
153
|
+
# Check an admin user
|
|
154
|
+
admin_config = await CurrentResolver.resolve_user_config("admin")
|
|
155
|
+
validation_result = CurrentResolver.validate_operation_config(
|
|
156
|
+
admin_config, {"model": "gpt-4"}
|
|
157
|
+
)
|
|
158
|
+
print(f"Admin validation for gpt-4: {validation_result}")
|
|
159
|
+
|
|
160
|
+
# Check a regular user
|
|
161
|
+
user_config = await CurrentResolver.resolve_user_config("user")
|
|
162
|
+
validation_result = CurrentResolver.validate_operation_config(
|
|
163
|
+
user_config, {"model": "gpt-4"}
|
|
164
|
+
)
|
|
165
|
+
print(f"User validation for gpt-4: {validation_result}")
|
|
166
|
+
|
|
167
|
+
# Run the example
|
|
168
|
+
asyncio.run(check_permissions())
|
|
169
|
+
|
|
170
|
+
# 6. Check status and reset (useful for testing)
|
|
171
|
+
print(f"\nRegistry Status: {MiddlewareRegistry.get_registry_status()}")
|
|
172
|
+
MiddlewareRegistry.reset_bindings()
|
|
173
|
+
print(f"Registry Status after reset: {MiddlewareRegistry.get_registry_status()}")
|
|
174
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Registry for dynamically binding middleware implementations.
|
|
3
|
+
|
|
4
|
+
This module provides a registry system that allows middleware implementations
|
|
5
|
+
to be bound at runtime, enabling pluggable behavior for configuration resolution
|
|
6
|
+
and other middleware functions.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Optional, Type, Dict, Any, List
|
|
10
|
+
from solace_ai_connector.common.log import log
|
|
11
|
+
|
|
12
|
+
LOG_IDENTIFIER = "[MiddlewareRegistry]"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class MiddlewareRegistry:
|
|
16
|
+
"""
|
|
17
|
+
Registry for middleware implementations that can be overridden at runtime.
|
|
18
|
+
|
|
19
|
+
This registry allows different implementations of middleware to be bound
|
|
20
|
+
dynamically, enabling extensibility and customization of system behavior.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
_config_resolver: Optional[Type] = None
|
|
24
|
+
_initialization_callbacks: List[callable] = []
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def bind_config_resolver(cls, resolver_class: Type):
|
|
28
|
+
"""
|
|
29
|
+
Bind a custom config resolver implementation.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
resolver_class: Class that implements the ConfigResolver interface
|
|
33
|
+
"""
|
|
34
|
+
cls._config_resolver = resolver_class
|
|
35
|
+
log.info(
|
|
36
|
+
"%s Bound custom config resolver: %s",
|
|
37
|
+
LOG_IDENTIFIER,
|
|
38
|
+
resolver_class.__name__,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def get_config_resolver(cls) -> Type:
|
|
43
|
+
"""
|
|
44
|
+
Get the current config resolver implementation.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
The bound config resolver class, or the default ConfigResolver if none bound.
|
|
48
|
+
"""
|
|
49
|
+
if cls._config_resolver:
|
|
50
|
+
return cls._config_resolver
|
|
51
|
+
|
|
52
|
+
from .config_resolver import ConfigResolver
|
|
53
|
+
|
|
54
|
+
return ConfigResolver
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def register_initialization_callback(cls, callback: callable):
|
|
58
|
+
"""
|
|
59
|
+
Register a callback to be called during system initialization.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
callback: Function to call during initialization
|
|
63
|
+
"""
|
|
64
|
+
cls._initialization_callbacks.append(callback)
|
|
65
|
+
log.debug(
|
|
66
|
+
"%s Registered initialization callback: %s",
|
|
67
|
+
LOG_IDENTIFIER,
|
|
68
|
+
callback.__name__,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def initialize_middleware(cls):
|
|
73
|
+
"""
|
|
74
|
+
Initialize all registered middleware components.
|
|
75
|
+
|
|
76
|
+
This should be called during system startup to initialize any
|
|
77
|
+
bound middleware implementations.
|
|
78
|
+
"""
|
|
79
|
+
log.info("%s Initializing middleware components...", LOG_IDENTIFIER)
|
|
80
|
+
|
|
81
|
+
for callback in cls._initialization_callbacks:
|
|
82
|
+
try:
|
|
83
|
+
callback()
|
|
84
|
+
log.debug(
|
|
85
|
+
"%s Executed initialization callback: %s",
|
|
86
|
+
LOG_IDENTIFIER,
|
|
87
|
+
callback.__name__,
|
|
88
|
+
)
|
|
89
|
+
except Exception as e:
|
|
90
|
+
log.error(
|
|
91
|
+
"%s Error executing initialization callback %s: %s",
|
|
92
|
+
LOG_IDENTIFIER,
|
|
93
|
+
callback.__name__,
|
|
94
|
+
e,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
log.info("%s Middleware initialization complete.", LOG_IDENTIFIER)
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def reset_bindings(cls):
|
|
101
|
+
"""
|
|
102
|
+
Reset all bindings to defaults.
|
|
103
|
+
|
|
104
|
+
This is useful for testing or when switching between different
|
|
105
|
+
middleware configurations.
|
|
106
|
+
"""
|
|
107
|
+
cls._config_resolver = None
|
|
108
|
+
cls._initialization_callbacks = []
|
|
109
|
+
log.info("%s Reset all middleware bindings", LOG_IDENTIFIER)
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def get_registry_status(cls) -> Dict[str, Any]:
|
|
113
|
+
"""
|
|
114
|
+
Get the current status of the middleware registry.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
Dict containing information about bound middleware implementations.
|
|
118
|
+
"""
|
|
119
|
+
return {
|
|
120
|
+
"config_resolver": (
|
|
121
|
+
cls._config_resolver.__name__ if cls._config_resolver else "default"
|
|
122
|
+
),
|
|
123
|
+
"initialization_callbacks": len(cls._initialization_callbacks),
|
|
124
|
+
"has_custom_bindings": cls._config_resolver is not None,
|
|
125
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from starlette.applications import Starlette
|
|
2
|
+
from starlette.responses import JSONResponse
|
|
3
|
+
from sse_starlette.sse import EventSourceResponse
|
|
4
|
+
from starlette.requests import Request
|
|
5
|
+
from ...common.types import (
|
|
6
|
+
A2ARequest,
|
|
7
|
+
JSONRPCResponse,
|
|
8
|
+
InvalidRequestError,
|
|
9
|
+
JSONParseError,
|
|
10
|
+
GetTaskRequest,
|
|
11
|
+
CancelTaskRequest,
|
|
12
|
+
SendTaskRequest,
|
|
13
|
+
SetTaskPushNotificationRequest,
|
|
14
|
+
GetTaskPushNotificationRequest,
|
|
15
|
+
InternalError,
|
|
16
|
+
AgentCard,
|
|
17
|
+
TaskResubscriptionRequest,
|
|
18
|
+
SendTaskStreamingRequest,
|
|
19
|
+
)
|
|
20
|
+
from pydantic import ValidationError
|
|
21
|
+
import json
|
|
22
|
+
from typing import AsyncIterable, Any
|
|
23
|
+
from solace_ai_connector.common.log import log
|
|
24
|
+
|
|
25
|
+
from ...common.server.task_manager import TaskManager
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class A2AServer:
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
host="0.0.0.0",
|
|
32
|
+
port=5000,
|
|
33
|
+
endpoint="/",
|
|
34
|
+
agent_card: AgentCard = None,
|
|
35
|
+
task_manager: TaskManager = None,
|
|
36
|
+
):
|
|
37
|
+
self.host = host
|
|
38
|
+
self.port = port
|
|
39
|
+
self.endpoint = endpoint
|
|
40
|
+
self.task_manager = task_manager
|
|
41
|
+
self.agent_card = agent_card
|
|
42
|
+
self.app = Starlette()
|
|
43
|
+
self.app.add_route(self.endpoint, self._process_request, methods=["POST"])
|
|
44
|
+
self.app.add_route(
|
|
45
|
+
"/.well-known/agent.json", self._get_agent_card, methods=["GET"]
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
def start(self):
|
|
49
|
+
if self.agent_card is None:
|
|
50
|
+
raise ValueError("agent_card is not defined")
|
|
51
|
+
|
|
52
|
+
if self.task_manager is None:
|
|
53
|
+
raise ValueError("request_handler is not defined")
|
|
54
|
+
|
|
55
|
+
import uvicorn
|
|
56
|
+
|
|
57
|
+
uvicorn.run(self.app, host=self.host, port=self.port)
|
|
58
|
+
|
|
59
|
+
def _get_agent_card(self, request: Request) -> JSONResponse:
|
|
60
|
+
return JSONResponse(self.agent_card.model_dump(exclude_none=True))
|
|
61
|
+
|
|
62
|
+
async def _process_request(self, request: Request):
|
|
63
|
+
try:
|
|
64
|
+
body = await request.json()
|
|
65
|
+
json_rpc_request = A2ARequest.validate_python(body)
|
|
66
|
+
|
|
67
|
+
if isinstance(json_rpc_request, GetTaskRequest):
|
|
68
|
+
result = await self.task_manager.on_get_task(json_rpc_request)
|
|
69
|
+
elif isinstance(json_rpc_request, SendTaskRequest):
|
|
70
|
+
result = await self.task_manager.on_send_task(json_rpc_request)
|
|
71
|
+
elif isinstance(json_rpc_request, SendTaskStreamingRequest):
|
|
72
|
+
result = await self.task_manager.on_send_task_subscribe(
|
|
73
|
+
json_rpc_request
|
|
74
|
+
)
|
|
75
|
+
elif isinstance(json_rpc_request, CancelTaskRequest):
|
|
76
|
+
result = await self.task_manager.on_cancel_task(json_rpc_request)
|
|
77
|
+
elif isinstance(json_rpc_request, SetTaskPushNotificationRequest):
|
|
78
|
+
result = await self.task_manager.on_set_task_push_notification(
|
|
79
|
+
json_rpc_request
|
|
80
|
+
)
|
|
81
|
+
elif isinstance(json_rpc_request, GetTaskPushNotificationRequest):
|
|
82
|
+
result = await self.task_manager.on_get_task_push_notification(
|
|
83
|
+
json_rpc_request
|
|
84
|
+
)
|
|
85
|
+
elif isinstance(json_rpc_request, TaskResubscriptionRequest):
|
|
86
|
+
result = await self.task_manager.on_resubscribe_to_task(
|
|
87
|
+
json_rpc_request
|
|
88
|
+
)
|
|
89
|
+
else:
|
|
90
|
+
log.warning("Unexpected request type: %s", type(json_rpc_request))
|
|
91
|
+
raise ValueError("Unexpected request type: %s" % type(request))
|
|
92
|
+
|
|
93
|
+
return self._create_response(result)
|
|
94
|
+
|
|
95
|
+
except Exception as e:
|
|
96
|
+
return self._handle_exception(e)
|
|
97
|
+
|
|
98
|
+
def _handle_exception(self, e: Exception) -> JSONResponse:
|
|
99
|
+
if isinstance(e, json.decoder.JSONDecodeError):
|
|
100
|
+
json_rpc_error = JSONParseError()
|
|
101
|
+
elif isinstance(e, ValidationError):
|
|
102
|
+
json_rpc_error = InvalidRequestError(data=json.loads(e.json()))
|
|
103
|
+
else:
|
|
104
|
+
log.error("Unhandled exception: %s", e, exc_info=True)
|
|
105
|
+
json_rpc_error = InternalError()
|
|
106
|
+
|
|
107
|
+
response = JSONRPCResponse(id=None, error=json_rpc_error)
|
|
108
|
+
return JSONResponse(response.model_dump(exclude_none=True), status_code=400)
|
|
109
|
+
|
|
110
|
+
def _create_response(self, result: Any) -> JSONResponse | EventSourceResponse:
|
|
111
|
+
if isinstance(result, AsyncIterable):
|
|
112
|
+
|
|
113
|
+
async def event_generator(result) -> AsyncIterable[dict[str, str]]:
|
|
114
|
+
async for item in result:
|
|
115
|
+
yield {"data": item.model_dump_json(exclude_none=True)}
|
|
116
|
+
|
|
117
|
+
return EventSourceResponse(event_generator(result))
|
|
118
|
+
elif isinstance(result, JSONRPCResponse):
|
|
119
|
+
return JSONResponse(result.model_dump(exclude_none=True))
|
|
120
|
+
else:
|
|
121
|
+
log.error("Unexpected result type: %s", type(result))
|
|
122
|
+
raise ValueError("Unexpected result type: %s" % type(result))
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
## Quick Summary
|
|
2
|
+
The `server` directory provides a complete, stand-alone Agent-to-Agent (A2A) communication server. It is built using Starlette and implements the JSON-RPC 2.0 protocol for handling various task-related requests, including standard request-response, task streaming via Server-Sent Events (SSE), and push notification management. It features an extensible task management system with a default in-memory implementation.
|
|
3
|
+
|
|
4
|
+
## Files Overview
|
|
5
|
+
- `__init__.py`: Exposes the primary public classes (`A2AServer`, `TaskManager`, `InMemoryTaskManager`) for easy access.
|
|
6
|
+
- `server.py`: Contains the main `A2AServer` class, which sets up the Starlette web application, defines HTTP endpoints, and routes incoming A2A requests to the task manager.
|
|
7
|
+
- `task_manager.py`: Defines the `TaskManager` abstract base class, which outlines the contract for handling all task operations, and provides a concrete `InMemoryTaskManager` implementation.
|
|
8
|
+
- `utils.py`: A collection of utility functions for creating standardized error responses and checking modality compatibility.
|
|
9
|
+
|
|
10
|
+
## Developer API Reference
|
|
11
|
+
|
|
12
|
+
### __init__.py
|
|
13
|
+
**Purpose:** This file makes the core server components available for direct import from the `server` package, simplifying access for developers.
|
|
14
|
+
**Import:** `from solace_ai_connector.common.server import A2AServer, TaskManager, InMemoryTaskManager`
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### server.py
|
|
19
|
+
**Purpose:** Implements the core HTTP server for Agent-to-Agent (A2A) communication. It handles JSON-RPC request parsing, routing to the appropriate task manager methods, and response generation, including support for Server-Sent Events (SSE).
|
|
20
|
+
**Import:** `from solace_ai_connector.common.server import A2AServer`
|
|
21
|
+
|
|
22
|
+
**Classes:**
|
|
23
|
+
- `A2AServer(host: str = "0.0.0.0", port: int = 5000, endpoint: str = "/", agent_card: AgentCard = None, task_manager: TaskManager = None)` - A Starlette-based web server that exposes A2A endpoints.
|
|
24
|
+
- `start() -> None` - Starts the web server using uvicorn. Raises a `ValueError` if `agent_card` or `task_manager` are not set.
|
|
25
|
+
- `host: str` - The host address the server will bind to.
|
|
26
|
+
- `port: int` - The port the server will listen on.
|
|
27
|
+
- `endpoint: str` - The main API endpoint path for receiving JSON-RPC requests.
|
|
28
|
+
- `task_manager: TaskManager` - The handler responsible for all task-related business logic.
|
|
29
|
+
- `agent_card: AgentCard` - The metadata for the agent, served at `/.well-known/agent.json`.
|
|
30
|
+
|
|
31
|
+
**Usage Examples:**
|
|
32
|
+
```python
|
|
33
|
+
# main.py
|
|
34
|
+
from solace_ai_connector.common.server import A2AServer, InMemoryTaskManager
|
|
35
|
+
from solace_ai_connector.common.types import AgentCard
|
|
36
|
+
|
|
37
|
+
# 1. Define the agent's capabilities and metadata
|
|
38
|
+
my_agent_card = AgentCard(
|
|
39
|
+
id="my-awesome-agent-v1",
|
|
40
|
+
name="Awesome Agent",
|
|
41
|
+
version="1.0.0",
|
|
42
|
+
description="An agent that does awesome things.",
|
|
43
|
+
documentation_url="https://example.com/docs",
|
|
44
|
+
supported_tasks=["summarize", "translate"],
|
|
45
|
+
input_modalities=["text/plain"],
|
|
46
|
+
output_modalities=["text/plain"]
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# 2. Instantiate a task manager (or use your own custom implementation)
|
|
50
|
+
# This example uses a basic in-memory manager.
|
|
51
|
+
# For a real agent, you would extend InMemoryTaskManager to implement your logic.
|
|
52
|
+
class MyAgentTaskManager(InMemoryTaskManager):
|
|
53
|
+
async def on_send_task(self, request):
|
|
54
|
+
# Implement your agent's logic here
|
|
55
|
+
pass
|
|
56
|
+
async def on_send_task_subscribe(self, request):
|
|
57
|
+
# Implement your agent's streaming logic here
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
task_manager = MyAgentTaskManager()
|
|
61
|
+
|
|
62
|
+
# 3. Create and configure the server
|
|
63
|
+
server = A2AServer(
|
|
64
|
+
host="127.0.0.1",
|
|
65
|
+
port=8080,
|
|
66
|
+
endpoint="/api/v1/a2a",
|
|
67
|
+
agent_card=my_agent_card,
|
|
68
|
+
task_manager=task_manager
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# 4. Start the server
|
|
72
|
+
if __name__ == "__main__":
|
|
73
|
+
print("Starting A2A Server...")
|
|
74
|
+
server.start()
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### task_manager.py
|
|
80
|
+
**Purpose:** Defines the abstract interface for task management and provides a ready-to-use, in-memory implementation. This is the core component for implementing an agent's business logic.
|
|
81
|
+
**Import:** `from solace_ai_connector.common.server import TaskManager, InMemoryTaskManager`
|
|
82
|
+
|
|
83
|
+
**Classes:**
|
|
84
|
+
- `TaskManager()` - An abstract base class that defines the interface for handling all A2A task-related operations. Developers must implement these methods in a subclass.
|
|
85
|
+
- `on_get_task(request: GetTaskRequest) -> GetTaskResponse` - Handles a request to retrieve the status and details of a task.
|
|
86
|
+
- `on_cancel_task(request: CancelTaskRequest) -> CancelTaskResponse` - Handles a request to cancel an ongoing task.
|
|
87
|
+
- `on_send_task(request: SendTaskRequest) -> SendTaskResponse` - Handles a standard request-response task submission.
|
|
88
|
+
- `on_send_task_subscribe(request: SendTaskStreamingRequest) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]` - Handles a task submission that requires a streaming response (SSE).
|
|
89
|
+
- `on_set_task_push_notification(request: SetTaskPushNotificationRequest) -> SetTaskPushNotificationResponse` - Handles a request to configure push notifications for a task.
|
|
90
|
+
- `on_get_task_push_notification(request: GetTaskPushNotificationRequest) -> GetTaskPushNotificationResponse` - Handles a request to retrieve the push notification configuration for a task.
|
|
91
|
+
- `on_resubscribe_to_task(request: TaskResubscriptionRequest) -> Union[AsyncIterable[SendTaskResponse], JSONRPCResponse]` - Handles a request to resubscribe to a streaming task.
|
|
92
|
+
|
|
93
|
+
- `InMemoryTaskManager()` - A concrete implementation of `TaskManager` that stores tasks and push notification configurations in memory. It provides helper methods to manage task state and SSE subscriptions. It is designed to be extended.
|
|
94
|
+
- `upsert_task(task_send_params: TaskSendParams) -> Task` - Creates a new task or retrieves an existing one by its ID, adding the new message to its history.
|
|
95
|
+
- `update_store(task_id: str, status: TaskStatus, artifacts: list[Artifact]) -> Task` - Updates the status, message history, and artifacts of a specific task.
|
|
96
|
+
- `set_push_notification_info(task_id: str, notification_config: PushNotificationConfig) -> None` - Stores the push notification configuration for a given task.
|
|
97
|
+
- `get_push_notification_info(task_id: str) -> PushNotificationConfig` - Retrieves the push notification configuration for a given task.
|
|
98
|
+
- `has_push_notification_info(task_id: str) -> bool` - Checks if a push notification configuration exists for a task.
|
|
99
|
+
- `setup_sse_consumer(task_id: str, is_resubscribe: bool = False) -> asyncio.Queue` - Creates and registers an `asyncio.Queue` for a new SSE subscriber for a given task.
|
|
100
|
+
- `enqueue_events_for_sse(task_id: str, task_update_event: Any) -> None` - Puts a new event (e.g., `TaskStatusUpdateEvent`) into the queues of all active SSE subscribers for a task.
|
|
101
|
+
- `dequeue_events_for_sse(request_id: str, task_id: str, sse_event_queue: asyncio.Queue) -> AsyncIterable[SendTaskStreamingResponse]` - An async generator that yields events from an SSE queue, wrapping them in `SendTaskStreamingResponse` objects.
|
|
102
|
+
|
|
103
|
+
**Usage Examples:**
|
|
104
|
+
```python
|
|
105
|
+
# custom_task_manager.py
|
|
106
|
+
import asyncio
|
|
107
|
+
from solace_ai_connector.common.server import InMemoryTaskManager
|
|
108
|
+
from solace_ai_connector.common.types import (
|
|
109
|
+
SendTaskRequest, SendTaskResponse, Task, TaskStatus, TaskState,
|
|
110
|
+
SendTaskStreamingRequest, SendTaskStreamingResponse, TaskStatusUpdateEvent
|
|
111
|
+
)
|
|
112
|
+
from typing import AsyncIterable, Union
|
|
113
|
+
|
|
114
|
+
class MyCustomTaskManager(InMemoryTaskManager):
|
|
115
|
+
# Implement the core logic for a standard task
|
|
116
|
+
async def on_send_task(self, request: SendTaskRequest) -> SendTaskResponse:
|
|
117
|
+
task = await self.upsert_task(request.params)
|
|
118
|
+
print(f"Received task {task.id} with message: {request.params.message.content}")
|
|
119
|
+
|
|
120
|
+
# Simulate work
|
|
121
|
+
await asyncio.sleep(2)
|
|
122
|
+
|
|
123
|
+
# Update task status to completed
|
|
124
|
+
final_status = TaskStatus(state=TaskState.COMPLETED)
|
|
125
|
+
await self.update_store(task.id, final_status, [])
|
|
126
|
+
|
|
127
|
+
return SendTaskResponse(id=request.id, result=task)
|
|
128
|
+
|
|
129
|
+
# Implement the core logic for a streaming task
|
|
130
|
+
async def on_send_task_subscribe(
|
|
131
|
+
self, request: SendTaskStreamingRequest
|
|
132
|
+
) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
|
|
133
|
+
|
|
134
|
+
await self.upsert_task(request.params)
|
|
135
|
+
sse_queue = await self.setup_sse_consumer(request.params.id)
|
|
136
|
+
|
|
137
|
+
# Start the background task processing
|
|
138
|
+
asyncio.create_task(self._process_streaming_task(request.params.id))
|
|
139
|
+
|
|
140
|
+
# Return the async generator that will stream responses
|
|
141
|
+
return self.dequeue_events_for_sse(request.id, request.params.id, sse_queue)
|
|
142
|
+
|
|
143
|
+
async def _process_streaming_task(self, task_id: str):
|
|
144
|
+
# Simulate streaming work
|
|
145
|
+
for i in range(5):
|
|
146
|
+
await asyncio.sleep(1)
|
|
147
|
+
update = TaskStatusUpdateEvent(
|
|
148
|
+
status=TaskStatus(state=TaskState.IN_PROGRESS),
|
|
149
|
+
message={"content": f"Step {i+1} complete"}
|
|
150
|
+
)
|
|
151
|
+
# Enqueue the update for all subscribers
|
|
152
|
+
await self.enqueue_events_for_sse(task_id, update)
|
|
153
|
+
|
|
154
|
+
# Send final event
|
|
155
|
+
final_update = TaskStatusUpdateEvent(
|
|
156
|
+
status=TaskStatus(state=TaskState.COMPLETED),
|
|
157
|
+
final=True
|
|
158
|
+
)
|
|
159
|
+
await self.enqueue_events_for_sse(task_id, final_update)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
### utils.py
|
|
165
|
+
**Purpose:** Provides common utility functions used within the server, primarily for creating standardized JSON-RPC error responses and performing compatibility checks.
|
|
166
|
+
**Import:** `from solace_ai_connector.common.server.utils import are_modalities_compatible, new_incompatible_types_error, new_not_implemented_error`
|
|
167
|
+
|
|
168
|
+
**Functions:**
|
|
169
|
+
- `are_modalities_compatible(server_output_
|