rasa-pro 3.11.5__py3-none-any.whl → 3.12.0__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 (559) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +135 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  73. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  76. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  82. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
  88. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
  95. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  96. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
  97. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
  99. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
  103. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
  106. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
  107. rasa/core/channels/inspector/dist/index.html +1 -1
  108. rasa/core/channels/inspector/package.json +1 -0
  109. rasa/core/channels/inspector/src/App.tsx +15 -2
  110. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  111. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  112. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  113. rasa/core/channels/inspector/yarn.lock +5 -0
  114. rasa/core/channels/mattermost.py +4 -4
  115. rasa/core/channels/rasa_chat.py +4 -4
  116. rasa/core/channels/rest.py +11 -12
  117. rasa/core/channels/rocketchat.py +4 -3
  118. rasa/core/channels/slack.py +6 -5
  119. rasa/core/channels/socketio.py +8 -28
  120. rasa/core/channels/studio_chat.py +212 -0
  121. rasa/core/channels/telegram.py +105 -55
  122. rasa/core/channels/twilio.py +3 -3
  123. rasa/core/channels/vier_cvg.py +2 -2
  124. rasa/core/channels/voice_ready/audiocodes.py +9 -9
  125. rasa/core/channels/voice_ready/jambonz.py +5 -5
  126. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  127. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  128. rasa/core/channels/voice_ready/utils.py +2 -2
  129. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  130. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  131. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  132. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  133. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  134. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  135. rasa/core/channels/voice_stream/call_state.py +6 -2
  136. rasa/core/channels/voice_stream/genesys.py +320 -0
  137. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  138. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  139. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  140. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  141. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  142. rasa/core/channels/voice_stream/util.py +1 -1
  143. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  144. rasa/core/channels/webexteams.py +3 -4
  145. rasa/core/constants.py +2 -0
  146. rasa/core/evaluation/marker.py +7 -6
  147. rasa/core/evaluation/marker_base.py +15 -16
  148. rasa/core/evaluation/marker_stats.py +3 -4
  149. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  150. rasa/core/exporter.py +4 -4
  151. rasa/core/featurizers/precomputation.py +8 -8
  152. rasa/core/featurizers/single_state_featurizer.py +7 -7
  153. rasa/core/featurizers/tracker_featurizers.py +13 -13
  154. rasa/core/http_interpreter.py +3 -4
  155. rasa/core/information_retrieval/__init__.py +1 -1
  156. rasa/core/information_retrieval/faiss.py +4 -4
  157. rasa/core/information_retrieval/information_retrieval.py +2 -2
  158. rasa/core/information_retrieval/milvus.py +3 -3
  159. rasa/core/information_retrieval/qdrant.py +3 -3
  160. rasa/core/jobs.py +1 -0
  161. rasa/core/lock.py +2 -3
  162. rasa/core/lock_store.py +3 -3
  163. rasa/core/migrate.py +12 -9
  164. rasa/core/nlg/__init__.py +1 -1
  165. rasa/core/nlg/callback.py +2 -3
  166. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  167. rasa/core/nlg/generator.py +85 -17
  168. rasa/core/nlg/interpolator.py +4 -3
  169. rasa/core/nlg/response.py +9 -7
  170. rasa/core/nlg/summarize.py +1 -0
  171. rasa/core/nlg/translate.py +55 -0
  172. rasa/core/persistor.py +3 -3
  173. rasa/core/policies/ensemble.py +10 -9
  174. rasa/core/policies/enterprise_search_policy.py +87 -21
  175. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  176. rasa/core/policies/flow_policy.py +13 -14
  177. rasa/core/policies/flows/flow_executor.py +85 -55
  178. rasa/core/policies/intentless_policy.py +6 -7
  179. rasa/core/policies/memoization.py +22 -20
  180. rasa/core/policies/policy.py +24 -22
  181. rasa/core/policies/rule_policy.py +37 -36
  182. rasa/core/policies/ted_policy.py +87 -85
  183. rasa/core/policies/unexpected_intent_policy.py +77 -75
  184. rasa/core/processor.py +167 -74
  185. rasa/core/run.py +5 -4
  186. rasa/core/secrets_manager/endpoints.py +2 -3
  187. rasa/core/secrets_manager/factory.py +2 -3
  188. rasa/core/secrets_manager/secret_manager.py +2 -3
  189. rasa/core/secrets_manager/vault.py +2 -2
  190. rasa/core/test.py +30 -30
  191. rasa/core/tracker_store.py +138 -49
  192. rasa/core/train.py +1 -1
  193. rasa/core/training/__init__.py +2 -2
  194. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  195. rasa/core/training/interactive.py +13 -13
  196. rasa/core/training/story_conflict.py +4 -5
  197. rasa/core/training/training.py +3 -5
  198. rasa/core/utils.py +5 -5
  199. rasa/core/visualize.py +1 -1
  200. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  201. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  202. rasa/dialogue_understanding/commands/__init__.py +22 -22
  203. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  204. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  205. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  206. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  207. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  208. rasa/dialogue_understanding/commands/command.py +3 -2
  209. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  210. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  211. rasa/dialogue_understanding/commands/error_command.py +1 -1
  212. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  213. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  214. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  215. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  216. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  217. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  218. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  219. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  220. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  221. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  222. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  223. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  224. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  225. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  226. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  227. rasa/dialogue_understanding/commands/utils.py +126 -43
  228. rasa/dialogue_understanding/constants.py +2 -0
  229. rasa/dialogue_understanding/generator/__init__.py +2 -0
  230. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  231. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  232. rasa/dialogue_understanding/generator/constants.py +12 -4
  233. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  234. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  235. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  236. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  237. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  238. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  239. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  240. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  241. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  242. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  243. rasa/dialogue_understanding/generator/utils.py +76 -0
  244. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  245. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  246. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  247. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  248. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  249. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  250. rasa/dialogue_understanding/patterns/completed.py +1 -1
  251. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  252. rasa/dialogue_understanding/patterns/correction.py +17 -3
  253. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  254. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  255. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  256. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  257. rasa/dialogue_understanding/patterns/search.py +1 -1
  258. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  259. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  260. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  261. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  262. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  263. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  264. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  265. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  266. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  267. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  268. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  269. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  270. rasa/dialogue_understanding/stack/utils.py +56 -10
  271. rasa/dialogue_understanding/utils.py +164 -0
  272. rasa/dialogue_understanding_test/README.md +429 -0
  273. rasa/dialogue_understanding_test/__init__.py +0 -0
  274. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  275. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  276. rasa/dialogue_understanding_test/constants.py +22 -0
  277. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  278. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  279. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  280. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  281. rasa/dialogue_understanding_test/io.py +443 -0
  282. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  283. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  285. rasa/dialogue_understanding_test/utils.py +70 -0
  286. rasa/dialogue_understanding_test/validation.py +77 -0
  287. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  288. rasa/e2e_test/assertions.py +202 -175
  289. rasa/e2e_test/assertions_schema.yml +6 -0
  290. rasa/e2e_test/constants.py +16 -1
  291. rasa/e2e_test/e2e_config.py +102 -41
  292. rasa/e2e_test/e2e_config_schema.yml +28 -10
  293. rasa/e2e_test/e2e_test_case.py +5 -5
  294. rasa/e2e_test/e2e_test_converter.py +2 -3
  295. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  296. rasa/e2e_test/e2e_test_result.py +1 -1
  297. rasa/e2e_test/e2e_test_runner.py +143 -38
  298. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  299. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  300. rasa/e2e_test/stub_custom_action.py +1 -1
  301. rasa/e2e_test/utils/generative_assertions.py +243 -0
  302. rasa/e2e_test/utils/io.py +123 -93
  303. rasa/e2e_test/utils/validation.py +101 -3
  304. rasa/engine/caching.py +5 -7
  305. rasa/engine/constants.py +1 -1
  306. rasa/engine/graph.py +3 -2
  307. rasa/engine/language.py +182 -0
  308. rasa/engine/recipes/config_files/default_config.yml +4 -0
  309. rasa/engine/recipes/default_components.py +13 -15
  310. rasa/engine/recipes/default_recipe.py +65 -49
  311. rasa/engine/recipes/graph_recipe.py +10 -7
  312. rasa/engine/recipes/recipe.py +2 -2
  313. rasa/engine/runner/dask.py +2 -2
  314. rasa/engine/runner/interface.py +1 -0
  315. rasa/engine/storage/local_model_storage.py +6 -4
  316. rasa/engine/storage/resource.py +2 -1
  317. rasa/engine/storage/storage.py +8 -3
  318. rasa/engine/training/components.py +2 -1
  319. rasa/engine/training/fingerprinting.py +4 -2
  320. rasa/engine/training/graph_trainer.py +4 -4
  321. rasa/engine/training/hooks.py +2 -2
  322. rasa/engine/validation.py +36 -33
  323. rasa/exceptions.py +3 -2
  324. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  325. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  326. rasa/graph_components/providers/domain_provider.py +3 -2
  327. rasa/graph_components/providers/flows_provider.py +2 -3
  328. rasa/graph_components/providers/forms_provider.py +4 -4
  329. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  330. rasa/graph_components/providers/responses_provider.py +4 -4
  331. rasa/graph_components/providers/rule_only_provider.py +3 -2
  332. rasa/graph_components/providers/story_graph_provider.py +8 -8
  333. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  334. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  335. rasa/graph_components/validators/finetuning_validator.py +10 -8
  336. rasa/hooks.py +19 -14
  337. rasa/jupyter.py +2 -2
  338. rasa/llm_fine_tuning/annotation_module.py +4 -4
  339. rasa/llm_fine_tuning/conversations.py +5 -33
  340. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  341. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  342. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  343. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  344. rasa/llm_fine_tuning/storage.py +3 -3
  345. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  346. rasa/llm_fine_tuning/utils.py +7 -0
  347. rasa/markers/marker.py +2 -3
  348. rasa/markers/marker_base.py +1 -2
  349. rasa/markers/upload.py +2 -2
  350. rasa/markers/validate.py +2 -3
  351. rasa/model.py +3 -5
  352. rasa/model_manager/config.py +1 -1
  353. rasa/model_manager/model_api.py +5 -4
  354. rasa/model_manager/runner_service.py +13 -10
  355. rasa/model_manager/socket_bridge.py +15 -9
  356. rasa/model_manager/studio_jwt_auth.py +1 -0
  357. rasa/model_manager/trainer_service.py +9 -7
  358. rasa/model_manager/utils.py +1 -1
  359. rasa/model_manager/warm_rasa_process.py +14 -9
  360. rasa/model_service.py +5 -6
  361. rasa/model_testing.py +13 -15
  362. rasa/model_training.py +29 -29
  363. rasa/nlu/classifiers/diet_classifier.py +72 -73
  364. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  365. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  366. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  367. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  368. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  369. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  370. rasa/nlu/convert.py +2 -2
  371. rasa/nlu/emulators/dialogflow.py +3 -3
  372. rasa/nlu/emulators/luis.py +5 -5
  373. rasa/nlu/emulators/no_emulator.py +1 -0
  374. rasa/nlu/emulators/wit.py +4 -4
  375. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  376. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  377. rasa/nlu/extractors/entity_synonyms.py +10 -9
  378. rasa/nlu/extractors/extractor.py +16 -16
  379. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  380. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  381. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  382. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  383. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  384. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  385. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  386. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  387. rasa/nlu/featurizers/featurizer.py +5 -4
  388. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  389. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  390. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  391. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  392. rasa/nlu/model.py +0 -1
  393. rasa/nlu/selectors/response_selector.py +67 -68
  394. rasa/nlu/test.py +38 -38
  395. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  396. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  397. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  398. rasa/nlu/tokenizers/tokenizer.py +6 -7
  399. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  400. rasa/nlu/utils/bilou_utils.py +7 -7
  401. rasa/nlu/utils/hugging_face/registry.py +22 -22
  402. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  403. rasa/nlu/utils/mitie_utils.py +2 -1
  404. rasa/nlu/utils/pattern_utils.py +1 -1
  405. rasa/nlu/utils/spacy_utils.py +3 -3
  406. rasa/plugin.py +12 -1
  407. rasa/server.py +3 -2
  408. rasa/shared/constants.py +45 -18
  409. rasa/shared/core/command_payload_reader.py +15 -7
  410. rasa/shared/core/constants.py +34 -4
  411. rasa/shared/core/conversation.py +1 -2
  412. rasa/shared/core/domain.py +19 -20
  413. rasa/shared/core/events.py +60 -39
  414. rasa/shared/core/flows/__init__.py +0 -1
  415. rasa/shared/core/flows/constants.py +11 -0
  416. rasa/shared/core/flows/flow.py +107 -26
  417. rasa/shared/core/flows/flow_step.py +4 -3
  418. rasa/shared/core/flows/flow_step_links.py +1 -2
  419. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  420. rasa/shared/core/flows/flows_list.py +3 -3
  421. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  422. rasa/shared/core/flows/nlu_trigger.py +1 -1
  423. rasa/shared/core/flows/steps/__init__.py +2 -2
  424. rasa/shared/core/flows/steps/action.py +1 -1
  425. rasa/shared/core/flows/steps/call.py +1 -1
  426. rasa/shared/core/flows/steps/collect.py +22 -40
  427. rasa/shared/core/flows/steps/internal.py +1 -1
  428. rasa/shared/core/flows/steps/link.py +1 -1
  429. rasa/shared/core/flows/steps/no_operation.py +2 -2
  430. rasa/shared/core/flows/steps/set_slots.py +1 -1
  431. rasa/shared/core/flows/utils.py +44 -4
  432. rasa/shared/core/flows/validation.py +4 -6
  433. rasa/shared/core/generator.py +20 -21
  434. rasa/shared/core/slot_mappings.py +360 -121
  435. rasa/shared/core/slots.py +163 -6
  436. rasa/shared/core/trackers.py +108 -33
  437. rasa/shared/core/training_data/loading.py +1 -1
  438. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  439. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  440. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  441. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  442. rasa/shared/core/training_data/structures.py +11 -12
  443. rasa/shared/core/training_data/visualization.py +10 -10
  444. rasa/shared/data.py +6 -6
  445. rasa/shared/engine/caching.py +0 -1
  446. rasa/shared/exceptions.py +2 -2
  447. rasa/shared/importers/importer.py +58 -2
  448. rasa/shared/importers/rasa.py +5 -6
  449. rasa/shared/importers/utils.py +1 -1
  450. rasa/shared/nlu/constants.py +9 -0
  451. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  452. rasa/shared/nlu/training_data/features.py +3 -3
  453. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  454. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  455. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  456. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  457. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  458. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  459. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  460. rasa/shared/nlu/training_data/loading.py +4 -4
  461. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  462. rasa/shared/nlu/training_data/message.py +13 -14
  463. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  464. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  465. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  466. rasa/shared/nlu/training_data/training_data.py +12 -13
  467. rasa/shared/nlu/training_data/util.py +11 -10
  468. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  469. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  470. rasa/shared/providers/_configs/client_config.py +3 -1
  471. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  472. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  473. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  474. rasa/shared/providers/_configs/model_group_config.py +8 -5
  475. rasa/shared/providers/_configs/oauth_config.py +33 -0
  476. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  477. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  478. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  479. rasa/shared/providers/_configs/utils.py +1 -0
  480. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  481. rasa/shared/providers/_utils.py +5 -5
  482. rasa/shared/providers/constants.py +6 -0
  483. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  484. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  485. rasa/shared/providers/embedding/embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  487. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  488. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  489. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  490. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  491. rasa/shared/providers/llm/llm_client.py +24 -8
  492. rasa/shared/providers/llm/llm_response.py +61 -2
  493. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  494. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  495. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  496. rasa/shared/providers/mappings.py +18 -19
  497. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  498. rasa/shared/providers/router/router_client.py +3 -1
  499. rasa/shared/utils/cli.py +1 -1
  500. rasa/shared/utils/common.py +15 -1
  501. rasa/shared/utils/constants.py +3 -0
  502. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  503. rasa/shared/utils/health_check/health_check.py +3 -3
  504. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  505. rasa/shared/utils/io.py +1 -1
  506. rasa/shared/utils/llm.py +100 -18
  507. rasa/shared/utils/pykwalify_extensions.py +25 -1
  508. rasa/shared/utils/schemas/domain.yml +26 -1
  509. rasa/shared/utils/schemas/events.py +1 -1
  510. rasa/shared/utils/yaml.py +24 -20
  511. rasa/studio/auth.py +3 -3
  512. rasa/studio/config.py +1 -2
  513. rasa/studio/data_handler.py +3 -3
  514. rasa/studio/download.py +1 -1
  515. rasa/studio/results_logger.py +3 -3
  516. rasa/studio/upload.py +21 -5
  517. rasa/telemetry.py +127 -48
  518. rasa/tracing/config.py +5 -3
  519. rasa/tracing/constants.py +12 -0
  520. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  521. rasa/tracing/instrumentation/instrumentation.py +61 -5
  522. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  523. rasa/tracing/instrumentation/metrics.py +52 -11
  524. rasa/tracing/metric_instrument_provider.py +54 -14
  525. rasa/utils/common.py +12 -24
  526. rasa/utils/endpoints.py +1 -1
  527. rasa/utils/io.py +7 -7
  528. rasa/utils/licensing.py +3 -4
  529. rasa/utils/log_utils.py +7 -6
  530. rasa/utils/ml_utils.py +1 -0
  531. rasa/utils/plotting.py +3 -3
  532. rasa/utils/sanic_error_handler.py +1 -1
  533. rasa/utils/tensorflow/callback.py +2 -2
  534. rasa/utils/tensorflow/crf.py +2 -2
  535. rasa/utils/tensorflow/data_generator.py +5 -5
  536. rasa/utils/tensorflow/environment.py +3 -3
  537. rasa/utils/tensorflow/feature_array.py +2 -3
  538. rasa/utils/tensorflow/layers.py +18 -12
  539. rasa/utils/tensorflow/layers_utils.py +2 -1
  540. rasa/utils/tensorflow/metrics.py +2 -2
  541. rasa/utils/tensorflow/model_data.py +7 -7
  542. rasa/utils/tensorflow/model_data_utils.py +10 -9
  543. rasa/utils/tensorflow/models.py +31 -32
  544. rasa/utils/tensorflow/rasa_layers.py +20 -19
  545. rasa/utils/tensorflow/types.py +2 -1
  546. rasa/utils/train_utils.py +23 -21
  547. rasa/utils/url_tools.py +1 -1
  548. rasa/validator.py +594 -115
  549. rasa/version.py +1 -1
  550. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  551. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  552. rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
  553. rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
  554. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
  555. rasa_pro-3.11.5.dist-info/RECORD +0 -785
  556. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  557. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  558. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  559. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
rasa/shared/core/slots.py CHANGED
@@ -1,16 +1,24 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  from abc import ABC, abstractmethod
5
+ from dataclasses import dataclass
3
6
  from typing import Any, Dict, List, Optional, Text, Type
4
7
 
8
+ from pydantic import BaseModel, Field
9
+
5
10
  import rasa.shared.core.constants
6
- from rasa.shared.exceptions import RasaException
7
11
  import rasa.shared.utils.common
8
12
  import rasa.shared.utils.io
9
13
  from rasa.shared.constants import (
10
- DOCS_URL_SLOTS,
11
- DOCS_URL_NLU_BASED_SLOTS,
12
14
  DOCS_URL_CATEGORICAL_SLOTS,
15
+ DOCS_URL_NLU_BASED_SLOTS,
16
+ DOCS_URL_SLOTS,
17
+ REFILL_UTTER,
18
+ REJECTIONS,
19
+ UTTER_ASK_PREFIX,
13
20
  )
21
+ from rasa.shared.exceptions import RasaException
14
22
 
15
23
  logger = logging.getLogger(__name__)
16
24
 
@@ -23,6 +31,80 @@ class InvalidSlotConfigError(RasaException, ValueError):
23
31
  """Raised if a slot's config is invalid."""
24
32
 
25
33
 
34
+ @dataclass
35
+ class SlotRejection:
36
+ """A pair of validation condition and an utterance for the case of failure."""
37
+
38
+ if_: str
39
+ """The condition that should be checked."""
40
+ utter: str
41
+ """The utterance that should be executed if the condition is met."""
42
+
43
+ @staticmethod
44
+ def from_dict(data: Dict[str, Any]) -> SlotRejection:
45
+ """Create a SlotRejection object from serialized data.
46
+
47
+ Args:
48
+ data: data for a SlotRejection object in a serialized format
49
+
50
+ Returns:
51
+ A SlotRejection object
52
+ """
53
+ return SlotRejection(
54
+ if_=data["if"],
55
+ utter=data["utter"],
56
+ )
57
+
58
+ def as_dict(self) -> Dict[str, Any]:
59
+ """Serialize the SlotRejection object.
60
+
61
+ Returns:
62
+ the SlotRejection object as serialized data
63
+ """
64
+ return {
65
+ "if": self.if_,
66
+ "utter": self.utter,
67
+ }
68
+
69
+
70
+ class SlotValidation(BaseModel):
71
+ rejections: List[SlotRejection] = Field(alias=REJECTIONS)
72
+ """how the slot value is validated using predicate evaluation."""
73
+ refill_utter: str = Field(alias=REFILL_UTTER)
74
+ """The utterance that the assistant uses to ask for the slot."""
75
+
76
+ @staticmethod
77
+ def from_dict(data: Dict[str, Any]) -> SlotValidation:
78
+ """Creates a SlotValidation object from serialised data.
79
+
80
+ Args:
81
+ data: data for a SlotValidation object in a serialized format
82
+
83
+ Returns:
84
+ A SlotValidation object
85
+ """
86
+ rejections = data.get(REJECTIONS)
87
+ if rejections is not None:
88
+ rejections = [
89
+ SlotRejection.from_dict(rejection) for rejection in rejections
90
+ ]
91
+
92
+ return SlotValidation(
93
+ rejections=rejections, refill_utter=data.get(REFILL_UTTER)
94
+ )
95
+
96
+ def as_dict(self) -> Dict[str, Any]:
97
+ """Serialize the SlotValidation object.
98
+
99
+ Returns:
100
+ the SlotValidation object as serialized data
101
+ """
102
+ return {
103
+ REJECTIONS: [rejection.as_dict() for rejection in self.rejections],
104
+ REFILL_UTTER: self.refill_utter,
105
+ }
106
+
107
+
26
108
  class Slot(ABC):
27
109
  """Key-value store for storing information during a conversation."""
28
110
 
@@ -41,6 +123,8 @@ class Slot(ABC):
41
123
  influence_conversation: bool = True,
42
124
  is_builtin: bool = False,
43
125
  shared_for_coexistence: bool = False,
126
+ filled_by: Optional[str] = None,
127
+ validation: Optional[Dict[str, Any]] = None,
44
128
  ) -> None:
45
129
  """Create a Slot.
46
130
 
@@ -57,9 +141,14 @@ class Slot(ABC):
57
141
  such as `return_value`.
58
142
  shared_for_coexistence: If `True` the slot is not forgotten after either
59
143
  dm1 or CALM finishes.
144
+ filled_by: The name of the extractor that fills the slot.
145
+ validation: The validation rules that should be used to validate
146
+ slot values.
60
147
  """
148
+ from rasa.shared.core.slot_mappings import SlotMapping
149
+
61
150
  self.name = name
62
- self.mappings = mappings
151
+ self.mappings = [SlotMapping.from_dict(mapping, name) for mapping in mappings]
63
152
  self._value = initial_value
64
153
  self.initial_value = initial_value
65
154
  self._value_reset_delay = value_reset_delay
@@ -67,6 +156,13 @@ class Slot(ABC):
67
156
  self._has_been_set = False
68
157
  self.is_builtin = is_builtin
69
158
  self.shared_for_coexistence = shared_for_coexistence
159
+ self._filled_by = filled_by
160
+
161
+ if validation:
162
+ validation.setdefault(REFILL_UTTER, f"{UTTER_ASK_PREFIX}{self.name}")
163
+ self.validation = (
164
+ SlotValidation.from_dict(validation) if validation else validation
165
+ )
70
166
 
71
167
  def feature_dimensionality(self) -> int:
72
168
  """How many features this single slot creates.
@@ -132,6 +228,16 @@ class Slot(ABC):
132
228
  self._value = value
133
229
  self._has_been_set = True
134
230
 
231
+ @property
232
+ def filled_by(self) -> Optional[str]:
233
+ """Gets the slot's latest value extractor."""
234
+ return self._filled_by
235
+
236
+ @filled_by.setter
237
+ def filled_by(self, extractor: str) -> None:
238
+ """Sets the slot's latest value extractor."""
239
+ self._filled_by = extractor
240
+
135
241
  def has_same_coerced_value(self, other_value: Any) -> bool:
136
242
  """Checks if the coerced value of is the same as the slot value.
137
243
 
@@ -176,12 +282,15 @@ class Slot(ABC):
176
282
 
177
283
  def persistence_info(self) -> Dict[str, Any]:
178
284
  """Returns relevant information to persist this slot."""
179
- return {
285
+ persistence_info_dict = {
180
286
  "type": rasa.shared.utils.common.module_path_from_instance(self),
181
287
  "initial_value": self.initial_value,
182
288
  "influence_conversation": self.influence_conversation,
183
- "mappings": self.mappings,
289
+ "mappings": [mapping.as_dict() for mapping in self.mappings],
184
290
  }
291
+ if self.validation:
292
+ persistence_info_dict["validation"] = self.validation.as_dict() # type: ignore
293
+ return persistence_info_dict
185
294
 
186
295
  def fingerprint(self) -> Text:
187
296
  """Returns a unique hash for the slot which is stable across python runs.
@@ -198,6 +307,10 @@ class Slot(ABC):
198
307
  return False
199
308
  return self.name == other.name and self.value == other.value
200
309
 
310
+ def requires_validation(self) -> bool:
311
+ """Indicates if the slot requires validation."""
312
+ return True if self.validation else False
313
+
201
314
 
202
315
  class FloatSlot(Slot):
203
316
  """A slot storing a float value."""
@@ -215,6 +328,8 @@ class FloatSlot(Slot):
215
328
  influence_conversation: bool = True,
216
329
  is_builtin: bool = False,
217
330
  shared_for_coexistence: bool = False,
331
+ filled_by: Optional[str] = None,
332
+ validation: Optional[Dict[str, Any]] = None,
218
333
  ) -> None:
219
334
  """Creates a FloatSlot.
220
335
 
@@ -230,6 +345,8 @@ class FloatSlot(Slot):
230
345
  influence_conversation,
231
346
  is_builtin,
232
347
  shared_for_coexistence,
348
+ filled_by=filled_by,
349
+ validation=validation,
233
350
  )
234
351
  self.max_value = max_value
235
352
  self.min_value = min_value
@@ -387,6 +504,8 @@ class CategoricalSlot(Slot):
387
504
  influence_conversation: bool = True,
388
505
  is_builtin: bool = False,
389
506
  shared_for_coexistence: bool = False,
507
+ filled_by: Optional[str] = None,
508
+ validation: Optional[Dict[str, Any]] = None,
390
509
  ) -> None:
391
510
  """Creates a `Categorical Slot` (see parent class for detailed docstring)."""
392
511
  super().__init__(
@@ -397,6 +516,8 @@ class CategoricalSlot(Slot):
397
516
  influence_conversation,
398
517
  is_builtin,
399
518
  shared_for_coexistence,
519
+ filled_by=filled_by,
520
+ validation=validation,
400
521
  )
401
522
  if values and None in values:
402
523
  rasa.shared.utils.io.raise_warning(
@@ -607,6 +728,8 @@ class AnySlot(Slot):
607
728
  influence_conversation: bool = False,
608
729
  is_builtin: bool = False,
609
730
  shared_for_coexistence: bool = False,
731
+ filled_by: Optional[str] = None,
732
+ validation: Optional[Dict[str, Any]] = None,
610
733
  ) -> None:
611
734
  """Creates an `Any Slot` (see parent class for detailed docstring).
612
735
 
@@ -630,6 +753,8 @@ class AnySlot(Slot):
630
753
  influence_conversation,
631
754
  is_builtin,
632
755
  shared_for_coexistence,
756
+ filled_by=filled_by,
757
+ validation=validation,
633
758
  )
634
759
 
635
760
  def __eq__(self, other: Any) -> bool:
@@ -652,3 +777,35 @@ class AnySlot(Slot):
652
777
  f"implement a custom slot type by subclassing '{Slot.__name__}'. "
653
778
  f"See the documentation for more information: {DOCS_URL_NLU_BASED_SLOTS}"
654
779
  )
780
+
781
+
782
+ class StrictCategoricalSlot(CategoricalSlot):
783
+ """A categorical slot that strictly enforces allowed values."""
784
+
785
+ type_name = "strict_categorical"
786
+
787
+ def coerce_value(self, value: Any) -> Any:
788
+ """Coerce the value to one of the allowed ones or raise an error if invalid."""
789
+ if value is None:
790
+ return value
791
+
792
+ for allowed_value in self.values:
793
+ # Allowed values are always stored as strings, so we can use casefold().
794
+ if value.casefold() == allowed_value.casefold():
795
+ return allowed_value
796
+
797
+ raise InvalidSlotConfigError(
798
+ f"Value '{value}' is not allowed for the slot '{self.name}'. "
799
+ f"Allowed values are: {self.values}"
800
+ )
801
+
802
+ @Slot.value.setter # type: ignore[attr-defined,misc]
803
+ def value(self, value: Any) -> None:
804
+ """Set the slot's value using strict coercion."""
805
+ coerced_value = self.coerce_value(value)
806
+ super(StrictCategoricalSlot, self.__class__).value.fset(self, coerced_value)
807
+
808
+ def add_default_value(self) -> None:
809
+ # StrictCategoricalSlot enforces validation against a specified set of values,
810
+ # so default values should not be automatically added.
811
+ pass
@@ -6,26 +6,28 @@ import os
6
6
  import time
7
7
  from collections import deque
8
8
  from enum import Enum
9
+ from functools import cached_property
9
10
  from typing import (
10
- Dict,
11
- Text,
11
+ TYPE_CHECKING,
12
12
  Any,
13
- Optional,
14
- Iterator,
13
+ Deque,
14
+ Dict,
15
+ FrozenSet,
15
16
  Generator,
17
+ Iterable,
18
+ Iterator,
19
+ List,
20
+ Optional,
21
+ Text,
22
+ Tuple,
16
23
  Type,
17
24
  TypeVar,
18
- List,
19
- Deque,
20
- Iterable,
21
25
  Union,
22
- FrozenSet,
23
- Tuple,
24
- TYPE_CHECKING,
25
26
  cast,
26
27
  )
27
28
 
28
29
  import rasa.shared.utils.io
30
+ from rasa.engine.language import Language
29
31
  from rasa.shared.constants import (
30
32
  ASSISTANT_ID_KEY,
31
33
  DEFAULT_SENDER_ID,
@@ -34,50 +36,52 @@ from rasa.shared.constants import (
34
36
  from rasa.shared.core import events
35
37
  from rasa.shared.core.constants import (
36
38
  ACTION_LISTEN_NAME,
37
- LOOP_NAME,
38
- SHOULD_NOT_BE_SET,
39
- PREVIOUS_ACTION,
40
- ACTIVE_LOOP,
41
39
  ACTION_SESSION_START_NAME,
40
+ ACTIVE_LOOP,
42
41
  FOLLOWUP_ACTION,
42
+ LANGUAGE_SLOT,
43
+ LOOP_NAME,
44
+ PREVIOUS_ACTION,
45
+ SHOULD_NOT_BE_SET,
43
46
  )
44
47
  from rasa.shared.core.conversation import Dialogue
45
48
  from rasa.shared.core.domain import Domain, State
46
49
  from rasa.shared.core.events import (
47
- DialogueStackUpdated,
48
- RoutingSessionEnded,
49
- SlotSet,
50
- UserUttered,
51
50
  ActionExecuted,
52
- Event,
53
- Restarted,
51
+ ActionExecutionRejected,
54
52
  ActionReverted,
55
- UserUtteranceReverted,
56
- BotUttered,
57
53
  ActiveLoop,
58
- SessionStarted,
59
- ActionExecutionRejected,
54
+ BotUttered,
60
55
  DefinePrevUserUtteredFeaturization,
56
+ DialogueStackUpdated,
57
+ Event,
61
58
  FlowStarted,
59
+ Restarted,
60
+ RoutingSessionEnded,
61
+ SessionStarted,
62
+ SlotSet,
63
+ UserUtteranceReverted,
64
+ UserUttered,
62
65
  )
63
66
  from rasa.shared.core.flows import FlowsList
64
- from rasa.shared.core.slots import AnySlot, Slot
67
+ from rasa.shared.core.slots import AnySlot, Slot, StrictCategoricalSlot
68
+ from rasa.shared.exceptions import RasaException
65
69
  from rasa.shared.nlu.constants import (
66
- ENTITY_ATTRIBUTE_VALUE,
67
- ENTITY_ATTRIBUTE_TYPE,
68
- ENTITY_ATTRIBUTE_GROUP,
69
- ENTITY_ATTRIBUTE_ROLE,
70
- ACTION_TEXT,
71
70
  ACTION_NAME,
71
+ ACTION_TEXT,
72
72
  ENTITIES,
73
+ ENTITY_ATTRIBUTE_GROUP,
74
+ ENTITY_ATTRIBUTE_ROLE,
75
+ ENTITY_ATTRIBUTE_TYPE,
76
+ ENTITY_ATTRIBUTE_VALUE,
73
77
  METADATA_MODEL_ID,
74
78
  )
75
79
 
76
80
  if TYPE_CHECKING:
81
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
77
82
  from rasa.shared.core.events import NLUPredictionData
78
- from rasa.shared.core.training_data.structures import Story
79
83
  from rasa.shared.core.training_data.story_writer.story_writer import StoryWriter
80
- from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
84
+ from rasa.shared.core.training_data.structures import Story
81
85
 
82
86
  EventTypeAlias = TypeVar("EventTypeAlias", bound=Event)
83
87
 
@@ -916,11 +920,13 @@ class DialogueStateTracker:
916
920
  continue
917
921
  slot.reset()
918
922
 
919
- def _set_slot(self, key: Text, value: Any) -> None:
923
+ def _set_slot(self, key: Text, value: Any, filled_by: Optional[str] = None) -> None:
920
924
  """Sets the value of a slot if that slot exists."""
921
925
  if key in self.slots:
922
926
  slot = self.slots[key]
923
927
  slot.value = value
928
+ if filled_by is not None:
929
+ slot.filled_by = filled_by
924
930
  else:
925
931
  logger.error(
926
932
  f"Tried to set non existent slot '{key}'. Make sure you "
@@ -1095,6 +1101,75 @@ class DialogueStateTracker:
1095
1101
 
1096
1102
  return FlowsList(active_flows)
1097
1103
 
1104
+ @cached_property
1105
+ def supported_languages(self) -> List[Language]:
1106
+ """Returns the supported languages for this model configuration
1107
+
1108
+ Returns:
1109
+ A list of supported languages.
1110
+ """
1111
+ if LANGUAGE_SLOT not in self.slots:
1112
+ raise RasaException(
1113
+ f"The required slot '{LANGUAGE_SLOT}' is missing from the tracker. "
1114
+ f"Please ensure that a slot named '{LANGUAGE_SLOT}' exists."
1115
+ )
1116
+
1117
+ language_slot = self.slots[LANGUAGE_SLOT]
1118
+
1119
+ if not isinstance(language_slot, StrictCategoricalSlot):
1120
+ raise RasaException(
1121
+ f"The slot '{LANGUAGE_SLOT}' must be of type "
1122
+ f"'{StrictCategoricalSlot.type_name}'. "
1123
+ f"Please update the slot configuration accordingly."
1124
+ )
1125
+
1126
+ return [
1127
+ Language.from_language_code(language_code)
1128
+ for language_code in language_slot.values
1129
+ ]
1130
+
1131
+ @property
1132
+ def current_language(self) -> Optional[Language]:
1133
+ """Get the language of the current conversation.
1134
+
1135
+ Returns:
1136
+ The language of the current conversation or `None` if not set.
1137
+ """
1138
+ language_code = self.get_slot("language")
1139
+ if not language_code:
1140
+ return None
1141
+
1142
+ supported_languages = self.supported_languages or []
1143
+ matching_language = (
1144
+ language
1145
+ for language in supported_languages
1146
+ if language.code == language_code
1147
+ )
1148
+ return next(matching_language, None)
1149
+
1150
+ @property
1151
+ def default_language(self) -> Language:
1152
+ """Get the assistant's default language.
1153
+
1154
+ Returns:
1155
+ The assistant's default language.
1156
+
1157
+ Raises:
1158
+ RasaException: If no default language is defined in the config.
1159
+ """
1160
+ supported_languages = self.supported_languages or []
1161
+ matching_language = (
1162
+ language for language in supported_languages if language.is_default is True
1163
+ )
1164
+ try:
1165
+ return next(matching_language)
1166
+ except StopIteration:
1167
+ raise RasaException(
1168
+ "No default language configured. "
1169
+ "Please configure the `language` parameter in config.yml file. "
1170
+ "Example: `language: en`."
1171
+ )
1172
+
1098
1173
 
1099
1174
  class TrackerEventDiffEngine:
1100
1175
  """Computes event difference of two trackers."""
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import os
3
- from typing import Text, Optional, List, Union
3
+ from typing import List, Optional, Text, Union
4
4
 
5
5
  import rasa.shared.data
6
6
  import rasa.shared.utils.io
@@ -1,14 +1,14 @@
1
1
  import logging
2
2
  from pathlib import Path
3
- from typing import Optional, Dict, Text, List, Any, Union
3
+ from typing import Any, Dict, List, Optional, Text, Union
4
4
 
5
5
  from rasa.shared.core.domain import Domain
6
- from rasa.shared.core.events import SlotSet, ActionExecuted, Event
7
- from rasa.shared.exceptions import RasaCoreException
6
+ from rasa.shared.core.events import ActionExecuted, Event, SlotSet
8
7
  from rasa.shared.core.training_data.story_reader.story_step_builder import (
9
8
  StoryStepBuilder,
10
9
  )
11
10
  from rasa.shared.core.training_data.structures import StoryStep
11
+ from rasa.shared.exceptions import RasaCoreException
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
@@ -1,17 +1,17 @@
1
1
  import logging
2
- from typing import Text, Optional, Dict, Any, List
2
+ from typing import Any, Dict, List, Optional, Text
3
3
 
4
4
  import rasa.shared.core.training_data.structures
5
5
  import rasa.shared.utils.io
6
6
  from rasa.shared.constants import DOCS_URL_STORIES
7
- from rasa.shared.core.events import UserUttered, Event
7
+ from rasa.shared.core.events import Event, UserUttered
8
8
  from rasa.shared.core.training_data.structures import (
9
- Checkpoint,
10
9
  GENERATED_CHECKPOINT_PREFIX,
11
10
  GENERATED_HASH_LENGTH,
12
11
  STORY_START,
13
- StoryStep,
12
+ Checkpoint,
14
13
  RuleStep,
14
+ StoryStep,
15
15
  )
16
16
 
17
17
  logger = logging.getLogger(__name__)
@@ -1,60 +1,58 @@
1
1
  import copy
2
2
  import functools
3
3
  import json
4
- from json import JSONDecodeError
5
4
  import logging
6
- import structlog
7
- from pathlib import Path
8
5
  import re
6
+ from json import JSONDecodeError
7
+ from pathlib import Path
9
8
  from re import Match, Pattern
10
- from typing import Dict, Text, List, Any, Optional, Union, Tuple
9
+ from typing import Any, Dict, List, Optional, Text, Tuple, Union
10
+
11
+ import structlog
11
12
 
12
- from rasa.shared.core.domain import Domain
13
13
  import rasa.shared.data
14
- from rasa.shared.core.slots import TextSlot, ListSlot
15
- from rasa.shared.exceptions import YamlException
16
14
  import rasa.shared.utils.io
17
- from rasa.shared.core.constants import LOOP_NAME
15
+ from rasa.shared.constants import (
16
+ DOCS_URL_RULES,
17
+ DOCS_URL_SLOTS,
18
+ DOCS_URL_STORIES,
19
+ INTENT_MESSAGE_PREFIX,
20
+ TEST_STORIES_FILE_PREFIX,
21
+ )
22
+ from rasa.shared.core.constants import LOOP_NAME, RULE_SNIPPET_ACTION_NAME
23
+ from rasa.shared.core.domain import Domain
24
+ from rasa.shared.core.events import (
25
+ ActiveLoop,
26
+ DialogueStackUpdated,
27
+ SlotSet,
28
+ UserUttered,
29
+ )
30
+ from rasa.shared.core.slots import ListSlot, TextSlot
31
+ from rasa.shared.core.training_data.story_reader.story_reader import StoryReader
32
+ from rasa.shared.core.training_data.structures import StoryStep
33
+ from rasa.shared.exceptions import YamlException
18
34
  from rasa.shared.nlu.constants import (
35
+ ACTION_TEXT,
19
36
  ENTITIES,
20
37
  ENTITY_ATTRIBUTE_END,
21
38
  ENTITY_ATTRIBUTE_START,
22
39
  ENTITY_ATTRIBUTE_TYPE,
23
40
  ENTITY_ATTRIBUTE_VALUE,
41
+ EXTRACTOR,
42
+ FULL_RETRIEVAL_INTENT_NAME_KEY,
24
43
  INTENT,
25
44
  INTENT_NAME_KEY,
26
45
  INTENT_RANKING_KEY,
27
46
  PREDICTED_CONFIDENCE_KEY,
28
- FULL_RETRIEVAL_INTENT_NAME_KEY,
29
- ACTION_TEXT,
30
47
  TEXT,
31
- EXTRACTOR,
32
48
  )
33
49
  from rasa.shared.nlu.training_data import entities_parser
34
-
35
- from rasa.shared.constants import (
36
- INTENT_MESSAGE_PREFIX,
37
- DOCS_URL_STORIES,
38
- TEST_STORIES_FILE_PREFIX,
39
- DOCS_URL_RULES,
40
- DOCS_URL_SLOTS,
41
- )
42
-
43
- from rasa.shared.core.constants import RULE_SNIPPET_ACTION_NAME
44
- from rasa.shared.core.events import (
45
- UserUttered,
46
- SlotSet,
47
- ActiveLoop,
48
- DialogueStackUpdated,
49
- )
50
- from rasa.shared.core.training_data.story_reader.story_reader import StoryReader
51
- from rasa.shared.core.training_data.structures import StoryStep
52
50
  from rasa.shared.nlu.training_data.message import Message
53
51
  from rasa.shared.utils.yaml import (
54
- validate_raw_yaml_using_schema_file,
52
+ is_key_in_yaml,
55
53
  read_yaml,
54
+ validate_raw_yaml_using_schema_file,
56
55
  validate_training_data_format_version,
57
- is_key_in_yaml,
58
56
  )
59
57
 
60
58
  logger = logging.getLogger(__name__)
@@ -1,55 +1,53 @@
1
+ import json
1
2
  from collections import OrderedDict
2
3
  from pathlib import Path
3
- from typing import Any, Dict, List, Text, Union, Optional
4
+ from typing import Any, Dict, List, Optional, Text, Union
4
5
 
5
6
  from ruamel import yaml
6
- import json
7
7
  from ruamel.yaml.comments import CommentedMap
8
8
  from ruamel.yaml.scalarstring import DoubleQuotedScalarString, LiteralScalarString
9
9
 
10
- import rasa.shared.utils.io
11
10
  import rasa.shared.core.constants
12
- from rasa.shared.constants import LATEST_TRAINING_DATA_FORMAT_VERSION
13
11
  import rasa.shared.core.events
12
+ import rasa.shared.utils.io
13
+ from rasa.shared.constants import LATEST_TRAINING_DATA_FORMAT_VERSION
14
14
  from rasa.shared.core.constants import FLOW_HASHES_SLOT
15
15
  from rasa.shared.core.events import (
16
- UserUttered,
17
16
  ActionExecuted,
18
- SlotSet,
19
17
  ActiveLoop,
20
- Event,
21
18
  DialogueStackUpdated,
19
+ Event,
20
+ SlotSet,
21
+ UserUttered,
22
22
  )
23
-
24
23
  from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
25
- KEY_STORIES,
26
- KEY_STORY_NAME,
27
- KEY_USER_INTENT,
28
- KEY_ENTITIES,
29
24
  KEY_ACTION,
30
- KEY_STEPS,
25
+ KEY_ACTIVE_LOOP,
26
+ KEY_BOT_END_TO_END_MESSAGE,
31
27
  KEY_CHECKPOINT,
32
- KEY_SLOT_NAME,
33
28
  KEY_CHECKPOINT_SLOTS,
29
+ KEY_COMMANDS,
30
+ KEY_ENTITIES,
34
31
  KEY_OR,
35
- KEY_USER_MESSAGE,
36
- KEY_ACTIVE_LOOP,
37
- KEY_BOT_END_TO_END_MESSAGE,
38
- KEY_RULES,
39
- KEY_RULE_FOR_CONVERSATION_START,
40
- KEY_WAIT_FOR_USER_INPUT_AFTER_RULE,
41
32
  KEY_RULE_CONDITION,
33
+ KEY_RULE_FOR_CONVERSATION_START,
42
34
  KEY_RULE_NAME,
35
+ KEY_RULES,
36
+ KEY_SLOT_NAME,
43
37
  KEY_STACK_UPDATE,
44
- KEY_COMMANDS,
38
+ KEY_STEPS,
39
+ KEY_STORIES,
40
+ KEY_STORY_NAME,
41
+ KEY_USER_INTENT,
42
+ KEY_USER_MESSAGE,
43
+ KEY_WAIT_FOR_USER_INPUT_AFTER_RULE,
45
44
  )
46
-
47
45
  from rasa.shared.core.training_data.story_writer.story_writer import StoryWriter
48
46
  from rasa.shared.core.training_data.structures import (
49
- StoryStep,
50
- Checkpoint,
51
47
  STORY_START,
48
+ Checkpoint,
52
49
  RuleStep,
50
+ StoryStep,
53
51
  )
54
52
  from rasa.shared.utils.yaml import write_yaml
55
53