solace-agent-mesh 1.4.12__py3-none-any.whl → 1.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/adk_llm.txt +3 -4
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +1 -1
- solace_agent_mesh/agent/adk/callbacks.py +56 -5
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -1
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +2 -1
- solace_agent_mesh/agent/adk/mcp_content_processor.py +2 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +1 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +1 -2
- solace_agent_mesh/agent/adk/runner.py +3 -1
- solace_agent_mesh/agent/adk/services.py +4 -1
- solace_agent_mesh/agent/adk/setup.py +3 -1
- solace_agent_mesh/agent/adk/tool_wrapper.py +2 -2
- solace_agent_mesh/agent/agent_llm.txt +1 -1
- solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +4 -14
- solace_agent_mesh/agent/protocol/protocol_llm.txt +15 -2
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
- solace_agent_mesh/agent/sac/app.py +3 -1
- solace_agent_mesh/agent/sac/component.py +55 -22
- solace_agent_mesh/agent/sac/sac_llm.txt +15 -1
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +73 -0
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
- solace_agent_mesh/agent/tools/audio_tools.py +2 -1
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +3 -1
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +3 -1
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -1
- solace_agent_mesh/agent/tools/general_agent_tools.py +2 -1
- solace_agent_mesh/agent/tools/image_tools.py +2 -1
- solace_agent_mesh/agent/tools/peer_agent_tool.py +2 -1
- solace_agent_mesh/agent/tools/registry.py +3 -1
- solace_agent_mesh/agent/tools/test_tools.py +2 -1
- solace_agent_mesh/agent/tools/tools_llm.txt +148 -154
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +274 -0
- solace_agent_mesh/agent/tools/web_tools.py +2 -1
- solace_agent_mesh/agent/utils/artifact_helpers.py +3 -1
- solace_agent_mesh/agent/utils/config_parser.py +3 -1
- solace_agent_mesh/agent/utils/utils_llm.txt +1 -1
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/{b7006a3a.73a79653.js → 032c2d61.f3d37824.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{2334.622a6395.js → 2334.1cf50a20.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{3624.b524e433.js → 3624.0eaa1fd0.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/509e993c.4c7a1a6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.e49689dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.39d5851d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.804d6567.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.64c9bd6c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{8591.d7c16be6.js → 8591.5d015485.js} +2 -2
- solace_agent_mesh/assets/docs/assets/js/{8731.49e930c2.js → 8731.6c1dbf0c.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.dd810042.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.60668e9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.9d369087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.cbc66f02.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.139b4b9c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.2b916f9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.582a78ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5766a13d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.9c0297a6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.bd3c34f3.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.18dc45dd.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +143 -0
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/artifact-management/index.html +7 -7
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/audio-tools/index.html +7 -7
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/data-analysis-tools/index.html +8 -8
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/embeds/index.html +6 -6
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/index.html +11 -11
- solace_agent_mesh/assets/docs/docs/documentation/{concepts → components}/cli/index.html +25 -25
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +91 -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/deploying/debugging/index.html +104 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +59 -0
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/create-agents/index.html +113 -152
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/create-gateways/index.html +9 -9
- solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/creating-python-tools/index.html +12 -12
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +32 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/bedrock-agents/index.html +25 -25
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/custom-agent/index.html +13 -13
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/event-mesh-gateway/index.html +11 -11
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/mcp-integration/index.html +10 -10
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/mongodb-integration/index.html +13 -13
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/rag-integration/index.html +13 -13
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/rest-gateway/index.html +10 -10
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/sql-database/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +83 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +222 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +161 -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 +53 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +35 -100
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
- solace_agent_mesh/assets/docs/docs/documentation/{getting-started → installing-and-configuring}/configurations/index.html +56 -50
- 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 +76 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +63 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -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 To 0.3.0/a2a-technical-migration-map/index.html → migrations/a2a-upgrade/a2a-technical-migration-map/index.html} +10 -11
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1760121512891.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1760121512891.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-j1LW-wlq.js → authCallback-DwrxZE0E.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-B9p_nFNA.js → client-DarGQzyw.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-2nd1gbaH.js +339 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-DoKXctCM.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CS5YMf8a.js → vendor-BKIeiHj_.js} +80 -70
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- solace_agent_mesh/common/a2a/a2a_llm.txt +1 -1
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
- solace_agent_mesh/common/a2a/artifact.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +3 -2
- solace_agent_mesh/common/a2a/translation.py +3 -1
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +1 -1
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
- solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +23 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +93 -15
- solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +23 -0
- solace_agent_mesh/common/common_llm.txt +24 -39
- solace_agent_mesh/common/common_llm_detail.txt +2562 -0
- solace_agent_mesh/common/data_parts.py +9 -1
- solace_agent_mesh/common/middleware/config_resolver.py +3 -1
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
- solace_agent_mesh/common/middleware/registry.py +3 -1
- solace_agent_mesh/common/sac/sac_llm.txt +1 -1
- solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
- solace_agent_mesh/common/sac/sam_component_base.py +2 -1
- solace_agent_mesh/common/sam_events/event_service.py +3 -2
- 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/employee_service.py +3 -1
- solace_agent_mesh/common/services/identity_service.py +2 -1
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +2 -1
- solace_agent_mesh/common/services/services_llm.txt +57 -6
- solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
- solace_agent_mesh/common/utils/artifact_utils.py +3 -1
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +3 -1
- solace_agent_mesh/common/utils/embeds/converter.py +3 -1
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +1 -1
- solace_agent_mesh/common/utils/embeds/evaluators.py +2 -1
- solace_agent_mesh/common/utils/embeds/modifiers.py +3 -2
- solace_agent_mesh/common/utils/embeds/resolver.py +2 -1
- solace_agent_mesh/common/utils/initializer.py +3 -1
- solace_agent_mesh/common/utils/message_utils.py +2 -1
- solace_agent_mesh/common/utils/push_notification_auth.py +3 -2
- solace_agent_mesh/common/utils/utils_llm.txt +75 -87
- solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
- solace_agent_mesh/core_a2a/service.py +2 -2
- solace_agent_mesh/gateway/base/app.py +3 -2
- solace_agent_mesh/gateway/base/base_llm.txt +1 -1
- solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
- solace_agent_mesh/gateway/base/component.py +3 -1
- solace_agent_mesh/gateway/base/task_context.py +2 -1
- solace_agent_mesh/gateway/gateway_llm.txt +242 -235
- solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +295 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +10 -1
- 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/versions_llm.txt +155 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +1 -1
- solace_agent_mesh/gateway/http_sse/app.py +150 -3
- solace_agent_mesh/gateway/http_sse/component.py +372 -61
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +46 -6
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +4 -2
- solace_agent_mesh/gateway/http_sse/dependencies.py +119 -27
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +172 -172
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
- solace_agent_mesh/gateway/http_sse/main.py +149 -42
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +3 -12
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +103 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +5 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +263 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -16
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +25 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +73 -18
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +9 -5
- 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 +266 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +3 -3
- 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 +32 -0
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +340 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +4 -53
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +173 -0
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +3 -3
- solace_agent_mesh/gateway/http_sse/routers/auth.py +3 -1
- solace_agent_mesh/gateway/http_sse/routers/config.py +29 -6
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +346 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +3 -3
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +83 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +2 -10
- 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 +5 -3
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +107 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +1 -15
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +37 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +3 -1
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +255 -204
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +223 -41
- solace_agent_mesh/gateway/http_sse/routers/sse.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +170 -43
- solace_agent_mesh/gateway/http_sse/routers/users.py +3 -1
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +3 -1
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +242 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +2 -82
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +177 -13
- solace_agent_mesh/gateway/http_sse/services/session_service.py +154 -85
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +318 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +3 -2
- solace_agent_mesh/gateway/http_sse/session_manager.py +2 -1
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +25 -14
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +285 -0
- solace_agent_mesh/gateway/http_sse/shared/types.py +7 -0
- solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +2 -1
- solace_agent_mesh/gateway/http_sse/sse_manager.py +2 -2
- solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +32 -0
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
- solace_agent_mesh/solace_agent_mesh_llm.txt +1 -1
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
- solace_agent_mesh/templates/gateway_app_template.py +4 -2
- solace_agent_mesh/templates/gateway_component_template.py +3 -1
- solace_agent_mesh/templates/logging_config_template.ini +22 -45
- solace_agent_mesh/templates/plugin_tools_template.py +2 -2
- {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/METADATA +2 -2
- solace_agent_mesh-1.5.1.dist-info/RECORD +504 -0
- solace_agent_mesh/agent/adk/invocation_monitor.py +0 -295
- 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.a248f00c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/0e682baa.d54b8668.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/1023fc19.8a8a9309.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/1523c6b4.2645ef68.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/166ab619.e27886d9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/1c6e87d2.e056b7e0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/21ceee5f.3bf39250.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2a9cab12.2afaee76.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/332e10b5.f7629851.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3d406171.5560fdf9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/42b3f8d8.508ae8db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/442a8107.b5c2532a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/453a82a6.3c6bb61d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/483cef9a.4736f2d8.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/4c2787c2.c1290a40.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55f47984.bcd00a86.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5b4258a4.fdfd2325.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/664b740a.ba305a89.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/75384d09.c19e8b51.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/768e31b0.9abcdc48.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/85387663.be2bc838.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/945fb41e.16e00776.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9a09e75d.92de8cf5.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9eff14a2.d62aad71.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a12a4955.25fbed32.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a3a92b25.af35e313.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/aba87c2f.4ddf32f2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ae0e903d.5fe5203f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ae4415af.16cc58d3.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/bac0be12.17de4316.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c2c06897.87cb1f47.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c835a94d.ce21f0bf.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/cc969b05.feef7dcc.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/cd3d4052.a19e7d78.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/cee5d587.47904f5e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/d6a81ee7.829198f1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.ed8dd236.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f897a61a.126663fe.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/fbfa3e75.e144b16c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.f67fc9f4.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.40527046.js +0 -1
- solace_agent_mesh/assets/docs/docs/documentation/Enterprise/installation/index.html +0 -46
- solace_agent_mesh/assets/docs/docs/documentation/Enterprise/rbac-setup-guilde/index.html +0 -201
- solace_agent_mesh/assets/docs/docs/documentation/Enterprise/single-sign-on/index.html +0 -25
- solace_agent_mesh/assets/docs/docs/documentation/Migrations/A2A Upgrade To 0.3.0/a2a-gateway-upgrade-to-0.3.0/index.html +0 -105
- solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +0 -144
- solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +0 -91
- solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +0 -91
- solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +0 -55
- solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +0 -111
- solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +0 -77
- solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +0 -48
- solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +0 -54
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +0 -45
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/configurations/litellm_models/index.html +0 -49
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +0 -76
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +0 -73
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +0 -72
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +0 -54
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +0 -69
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +0 -59
- solace_agent_mesh/assets/docs/lunr-index-1759936913198.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1759936913198.json +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-ChRwcV89.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-DnnE01OM.js +0 -339
- solace_agent_mesh/gateway/http_sse/repository/entities/message.py +0 -41
- solace_agent_mesh/gateway/http_sse/repository/message_repository.py +0 -84
- solace_agent_mesh/gateway/http_sse/repository/models/message_model.py +0 -45
- solace_agent_mesh-1.4.12.dist-info/RECORD +0 -448
- /solace_agent_mesh/assets/docs/assets/js/{8591.d7c16be6.js.LICENSE.txt → 8591.5d015485.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/assets/docs/assets/js/{main.f67fc9f4.js.LICENSE.txt → main.bd3c34f3.js.LICENSE.txt} +0 -0
- {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Custom Solace AI Connector Component to host the FastAPI backend for the Web UI.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import asyncio
|
|
6
7
|
import json
|
|
7
8
|
import queue
|
|
@@ -14,7 +15,7 @@ from typing import Any
|
|
|
14
15
|
import uvicorn
|
|
15
16
|
from fastapi import FastAPI, UploadFile
|
|
16
17
|
from fastapi import Request as FastAPIRequest
|
|
17
|
-
|
|
18
|
+
|
|
18
19
|
from solace_ai_connector.components.inputs_outputs.broker_input import BrokerInput
|
|
19
20
|
from solace_ai_connector.flow.app import App as SACApp
|
|
20
21
|
from solace_ai_connector.common.event import Event, EventType
|
|
@@ -26,6 +27,12 @@ from ...gateway.http_sse.session_manager import SessionManager
|
|
|
26
27
|
from ...gateway.http_sse.sse_manager import SSEManager
|
|
27
28
|
from .sse_event_buffer import SSEEventBuffer
|
|
28
29
|
from .components import VisualizationForwarderComponent
|
|
30
|
+
from .components.task_logger_forwarder import TaskLoggerForwarderComponent
|
|
31
|
+
from .services.feedback_service import FeedbackService
|
|
32
|
+
from .services.task_logger_service import TaskLoggerService
|
|
33
|
+
from . import dependencies
|
|
34
|
+
|
|
35
|
+
log = logging.getLogger(__name__)
|
|
29
36
|
|
|
30
37
|
try:
|
|
31
38
|
from google.adk.artifacts import BaseArtifactService
|
|
@@ -153,6 +160,23 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
153
160
|
else:
|
|
154
161
|
# Memory storage or no explicit configuration - no persistence service needed
|
|
155
162
|
self.database_url = None
|
|
163
|
+
|
|
164
|
+
# Validate that features requiring database persistence are not enabled
|
|
165
|
+
task_logging_config = self.get_config("task_logging", {})
|
|
166
|
+
if task_logging_config.get("enabled", False):
|
|
167
|
+
raise ValueError(
|
|
168
|
+
f"{self.log_identifier} Task logging requires SQL session storage. "
|
|
169
|
+
"Either set session_service.type='sql' with a valid database_url, "
|
|
170
|
+
"or disable task_logging.enabled."
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
feedback_config = self.get_config("feedback_publishing", {})
|
|
174
|
+
if feedback_config.get("enabled", False):
|
|
175
|
+
log.warning(
|
|
176
|
+
"%s Feedback publishing is enabled but database persistence is not configured. "
|
|
177
|
+
"Feedback will only be published to the broker, not stored locally.",
|
|
178
|
+
self.log_identifier
|
|
179
|
+
)
|
|
156
180
|
|
|
157
181
|
component_config = self.get_config("component_config", {})
|
|
158
182
|
app_config = component_config.get("app_config", {})
|
|
@@ -170,12 +194,18 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
170
194
|
self._visualization_internal_app: SACApp | None = None
|
|
171
195
|
self._visualization_broker_input: BrokerInput | None = None
|
|
172
196
|
self._visualization_message_queue: queue.Queue = queue.Queue(maxsize=200)
|
|
197
|
+
self._task_logger_queue: queue.Queue = queue.Queue(maxsize=200)
|
|
173
198
|
self._active_visualization_streams: dict[str, dict[str, Any]] = {}
|
|
174
199
|
self._visualization_locks: dict[asyncio.AbstractEventLoop, asyncio.Lock] = {}
|
|
175
200
|
self._visualization_locks_lock = threading.Lock()
|
|
176
201
|
self._global_visualization_subscriptions: dict[str, int] = {}
|
|
177
202
|
self._visualization_processor_task: asyncio.Task | None = None
|
|
178
203
|
|
|
204
|
+
self._task_logger_internal_app: SACApp | None = None
|
|
205
|
+
self._task_logger_broker_input: BrokerInput | None = None
|
|
206
|
+
self._task_logger_processor_task: asyncio.Task | None = None
|
|
207
|
+
self.task_logger_service: TaskLoggerService | None = None
|
|
208
|
+
|
|
179
209
|
# Initialize SAM Events service for system events
|
|
180
210
|
from ...common.sam_events import SamEventService
|
|
181
211
|
|
|
@@ -185,14 +215,75 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
185
215
|
publish_func=self.publish_a2a,
|
|
186
216
|
)
|
|
187
217
|
|
|
218
|
+
# Initialize data retention service and timer
|
|
219
|
+
self.data_retention_service = None
|
|
220
|
+
self._data_retention_timer_id = None
|
|
221
|
+
data_retention_config = self.get_config("data_retention", {})
|
|
222
|
+
if data_retention_config.get("enabled", True):
|
|
223
|
+
log.info("%s Data retention is enabled. Initializing service and timer...", self.log_identifier)
|
|
224
|
+
|
|
225
|
+
# Import and initialize the DataRetentionService
|
|
226
|
+
from .services.data_retention_service import DataRetentionService
|
|
227
|
+
|
|
228
|
+
session_factory = None
|
|
229
|
+
if self.database_url:
|
|
230
|
+
# SessionLocal will be initialized later in setup_dependencies
|
|
231
|
+
# We'll pass a lambda that returns SessionLocal when called
|
|
232
|
+
session_factory = lambda: dependencies.SessionLocal() if dependencies.SessionLocal else None
|
|
233
|
+
|
|
234
|
+
self.data_retention_service = DataRetentionService(
|
|
235
|
+
session_factory=session_factory,
|
|
236
|
+
config=data_retention_config
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
# Create and start the cleanup timer
|
|
240
|
+
cleanup_interval_hours = data_retention_config.get("cleanup_interval_hours", 24)
|
|
241
|
+
cleanup_interval_ms = cleanup_interval_hours * 60 * 60 * 1000
|
|
242
|
+
self._data_retention_timer_id = f"data_retention_cleanup_{self.gateway_id}"
|
|
243
|
+
|
|
244
|
+
self.add_timer(
|
|
245
|
+
delay_ms=cleanup_interval_ms,
|
|
246
|
+
timer_id=self._data_retention_timer_id,
|
|
247
|
+
interval_ms=cleanup_interval_ms,
|
|
248
|
+
)
|
|
249
|
+
log.info(
|
|
250
|
+
"%s Data retention timer created with ID '%s' and interval %d hours.",
|
|
251
|
+
self.log_identifier,
|
|
252
|
+
self._data_retention_timer_id,
|
|
253
|
+
cleanup_interval_hours,
|
|
254
|
+
)
|
|
255
|
+
else:
|
|
256
|
+
log.info("%s Data retention is disabled via configuration.", self.log_identifier)
|
|
257
|
+
|
|
188
258
|
log.info("%s Web UI Backend Component initialized.", self.log_identifier)
|
|
189
259
|
|
|
190
260
|
def process_event(self, event: Event):
|
|
191
261
|
if event.event_type == EventType.TIMER:
|
|
192
|
-
|
|
262
|
+
timer_id = event.data.get("timer_id")
|
|
263
|
+
|
|
264
|
+
if timer_id == self._sse_cleanup_timer_id:
|
|
193
265
|
log.debug("%s SSE buffer cleanup timer triggered.", self.log_identifier)
|
|
194
266
|
self.sse_event_buffer.cleanup_stale_buffers()
|
|
195
267
|
return
|
|
268
|
+
|
|
269
|
+
if timer_id == self._data_retention_timer_id:
|
|
270
|
+
log.debug("%s Data retention cleanup timer triggered.", self.log_identifier)
|
|
271
|
+
if self.data_retention_service:
|
|
272
|
+
try:
|
|
273
|
+
self.data_retention_service.cleanup_old_data()
|
|
274
|
+
except Exception as e:
|
|
275
|
+
log.error(
|
|
276
|
+
"%s Error during data retention cleanup: %s",
|
|
277
|
+
self.log_identifier,
|
|
278
|
+
e,
|
|
279
|
+
exc_info=True,
|
|
280
|
+
)
|
|
281
|
+
else:
|
|
282
|
+
log.warning(
|
|
283
|
+
"%s Data retention timer fired but service is not initialized.",
|
|
284
|
+
self.log_identifier,
|
|
285
|
+
)
|
|
286
|
+
return
|
|
196
287
|
|
|
197
288
|
super().process_event(event)
|
|
198
289
|
|
|
@@ -270,9 +361,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
270
361
|
forwarder_cfg = {
|
|
271
362
|
"component_class": VisualizationForwarderComponent,
|
|
272
363
|
"component_name": f"{self.gateway_id}_viz_forwarder",
|
|
273
|
-
"component_config": {
|
|
274
|
-
"target_queue_ref": self._visualization_message_queue
|
|
275
|
-
},
|
|
364
|
+
"component_config": {"target_queue_ref": self._visualization_message_queue},
|
|
276
365
|
}
|
|
277
366
|
|
|
278
367
|
flow_config = {
|
|
@@ -355,6 +444,121 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
355
444
|
self._visualization_broker_input = None
|
|
356
445
|
raise
|
|
357
446
|
|
|
447
|
+
def _ensure_task_logger_flow_is_running(self) -> None:
|
|
448
|
+
"""
|
|
449
|
+
Ensures the internal SAC flow for A2A task logging is created and running.
|
|
450
|
+
"""
|
|
451
|
+
log_id_prefix = f"{self.log_identifier}[EnsureTaskLogFlow]"
|
|
452
|
+
if self._task_logger_internal_app is not None:
|
|
453
|
+
log.debug("%s Task logger flow already running.", log_id_prefix)
|
|
454
|
+
return
|
|
455
|
+
|
|
456
|
+
log.info("%s Initializing internal A2A task logger flow...", log_id_prefix)
|
|
457
|
+
try:
|
|
458
|
+
main_app = self.get_app()
|
|
459
|
+
if not main_app or not main_app.connector:
|
|
460
|
+
raise RuntimeError(
|
|
461
|
+
"Main app or connector not available for internal flow creation."
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
main_broker_config = main_app.app_info.get("broker", {})
|
|
465
|
+
if not main_broker_config:
|
|
466
|
+
raise ValueError("Main app broker configuration is missing.")
|
|
467
|
+
|
|
468
|
+
# The task logger needs to see ALL messages.
|
|
469
|
+
subscriptions = [{"topic": f"{self.namespace.rstrip('/')}/a2a/>"}]
|
|
470
|
+
|
|
471
|
+
broker_input_cfg = {
|
|
472
|
+
"component_module": "broker_input",
|
|
473
|
+
"component_name": f"{self.gateway_id}_task_log_broker_input",
|
|
474
|
+
"broker_queue_name": f"{self.namespace.strip('/')}/q/gdk/task_log/{self.gateway_id}/{uuid.uuid4().hex}",
|
|
475
|
+
"create_queue_on_start": True,
|
|
476
|
+
"component_config": {
|
|
477
|
+
"broker_url": main_broker_config.get("broker_url"),
|
|
478
|
+
"broker_username": main_broker_config.get("broker_username"),
|
|
479
|
+
"broker_password": main_broker_config.get("broker_password"),
|
|
480
|
+
"broker_vpn": main_broker_config.get("broker_vpn"),
|
|
481
|
+
"trust_store_path": main_broker_config.get("trust_store_path"),
|
|
482
|
+
"dev_mode": main_broker_config.get("dev_mode"),
|
|
483
|
+
"broker_subscriptions": subscriptions,
|
|
484
|
+
"reconnection_strategy": main_broker_config.get(
|
|
485
|
+
"reconnection_strategy"
|
|
486
|
+
),
|
|
487
|
+
"retry_interval": main_broker_config.get("retry_interval"),
|
|
488
|
+
"retry_count": main_broker_config.get("retry_count"),
|
|
489
|
+
"temporary_queue": True,
|
|
490
|
+
},
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
forwarder_cfg = {
|
|
494
|
+
"component_class": TaskLoggerForwarderComponent,
|
|
495
|
+
"component_name": f"{self.gateway_id}_task_log_forwarder",
|
|
496
|
+
"component_config": {"target_queue_ref": self._task_logger_queue},
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
flow_config = {
|
|
500
|
+
"name": f"{self.gateway_id}_task_log_flow",
|
|
501
|
+
"components": [broker_input_cfg, forwarder_cfg],
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
internal_app_broker_config = main_broker_config.copy()
|
|
505
|
+
internal_app_broker_config["input_enabled"] = True
|
|
506
|
+
internal_app_broker_config["output_enabled"] = False
|
|
507
|
+
|
|
508
|
+
app_config_for_internal_flow = {
|
|
509
|
+
"name": f"{self.gateway_id}_task_log_internal_app",
|
|
510
|
+
"flows": [flow_config],
|
|
511
|
+
"broker": internal_app_broker_config,
|
|
512
|
+
"app_config": {},
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
self._task_logger_internal_app = main_app.connector.create_internal_app(
|
|
516
|
+
app_name=app_config_for_internal_flow["name"],
|
|
517
|
+
flows=app_config_for_internal_flow["flows"],
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
if (
|
|
521
|
+
not self._task_logger_internal_app
|
|
522
|
+
or not self._task_logger_internal_app.flows
|
|
523
|
+
):
|
|
524
|
+
raise RuntimeError("Internal task logger app/flow creation failed.")
|
|
525
|
+
|
|
526
|
+
self._task_logger_internal_app.run()
|
|
527
|
+
log.info("%s Internal task logger app started.", log_id_prefix)
|
|
528
|
+
|
|
529
|
+
flow_instance = self._task_logger_internal_app.flows[0]
|
|
530
|
+
if flow_instance.component_groups and flow_instance.component_groups[0]:
|
|
531
|
+
self._task_logger_broker_input = flow_instance.component_groups[0][0]
|
|
532
|
+
if not isinstance(self._task_logger_broker_input, BrokerInput):
|
|
533
|
+
raise RuntimeError(
|
|
534
|
+
"Task logger flow setup error: BrokerInput not found."
|
|
535
|
+
)
|
|
536
|
+
log.info(
|
|
537
|
+
"%s Obtained reference to internal task logger BrokerInput component.",
|
|
538
|
+
log_id_prefix,
|
|
539
|
+
)
|
|
540
|
+
else:
|
|
541
|
+
raise RuntimeError(
|
|
542
|
+
"Task logger flow setup error: BrokerInput instance not accessible."
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
except Exception as e:
|
|
546
|
+
log.exception(
|
|
547
|
+
"%s Failed to ensure task logger flow is running: %s", log_id_prefix, e
|
|
548
|
+
)
|
|
549
|
+
if self._task_logger_internal_app:
|
|
550
|
+
try:
|
|
551
|
+
self._task_logger_internal_app.cleanup()
|
|
552
|
+
except Exception as cleanup_err:
|
|
553
|
+
log.error(
|
|
554
|
+
"%s Error during cleanup after task logger flow init failure: %s",
|
|
555
|
+
log_id_prefix,
|
|
556
|
+
cleanup_err,
|
|
557
|
+
)
|
|
558
|
+
self._task_logger_internal_app = None
|
|
559
|
+
self._task_logger_broker_input = None
|
|
560
|
+
raise
|
|
561
|
+
|
|
358
562
|
def _resolve_session_config(self) -> dict:
|
|
359
563
|
"""
|
|
360
564
|
Resolve session service configuration with backward compatibility.
|
|
@@ -390,7 +594,6 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
390
594
|
"""
|
|
391
595
|
Asynchronously consumes messages from the _visualization_message_queue,
|
|
392
596
|
filters them, and forwards them to relevant SSE connections.
|
|
393
|
-
Placeholder for Phase 2: Just logs messages.
|
|
394
597
|
"""
|
|
395
598
|
log_id_prefix = f"{self.log_identifier}[VizMsgProcessor]"
|
|
396
599
|
log.info("%s Starting visualization message processor loop...", log_id_prefix)
|
|
@@ -417,7 +620,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
417
620
|
max_size = self._visualization_message_queue.maxsize
|
|
418
621
|
if max_size > 0 and (current_size / max_size) > 0.90:
|
|
419
622
|
log.warning(
|
|
420
|
-
"%s Visualization queue is over 90%% full. Current size: %d/%d",
|
|
623
|
+
"%s Visualization message queue is over 90%% full. Current size: %d/%d",
|
|
421
624
|
log_id_prefix,
|
|
422
625
|
current_size,
|
|
423
626
|
max_size,
|
|
@@ -594,6 +797,59 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
594
797
|
|
|
595
798
|
log.info("%s Visualization message processor loop finished.", log_id_prefix)
|
|
596
799
|
|
|
800
|
+
async def _task_logger_loop(self) -> None:
|
|
801
|
+
"""
|
|
802
|
+
Asynchronously consumes messages from the _task_logger_queue and
|
|
803
|
+
passes them to the TaskLoggerService for persistence.
|
|
804
|
+
"""
|
|
805
|
+
log_id_prefix = f"{self.log_identifier}[TaskLoggerLoop]"
|
|
806
|
+
log.info("%s Starting task logger loop...", log_id_prefix)
|
|
807
|
+
loop = asyncio.get_running_loop()
|
|
808
|
+
|
|
809
|
+
while not self.stop_signal.is_set():
|
|
810
|
+
msg_data = None
|
|
811
|
+
try:
|
|
812
|
+
msg_data = await loop.run_in_executor(
|
|
813
|
+
None,
|
|
814
|
+
self._task_logger_queue.get,
|
|
815
|
+
True,
|
|
816
|
+
1.0,
|
|
817
|
+
)
|
|
818
|
+
|
|
819
|
+
if msg_data is None:
|
|
820
|
+
log.info(
|
|
821
|
+
"%s Received shutdown signal for task logger loop.",
|
|
822
|
+
log_id_prefix,
|
|
823
|
+
)
|
|
824
|
+
break
|
|
825
|
+
|
|
826
|
+
if self.task_logger_service:
|
|
827
|
+
self.task_logger_service.log_event(msg_data)
|
|
828
|
+
else:
|
|
829
|
+
log.warning(
|
|
830
|
+
"%s Task logger service not available. Cannot log event.",
|
|
831
|
+
log_id_prefix,
|
|
832
|
+
)
|
|
833
|
+
|
|
834
|
+
self._task_logger_queue.task_done()
|
|
835
|
+
|
|
836
|
+
except queue.Empty:
|
|
837
|
+
continue
|
|
838
|
+
except asyncio.CancelledError:
|
|
839
|
+
log.info("%s Task logger loop cancelled.", log_id_prefix)
|
|
840
|
+
break
|
|
841
|
+
except Exception as e:
|
|
842
|
+
log.exception(
|
|
843
|
+
"%s Error in task logger loop: %s",
|
|
844
|
+
log_id_prefix,
|
|
845
|
+
e,
|
|
846
|
+
)
|
|
847
|
+
if msg_data and self._task_logger_queue:
|
|
848
|
+
self._task_logger_queue.task_done()
|
|
849
|
+
await asyncio.sleep(1)
|
|
850
|
+
|
|
851
|
+
log.info("%s Task logger loop finished.", log_id_prefix)
|
|
852
|
+
|
|
597
853
|
async def _add_visualization_subscription(
|
|
598
854
|
self, topic_str: str, stream_id: str
|
|
599
855
|
) -> bool:
|
|
@@ -919,6 +1175,18 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
919
1175
|
|
|
920
1176
|
setup_dependencies(self, self.database_url)
|
|
921
1177
|
|
|
1178
|
+
# Instantiate services that depend on the database session factory.
|
|
1179
|
+
# This must be done *after* setup_dependencies has run.
|
|
1180
|
+
session_factory = dependencies.SessionLocal if self.database_url else None
|
|
1181
|
+
task_logging_config = self.get_config("task_logging", {})
|
|
1182
|
+
self.task_logger_service = TaskLoggerService(
|
|
1183
|
+
session_factory=session_factory, config=task_logging_config
|
|
1184
|
+
)
|
|
1185
|
+
log.info(
|
|
1186
|
+
"%s Services dependent on database session factory have been initialized.",
|
|
1187
|
+
self.log_identifier,
|
|
1188
|
+
)
|
|
1189
|
+
|
|
922
1190
|
port = (
|
|
923
1191
|
self.fastapi_https_port
|
|
924
1192
|
if self.ssl_keyfile and self.ssl_certfile
|
|
@@ -976,6 +1244,35 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
976
1244
|
"%s Visualization message processor task already running.",
|
|
977
1245
|
self.log_identifier,
|
|
978
1246
|
)
|
|
1247
|
+
|
|
1248
|
+
task_logging_config = self.get_config("task_logging", {})
|
|
1249
|
+
if task_logging_config.get("enabled", False):
|
|
1250
|
+
log.info(
|
|
1251
|
+
"%s Task logging is enabled. Ensuring flow is running...",
|
|
1252
|
+
self.log_identifier,
|
|
1253
|
+
)
|
|
1254
|
+
self._ensure_task_logger_flow_is_running()
|
|
1255
|
+
|
|
1256
|
+
if (
|
|
1257
|
+
self._task_logger_processor_task is None
|
|
1258
|
+
or self._task_logger_processor_task.done()
|
|
1259
|
+
):
|
|
1260
|
+
log.info(
|
|
1261
|
+
"%s Starting task logger processor task.",
|
|
1262
|
+
self.log_identifier,
|
|
1263
|
+
)
|
|
1264
|
+
self._task_logger_processor_task = (
|
|
1265
|
+
self.fastapi_event_loop.create_task(
|
|
1266
|
+
self._task_logger_loop()
|
|
1267
|
+
)
|
|
1268
|
+
)
|
|
1269
|
+
else:
|
|
1270
|
+
log.info(
|
|
1271
|
+
"%s Task logger processor task already running.",
|
|
1272
|
+
self.log_identifier,
|
|
1273
|
+
)
|
|
1274
|
+
else:
|
|
1275
|
+
log.info("%s Task logging is disabled.", self.log_identifier)
|
|
979
1276
|
else:
|
|
980
1277
|
log.error(
|
|
981
1278
|
"%s FastAPI event loop not captured. Cannot start visualization processor.",
|
|
@@ -990,6 +1287,27 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
990
1287
|
)
|
|
991
1288
|
self.stop_signal.set()
|
|
992
1289
|
|
|
1290
|
+
try:
|
|
1291
|
+
from solace_agent_mesh_enterprise.init_enterprise import start_enterprise_background_tasks
|
|
1292
|
+
log.info("%s Starting enterprise background tasks...", self.log_identifier)
|
|
1293
|
+
await start_enterprise_background_tasks(self)
|
|
1294
|
+
log.info("%s Enterprise background tasks started successfully", self.log_identifier)
|
|
1295
|
+
except ImportError:
|
|
1296
|
+
log.debug("%s Enterprise package not available - skipping background tasks", self.log_identifier)
|
|
1297
|
+
except RuntimeError as enterprise_err:
|
|
1298
|
+
log.warning(
|
|
1299
|
+
"%s Enterprise background tasks disabled: %s - Community features will continue normally",
|
|
1300
|
+
self.log_identifier,
|
|
1301
|
+
enterprise_err
|
|
1302
|
+
)
|
|
1303
|
+
except Exception as enterprise_err:
|
|
1304
|
+
log.error(
|
|
1305
|
+
"%s Failed to start enterprise background tasks: %s - Community features will continue normally",
|
|
1306
|
+
self.log_identifier,
|
|
1307
|
+
enterprise_err,
|
|
1308
|
+
exc_info=True
|
|
1309
|
+
)
|
|
1310
|
+
|
|
993
1311
|
@self.fastapi_app.on_event("shutdown")
|
|
994
1312
|
async def shutdown_event():
|
|
995
1313
|
log.info(
|
|
@@ -997,6 +1315,21 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
997
1315
|
self.log_identifier,
|
|
998
1316
|
)
|
|
999
1317
|
|
|
1318
|
+
try:
|
|
1319
|
+
from solace_agent_mesh_enterprise.init_enterprise import stop_enterprise_background_tasks
|
|
1320
|
+
log.info("%s Stopping enterprise background tasks...", self.log_identifier)
|
|
1321
|
+
await stop_enterprise_background_tasks()
|
|
1322
|
+
log.info("%s Enterprise background tasks stopped", self.log_identifier)
|
|
1323
|
+
except ImportError:
|
|
1324
|
+
log.debug("%s Enterprise package not available - no background tasks to stop", self.log_identifier)
|
|
1325
|
+
except Exception as enterprise_err:
|
|
1326
|
+
log.error(
|
|
1327
|
+
"%s Failed to stop enterprise background tasks: %s",
|
|
1328
|
+
self.log_identifier,
|
|
1329
|
+
enterprise_err,
|
|
1330
|
+
exc_info=True
|
|
1331
|
+
)
|
|
1332
|
+
|
|
1000
1333
|
self.fastapi_thread = threading.Thread(
|
|
1001
1334
|
target=self.uvicorn_server.run, daemon=True, name="FastAPI_Thread"
|
|
1002
1335
|
)
|
|
@@ -1059,10 +1392,23 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
1059
1392
|
def cleanup(self):
|
|
1060
1393
|
"""Gracefully shuts down the component and the FastAPI server."""
|
|
1061
1394
|
log.info("%s Cleaning up Web UI Backend Component...", self.log_identifier)
|
|
1395
|
+
|
|
1396
|
+
# Cancel timers
|
|
1062
1397
|
self.cancel_timer(self._sse_cleanup_timer_id)
|
|
1398
|
+
if self._data_retention_timer_id:
|
|
1399
|
+
self.cancel_timer(self._data_retention_timer_id)
|
|
1400
|
+
log.info("%s Cancelled data retention cleanup timer.", self.log_identifier)
|
|
1401
|
+
|
|
1402
|
+
# Clean up data retention service
|
|
1403
|
+
if self.data_retention_service:
|
|
1404
|
+
self.data_retention_service = None
|
|
1405
|
+
log.info("%s Data retention service cleaned up.", self.log_identifier)
|
|
1406
|
+
|
|
1063
1407
|
log.info("%s Cleaning up visualization resources...", self.log_identifier)
|
|
1064
1408
|
if self._visualization_message_queue:
|
|
1065
1409
|
self._visualization_message_queue.put(None)
|
|
1410
|
+
if self._task_logger_queue:
|
|
1411
|
+
self._task_logger_queue.put(None)
|
|
1066
1412
|
|
|
1067
1413
|
if (
|
|
1068
1414
|
self._visualization_processor_task
|
|
@@ -1073,6 +1419,10 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
1073
1419
|
)
|
|
1074
1420
|
self._visualization_processor_task.cancel()
|
|
1075
1421
|
|
|
1422
|
+
if self._task_logger_processor_task and not self._task_logger_processor_task.done():
|
|
1423
|
+
log.info("%s Cancelling task logger processor task...", self.log_identifier)
|
|
1424
|
+
self._task_logger_processor_task.cancel()
|
|
1425
|
+
|
|
1076
1426
|
if self._visualization_internal_app:
|
|
1077
1427
|
log.info(
|
|
1078
1428
|
"%s Cleaning up internal visualization app...", self.log_identifier
|
|
@@ -1086,6 +1436,17 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
1086
1436
|
e,
|
|
1087
1437
|
)
|
|
1088
1438
|
|
|
1439
|
+
if self._task_logger_internal_app:
|
|
1440
|
+
log.info("%s Cleaning up internal task logger app...", self.log_identifier)
|
|
1441
|
+
try:
|
|
1442
|
+
self._task_logger_internal_app.cleanup()
|
|
1443
|
+
except Exception as e:
|
|
1444
|
+
log.error(
|
|
1445
|
+
"%s Error cleaning up internal task logger app: %s",
|
|
1446
|
+
self.log_identifier,
|
|
1447
|
+
e,
|
|
1448
|
+
)
|
|
1449
|
+
|
|
1089
1450
|
self._active_visualization_streams.clear()
|
|
1090
1451
|
self._global_visualization_subscriptions.clear()
|
|
1091
1452
|
self._cleanup_visualization_locks()
|
|
@@ -1375,6 +1736,10 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
1375
1736
|
def get_session_manager(self) -> SessionManager:
|
|
1376
1737
|
return self.session_manager
|
|
1377
1738
|
|
|
1739
|
+
def get_task_logger_service(self) -> TaskLoggerService | None:
|
|
1740
|
+
"""Returns the shared TaskLoggerService instance."""
|
|
1741
|
+
return self.task_logger_service
|
|
1742
|
+
|
|
1378
1743
|
def get_namespace(self) -> str:
|
|
1379
1744
|
return self.namespace
|
|
1380
1745
|
|
|
@@ -1672,60 +2037,6 @@ class WebUIBackendComponent(BaseGatewayComponent):
|
|
|
1672
2037
|
a2a_task_id,
|
|
1673
2038
|
)
|
|
1674
2039
|
|
|
1675
|
-
# Store final agent response in persistence layer if available
|
|
1676
|
-
if hasattr(self, "database_url") and self.database_url:
|
|
1677
|
-
try:
|
|
1678
|
-
session_id = external_request_context.get("a2a_session_id")
|
|
1679
|
-
user_id = external_request_context.get("user_id_for_a2a")
|
|
1680
|
-
agent_name = external_request_context.get(
|
|
1681
|
-
"target_agent_name", "agent"
|
|
1682
|
-
)
|
|
1683
|
-
|
|
1684
|
-
message_text = ""
|
|
1685
|
-
if task_data.status and task_data.status.message:
|
|
1686
|
-
parts = a2a.get_parts_from_message(task_data.status.message)
|
|
1687
|
-
for part in parts:
|
|
1688
|
-
if hasattr(part, "text") and part.text:
|
|
1689
|
-
if message_text:
|
|
1690
|
-
message_text += "\n"
|
|
1691
|
-
message_text += part.text
|
|
1692
|
-
|
|
1693
|
-
if message_text and session_id and user_id:
|
|
1694
|
-
from .dependencies import SessionLocal, get_session_business_service
|
|
1695
|
-
from ...gateway.http_sse.shared.enums import SenderType
|
|
1696
|
-
|
|
1697
|
-
# For background processing, create simple session wrapper
|
|
1698
|
-
if SessionLocal:
|
|
1699
|
-
db = SessionLocal()
|
|
1700
|
-
try:
|
|
1701
|
-
session_service = get_session_business_service()
|
|
1702
|
-
session_service.add_message_to_session(
|
|
1703
|
-
db=db,
|
|
1704
|
-
session_id=session_id,
|
|
1705
|
-
user_id=user_id,
|
|
1706
|
-
message=message_text,
|
|
1707
|
-
sender_type=SenderType.AGENT,
|
|
1708
|
-
sender_name=agent_name,
|
|
1709
|
-
agent_id=agent_name,
|
|
1710
|
-
)
|
|
1711
|
-
db.commit()
|
|
1712
|
-
except Exception:
|
|
1713
|
-
db.rollback()
|
|
1714
|
-
raise
|
|
1715
|
-
finally:
|
|
1716
|
-
db.close()
|
|
1717
|
-
log.info(
|
|
1718
|
-
"%s Final agent response stored in session %s",
|
|
1719
|
-
log_id_prefix,
|
|
1720
|
-
session_id,
|
|
1721
|
-
)
|
|
1722
|
-
except Exception as storage_error:
|
|
1723
|
-
log.warning(
|
|
1724
|
-
"%s Failed to store final agent response: %s",
|
|
1725
|
-
log_id_prefix,
|
|
1726
|
-
storage_error,
|
|
1727
|
-
)
|
|
1728
|
-
|
|
1729
2040
|
except Exception as e:
|
|
1730
2041
|
log.exception(
|
|
1731
2042
|
"%s Failed to send final_response via SSE for A2A Task ID %s: %s",
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# DEVELOPER GUIDE: components
|
|
2
2
|
|
|
3
3
|
## Quick Summary
|
|
4
|
-
This directory contains components for the HTTP SSE (Server-Sent Events) gateway
|
|
4
|
+
This directory contains SAC (Solace AI Connector) components for the HTTP SSE (Server-Sent Events) gateway. These components forward messages from Solace broker inputs to internal Python queues, enabling real-time visualization and task logging in web-based user interfaces.
|
|
5
5
|
|
|
6
6
|
## Files Overview
|
|
7
|
-
- `__init__.py` - Makes the `VisualizationForwarderComponent` class directly importable from the
|
|
8
|
-
- `
|
|
7
|
+
- `__init__.py` - Makes the `VisualizationForwarderComponent` class directly importable from the components package
|
|
8
|
+
- `components_llm.txt` - Developer guide documentation for this directory
|
|
9
|
+
- `task_logger_forwarder.py` - SAC component that forwards messages to a task logging queue
|
|
10
|
+
- `visualization_forwarder_component.py` - SAC component that forwards messages to a visualization queue
|
|
9
11
|
|
|
10
12
|
## Developer API Reference
|
|
11
13
|
|
|
@@ -16,12 +18,50 @@ This directory contains components for the HTTP SSE (Server-Sent Events) gateway
|
|
|
16
18
|
**Exports:**
|
|
17
19
|
- `VisualizationForwarderComponent` - The main component class for forwarding messages to a visualization queue
|
|
18
20
|
|
|
21
|
+
### task_logger_forwarder.py
|
|
22
|
+
**Purpose:** A SAC component that forwards messages from a BrokerInput to a target queue for task logging
|
|
23
|
+
**Import:** `from solace_agent_mesh.gateway.http_sse.components.task_logger_forwarder import TaskLoggerForwarderComponent`
|
|
24
|
+
|
|
25
|
+
**Classes:**
|
|
26
|
+
- `TaskLoggerForwarderComponent(**kwargs: Any)` - A component that forwards messages to a task logging queue, initialized with configuration parameters including `target_queue_ref`
|
|
27
|
+
- `invoke(message: SolaceMessage, data: Dict[str, Any]) -> None` - Core method called by SAC framework for each incoming message; formats data and places it onto the target queue
|
|
28
|
+
- `target_queue: queue.Queue` - The queue instance where messages are forwarded
|
|
29
|
+
|
|
30
|
+
**Constants/Variables:**
|
|
31
|
+
- `info: Dict` - Metadata dictionary required by SAC framework describing component configuration, input schema, and purpose
|
|
32
|
+
|
|
33
|
+
**Usage Examples:**
|
|
34
|
+
```python
|
|
35
|
+
import queue
|
|
36
|
+
from solace_agent_mesh.gateway.http_sse.components.task_logger_forwarder import TaskLoggerForwarderComponent
|
|
37
|
+
from solace_ai_connector.common.message import Message as SolaceMessage
|
|
38
|
+
|
|
39
|
+
# 1. Create a target queue for task logging
|
|
40
|
+
task_logging_queue = queue.Queue()
|
|
41
|
+
|
|
42
|
+
# 2. Instantiate the component with target queue reference
|
|
43
|
+
task_forwarder = TaskLoggerForwarderComponent(
|
|
44
|
+
name="task_logger",
|
|
45
|
+
target_queue_ref=task_logging_queue
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# 3. The invoke method is called automatically by SAC framework
|
|
49
|
+
# when messages arrive from connected BrokerInput component
|
|
50
|
+
|
|
51
|
+
# 4. Consume forwarded messages from the queue
|
|
52
|
+
if not task_logging_queue.empty():
|
|
53
|
+
forwarded_data = task_logging_queue.get()
|
|
54
|
+
print(f"Task Topic: {forwarded_data['topic']}")
|
|
55
|
+
print(f"Task Payload: {forwarded_data['payload']}")
|
|
56
|
+
print(f"User Properties: {forwarded_data['user_properties']}")
|
|
57
|
+
```
|
|
58
|
+
|
|
19
59
|
### visualization_forwarder_component.py
|
|
20
|
-
**Purpose:** A
|
|
60
|
+
**Purpose:** A SAC component that forwards messages from a BrokerInput to a target queue for visualization
|
|
21
61
|
**Import:** `from solace_agent_mesh.gateway.http_sse.components.visualization_forwarder_component import VisualizationForwarderComponent`
|
|
22
62
|
|
|
23
63
|
**Classes:**
|
|
24
|
-
- `VisualizationForwarderComponent(**kwargs: Any)` - A component that forwards messages to a
|
|
64
|
+
- `VisualizationForwarderComponent(**kwargs: Any)` - A component that forwards messages to a visualization queue, initialized with configuration parameters including `target_queue_ref`
|
|
25
65
|
- `invoke(message: SolaceMessage, data: Dict[str, Any]) -> None` - Core method called by SAC framework for each incoming message; formats data and places it onto the target queue
|
|
26
66
|
- `target_queue: queue.Queue` - The queue instance where messages are forwarded
|
|
27
67
|
|
|
@@ -62,4 +102,4 @@ if not visualization_queue.empty():
|
|
|
62
102
|
# }
|
|
63
103
|
```
|
|
64
104
|
|
|
65
|
-
# content_hash:
|
|
105
|
+
# content_hash: 6add2167cb9fdee9ed3e46635d6b4e9391cf062dde9e14dba250a3f33c6c4f73
|