solace-agent-mesh 0.2.3__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (518) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  2. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  3. solace_agent_mesh/agent/adk/callbacks.py +1694 -0
  4. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  5. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  6. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  7. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  8. solace_agent_mesh/agent/adk/runner.py +353 -0
  9. solace_agent_mesh/agent/adk/services.py +240 -0
  10. solace_agent_mesh/agent/adk/setup.py +751 -0
  11. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  12. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  13. solace_agent_mesh/agent/agent_llm.txt +41 -0
  14. solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
  15. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  16. solace_agent_mesh/agent/sac/app.py +640 -0
  17. solace_agent_mesh/agent/sac/component.py +3388 -0
  18. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  19. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  20. solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
  21. solace_agent_mesh/agent/testing/__init__.py +3 -0
  22. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  23. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  24. solace_agent_mesh/agent/tools/__init__.py +14 -0
  25. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  26. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  27. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  28. solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
  29. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  30. solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
  31. solace_agent_mesh/agent/tools/registry.py +36 -0
  32. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  33. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  34. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  35. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  36. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  37. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  38. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  39. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  40. solace_agent_mesh/assets/docs/404.html +16 -0
  41. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  42. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  43. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  54. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  57. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  104. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
  132. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
  133. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  165. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  167. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  168. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  170. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  171. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
  172. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  173. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  175. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  176. solace_agent_mesh/cli/__init__.py +1 -1
  177. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  178. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  179. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  180. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  181. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  183. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  184. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  185. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  186. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  187. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  188. solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
  189. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  190. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
  191. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  192. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  193. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  194. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  201. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  202. solace_agent_mesh/cli/main.py +17 -294
  203. solace_agent_mesh/cli/utils.py +135 -204
  204. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  205. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  210. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  211. solace_agent_mesh/common/__init__.py +1 -0
  212. solace_agent_mesh/common/a2a_protocol.py +564 -0
  213. solace_agent_mesh/common/agent_registry.py +42 -0
  214. solace_agent_mesh/common/client/__init__.py +4 -0
  215. solace_agent_mesh/common/client/card_resolver.py +21 -0
  216. solace_agent_mesh/common/client/client.py +85 -0
  217. solace_agent_mesh/common/client/client_llm.txt +133 -0
  218. solace_agent_mesh/common/common_llm.txt +144 -0
  219. solace_agent_mesh/common/constants.py +1 -14
  220. solace_agent_mesh/common/middleware/__init__.py +12 -0
  221. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  222. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  223. solace_agent_mesh/common/middleware/registry.py +125 -0
  224. solace_agent_mesh/common/server/__init__.py +4 -0
  225. solace_agent_mesh/common/server/server.py +122 -0
  226. solace_agent_mesh/common/server/server_llm.txt +169 -0
  227. solace_agent_mesh/common/server/task_manager.py +291 -0
  228. solace_agent_mesh/common/server/utils.py +28 -0
  229. solace_agent_mesh/common/services/__init__.py +4 -0
  230. solace_agent_mesh/common/services/employee_service.py +162 -0
  231. solace_agent_mesh/common/services/identity_service.py +129 -0
  232. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  233. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  234. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  235. solace_agent_mesh/common/services/services_llm.txt +132 -0
  236. solace_agent_mesh/common/types.py +411 -0
  237. solace_agent_mesh/common/utils/__init__.py +7 -0
  238. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  239. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  240. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  241. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  242. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  243. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  244. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  245. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  246. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  247. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  248. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  249. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  250. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  251. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  252. solace_agent_mesh/config_portal/backend/common.py +66 -24
  253. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
  254. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
  258. solace_agent_mesh/config_portal/backend/server.py +550 -140
  259. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
  260. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  267. solace_agent_mesh/core_a2a/__init__.py +1 -0
  268. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  269. solace_agent_mesh/core_a2a/service.py +331 -0
  270. solace_agent_mesh/evaluation/config_loader.py +657 -0
  271. solace_agent_mesh/evaluation/evaluator.py +667 -0
  272. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  273. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  274. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  275. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  276. solace_agent_mesh/evaluation/report/modal.html +59 -0
  277. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  278. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  279. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  280. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  281. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  282. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  283. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  284. solace_agent_mesh/evaluation/report_generator.py +613 -0
  285. solace_agent_mesh/evaluation/run.py +613 -0
  286. solace_agent_mesh/evaluation/subscriber.py +872 -0
  287. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  288. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  289. solace_agent_mesh/gateway/base/__init__.py +1 -0
  290. solace_agent_mesh/gateway/base/app.py +266 -0
  291. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  292. solace_agent_mesh/gateway/base/component.py +1542 -0
  293. solace_agent_mesh/gateway/base/task_context.py +74 -0
  294. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  295. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  296. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  297. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  298. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  299. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  300. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  301. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  302. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  303. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  304. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  305. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
  306. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  307. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  308. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  309. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  310. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  311. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  312. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  313. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  314. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  315. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  316. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  317. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  318. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  319. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  320. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  321. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  322. solace_agent_mesh/llm.txt +228 -0
  323. solace_agent_mesh/llm_detail.txt +2835 -0
  324. solace_agent_mesh/templates/agent_template.yaml +53 -0
  325. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  326. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  327. solace_agent_mesh/templates/gateway_component_template.py +400 -0
  328. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  329. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  330. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  331. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  332. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  333. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  334. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  335. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  336. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  337. solace_agent_mesh/templates/shared_config.yaml +66 -0
  338. solace_agent_mesh/templates/templates_llm.txt +147 -0
  339. solace_agent_mesh/templates/webui.yaml +53 -0
  340. solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
  341. solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
  342. solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
  343. {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
  344. solace_agent_mesh/agents/base_agent_component.py +0 -226
  345. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  346. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  347. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  348. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  349. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  350. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  351. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  352. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  353. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  354. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  355. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  356. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  357. solace_agent_mesh/agents/slack/__init__.py +0 -1
  358. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  359. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  360. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  361. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  362. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  363. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  364. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  365. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  366. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  367. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  368. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  369. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  370. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  371. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  372. solace_agent_mesh/cli/commands/add/add.py +0 -88
  373. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  374. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  375. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  376. solace_agent_mesh/cli/commands/build.py +0 -670
  377. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  378. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  379. solace_agent_mesh/cli/commands/config.py +0 -29
  380. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  382. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  383. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  384. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  385. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  386. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  387. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  388. solace_agent_mesh/cli/commands/init/init.py +0 -92
  389. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  390. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  391. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  392. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  393. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  394. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  395. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  396. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  397. solace_agent_mesh/cli/commands/run.py +0 -68
  398. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  399. solace_agent_mesh/cli/config.py +0 -85
  400. solace_agent_mesh/common/action.py +0 -91
  401. solace_agent_mesh/common/action_list.py +0 -37
  402. solace_agent_mesh/common/action_response.py +0 -340
  403. solace_agent_mesh/common/mysql_database.py +0 -40
  404. solace_agent_mesh/common/postgres_database.py +0 -85
  405. solace_agent_mesh/common/prompt_templates.py +0 -28
  406. solace_agent_mesh/common/stimulus_utils.py +0 -152
  407. solace_agent_mesh/common/time.py +0 -24
  408. solace_agent_mesh/common/utils.py +0 -712
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DMmCawWe.js +0 -42
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-dd988f05.js +0 -1
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  414. solace_agent_mesh/configs/agent_global.yaml +0 -74
  415. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  416. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  417. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  418. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  419. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  420. solace_agent_mesh/configs/monitor.yaml +0 -0
  421. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  422. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  423. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  424. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  425. solace_agent_mesh/configs/service_llm.yaml +0 -265
  426. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  427. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  428. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  429. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  430. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  431. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  432. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  433. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  434. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  435. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  436. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  437. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  438. solace_agent_mesh/orchestrator/__init__.py +0 -0
  439. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  440. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  441. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  442. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  443. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  444. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  445. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  446. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  447. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  448. solace_agent_mesh/services/__init__.py +0 -0
  449. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  450. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  451. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  452. solace_agent_mesh/services/common/__init__.py +0 -4
  453. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  454. solace_agent_mesh/services/common/singleton.py +0 -18
  455. solace_agent_mesh/services/file_service/__init__.py +0 -14
  456. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  457. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  458. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  459. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  460. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  461. solace_agent_mesh/services/file_service/file_service.py +0 -437
  462. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  463. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  464. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  465. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  466. solace_agent_mesh/services/history_service/__init__.py +0 -3
  467. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  468. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  469. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  470. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  471. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  472. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  473. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  474. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  475. solace_agent_mesh/services/history_service/history_service.py +0 -413
  476. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  477. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  478. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  479. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  480. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  481. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  482. solace_agent_mesh/templates/action.py +0 -38
  483. solace_agent_mesh/templates/agent.py +0 -29
  484. solace_agent_mesh/templates/agent.yaml +0 -70
  485. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  486. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  487. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  488. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  489. solace_agent_mesh/templates/gateway_base.py +0 -15
  490. solace_agent_mesh/templates/gateway_input.py +0 -98
  491. solace_agent_mesh/templates/gateway_output.py +0 -71
  492. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  493. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  494. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  495. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  496. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  497. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  498. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  499. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  500. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  501. solace_agent_mesh/templates/web-flows.yaml +0 -76
  502. solace_agent_mesh/tools/__init__.py +0 -0
  503. solace_agent_mesh/tools/components/__init__.py +0 -0
  504. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  505. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  506. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  507. solace_agent_mesh-0.2.3.dist-info/METADATA +0 -172
  508. solace_agent_mesh-0.2.3.dist-info/RECORD +0 -193
  509. solace_agent_mesh-0.2.3.dist-info/entry_points.txt +0 -3
  510. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  511. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  512. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  513. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  517. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  518. {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,872 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import base64
18
+ import json
19
+ import logging
20
+ from typing import Any
21
+ from typing import AsyncGenerator
22
+ from typing import cast
23
+ from typing import Dict
24
+ from typing import Generator
25
+ from typing import Iterable
26
+ from typing import List
27
+ from typing import Literal
28
+ from typing import Optional
29
+ from typing import Tuple
30
+ from typing import Union
31
+
32
+ from google.genai import types
33
+ from litellm import acompletion
34
+ from litellm import ChatCompletionAssistantMessage
35
+ from litellm import ChatCompletionAssistantToolCall
36
+ from litellm import ChatCompletionDeveloperMessage
37
+ from litellm import ChatCompletionImageUrlObject
38
+ from litellm import ChatCompletionMessageToolCall
39
+ from litellm import ChatCompletionTextObject
40
+ from litellm import ChatCompletionToolMessage
41
+ from litellm import ChatCompletionUserMessage
42
+ from litellm import ChatCompletionVideoUrlObject
43
+ from litellm import completion
44
+ from litellm import CustomStreamWrapper
45
+ from litellm import Function
46
+ from litellm import Message
47
+ from litellm import ModelResponse
48
+ from litellm import OpenAIMessageContent
49
+ from pydantic import BaseModel
50
+ from pydantic import Field
51
+ from typing_extensions import override
52
+
53
+ from google.adk.models.base_llm import BaseLlm
54
+ from google.adk.models.llm_request import LlmRequest
55
+ from google.adk.models.llm_response import LlmResponse
56
+
57
+ logger = logging.getLogger("google_adk." + __name__)
58
+
59
+ _NEW_LINE = "\n"
60
+ _EXCLUDED_PART_FIELD = {"inline_data": {"data"}}
61
+
62
+
63
+ class FunctionChunk(BaseModel):
64
+ id: Optional[str]
65
+ name: Optional[str]
66
+ args: Optional[str]
67
+ index: Optional[int] = 0
68
+
69
+
70
+ class TextChunk(BaseModel):
71
+ text: str
72
+
73
+
74
+ class UsageMetadataChunk(BaseModel):
75
+ prompt_tokens: int
76
+ completion_tokens: int
77
+ total_tokens: int
78
+
79
+
80
+ class LiteLLMClient:
81
+ """Provides acompletion method (for better testability)."""
82
+
83
+ async def acompletion(
84
+ self, model, messages, tools, **kwargs
85
+ ) -> Union[ModelResponse, CustomStreamWrapper]:
86
+ """Asynchronously calls acompletion.
87
+
88
+ Args:
89
+ model: The model name.
90
+ messages: The messages to send to the model.
91
+ tools: The tools to use for the model.
92
+ **kwargs: Additional arguments to pass to acompletion.
93
+
94
+ Returns:
95
+ The model response as a message.
96
+ """
97
+
98
+ return await acompletion(
99
+ model=model,
100
+ messages=messages,
101
+ tools=tools,
102
+ **kwargs,
103
+ )
104
+
105
+ def completion(
106
+ self, model, messages, tools, stream=False, **kwargs
107
+ ) -> Union[ModelResponse, CustomStreamWrapper]:
108
+ """Synchronously calls completion. This is used for streaming only.
109
+
110
+ Args:
111
+ model: The model to use.
112
+ messages: The messages to send.
113
+ tools: The tools to use for the model.
114
+ stream: Whether to stream the response.
115
+ **kwargs: Additional arguments to pass to completion.
116
+
117
+ Returns:
118
+ The response from the model.
119
+ """
120
+
121
+ return completion(
122
+ model=model,
123
+ messages=messages,
124
+ tools=tools,
125
+ stream=stream,
126
+ **kwargs,
127
+ )
128
+
129
+
130
+ def _safe_json_serialize(obj) -> str:
131
+ """Convert any Python object to a JSON-serializable type or string.
132
+
133
+ Args:
134
+ obj: The object to serialize.
135
+
136
+ Returns:
137
+ The JSON-serialized object string or string.
138
+ """
139
+
140
+ try:
141
+ return json.dumps(obj, ensure_ascii=False)
142
+ except (TypeError, OverflowError):
143
+ return str(obj)
144
+
145
+
146
+ def _content_to_message_param(
147
+ content: types.Content,
148
+ ) -> Union[Message, list[Message]]:
149
+ """Converts a types.Content to a litellm Message or list of Messages.
150
+
151
+ Handles multipart function responses by returning a list of
152
+ ChatCompletionToolMessage objects if multiple function_response parts exist.
153
+
154
+ Args:
155
+ content: The content to convert.
156
+
157
+ Returns:
158
+ A litellm Message, a list of litellm Messages.
159
+ """
160
+
161
+ tool_messages = []
162
+ for part in content.parts:
163
+ if part.function_response:
164
+ tool_messages.append(
165
+ ChatCompletionToolMessage(
166
+ role="tool",
167
+ tool_call_id=part.function_response.id,
168
+ content=_safe_json_serialize(part.function_response.response),
169
+ )
170
+ )
171
+ if tool_messages:
172
+ return tool_messages if len(tool_messages) > 1 else tool_messages[0]
173
+
174
+ role = _to_litellm_role(content.role)
175
+ message_content = _get_content(content.parts) or None
176
+
177
+ if role == "user":
178
+ return ChatCompletionUserMessage(role="user", content=message_content)
179
+ else: # assistant/model
180
+ tool_calls = []
181
+ content_present = False
182
+ for part in content.parts:
183
+ if part.function_call:
184
+ tool_calls.append(
185
+ ChatCompletionAssistantToolCall(
186
+ type="function",
187
+ id=part.function_call.id,
188
+ function=Function(
189
+ name=part.function_call.name,
190
+ arguments=_safe_json_serialize(part.function_call.args),
191
+ ),
192
+ )
193
+ )
194
+ elif part.text or part.inline_data:
195
+ content_present = True
196
+
197
+ final_content = message_content if content_present else None
198
+ if final_content and isinstance(final_content, list):
199
+ # when the content is a single text object, we can use it directly.
200
+ # this is needed for ollama_chat provider which fails if content is a list
201
+ final_content = (
202
+ final_content[0].get("text", "")
203
+ if final_content[0].get("type", None) == "text"
204
+ else final_content
205
+ )
206
+
207
+ return ChatCompletionAssistantMessage(
208
+ role=role,
209
+ content=final_content,
210
+ tool_calls=tool_calls or None,
211
+ )
212
+
213
+
214
+ def _get_content(
215
+ parts: Iterable[types.Part],
216
+ ) -> Union[OpenAIMessageContent, str]:
217
+ """Converts a list of parts to litellm content.
218
+
219
+ Args:
220
+ parts: The parts to convert.
221
+
222
+ Returns:
223
+ The litellm content.
224
+ """
225
+
226
+ content_objects = []
227
+ for part in parts:
228
+ if part.text:
229
+ if len(parts) == 1:
230
+ return part.text
231
+ content_objects.append(
232
+ ChatCompletionTextObject(
233
+ type="text",
234
+ text=part.text,
235
+ )
236
+ )
237
+ elif part.inline_data and part.inline_data.data and part.inline_data.mime_type:
238
+ base64_string = base64.b64encode(part.inline_data.data).decode("utf-8")
239
+ data_uri = f"data:{part.inline_data.mime_type};base64,{base64_string}"
240
+
241
+ if part.inline_data.mime_type.startswith("image"):
242
+ content_objects.append(
243
+ ChatCompletionImageUrlObject(
244
+ type="image_url",
245
+ image_url=data_uri,
246
+ )
247
+ )
248
+ elif part.inline_data.mime_type.startswith("video"):
249
+ content_objects.append(
250
+ ChatCompletionVideoUrlObject(
251
+ type="video_url",
252
+ video_url=data_uri,
253
+ )
254
+ )
255
+ else:
256
+ raise ValueError("LiteLlm(BaseLlm) does not support this content part.")
257
+
258
+ return content_objects
259
+
260
+
261
+ def _to_litellm_role(role: Optional[str]) -> Literal["user", "assistant"]:
262
+ """Converts a types.Content role to a litellm role.
263
+
264
+ Args:
265
+ role: The types.Content role.
266
+
267
+ Returns:
268
+ The litellm role.
269
+ """
270
+
271
+ if role in ["model", "assistant"]:
272
+ return "assistant"
273
+ return "user"
274
+
275
+
276
+ TYPE_LABELS = {
277
+ "STRING": "string",
278
+ "NUMBER": "number",
279
+ "BOOLEAN": "boolean",
280
+ "OBJECT": "object",
281
+ "ARRAY": "array",
282
+ "INTEGER": "integer",
283
+ }
284
+
285
+
286
+ def _schema_to_dict(schema: types.Schema) -> dict:
287
+ """Recursively converts a types.Schema to a dictionary.
288
+
289
+ Args:
290
+ schema: The schema to convert.
291
+
292
+ Returns:
293
+ The dictionary representation of the schema.
294
+ """
295
+
296
+ schema_dict = schema.model_dump(exclude_none=True)
297
+ if "type" in schema_dict:
298
+ schema_dict["type"] = schema_dict["type"].lower()
299
+ if "items" in schema_dict:
300
+ if isinstance(schema_dict["items"], dict):
301
+ schema_dict["items"] = _schema_to_dict(
302
+ types.Schema.model_validate(schema_dict["items"])
303
+ )
304
+ elif isinstance(schema_dict["items"]["type"], types.Type):
305
+ schema_dict["items"]["type"] = TYPE_LABELS[
306
+ schema_dict["items"]["type"].value
307
+ ]
308
+ if "properties" in schema_dict:
309
+ properties = {}
310
+ for key, value in schema_dict["properties"].items():
311
+ if isinstance(value, types.Schema):
312
+ properties[key] = _schema_to_dict(value)
313
+ else:
314
+ properties[key] = value
315
+ if "type" in properties[key]:
316
+ properties[key]["type"] = properties[key]["type"].lower()
317
+ schema_dict["properties"] = properties
318
+ return schema_dict
319
+
320
+
321
+ def _function_declaration_to_tool_param(
322
+ function_declaration: types.FunctionDeclaration,
323
+ ) -> dict:
324
+ """Converts a types.FunctionDeclaration to a openapi spec dictionary.
325
+
326
+ Args:
327
+ function_declaration: The function declaration to convert.
328
+
329
+ Returns:
330
+ The openapi spec dictionary representation of the function declaration.
331
+ """
332
+
333
+ assert function_declaration.name
334
+
335
+ properties = {}
336
+ if function_declaration.parameters and function_declaration.parameters.properties:
337
+ for key, value in function_declaration.parameters.properties.items():
338
+ properties[key] = _schema_to_dict(value)
339
+
340
+ return {
341
+ "type": "function",
342
+ "function": {
343
+ "name": function_declaration.name,
344
+ "description": function_declaration.description or "",
345
+ "parameters": {
346
+ "type": "object",
347
+ "properties": properties,
348
+ },
349
+ },
350
+ }
351
+
352
+
353
+ def _model_response_to_chunk(
354
+ response: ModelResponse,
355
+ ) -> Generator[
356
+ Tuple[
357
+ Optional[Union[TextChunk, FunctionChunk, UsageMetadataChunk]],
358
+ Optional[str],
359
+ ],
360
+ None,
361
+ None,
362
+ ]:
363
+ """Converts a litellm message to text, function or usage metadata chunk.
364
+
365
+ Args:
366
+ response: The response from the model.
367
+
368
+ Yields:
369
+ A tuple of text or function or usage metadata chunk and finish reason.
370
+ """
371
+
372
+ message = None
373
+ if response.get("choices", None):
374
+ message = response["choices"][0].get("message", None)
375
+ finish_reason = response["choices"][0].get("finish_reason", None)
376
+ # check streaming delta
377
+ if message is None and response["choices"][0].get("delta", None):
378
+ message = response["choices"][0]["delta"]
379
+
380
+ if message.get("content", None):
381
+ yield TextChunk(text=message.get("content")), finish_reason
382
+
383
+ if message.get("tool_calls", None):
384
+ for tool_call in message.get("tool_calls"):
385
+ if tool_call.type == "function":
386
+ yield FunctionChunk(
387
+ id=tool_call.id,
388
+ name=tool_call.function.name,
389
+ args=tool_call.function.arguments,
390
+ index=tool_call.index,
391
+ ), finish_reason
392
+
393
+ if finish_reason and not (
394
+ message.get("content", None) or message.get("tool_calls", None)
395
+ ):
396
+ yield None, finish_reason
397
+
398
+ if not message:
399
+ yield None, None
400
+
401
+ # Ideally usage would be expected with the last ModelResponseStream with a
402
+ # finish_reason set. But this is not the case we are observing from litellm.
403
+ # So we are sending it as a separate chunk to be set on the llm_response.
404
+ if response.get("usage", None):
405
+ yield UsageMetadataChunk(
406
+ prompt_tokens=response["usage"].get("prompt_tokens", 0),
407
+ completion_tokens=response["usage"].get("completion_tokens", 0),
408
+ total_tokens=response["usage"].get("total_tokens", 0),
409
+ ), None
410
+
411
+
412
+ def _model_response_to_generate_content_response(
413
+ response: ModelResponse,
414
+ ) -> LlmResponse:
415
+ """Converts a litellm response to LlmResponse. Also adds usage metadata.
416
+
417
+ Args:
418
+ response: The model response.
419
+
420
+ Returns:
421
+ The LlmResponse.
422
+ """
423
+
424
+ message = None
425
+ if response.get("choices", None):
426
+ message = response["choices"][0].get("message", None)
427
+
428
+ if not message:
429
+ raise ValueError("No message in response")
430
+
431
+ llm_response = _message_to_generate_content_response(message)
432
+ if response.get("usage", None):
433
+ llm_response.usage_metadata = types.GenerateContentResponseUsageMetadata(
434
+ prompt_token_count=response["usage"].get("prompt_tokens", 0),
435
+ candidates_token_count=response["usage"].get("completion_tokens", 0),
436
+ total_token_count=response["usage"].get("total_tokens", 0),
437
+ )
438
+ return llm_response
439
+
440
+
441
+ def _message_to_generate_content_response(
442
+ message: Message, is_partial: bool = False
443
+ ) -> LlmResponse:
444
+ """Converts a litellm message to LlmResponse.
445
+
446
+ Args:
447
+ message: The message to convert.
448
+ is_partial: Whether the message is partial.
449
+
450
+ Returns:
451
+ The LlmResponse.
452
+ """
453
+
454
+ parts = []
455
+ if message.get("content", None):
456
+ parts.append(types.Part.from_text(text=message.get("content")))
457
+
458
+ if message.get("tool_calls", None):
459
+ for tool_call in message.get("tool_calls"):
460
+ if tool_call.type == "function":
461
+ try:
462
+ part = types.Part.from_function_call(
463
+ name=tool_call.function.name,
464
+ args=json.loads(tool_call.function.arguments or "{}"),
465
+ )
466
+ part.function_call.id = tool_call.id
467
+ parts.append(part)
468
+ except json.JSONDecodeError as e:
469
+ logger.error(
470
+ "Failed to decode function call arguments: %s. Arguments: %s",
471
+ e,
472
+ tool_call.function.arguments,
473
+ )
474
+
475
+ return LlmResponse(
476
+ content=types.Content(role="model", parts=parts), partial=is_partial
477
+ )
478
+
479
+
480
+ def _get_completion_inputs(
481
+ llm_request: LlmRequest,
482
+ ) -> Tuple[
483
+ List[Message],
484
+ Optional[List[Dict]],
485
+ Optional[types.SchemaUnion],
486
+ Optional[Dict],
487
+ ]:
488
+ """Converts an LlmRequest to litellm inputs and extracts generation params.
489
+
490
+ Args:
491
+ llm_request: The LlmRequest to convert.
492
+
493
+ Returns:
494
+ The litellm inputs (message list, tool dictionary and response format).
495
+ """
496
+ messages: List[Message] = []
497
+ for content in llm_request.contents or []:
498
+ message_param_or_list = _content_to_message_param(content)
499
+ if isinstance(message_param_or_list, list):
500
+ messages.extend(message_param_or_list)
501
+ elif message_param_or_list: # Ensure it's not None before appending
502
+ messages.append(message_param_or_list)
503
+
504
+ if llm_request.config.system_instruction:
505
+ messages.insert(
506
+ 0,
507
+ ChatCompletionDeveloperMessage(
508
+ role="developer",
509
+ content=llm_request.config.system_instruction,
510
+ ),
511
+ )
512
+
513
+ # 2. Convert tool declarations
514
+ tools: Optional[List[Dict]] = None
515
+ if (
516
+ llm_request.config
517
+ and llm_request.config.tools
518
+ and llm_request.config.tools[0].function_declarations
519
+ ):
520
+ tools = [
521
+ _function_declaration_to_tool_param(tool)
522
+ for tool in llm_request.config.tools[0].function_declarations
523
+ ]
524
+
525
+ # 3. Handle response format
526
+ response_format: Optional[types.SchemaUnion] = None
527
+ if llm_request.config and llm_request.config.response_schema:
528
+ response_format = llm_request.config.response_schema
529
+
530
+ # 4. Extract generation parameters
531
+ generation_params: Optional[Dict] = None
532
+ if llm_request.config:
533
+ config_dict = llm_request.config.model_dump(exclude_none=True)
534
+ # Generate LiteLlm parameters here,
535
+ # Following https://docs.litellm.ai/docs/completion/input.
536
+ generation_params = {}
537
+ param_mapping = {
538
+ "max_output_tokens": "max_completion_tokens",
539
+ "stop_sequences": "stop",
540
+ }
541
+ for key in (
542
+ "temperature",
543
+ "max_output_tokens",
544
+ "top_p",
545
+ "top_k",
546
+ "stop_sequences",
547
+ "presence_penalty",
548
+ "frequency_penalty",
549
+ ):
550
+ if key in config_dict:
551
+ mapped_key = param_mapping.get(key, key)
552
+ generation_params[mapped_key] = config_dict[key]
553
+
554
+ if not generation_params:
555
+ generation_params = None
556
+
557
+ return messages, tools, response_format, generation_params
558
+
559
+
560
+ def _build_function_declaration_log(
561
+ func_decl: types.FunctionDeclaration,
562
+ ) -> str:
563
+ """Builds a function declaration log.
564
+
565
+ Args:
566
+ func_decl: The function declaration to convert.
567
+
568
+ Returns:
569
+ The function declaration log.
570
+ """
571
+
572
+ param_str = "{}"
573
+ if func_decl.parameters and func_decl.parameters.properties:
574
+ param_str = str(
575
+ {
576
+ k: v.model_dump(exclude_none=True)
577
+ for k, v in func_decl.parameters.properties.items()
578
+ }
579
+ )
580
+ return_str = "None"
581
+ if func_decl.response:
582
+ return_str = str(func_decl.response.model_dump(exclude_none=True))
583
+ return f"{func_decl.name}: {param_str} -> {return_str}"
584
+
585
+
586
+ def _build_request_log(req: LlmRequest) -> str:
587
+ """Builds a request log.
588
+
589
+ Args:
590
+ req: The request to convert.
591
+
592
+ Returns:
593
+ The request log.
594
+ """
595
+
596
+ function_decls: list[types.FunctionDeclaration] = cast(
597
+ list[types.FunctionDeclaration],
598
+ req.config.tools[0].function_declarations if req.config.tools else [],
599
+ )
600
+ function_logs = (
601
+ [_build_function_declaration_log(func_decl) for func_decl in function_decls]
602
+ if function_decls
603
+ else []
604
+ )
605
+ contents_logs = [
606
+ content.model_dump_json(
607
+ exclude_none=True,
608
+ exclude={
609
+ "parts": {i: _EXCLUDED_PART_FIELD for i in range(len(content.parts))}
610
+ },
611
+ )
612
+ for content in req.contents
613
+ ]
614
+
615
+ return f"""
616
+ LLM Request:
617
+ -----------------------------------------------------------
618
+ System Instruction:
619
+ {req.config.system_instruction}
620
+ -----------------------------------------------------------
621
+ Contents:
622
+ {_NEW_LINE.join(contents_logs)}
623
+ -----------------------------------------------------------
624
+ Functions:
625
+ {_NEW_LINE.join(function_logs)}
626
+ -----------------------------------------------------------
627
+ """
628
+
629
+
630
+ class LiteLlm(BaseLlm):
631
+ """Wrapper around litellm.
632
+
633
+ This wrapper can be used with any of the models supported by litellm. The
634
+ environment variable(s) needed for authenticating with the model endpoint must
635
+ be set prior to instantiating this class.
636
+
637
+ Example usage:
638
+ ```
639
+ os.environ["VERTEXAI_PROJECT"] = "your-gcp-project-id"
640
+ os.environ["VERTEXAI_LOCATION"] = "your-gcp-location"
641
+
642
+ agent = Agent(
643
+ model=LiteLlm(model="vertex_ai/claude-3-7-sonnet@20250219"),
644
+ ...
645
+ )
646
+ ```
647
+
648
+ Attributes:
649
+ model: The name of the LiteLlm model.
650
+ llm_client: The LLM client to use for the model.
651
+ """
652
+
653
+ llm_client: LiteLLMClient = Field(default_factory=LiteLLMClient)
654
+ """The LLM client to use for the model."""
655
+
656
+ _additional_args: Dict[str, Any] = None
657
+
658
+ def __init__(self, model: str, **kwargs):
659
+ """Initializes the LiteLlm class.
660
+
661
+ Args:
662
+ model: The name of the LiteLlm model.
663
+ **kwargs: Additional arguments to pass to the litellm completion api.
664
+ """
665
+ super().__init__(model=model, **kwargs)
666
+ self._additional_args = kwargs
667
+ # preventing generation call with llm_client
668
+ # and overriding messages, tools and stream which are managed internally
669
+ self._additional_args.pop("llm_client", None)
670
+ self._additional_args.pop("messages", None)
671
+ self._additional_args.pop("tools", None)
672
+ # public api called from runner determines to stream or not
673
+ self._additional_args.pop("stream", None)
674
+
675
+ async def generate_content_async(
676
+ self, llm_request: LlmRequest, stream: bool = False
677
+ ) -> AsyncGenerator[LlmResponse, None]:
678
+ """Generates content asynchronously.
679
+
680
+ Args:
681
+ llm_request: LlmRequest, the request to send to the LiteLlm model.
682
+ stream: bool = False, whether to do streaming call.
683
+
684
+ Yields:
685
+ LlmResponse: The model response.
686
+ """
687
+
688
+ if not llm_request.contents or llm_request.contents[-1].role not in [
689
+ "user",
690
+ "tool",
691
+ ]:
692
+ self._maybe_append_user_content(llm_request)
693
+ logger.debug(_build_request_log(llm_request))
694
+
695
+ messages, tools, response_format, generation_params = _get_completion_inputs(
696
+ llm_request
697
+ )
698
+ completion_args = {
699
+ "model": self.model,
700
+ "messages": messages,
701
+ "tools": tools,
702
+ "response_format": response_format,
703
+ }
704
+ completion_args.update(self._additional_args)
705
+
706
+ if generation_params:
707
+ completion_args.update(generation_params)
708
+
709
+ if not tools and completion_args.get("parallel_tool_calls", False):
710
+ # Setting parallel_tool_calls without any tools causes an error from Anthropic.
711
+ completion_args.pop("parallel_tool_calls")
712
+
713
+ if stream:
714
+ text = ""
715
+ function_calls = {} # index -> {name, args, id}
716
+ completion_args["stream"] = True
717
+ aggregated_llm_response = None
718
+ aggregated_llm_response_with_tool_call = None
719
+ usage_metadata = None
720
+ fallback_index = 0
721
+ async for part in await self.llm_client.acompletion(**completion_args):
722
+ for chunk, finish_reason in _model_response_to_chunk(part):
723
+ if isinstance(chunk, FunctionChunk):
724
+ index = chunk.index or fallback_index
725
+ if index not in function_calls:
726
+ function_calls[index] = {"name": "", "args": "", "id": None}
727
+
728
+ if chunk.name:
729
+ function_calls[index]["name"] += chunk.name
730
+ if chunk.args:
731
+ function_calls[index]["args"] += chunk.args
732
+
733
+ # check if args is completed (workaround for improper chunk
734
+ # indexing)
735
+ try:
736
+ json.loads(function_calls[index]["args"])
737
+ fallback_index += 1
738
+ except json.JSONDecodeError:
739
+ pass
740
+
741
+ function_calls[index]["id"] = (
742
+ chunk.id or function_calls[index]["id"] or str(index)
743
+ )
744
+ elif isinstance(chunk, TextChunk):
745
+ text += chunk.text
746
+ yield _message_to_generate_content_response(
747
+ ChatCompletionAssistantMessage(
748
+ role="assistant",
749
+ content=chunk.text,
750
+ ),
751
+ is_partial=True,
752
+ )
753
+ elif isinstance(chunk, UsageMetadataChunk):
754
+ usage_metadata = types.GenerateContentResponseUsageMetadata(
755
+ prompt_token_count=chunk.prompt_tokens,
756
+ candidates_token_count=chunk.completion_tokens,
757
+ total_token_count=chunk.total_tokens,
758
+ )
759
+
760
+ if (
761
+ finish_reason == "tool_calls" or finish_reason == "stop"
762
+ ) and function_calls:
763
+ tool_calls = []
764
+ for index, func_data in function_calls.items():
765
+ if func_data["id"]:
766
+ tool_calls.append(
767
+ ChatCompletionMessageToolCall(
768
+ type="function",
769
+ id=func_data["id"],
770
+ function=Function(
771
+ name=func_data["name"],
772
+ arguments=func_data["args"],
773
+ index=index,
774
+ ),
775
+ )
776
+ )
777
+ aggregated_llm_response_with_tool_call = (
778
+ _message_to_generate_content_response(
779
+ ChatCompletionAssistantMessage(
780
+ role="assistant",
781
+ content=text or "",
782
+ tool_calls=tool_calls,
783
+ )
784
+ )
785
+ )
786
+ function_calls.clear()
787
+ text = ""
788
+ elif finish_reason == "length":
789
+ # The stream was interrupted due to token limit.
790
+ # Create a final response indicating interruption, including any
791
+ # buffered text AND any buffered tool calls.
792
+ tool_calls = []
793
+ for index, func_data in function_calls.items():
794
+ if func_data["id"]:
795
+ tool_calls.append(
796
+ ChatCompletionMessageToolCall(
797
+ type="function",
798
+ id=func_data["id"],
799
+ function=Function(
800
+ name=func_data["name"],
801
+ arguments=func_data["args"],
802
+ index=index,
803
+ ),
804
+ )
805
+ )
806
+
807
+ aggregated_llm_response = _message_to_generate_content_response(
808
+ ChatCompletionAssistantMessage(
809
+ role="assistant",
810
+ content=text or None,
811
+ tool_calls=tool_calls or None,
812
+ )
813
+ )
814
+ aggregated_llm_response.interrupted = True
815
+
816
+ # Yield the interrupted response immediately and stop processing this stream.
817
+ # This ensures the partial text and tool calls are preserved.
818
+ if usage_metadata:
819
+ aggregated_llm_response.usage_metadata = usage_metadata
820
+ yield aggregated_llm_response
821
+ return
822
+ elif finish_reason == "MALFORMED_FUNCTION_CALL":
823
+ # Create an error response that will allow the LLM to continue
824
+ aggregated_llm_response = _message_to_generate_content_response(
825
+ ChatCompletionAssistantMessage(
826
+ role="assistant",
827
+ content="I attempted to call a function that doesn't exist or with invalid parameters. Let me try a different approach or provide a direct response instead.",
828
+ ),
829
+ is_partial=True,
830
+ )
831
+ text = ""
832
+ elif finish_reason == "stop" and text:
833
+ aggregated_llm_response = _message_to_generate_content_response(
834
+ ChatCompletionAssistantMessage(
835
+ role="assistant", content=text
836
+ )
837
+ )
838
+ text = ""
839
+
840
+ # waiting until streaming ends to yield the llm_response as litellm tends
841
+ # to send chunk that contains usage_metadata after the chunk with
842
+ # finish_reason set to tool_calls or stop.
843
+ if aggregated_llm_response:
844
+ if usage_metadata:
845
+ aggregated_llm_response.usage_metadata = usage_metadata
846
+ usage_metadata = None
847
+ yield aggregated_llm_response
848
+
849
+ if aggregated_llm_response_with_tool_call:
850
+ if usage_metadata:
851
+ aggregated_llm_response_with_tool_call.usage_metadata = (
852
+ usage_metadata
853
+ )
854
+ yield aggregated_llm_response_with_tool_call
855
+
856
+ else:
857
+ response = await self.llm_client.acompletion(**completion_args)
858
+ yield _model_response_to_generate_content_response(response)
859
+
860
+ @staticmethod
861
+ @override
862
+ def supported_models() -> list[str]:
863
+ """Provides the list of supported models.
864
+
865
+ LiteLlm supports all models supported by litellm. We do not keep track of
866
+ these models here. So we return an empty list.
867
+
868
+ Returns:
869
+ A list of supported models.
870
+ """
871
+
872
+ return []