solace-agent-mesh 1.5.0__py3-none-any.whl → 1.6.0__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/callbacks.py +14 -17
- 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 +123 -8
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +245 -0
- 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/protocol/event_handlers.py +42 -2
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +55 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1115 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +140 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +99 -0
- solace_agent_mesh/agent/proxies/base/component.py +619 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +17 -0
- solace_agent_mesh/agent/sac/app.py +12 -4
- solace_agent_mesh/agent/sac/component.py +164 -9
- solace_agent_mesh/agent/tools/audio_tools.py +127 -9
- 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/web_tools.py +12 -6
- solace_agent_mesh/agent/utils/artifact_helpers.py +144 -4
- solace_agent_mesh/agent/utils/config_parser.py +3 -1
- 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.eda4bcb2.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.f4b15f3b.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.38583438.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.48cb18a2.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/924ffdeb.8095e148.js +1 -0
- 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.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.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/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.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.27d6b065.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.2b916f9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.20feee82.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.0d198646.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -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/components/proxies/index.html +262 -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 +85 -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 +10 -10
- 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/evaluations/index.html +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/{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 +12 -12
- 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/installing-and-configuring/configurations/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +76 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/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-1761165361160.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1761165361160.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/cli/commands/add_cmd/agent_cmd.py +2 -69
- solace_agent_mesh/cli/commands/eval_cmd.py +11 -49
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +0 -5
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +10 -12
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +9 -61
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +9 -49
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +1 -2
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-DwrxZE0E.js → authCallback-BTf6dqwp.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-DarGQzyw.js → client-CaY59VuC.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-BGTaW0uv.js +342 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BKIeiHj_.js → vendor-BEmvJSYz.js} +1 -1
- 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/__init__.py +24 -0
- solace_agent_mesh/common/a2a/artifact.py +41 -1
- solace_agent_mesh/common/a2a/events.py +29 -0
- solace_agent_mesh/common/a2a/message.py +68 -0
- solace_agent_mesh/common/a2a/protocol.py +76 -3
- solace_agent_mesh/common/a2a/translation.py +3 -1
- solace_agent_mesh/common/agent_registry.py +83 -3
- solace_agent_mesh/common/constants.py +3 -1
- solace_agent_mesh/common/middleware/config_resolver.py +3 -1
- solace_agent_mesh/common/middleware/registry.py +3 -1
- 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/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/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/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/pydantic_utils.py +12 -0
- solace_agent_mesh/config_portal/backend/common.py +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +98 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-44d62be6.js → manifest-61038fc6.js} +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
- solace_agent_mesh/core_a2a/service.py +2 -2
- solace_agent_mesh/evaluation/evaluator.py +128 -104
- solace_agent_mesh/evaluation/message_organizer.py +116 -110
- solace_agent_mesh/evaluation/report_data_processor.py +84 -86
- solace_agent_mesh/evaluation/report_generator.py +73 -79
- solace_agent_mesh/evaluation/run.py +421 -235
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +111 -232
- solace_agent_mesh/evaluation/summary_builder.py +227 -117
- solace_agent_mesh/gateway/base/app.py +3 -2
- solace_agent_mesh/gateway/base/component.py +11 -2
- solace_agent_mesh/gateway/base/task_context.py +2 -1
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- solace_agent_mesh/gateway/http_sse/app.py +2 -1
- solace_agent_mesh/gateway/http_sse/component.py +102 -3
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +3 -2
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +3 -1
- solace_agent_mesh/gateway/http_sse/dependencies.py +7 -5
- solace_agent_mesh/gateway/http_sse/main.py +5 -2
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +12 -13
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +15 -18
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +25 -18
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +30 -26
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +35 -44
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +7 -5
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +97 -205
- solace_agent_mesh/gateway/http_sse/routers/auth.py +3 -1
- solace_agent_mesh/gateway/http_sse/routers/config.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +4 -3
- solace_agent_mesh/gateway/http_sse/routers/people.py +3 -1
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +5 -3
- solace_agent_mesh/gateway/http_sse/routers/sse.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +35 -42
- solace_agent_mesh/gateway/http_sse/routers/users.py +3 -1
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +19 -12
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +3 -1
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +6 -5
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +53 -44
- solace_agent_mesh/gateway/http_sse/services/people_service.py +2 -2
- solace_agent_mesh/gateway/http_sse/services/session_service.py +23 -21
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +10 -9
- 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/base_repository.py +45 -71
- solace_agent_mesh/gateway/http_sse/shared/types.py +0 -18
- 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/templates/gateway_app_template.py +4 -2
- solace_agent_mesh/templates/gateway_component_template.py +3 -1
- solace_agent_mesh/templates/gateway_config_template.yaml +0 -5
- solace_agent_mesh/templates/logging_config_template.ini +27 -46
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +0 -3
- solace_agent_mesh/templates/plugin_tools_template.py +2 -2
- solace_agent_mesh/templates/shared_config.yaml +40 -0
- {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/METADATA +47 -21
- {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/RECORD +254 -225
- 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.bf9398af.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.0c149855.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.c66557e4.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 -29
- 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/index.html +0 -74
- 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-1760032255022.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1760032255022.json +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-CZbpmwfA.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-C__uuUkB.js +0 -339
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-BNuqpWDc.js +0 -98
- solace_agent_mesh/evaluation/config_loader.py +0 -657
- solace_agent_mesh/evaluation/test_case_loader.py +0 -714
- /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.0c149855.js.LICENSE.txt → main.20feee82.js.LICENSE.txt} +0 -0
- {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -14,6 +14,8 @@ from .artifact import (
|
|
|
14
14
|
get_artifact_id,
|
|
15
15
|
get_artifact_name,
|
|
16
16
|
get_parts_from_artifact,
|
|
17
|
+
get_text_content_from_artifact,
|
|
18
|
+
is_text_only_artifact,
|
|
17
19
|
update_artifact_parts,
|
|
18
20
|
prepare_file_part_for_publishing,
|
|
19
21
|
resolve_file_part_uri,
|
|
@@ -25,6 +27,8 @@ from .events import (
|
|
|
25
27
|
get_artifact_from_artifact_update,
|
|
26
28
|
get_data_parts_from_status_update,
|
|
27
29
|
get_message_from_status_update,
|
|
30
|
+
is_task_artifact_update,
|
|
31
|
+
is_task_status_update,
|
|
28
32
|
)
|
|
29
33
|
from .message import (
|
|
30
34
|
create_agent_data_message,
|
|
@@ -51,6 +55,11 @@ from .message import (
|
|
|
51
55
|
get_text_from_message,
|
|
52
56
|
get_text_from_text_part,
|
|
53
57
|
get_uri_from_file_part,
|
|
58
|
+
is_data_part,
|
|
59
|
+
is_file_part,
|
|
60
|
+
is_file_part_bytes,
|
|
61
|
+
is_file_part_uri,
|
|
62
|
+
is_text_part,
|
|
54
63
|
)
|
|
55
64
|
from .protocol import (
|
|
56
65
|
create_cancel_task_request,
|
|
@@ -92,8 +101,11 @@ from .protocol import (
|
|
|
92
101
|
get_response_result,
|
|
93
102
|
get_task_id_from_cancel_request,
|
|
94
103
|
extract_task_id_from_topic,
|
|
104
|
+
is_client_event,
|
|
105
|
+
is_message_object,
|
|
95
106
|
subscription_to_regex,
|
|
96
107
|
topic_matches_subscription,
|
|
108
|
+
unpack_client_event,
|
|
97
109
|
)
|
|
98
110
|
from .task import (
|
|
99
111
|
create_final_task,
|
|
@@ -122,6 +134,8 @@ __all__ = [
|
|
|
122
134
|
"get_artifact_id",
|
|
123
135
|
"get_artifact_name",
|
|
124
136
|
"get_parts_from_artifact",
|
|
137
|
+
"get_text_content_from_artifact",
|
|
138
|
+
"is_text_only_artifact",
|
|
125
139
|
"update_artifact_parts",
|
|
126
140
|
"prepare_file_part_for_publishing",
|
|
127
141
|
"resolve_file_part_uri",
|
|
@@ -132,6 +146,8 @@ __all__ = [
|
|
|
132
146
|
"get_artifact_from_artifact_update",
|
|
133
147
|
"get_data_parts_from_status_update",
|
|
134
148
|
"get_message_from_status_update",
|
|
149
|
+
"is_task_artifact_update",
|
|
150
|
+
"is_task_status_update",
|
|
135
151
|
# message.py
|
|
136
152
|
"create_agent_data_message",
|
|
137
153
|
"create_agent_parts_message",
|
|
@@ -157,6 +173,11 @@ __all__ = [
|
|
|
157
173
|
"get_text_from_message",
|
|
158
174
|
"get_uri_from_file_part",
|
|
159
175
|
"get_text_from_text_part",
|
|
176
|
+
"is_data_part",
|
|
177
|
+
"is_file_part",
|
|
178
|
+
"is_file_part_bytes",
|
|
179
|
+
"is_file_part_uri",
|
|
180
|
+
"is_text_part",
|
|
160
181
|
# protocol.py
|
|
161
182
|
"create_cancel_task_request",
|
|
162
183
|
"create_error_response",
|
|
@@ -197,8 +218,11 @@ __all__ = [
|
|
|
197
218
|
"get_response_result",
|
|
198
219
|
"get_task_id_from_cancel_request",
|
|
199
220
|
"extract_task_id_from_topic",
|
|
221
|
+
"is_client_event",
|
|
222
|
+
"is_message_object",
|
|
200
223
|
"subscription_to_regex",
|
|
201
224
|
"topic_matches_subscription",
|
|
225
|
+
"unpack_client_event",
|
|
202
226
|
# task.py
|
|
203
227
|
"create_final_task",
|
|
204
228
|
"create_initial_task",
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Helpers for creating and consuming A2A Artifact objects.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import uuid
|
|
6
7
|
import base64
|
|
7
8
|
from datetime import datetime, timezone
|
|
@@ -18,12 +19,12 @@ from a2a.types import (
|
|
|
18
19
|
Part,
|
|
19
20
|
TextPart,
|
|
20
21
|
)
|
|
21
|
-
from solace_ai_connector.common.log import log
|
|
22
22
|
from .. import a2a
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
from google.adk.artifacts import BaseArtifactService
|
|
26
26
|
|
|
27
|
+
log = logging.getLogger(__name__)
|
|
27
28
|
|
|
28
29
|
# --- Creation Helpers ---
|
|
29
30
|
|
|
@@ -326,3 +327,42 @@ def get_parts_from_artifact(artifact: Artifact) -> List[ContentPart]:
|
|
|
326
327
|
A list of the unwrapped content parts.
|
|
327
328
|
"""
|
|
328
329
|
return [part.root for part in artifact.parts]
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def is_text_only_artifact(artifact: Artifact) -> bool:
|
|
333
|
+
"""
|
|
334
|
+
Checks if an artifact contains only TextParts.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
artifact: The Artifact object to check.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
True if all parts are TextParts, False otherwise.
|
|
341
|
+
"""
|
|
342
|
+
if not artifact.parts:
|
|
343
|
+
return False
|
|
344
|
+
|
|
345
|
+
for part in artifact.parts:
|
|
346
|
+
if not isinstance(part.root, TextPart):
|
|
347
|
+
return False
|
|
348
|
+
|
|
349
|
+
return True
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def get_text_content_from_artifact(artifact: Artifact) -> List[str]:
|
|
353
|
+
"""
|
|
354
|
+
Extracts all text content from TextParts in an artifact.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
artifact: The Artifact object to extract text from.
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
A list of text strings from all TextParts. Returns empty list if no TextParts found.
|
|
361
|
+
"""
|
|
362
|
+
text_content = []
|
|
363
|
+
|
|
364
|
+
for part in artifact.parts:
|
|
365
|
+
if isinstance(part.root, TextPart):
|
|
366
|
+
text_content.append(part.root.text)
|
|
367
|
+
|
|
368
|
+
return text_content
|
|
@@ -181,3 +181,32 @@ def get_artifact_from_artifact_update(
|
|
|
181
181
|
if event:
|
|
182
182
|
return event.artifact
|
|
183
183
|
return None
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# --- Type Checking Helpers ---
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def is_task_status_update(obj: Any) -> bool:
|
|
190
|
+
"""
|
|
191
|
+
Checks if an object is a TaskStatusUpdateEvent.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
obj: The object to check.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
True if the object is a TaskStatusUpdateEvent, False otherwise.
|
|
198
|
+
"""
|
|
199
|
+
return isinstance(obj, TaskStatusUpdateEvent)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def is_task_artifact_update(obj: Any) -> bool:
|
|
203
|
+
"""
|
|
204
|
+
Checks if an object is a TaskArtifactUpdateEvent.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
obj: The object to check.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
True if the object is a TaskArtifactUpdateEvent, False otherwise.
|
|
211
|
+
"""
|
|
212
|
+
return isinstance(obj, TaskArtifactUpdateEvent)
|
|
@@ -305,3 +305,71 @@ def get_filename_from_file_part(part: FilePart) -> Optional[str]:
|
|
|
305
305
|
def get_mimetype_from_file_part(part: FilePart) -> Optional[str]:
|
|
306
306
|
"""Safely retrieves the MIME type from a FilePart."""
|
|
307
307
|
return part.file.mime_type
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
# --- Type Checking Helpers ---
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def is_text_part(part: Part) -> bool:
|
|
314
|
+
"""
|
|
315
|
+
Checks if a Part contains a TextPart.
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
part: The Part object to check.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
True if the part contains a TextPart, False otherwise.
|
|
322
|
+
"""
|
|
323
|
+
return isinstance(part.root, TextPart)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def is_file_part(part: Part) -> bool:
|
|
327
|
+
"""
|
|
328
|
+
Checks if a Part contains a FilePart.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
part: The Part object to check.
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
True if the part contains a FilePart, False otherwise.
|
|
335
|
+
"""
|
|
336
|
+
return isinstance(part.root, FilePart)
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def is_data_part(part: Part) -> bool:
|
|
340
|
+
"""
|
|
341
|
+
Checks if a Part contains a DataPart.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
part: The Part object to check.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
True if the part contains a DataPart, False otherwise.
|
|
348
|
+
"""
|
|
349
|
+
return isinstance(part.root, DataPart)
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def is_file_part_bytes(part: FilePart) -> bool:
|
|
353
|
+
"""
|
|
354
|
+
Checks if a FilePart uses FileWithBytes (embedded content).
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
part: The FilePart object to check.
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
True if the file content is embedded as bytes, False otherwise.
|
|
361
|
+
"""
|
|
362
|
+
return isinstance(part.file, FileWithBytes)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def is_file_part_uri(part: FilePart) -> bool:
|
|
366
|
+
"""
|
|
367
|
+
Checks if a FilePart uses FileWithUri (reference to external content).
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
part: The FilePart object to check.
|
|
371
|
+
|
|
372
|
+
Returns:
|
|
373
|
+
True if the file content is a URI reference, False otherwise.
|
|
374
|
+
"""
|
|
375
|
+
return isinstance(part.file, FileWithUri)
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
Helpers for A2A protocol-level concerns, such as topic construction and
|
|
3
3
|
parsing of JSON-RPC requests and responses.
|
|
4
4
|
"""
|
|
5
|
+
import logging
|
|
5
6
|
import re
|
|
6
7
|
import uuid
|
|
7
|
-
from typing import Any, Dict, Optional, Union
|
|
8
|
-
|
|
9
|
-
from solace_ai_connector.common.log import log
|
|
8
|
+
from typing import Any, Dict, Optional, Tuple, Union
|
|
10
9
|
|
|
11
10
|
from a2a.types import (
|
|
12
11
|
A2ARequest,
|
|
@@ -29,6 +28,8 @@ from a2a.types import (
|
|
|
29
28
|
TaskStatusUpdateEvent,
|
|
30
29
|
)
|
|
31
30
|
|
|
31
|
+
log = logging.getLogger(__name__)
|
|
32
|
+
|
|
32
33
|
# --- Topic Construction Helpers ---
|
|
33
34
|
|
|
34
35
|
A2A_VERSION = "v1"
|
|
@@ -531,3 +532,75 @@ def extract_task_id_from_topic(
|
|
|
531
532
|
subscription_pattern,
|
|
532
533
|
)
|
|
533
534
|
return None
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
# --- Client Event Helpers ---
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
def is_client_event(obj: Any) -> bool:
|
|
541
|
+
"""
|
|
542
|
+
Checks if an object is a ClientEvent tuple (Task, UpdateEvent).
|
|
543
|
+
|
|
544
|
+
A ClientEvent is a tuple with 2 elements where the first element is a Task
|
|
545
|
+
and the second is either a TaskStatusUpdateEvent, TaskArtifactUpdateEvent, or None.
|
|
546
|
+
|
|
547
|
+
Args:
|
|
548
|
+
obj: The object to check.
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
True if the object is a ClientEvent tuple, False otherwise.
|
|
552
|
+
"""
|
|
553
|
+
if not isinstance(obj, tuple) or len(obj) != 2:
|
|
554
|
+
return False
|
|
555
|
+
|
|
556
|
+
task, update_event = obj
|
|
557
|
+
|
|
558
|
+
# First element must be a Task
|
|
559
|
+
if not isinstance(task, Task):
|
|
560
|
+
return False
|
|
561
|
+
|
|
562
|
+
# Second element must be an update event or None
|
|
563
|
+
if update_event is not None and not isinstance(
|
|
564
|
+
update_event, (TaskStatusUpdateEvent, TaskArtifactUpdateEvent)
|
|
565
|
+
):
|
|
566
|
+
return False
|
|
567
|
+
|
|
568
|
+
return True
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
def is_message_object(obj: Any) -> bool:
|
|
572
|
+
"""
|
|
573
|
+
Checks if an object is a Message.
|
|
574
|
+
|
|
575
|
+
Args:
|
|
576
|
+
obj: The object to check.
|
|
577
|
+
|
|
578
|
+
Returns:
|
|
579
|
+
True if the object is a Message, False otherwise.
|
|
580
|
+
"""
|
|
581
|
+
return isinstance(obj, Message)
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
def unpack_client_event(
|
|
585
|
+
event: tuple,
|
|
586
|
+
) -> Tuple[Task, Optional[Union[TaskStatusUpdateEvent, TaskArtifactUpdateEvent]]]:
|
|
587
|
+
"""
|
|
588
|
+
Safely unpacks a ClientEvent tuple into its components.
|
|
589
|
+
|
|
590
|
+
Args:
|
|
591
|
+
event: A ClientEvent tuple (Task, UpdateEvent).
|
|
592
|
+
|
|
593
|
+
Returns:
|
|
594
|
+
A tuple of (Task, Optional[UpdateEvent]) where UpdateEvent can be
|
|
595
|
+
TaskStatusUpdateEvent, TaskArtifactUpdateEvent, or None.
|
|
596
|
+
|
|
597
|
+
Raises:
|
|
598
|
+
ValueError: If the event is not a valid ClientEvent tuple.
|
|
599
|
+
"""
|
|
600
|
+
if not is_client_event(event):
|
|
601
|
+
raise ValueError(
|
|
602
|
+
f"Expected a ClientEvent tuple, got {type(event).__name__}"
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
task, update_event = event
|
|
606
|
+
return task, update_event
|
|
@@ -3,13 +3,13 @@ Helpers for translating between A2A protocol objects and other domains,
|
|
|
3
3
|
such as the Google ADK.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
import logging
|
|
6
7
|
from typing import Any, Dict, List, Optional, Tuple, Union, TYPE_CHECKING
|
|
7
8
|
import json
|
|
8
9
|
import base64
|
|
9
10
|
import uuid
|
|
10
11
|
from datetime import datetime, timezone
|
|
11
12
|
from urllib.parse import urlparse, parse_qs
|
|
12
|
-
from solace_ai_connector.common.log import log
|
|
13
13
|
from google.genai import types as adk_types
|
|
14
14
|
from google.adk.events import Event as ADKEvent
|
|
15
15
|
|
|
@@ -27,6 +27,8 @@ from a2a.types import (
|
|
|
27
27
|
from .. import a2a
|
|
28
28
|
from ...agent.utils.context_helpers import get_original_session_id
|
|
29
29
|
|
|
30
|
+
log = logging.getLogger(__name__)
|
|
31
|
+
|
|
30
32
|
if TYPE_CHECKING:
|
|
31
33
|
from google.adk.artifacts import BaseArtifactService
|
|
32
34
|
from ...agent.sac.component import SamAgentComponent
|
|
@@ -4,26 +4,37 @@ Consolidated from src/tools/common/agent_registry.py and src/tools/a2a_cli_clien
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import threading
|
|
7
|
-
|
|
7
|
+
import time
|
|
8
|
+
from typing import Dict, List, Optional, Tuple
|
|
9
|
+
import logging
|
|
8
10
|
|
|
9
11
|
from a2a.types import AgentCard
|
|
10
12
|
|
|
13
|
+
log = logging.getLogger(__name__)
|
|
11
14
|
|
|
12
15
|
class AgentRegistry:
|
|
13
|
-
"""Stores and manages discovered AgentCards."""
|
|
16
|
+
"""Stores and manages discovered AgentCards with health tracking."""
|
|
14
17
|
|
|
15
18
|
def __init__(self):
|
|
16
19
|
self._agents: Dict[str, AgentCard] = {}
|
|
20
|
+
self._last_seen: Dict[str, float] = {} # Timestamp of last agent card received
|
|
17
21
|
self._lock = threading.Lock()
|
|
18
22
|
|
|
19
23
|
def add_or_update_agent(self, agent_card: AgentCard):
|
|
20
24
|
"""Adds a new agent or updates an existing one."""
|
|
25
|
+
|
|
21
26
|
if not agent_card or not agent_card.name:
|
|
22
|
-
|
|
27
|
+
log.warning("Attempted to register agent with invalid agent card or missing name")
|
|
28
|
+
return False
|
|
23
29
|
|
|
24
30
|
with self._lock:
|
|
25
31
|
is_new = agent_card.name not in self._agents
|
|
32
|
+
current_time = time.time()
|
|
33
|
+
|
|
34
|
+
# Store the agent information
|
|
26
35
|
self._agents[agent_card.name] = agent_card
|
|
36
|
+
self._last_seen[agent_card.name] = current_time
|
|
37
|
+
|
|
27
38
|
return is_new
|
|
28
39
|
|
|
29
40
|
def get_agent(self, agent_name: str) -> Optional[AgentCard]:
|
|
@@ -35,8 +46,77 @@ class AgentRegistry:
|
|
|
35
46
|
"""Returns a sorted list of discovered agent names."""
|
|
36
47
|
with self._lock:
|
|
37
48
|
return sorted(list(self._agents.keys()))
|
|
49
|
+
|
|
50
|
+
def get_last_seen(self, agent_name: str) -> Optional[float]:
|
|
51
|
+
"""Returns the timestamp when the agent was last seen."""
|
|
52
|
+
with self._lock:
|
|
53
|
+
return self._last_seen.get(agent_name)
|
|
54
|
+
|
|
55
|
+
def check_ttl_expired(self, agent_name: str, ttl_seconds: int) -> Tuple[bool, int]:
|
|
56
|
+
"""
|
|
57
|
+
Checks if an agent's TTL has expired.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
agent_name: The name of the agent to check
|
|
61
|
+
ttl_seconds: The TTL in seconds
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
A tuple of (is_expired, seconds_since_last_seen)
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
with self._lock:
|
|
68
|
+
if agent_name not in self._last_seen:
|
|
69
|
+
log.debug("Attempted to check TTL for non-existent agent '%s'", agent_name)
|
|
70
|
+
return False, 0
|
|
71
|
+
|
|
72
|
+
last_seen_time = self._last_seen.get(agent_name)
|
|
73
|
+
current_time = time.time()
|
|
74
|
+
time_since_last_seen = int(current_time - last_seen_time) if last_seen_time else 0
|
|
75
|
+
|
|
76
|
+
is_expired = time_since_last_seen > ttl_seconds
|
|
77
|
+
|
|
78
|
+
if is_expired:
|
|
79
|
+
log.warning(
|
|
80
|
+
"AGENT HEALTH CRITICAL: Agent '%s' TTL expired. "
|
|
81
|
+
"Last seen: %s seconds ago, TTL: %d seconds",
|
|
82
|
+
agent_name,
|
|
83
|
+
time_since_last_seen,
|
|
84
|
+
ttl_seconds
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
return is_expired, time_since_last_seen
|
|
88
|
+
|
|
89
|
+
def remove_agent(self, agent_name: str) -> bool:
|
|
90
|
+
"""Removes an agent from the registry."""
|
|
91
|
+
|
|
92
|
+
with self._lock:
|
|
93
|
+
if agent_name in self._agents:
|
|
94
|
+
# Get agent details before removal for logging
|
|
95
|
+
last_seen_time = self._last_seen.get(agent_name)
|
|
96
|
+
current_time = time.time()
|
|
97
|
+
time_since_last_seen = int(current_time - last_seen_time) if last_seen_time else "unknown"
|
|
98
|
+
|
|
99
|
+
# Log detailed information about the agent being removed
|
|
100
|
+
log.warning(
|
|
101
|
+
"AGENT DE-REGISTRATION: Removing agent '%s' from registry. "
|
|
102
|
+
"Last seen: %s seconds ago",
|
|
103
|
+
agent_name,
|
|
104
|
+
time_since_last_seen
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Remove the agent from all tracking dictionaries
|
|
108
|
+
del self._agents[agent_name]
|
|
109
|
+
if agent_name in self._last_seen:
|
|
110
|
+
del self._last_seen[agent_name]
|
|
111
|
+
|
|
112
|
+
log.info("Agent '%s' successfully removed from registry", agent_name)
|
|
113
|
+
return True
|
|
114
|
+
else:
|
|
115
|
+
log.debug("Attempted to remove non-existent agent '%s' from registry", agent_name)
|
|
116
|
+
return False
|
|
38
117
|
|
|
39
118
|
def clear(self):
|
|
40
119
|
"""Clears all registered agents."""
|
|
41
120
|
with self._lock:
|
|
42
121
|
self._agents.clear()
|
|
122
|
+
self._last_seen.clear()
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
DEFAULT_COMMUNICATION_TIMEOUT = 600 # 10 minutes
|
|
3
|
+
HEALTH_CHECK_TTL_SECONDS = 60 # 60 seconds - time after which a health check is considered stale
|
|
4
|
+
HEALTH_CHECK_INTERVAL_SECONDS = 10 # 10 seconds - interval between health checks
|
|
3
5
|
TEXT_ARTIFACT_CONTEXT_MAX_LENGTH_CAPACITY = 200000 # maximum number of characters that can be loaded from a text artifact
|
|
4
|
-
TEXT_ARTIFACT_CONTEXT_DEFAULT_LENGTH = 100000 # default number of characters to load from a text artifact
|
|
6
|
+
TEXT_ARTIFACT_CONTEXT_DEFAULT_LENGTH = 100000 # default number of characters to load from a text artifact
|
|
@@ -6,8 +6,10 @@ and determining feature availability. The default implementation provides passth
|
|
|
6
6
|
behavior that allows all operations.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
import logging
|
|
9
10
|
from typing import Any, Dict, List
|
|
10
|
-
|
|
11
|
+
|
|
12
|
+
log = logging.getLogger(__name__)
|
|
11
13
|
|
|
12
14
|
LOG_IDENTIFIER = "[ConfigResolver]"
|
|
13
15
|
|
|
@@ -6,8 +6,10 @@ to be bound at runtime, enabling pluggable behavior for configuration resolution
|
|
|
6
6
|
and other middleware functions.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
import logging
|
|
9
10
|
from typing import Optional, Type, Dict, Any, List
|
|
10
|
-
|
|
11
|
+
|
|
12
|
+
log = logging.getLogger(__name__)
|
|
11
13
|
|
|
12
14
|
LOG_IDENTIFIER = "[MiddlewareRegistry]"
|
|
13
15
|
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
Base Component class for SAM implementations in the Solace AI Connector.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import abc
|
|
6
7
|
import asyncio
|
|
7
8
|
import threading
|
|
8
9
|
from typing import Any
|
|
9
10
|
|
|
10
|
-
from solace_ai_connector.common.log import log
|
|
11
11
|
from solace_ai_connector.components.component_base import ComponentBase
|
|
12
12
|
|
|
13
13
|
from ..exceptions import MessageSizeExceededError
|
|
14
14
|
from ..utils.message_utils import validate_message_size
|
|
15
15
|
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
16
17
|
|
|
17
18
|
class SamComponentBase(ComponentBase, abc.ABC):
|
|
18
19
|
"""
|
|
@@ -5,14 +5,15 @@ Provides event publishing and subscription for system events like session lifecy
|
|
|
5
5
|
agent health, configuration changes, etc.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
import logging
|
|
8
9
|
import uuid
|
|
9
10
|
from datetime import datetime, timezone
|
|
10
11
|
from dataclasses import dataclass, asdict
|
|
11
12
|
from typing import Any, Dict, Optional, Callable, List
|
|
12
13
|
|
|
13
|
-
from solace_ai_connector.common.log import log
|
|
14
14
|
from ..a2a.protocol import get_sam_events_topic
|
|
15
15
|
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
16
17
|
|
|
17
18
|
@dataclass
|
|
18
19
|
class SamEvent:
|
|
@@ -204,4 +205,4 @@ class SamEventService:
|
|
|
204
205
|
raise ValueError(f"Invalid event_type format: {event_type}. Expected 'category.action'")
|
|
205
206
|
|
|
206
207
|
category, action = parts
|
|
207
|
-
return get_sam_events_topic(namespace, category, action)
|
|
208
|
+
return get_sam_events_topic(namespace, category, action)
|
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
Defines the abstract base class and factory for creating Employee Service providers.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import importlib
|
|
6
7
|
from abc import ABC, abstractmethod
|
|
7
8
|
from typing import Any, Dict, List, Optional
|
|
8
9
|
import importlib.metadata as metadata
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
|
|
11
12
|
from ..utils.in_memory_cache import InMemoryCache
|
|
12
13
|
import pandas as pd
|
|
13
14
|
|
|
15
|
+
log = logging.getLogger(__name__)
|
|
14
16
|
|
|
15
17
|
class BaseEmployeeService(ABC):
|
|
16
18
|
"""
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
Defines the abstract base class and factory for creating Identity Service providers.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import importlib
|
|
6
7
|
from abc import ABC, abstractmethod
|
|
7
8
|
from typing import Any, Dict, List, Optional
|
|
8
9
|
import importlib.metadata as metadata
|
|
9
10
|
|
|
10
|
-
from solace_ai_connector.common.log import log
|
|
11
11
|
from ..utils.in_memory_cache import InMemoryCache
|
|
12
12
|
from ..sac.sam_component_base import SamComponentBase
|
|
13
13
|
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
14
15
|
|
|
15
16
|
class BaseIdentityService(ABC):
|
|
16
17
|
"""Abstract base class for all Identity Service providers."""
|
|
@@ -3,14 +3,15 @@ A simple, file-based implementation of the BaseIdentityService.
|
|
|
3
3
|
Useful for development, testing, or small-scale deployments.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
import logging
|
|
6
7
|
import json
|
|
7
8
|
from typing import Any, Dict, List, Optional
|
|
8
9
|
|
|
9
|
-
from solace_ai_connector.common.log import log
|
|
10
10
|
from ..identity_service import BaseIdentityService
|
|
11
11
|
from ...sac.sam_component_base import SamComponentBase
|
|
12
12
|
|
|
13
13
|
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
14
15
|
|
|
15
16
|
class LocalFileIdentityService(BaseIdentityService):
|
|
16
17
|
"""
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Common utility functions for working with ADK artifacts.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
from typing import Optional
|
|
6
7
|
from google.adk.artifacts import BaseArtifactService
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
log = logging.getLogger(__name__)
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
async def get_latest_artifact_version(
|
|
@@ -8,8 +8,10 @@ The issue occurs because the default event loop policy on macOS doesn't implemen
|
|
|
8
8
|
get_child_watcher(), which is required for subprocess creation.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
import logging
|
|
11
12
|
import sys
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
def apply_macos_asyncio_fix() -> bool:
|
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
Contains the Central Data Converter and Serializer functions.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import json
|
|
6
7
|
import csv
|
|
7
8
|
import io
|
|
8
9
|
import base64
|
|
9
10
|
from typing import Any, Tuple, Optional, List, Dict
|
|
10
|
-
from solace_ai_connector.common.log import log
|
|
11
11
|
|
|
12
12
|
from .types import DataFormat
|
|
13
13
|
from ..mime_helpers import is_text_based_mime_type
|
|
14
14
|
|
|
15
|
+
log = logging.getLogger(__name__)
|
|
16
|
+
|
|
15
17
|
try:
|
|
16
18
|
import yaml
|
|
17
19
|
|