solace-agent-mesh 1.7.1__py3-none-any.whl → 1.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +164 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +752 -127
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +99 -7
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
- solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +66 -8
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +41 -1
- solace_agent_mesh/agent/adk/setup.py +220 -32
- solace_agent_mesh/agent/adk/stream_parser.py +229 -40
- solace_agent_mesh/agent/protocol/event_handlers.py +219 -33
- solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
- solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
- solace_agent_mesh/agent/proxies/base/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +37 -12
- solace_agent_mesh/agent/sac/component.py +322 -52
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +90 -0
- solace_agent_mesh/agent/tools/__init__.py +3 -0
- solace_agent_mesh/agent/tools/audio_tools.py +3 -3
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +698 -24
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +54 -2
- solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
- solace_agent_mesh/agent/tools/web_tools.py +125 -17
- solace_agent_mesh/agent/utils/artifact_helpers.py +243 -5
- solace_agent_mesh/agent/utils/context_helpers.py +17 -0
- solace_agent_mesh/assets/docs/404.html +6 -6
- solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +75 -75
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +98 -112
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -28
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -29
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +67 -53
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +87 -87
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +50 -23
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +29 -24
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +21 -21
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +96 -66
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +181 -181
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +75 -75
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -38
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +135 -114
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +37 -37
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +112 -112
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +28 -28
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1768329217460.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/__init__.py +3 -1
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
- solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
- solace_agent_mesh/cli/commands/run_cmd.py +64 -49
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +15 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-tcIFZLis.js → authCallback-KnKMP_vb.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CINwxvwV.js → vendor-CGk8Suyh.js} +189 -94
- 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/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/a2a/types.py +1 -1
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +124 -0
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/exceptions.py +24 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/rag_dto.py +156 -0
- solace_agent_mesh/common/sac/sam_component_base.py +73 -1
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +2 -27
- solace_agent_mesh/common/utils/embeds/resolver.py +94 -25
- solace_agent_mesh/common/utils/embeds/types.py +1 -0
- solace_agent_mesh/common/utils/log_formatters.py +20 -0
- solace_agent_mesh/common/utils/mime_helpers.py +12 -5
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/config_portal/backend/common.py +12 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/base.py +28 -1
- solace_agent_mesh/gateway/adapter/types.py +9 -0
- solace_agent_mesh/gateway/base/app.py +10 -0
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +451 -10
- solace_agent_mesh/gateway/generic/component.py +274 -30
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +2 -43
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +2 -2
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +23 -6
- solace_agent_mesh/gateway/http_sse/component.py +158 -73
- solace_agent_mesh/gateway/http_sse/dependencies.py +50 -57
- solace_agent_mesh/gateway/http_sse/main.py +58 -482
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +3 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +5 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +12 -107
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +113 -7
- solace_agent_mesh/gateway/http_sse/routers/auth.py +69 -132
- solace_agent_mesh/gateway/http_sse/routers/config.py +235 -10
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +1 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +250 -24
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +14 -5
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +117 -4
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +509 -149
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/project_service.py +539 -12
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +198 -21
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/sse_manager.py +280 -169
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +29 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +154 -0
- solace_agent_mesh/services/platform/api/main.py +314 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +215 -0
- solace_agent_mesh/services/platform/component.py +777 -0
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +347 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/plugin_readme_template.md +3 -25
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/proxy_template.yaml +62 -0
- solace_agent_mesh/templates/webui.yaml +148 -6
- solace_agent_mesh/tools/web_search/__init__.py +18 -0
- solace_agent_mesh/tools/web_search/base.py +84 -0
- solace_agent_mesh/tools/web_search/google_search.py +247 -0
- solace_agent_mesh/tools/web_search/models.py +99 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +29 -8
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/RECORD +334 -313
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
- solace_agent_mesh/agent/agent_llm.txt +0 -369
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
- solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
- solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.c39f8388.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/66d4869e.830d443f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.045d0fa1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +0 -1
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +0 -47
- solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1762283454666.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/client-CRYdKo2Q.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +0 -353
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
- solace_agent_mesh/common/common_llm.txt +0 -230
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
- solace_agent_mesh/common/services/services_llm.txt +0 -368
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -335
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -226
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -369
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +0 -92
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/logging_config_template.ini +0 -45
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- /solace_agent_mesh/assets/docs/assets/js/{main.f213fe0c.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -10,6 +10,7 @@ The base class is determined at import time based on enterprise package availabi
|
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
import logging
|
|
13
|
+
import time
|
|
13
14
|
from typing import Any
|
|
14
15
|
|
|
15
16
|
from google.adk.auth.credential_manager import CredentialManager
|
|
@@ -28,6 +29,7 @@ from ..utils.context_helpers import get_original_session_id
|
|
|
28
29
|
|
|
29
30
|
log = logging.getLogger(__name__)
|
|
30
31
|
|
|
32
|
+
|
|
31
33
|
def _get_base_mcp_toolset_class() -> tuple[type[MCPToolset], bool]:
|
|
32
34
|
"""
|
|
33
35
|
Factory function to determine which base MCP toolset class to use for inheritance.
|
|
@@ -76,6 +78,62 @@ def _get_base_mcp_tool_class() -> tuple[type[MCPTool], bool]:
|
|
|
76
78
|
_BaseMcpToolClass, _base_supports_tool_config = _get_base_mcp_tool_class()
|
|
77
79
|
|
|
78
80
|
|
|
81
|
+
def _log_mcp_tool_call(userId, agentId, tool_name, session_id):
|
|
82
|
+
"""A short log message so that customers can track tool usage per user/agent"""
|
|
83
|
+
log.info(
|
|
84
|
+
"MCP Tool Call - UserID: %s, AgentID: %s, ToolName: %s, SessionID: %s",
|
|
85
|
+
userId,
|
|
86
|
+
agentId,
|
|
87
|
+
tool_name,
|
|
88
|
+
session_id,
|
|
89
|
+
extra={
|
|
90
|
+
"user_id": userId,
|
|
91
|
+
"agent_id": agentId,
|
|
92
|
+
"tool_name": tool_name,
|
|
93
|
+
"session_id": session_id,
|
|
94
|
+
},
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _log_mcp_tool_success(userId, agentId, tool_name, session_id, duration_ms):
|
|
99
|
+
"""A short log message so that customers can track successful tool completion per user/agent"""
|
|
100
|
+
log.info(
|
|
101
|
+
"MCP Tool Success - UserID: %s, AgentID: %s, ToolName: %s, SessionID: %s, Duration: %.2fms",
|
|
102
|
+
userId,
|
|
103
|
+
agentId,
|
|
104
|
+
tool_name,
|
|
105
|
+
session_id,
|
|
106
|
+
duration_ms,
|
|
107
|
+
extra={
|
|
108
|
+
"user_id": userId,
|
|
109
|
+
"agent_id": agentId,
|
|
110
|
+
"tool_name": tool_name,
|
|
111
|
+
"session_id": session_id,
|
|
112
|
+
"duration_ms": duration_ms,
|
|
113
|
+
},
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _log_mcp_tool_failure(userId, agentId, tool_name, session_id, duration_ms, error):
|
|
118
|
+
"""A short log message so that customers can track tool failures per user/agent"""
|
|
119
|
+
log.error(
|
|
120
|
+
"MCP Tool Failure - UserID: %s, AgentID: %s, ToolName: %s, SessionID: %s, Duration: %.2fms, Error: %s",
|
|
121
|
+
userId,
|
|
122
|
+
agentId,
|
|
123
|
+
tool_name,
|
|
124
|
+
session_id,
|
|
125
|
+
duration_ms,
|
|
126
|
+
str(error),
|
|
127
|
+
extra={
|
|
128
|
+
"user_id": userId,
|
|
129
|
+
"agent_id": agentId,
|
|
130
|
+
"tool_name": tool_name,
|
|
131
|
+
"session_id": session_id,
|
|
132
|
+
"duration_ms": duration_ms,
|
|
133
|
+
},
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
79
137
|
class EmbedResolvingMCPTool(_BaseMcpToolClass):
|
|
80
138
|
"""
|
|
81
139
|
Custom MCPTool that resolves embeds in parameters before calling the actual MCP tool.
|
|
@@ -112,7 +170,7 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
|
|
|
112
170
|
original_mcp_tool._mcp_tool, "auth_credential", None
|
|
113
171
|
),
|
|
114
172
|
)
|
|
115
|
-
self._original_mcp_tool = original_mcp_tool
|
|
173
|
+
self._original_mcp_tool: MCPTool = original_mcp_tool
|
|
116
174
|
self._tool_config = tool_config or {}
|
|
117
175
|
|
|
118
176
|
async def _resolve_embeds_recursively(
|
|
@@ -275,6 +333,38 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
|
|
|
275
333
|
)
|
|
276
334
|
return data
|
|
277
335
|
|
|
336
|
+
|
|
337
|
+
async def _execute_tool_with_audit_logs(self, tool_call, tool_context):
|
|
338
|
+
_log_mcp_tool_call(
|
|
339
|
+
tool_context.session.user_id,
|
|
340
|
+
tool_context.agent_name,
|
|
341
|
+
self.name,
|
|
342
|
+
tool_context.session.id,
|
|
343
|
+
)
|
|
344
|
+
start_time = time.perf_counter()
|
|
345
|
+
try:
|
|
346
|
+
result = await tool_call()
|
|
347
|
+
duration_ms = (time.perf_counter() - start_time) * 1000
|
|
348
|
+
_log_mcp_tool_success(
|
|
349
|
+
tool_context.session.user_id,
|
|
350
|
+
tool_context.agent_name,
|
|
351
|
+
self.name,
|
|
352
|
+
tool_context.session.id,
|
|
353
|
+
duration_ms,
|
|
354
|
+
)
|
|
355
|
+
return result
|
|
356
|
+
except Exception as e:
|
|
357
|
+
duration_ms = (time.perf_counter() - start_time) * 1000
|
|
358
|
+
_log_mcp_tool_failure(
|
|
359
|
+
tool_context.session.user_id,
|
|
360
|
+
tool_context.agent_name,
|
|
361
|
+
self.name,
|
|
362
|
+
tool_context.session.id,
|
|
363
|
+
duration_ms,
|
|
364
|
+
e,
|
|
365
|
+
)
|
|
366
|
+
raise
|
|
367
|
+
|
|
278
368
|
async def _run_async_impl(
|
|
279
369
|
self, *, args, tool_context: ToolContext, credential
|
|
280
370
|
) -> Any:
|
|
@@ -285,7 +375,6 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
|
|
|
285
375
|
|
|
286
376
|
# Get context for embed resolution - pass the tool_context object directly
|
|
287
377
|
context_for_embeds = tool_context
|
|
288
|
-
|
|
289
378
|
if context_for_embeds:
|
|
290
379
|
log.debug(
|
|
291
380
|
"%s Starting recursive embed resolution for all parameters. Context type: %s",
|
|
@@ -321,13 +410,14 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
|
|
|
321
410
|
log_identifier,
|
|
322
411
|
)
|
|
323
412
|
resolved_args = args
|
|
324
|
-
|
|
325
413
|
# Call the original MCP tool with resolved parameters
|
|
326
|
-
return await self.
|
|
327
|
-
|
|
414
|
+
return await self._execute_tool_with_audit_logs(
|
|
415
|
+
lambda: self._original_mcp_tool._run_async_impl(
|
|
416
|
+
args=resolved_args, tool_context=tool_context, credential=credential
|
|
417
|
+
),
|
|
418
|
+
tool_context,
|
|
328
419
|
)
|
|
329
420
|
|
|
330
|
-
|
|
331
421
|
# Get the base toolset class to use for inheritance
|
|
332
422
|
_BaseMcpToolsetClass, _base_toolset_supports_tool_config = _get_base_mcp_toolset_class()
|
|
333
423
|
|
|
@@ -343,6 +433,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
343
433
|
self,
|
|
344
434
|
connection_params,
|
|
345
435
|
tool_filter=None,
|
|
436
|
+
tool_name_prefix=None,
|
|
346
437
|
auth_scheme=None,
|
|
347
438
|
auth_credential=None,
|
|
348
439
|
auth_discovery=None,
|
|
@@ -357,6 +448,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
357
448
|
super().__init__(
|
|
358
449
|
connection_params=connection_params,
|
|
359
450
|
tool_filter=tool_filter,
|
|
451
|
+
tool_name_prefix=tool_name_prefix,
|
|
360
452
|
auth_scheme=auth_scheme,
|
|
361
453
|
auth_credential=auth_credential,
|
|
362
454
|
auth_discovery=auth_discovery,
|
|
@@ -367,6 +459,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
367
459
|
super().__init__(
|
|
368
460
|
connection_params=connection_params,
|
|
369
461
|
tool_filter=tool_filter,
|
|
462
|
+
tool_name_prefix=tool_name_prefix,
|
|
370
463
|
auth_scheme=auth_scheme,
|
|
371
464
|
auth_credential=auth_credential,
|
|
372
465
|
)
|
|
@@ -403,4 +496,3 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
403
496
|
|
|
404
497
|
self._tool_cache = embed_resolving_tools
|
|
405
498
|
return embed_resolving_tools
|
|
406
|
-
|
|
@@ -19,6 +19,7 @@ from .mcp_content_processor import MCPContentProcessor, MCPContentProcessorConfi
|
|
|
19
19
|
from ...agent.utils.artifact_helpers import (
|
|
20
20
|
save_artifact_with_metadata,
|
|
21
21
|
DEFAULT_SCHEMA_MAX_KEYS,
|
|
22
|
+
DEFAULT_SCHEMA_INFERENCE_DEPTH,
|
|
22
23
|
)
|
|
23
24
|
from ...agent.utils.context_helpers import get_original_session_id
|
|
24
25
|
|
|
@@ -28,6 +29,41 @@ if TYPE_CHECKING:
|
|
|
28
29
|
from ...agent.sac.component import SamAgentComponent
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
def _get_schema_config_from_tool_or_agent(
|
|
33
|
+
tool: BaseTool,
|
|
34
|
+
host_component: "SamAgentComponent",
|
|
35
|
+
config_key: str,
|
|
36
|
+
default_value: Any,
|
|
37
|
+
) -> Any:
|
|
38
|
+
"""
|
|
39
|
+
Get schema configuration from tool_config if available, otherwise fall back to agent config.
|
|
40
|
+
|
|
41
|
+
This allows per-tool override of schema settings like schema_inference_depth.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
tool: The MCP tool instance (may have _tool_config attribute)
|
|
45
|
+
host_component: The agent component for fallback config
|
|
46
|
+
config_key: The configuration key to look up
|
|
47
|
+
default_value: Default value if not found in either location
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
The configuration value from tool config, agent config, or default
|
|
51
|
+
"""
|
|
52
|
+
# Check if tool has tool_config with this setting
|
|
53
|
+
tool_config = getattr(tool, "_tool_config", None)
|
|
54
|
+
if tool_config and isinstance(tool_config, dict):
|
|
55
|
+
if config_key in tool_config:
|
|
56
|
+
log.debug(
|
|
57
|
+
"Using per-tool config for %s: %s",
|
|
58
|
+
config_key,
|
|
59
|
+
tool_config[config_key],
|
|
60
|
+
)
|
|
61
|
+
return tool_config[config_key]
|
|
62
|
+
|
|
63
|
+
# Fall back to agent-level config
|
|
64
|
+
return host_component.get_config(config_key, default_value)
|
|
65
|
+
|
|
66
|
+
|
|
31
67
|
class McpSaveStatus(str, Enum):
|
|
32
68
|
"""Enumeration for the status of an MCP save operation."""
|
|
33
69
|
|
|
@@ -164,7 +200,7 @@ async def save_mcp_response_as_artifact_intelligent(
|
|
|
164
200
|
if hasattr(item, "uri"):
|
|
165
201
|
item.uri = str(item.uri)
|
|
166
202
|
result_dict = await _save_content_item_as_artifact(
|
|
167
|
-
item, tool_context, host_component
|
|
203
|
+
item, tool, tool_context, host_component
|
|
168
204
|
)
|
|
169
205
|
if result_dict.get("status") in ["success", "partial_success"]:
|
|
170
206
|
saved_artifacts.append(SavedArtifactInfo(**result_dict))
|
|
@@ -279,6 +315,7 @@ async def save_mcp_response_as_artifact_intelligent(
|
|
|
279
315
|
|
|
280
316
|
async def _save_content_item_as_artifact(
|
|
281
317
|
content_item,
|
|
318
|
+
tool: BaseTool,
|
|
282
319
|
tool_context: ToolContext,
|
|
283
320
|
host_component: "SamAgentComponent",
|
|
284
321
|
) -> Dict[str, Any]:
|
|
@@ -294,8 +331,12 @@ async def _save_content_item_as_artifact(
|
|
|
294
331
|
app_name = host_component.agent_name
|
|
295
332
|
user_id = tool_context._invocation_context.user_id
|
|
296
333
|
session_id = get_original_session_id(tool_context._invocation_context)
|
|
297
|
-
|
|
298
|
-
|
|
334
|
+
# Get schema config from tool_config (per-tool) or agent config (fallback)
|
|
335
|
+
schema_max_keys = _get_schema_config_from_tool_or_agent(
|
|
336
|
+
tool, host_component, "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
|
|
337
|
+
)
|
|
338
|
+
schema_inference_depth = _get_schema_config_from_tool_or_agent(
|
|
339
|
+
tool, host_component, "schema_inference_depth", DEFAULT_SCHEMA_INFERENCE_DEPTH
|
|
299
340
|
)
|
|
300
341
|
artifact_timestamp = datetime.now(timezone.utc)
|
|
301
342
|
|
|
@@ -318,6 +359,7 @@ async def _save_content_item_as_artifact(
|
|
|
318
359
|
metadata_dict=content_item.metadata,
|
|
319
360
|
timestamp=artifact_timestamp,
|
|
320
361
|
schema_max_keys=schema_max_keys,
|
|
362
|
+
schema_inference_depth=schema_inference_depth,
|
|
321
363
|
tool_context=tool_context,
|
|
322
364
|
)
|
|
323
365
|
|
|
@@ -376,8 +418,12 @@ async def _save_raw_mcp_response_fallback(
|
|
|
376
418
|
app_name = host_component.agent_name
|
|
377
419
|
user_id = tool_context._invocation_context.user_id
|
|
378
420
|
session_id = get_original_session_id(tool_context._invocation_context)
|
|
379
|
-
|
|
380
|
-
|
|
421
|
+
# Get schema config from tool_config (per-tool) or agent config (fallback)
|
|
422
|
+
schema_max_keys = _get_schema_config_from_tool_or_agent(
|
|
423
|
+
tool, host_component, "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
|
|
424
|
+
)
|
|
425
|
+
schema_inference_depth = _get_schema_config_from_tool_or_agent(
|
|
426
|
+
tool, host_component, "schema_inference_depth", DEFAULT_SCHEMA_INFERENCE_DEPTH
|
|
381
427
|
)
|
|
382
428
|
|
|
383
429
|
save_result = await save_artifact_with_metadata(
|
|
@@ -391,6 +437,7 @@ async def _save_raw_mcp_response_fallback(
|
|
|
391
437
|
metadata_dict=metadata_for_saving,
|
|
392
438
|
timestamp=artifact_timestamp,
|
|
393
439
|
schema_max_keys=schema_max_keys,
|
|
440
|
+
schema_inference_depth=schema_inference_depth,
|
|
394
441
|
tool_context=tool_context,
|
|
395
442
|
)
|
|
396
443
|
|
|
@@ -540,7 +540,7 @@ class MCPContentProcessor:
|
|
|
540
540
|
|
|
541
541
|
format_mapping = {
|
|
542
542
|
TextFormat.JSON: ("application/json", ".json"),
|
|
543
|
-
TextFormat.YAML: ("application/
|
|
543
|
+
TextFormat.YAML: ("application/yaml", ".yaml"),
|
|
544
544
|
TextFormat.CSV: ("text/csv", ".csv"),
|
|
545
545
|
TextFormat.MARKDOWN: ("text/markdown", ".md"),
|
|
546
546
|
TextFormat.PLAIN: ("text/plain", ".txt"),
|
|
@@ -328,26 +328,41 @@ def _schema_to_dict(schema: types.Schema) -> dict:
|
|
|
328
328
|
"""
|
|
329
329
|
|
|
330
330
|
schema_dict = schema.model_dump(exclude_none=True)
|
|
331
|
+
|
|
332
|
+
# Convert top-level type from enum to lowercase string
|
|
331
333
|
if "type" in schema_dict:
|
|
332
|
-
schema_dict["type"]
|
|
334
|
+
if isinstance(schema_dict["type"], types.Type):
|
|
335
|
+
schema_dict["type"] = schema_dict["type"].value.lower()
|
|
336
|
+
else:
|
|
337
|
+
schema_dict["type"] = str(schema_dict["type"]).lower()
|
|
338
|
+
|
|
339
|
+
# Recursively handle items (for array types)
|
|
333
340
|
if "items" in schema_dict:
|
|
334
|
-
if
|
|
341
|
+
# Check if we have the original Schema object for items
|
|
342
|
+
if isinstance(schema.items, types.Schema):
|
|
343
|
+
# Recursively convert the Schema object - this ensures nested Type enums are converted
|
|
344
|
+
schema_dict["items"] = _schema_to_dict(schema.items)
|
|
345
|
+
elif isinstance(schema_dict["items"], dict):
|
|
346
|
+
# If items is already a dict, validate and recurse
|
|
335
347
|
schema_dict["items"] = _schema_to_dict(
|
|
336
348
|
types.Schema.model_validate(schema_dict["items"])
|
|
337
349
|
)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
schema_dict["items"]["type"].value
|
|
341
|
-
]
|
|
350
|
+
|
|
351
|
+
# Recursively handle properties (for object types)
|
|
342
352
|
if "properties" in schema_dict:
|
|
343
353
|
properties = {}
|
|
344
354
|
for key, value in schema_dict["properties"].items():
|
|
345
355
|
if isinstance(value, types.Schema):
|
|
356
|
+
# If it's a Schema object, recursively convert it
|
|
346
357
|
properties[key] = _schema_to_dict(value)
|
|
358
|
+
elif isinstance(value, dict):
|
|
359
|
+
# If it's already a dict, validate and recurse to handle nested Type enums
|
|
360
|
+
properties[key] = _schema_to_dict(
|
|
361
|
+
types.Schema.model_validate(value)
|
|
362
|
+
)
|
|
347
363
|
else:
|
|
364
|
+
# For other types, just copy as-is
|
|
348
365
|
properties[key] = value
|
|
349
|
-
if "type" in properties[key]:
|
|
350
|
-
properties[key]["type"] = properties[key]["type"].lower()
|
|
351
366
|
schema_dict["properties"] = properties
|
|
352
367
|
return schema_dict
|
|
353
368
|
|
|
@@ -366,20 +381,23 @@ def _function_declaration_to_tool_param(
|
|
|
366
381
|
|
|
367
382
|
assert function_declaration.name
|
|
368
383
|
|
|
369
|
-
properties
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
384
|
+
# Convert the entire parameters schema to ensure all fields (type, properties, required, etc.)
|
|
385
|
+
# are properly converted, including nested Type enums
|
|
386
|
+
# If no parameters provided, default to empty object schema (required by OpenAI)
|
|
387
|
+
if function_declaration.parameters:
|
|
388
|
+
parameters = _schema_to_dict(function_declaration.parameters)
|
|
389
|
+
else:
|
|
390
|
+
parameters = {
|
|
391
|
+
"type": "object",
|
|
392
|
+
"properties": {},
|
|
393
|
+
}
|
|
373
394
|
|
|
374
395
|
return {
|
|
375
396
|
"type": "function",
|
|
376
397
|
"function": {
|
|
377
398
|
"name": function_declaration.name,
|
|
378
399
|
"description": function_declaration.description or "",
|
|
379
|
-
"parameters":
|
|
380
|
-
"type": "object",
|
|
381
|
-
"properties": properties,
|
|
382
|
-
},
|
|
400
|
+
"parameters": parameters,
|
|
383
401
|
},
|
|
384
402
|
}
|
|
385
403
|
|
|
@@ -6,12 +6,9 @@ It handles token acquisition, caching, and automatic refresh with proper error h
|
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
8
8
|
import logging
|
|
9
|
-
import
|
|
10
|
-
import time
|
|
11
|
-
from typing import Any, Dict, Optional
|
|
12
|
-
|
|
13
|
-
import httpx
|
|
9
|
+
from typing import Optional
|
|
14
10
|
|
|
11
|
+
from solace_agent_mesh.common.oauth import OAuth2RetryClient, is_token_expired
|
|
15
12
|
from solace_agent_mesh.common.utils.in_memory_cache import InMemoryCache
|
|
16
13
|
|
|
17
14
|
logger = logging.getLogger(__name__)
|
|
@@ -72,17 +69,19 @@ class OAuth2ClientCredentialsTokenManager:
|
|
|
72
69
|
self.scope = scope
|
|
73
70
|
self.ca_cert_path = ca_cert_path
|
|
74
71
|
self.refresh_buffer_seconds = refresh_buffer_seconds
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
|
|
77
73
|
# Thread-safe token access
|
|
78
74
|
self._lock = asyncio.Lock()
|
|
79
|
-
|
|
75
|
+
|
|
80
76
|
# Token cache using existing InMemoryCache singleton
|
|
81
77
|
self._cache = InMemoryCache()
|
|
82
|
-
|
|
78
|
+
|
|
83
79
|
# Cache key for this token manager instance
|
|
84
80
|
self._cache_key = f"oauth_token_{hash((token_url, client_id))}"
|
|
85
|
-
|
|
81
|
+
|
|
82
|
+
# OAuth client with retry logic
|
|
83
|
+
self._oauth_client = OAuth2RetryClient(max_retries=max_retries)
|
|
84
|
+
|
|
86
85
|
logger.info(
|
|
87
86
|
"OAuth2ClientCredentialsTokenManager initialized for endpoint: %s",
|
|
88
87
|
token_url
|
|
@@ -104,14 +103,24 @@ class OAuth2ClientCredentialsTokenManager:
|
|
|
104
103
|
async with self._lock:
|
|
105
104
|
# Check if we have a cached token
|
|
106
105
|
cached_token_data = self._cache.get(self._cache_key)
|
|
107
|
-
|
|
108
|
-
if cached_token_data and not
|
|
106
|
+
|
|
107
|
+
if cached_token_data and not is_token_expired(
|
|
108
|
+
cached_token_data["expires_at"], buffer_seconds=self.refresh_buffer_seconds
|
|
109
|
+
):
|
|
109
110
|
logger.debug("Using cached OAuth token")
|
|
110
111
|
return cached_token_data["access_token"]
|
|
111
|
-
|
|
112
|
-
# Fetch new token
|
|
112
|
+
|
|
113
|
+
# Fetch new token using common OAuth client
|
|
113
114
|
logger.info("Fetching new OAuth token from %s", self.token_url)
|
|
114
|
-
|
|
115
|
+
verify = self.ca_cert_path if self.ca_cert_path else True
|
|
116
|
+
token_data = await self._oauth_client.fetch_client_credentials_token(
|
|
117
|
+
token_url=self.token_url,
|
|
118
|
+
client_id=self.client_id,
|
|
119
|
+
client_secret=self.client_secret,
|
|
120
|
+
scope=self.scope,
|
|
121
|
+
verify=verify,
|
|
122
|
+
timeout=30.0,
|
|
123
|
+
)
|
|
115
124
|
|
|
116
125
|
# Cache the token with TTL
|
|
117
126
|
expires_in = token_data.get("expires_in", 3600) # Default 1 hour
|
|
@@ -121,125 +130,3 @@ class OAuth2ClientCredentialsTokenManager:
|
|
|
121
130
|
|
|
122
131
|
logger.info("OAuth token cached with TTL: %d seconds", cache_ttl)
|
|
123
132
|
return token_data["access_token"]
|
|
124
|
-
|
|
125
|
-
def _is_token_expired(self, token_data: Dict[str, Any]) -> bool:
|
|
126
|
-
"""Check if a token is expired or near expiry.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
token_data: Token data dictionary with 'expires_at' timestamp
|
|
130
|
-
|
|
131
|
-
Returns:
|
|
132
|
-
True if token is expired or near expiry, False otherwise
|
|
133
|
-
"""
|
|
134
|
-
if "expires_at" not in token_data:
|
|
135
|
-
return True
|
|
136
|
-
|
|
137
|
-
current_time = time.time()
|
|
138
|
-
expires_at = token_data["expires_at"]
|
|
139
|
-
|
|
140
|
-
# Consider token expired if it expires within the buffer time
|
|
141
|
-
return current_time >= (expires_at - self.refresh_buffer_seconds)
|
|
142
|
-
|
|
143
|
-
async def _fetch_token(self) -> Dict[str, Any]:
|
|
144
|
-
"""Fetch a new OAuth 2.0 access token from the token endpoint.
|
|
145
|
-
|
|
146
|
-
Implements retry logic with exponential backoff for transient failures.
|
|
147
|
-
|
|
148
|
-
Returns:
|
|
149
|
-
Token data dictionary containing access_token, expires_in, etc.
|
|
150
|
-
|
|
151
|
-
Raises:
|
|
152
|
-
httpx.HTTPError: If HTTP request fails after all retries
|
|
153
|
-
ValueError: If response is invalid or missing required fields
|
|
154
|
-
"""
|
|
155
|
-
# Prepare request payload
|
|
156
|
-
payload = {
|
|
157
|
-
"grant_type": "client_credentials",
|
|
158
|
-
"client_id": self.client_id,
|
|
159
|
-
"client_secret": self.client_secret,
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if self.scope:
|
|
163
|
-
payload["scope"] = self.scope
|
|
164
|
-
|
|
165
|
-
# Configure HTTP client with SSL settings
|
|
166
|
-
verify = True
|
|
167
|
-
if self.ca_cert_path:
|
|
168
|
-
verify = self.ca_cert_path
|
|
169
|
-
|
|
170
|
-
headers = {
|
|
171
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
172
|
-
"Accept": "application/json",
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
last_exception = None
|
|
176
|
-
|
|
177
|
-
for attempt in range(self.max_retries + 1):
|
|
178
|
-
try:
|
|
179
|
-
async with httpx.AsyncClient(verify=verify) as client:
|
|
180
|
-
response = await client.post(
|
|
181
|
-
self.token_url,
|
|
182
|
-
data=payload,
|
|
183
|
-
headers=headers,
|
|
184
|
-
timeout=30.0,
|
|
185
|
-
)
|
|
186
|
-
response.raise_for_status()
|
|
187
|
-
|
|
188
|
-
token_data = response.json()
|
|
189
|
-
|
|
190
|
-
# Validate response
|
|
191
|
-
if "access_token" not in token_data:
|
|
192
|
-
raise ValueError("Token response missing 'access_token' field")
|
|
193
|
-
|
|
194
|
-
# Add expiration timestamp for cache management
|
|
195
|
-
expires_in = token_data.get("expires_in", 3600)
|
|
196
|
-
token_data["expires_at"] = time.time() + expires_in
|
|
197
|
-
|
|
198
|
-
logger.info("Successfully fetched OAuth token, expires in %d seconds", expires_in)
|
|
199
|
-
return token_data
|
|
200
|
-
|
|
201
|
-
except httpx.HTTPStatusError as e:
|
|
202
|
-
last_exception = e
|
|
203
|
-
# Don't retry on 4xx errors (client errors)
|
|
204
|
-
if 400 <= e.response.status_code < 500:
|
|
205
|
-
logger.error(
|
|
206
|
-
"OAuth token request failed with client error %d: %s",
|
|
207
|
-
e.response.status_code,
|
|
208
|
-
e.response.text
|
|
209
|
-
)
|
|
210
|
-
raise
|
|
211
|
-
|
|
212
|
-
logger.warning(
|
|
213
|
-
"OAuth token request failed with status %d (attempt %d/%d): %s",
|
|
214
|
-
e.response.status_code,
|
|
215
|
-
attempt + 1,
|
|
216
|
-
self.max_retries + 1,
|
|
217
|
-
e.response.text
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
except httpx.RequestError as e:
|
|
221
|
-
last_exception = e
|
|
222
|
-
logger.warning(
|
|
223
|
-
"OAuth token request failed (attempt %d/%d): %s",
|
|
224
|
-
attempt + 1,
|
|
225
|
-
self.max_retries + 1,
|
|
226
|
-
str(e)
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
except Exception as e:
|
|
230
|
-
last_exception = e
|
|
231
|
-
logger.error("Unexpected error during OAuth token fetch: %s", str(e))
|
|
232
|
-
raise
|
|
233
|
-
|
|
234
|
-
# Exponential backoff with jitter for retries
|
|
235
|
-
if attempt < self.max_retries:
|
|
236
|
-
delay = (2 ** attempt) + random.uniform(0, 1)
|
|
237
|
-
logger.info("Retrying OAuth token request in %.2f seconds", delay)
|
|
238
|
-
await asyncio.sleep(delay)
|
|
239
|
-
|
|
240
|
-
# All retries exhausted
|
|
241
|
-
logger.error("OAuth token request failed after %d attempts", self.max_retries + 1)
|
|
242
|
-
if last_exception:
|
|
243
|
-
raise last_exception
|
|
244
|
-
else:
|
|
245
|
-
raise RuntimeError("OAuth token request failed after all retries")
|