rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev6__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 (464) 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 +8 -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 +684 -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 +72 -0
  20. rasa/api.py +5 -0
  21. rasa/cli/arguments/default_arguments.py +12 -0
  22. rasa/cli/arguments/run.py +2 -0
  23. rasa/cli/dialogue_understanding_test.py +4 -0
  24. rasa/cli/e2e_test.py +4 -0
  25. rasa/cli/inspect.py +3 -0
  26. rasa/cli/llm_fine_tuning.py +5 -0
  27. rasa/cli/project_templates/tutorial/config.yml +1 -2
  28. rasa/cli/run.py +4 -0
  29. rasa/cli/scaffold.py +2 -46
  30. rasa/cli/shell.py +3 -0
  31. rasa/constants.py +6 -0
  32. rasa/core/actions/action.py +56 -10
  33. rasa/core/agent.py +19 -1
  34. rasa/core/available_agents.py +199 -0
  35. rasa/core/available_endpoints.py +30 -0
  36. rasa/core/channels/channel.py +3 -4
  37. rasa/core/channels/development_inspector.py +4 -4
  38. rasa/core/channels/hangouts.py +2 -2
  39. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-63212852.js} +1 -1
  40. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-eecf6b13.js} +1 -1
  41. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-8f798a9a.js} +1 -1
  42. rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +1 -0
  43. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-df71a04c.js} +1 -1
  44. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-9b275968.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +1 -0
  46. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-1c669cad.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-b1553799.js} +1 -1
  48. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-112388d6.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-fdebec47.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-6280ede1.js} +1 -1
  51. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +1 -0
  52. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-e1dc03e5.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-83f68c51.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-22f8666f.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-ca9e6217.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-c5ceb692.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/index-3e293924.js +1353 -0
  58. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-faa9999b.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c4dda8d9.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-d4307784.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0567aaa7.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-c11b95cf.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-0c7d3ca9.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-34b433fa.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-4cab816e.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-8c22fa9e.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-70ce9e8e.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fbcd7fc9.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-45f05ea6.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-beab1ea6.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-2f29dbd5.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-951eac83.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-897fbfdd.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d667fac1.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e3205144.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-4abeb0e2.js} +1 -1
  77. rasa/core/channels/inspector/dist/index.html +2 -2
  78. rasa/core/channels/inspector/index.html +1 -1
  79. rasa/core/channels/inspector/src/App.tsx +11 -10
  80. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
  81. rasa/core/channels/inspector/src/components/DialogueStack.tsx +6 -4
  82. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  83. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  84. rasa/core/channels/inspector/src/types.ts +4 -0
  85. rasa/core/channels/socketio.py +51 -212
  86. rasa/core/channels/studio_chat.py +29 -49
  87. rasa/core/channels/voice_stream/genesys.py +1 -1
  88. rasa/core/channels/voice_stream/voice_channel.py +3 -5
  89. rasa/core/constants.py +4 -0
  90. rasa/core/policies/enterprise_search_policy.py +11 -6
  91. rasa/core/policies/flow_policy.py +4 -4
  92. rasa/core/policies/flows/flow_executor.py +470 -45
  93. rasa/core/policies/flows/mcp_tool_executor.py +277 -0
  94. rasa/core/policies/intentless_policy.py +1 -1
  95. rasa/core/policies/unexpected_intent_policy.py +1 -0
  96. rasa/core/processor.py +18 -15
  97. rasa/core/run.py +11 -14
  98. rasa/core/tracker_stores/tracker_store.py +3 -7
  99. rasa/core/train.py +1 -1
  100. rasa/core/training/interactive.py +16 -16
  101. rasa/core/training/story_conflict.py +5 -5
  102. rasa/core/utils.py +21 -1
  103. rasa/dialogue_understanding/commands/__init__.py +8 -0
  104. rasa/dialogue_understanding/commands/cancel_flow_command.py +97 -4
  105. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
  106. rasa/dialogue_understanding/commands/clarify_command.py +10 -0
  107. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  108. rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
  109. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  110. rasa/dialogue_understanding/commands/start_flow_command.py +164 -8
  111. rasa/dialogue_understanding/commands/utils.py +6 -2
  112. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  113. rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
  114. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  115. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  116. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  117. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
  118. 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
  119. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
  120. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
  121. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
  122. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
  123. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
  124. rasa/dialogue_understanding/patterns/continue_interrupted.py +163 -1
  125. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +52 -8
  126. rasa/dialogue_understanding/processor/command_processor.py +31 -15
  127. rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
  128. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  129. rasa/dialogue_understanding/stack/utils.py +17 -2
  130. rasa/dialogue_understanding_test/du_test_runner.py +7 -2
  131. rasa/e2e_test/e2e_test_runner.py +12 -2
  132. rasa/engine/caching.py +2 -2
  133. rasa/engine/recipes/default_components.py +10 -18
  134. rasa/engine/storage/local_model_storage.py +2 -45
  135. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  136. rasa/hooks.py +5 -5
  137. rasa/llm_fine_tuning/utils.py +2 -2
  138. rasa/model_manager/model_api.py +5 -4
  139. rasa/model_manager/runner_service.py +1 -1
  140. rasa/model_manager/socket_bridge.py +14 -20
  141. rasa/model_manager/trainer_service.py +9 -12
  142. rasa/model_manager/utils.py +29 -1
  143. rasa/model_manager/warm_rasa_process.py +1 -1
  144. rasa/nlu/extractors/extractor.py +2 -1
  145. rasa/plugin.py +8 -8
  146. rasa/privacy/privacy_manager.py +11 -2
  147. rasa/server.py +14 -2
  148. rasa/shared/agents/utils.py +35 -0
  149. rasa/shared/constants.py +5 -0
  150. rasa/shared/core/constants.py +12 -1
  151. rasa/shared/core/domain.py +11 -58
  152. rasa/shared/core/events.py +327 -0
  153. rasa/shared/core/flows/flow_step.py +1 -7
  154. rasa/shared/core/flows/flows_list.py +15 -5
  155. rasa/shared/core/flows/flows_yaml_schema.json +112 -186
  156. rasa/shared/core/flows/steps/call.py +53 -5
  157. rasa/shared/core/flows/validation.py +177 -7
  158. rasa/shared/core/flows/yaml_flows_io.py +9 -17
  159. rasa/shared/core/slots.py +2 -6
  160. rasa/shared/core/trackers.py +5 -2
  161. rasa/shared/exceptions.py +4 -0
  162. rasa/shared/importers/importer.py +0 -6
  163. rasa/shared/importers/rasa.py +1 -1
  164. rasa/shared/importers/utils.py +10 -80
  165. rasa/shared/providers/_utils.py +44 -60
  166. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
  167. rasa/shared/providers/llm/_base_litellm_client.py +39 -7
  168. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
  169. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  170. rasa/shared/providers/llm/llm_client.py +7 -3
  171. rasa/shared/providers/llm/llm_response.py +66 -0
  172. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  173. rasa/shared/utils/llm.py +28 -5
  174. rasa/shared/utils/mcp/server_connection.py +166 -0
  175. rasa/shared/utils/schemas/events.py +42 -0
  176. rasa/shared/utils/yaml.py +3 -1
  177. rasa/studio/upload.py +47 -16
  178. rasa/telemetry.py +23 -97
  179. rasa/tracing/instrumentation/instrumentation.py +14 -10
  180. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  181. rasa/utils/common.py +79 -0
  182. rasa/utils/io.py +9 -27
  183. rasa/utils/json_utils.py +1 -6
  184. rasa/utils/log_utils.py +2 -6
  185. rasa/utils/ml_utils.py +1 -1
  186. rasa/utils/tensorflow/rasa_layers.py +1 -1
  187. rasa/utils/train_utils.py +15 -15
  188. rasa/validator.py +19 -21
  189. rasa/version.py +1 -1
  190. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/METADATA +14 -17
  191. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/RECORD +201 -432
  192. rasa/builder/README.md +0 -120
  193. rasa/builder/auth.py +0 -176
  194. rasa/builder/config.py +0 -115
  195. rasa/builder/copilot/constants.py +0 -25
  196. rasa/builder/copilot/copilot.py +0 -372
  197. rasa/builder/copilot/copilot_response_handler.py +0 -487
  198. rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
  199. rasa/builder/copilot/exceptions.py +0 -20
  200. rasa/builder/copilot/models.py +0 -431
  201. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
  202. rasa/builder/copilot/telemetry.py +0 -195
  203. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
  204. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
  205. rasa/builder/document_retrieval/constants.py +0 -15
  206. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
  207. rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
  208. rasa/builder/document_retrieval/models.py +0 -62
  209. rasa/builder/download.py +0 -140
  210. rasa/builder/exceptions.py +0 -55
  211. rasa/builder/guardrails/__init__.py +0 -1
  212. rasa/builder/guardrails/constants.py +0 -3
  213. rasa/builder/guardrails/exceptions.py +0 -4
  214. rasa/builder/guardrails/lakera.py +0 -206
  215. rasa/builder/guardrails/models.py +0 -199
  216. rasa/builder/guardrails/utils.py +0 -305
  217. rasa/builder/job_manager.py +0 -87
  218. rasa/builder/jobs.py +0 -234
  219. rasa/builder/llm_service.py +0 -246
  220. rasa/builder/logging_utils.py +0 -209
  221. rasa/builder/main.py +0 -174
  222. rasa/builder/models.py +0 -197
  223. rasa/builder/project_generator.py +0 -450
  224. rasa/builder/project_info.py +0 -72
  225. rasa/builder/scrape_rasa_docs.py +0 -97
  226. rasa/builder/service.py +0 -1142
  227. rasa/builder/shared/tracker_context.py +0 -212
  228. rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
  229. rasa/builder/training_service.py +0 -132
  230. rasa/builder/validation_service.py +0 -93
  231. rasa/cli/project_templates/basic/actions/action_api.py +0 -15
  232. rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
  233. rasa/cli/project_templates/basic/config.yml +0 -23
  234. rasa/cli/project_templates/basic/credentials.yml +0 -34
  235. rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
  236. rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
  237. rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
  238. rasa/cli/project_templates/basic/data/general/help.yml +0 -6
  239. rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
  240. rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
  241. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
  242. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
  243. rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
  244. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
  245. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
  246. rasa/cli/project_templates/basic/docs/template.txt +0 -7
  247. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
  248. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
  249. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
  250. rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
  251. rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
  252. rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
  253. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
  254. rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
  255. rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
  256. rasa/cli/project_templates/basic/endpoints.yml +0 -73
  257. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  258. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  259. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  260. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  261. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  262. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  263. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  264. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  265. rasa/cli/project_templates/finance/actions/database.py +0 -277
  266. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  267. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  268. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  269. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  270. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  271. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  272. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
  273. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  274. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  275. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  276. rasa/cli/project_templates/finance/config.yml +0 -21
  277. rasa/cli/project_templates/finance/credentials.yml +0 -32
  278. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  279. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  280. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  281. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  282. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  283. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  284. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  285. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  286. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
  287. rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
  288. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  289. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  290. rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
  291. rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
  292. rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
  293. rasa/cli/project_templates/finance/data/general/help.yml +0 -9
  294. rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
  295. rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
  296. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  297. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
  298. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
  299. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
  300. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
  301. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  302. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  303. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  304. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  305. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  306. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  307. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  308. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  309. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  310. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  311. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  312. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
  313. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  314. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  315. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  316. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  317. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  318. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  319. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  320. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  321. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  322. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  323. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  324. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  325. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  326. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  327. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  328. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  329. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  330. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  331. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  332. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  333. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  334. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  335. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  336. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  337. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  338. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  339. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  340. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  341. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  342. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  343. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  344. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  345. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  346. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  347. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  348. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  349. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  350. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  351. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  352. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  353. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  354. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  355. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  356. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  357. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  358. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  359. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  360. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  361. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  362. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  363. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  364. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  365. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  366. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  367. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  368. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  369. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  370. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  371. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  372. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  373. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  374. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  375. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  376. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  377. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  378. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  379. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  380. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  381. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  382. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  383. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  384. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  385. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  386. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  387. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  388. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  389. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  390. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  391. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  392. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  393. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  394. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
  395. rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
  396. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  397. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  398. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  399. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
  400. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  401. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
  402. rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
  403. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  404. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
  405. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  406. rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
  407. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  408. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  409. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  410. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
  411. rasa/cli/project_templates/finance/endpoints.yml +0 -63
  412. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  413. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  414. rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
  415. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
  416. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
  417. rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
  418. rasa/cli/project_templates/telco/config.yml +0 -25
  419. rasa/cli/project_templates/telco/credentials.yml +0 -33
  420. rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
  421. rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
  422. rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
  423. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
  424. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
  425. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
  426. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
  427. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
  428. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
  429. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
  430. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
  431. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
  432. rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
  433. rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
  434. rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
  435. rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
  436. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
  437. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
  438. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
  439. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
  440. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
  441. rasa/cli/project_templates/telco/endpoints.yml +0 -60
  442. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
  443. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
  444. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
  445. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
  446. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
  447. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
  448. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
  449. rasa/core/channels/constants.py +0 -3
  450. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  451. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  452. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  453. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  454. rasa/utils/openapi.py +0 -144
  455. /rasa/{builder → agents}/__init__.py +0 -0
  456. /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
  457. /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
  458. /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
  459. /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
  460. /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
  461. /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
  462. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/NOTICE +0 -0
  463. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/WHEEL +0 -0
  464. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,277 @@
1
+ import json
2
+ import operator
3
+ from functools import reduce
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ import structlog
7
+ from mcp.types import CallToolResult
8
+
9
+ from rasa.core.available_endpoints import AvailableEndpoints
10
+ from rasa.core.policies.flows.flow_step_result import (
11
+ ContinueFlowWithNextStep,
12
+ FlowStepResult,
13
+ )
14
+ from rasa.dialogue_understanding.patterns.internal_error import (
15
+ InternalErrorPatternFlowStackFrame,
16
+ )
17
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
18
+ from rasa.shared.core.events import Event, SlotSet
19
+ from rasa.shared.core.flows.steps import CallFlowStep
20
+ from rasa.shared.core.trackers import DialogueStateTracker
21
+ from rasa.shared.utils.mcp.server_connection import MCPServerConnection
22
+ from rasa.utils.common import ensure_jsonified_iterable
23
+
24
+ structlogger = structlog.get_logger()
25
+
26
+ CONFIG_RESULT_KEY = "result_key"
27
+ CONFIG_SLOT = "slot"
28
+
29
+
30
+ async def call_mcp_tool(
31
+ initial_events: List[Event],
32
+ stack: DialogueStack,
33
+ step: CallFlowStep,
34
+ tracker: DialogueStateTracker,
35
+ ) -> FlowStepResult:
36
+ """Run an MCP tool call step."""
37
+ structlogger.debug(
38
+ "flow.step.call_mcp_tool",
39
+ tool_id=step.call,
40
+ mcp_server=step.mcp_server,
41
+ mapping=step.mapping,
42
+ step_id=step.id,
43
+ flow_id=step.flow_id,
44
+ )
45
+
46
+ try:
47
+ return await _execute_mcp_tool_call(initial_events, stack, step, tracker)
48
+ except Exception as e:
49
+ return _handle_mcp_tool_error(
50
+ stack,
51
+ initial_events,
52
+ error_message=f"Failed to execute MCP tool call: {e}.",
53
+ tool_name=step.call,
54
+ mcp_server=step.mcp_server,
55
+ )
56
+
57
+
58
+ async def _execute_mcp_tool_call(
59
+ initial_events: List[Event],
60
+ stack: DialogueStack,
61
+ step: CallFlowStep,
62
+ tracker: DialogueStateTracker,
63
+ ) -> FlowStepResult:
64
+ """Execute the MCP tool call with proper error handling."""
65
+ mcp_server_connection = None
66
+ try:
67
+ # Connect to the MCP server
68
+ mcp_server_connection = await _connect_to_mcp_server(step.mcp_server)
69
+
70
+ if not mcp_server_connection:
71
+ return _handle_mcp_tool_error(
72
+ stack,
73
+ initial_events,
74
+ f"Cannot connect to MCP server '{step.mcp_server}'.",
75
+ tool_name=step.call,
76
+ mcp_server=step.mcp_server,
77
+ )
78
+
79
+ # Validate tool availability
80
+ if not await _is_tool_available(mcp_server_connection, step.call):
81
+ return _handle_mcp_tool_error(
82
+ stack,
83
+ initial_events,
84
+ f"Tool '{step.call}' is not available on MCP server "
85
+ f"'{step.mcp_server}'.",
86
+ tool_name=step.call,
87
+ mcp_server=step.mcp_server,
88
+ )
89
+
90
+ # This should not happen, but we need to check for type checking to pass
91
+ if not step.mapping:
92
+ return _handle_mcp_tool_error(
93
+ stack,
94
+ initial_events,
95
+ f"No mapping found for tool '{step.call}'.",
96
+ tool_name=step.call,
97
+ mcp_server=step.mcp_server,
98
+ )
99
+
100
+ # Prepare arguments for the tool call
101
+ arguments = _prepare_tool_arguments(step.mapping["input"], tracker)
102
+
103
+ # Call the tool with parameters
104
+ mcp_server = await mcp_server_connection.ensure_active_session()
105
+ result = await mcp_server.call_tool(step.call, arguments)
106
+
107
+ # Handle tool execution result
108
+ if result is None or result.isError:
109
+ return _handle_mcp_tool_error(
110
+ stack,
111
+ initial_events,
112
+ f"Tool '{step.call}' execution failed: {result.content}.",
113
+ tool_name=step.call,
114
+ mcp_server=step.mcp_server,
115
+ )
116
+ elif not result.content:
117
+ structlogger.warning(
118
+ "call_mcp_tool.empty_tool_result",
119
+ tool_name=step.call,
120
+ mcp_server=step.mcp_server,
121
+ )
122
+ else:
123
+ structlogger.debug(
124
+ "call_mcp_tool.tool_execution_success",
125
+ tool_name=step.call,
126
+ mcp_server=step.mcp_server,
127
+ result_content=result.content,
128
+ result_structured_content=result.structuredContent,
129
+ )
130
+
131
+ # Process successful result
132
+ if set_slot_event := _process_tool_result(result, step.mapping["output"]):
133
+ initial_events.extend(set_slot_event)
134
+ else:
135
+ return _handle_mcp_tool_error(
136
+ stack,
137
+ initial_events,
138
+ f"Failed to process tool result for '{step.call}'.",
139
+ tool_name=step.call,
140
+ mcp_server=step.mcp_server,
141
+ )
142
+
143
+ return ContinueFlowWithNextStep(events=initial_events)
144
+
145
+ finally:
146
+ # Always clean up the connection to prevent resource leaks
147
+ if mcp_server_connection:
148
+ try:
149
+ await mcp_server_connection.close()
150
+ except Exception as e:
151
+ structlogger.warning(
152
+ "call_mcp_tool.connection_cleanup_failed",
153
+ tool_name=step.call,
154
+ mcp_server=step.mcp_server,
155
+ error=str(e),
156
+ )
157
+
158
+
159
+ async def _is_tool_available(
160
+ mcp_server_connection: MCPServerConnection, tool_name: str
161
+ ) -> bool:
162
+ """Check if the specified tool is available on the MCP server."""
163
+ try:
164
+ # Get the active session from the connection
165
+ mcp_server = await mcp_server_connection.ensure_active_session()
166
+ available_tools = await mcp_server.list_tools()
167
+ tool_names = [tool.name for tool in available_tools.tools]
168
+ return tool_name in tool_names
169
+ except Exception as e:
170
+ structlogger.warning(
171
+ "call_mcp_tool.tool_availability_check_failed",
172
+ tool_name=tool_name,
173
+ error=str(e),
174
+ )
175
+ return False
176
+
177
+
178
+ async def _connect_to_mcp_server(
179
+ mcp_server_name: Optional[str],
180
+ ) -> Optional[MCPServerConnection]:
181
+ """Connect to the MCP server."""
182
+ if not mcp_server_name:
183
+ return None
184
+
185
+ # get the MCP server config from the available endpoints
186
+ endpoints = AvailableEndpoints.get_instance()
187
+ mcp_servers = endpoints.mcp_servers
188
+ if not mcp_servers:
189
+ return None
190
+
191
+ mcp_server_configs = [
192
+ mcp_server for mcp_server in mcp_servers if mcp_server.name == mcp_server_name
193
+ ]
194
+ if not mcp_server_configs or len(mcp_server_configs) != 1:
195
+ return None
196
+
197
+ mcp_server_config = mcp_server_configs[0]
198
+ mcp_server_connection = MCPServerConnection(
199
+ mcp_server_config.name, mcp_server_config.url, mcp_server_config.type
200
+ )
201
+
202
+ # Ensure the connection is established and return the connection object
203
+ await mcp_server_connection.ensure_active_session()
204
+ return mcp_server_connection
205
+
206
+
207
+ def _prepare_tool_arguments(
208
+ input_mapping: List[Dict[str, str]], tracker: DialogueStateTracker
209
+ ) -> Dict[str, Any]:
210
+ """Prepare arguments for the tool call from slot values."""
211
+ arguments = {}
212
+ for argument in input_mapping:
213
+ slot_value = tracker.get_slot(argument["slot"])
214
+ arguments[argument["param"]] = slot_value
215
+ return arguments
216
+
217
+
218
+ def _jsonify_slot_value(value: Any) -> str | int | float | bool | None:
219
+ """Prepare value for SlotSet: iterables -> JSON string, primitives -> as-is"""
220
+ if isinstance(value, (list, dict)) and len(value):
221
+ return json.dumps(ensure_jsonified_iterable(value))
222
+ return value
223
+
224
+
225
+ def _process_tool_result(
226
+ result: CallToolResult,
227
+ output_mapping: List[Dict[str, str]],
228
+ ) -> Optional[List[SlotSet]]:
229
+ """Create a SetSlot event for the tool result."""
230
+ try:
231
+ _result_as_dict = {"result": result.model_dump()}
232
+ slots = []
233
+ for mapping in output_mapping:
234
+ try:
235
+ # Use reduce to navigate through nested keys in the result
236
+ slot_value = reduce(
237
+ operator.getitem,
238
+ mapping[CONFIG_RESULT_KEY].split("."),
239
+ _result_as_dict,
240
+ )
241
+ slots.append(
242
+ SlotSet(mapping[CONFIG_SLOT], _jsonify_slot_value(slot_value))
243
+ )
244
+ except (KeyError, TypeError):
245
+ structlogger.error(
246
+ "call_mcp_tool.result_key_not_found_in_tool_result",
247
+ slot=mapping[CONFIG_SLOT],
248
+ result_key=mapping[CONFIG_RESULT_KEY],
249
+ result=_result_as_dict,
250
+ )
251
+ return None
252
+ return slots
253
+ except Exception as e:
254
+ structlogger.error(
255
+ "call_mcp_tool.result_processing_failed",
256
+ error=str(e),
257
+ result=result,
258
+ )
259
+ return None
260
+
261
+
262
+ def _handle_mcp_tool_error(
263
+ stack: DialogueStack,
264
+ events: List[Event],
265
+ error_message: str,
266
+ tool_name: str,
267
+ mcp_server: Optional[str],
268
+ ) -> FlowStepResult:
269
+ """Handle MCP tool errors consistently."""
270
+ structlogger.error(
271
+ "call_mcp_tool.error",
272
+ error_message=error_message,
273
+ tool_name=tool_name,
274
+ mcp_server=mcp_server,
275
+ )
276
+ stack.push(InternalErrorPatternFlowStackFrame())
277
+ return ContinueFlowWithNextStep(events=events)
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple
5
5
 
6
6
  import structlog
7
7
  import tiktoken
8
- from deprecated import deprecated # type: ignore[import]
8
+ from deprecated import deprecated # type: ignore[import-untyped]
9
9
  from jinja2 import Template
10
10
  from langchain.docstore.document import Document
11
11
  from langchain.schema.embeddings import Embeddings
@@ -624,6 +624,7 @@ class UnexpecTEDIntentPolicy(TEDPolicy):
624
624
  query_intent = (
625
625
  last_user_uttered_event.intent_name
626
626
  if last_user_uttered_event is not None
627
+ and isinstance(last_user_uttered_event, UserUttered)
627
628
  else ""
628
629
  )
629
630
  is_unlikely_intent = self._check_unlikely_intent(
rasa/core/processor.py CHANGED
@@ -69,6 +69,7 @@ from rasa.shared.constants import (
69
69
  UTTER_PREFIX,
70
70
  )
71
71
  from rasa.shared.core.constants import (
72
+ ACTION_AGENT_REQUEST_USER_INPUT_NAME,
72
73
  ACTION_CORRECT_FLOW_SLOT,
73
74
  ACTION_EXTRACT_SLOTS,
74
75
  ACTION_LISTEN_NAME,
@@ -729,7 +730,7 @@ class MessageProcessor:
729
730
  if not self.domain or self.domain.is_empty():
730
731
  return
731
732
 
732
- intent = parse_data["intent"][INTENT_NAME_KEY]
733
+ intent = parse_data[INTENT][INTENT_NAME_KEY]
733
734
  if intent and intent not in self.domain.intents:
734
735
  rasa.shared.utils.io.raise_warning(
735
736
  f"Parsed an intent '{intent}' "
@@ -738,7 +739,7 @@ class MessageProcessor:
738
739
  docs=DOCS_URL_DOMAINS,
739
740
  )
740
741
 
741
- entities = parse_data["entities"] or []
742
+ entities = parse_data[ENTITIES] or []
742
743
  for element in entities:
743
744
  entity = element["entity"]
744
745
  if entity and entity not in self.domain.entities:
@@ -822,9 +823,9 @@ class MessageProcessor:
822
823
  self._update_full_retrieval_intent(parse_data)
823
824
  structlogger.debug(
824
825
  "processor.message.parse",
825
- parse_data_text=copy.deepcopy(parse_data["text"]),
826
- parse_data_intent=parse_data["intent"],
827
- parse_data_entities=copy.deepcopy(parse_data["entities"]),
826
+ parse_data_text=copy.deepcopy(parse_data[TEXT]),
827
+ parse_data_intent=parse_data[INTENT],
828
+ parse_data_entities=copy.deepcopy(parse_data[ENTITIES]),
828
829
  )
829
830
 
830
831
  self._check_for_unseen_features(parse_data)
@@ -973,7 +974,7 @@ class MessageProcessor:
973
974
  f"invalid intent: {parse_data[INTENT]['name']}. "
974
975
  f"Returning CannotHandleCommand() as a fallback."
975
976
  ),
976
- invalid_intent=parse_data[INTENT]["name"],
977
+ invalid_intent=parse_data[INTENT][INTENT_NAME_KEY],
977
978
  )
978
979
  commands.append(
979
980
  CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_INVALID_INTENT)
@@ -983,7 +984,7 @@ class MessageProcessor:
983
984
 
984
985
  def _contains_undefined_intent(self, message: Message) -> bool:
985
986
  """Checks if the message contains an undefined intent."""
986
- intent_name = message.get(INTENT, {}).get("name")
987
+ intent_name = message.get(INTENT, {}).get(INTENT_NAME_KEY)
987
988
  return intent_name is not None and intent_name not in self.domain.intents
988
989
 
989
990
  async def _parse_message_with_graph(
@@ -1033,8 +1034,8 @@ class MessageProcessor:
1033
1034
  tracker.update(
1034
1035
  UserUttered(
1035
1036
  message.text,
1036
- parse_data["intent"],
1037
- parse_data["entities"],
1037
+ parse_data[INTENT],
1038
+ parse_data[ENTITIES],
1038
1039
  parse_data,
1039
1040
  input_channel=message.input_channel,
1040
1041
  message_id=message.message_id,
@@ -1043,7 +1044,7 @@ class MessageProcessor:
1043
1044
  self.domain,
1044
1045
  )
1045
1046
 
1046
- if parse_data["entities"]:
1047
+ if parse_data[ENTITIES]:
1047
1048
  self._log_slots(tracker)
1048
1049
 
1049
1050
  plugin_manager().hook.after_new_user_message(tracker=tracker)
@@ -1194,7 +1195,11 @@ class MessageProcessor:
1194
1195
  `False` if `action_name` is `ACTION_LISTEN_NAME` or
1195
1196
  `ACTION_SESSION_START_NAME`, otherwise `True`.
1196
1197
  """
1197
- return action_name not in (ACTION_LISTEN_NAME, ACTION_SESSION_START_NAME)
1198
+ return action_name not in (
1199
+ ACTION_LISTEN_NAME,
1200
+ ACTION_SESSION_START_NAME,
1201
+ ACTION_AGENT_REQUEST_USER_INPUT_NAME,
1202
+ )
1198
1203
 
1199
1204
  async def execute_side_effects(
1200
1205
  self,
@@ -1467,11 +1472,9 @@ class MessageProcessor:
1467
1472
  # tracker has never expired if sessions are disabled
1468
1473
  return False
1469
1474
 
1470
- user_uttered_event: Optional[UserUttered] = tracker.get_last_event_for(
1471
- UserUttered
1472
- )
1475
+ user_uttered_event = tracker.get_last_event_for(UserUttered)
1473
1476
 
1474
- if not user_uttered_event:
1477
+ if not user_uttered_event or not isinstance(user_uttered_event, UserUttered):
1475
1478
  # there is no user event so far so the session should not be considered
1476
1479
  # expired
1477
1480
  return False
rasa/core/run.py CHANGED
@@ -30,6 +30,7 @@ from rasa import server, telemetry
30
30
  from rasa.constants import ENV_SANIC_BACKLOG
31
31
  from rasa.core import agent, channels, constants
32
32
  from rasa.core.agent import Agent
33
+ from rasa.core.available_agents import AvailableAgents
33
34
  from rasa.core.available_endpoints import AvailableEndpoints
34
35
  from rasa.core.channels import console
35
36
  from rasa.core.channels.channel import InputChannel
@@ -42,20 +43,10 @@ from rasa.utils import licensing
42
43
  logger = logging.getLogger() # get the root logger
43
44
 
44
45
 
45
- def create_input_channels(
46
+ def create_http_input_channels(
46
47
  channel: Optional[Text], credentials_file: Optional[Text]
47
48
  ) -> List[InputChannel]:
48
- """Instantiate the chosen input channel.
49
-
50
- Args:
51
- channel (optional): The name of the specific input channel to create.
52
- credentials_file: Path to the credentials file containing channel credentials.
53
-
54
- Returns:
55
- A list of instantiated input channels. If a specific channel is provided,
56
- it returns a list with that single channel. If no channel is specified,
57
- it returns a list of all channels defined in the credentials file.
58
- """
49
+ """Instantiate the chosen input channel."""
59
50
  if credentials_file:
60
51
  all_credentials = read_config_file(credentials_file)
61
52
  else:
@@ -151,6 +142,7 @@ def configure_app(
151
142
  route: Optional[Text] = "/webhooks/",
152
143
  port: int = constants.DEFAULT_SERVER_PORT,
153
144
  endpoints: Optional[AvailableEndpoints] = None,
145
+ sub_agents: Optional[AvailableAgents] = None,
154
146
  log_file: Optional[Text] = None,
155
147
  conversation_id: Optional[Text] = uuid.uuid4().hex,
156
148
  use_syslog: bool = False,
@@ -179,6 +171,7 @@ def configure_app(
179
171
  jwt_private_key=jwt_private_key,
180
172
  jwt_method=jwt_method,
181
173
  endpoints=endpoints,
174
+ sub_agents=sub_agents,
182
175
  is_inspector_enabled=is_inspector_enabled,
183
176
  )
184
177
  )
@@ -243,6 +236,7 @@ def serve_application(
243
236
  jwt_private_key: Optional[Text] = None,
244
237
  jwt_method: Optional[Text] = None,
245
238
  endpoints: Optional[AvailableEndpoints] = None,
239
+ sub_agents: Optional[AvailableAgents] = None,
246
240
  remote_storage: Optional[StorageType] = None,
247
241
  log_file: Optional[Text] = None,
248
242
  ssl_certificate: Optional[Text] = None,
@@ -263,7 +257,7 @@ def serve_application(
263
257
  if not channel and not credentials:
264
258
  channel = "cmdline"
265
259
 
266
- input_channels = create_input_channels(channel, credentials)
260
+ input_channels = create_http_input_channels(channel, credentials)
267
261
 
268
262
  if inspect:
269
263
  logger.info("Starting development inspector.")
@@ -283,6 +277,7 @@ def serve_application(
283
277
  jwt_method,
284
278
  port=port,
285
279
  endpoints=endpoints,
280
+ sub_agents=sub_agents,
286
281
  log_file=log_file,
287
282
  conversation_id=conversation_id,
288
283
  use_syslog=use_syslog,
@@ -302,7 +297,7 @@ def serve_application(
302
297
  logger.info(f"Starting Rasa server on {protocol}://{interface}:{port}")
303
298
 
304
299
  app.register_listener(
305
- partial(load_agent_on_start, model_path, endpoints, remote_storage),
300
+ partial(load_agent_on_start, model_path, endpoints, remote_storage, sub_agents),
306
301
  "before_server_start",
307
302
  )
308
303
 
@@ -340,6 +335,7 @@ async def load_agent_on_start(
340
335
  model_path: Text,
341
336
  endpoints: AvailableEndpoints,
342
337
  remote_storage: Optional[StorageType],
338
+ sub_agents: Optional[AvailableAgents],
343
339
  app: Sanic,
344
340
  loop: AbstractEventLoop,
345
341
  ) -> Agent:
@@ -352,6 +348,7 @@ async def load_agent_on_start(
352
348
  model_path=model_path,
353
349
  remote_storage=remote_storage,
354
350
  endpoints=endpoints,
351
+ sub_agents=sub_agents,
355
352
  loop=loop,
356
353
  )
357
354
 
@@ -542,7 +542,7 @@ class FailSafeTrackerStore(TrackerStore):
542
542
  return self._tracker_store.domain
543
543
 
544
544
  @domain.setter
545
- def domain(self, domain: Domain) -> None:
545
+ def domain(self, domain: Optional[Domain]) -> None:
546
546
  self._tracker_store.domain = domain
547
547
 
548
548
  if self._fallback_tracker_store:
@@ -805,9 +805,7 @@ class AwaitableTrackerStore(TrackerStore):
805
805
  async def retrieve(self, sender_id: Text) -> Optional[DialogueStateTracker]:
806
806
  """Wrapper to call `retrieve` method of primary tracker store."""
807
807
  result = self._tracker_store.retrieve(sender_id)
808
- return (
809
- await result if isawaitable(result) else result # type: ignore[return-value, misc]
810
- )
808
+ return await result if isawaitable(result) else result
811
809
 
812
810
  async def keys(self) -> Iterable[Text]:
813
811
  """Wrapper to call `keys` method of primary tracker store."""
@@ -834,6 +832,4 @@ class AwaitableTrackerStore(TrackerStore):
834
832
  ) -> Optional[DialogueStateTracker]:
835
833
  """Wrapper to call `retrieve_full_tracker` method of primary tracker store."""
836
834
  result = self._tracker_store.retrieve_full_tracker(conversation_id)
837
- return (
838
- await result if isawaitable(result) else result # type: ignore[return-value, misc]
839
- )
835
+ return await result if isawaitable(result) else result
rasa/core/train.py CHANGED
@@ -46,7 +46,7 @@ async def train_comparison_models(
46
46
  output=str(Path(output_path, f"run_{r +1}")),
47
47
  fixed_model_name=config_name + PERCENTAGE_KEY + str(percentage),
48
48
  additional_arguments={
49
- **additional_arguments,
49
+ **(additional_arguments or {}),
50
50
  "exclusion_percentage": percentage,
51
51
  },
52
52
  )
@@ -91,7 +91,7 @@ from rasa.shared.core.training_data.visualization import (
91
91
  )
92
92
  from rasa.shared.exceptions import InvalidConfigException
93
93
  from rasa.shared.importers.rasa import TrainingDataImporter
94
- from rasa.shared.nlu.constants import INTENT_NAME_KEY, TEXT
94
+ from rasa.shared.nlu.constants import ENTITIES, INTENT, INTENT_NAME_KEY, TEXT
95
95
 
96
96
  # noinspection PyProtectedMember
97
97
  from rasa.shared.nlu.training_data import loading
@@ -789,7 +789,7 @@ def _collect_messages(events: List[Dict[Text, Any]]) -> List[Message]:
789
789
  data = event.get("parse_data", {})
790
790
  rasa_nlu_training_data_utils.remove_untrainable_entities_from(data)
791
791
  msg = Message.build(
792
- data["text"], data["intent"][INTENT_NAME_KEY], data["entities"]
792
+ data[TEXT], data[INTENT][INTENT_NAME_KEY], data[ENTITIES]
793
793
  )
794
794
  messages.append(msg)
795
795
  elif event.get("event") == UserUtteranceReverted.type_name and messages:
@@ -901,13 +901,13 @@ def _get_nlu_target_format(export_path: Text) -> Text:
901
901
 
902
902
  def _entities_from_messages(messages: List[Message]) -> List[Text]:
903
903
  """Return all entities that occur in at least one of the messages."""
904
- return list({e["entity"] for m in messages for e in m.data.get("entities", [])})
904
+ return list({e["entity"] for m in messages for e in m.data.get(ENTITIES, [])})
905
905
 
906
906
 
907
907
  def _intents_from_messages(messages: List[Message]) -> Set[Text]:
908
908
  """Return all intents that occur in at least one of the messages."""
909
909
  # set of distinct intents
910
- distinct_intents = {m.data["intent"] for m in messages if "intent" in m.data}
910
+ distinct_intents = {m.data[INTENT] for m in messages if INTENT in m.data}
911
911
 
912
912
  return distinct_intents
913
913
 
@@ -1191,11 +1191,11 @@ def _as_md_message(parse_data: Dict[Text, Any]) -> Text:
1191
1191
  """Display the parse data of a message in markdown format."""
1192
1192
  from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter
1193
1193
 
1194
- if parse_data.get("text", "").startswith(INTENT_MESSAGE_PREFIX):
1195
- return parse_data["text"]
1194
+ if parse_data.get(TEXT, "").startswith(INTENT_MESSAGE_PREFIX):
1195
+ return parse_data[TEXT]
1196
1196
 
1197
- if not parse_data.get("entities"):
1198
- parse_data["entities"] = []
1197
+ if not parse_data.get(ENTITIES):
1198
+ parse_data[ENTITIES] = []
1199
1199
 
1200
1200
  return TrainingDataWriter.generate_message(parse_data)
1201
1201
 
@@ -1207,7 +1207,7 @@ def _validate_user_regex(latest_message: Dict[Text, Any], intents: List[Text]) -
1207
1207
  `/greet`. Return `True` if the intent is a known one.
1208
1208
  """
1209
1209
  parse_data = latest_message.get("parse_data", {})
1210
- intent = parse_data.get("intent", {}).get(INTENT_NAME_KEY)
1210
+ intent = parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
1211
1211
 
1212
1212
  if intent in intents:
1213
1213
  return True
@@ -1224,8 +1224,8 @@ async def _validate_user_text(
1224
1224
  """
1225
1225
  parse_data = latest_message.get("parse_data", {})
1226
1226
  text = _as_md_message(parse_data)
1227
- intent = parse_data.get("intent", {}).get(INTENT_NAME_KEY)
1228
- entities = parse_data.get("entities", [])
1227
+ intent = parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
1228
+ entities = parse_data.get(ENTITIES, [])
1229
1229
  if entities:
1230
1230
  message = (
1231
1231
  f"Is the intent '{intent}' correct for '{text}' and are "
@@ -1276,9 +1276,9 @@ async def _validate_nlu(
1276
1276
 
1277
1277
  entities = await _correct_entities(latest_message, endpoint, conversation_id)
1278
1278
  corrected_nlu = {
1279
- "intent": corrected_intent,
1280
- "entities": entities,
1281
- "text": latest_message.get("text"),
1279
+ INTENT: corrected_intent,
1280
+ ENTITIES: entities,
1281
+ TEXT: latest_message.get("text"),
1282
1282
  }
1283
1283
 
1284
1284
  await _correct_wrong_nlu(corrected_nlu, events, endpoint, conversation_id)
@@ -1315,9 +1315,9 @@ def _merge_annotated_and_original_entities(
1315
1315
  # overwrite entities which have already been
1316
1316
  # annotated in the original annotation to preserve
1317
1317
  # additional entity parser information
1318
- entities = parse_annotated.get("entities", [])[:]
1318
+ entities = parse_annotated.get(ENTITIES, [])[:]
1319
1319
  for i, entity in enumerate(entities):
1320
- for original_entity in parse_original.get("entities", []):
1320
+ for original_entity in parse_original.get(ENTITIES, []):
1321
1321
  if _is_same_entity_annotation(entity, original_entity):
1322
1322
  entities[i] = original_entity
1323
1323
  break
@@ -14,7 +14,7 @@ from rasa.shared.core.constants import (
14
14
  from rasa.shared.core.domain import Domain, State
15
15
  from rasa.shared.core.events import ActionExecuted, Event
16
16
  from rasa.shared.core.generator import TrackerWithCachedStates
17
- from rasa.shared.nlu.constants import TEXT
17
+ from rasa.shared.nlu.constants import INTENT, TEXT
18
18
  from rasa.shared.nlu.training_data.message import Message
19
19
 
20
20
  logger = logging.getLogger(__name__)
@@ -362,12 +362,12 @@ def _get_previous_event(
362
362
  previous_event_type = "bot utterance"
363
363
  previous_event_name = state[PREVIOUS_ACTION]["action_text"]
364
364
  elif USER in state.keys():
365
- if "intent" in state[USER]:
365
+ if INTENT in state[USER]:
366
366
  previous_event_type = "intent"
367
- previous_event_name = state[USER]["intent"]
368
- elif "text" in state[USER]:
367
+ previous_event_name = state[USER][INTENT]
368
+ elif TEXT in state[USER]:
369
369
  previous_event_type = "user utterance"
370
- previous_event_name = state[USER]["text"]
370
+ previous_event_name = state[USER][TEXT]
371
371
 
372
372
  if not isinstance(previous_event_name, (str, type(None))):
373
373
  # While the Substate type doesn't restrict the value of `action_text` /
rasa/core/utils.py CHANGED
@@ -1,8 +1,9 @@
1
1
  import logging
2
2
  import os
3
+ import re
3
4
  from pathlib import Path
4
5
  from socket import SOCK_DGRAM, SOCK_STREAM
5
- from typing import TYPE_CHECKING, Any, Dict, Optional, Set, Text, Tuple, Union
6
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Text, Tuple, Union
6
7
 
7
8
  import numpy as np
8
9
  import structlog
@@ -359,3 +360,22 @@ def should_force_slot_filling(
359
360
  return True, slot_name
360
361
 
361
362
  return False, None
363
+
364
+
365
+ def get_slot_names_from_exit_conditions(exit_conditions: List[str]) -> List[str]:
366
+ """Extract slot names from exit conditions.
367
+
368
+ Args:
369
+ exit_conditions: The exit conditions to extract slot names from.
370
+
371
+ Returns:
372
+ A list of slot names.
373
+ """
374
+ # Find all unique names matching "slots.<name>"
375
+ return list(
376
+ {
377
+ name
378
+ for condition in exit_conditions
379
+ for name in re.findall(r"\bslots\.(\w+)", condition)
380
+ }
381
+ )