rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev7__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 rasa-pro might be problematic. Click here for more details.

Files changed (477) hide show
  1. rasa/agents/agent_factory.py +122 -0
  2. rasa/agents/agent_manager.py +163 -0
  3. rasa/agents/constants.py +40 -0
  4. rasa/agents/core/agent_protocol.py +107 -0
  5. rasa/agents/core/types.py +70 -0
  6. rasa/agents/exceptions.py +38 -0
  7. rasa/agents/protocol/__init__.py +5 -0
  8. rasa/agents/protocol/a2a/a2a_agent.py +662 -0
  9. rasa/agents/protocol/mcp/mcp_base_agent.py +685 -0
  10. rasa/agents/protocol/mcp/mcp_open_agent.py +290 -0
  11. rasa/agents/protocol/mcp/mcp_task_agent.py +484 -0
  12. rasa/agents/schemas/__init__.py +12 -0
  13. rasa/agents/schemas/agent_input.py +38 -0
  14. rasa/agents/schemas/agent_output.py +26 -0
  15. rasa/agents/schemas/agent_tool_result.py +67 -0
  16. rasa/agents/schemas/agent_tool_schema.py +134 -0
  17. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +15 -0
  18. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +17 -0
  19. rasa/agents/utils.py +77 -0
  20. rasa/agents/validation.py +484 -0
  21. rasa/api.py +14 -6
  22. rasa/cli/arguments/default_arguments.py +12 -0
  23. rasa/cli/arguments/run.py +2 -0
  24. rasa/cli/arguments/train.py +2 -0
  25. rasa/cli/dialogue_understanding_test.py +4 -0
  26. rasa/cli/e2e_test.py +4 -0
  27. rasa/cli/inspect.py +3 -0
  28. rasa/cli/interactive.py +2 -0
  29. rasa/cli/llm_fine_tuning.py +5 -0
  30. rasa/cli/project_templates/tutorial/config.yml +1 -2
  31. rasa/cli/run.py +4 -0
  32. rasa/cli/scaffold.py +2 -46
  33. rasa/cli/shell.py +3 -0
  34. rasa/cli/train.py +2 -0
  35. rasa/cli/utils.py +85 -1
  36. rasa/constants.py +6 -0
  37. rasa/core/actions/action.py +52 -10
  38. rasa/core/agent.py +19 -1
  39. rasa/core/available_agents.py +220 -0
  40. rasa/core/available_endpoints.py +30 -0
  41. rasa/core/channels/channel.py +3 -4
  42. rasa/core/channels/development_inspector.py +4 -4
  43. rasa/core/channels/hangouts.py +2 -2
  44. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-cce7e0a8.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-e2a49be7.js} +1 -1
  46. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-3def7895.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +1 -0
  48. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-e66fe4df.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-eb874aaa.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +1 -0
  51. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-cf934643.js} +1 -1
  52. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-8fdf9155.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-6106fb96.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-4c2bb040.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-f0ff96af.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +1 -0
  57. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-a21707ec.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-c165acb1.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-b0564cf1.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-e557e67a.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-1ce60e9e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/index-996fe816.js +1353 -0
  63. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-893569e2.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c29c864f.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-649a5eae.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0e5685ed.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-eaa320bd.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-f35df9e6.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-78339e96.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-9b5f2f14.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-d05ddb3a.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-d9be5dfd.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-0f1c4348.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-9ddf63b3.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-bc2b81ed.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-0a287936.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-e3941990.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-ce4eca24.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d822b1a8.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e144c7a7.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-ab7f4e14.js} +1 -1
  82. rasa/core/channels/inspector/dist/index.html +2 -2
  83. rasa/core/channels/inspector/index.html +1 -1
  84. rasa/core/channels/inspector/src/App.tsx +37 -12
  85. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  86. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +3 -2
  87. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
  88. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  89. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  90. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  91. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  92. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  93. rasa/core/channels/inspector/src/types.ts +21 -0
  94. rasa/core/channels/socketio.py +51 -212
  95. rasa/core/channels/studio_chat.py +29 -49
  96. rasa/core/channels/voice_stream/genesys.py +1 -1
  97. rasa/core/channels/voice_stream/voice_channel.py +3 -5
  98. rasa/core/constants.py +4 -0
  99. rasa/core/policies/enterprise_search_policy.py +11 -6
  100. rasa/core/policies/flow_policy.py +4 -4
  101. rasa/core/policies/flows/flow_executor.py +519 -73
  102. rasa/core/policies/flows/mcp_tool_executor.py +277 -0
  103. rasa/core/policies/intentless_policy.py +1 -1
  104. rasa/core/policies/unexpected_intent_policy.py +1 -0
  105. rasa/core/processor.py +18 -15
  106. rasa/core/run.py +11 -14
  107. rasa/core/tracker_stores/tracker_store.py +3 -7
  108. rasa/core/train.py +1 -1
  109. rasa/core/training/interactive.py +16 -16
  110. rasa/core/training/story_conflict.py +5 -5
  111. rasa/core/utils.py +21 -1
  112. rasa/dialogue_understanding/commands/__init__.py +8 -0
  113. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  114. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
  115. rasa/dialogue_understanding/commands/clarify_command.py +10 -0
  116. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  117. rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
  118. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  119. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  120. rasa/dialogue_understanding/commands/utils.py +124 -2
  121. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  122. rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
  123. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  124. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  125. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  126. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
  127. rasa/{cli/project_templates/telco/prompts/command-generator.jinja2 → dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2} +7 -3
  128. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
  129. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
  130. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
  131. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
  132. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
  133. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  134. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  135. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  136. rasa/dialogue_understanding/processor/command_processor.py +31 -15
  137. rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
  138. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  139. rasa/dialogue_understanding/stack/utils.py +57 -3
  140. rasa/dialogue_understanding/utils.py +24 -4
  141. rasa/dialogue_understanding_test/du_test_runner.py +7 -2
  142. rasa/e2e_test/e2e_test_runner.py +12 -2
  143. rasa/engine/caching.py +2 -2
  144. rasa/engine/recipes/default_components.py +10 -18
  145. rasa/engine/storage/local_model_storage.py +2 -45
  146. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  147. rasa/hooks.py +5 -5
  148. rasa/llm_fine_tuning/utils.py +2 -2
  149. rasa/model_manager/model_api.py +5 -4
  150. rasa/model_manager/runner_service.py +1 -1
  151. rasa/model_manager/socket_bridge.py +14 -20
  152. rasa/model_manager/trainer_service.py +9 -12
  153. rasa/model_manager/utils.py +29 -1
  154. rasa/model_manager/warm_rasa_process.py +1 -1
  155. rasa/model_training.py +8 -6
  156. rasa/nlu/extractors/extractor.py +2 -1
  157. rasa/plugin.py +8 -8
  158. rasa/privacy/privacy_manager.py +11 -2
  159. rasa/server.py +14 -2
  160. rasa/shared/agents/utils.py +35 -0
  161. rasa/shared/constants.py +8 -0
  162. rasa/shared/core/constants.py +11 -1
  163. rasa/shared/core/domain.py +11 -58
  164. rasa/shared/core/events.py +327 -0
  165. rasa/shared/core/flows/flow_step.py +1 -7
  166. rasa/shared/core/flows/flows_list.py +15 -5
  167. rasa/shared/core/flows/flows_yaml_schema.json +112 -186
  168. rasa/shared/core/flows/steps/call.py +53 -5
  169. rasa/shared/core/flows/validation.py +177 -7
  170. rasa/shared/core/flows/yaml_flows_io.py +9 -17
  171. rasa/shared/core/slots.py +2 -6
  172. rasa/shared/core/trackers.py +5 -2
  173. rasa/shared/exceptions.py +4 -0
  174. rasa/shared/importers/importer.py +0 -6
  175. rasa/shared/importers/rasa.py +1 -1
  176. rasa/shared/importers/utils.py +10 -80
  177. rasa/shared/providers/_utils.py +44 -60
  178. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
  179. rasa/shared/providers/llm/_base_litellm_client.py +39 -7
  180. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
  181. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  182. rasa/shared/providers/llm/llm_client.py +7 -3
  183. rasa/shared/providers/llm/llm_response.py +66 -0
  184. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  185. rasa/shared/utils/health_check/health_check.py +7 -3
  186. rasa/shared/utils/llm.py +28 -5
  187. rasa/shared/utils/mcp/server_connection.py +186 -0
  188. rasa/shared/utils/schemas/events.py +42 -0
  189. rasa/shared/utils/yaml.py +3 -1
  190. rasa/studio/upload.py +47 -16
  191. rasa/telemetry.py +23 -97
  192. rasa/tracing/instrumentation/instrumentation.py +14 -10
  193. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  194. rasa/utils/common.py +79 -0
  195. rasa/utils/io.py +9 -27
  196. rasa/utils/json_utils.py +1 -6
  197. rasa/utils/log_utils.py +2 -6
  198. rasa/utils/ml_utils.py +1 -1
  199. rasa/utils/tensorflow/rasa_layers.py +1 -1
  200. rasa/utils/train_utils.py +15 -15
  201. rasa/validator.py +19 -21
  202. rasa/version.py +1 -1
  203. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/METADATA +14 -17
  204. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/RECORD +214 -442
  205. rasa/builder/README.md +0 -120
  206. rasa/builder/auth.py +0 -176
  207. rasa/builder/config.py +0 -115
  208. rasa/builder/copilot/constants.py +0 -25
  209. rasa/builder/copilot/copilot.py +0 -372
  210. rasa/builder/copilot/copilot_response_handler.py +0 -487
  211. rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
  212. rasa/builder/copilot/exceptions.py +0 -20
  213. rasa/builder/copilot/models.py +0 -431
  214. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
  215. rasa/builder/copilot/telemetry.py +0 -195
  216. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
  217. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
  218. rasa/builder/document_retrieval/constants.py +0 -15
  219. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
  220. rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
  221. rasa/builder/document_retrieval/models.py +0 -62
  222. rasa/builder/download.py +0 -140
  223. rasa/builder/exceptions.py +0 -55
  224. rasa/builder/guardrails/__init__.py +0 -1
  225. rasa/builder/guardrails/constants.py +0 -3
  226. rasa/builder/guardrails/exceptions.py +0 -4
  227. rasa/builder/guardrails/lakera.py +0 -206
  228. rasa/builder/guardrails/models.py +0 -199
  229. rasa/builder/guardrails/utils.py +0 -305
  230. rasa/builder/job_manager.py +0 -87
  231. rasa/builder/jobs.py +0 -234
  232. rasa/builder/llm_service.py +0 -246
  233. rasa/builder/logging_utils.py +0 -209
  234. rasa/builder/main.py +0 -174
  235. rasa/builder/models.py +0 -197
  236. rasa/builder/project_generator.py +0 -450
  237. rasa/builder/project_info.py +0 -72
  238. rasa/builder/scrape_rasa_docs.py +0 -97
  239. rasa/builder/service.py +0 -1142
  240. rasa/builder/shared/tracker_context.py +0 -212
  241. rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
  242. rasa/builder/training_service.py +0 -132
  243. rasa/builder/validation_service.py +0 -93
  244. rasa/cli/project_templates/basic/actions/action_api.py +0 -15
  245. rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
  246. rasa/cli/project_templates/basic/config.yml +0 -23
  247. rasa/cli/project_templates/basic/credentials.yml +0 -34
  248. rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
  249. rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
  250. rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
  251. rasa/cli/project_templates/basic/data/general/help.yml +0 -6
  252. rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
  253. rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
  254. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
  255. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
  256. rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
  257. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
  258. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
  259. rasa/cli/project_templates/basic/docs/template.txt +0 -7
  260. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
  261. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
  262. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
  263. rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
  264. rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
  265. rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
  266. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
  267. rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
  268. rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
  269. rasa/cli/project_templates/basic/endpoints.yml +0 -73
  270. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  271. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  272. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  273. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  274. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  275. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  276. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  277. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  278. rasa/cli/project_templates/finance/actions/database.py +0 -277
  279. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  280. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  281. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  282. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  283. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  284. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  285. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
  286. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  287. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  288. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  289. rasa/cli/project_templates/finance/config.yml +0 -21
  290. rasa/cli/project_templates/finance/credentials.yml +0 -32
  291. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  292. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  293. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  294. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  295. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  296. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  297. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  298. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  299. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
  300. rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
  301. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  302. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  303. rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
  304. rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
  305. rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
  306. rasa/cli/project_templates/finance/data/general/help.yml +0 -9
  307. rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
  308. rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
  309. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  310. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
  311. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
  312. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
  313. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
  314. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  315. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  316. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  317. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  318. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  319. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  320. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  321. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  322. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  323. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  324. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  325. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
  326. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  327. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  328. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  329. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  330. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  331. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  332. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  333. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  334. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  335. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  336. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  337. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  338. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  339. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  340. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  341. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  342. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  343. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  344. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  345. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  346. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  347. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  348. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  349. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  350. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  351. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  352. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  353. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  354. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  355. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  356. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  357. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  358. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  359. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  360. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  361. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  362. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  363. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  364. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  365. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  366. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  367. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  368. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  369. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  370. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  371. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  372. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  373. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  374. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  375. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  376. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  377. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  378. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  379. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  380. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  381. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  382. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  383. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  384. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  385. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  386. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  387. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  388. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  389. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  390. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  391. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  392. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  393. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  394. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  395. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  396. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  397. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  398. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  399. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  400. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  401. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  402. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  403. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  404. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  405. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  406. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  407. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
  408. rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
  409. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  410. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  411. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  412. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
  413. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  414. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
  415. rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
  416. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  417. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
  418. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  419. rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
  420. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  421. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  422. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  423. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
  424. rasa/cli/project_templates/finance/endpoints.yml +0 -63
  425. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  426. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  427. rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
  428. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
  429. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
  430. rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
  431. rasa/cli/project_templates/telco/config.yml +0 -25
  432. rasa/cli/project_templates/telco/credentials.yml +0 -33
  433. rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
  434. rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
  435. rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
  436. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
  437. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
  438. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
  439. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
  440. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
  441. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
  442. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
  443. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
  444. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
  445. rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
  446. rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
  447. rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
  448. rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
  449. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
  450. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
  451. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
  452. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
  453. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
  454. rasa/cli/project_templates/telco/endpoints.yml +0 -60
  455. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
  456. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
  457. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
  458. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
  459. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
  460. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
  461. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
  462. rasa/core/channels/constants.py +0 -3
  463. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  464. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  465. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  466. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  467. rasa/utils/openapi.py +0 -144
  468. /rasa/{builder → agents}/__init__.py +0 -0
  469. /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
  470. /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
  471. /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
  472. /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
  473. /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
  474. /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
  475. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/NOTICE +0 -0
  476. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/WHEEL +0 -0
  477. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/entry_points.txt +0 -0
@@ -21,7 +21,7 @@ from rasa.shared.providers._ssl_verification_utils import (
21
21
  ensure_ssl_certificates_for_litellm_non_openai_based_clients,
22
22
  ensure_ssl_certificates_for_litellm_openai_based_clients,
23
23
  )
24
- from rasa.shared.providers.llm.llm_response import LLMResponse, LLMUsage
24
+ from rasa.shared.providers.llm.llm_response import LLMResponse, LLMToolCall, LLMUsage
25
25
  from rasa.shared.utils.io import resolve_environment_variables, suppress_logs
26
26
 
27
27
  structlogger = structlog.get_logger()
@@ -126,7 +126,9 @@ class _BaseLiteLLMClient:
126
126
  raise ProviderClientValidationError(event_info)
127
127
 
128
128
  @suppress_logs(log_level=logging.WARNING)
129
- def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
129
+ def completion(
130
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
131
+ ) -> LLMResponse:
130
132
  """Synchronously generate completions for given list of messages.
131
133
 
132
134
  Args:
@@ -138,6 +140,7 @@ class _BaseLiteLLMClient:
138
140
  - a list of messages. Each message is a string and will be formatted
139
141
  as a user message.
140
142
  - a single message as a string which will be formatted as user message.
143
+ **kwargs: Additional parameters to pass to the completion call.
141
144
 
142
145
  Returns:
143
146
  List of message completions.
@@ -147,15 +150,19 @@ class _BaseLiteLLMClient:
147
150
  """
148
151
  try:
149
152
  formatted_messages = self._get_formatted_messages(messages)
150
- arguments = resolve_environment_variables(self._completion_fn_args)
151
- response = completion(messages=formatted_messages, **arguments)
153
+ arguments = cast(
154
+ Dict[str, Any], resolve_environment_variables(self._completion_fn_args)
155
+ )
156
+ response = completion(
157
+ messages=formatted_messages, **{**arguments, **kwargs}
158
+ )
152
159
  return self._format_response(response)
153
160
  except Exception as e:
154
161
  raise ProviderClientAPIException(e)
155
162
 
156
163
  @suppress_logs(log_level=logging.WARNING)
157
164
  async def acompletion(
158
- self, messages: Union[List[dict], List[str], str]
165
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
159
166
  ) -> LLMResponse:
160
167
  """Asynchronously generate completions for given list of messages.
161
168
 
@@ -168,6 +175,7 @@ class _BaseLiteLLMClient:
168
175
  - a list of messages. Each message is a string and will be formatted
169
176
  as a user message.
170
177
  - a single message as a string which will be formatted as user message.
178
+ **kwargs: Additional parameters to pass to the completion call.
171
179
 
172
180
  Returns:
173
181
  List of message completions.
@@ -177,8 +185,12 @@ class _BaseLiteLLMClient:
177
185
  """
178
186
  try:
179
187
  formatted_messages = self._get_formatted_messages(messages)
180
- arguments = resolve_environment_variables(self._completion_fn_args)
181
- response = await acompletion(messages=formatted_messages, **arguments)
188
+ arguments = cast(
189
+ Dict[str, Any], resolve_environment_variables(self._completion_fn_args)
190
+ )
191
+ response = await acompletion(
192
+ messages=formatted_messages, **{**arguments, **kwargs}
193
+ )
182
194
  return self._format_response(response)
183
195
  except Exception as e:
184
196
  message = ""
@@ -246,12 +258,32 @@ class _BaseLiteLLMClient:
246
258
  else 0
247
259
  )
248
260
  formatted_response.usage = LLMUsage(prompt_tokens, completion_tokens)
261
+
262
+ # Extract tool calls from all choices
263
+ formatted_response.tool_calls = self._extract_tool_calls(response)
264
+
249
265
  structlogger.debug(
250
266
  "base_litellm_client.formatted_response",
251
267
  formatted_response=formatted_response.to_dict(),
252
268
  )
253
269
  return formatted_response
254
270
 
271
+ def _extract_tool_calls(self, response: Any) -> List[LLMToolCall]:
272
+ """Extract tool calls from response choices.
273
+
274
+ Args:
275
+ response: List of response choices from LiteLLM
276
+
277
+ Returns:
278
+ List of LLMToolCall objects, empty if no tool calls found
279
+ """
280
+ return [
281
+ LLMToolCall.from_litellm(tool_call)
282
+ for choice in response.choices
283
+ if choice.message.tool_calls
284
+ for tool_call in choice.message.tool_calls
285
+ ]
286
+
255
287
  def _format_text_completion_response(self, response: Any) -> LLMResponse:
256
288
  """Parses the LiteLLM text completion response to Rasa format."""
257
289
  formatted_response = LLMResponse(
@@ -39,7 +39,6 @@ class DefaultLiteLLMClient(_BaseLiteLLMClient):
39
39
 
40
40
  @classmethod
41
41
  def from_config(cls, config: Dict[str, Any]) -> DefaultLiteLLMClient:
42
- """Creates a DefaultLiteLLMClient instance from a configuration dictionary."""
43
42
  default_config = DefaultLiteLLMClientConfig.from_dict(config)
44
43
  return cls(
45
44
  model=default_config.model,
@@ -111,7 +110,6 @@ class DefaultLiteLLMClient(_BaseLiteLLMClient):
111
110
  self._litellm_model_name,
112
111
  self._litellm_extra_parameters,
113
112
  "default_litellm_llm_client",
114
- provider=self.provider,
115
113
  )
116
114
  else:
117
115
  super().validate_client_setup()
@@ -122,7 +122,9 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
122
122
  raise ProviderClientAPIException(e)
123
123
 
124
124
  @suppress_logs(log_level=logging.WARNING)
125
- def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
125
+ def completion(
126
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
127
+ ) -> LLMResponse:
126
128
  """
127
129
  Synchronously generate completions for given list of messages.
128
130
 
@@ -140,6 +142,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
140
142
  - a list of messages. Each message is a string and will be formatted
141
143
  as a user message.
142
144
  - a single message as a string which will be formatted as user message.
145
+ **kwargs: Additional parameters to pass to the completion call.
143
146
  Returns:
144
147
  List of message completions.
145
148
  Raises:
@@ -150,7 +153,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
150
153
  try:
151
154
  formatted_messages = self._format_messages(messages)
152
155
  response = self.router_client.completion(
153
- messages=formatted_messages, **self._completion_fn_args
156
+ messages=formatted_messages, **{**self._completion_fn_args, **kwargs}
154
157
  )
155
158
  return self._format_response(response)
156
159
  except Exception as e:
@@ -158,7 +161,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
158
161
 
159
162
  @suppress_logs(log_level=logging.WARNING)
160
163
  async def acompletion(
161
- self, messages: Union[List[dict], List[str], str]
164
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
162
165
  ) -> LLMResponse:
163
166
  """
164
167
  Asynchronously generate completions for given list of messages.
@@ -177,6 +180,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
177
180
  - a list of messages. Each message is a string and will be formatted
178
181
  as a user message.
179
182
  - a single message as a string which will be formatted as user message.
183
+ **kwargs: Additional parameters to pass to the completion call.
180
184
  Returns:
181
185
  List of message completions.
182
186
  Raises:
@@ -187,7 +191,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
187
191
  try:
188
192
  formatted_messages = self._format_messages(messages)
189
193
  response = await self.router_client.acompletion(
190
- messages=formatted_messages, **self._completion_fn_args
194
+ messages=formatted_messages, **{**self._completion_fn_args, **kwargs}
191
195
  )
192
196
  return self._format_response(response)
193
197
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Dict, List, Protocol, Union, runtime_checkable
3
+ from typing import Any, Dict, List, Protocol, Union, runtime_checkable
4
4
 
5
5
  from rasa.shared.providers.llm.llm_response import LLMResponse
6
6
 
@@ -32,7 +32,9 @@ class LLMClient(Protocol):
32
32
  """
33
33
  ...
34
34
 
35
- def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
35
+ def completion(
36
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
37
+ ) -> LLMResponse:
36
38
  """
37
39
  Synchronously generate completions for given list of messages.
38
40
 
@@ -48,13 +50,14 @@ class LLMClient(Protocol):
48
50
  - a list of messages. Each message is a string and will be formatted
49
51
  as a user message.
50
52
  - a single message as a string which will be formatted as user message.
53
+ **kwargs: Additional parameters to pass to the completion call.
51
54
  Returns:
52
55
  LLMResponse
53
56
  """
54
57
  ...
55
58
 
56
59
  async def acompletion(
57
- self, messages: Union[List[dict], List[str], str]
60
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
58
61
  ) -> LLMResponse:
59
62
  """
60
63
  Asynchronously generate completions for given list of messages.
@@ -71,6 +74,7 @@ class LLMClient(Protocol):
71
74
  - a list of messages. Each message is a string and will be formatted
72
75
  as a user message.
73
76
  - a single message as a string which will be formatted as user message.
77
+ **kwargs: Additional parameters to pass to the completion call.
74
78
  Returns:
75
79
  LLMResponse
76
80
  """
@@ -1,9 +1,15 @@
1
1
  import functools
2
+ import json
2
3
  import time
3
4
  from dataclasses import asdict, dataclass, field
4
5
  from typing import Any, Awaitable, Callable, Dict, List, Optional, Text, Union
5
6
 
6
7
  import structlog
8
+ from litellm.utils import ChatCompletionMessageToolCall
9
+ from pydantic import BaseModel
10
+
11
+ from rasa.shared.constants import KEY_TOOL_CALLS
12
+ from rasa.shared.exceptions import ProviderClientAPIException
7
13
 
8
14
  structlogger = structlog.get_logger()
9
15
 
@@ -38,6 +44,53 @@ class LLMUsage:
38
44
  return asdict(self)
39
45
 
40
46
 
47
+ class LLMToolCall(BaseModel):
48
+ """A class representing a response from an LLM tool call."""
49
+
50
+ id: str
51
+ """The ID of the tool call."""
52
+
53
+ tool_name: str
54
+ """The name of the tool that was called."""
55
+
56
+ tool_args: Dict[str, Any]
57
+ """The arguments passed to the tool call."""
58
+
59
+ type: str = "function"
60
+ """The type of the tool call."""
61
+
62
+ @classmethod
63
+ def from_dict(cls, data: Dict[Text, Any]) -> "LLMToolCall":
64
+ """Creates an LLMToolResponse from a dictionary."""
65
+ return cls(**data)
66
+
67
+ @classmethod
68
+ def from_litellm(cls, data: ChatCompletionMessageToolCall) -> "LLMToolCall":
69
+ """Creates an LLMToolResponse from a dictionary."""
70
+ try:
71
+ tool_args = json.loads(data.function.arguments)
72
+ except json.JSONDecodeError as e:
73
+ structlogger.error(
74
+ "llm_response.litellm_tool_call.invalid_arguments",
75
+ tool_name=data.function.name,
76
+ tool_call=data.function.arguments,
77
+ )
78
+ raise ProviderClientAPIException(
79
+ original_exception=e,
80
+ message=(
81
+ f"Invalid arguments for tool call `{data.function.name}`: "
82
+ f"`{data.function.arguments}`"
83
+ ),
84
+ )
85
+
86
+ return cls(
87
+ id=data.id,
88
+ tool_name=data.function.name,
89
+ tool_args=tool_args,
90
+ type=data.type,
91
+ )
92
+
93
+
41
94
  @dataclass
42
95
  class LLMResponse:
43
96
  id: str
@@ -62,12 +115,22 @@ class LLMResponse:
62
115
  latency: Optional[float] = None
63
116
  """Optional field to store the latency of the LLM API call."""
64
117
 
118
+ tool_calls: Optional[List[LLMToolCall]] = None
119
+ """The list of tool calls the model generated for the input prompt."""
120
+
65
121
  @classmethod
66
122
  def from_dict(cls, data: Dict[Text, Any]) -> "LLMResponse":
67
123
  """Creates an LLMResponse from a dictionary."""
68
124
  usage_data = data.get("usage", {})
69
125
  usage_obj = LLMUsage.from_dict(usage_data) if usage_data else None
70
126
 
127
+ tool_calls_data = data.get(KEY_TOOL_CALLS, [])
128
+ tool_calls_obj = (
129
+ [LLMToolCall.from_dict(tool) for tool in tool_calls_data]
130
+ if tool_calls_data
131
+ else None
132
+ )
133
+
71
134
  return cls(
72
135
  id=data["id"],
73
136
  choices=data["choices"],
@@ -76,6 +139,7 @@ class LLMResponse:
76
139
  usage=usage_obj,
77
140
  additional_info=data.get("additional_info"),
78
141
  latency=data.get("latency"),
142
+ tool_calls=tool_calls_obj,
79
143
  )
80
144
 
81
145
  @classmethod
@@ -92,6 +156,8 @@ class LLMResponse:
92
156
  result = asdict(self)
93
157
  if self.usage:
94
158
  result["usage"] = self.usage.to_dict()
159
+ if self.tool_calls:
160
+ result[KEY_TOOL_CALLS] = [tool.model_dump() for tool in self.tool_calls]
95
161
  return result
96
162
 
97
163
 
@@ -237,7 +237,7 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
237
237
  raise ProviderClientAPIException(e)
238
238
 
239
239
  async def acompletion(
240
- self, messages: Union[List[dict], List[str], str]
240
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
241
241
  ) -> LLMResponse:
242
242
  """Asynchronous completion of the model with the given messages.
243
243
 
@@ -255,15 +255,18 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
255
255
  - a list of messages. Each message is a string and will be formatted
256
256
  as a user message.
257
257
  - a single message as a string which will be formatted as user message.
258
+ **kwargs: Additional parameters to pass to the completion call.
258
259
 
259
260
  Returns:
260
261
  The completion response.
261
262
  """
262
263
  if self._use_chat_completions_endpoint:
263
- return await super().acompletion(messages)
264
+ return await super().acompletion(messages, **kwargs)
264
265
  return await self._atext_completion(messages)
265
266
 
266
- def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
267
+ def completion(
268
+ self, messages: Union[List[dict], List[str], str], **kwargs: Any
269
+ ) -> LLMResponse:
267
270
  """Completion of the model with the given messages.
268
271
 
269
272
  Method overrides the base class method to call the appropriate
@@ -273,12 +276,13 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
273
276
 
274
277
  Args:
275
278
  messages: The messages to be used for completion.
279
+ **kwargs: Additional parameters to pass to the completion call.
276
280
 
277
281
  Returns:
278
282
  The completion response.
279
283
  """
280
284
  if self._use_chat_completions_endpoint:
281
- return super().completion(messages)
285
+ return super().completion(messages, **kwargs)
282
286
  return self._text_completion(messages)
283
287
 
284
288
  @staticmethod
@@ -1,7 +1,10 @@
1
1
  import os
2
- from typing import Any, Dict, Optional
2
+ from typing import TYPE_CHECKING, Any, Dict, Optional
3
3
 
4
4
  from rasa.exceptions import HealthCheckError
5
+
6
+ if TYPE_CHECKING:
7
+ pass
5
8
  from rasa.shared.constants import (
6
9
  LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
7
10
  LLM_API_HEALTH_CHECK_ENV_VAR,
@@ -63,6 +66,7 @@ def perform_llm_health_check(
63
66
  log_source_component: str,
64
67
  ) -> None:
65
68
  """Try to instantiate the LLM Client to validate the provided config.
69
+
66
70
  If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
67
71
  to the LLM API. If config contains multiple models, perform a test call for each
68
72
  model in the model group.
@@ -125,6 +129,7 @@ def perform_embeddings_health_check(
125
129
  log_source_component: str,
126
130
  ) -> None:
127
131
  """Try to instantiate the Embedder to validate the provided config.
132
+
128
133
  If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
129
134
  to the Embeddings API. If config contains multiple models, perform a test call for
130
135
  each model in the model group.
@@ -240,8 +245,7 @@ def send_test_embeddings_api_request(
240
245
 
241
246
 
242
247
  def is_api_health_check_enabled() -> bool:
243
- """Determines whether the API health check is enabled based on an environment
244
- variable.
248
+ """Determines whether the API health check is enabled.
245
249
 
246
250
  Returns:
247
251
  bool: True if the API health check is enabled, False otherwise.
rasa/shared/utils/llm.py CHANGED
@@ -49,7 +49,15 @@ from rasa.shared.constants import (
49
49
  RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
50
50
  ROUTER_CONFIG_KEY,
51
51
  )
52
- from rasa.shared.core.events import BotUttered, UserUttered
52
+ from rasa.shared.core.events import (
53
+ AgentCancelled,
54
+ AgentCompleted,
55
+ AgentInterrupted,
56
+ AgentResumed,
57
+ AgentStarted,
58
+ BotUttered,
59
+ UserUttered,
60
+ )
53
61
  from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, Slot
54
62
  from rasa.shared.engine.caching import get_local_cache_location
55
63
  from rasa.shared.exceptions import (
@@ -112,7 +120,7 @@ DEPLOYMENT_CENTRIC_PROVIDERS = [AZURE_OPENAI_PROVIDER]
112
120
 
113
121
  # Placeholder messages used in the transcript for
114
122
  # instances where user input results in an error
115
- ERROR_PLACEHOLDER = {
123
+ ERROR_PLACEHOLDER: Dict[str, str] = {
116
124
  RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG: "[User sent really long message]",
117
125
  RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY: "",
118
126
  "default": "[User input triggered an error]",
@@ -225,6 +233,7 @@ def tracker_as_readable_transcript(
225
233
  ai_prefix: str = AI,
226
234
  max_turns: Optional[int] = 20,
227
235
  turns_wrapper: Optional[Callable[[List[str]], List[str]]] = None,
236
+ highlight_agent_turns: bool = False,
228
237
  ) -> str:
229
238
  """Creates a readable dialogue from a tracker.
230
239
 
@@ -234,6 +243,7 @@ def tracker_as_readable_transcript(
234
243
  ai_prefix: the prefix to use for ai utterances
235
244
  max_turns: the maximum number of turns to include in the transcript
236
245
  turns_wrapper: optional function to wrap the turns in a custom way
246
+ highlight_agent_turns: whether to highlight agent turns in the transcript
237
247
 
238
248
  Example:
239
249
  >>> tracker = Tracker(
@@ -251,7 +261,9 @@ def tracker_as_readable_transcript(
251
261
  Returns:
252
262
  A string representing the transcript of the tracker
253
263
  """
254
- transcript = []
264
+ transcript: List[str] = []
265
+
266
+ current_ai_prefix = ai_prefix
255
267
 
256
268
  # using `applied_events` rather than `events` means that only events after the
257
269
  # most recent `Restart` or `SessionStarted` are included in the transcript
@@ -266,9 +278,20 @@ def tracker_as_readable_transcript(
266
278
  else:
267
279
  message = sanitize_message_for_prompt(event.text)
268
280
  transcript.append(f"{human_prefix}: {message}")
269
-
270
281
  elif isinstance(event, BotUttered):
271
- transcript.append(f"{ai_prefix}: {sanitize_message_for_prompt(event.text)}")
282
+ transcript.append(
283
+ f"{current_ai_prefix}: {sanitize_message_for_prompt(event.text)}"
284
+ )
285
+
286
+ if highlight_agent_turns:
287
+ if isinstance(event, AgentStarted) or isinstance(event, AgentResumed):
288
+ current_ai_prefix = event.agent_id
289
+ elif (
290
+ isinstance(event, AgentCompleted)
291
+ or isinstance(event, AgentCancelled)
292
+ or isinstance(event, AgentInterrupted)
293
+ ):
294
+ current_ai_prefix = ai_prefix
272
295
 
273
296
  # turns_wrapper to count multiple utterances by bot/user as single turn
274
297
  if turns_wrapper:
@@ -0,0 +1,186 @@
1
+ """MCP server connection utilities."""
2
+
3
+ import asyncio
4
+ import warnings
5
+ from contextlib import AsyncExitStack
6
+ from typing import Any, Dict, Optional
7
+
8
+ import structlog
9
+ from mcp import ClientSession
10
+ from mcp.client.streamable_http import streamablehttp_client
11
+
12
+ structlogger = structlog.get_logger()
13
+
14
+
15
+ # Suppress RuntimeWarning about unawaited coroutines when MCP server is not reachable.
16
+ warnings.filterwarnings(
17
+ "ignore",
18
+ message=".*BaseEventLoop.create_server.*was never awaited.*",
19
+ category=RuntimeWarning,
20
+ )
21
+
22
+
23
+ class MCPServerConnection:
24
+ """
25
+ Manages connection to an MCP server.
26
+
27
+ This class handles the lifecycle of connections to MCP servers,
28
+ including connection establishment, session management, and cleanup.
29
+ """
30
+
31
+ # Timeout for ping operations in seconds
32
+ PING_TIMEOUT_SECONDS = 3.0
33
+
34
+ def __init__(self, server_name: str, server_url: str, server_type: str):
35
+ """
36
+ Initialize the MCP server connection.
37
+
38
+ Args:
39
+ server_name: Server name to identify the server
40
+ server_url: Server URL
41
+ server_type: Server type (currently only 'http' is supported)
42
+ """
43
+ self.server_name = server_name
44
+ self.server_url = server_url
45
+ self.server_type = server_type
46
+ self.session: Optional[ClientSession] = None
47
+ self.exit_stack: Optional[AsyncExitStack] = None
48
+
49
+ @classmethod
50
+ def from_config(cls, server_config: Dict[str, Any]) -> "MCPServerConnection":
51
+ """Initialize the MCP server connection from a configuration dictionary."""
52
+ return cls(
53
+ server_config["name"],
54
+ server_config["url"],
55
+ server_config.get("type", "http"),
56
+ )
57
+
58
+ async def connect(self) -> None:
59
+ """Establish connection to the MCP server.
60
+
61
+ Raises:
62
+ ValueError: If the server type is not supported.
63
+ ConnectionError: If connection fails.
64
+ """
65
+ if self.server_type != "http":
66
+ raise ValueError(f"Unsupported server type: {self.server_type}")
67
+
68
+ # Create a new exit stack for this connection to avoid task boundary issues
69
+ self.exit_stack = AsyncExitStack()
70
+
71
+ try:
72
+ read_stream, write_stream, _ = await self.exit_stack.enter_async_context(
73
+ streamablehttp_client(self.server_url)
74
+ )
75
+ self.session = await self.exit_stack.enter_async_context(
76
+ ClientSession(read_stream, write_stream)
77
+ )
78
+ await self.session.initialize()
79
+ except asyncio.CancelledError as e:
80
+ event_info = f"Connection to MCP server `{self.server_name}` was cancelled."
81
+ structlogger.error(
82
+ "mcp_server_connection.connect.connection_cancelled",
83
+ event_info=event_info,
84
+ server_name=self.server_name,
85
+ server_url=self.server_url,
86
+ )
87
+ # Clean up on cancellation
88
+ await self._cleanup()
89
+ raise ConnectionError(e) from e
90
+
91
+ except Exception as e:
92
+ event_info = f"Failed to connect to MCP server `{self.server_name}`: {e}"
93
+ structlogger.error(
94
+ "mcp_server_connection.connect.connection_failed",
95
+ event_info=event_info,
96
+ server_name=self.server_name,
97
+ server_url=self.server_url,
98
+ )
99
+ # Clean up on error
100
+ await self._cleanup()
101
+ raise ConnectionError(e) from e
102
+
103
+ async def ensure_active_session(self) -> ClientSession:
104
+ """
105
+ Ensure an active session is available.
106
+
107
+ If no session exists or the current session is inactive,
108
+ a new connection will be established.
109
+
110
+ Returns:
111
+ Active ClientSession instance.
112
+ """
113
+ if self.session is None:
114
+ await self.connect()
115
+ structlogger.info(
116
+ "mcp_server_connection.ensure_active_session.no_session",
117
+ server_name=self.server_name,
118
+ server_url=self.server_url,
119
+ event_info=(
120
+ "No session found, connecting to the server "
121
+ f"`{self.server_name}` @ `{self.server_url}`"
122
+ ),
123
+ )
124
+ if self.session:
125
+ try:
126
+ # Add timeout to prevent hanging when MCP server is down
127
+ await asyncio.wait_for(
128
+ self.session.send_ping(), timeout=self.PING_TIMEOUT_SECONDS
129
+ )
130
+ except asyncio.TimeoutError as e:
131
+ structlogger.error(
132
+ "mcp_server_connection.ensure_active_session.ping_timeout",
133
+ server_name=self.server_name,
134
+ server_url=self.server_url,
135
+ event_info=(
136
+ "Ping timed out, Server not reachable - "
137
+ f"`{self.server_name}` @ `{self.server_url}`"
138
+ ),
139
+ )
140
+ raise e
141
+ except Exception as e:
142
+ structlogger.warning(
143
+ "mcp_server_connection.ensure_active_session.ping_failed",
144
+ error=str(e),
145
+ server_name=self.server_name,
146
+ server_url=self.server_url,
147
+ event_info=(
148
+ "Ping failed, trying to reconnect to the server "
149
+ f"`{self.server_name}` @ `{self.server_url}`"
150
+ ),
151
+ )
152
+ # Cleanup existing session
153
+ await self.close()
154
+ # Attempt to reconnect now
155
+ await self.connect()
156
+ structlogger.info(
157
+ "mcp_server_connection.ensure_active_session.reconnected",
158
+ server_name=self.server_name,
159
+ server_url=self.server_url,
160
+ event_info=(
161
+ "Reconnected to the server "
162
+ f"`{self.server_name}` @ `{self.server_url}`"
163
+ ),
164
+ )
165
+ assert self.session is not None # Ensures type for mypy
166
+ return self.session
167
+
168
+ async def close(self) -> None:
169
+ """Close the connection and clean up resources."""
170
+ await self._cleanup()
171
+
172
+ async def _cleanup(self) -> None:
173
+ """Internal cleanup method to safely close resources."""
174
+ if self.exit_stack:
175
+ try:
176
+ await self.exit_stack.aclose()
177
+ except Exception as e:
178
+ # Log cleanup errors but don't raise them
179
+ structlogger.warning(
180
+ "mcp_server_connection.cleanup.failed",
181
+ server_name=self.server_name,
182
+ error=str(e),
183
+ )
184
+ finally:
185
+ self.exit_stack = None
186
+ self.session = None