solace-agent-mesh 1.6.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/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +852 -109
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
- 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 +77 -21
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +85 -20
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +94 -18
- solace_agent_mesh/agent/adk/setup.py +281 -65
- solace_agent_mesh/agent/adk/stream_parser.py +231 -37
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
- solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
- 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/app.py +3 -2
- 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 +91 -3
- solace_agent_mesh/agent/sac/component.py +591 -157
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
- 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 +710 -171
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -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 +57 -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 +248 -6
- 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/2987107d.a80604f9.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/631738c7.fa471607.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/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.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/8b032486.91a91afc.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/ad87452a.9d73dad6.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/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.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/ff4d71f2.74710fc1.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 +82 -68
- 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 +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +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 -49
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
- 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 +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
- 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 +162 -171
- 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 +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
- 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 +112 -87
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
- 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 +311 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
- 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 +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +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/docs_cmd.py +4 -1
- 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-BTf6dqwp.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-CGk8Suyh.js +565 -0
- 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/events.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +2 -1
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +144 -4
- 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 +97 -19
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
- solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
- solace_agent_mesh/common/utils/embeds/types.py +9 -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/pydantic_utils.py +90 -3
- 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/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +170 -0
- solace_agent_mesh/gateway/adapter/types.py +230 -0
- solace_agent_mesh/gateway/base/app.py +39 -2
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +1027 -151
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +894 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +40 -11
- solace_agent_mesh/gateway/http_sse/component.py +285 -160
- solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
- solace_agent_mesh/gateway/http_sse/main.py +68 -450
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
- 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 +256 -58
- solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
- solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
- 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/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -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 +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
- 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 +92 -9
- 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 +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
- solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
- 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 +19 -5
- 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.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
- solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
- 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 -142
- solace_agent_mesh/agent/agent_llm.txt +0 -378
- 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/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 -57
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.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.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.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.b5ddb7a1.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.3e6dd091.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.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-CaY59VuC.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
- solace_agent_mesh/common/common_llm.txt +0 -251
- 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 -80
- solace_agent_mesh/common/services/services_llm.txt +0 -363
- 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 -336
- 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 -224
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -373
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
- 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 -263
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
- 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-1.6.1.dist-info/RECORD +0 -525
- /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.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.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,45 +1,176 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Custom MCPToolset that resolves embeds in tool parameters before calling MCP tools.
|
|
3
|
+
|
|
4
|
+
This module uses dynamic inheritance to support both standard and enterprise MCP tools:
|
|
5
|
+
- Standard mode: Inherits from MCPTool and MCPToolset (Google ADK)
|
|
6
|
+
- Enterprise mode: Inherits from McpToolWithManifest and McpToolsetWithManifest
|
|
7
|
+
(adds manifest support and tool_config parameter)
|
|
8
|
+
|
|
9
|
+
The base class is determined at import time based on enterprise package availability.
|
|
3
10
|
"""
|
|
4
11
|
|
|
5
12
|
import logging
|
|
6
|
-
import
|
|
7
|
-
from typing import
|
|
8
|
-
|
|
9
|
-
from google.adk.tools.mcp_tool import MCPToolset, MCPTool
|
|
10
|
-
from google.adk.tools.mcp_tool.mcp_session_manager import (
|
|
11
|
-
SseConnectionParams,
|
|
12
|
-
StdioConnectionParams,
|
|
13
|
-
StreamableHTTPConnectionParams,
|
|
14
|
-
)
|
|
15
|
-
from google.adk.tools.tool_context import ToolContext
|
|
13
|
+
import time
|
|
14
|
+
from typing import Any
|
|
16
15
|
|
|
16
|
+
from google.adk.auth.credential_manager import CredentialManager
|
|
17
|
+
from google.adk.tools.mcp_tool import MCPTool, MCPToolset
|
|
18
|
+
from google.adk.tools.tool_context import ToolContext
|
|
17
19
|
|
|
18
|
-
from ..utils.context_helpers import get_original_session_id
|
|
19
20
|
from ...common.utils.embeds import (
|
|
20
|
-
resolve_embeds_in_string,
|
|
21
|
-
evaluate_embed,
|
|
22
21
|
EARLY_EMBED_TYPES,
|
|
23
|
-
LATE_EMBED_TYPES,
|
|
24
22
|
EMBED_DELIMITER_OPEN,
|
|
23
|
+
LATE_EMBED_TYPES,
|
|
24
|
+
evaluate_embed,
|
|
25
|
+
resolve_embeds_in_string,
|
|
25
26
|
)
|
|
27
|
+
from ...common.utils.embeds.types import ResolutionMode
|
|
28
|
+
from ..utils.context_helpers import get_original_session_id
|
|
26
29
|
|
|
27
30
|
log = logging.getLogger(__name__)
|
|
28
31
|
|
|
29
|
-
|
|
32
|
+
|
|
33
|
+
def _get_base_mcp_toolset_class() -> tuple[type[MCPToolset], bool]:
|
|
34
|
+
"""
|
|
35
|
+
Factory function to determine which base MCP toolset class to use for inheritance.
|
|
36
|
+
|
|
37
|
+
Tries to import McpToolsetWithManifest from solace_agent_mesh_enterprise.common
|
|
38
|
+
and returns it if available. Falls back to base MCPToolset if not available.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
Tuple of (class, supports_tool_config_flag) where:
|
|
42
|
+
- class: The base MCPToolset class to inherit from
|
|
43
|
+
- supports_tool_config_flag: Whether the class supports tool_config parameter
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
from solace_agent_mesh_enterprise.auth.mcp_toolset_with_manifest import (
|
|
47
|
+
McpToolsetWithManifest,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
return (McpToolsetWithManifest, True)
|
|
51
|
+
except ImportError:
|
|
52
|
+
return (MCPToolset, False)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _get_base_mcp_tool_class() -> tuple[type[MCPTool], bool]:
|
|
56
|
+
"""
|
|
57
|
+
Factory function to determine which base MCP tool class to use for inheritance.
|
|
58
|
+
|
|
59
|
+
Tries to import McpToolWithManifest from solace_agent_mesh_enterprise.common
|
|
60
|
+
and returns it if available. Falls back to base MCPTool if not available.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Tuple of (class, supports_tool_config_flag) where:
|
|
64
|
+
- class: The base MCPTool class to inherit from
|
|
65
|
+
- supports_tool_config_flag: Whether the class supports tool_config parameter
|
|
66
|
+
"""
|
|
67
|
+
try:
|
|
68
|
+
from solace_agent_mesh_enterprise.auth.mcp_toolset_with_manifest import (
|
|
69
|
+
McpToolWithManifest,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
return (McpToolWithManifest, True)
|
|
73
|
+
except ImportError:
|
|
74
|
+
return (MCPTool, False)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# Get the base tool class to use for inheritance
|
|
78
|
+
_BaseMcpToolClass, _base_supports_tool_config = _get_base_mcp_tool_class()
|
|
79
|
+
|
|
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
|
+
|
|
137
|
+
class EmbedResolvingMCPTool(_BaseMcpToolClass):
|
|
30
138
|
"""
|
|
31
139
|
Custom MCPTool that resolves embeds in parameters before calling the actual MCP tool.
|
|
140
|
+
Uses dynamic inheritance to conditionally inherit from McpToolWithManifest when available,
|
|
141
|
+
falling back to the standard MCPTool base class.
|
|
32
142
|
"""
|
|
33
143
|
|
|
34
|
-
def __init__(
|
|
144
|
+
def __init__(
|
|
145
|
+
self,
|
|
146
|
+
original_mcp_tool: MCPTool,
|
|
147
|
+
tool_config: dict | None = None,
|
|
148
|
+
credential_manager: CredentialManager | None = None,
|
|
149
|
+
):
|
|
35
150
|
# Copy all attributes from the original tool
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
151
|
+
if _base_supports_tool_config:
|
|
152
|
+
super().__init__(
|
|
153
|
+
mcp_tool=original_mcp_tool._mcp_tool,
|
|
154
|
+
mcp_session_manager=original_mcp_tool._mcp_session_manager,
|
|
155
|
+
auth_scheme=getattr(original_mcp_tool._mcp_tool, "auth_scheme", None),
|
|
156
|
+
auth_credential=getattr(
|
|
157
|
+
original_mcp_tool._mcp_tool, "auth_credential", None
|
|
158
|
+
),
|
|
159
|
+
auth_discovery=getattr(
|
|
160
|
+
original_mcp_tool._mcp_tool, "auth_discovery", None
|
|
161
|
+
),
|
|
162
|
+
credential_manager=credential_manager,
|
|
163
|
+
)
|
|
164
|
+
else:
|
|
165
|
+
super().__init__(
|
|
166
|
+
mcp_tool=original_mcp_tool._mcp_tool,
|
|
167
|
+
mcp_session_manager=original_mcp_tool._mcp_session_manager,
|
|
168
|
+
auth_scheme=getattr(original_mcp_tool._mcp_tool, "auth_scheme", None),
|
|
169
|
+
auth_credential=getattr(
|
|
170
|
+
original_mcp_tool._mcp_tool, "auth_credential", None
|
|
171
|
+
),
|
|
172
|
+
)
|
|
173
|
+
self._original_mcp_tool: MCPTool = original_mcp_tool
|
|
43
174
|
self._tool_config = tool_config or {}
|
|
44
175
|
|
|
45
176
|
async def _resolve_embeds_recursively(
|
|
@@ -112,6 +243,7 @@ class EmbedResolvingMCPTool(MCPTool):
|
|
|
112
243
|
context=resolution_context,
|
|
113
244
|
resolver_func=evaluate_embed,
|
|
114
245
|
types_to_resolve=EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES),
|
|
246
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
115
247
|
log_identifier=log_identifier,
|
|
116
248
|
config=self._tool_config,
|
|
117
249
|
)
|
|
@@ -201,6 +333,38 @@ class EmbedResolvingMCPTool(MCPTool):
|
|
|
201
333
|
)
|
|
202
334
|
return data
|
|
203
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
|
+
|
|
204
368
|
async def _run_async_impl(
|
|
205
369
|
self, *, args, tool_context: ToolContext, credential
|
|
206
370
|
) -> Any:
|
|
@@ -211,7 +375,6 @@ class EmbedResolvingMCPTool(MCPTool):
|
|
|
211
375
|
|
|
212
376
|
# Get context for embed resolution - pass the tool_context object directly
|
|
213
377
|
context_for_embeds = tool_context
|
|
214
|
-
|
|
215
378
|
if context_for_embeds:
|
|
216
379
|
log.debug(
|
|
217
380
|
"%s Starting recursive embed resolution for all parameters. Context type: %s",
|
|
@@ -247,38 +410,71 @@ class EmbedResolvingMCPTool(MCPTool):
|
|
|
247
410
|
log_identifier,
|
|
248
411
|
)
|
|
249
412
|
resolved_args = args
|
|
250
|
-
|
|
251
413
|
# Call the original MCP tool with resolved parameters
|
|
252
|
-
return await self.
|
|
253
|
-
|
|
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,
|
|
254
419
|
)
|
|
255
420
|
|
|
421
|
+
# Get the base toolset class to use for inheritance
|
|
422
|
+
_BaseMcpToolsetClass, _base_toolset_supports_tool_config = _get_base_mcp_toolset_class()
|
|
256
423
|
|
|
257
|
-
|
|
424
|
+
|
|
425
|
+
class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
258
426
|
"""
|
|
259
427
|
Custom MCPToolset that creates EmbedResolvingMCPTool instances for embed resolution.
|
|
428
|
+
Uses dynamic inheritance to conditionally inherit from McpToolsetWithManifest when available,
|
|
429
|
+
falling back to the standard MCPToolset base class.
|
|
260
430
|
"""
|
|
261
431
|
|
|
262
432
|
def __init__(
|
|
263
433
|
self,
|
|
264
434
|
connection_params,
|
|
265
435
|
tool_filter=None,
|
|
436
|
+
tool_name_prefix=None,
|
|
266
437
|
auth_scheme=None,
|
|
267
438
|
auth_credential=None,
|
|
268
|
-
|
|
439
|
+
auth_discovery=None,
|
|
440
|
+
tool_config: dict | None = None,
|
|
441
|
+
credential_manager: CredentialManager | None = None,
|
|
269
442
|
):
|
|
270
|
-
|
|
271
|
-
connection_params=connection_params,
|
|
272
|
-
tool_filter=tool_filter,
|
|
273
|
-
auth_scheme=auth_scheme,
|
|
274
|
-
auth_credential=auth_credential,
|
|
275
|
-
)
|
|
443
|
+
# Store tool_config for later use
|
|
276
444
|
self._tool_config = tool_config or {}
|
|
277
445
|
|
|
278
|
-
|
|
446
|
+
# Initialize base class with appropriate parameters
|
|
447
|
+
if _base_toolset_supports_tool_config:
|
|
448
|
+
super().__init__(
|
|
449
|
+
connection_params=connection_params,
|
|
450
|
+
tool_filter=tool_filter,
|
|
451
|
+
tool_name_prefix=tool_name_prefix,
|
|
452
|
+
auth_scheme=auth_scheme,
|
|
453
|
+
auth_credential=auth_credential,
|
|
454
|
+
auth_discovery=auth_discovery,
|
|
455
|
+
tool_config=tool_config,
|
|
456
|
+
)
|
|
457
|
+
else:
|
|
458
|
+
# Base MCPToolset doesn't support tool_config parameter
|
|
459
|
+
super().__init__(
|
|
460
|
+
connection_params=connection_params,
|
|
461
|
+
tool_filter=tool_filter,
|
|
462
|
+
tool_name_prefix=tool_name_prefix,
|
|
463
|
+
auth_scheme=auth_scheme,
|
|
464
|
+
auth_credential=auth_credential,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
self._tool_cache = []
|
|
468
|
+
self._credential_manager = credential_manager
|
|
469
|
+
|
|
470
|
+
async def get_tools(self, readonly_context=None) -> list[MCPTool]:
|
|
279
471
|
"""
|
|
280
472
|
Override get_tools to return EmbedResolvingMCPTool instances.
|
|
281
473
|
"""
|
|
474
|
+
|
|
475
|
+
if self._tool_cache:
|
|
476
|
+
return self._tool_cache
|
|
477
|
+
|
|
282
478
|
# Get the original tools from the parent class
|
|
283
479
|
original_tools = await super().get_tools(readonly_context)
|
|
284
480
|
|
|
@@ -294,7 +490,9 @@ class EmbedResolvingMCPToolset(MCPToolset):
|
|
|
294
490
|
embed_resolving_tool = EmbedResolvingMCPTool(
|
|
295
491
|
original_mcp_tool=tool,
|
|
296
492
|
tool_config=tool_specific_config,
|
|
493
|
+
credential_manager=self._credential_manager,
|
|
297
494
|
)
|
|
298
495
|
embed_resolving_tools.append(embed_resolving_tool)
|
|
299
496
|
|
|
497
|
+
self._tool_cache = embed_resolving_tools
|
|
300
498
|
return embed_resolving_tools
|
|
@@ -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"),
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import base64
|
|
18
|
+
import hashlib
|
|
18
19
|
import json
|
|
19
20
|
import logging
|
|
20
21
|
from typing import Any
|
|
@@ -144,6 +145,38 @@ def _safe_json_serialize(obj) -> str:
|
|
|
144
145
|
return str(obj)
|
|
145
146
|
|
|
146
147
|
|
|
148
|
+
def _truncate_tool_call_id(tool_call_id: str, max_length: int = 40) -> str:
|
|
149
|
+
"""Truncates tool call ID to meet OpenAI's maximum length requirement.
|
|
150
|
+
|
|
151
|
+
OpenAI requires tool_call_id to be at most 40 characters. If the ID exceeds
|
|
152
|
+
this limit, we create a deterministic hash-based truncation to ensure:
|
|
153
|
+
1. The ID stays within the limit
|
|
154
|
+
2. The same input always produces the same output (deterministic)
|
|
155
|
+
3. Collisions are extremely unlikely
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
tool_call_id: The original tool call ID
|
|
159
|
+
max_length: Maximum allowed length (default: 40 for OpenAI)
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
Truncated tool call ID that meets the length requirement
|
|
163
|
+
"""
|
|
164
|
+
if len(tool_call_id) <= max_length:
|
|
165
|
+
return tool_call_id
|
|
166
|
+
|
|
167
|
+
# Use first part of ID + hash of full ID to maintain uniqueness
|
|
168
|
+
# Format: prefix_hash where prefix is from original and hash ensures uniqueness
|
|
169
|
+
prefix_length = max_length - 33 # Reserve 33 chars for hash (32) + underscore (1)
|
|
170
|
+
if prefix_length < 1:
|
|
171
|
+
prefix_length = 1
|
|
172
|
+
|
|
173
|
+
prefix = tool_call_id[:prefix_length]
|
|
174
|
+
# Use SHA256 and take first 32 hex characters for uniqueness
|
|
175
|
+
hash_suffix = hashlib.sha256(tool_call_id.encode()).hexdigest()[:32]
|
|
176
|
+
|
|
177
|
+
return f"{prefix}_{hash_suffix}"
|
|
178
|
+
|
|
179
|
+
|
|
147
180
|
def _content_to_message_param(
|
|
148
181
|
content: types.Content,
|
|
149
182
|
) -> Union[Message, list[Message]]:
|
|
@@ -165,7 +198,7 @@ def _content_to_message_param(
|
|
|
165
198
|
tool_messages.append(
|
|
166
199
|
ChatCompletionToolMessage(
|
|
167
200
|
role="tool",
|
|
168
|
-
tool_call_id=part.function_response.id,
|
|
201
|
+
tool_call_id=_truncate_tool_call_id(part.function_response.id),
|
|
169
202
|
content=_safe_json_serialize(part.function_response.response),
|
|
170
203
|
)
|
|
171
204
|
)
|
|
@@ -185,7 +218,7 @@ def _content_to_message_param(
|
|
|
185
218
|
tool_calls.append(
|
|
186
219
|
ChatCompletionAssistantToolCall(
|
|
187
220
|
type="function",
|
|
188
|
-
id=part.function_call.id,
|
|
221
|
+
id=_truncate_tool_call_id(part.function_call.id),
|
|
189
222
|
function=Function(
|
|
190
223
|
name=part.function_call.name,
|
|
191
224
|
arguments=_safe_json_serialize(part.function_call.args),
|
|
@@ -295,26 +328,41 @@ def _schema_to_dict(schema: types.Schema) -> dict:
|
|
|
295
328
|
"""
|
|
296
329
|
|
|
297
330
|
schema_dict = schema.model_dump(exclude_none=True)
|
|
331
|
+
|
|
332
|
+
# Convert top-level type from enum to lowercase string
|
|
298
333
|
if "type" in schema_dict:
|
|
299
|
-
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)
|
|
300
340
|
if "items" in schema_dict:
|
|
301
|
-
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
|
|
302
347
|
schema_dict["items"] = _schema_to_dict(
|
|
303
348
|
types.Schema.model_validate(schema_dict["items"])
|
|
304
349
|
)
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
schema_dict["items"]["type"].value
|
|
308
|
-
]
|
|
350
|
+
|
|
351
|
+
# Recursively handle properties (for object types)
|
|
309
352
|
if "properties" in schema_dict:
|
|
310
353
|
properties = {}
|
|
311
354
|
for key, value in schema_dict["properties"].items():
|
|
312
355
|
if isinstance(value, types.Schema):
|
|
356
|
+
# If it's a Schema object, recursively convert it
|
|
313
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
|
+
)
|
|
314
363
|
else:
|
|
364
|
+
# For other types, just copy as-is
|
|
315
365
|
properties[key] = value
|
|
316
|
-
if "type" in properties[key]:
|
|
317
|
-
properties[key]["type"] = properties[key]["type"].lower()
|
|
318
366
|
schema_dict["properties"] = properties
|
|
319
367
|
return schema_dict
|
|
320
368
|
|
|
@@ -333,20 +381,23 @@ def _function_declaration_to_tool_param(
|
|
|
333
381
|
|
|
334
382
|
assert function_declaration.name
|
|
335
383
|
|
|
336
|
-
properties
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
+
}
|
|
340
394
|
|
|
341
395
|
return {
|
|
342
396
|
"type": "function",
|
|
343
397
|
"function": {
|
|
344
398
|
"name": function_declaration.name,
|
|
345
399
|
"description": function_declaration.description or "",
|
|
346
|
-
"parameters":
|
|
347
|
-
"type": "object",
|
|
348
|
-
"properties": properties,
|
|
349
|
-
},
|
|
400
|
+
"parameters": parameters,
|
|
350
401
|
},
|
|
351
402
|
}
|
|
352
403
|
|
|
@@ -464,7 +515,7 @@ def _message_to_generate_content_response(
|
|
|
464
515
|
name=tool_call.function.name,
|
|
465
516
|
args=json.loads(tool_call.function.arguments or "{}"),
|
|
466
517
|
)
|
|
467
|
-
part.function_call.id = tool_call.id
|
|
518
|
+
part.function_call.id = _truncate_tool_call_id(tool_call.id)
|
|
468
519
|
parts.append(part)
|
|
469
520
|
except json.JSONDecodeError as e:
|
|
470
521
|
logger.error(
|
|
@@ -699,6 +750,11 @@ class LiteLlm(BaseLlm):
|
|
|
699
750
|
super().__init__(model=model, **kwargs)
|
|
700
751
|
self._additional_args = kwargs.copy()
|
|
701
752
|
|
|
753
|
+
# Remove handlers added by LiteLLM as they produce duplicate and misformatted logs.
|
|
754
|
+
# Logging is an application concern and libraries should not set handlers/formatters.
|
|
755
|
+
for logger_name in ["LiteLLM", "LiteLLM Proxy", "LiteLLM Router", "litellm"]:
|
|
756
|
+
logging.getLogger(logger_name).handlers.clear()
|
|
757
|
+
|
|
702
758
|
# Validate and store cache strategy
|
|
703
759
|
valid_strategies = ["none", "5m", "1h"]
|
|
704
760
|
if cache_strategy not in valid_strategies:
|
|
@@ -882,7 +938,7 @@ class LiteLlm(BaseLlm):
|
|
|
882
938
|
tool_calls.append(
|
|
883
939
|
ChatCompletionMessageToolCall(
|
|
884
940
|
type="function",
|
|
885
|
-
id=func_data["id"],
|
|
941
|
+
id=_truncate_tool_call_id(func_data["id"]),
|
|
886
942
|
function=Function(
|
|
887
943
|
name=func_data["name"],
|
|
888
944
|
arguments=func_data["args"],
|
|
@@ -911,7 +967,7 @@ class LiteLlm(BaseLlm):
|
|
|
911
967
|
tool_calls.append(
|
|
912
968
|
ChatCompletionMessageToolCall(
|
|
913
969
|
type="function",
|
|
914
|
-
id=func_data["id"],
|
|
970
|
+
id=_truncate_tool_call_id(func_data["id"]),
|
|
915
971
|
function=Function(
|
|
916
972
|
name=func_data["name"],
|
|
917
973
|
arguments=func_data["args"],
|