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.

Files changed (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {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 asyncio
7
- from typing import Dict, List, Optional, Any
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
- class EmbedResolvingMCPTool(MCPTool):
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__(self, original_mcp_tool: MCPTool, tool_config: Optional[Dict] = None):
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
- super().__init__(
37
- mcp_tool=original_mcp_tool._mcp_tool,
38
- mcp_session_manager=original_mcp_tool._mcp_session_manager,
39
- auth_scheme=getattr(original_mcp_tool, "_auth_scheme", None),
40
- auth_credential=getattr(original_mcp_tool, "_auth_credential", None),
41
- )
42
- self._original_mcp_tool = original_mcp_tool
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._original_mcp_tool._run_async_impl(
253
- args=resolved_args, tool_context=tool_context, credential=credential
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
- class EmbedResolvingMCPToolset(MCPToolset):
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
- tool_config: Optional[Dict] = None,
439
+ auth_discovery=None,
440
+ tool_config: dict | None = None,
441
+ credential_manager: CredentialManager | None = None,
269
442
  ):
270
- super().__init__(
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
- async def get_tools(self, readonly_context=None) -> List[MCPTool]:
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
- schema_max_keys = host_component.get_config(
298
- "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
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
- schema_max_keys = host_component.get_config(
380
- "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
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/x-yaml", ".yaml"),
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"] = schema_dict["type"].lower()
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 isinstance(schema_dict["items"], dict):
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
- elif isinstance(schema_dict["items"]["type"], types.Type):
306
- schema_dict["items"]["type"] = TYPE_LABELS[
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
- if function_declaration.parameters and function_declaration.parameters.properties:
338
- for key, value in function_declaration.parameters.properties.items():
339
- properties[key] = _schema_to_dict(value)
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"],