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
@@ -6,6 +6,8 @@ from collections import defaultdict
6
6
  from dataclasses import dataclass
7
7
  from typing import List, Optional, Set, Text
8
8
 
9
+ from jinja2 import Template
10
+
9
11
  from rasa.shared.constants import (
10
12
  RASA_DEFAULT_FLOW_PATTERN_PREFIX,
11
13
  RASA_PATTERN_CHITCHAT,
@@ -35,6 +37,7 @@ from rasa.shared.core.flows.utils import (
35
37
  from rasa.shared.exceptions import RasaException
36
38
 
37
39
  if typing.TYPE_CHECKING:
40
+ from rasa.shared.core.domain import Domain
38
41
  from rasa.shared.core.flows.flows_list import FlowsList
39
42
 
40
43
  FLOW_ID_REGEX = r"""^[a-zA-Z0-9_][a-zA-Z0-9_-]*?$"""
@@ -107,6 +110,26 @@ class DuplicatedStepIdException(RasaException):
107
110
  )
108
111
 
109
112
 
113
+ class InvalidExitIfConditionException(RasaException):
114
+ """Raised when an exit_if condition is invalid."""
115
+
116
+ def __init__(self, step_id: str, flow_id: str, condition: str, reason: str) -> None:
117
+ """Initializes the exception."""
118
+ self.step_id = step_id
119
+ self.flow_id = flow_id
120
+ self.condition = condition
121
+ self.reason = reason
122
+
123
+ def __str__(self) -> str:
124
+ """Return a string representation of the exception."""
125
+ return (
126
+ f"Invalid exit_if condition '{self.condition}' in step '{self.step_id}' "
127
+ f"of flow '{self.flow_id}': {self.reason}. "
128
+ f"Please ensure that exit_if conditions contain at least one slot "
129
+ f"reference and use only defined slots with valid predicates."
130
+ )
131
+
132
+
110
133
  class DuplicatedFlowIdException(RasaException):
111
134
  """Raised when a flow is using the same id as another flow."""
112
135
 
@@ -261,7 +284,7 @@ class NoLinkAllowedInCalledFlowException(RasaException):
261
284
  )
262
285
 
263
286
 
264
- class UnresolvedFlowException(RasaException):
287
+ class UnresolvedLinkFlowException(RasaException):
265
288
  """Raised when a flow is called or linked from another flow but doesn't exist."""
266
289
 
267
290
  def __init__(self, flow_id: str, calling_flow_id: str, step_id: str) -> None:
@@ -273,13 +296,37 @@ class UnresolvedFlowException(RasaException):
273
296
  def __str__(self) -> str:
274
297
  """Return a string representation of the exception."""
275
298
  return (
276
- f"Flow '{self.flow_id}' is called or linked from flow "
299
+ f"Flow '{self.flow_id}' is linked from flow "
277
300
  f"'{self.calling_flow_id}' in step '{self.step_id}', "
278
301
  f"but it doesn't exist. "
279
302
  f"Please make sure that a flow with id '{self.flow_id}' exists."
280
303
  )
281
304
 
282
305
 
306
+ class UnresolvedCallStepException(RasaException):
307
+ """Valid call step should have a reference to an existing flow or agent.
308
+ Raised when it does not.
309
+ """
310
+
311
+ def __init__(
312
+ self, call_step_argument: str, calling_flow_id: str, step_id: str
313
+ ) -> None:
314
+ """Initializes the exception."""
315
+ self.call_step_argument = call_step_argument
316
+ self.calling_flow_id = calling_flow_id
317
+ self.step_id = step_id
318
+
319
+ def __str__(self) -> str:
320
+ """Return a string representation of the exception."""
321
+ return (
322
+ f"The call step '{self.step_id}' in flow '{self.calling_flow_id}' "
323
+ f"is invalid: there is no flow or agent with the "
324
+ f"id '{self.call_step_argument}'. "
325
+ f"Please make sure that the call step argument is a valid flow id "
326
+ f"or an agent id."
327
+ )
328
+
329
+
283
330
  class UnresolvedFlowStepIdException(RasaException):
284
331
  """Raised when a flow step is referenced, but its id can not be resolved."""
285
332
 
@@ -562,15 +609,88 @@ def validate_link_in_call_restriction(flows: "FlowsList") -> None:
562
609
  raise NoLinkAllowedInCalledFlowException(step.id, flow.id, step.call)
563
610
 
564
611
 
565
- def validate_called_flows_exists(flows: "FlowsList") -> None:
566
- """Validates that all called flows exist."""
612
+ def validate_call_steps(flows: "FlowsList") -> None:
613
+ """Validates that all called flows/agents exist and additional properties
614
+ are valid.
615
+ """
567
616
  for flow in flows.underlying_flows:
568
617
  for step in flow.steps:
569
618
  if not isinstance(step, CallFlowStep):
570
619
  continue
571
620
 
572
- if flows.flow_by_id(step.call) is None:
573
- raise UnresolvedFlowException(step.call, flow.id, step.id)
621
+ _is_step_calling_agent = step.is_calling_agent()
622
+ if (
623
+ not _is_step_calling_agent
624
+ and flows.flow_by_id(step.call) is None
625
+ and not step.is_calling_mcp_tool()
626
+ ):
627
+ raise UnresolvedCallStepException(step.call, flow.id, step.id)
628
+
629
+ if step.exit_if and not _is_step_calling_agent:
630
+ # exit_if is only allowed for call steps that call an agent
631
+ raise RasaException(
632
+ f"Call step '{step.id}' in flow '{flow.id}' has an 'exit_if' "
633
+ f"condition, but it is not calling an agent. "
634
+ f"'exit_if' is only allowed for call steps that call an agent."
635
+ )
636
+
637
+
638
+ def validate_exit_if_conditions(
639
+ flows: "FlowsList", domain: Optional["Domain"] = None
640
+ ) -> None:
641
+ """Validates that exit_if conditions are valid.
642
+
643
+ This function validates:
644
+ - Each condition contains at least one slot reference
645
+ - Only defined slots are used within the conditions
646
+ - The predicates are valid
647
+
648
+ Args:
649
+ flows: The flows to validate.
650
+ domain: The domain with slot definitions. If None, slot validation is skipped.
651
+
652
+ Raises:
653
+ InvalidExitIfConditionException: If any exit_if condition is invalid.
654
+ """
655
+ for flow in flows.underlying_flows:
656
+ for step in flow.steps:
657
+ if not isinstance(step, CallFlowStep) or not step.exit_if:
658
+ continue
659
+
660
+ for condition in step.exit_if:
661
+ if not isinstance(condition, str):
662
+ raise InvalidExitIfConditionException(
663
+ step.id, flow.id, str(condition), "Condition must be a string"
664
+ )
665
+
666
+ # Check if condition contains at least one slot reference
667
+ slot_references = re.findall(r"\bslots\.\w+", condition)
668
+ if not slot_references:
669
+ raise InvalidExitIfConditionException(
670
+ step.id,
671
+ flow.id,
672
+ condition,
673
+ "Condition must contain at least one slot reference "
674
+ "(e.g., 'slots.slot_name')",
675
+ )
676
+
677
+ # Validate slot names if domain is provided
678
+ if domain:
679
+ domain_slots = {slot.name: slot for slot in domain.slots}
680
+ for slot_ref in slot_references:
681
+ slot_name = slot_ref.split(".")[1]
682
+ if slot_name not in domain_slots:
683
+ raise InvalidExitIfConditionException(
684
+ step.id,
685
+ flow.id,
686
+ condition,
687
+ f"Slot '{slot_name}' is not defined in the domain",
688
+ )
689
+
690
+ # Validate predicate syntax using pypred
691
+ _validate_predicate_syntax_with_pypred(
692
+ step.id, flow.id, condition
693
+ )
574
694
 
575
695
 
576
696
  def validate_linked_flows_exists(flows: "FlowsList") -> None:
@@ -594,7 +714,7 @@ def validate_linked_flows_exists(flows: "FlowsList") -> None:
594
714
  flow.is_rasa_default_flow and step.link == RASA_PATTERN_CHITCHAT
595
715
  )
596
716
  ):
597
- raise UnresolvedFlowException(step.link, flow.id, step.id)
717
+ raise UnresolvedLinkFlowException(step.link, flow.id, step.id)
598
718
 
599
719
 
600
720
  def validate_patterns_are_not_called_or_linked(flows: "FlowsList") -> None:
@@ -751,3 +871,53 @@ def validate_slot_persistence_configuration(flow: Flow) -> None:
751
871
  result = _is_persist_slots_valid(persist_slots, flow_slots)
752
872
  if not result.is_valid:
753
873
  raise InvalidPersistSlotsException(flow_id, result.invalid_slots)
874
+
875
+
876
+ def _validate_predicate_syntax_with_pypred(
877
+ step_id: str, flow_id: str, condition: str
878
+ ) -> None:
879
+ """Validates predicate syntax using pypred.
880
+
881
+ This function validates that the exit_if condition has valid predicate syntax.
882
+ Pypred catches syntax errors like double operators, invalid expressions, etc.
883
+
884
+ Args:
885
+ step_id: The ID of the step containing the condition.
886
+ flow_id: The ID of the flow containing the step.
887
+ condition: The exit_if condition string.
888
+
889
+ Raises:
890
+ InvalidExitIfConditionException: If pypred detects syntax errors.
891
+ """
892
+ try:
893
+ from pypred import Predicate
894
+
895
+ # Create a simple test context for syntax validation.
896
+ # This context works with all slot types since it's only used for:
897
+ # 1. Template rendering: Basic structure for Jinja2 template rendering
898
+ # 2. Syntax validation: Pypred validates predicate syntax
899
+ # without actual slot values
900
+ test_context = {"slots": {"test_slot": "test_value"}}
901
+ rendered_template = Template(condition).render(test_context)
902
+
903
+ # Let pypred validate the predicate syntax
904
+ predicate = Predicate(rendered_template)
905
+ if not predicate.is_valid():
906
+ raise InvalidExitIfConditionException(
907
+ step_id,
908
+ flow_id,
909
+ condition,
910
+ "Invalid predicate syntax",
911
+ )
912
+
913
+ except ImportError:
914
+ # pypred not available, skip validation
915
+ pass
916
+ except Exception as e:
917
+ # Re-raise pypred errors as predicate syntax errors
918
+ raise InvalidExitIfConditionException(
919
+ step_id,
920
+ flow_id,
921
+ condition,
922
+ f"Invalid predicate syntax: {e}",
923
+ )
@@ -127,7 +127,7 @@ class YAMLFlowsReader:
127
127
  If a schema does not have a `schema_name` set, we will use the
128
128
  `type` instead as a fallback.
129
129
  """
130
- return schema.get("schema_name", schema.get("type"))
130
+ return str(schema.get("schema_name", schema.get("type") or "unknown"))
131
131
 
132
132
  def schema_names(schemas: List[Dict[str, Any]]) -> List[str]:
133
133
  """Get the names of the schemas.
@@ -262,9 +262,12 @@ class YamlFlowsWriter:
262
262
  Returns:
263
263
  The dumped YAML.
264
264
  """
265
- return dump_obj_as_yaml_to_string(
266
- {KEY_FLOWS: get_flows_as_json(flows, should_clean_json)}
267
- )
265
+ dump = {}
266
+ for flow in flows:
267
+ dumped_flow = get_flow_as_json(flow, should_clean_json)
268
+ del dumped_flow["id"]
269
+ dump[flow.id] = dumped_flow
270
+ return dump_obj_as_yaml_to_string({KEY_FLOWS: dump})
268
271
 
269
272
  @staticmethod
270
273
  def dump(
@@ -415,24 +418,13 @@ def process_yaml_content(yaml_content: Dict[str, Any]) -> Dict[str, Any]:
415
418
 
416
419
  # Under the "flows" key certain keys cannot have metadata
417
420
  _process_keys_recursively(
418
- yaml_content["flows"], ["nlu_trigger", "set_slots", "metadata"]
421
+ yaml_content["flows"],
422
+ ["nlu_trigger", "set_slots", "metadata", "mapping", "exit_if"],
419
423
  )
420
424
 
421
425
  return yaml_content
422
426
 
423
427
 
424
- def get_flows_as_json(
425
- flows: FlowsList, should_clean_json: bool = False
426
- ) -> Dict[str, Any]:
427
- """Get the flows as a JSON dictionary."""
428
- dump = {}
429
- for flow in flows:
430
- dumped_flow = get_flow_as_json(flow, should_clean_json)
431
- del dumped_flow["id"]
432
- dump[flow.id] = dumped_flow
433
- return dump
434
-
435
-
436
428
  def get_flow_as_json(flow: Flow, should_clean_json: bool = False) -> Dict[str, Any]:
437
429
  """Clean the Flow JSON by removing default values and empty fields.
438
430
 
rasa/shared/core/slots.py CHANGED
@@ -68,9 +68,9 @@ class SlotRejection:
68
68
 
69
69
 
70
70
  class SlotValidation(BaseModel):
71
- rejections: List[SlotRejection] = Field(alias=REJECTIONS)
71
+ rejections: List[SlotRejection] = Field(alias=REJECTIONS) # type: ignore[literal-required]
72
72
  """how the slot value is validated using predicate evaluation."""
73
- refill_utter: str = Field(alias=REFILL_UTTER)
73
+ refill_utter: str = Field(alias=REFILL_UTTER) # type: ignore[literal-required]
74
74
  """The utterance that the assistant uses to ask for the slot."""
75
75
 
76
76
  @staticmethod
@@ -273,14 +273,10 @@ class Slot(ABC):
273
273
  try:
274
274
  return rasa.shared.utils.common.class_from_module_path(type_name)
275
275
  except (ImportError, AttributeError):
276
- known_types = [
277
- cls.type_name for cls in rasa.shared.utils.common.all_subclasses(Slot)
278
- ]
279
276
  raise InvalidSlotTypeException(
280
277
  f"Failed to find slot type, '{type_name}' is neither a known type nor "
281
278
  f"user-defined. If you are creating your own slot type, make "
282
279
  f"sure its module path is correct. "
283
- f"Known types: {', '.join(known_types)} "
284
280
  f"You can find all build in types at {DOCS_URL_SLOTS}"
285
281
  )
286
282
 
@@ -849,7 +849,7 @@ class DialogueStateTracker:
849
849
  action_names_to_exclude: Optional[List[Text]] = None,
850
850
  skip: int = 0,
851
851
  event_verbosity: EventVerbosity = EventVerbosity.APPLIED,
852
- ) -> Optional["EventTypeAlias"]:
852
+ ) -> Optional[Event]:
853
853
  """Gets the last event of a given type which was actually applied.
854
854
 
855
855
  Args:
@@ -889,9 +889,12 @@ class DialogueStateTracker:
889
889
  Returns:
890
890
  `True` if last executed action had name `name`, otherwise `False`.
891
891
  """
892
- last: Optional[ActionExecuted] = self.get_last_event_for(
892
+ last_event = self.get_last_event_for(
893
893
  ActionExecuted, action_names_to_exclude=[ACTION_LISTEN_NAME], skip=skip
894
894
  )
895
+ last: Optional[ActionExecuted] = (
896
+ last_event if isinstance(last_event, ActionExecuted) else None
897
+ )
895
898
  return last is not None and last.action_name == name
896
899
 
897
900
  ###
rasa/shared/exceptions.py CHANGED
@@ -169,3 +169,7 @@ class ProviderClientValidationError(RasaException):
169
169
 
170
170
  class FinetuningDataPreparationException(RasaException):
171
171
  """Raised when there is an error in data preparation for fine-tuning."""
172
+
173
+
174
+ class AgentInitializationException(RasaException):
175
+ """Raised when there is an error during the initialization of an agent."""
@@ -207,12 +207,6 @@ class TrainingDataImporter(ABC):
207
207
  )
208
208
  ]
209
209
 
210
- return TrainingDataImporter.wrap_in_builtins(importers)
211
-
212
- @staticmethod
213
- def wrap_in_builtins(
214
- importers: List["TrainingDataImporter"],
215
- ) -> "TrainingDataImporter":
216
210
  return LanguageImporter(
217
211
  E2EImporter(
218
212
  FlowSyncImporter(ResponsesSyncImporter(CombinedDataImporter(importers)))
@@ -74,7 +74,7 @@ class RasaFileImporter(TrainingDataImporter):
74
74
  @cached_method
75
75
  def get_flows(self) -> FlowsList:
76
76
  """Retrieves training stories / rules (see parent class for full docstring)."""
77
- return utils.flows_from_paths(self._flow_files)
77
+ return utils.flows_from_paths(self._flow_files, self.get_domain())
78
78
 
79
79
  @cached_method
80
80
  def get_conversation_tests(self) -> StoryGraph:
@@ -1,37 +1,9 @@
1
- from typing import Any, Dict, Iterable, List, Optional, Text
2
-
3
- from pydantic import BaseModel, Field
1
+ from typing import Iterable, List, Optional, Text
4
2
 
5
3
  from rasa.shared.core.domain import Domain
6
4
  from rasa.shared.core.flows import FlowsList
7
- from rasa.shared.core.flows.yaml_flows_io import KEY_FLOWS, get_flows_as_json
8
5
  from rasa.shared.core.training_data.structures import StoryGraph
9
- from rasa.shared.importers.importer import TrainingDataImporter
10
- from rasa.shared.nlu.training_data.formats.rasa_yaml import RasaYAMLWriter
11
6
  from rasa.shared.nlu.training_data.training_data import TrainingData
12
- from rasa.utils.json_utils import extract_values
13
-
14
-
15
- class CALMUserData(BaseModel):
16
- """All pieces that will be uploaded to Rasa Studio."""
17
-
18
- flows: Dict[str, Any] = Field(default_factory=dict)
19
- domain: Dict[str, Any] = Field(default_factory=dict)
20
- config: Dict[str, Any] = Field(default_factory=dict)
21
- endpoints: Dict[str, Any] = Field(default_factory=dict)
22
- nlu: Dict[str, Any] = Field(default_factory=dict)
23
-
24
-
25
- DOMAIN_KEYS = [
26
- "version",
27
- "actions",
28
- "responses",
29
- "slots",
30
- "intents",
31
- "entities",
32
- "forms",
33
- "session_config",
34
- ]
35
7
 
36
8
 
37
9
  def training_data_from_paths(paths: Iterable[Text], language: Text) -> TrainingData:
@@ -51,8 +23,14 @@ def story_graph_from_paths(
51
23
  return StoryGraph(story_steps)
52
24
 
53
25
 
54
- def flows_from_paths(files: List[Text]) -> FlowsList:
55
- """Returns the flows from paths."""
26
+ def flows_from_paths(files: List[Text], domain: Optional[Domain] = None) -> FlowsList:
27
+ """Returns the flows from paths.
28
+
29
+ Args:
30
+ files: List of flow file paths to load.
31
+ domain: Optional domain for validation. If provided, exit_if conditions
32
+ will be validated against defined slots.
33
+ """
56
34
  from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader
57
35
 
58
36
  flows = FlowsList(underlying_flows=[])
@@ -60,53 +38,5 @@ def flows_from_paths(files: List[Text]) -> FlowsList:
60
38
  flows = flows.merge(
61
39
  YAMLFlowsReader.read_from_file(file), ignore_duplicates=False
62
40
  )
63
- flows.validate()
41
+ flows.validate(domain)
64
42
  return flows
65
-
66
-
67
- def extract_calm_import_parts_from_importer(
68
- importer: TrainingDataImporter,
69
- config: Optional[Dict[str, Any]] = None,
70
- endpoints: Optional[Dict[str, Any]] = None,
71
- ) -> CALMUserData:
72
- """Extracts CALMUserData from a TrainingDataImporter.
73
-
74
- Args:
75
- importer: The training data importer
76
- data_paths: The path(s) to the training data for flows
77
- config: Optional config dict, if not provided will use importer.get_config()
78
- endpoints: Optional endpoints dict, defaults to empty dict
79
-
80
- Returns:
81
- CALMUserData containing flows, domain, config, endpoints, and nlu data
82
- """
83
- # Extract config
84
- if config is None:
85
- config = importer.get_config()
86
-
87
- # Extract domain
88
- domain_from_files = importer.get_user_domain().as_dict()
89
- domain = extract_values(domain_from_files, DOMAIN_KEYS)
90
-
91
- # Extract flows
92
- flows = importer.get_user_flows()
93
- flows_dict = {KEY_FLOWS: get_flows_as_json(flows)}
94
-
95
- # Extract NLU data
96
- nlu_data = importer.get_nlu_data()
97
- nlu_examples = nlu_data.filter_training_examples(
98
- lambda ex: ex.get("intent") in nlu_data.intents
99
- )
100
- nlu_dict = RasaYAMLWriter().training_data_to_dict(nlu_examples)
101
-
102
- # Use provided endpoints or default to empty dict
103
- if endpoints is None:
104
- endpoints = {}
105
-
106
- return CALMUserData(
107
- flows=flows_dict or {},
108
- domain=domain or {},
109
- config=config or {},
110
- endpoints=endpoints or {},
111
- nlu=nlu_dict or {},
112
- )
@@ -1,103 +1,87 @@
1
1
  from typing import Any, Dict, Optional
2
2
 
3
- import boto3
4
3
  import structlog
5
- from botocore.exceptions import BotoCoreError, ClientError
4
+ from litellm import validate_environment
6
5
 
7
6
  from rasa.shared.constants import (
8
7
  API_BASE_CONFIG_KEY,
9
8
  API_VERSION_CONFIG_KEY,
10
9
  AWS_ACCESS_KEY_ID_CONFIG_KEY,
11
- AWS_BEDROCK_PROVIDER,
10
+ AWS_ACCESS_KEY_ID_ENV_VAR,
12
11
  AWS_REGION_NAME_CONFIG_KEY,
13
- AWS_SAGEMAKER_CHAT_PROVIDER,
14
- AWS_SAGEMAKER_PROVIDER,
12
+ AWS_REGION_NAME_ENV_VAR,
15
13
  AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
14
+ AWS_SECRET_ACCESS_KEY_ENV_VAR,
16
15
  AWS_SESSION_TOKEN_CONFIG_KEY,
16
+ AWS_SESSION_TOKEN_ENV_VAR,
17
17
  AZURE_API_BASE_ENV_VAR,
18
18
  AZURE_API_VERSION_ENV_VAR,
19
19
  DEPLOYMENT_CONFIG_KEY,
20
20
  )
21
21
  from rasa.shared.exceptions import ProviderClientValidationError
22
- from rasa.shared.utils.io import resolve_environment_variables
22
+ from rasa.shared.providers.embedding._base_litellm_embedding_client import (
23
+ _VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY,
24
+ )
23
25
 
24
26
  structlogger = structlog.get_logger()
25
27
 
26
28
 
27
29
  def validate_aws_setup_for_litellm_clients(
28
- litellm_model_name: str, litellm_call_kwargs: Dict, source_log: str, provider: str
30
+ litellm_model_name: str, litellm_call_kwargs: dict, source_log: str
29
31
  ) -> None:
30
- """Validates the AWS setup for LiteLLM clients to ensure credentials are set.
32
+ """Validates the AWS setup for LiteLLM clients to ensure all required
33
+ environment variables or corresponding call kwargs are set.
31
34
 
32
35
  Args:
33
36
  litellm_model_name (str): The name of the LiteLLM model being validated.
34
37
  litellm_call_kwargs (dict): Additional keyword arguments passed to the client,
35
38
  which may include configuration values for AWS credentials.
36
39
  source_log (str): The source log identifier for structured logging.
37
- provider (str): The provider for which the validation is being performed.
38
40
 
39
41
  Raises:
40
42
  ProviderClientValidationError: If any required AWS environment variable
41
43
  or corresponding configuration key is missing.
42
44
  """
43
- # expand environment variables if referenced in the config
44
- resolved_litellm_call_kwargs: Dict = resolve_environment_variables(
45
- litellm_call_kwargs
46
- ) # type: ignore[assignment]
47
-
48
- # boto3 only accepts bedrock and sagemaker as valid clients
49
- # therefore we need to convert the provider name if it is defined
50
- # as sagemaker_chat
51
- provider = (
52
- AWS_SAGEMAKER_PROVIDER if provider == AWS_SAGEMAKER_CHAT_PROVIDER else provider
53
- )
54
-
55
- # if the AWS credentials are defined in the endpoints yaml model config,
56
- # either as referenced secret env vars or direct values, we need to pass them
57
- # to the boto3 client to ensure that the client can connect to the AWS service.
58
- additional_kwargs: Dict[str, Any] = {}
59
- if AWS_ACCESS_KEY_ID_CONFIG_KEY in resolved_litellm_call_kwargs:
60
- additional_kwargs[AWS_ACCESS_KEY_ID_CONFIG_KEY] = resolved_litellm_call_kwargs[
61
- AWS_ACCESS_KEY_ID_CONFIG_KEY
62
- ]
63
- if AWS_SECRET_ACCESS_KEY_CONFIG_KEY in resolved_litellm_call_kwargs:
64
- additional_kwargs[AWS_SECRET_ACCESS_KEY_CONFIG_KEY] = (
65
- resolved_litellm_call_kwargs[AWS_SECRET_ACCESS_KEY_CONFIG_KEY]
66
- )
67
- if AWS_SESSION_TOKEN_CONFIG_KEY in resolved_litellm_call_kwargs:
68
- additional_kwargs[AWS_SESSION_TOKEN_CONFIG_KEY] = resolved_litellm_call_kwargs[
69
- AWS_SESSION_TOKEN_CONFIG_KEY
70
- ]
71
- if AWS_REGION_NAME_CONFIG_KEY in resolved_litellm_call_kwargs:
72
- additional_kwargs["region_name"] = resolved_litellm_call_kwargs[
73
- AWS_REGION_NAME_CONFIG_KEY
74
- ]
75
45
 
76
- try:
77
- # We are using the boto3 client because it can discover the AWS credentials
78
- # from the environment variables, credentials file, or IAM roles.
79
- # This is necessary to ensure that the client can connect to the AWS service.
80
- aws_client = boto3.client(provider, **additional_kwargs)
46
+ # Mapping of environment variable names to their corresponding config keys
47
+ envs_to_args = {
48
+ AWS_ACCESS_KEY_ID_ENV_VAR: AWS_ACCESS_KEY_ID_CONFIG_KEY,
49
+ AWS_SECRET_ACCESS_KEY_ENV_VAR: AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
50
+ AWS_REGION_NAME_ENV_VAR: AWS_REGION_NAME_CONFIG_KEY,
51
+ AWS_SESSION_TOKEN_ENV_VAR: AWS_SESSION_TOKEN_CONFIG_KEY,
52
+ }
81
53
 
82
- # Using different method calls available to different AWS clients
83
- # to test the connection
84
- if provider == AWS_SAGEMAKER_PROVIDER:
85
- aws_client.list_models()
86
- elif provider == AWS_BEDROCK_PROVIDER:
87
- aws_client.get_model_invocation_logging_configuration()
54
+ # Validate the environment setup for the model
55
+ validation_info = validate_environment(litellm_model_name)
56
+ missing_environment_variables = validation_info.get(
57
+ _VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY, []
58
+ )
59
+ # Filter out missing environment variables that have been set trough arguments
60
+ # in extra parameters
61
+ missing_environment_variables = [
62
+ missing_env_var
63
+ for missing_env_var in missing_environment_variables
64
+ if litellm_call_kwargs.get(envs_to_args.get(missing_env_var)) is None
65
+ ]
88
66
 
89
- except (ClientError, BotoCoreError) as exc:
67
+ if missing_environment_variables:
68
+ missing_environment_details = [
69
+ (
70
+ f"'{missing_env_var}' environment variable or "
71
+ f"'{envs_to_args.get(missing_env_var)}' config key"
72
+ )
73
+ for missing_env_var in missing_environment_variables
74
+ ]
90
75
  event_info = (
91
- f"Failed to validate AWS setup for LiteLLM clients: {exc}. "
92
- f"Ensure that you are using one of the available authentication methods:"
93
- f"credentials file, environment variables, or IAM roles. "
94
- f"Also, ensure that the AWS region is set correctly. "
76
+ f"The following environment variables or configuration keys are "
77
+ f"missing: "
78
+ f"{', '.join(missing_environment_details)}. "
79
+ f"These settings are required for API calls."
95
80
  )
96
81
  structlogger.error(
97
- f"{source_log}.validate_aws_credentials_for_litellm_clients",
82
+ f"{source_log}.validate_aws_environment_variables",
98
83
  event_info=event_info,
99
- exception=str(exc),
100
- model_name=litellm_model_name,
84
+ missing_environment_variables=missing_environment_variables,
101
85
  )
102
86
  raise ProviderClientValidationError(event_info)
103
87
 
@@ -37,7 +37,6 @@ class DefaultLiteLLMEmbeddingClient(_BaseLiteLLMEmbeddingClient):
37
37
 
38
38
  @classmethod
39
39
  def from_config(cls, config: Dict[str, Any]) -> "DefaultLiteLLMEmbeddingClient":
40
- """Creates a DefaultLiteLLMEmbeddingClient instance from a config dict."""
41
40
  default_config = DefaultLiteLLMClientConfig.from_dict(config)
42
41
  return cls(
43
42
  model=default_config.model,
@@ -122,7 +121,6 @@ class DefaultLiteLLMEmbeddingClient(_BaseLiteLLMEmbeddingClient):
122
121
  self._litellm_model_name,
123
122
  self._litellm_extra_parameters,
124
123
  "default_litellm_embedding_client",
125
- provider=self.provider,
126
124
  )
127
125
  else:
128
126
  super().validate_client_setup()