rasa-pro 3.11.4__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 (580) 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 +137 -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/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,144 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any, Dict, List
5
+
6
+ import structlog
7
+
8
+ from rasa.dialogue_understanding.commands.command import Command
9
+ from rasa.dialogue_understanding.patterns.cannot_handle import (
10
+ CannotHandlePatternFlowStackFrame,
11
+ )
12
+ from rasa.dialogue_understanding.patterns.handle_digressions import (
13
+ HandleDigressionsPatternFlowStackFrame,
14
+ )
15
+ from rasa.dialogue_understanding.stack.utils import (
16
+ top_flow_frame,
17
+ )
18
+ from rasa.shared.core.events import Event
19
+ from rasa.shared.core.flows import FlowsList
20
+ from rasa.shared.core.flows.steps import CollectInformationFlowStep
21
+ from rasa.shared.core.flows.utils import ALL_LABEL
22
+ from rasa.shared.core.trackers import DialogueStateTracker
23
+ from rasa.shared.nlu.constants import HANDLE_DIGRESSIONS_COMMAND
24
+
25
+ structlogger = structlog.get_logger()
26
+
27
+
28
+ @dataclass
29
+ class HandleDigressionsCommand(Command):
30
+ """A command to handle digressions during an active flow."""
31
+
32
+ flow: str
33
+ """The interrupting flow."""
34
+
35
+ @classmethod
36
+ def command(cls) -> str:
37
+ """Returns the command type."""
38
+ return HANDLE_DIGRESSIONS_COMMAND
39
+
40
+ @classmethod
41
+ def from_dict(cls, data: Dict[str, Any]) -> HandleDigressionsCommand:
42
+ """Converts the dictionary to a command.
43
+
44
+ Returns:
45
+ The converted dictionary.
46
+ """
47
+ try:
48
+ return HandleDigressionsCommand(flow=data["flow"])
49
+ except KeyError as e:
50
+ raise ValueError(
51
+ f"Missing parameter '{e}' while parsing HandleDigressionsCommand."
52
+ ) from e
53
+
54
+ def run_command_on_tracker(
55
+ self,
56
+ tracker: DialogueStateTracker,
57
+ all_flows: FlowsList,
58
+ original_tracker: DialogueStateTracker,
59
+ ) -> List[Event]:
60
+ """Runs the command on the tracker.
61
+
62
+ Args:
63
+ tracker: The tracker to run the command on.
64
+ all_flows: All flows in the assistant.
65
+ original_tracker: The tracker before any command was executed.
66
+
67
+ Returns:
68
+ The events to apply to the tracker.
69
+ """
70
+ stack = tracker.stack
71
+ original_stack = original_tracker.stack
72
+
73
+ if self.flow not in all_flows.flow_ids:
74
+ structlogger.debug(
75
+ "command_executor.push_cannot_handle.start_invalid_flow_id",
76
+ command=self,
77
+ )
78
+ stack.push(CannotHandlePatternFlowStackFrame())
79
+ return tracker.create_stack_updated_events(stack)
80
+
81
+ # this allows to include called user flows in the stack search
82
+ latest_user_frame = top_flow_frame(original_stack, ignore_call_frames=False)
83
+
84
+ if latest_user_frame is None:
85
+ structlogger.debug(
86
+ "command_executor.skip_command.no_top_flow", command=self
87
+ )
88
+ return []
89
+
90
+ original_top_flow = latest_user_frame.flow(all_flows)
91
+ current_step = original_top_flow.step_by_id(latest_user_frame.step_id)
92
+ if not isinstance(current_step, CollectInformationFlowStep):
93
+ structlogger.debug(
94
+ "command_executor.skip_command.not_at_a_collect_step", command=self
95
+ )
96
+ return []
97
+
98
+ ask_confirm_digressions = set(
99
+ current_step.ask_confirm_digressions
100
+ + original_top_flow.ask_confirm_digressions
101
+ )
102
+
103
+ block_digressions = set(
104
+ current_step.block_digressions + original_top_flow.block_digressions
105
+ )
106
+
107
+ if block_digressions:
108
+ if ALL_LABEL in block_digressions:
109
+ block_digressions.remove(ALL_LABEL)
110
+ block_digressions.add(self.flow)
111
+
112
+ if ask_confirm_digressions:
113
+ if ALL_LABEL in ask_confirm_digressions:
114
+ ask_confirm_digressions.remove(ALL_LABEL)
115
+ ask_confirm_digressions.add(self.flow)
116
+
117
+ structlogger.debug(
118
+ "command_executor.push_handle_digressions",
119
+ interrupting_flow_id=self.flow,
120
+ interrupted_flow_id=original_top_flow.id,
121
+ interrupted_step_id=current_step.id,
122
+ ask_confirm_digressions=ask_confirm_digressions,
123
+ block_digressions=block_digressions,
124
+ )
125
+ stack.push(
126
+ HandleDigressionsPatternFlowStackFrame(
127
+ interrupting_flow_id=self.flow,
128
+ interrupted_flow_id=original_top_flow.id,
129
+ interrupted_step_id=current_step.id,
130
+ ask_confirm_digressions=ask_confirm_digressions,
131
+ block_digressions=block_digressions,
132
+ )
133
+ )
134
+
135
+ return tracker.create_stack_updated_events(stack)
136
+
137
+ def __hash__(self) -> int:
138
+ return hash(self.flow)
139
+
140
+ def __eq__(self, other: object) -> bool:
141
+ if not isinstance(other, HandleDigressionsCommand):
142
+ return False
143
+
144
+ return other.flow == self.flow
@@ -1,10 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List
5
6
 
6
7
  import structlog
7
- from rasa.dialogue_understanding.commands import Command
8
+
9
+ from rasa.dialogue_understanding.commands.command import Command
10
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
+ CommandSyntaxManager,
12
+ CommandSyntaxVersion,
13
+ )
8
14
  from rasa.dialogue_understanding.patterns.human_handoff import (
9
15
  HumanHandoffPatternFlowStackFrame,
10
16
  )
@@ -60,7 +66,31 @@ class HumanHandoffCommand(Command):
60
66
  return hash(self.command())
61
67
 
62
68
  def __eq__(self, other: object) -> bool:
63
- if not isinstance(other, HumanHandoffCommand):
64
- return False
69
+ return isinstance(other, HumanHandoffCommand)
70
+
71
+ def to_dsl(self) -> str:
72
+ """Converts the command to a DSL string."""
73
+ mapper = {
74
+ CommandSyntaxVersion.v1: "HumanHandoff()",
75
+ CommandSyntaxVersion.v2: "hand over",
76
+ }
77
+ return mapper.get(
78
+ CommandSyntaxManager.get_syntax_version(),
79
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
80
+ )
65
81
 
66
- return True
82
+ @classmethod
83
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> HumanHandoffCommand:
84
+ """Converts the DSL string to a command."""
85
+ return HumanHandoffCommand()
86
+
87
+ @staticmethod
88
+ def regex_pattern() -> str:
89
+ mapper = {
90
+ CommandSyntaxVersion.v1: r"HumanHandoff\(\)",
91
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*hand over['"`]*$""",
92
+ }
93
+ return mapper.get(
94
+ CommandSyntaxManager.get_syntax_version(),
95
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
96
+ )
@@ -1,8 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import FreeFormAnswerCommand
6
+
7
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
8
+ CommandSyntaxManager,
9
+ CommandSyntaxVersion,
10
+ )
11
+ from rasa.dialogue_understanding.commands.free_form_answer_command import (
12
+ FreeFormAnswerCommand,
13
+ )
6
14
  from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
7
15
  from rasa.shared.core.events import Event
8
16
  from rasa.shared.core.flows import FlowsList
@@ -51,7 +59,31 @@ class KnowledgeAnswerCommand(FreeFormAnswerCommand):
51
59
  return hash(self.command())
52
60
 
53
61
  def __eq__(self, other: object) -> bool:
54
- if not isinstance(other, KnowledgeAnswerCommand):
55
- return False
62
+ return isinstance(other, KnowledgeAnswerCommand)
63
+
64
+ def to_dsl(self) -> str:
65
+ """Converts the command to a DSL string."""
66
+ mapper = {
67
+ CommandSyntaxVersion.v1: "SearchAndReply()",
68
+ CommandSyntaxVersion.v2: "provide info",
69
+ }
70
+ return mapper.get(
71
+ CommandSyntaxManager.get_syntax_version(),
72
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
73
+ )
74
+
75
+ @classmethod
76
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> KnowledgeAnswerCommand:
77
+ """Converts the DSL string to a command."""
78
+ return KnowledgeAnswerCommand()
56
79
 
57
- return True
80
+ @staticmethod
81
+ def regex_pattern() -> str:
82
+ mapper = {
83
+ CommandSyntaxVersion.v1: r"SearchAndReply\(\)",
84
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*provide info['"`]*$""",
85
+ }
86
+ return mapper.get(
87
+ CommandSyntaxManager.get_syntax_version(),
88
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
89
+ )
@@ -2,7 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import Command
5
+
6
+ from rasa.dialogue_understanding.commands.command import Command
6
7
  from rasa.shared.core.events import Event
7
8
  from rasa.shared.core.flows import FlowsList
8
9
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -0,0 +1,94 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
5
+
6
+ from rasa.shared.core.events import Event
7
+ from rasa.shared.core.flows import FlowsList
8
+ from rasa.shared.core.trackers import DialogueStateTracker
9
+
10
+
11
+ @runtime_checkable
12
+ class PromptCommand(Protocol):
13
+ """
14
+ A protocol for commands predicted by the LLM model and incorporated into the prompt.
15
+ """
16
+
17
+ @classmethod
18
+ def command(cls) -> str:
19
+ """
20
+ Returns the command name.
21
+
22
+ This class method should be implemented to return the name of the command.
23
+ """
24
+ ...
25
+
26
+ @classmethod
27
+ def from_dict(cls, data: Dict[str, Any]) -> PromptCommand:
28
+ """
29
+ Converts the dictionary to a command.
30
+
31
+ This class method should be implemented to create a command instance from the
32
+ given dictionary.
33
+ """
34
+ ...
35
+
36
+ def run_command_on_tracker(
37
+ self,
38
+ tracker: DialogueStateTracker,
39
+ all_flows: FlowsList,
40
+ original_tracker: DialogueStateTracker,
41
+ ) -> List[Event]:
42
+ """
43
+ Runs the command on the tracker.
44
+
45
+ This method should be implemented to execute the command on the given tracker.
46
+ """
47
+ ...
48
+
49
+ def __hash__(self) -> int:
50
+ """
51
+ Returns the hash of the command.
52
+
53
+ This method should be implemented to return the hash of the command.
54
+ Useful for comparing commands and storing them in sets.
55
+ """
56
+ ...
57
+
58
+ def __eq__(self, other: object) -> bool:
59
+ """
60
+ Compares the command with another object.
61
+
62
+ This method should be implemented to compare the command with another object.
63
+ """
64
+ ...
65
+
66
+ def to_dsl(self) -> str:
67
+ """
68
+ Converts the command to a DSL string.
69
+
70
+ This method should be implemented to convert the command to a DSL string.
71
+ A DSL string is a string representation of the command that is used in the
72
+ prompt.
73
+ """
74
+ ...
75
+
76
+ @classmethod
77
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> Optional[PromptCommand]:
78
+ """
79
+ Converts the regex match to a command.
80
+
81
+ This class method should be implemented to create a command instance from the
82
+ given DSL string.
83
+ """
84
+ ...
85
+
86
+ @staticmethod
87
+ def regex_pattern() -> str:
88
+ """
89
+ Returns the regex pattern for the command.
90
+
91
+ This method should be implemented to return the regex pattern that matches the
92
+ command in the prompt.
93
+ """
94
+ ...
@@ -1,8 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import Command
6
+
7
+ from rasa.dialogue_understanding.commands.command import Command
8
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
9
+ CommandSyntaxManager,
10
+ CommandSyntaxVersion,
11
+ )
6
12
  from rasa.dialogue_understanding.patterns.repeat import (
7
13
  RepeatBotMessagesPatternFlowStackFrame,
8
14
  )
@@ -54,7 +60,31 @@ class RepeatBotMessagesCommand(Command):
54
60
  return hash(self.command())
55
61
 
56
62
  def __eq__(self, other: object) -> bool:
57
- if not isinstance(other, RepeatBotMessagesCommand):
58
- return False
63
+ return isinstance(other, RepeatBotMessagesCommand)
64
+
65
+ def to_dsl(self) -> str:
66
+ """Converts the command to a DSL string."""
67
+ mapper = {
68
+ CommandSyntaxVersion.v1: "RepeatLastBotMessages()",
69
+ CommandSyntaxVersion.v2: "repeat message",
70
+ }
71
+ return mapper.get(
72
+ CommandSyntaxManager.get_syntax_version(),
73
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
74
+ )
75
+
76
+ @classmethod
77
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> RepeatBotMessagesCommand:
78
+ """Converts the DSL string to a command."""
79
+ return RepeatBotMessagesCommand()
59
80
 
60
- return True
81
+ @staticmethod
82
+ def regex_pattern() -> str:
83
+ mapper = {
84
+ CommandSyntaxVersion.v1: r"RepeatLastBotMessages\(\)",
85
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*repeat message['"`]*$""",
86
+ }
87
+ return mapper.get(
88
+ CommandSyntaxManager.get_syntax_version(),
89
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
90
+ )
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Dict, List
5
5
 
6
- from rasa.dialogue_understanding.commands import Command
6
+ from rasa.dialogue_understanding.commands.command import Command
7
7
  from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
8
8
  from rasa.shared.core.events import Event
9
9
  from rasa.shared.core.flows import FlowsList
@@ -52,7 +52,4 @@ class RestartCommand(Command):
52
52
  return hash(self.command())
53
53
 
54
54
  def __eq__(self, other: object) -> bool:
55
- if not isinstance(other, RestartCommand):
56
- return False
57
-
58
- return True
55
+ return isinstance(other, RestartCommand)
@@ -2,7 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import Command
5
+
6
+ from rasa.dialogue_understanding.commands.command import Command
6
7
  from rasa.shared.core.events import Event, SessionEnded
7
8
  from rasa.shared.core.flows import FlowsList
8
9
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -55,7 +56,4 @@ class SessionEndCommand(Command):
55
56
  return hash(self.command())
56
57
 
57
58
  def __eq__(self, other: object) -> bool:
58
- if not isinstance(other, SessionEndCommand):
59
- return False
60
-
61
- return True
59
+ return isinstance(other, SessionEndCommand)
@@ -2,7 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import Command
5
+
6
+ from rasa.dialogue_understanding.commands.command import Command
6
7
  from rasa.dialogue_understanding.patterns.session_start import (
7
8
  SessionStartPatternFlowStackFrame,
8
9
  )
@@ -53,7 +54,4 @@ class SessionStartCommand(Command):
53
54
  return hash(self.command())
54
55
 
55
56
  def __eq__(self, other: object) -> bool:
56
- if not isinstance(other, SessionStartCommand):
57
- return False
58
-
59
- return True
57
+ return isinstance(other, SessionStartCommand)
@@ -1,11 +1,20 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
- from enum import Enum
5
5
  from typing import Any, Dict, List
6
6
 
7
7
  import structlog
8
- from rasa.dialogue_understanding.commands import Command
8
+
9
+ from rasa.dialogue_understanding.commands.command import Command
10
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
+ CommandSyntaxManager,
12
+ CommandSyntaxVersion,
13
+ )
14
+ from rasa.dialogue_understanding.commands.utils import (
15
+ clean_extracted_value,
16
+ get_nullable_slot_value,
17
+ )
9
18
  from rasa.dialogue_understanding.patterns.collect_information import (
10
19
  CollectInformationPatternFlowStackFrame,
11
20
  )
@@ -13,6 +22,7 @@ from rasa.dialogue_understanding.stack.utils import (
13
22
  get_collect_steps_excluding_ask_before_filling_for_active_flow,
14
23
  )
15
24
  from rasa.shared.constants import ROUTE_TO_CALM_SLOT
25
+ from rasa.shared.core.constants import SetSlotExtractor
16
26
  from rasa.shared.core.events import Event, SlotSet
17
27
  from rasa.shared.core.flows import FlowsList
18
28
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -21,17 +31,6 @@ from rasa.shared.nlu.constants import SET_SLOT_COMMAND
21
31
  structlogger = structlog.get_logger()
22
32
 
23
33
 
24
- class SetSlotExtractor(Enum):
25
- """The extractors that can set a slot."""
26
-
27
- LLM = "LLM"
28
- COMMAND_PAYLOAD_READER = "CommandPayloadReader"
29
- NLU = "NLU"
30
-
31
- def __str__(self) -> str:
32
- return self.value
33
-
34
-
35
34
  def get_flows_predicted_to_start_from_tracker(
36
35
  tracker: DialogueStateTracker,
37
36
  ) -> List[str]:
@@ -44,8 +43,8 @@ def get_flows_predicted_to_start_from_tracker(
44
43
  The flows that are predicted to start from the current state.
45
44
  """
46
45
  from rasa.dialogue_understanding.processor.command_processor import (
47
- get_commands_from_tracker,
48
46
  filter_start_flow_commands,
47
+ get_commands_from_tracker,
49
48
  )
50
49
 
51
50
  commands = get_commands_from_tracker(tracker)
@@ -127,10 +126,12 @@ class SetSlotCommand(Command):
127
126
  if (
128
127
  self.name not in slots_of_active_flow
129
128
  and self.name != ROUTE_TO_CALM_SLOT
129
+ and not slot.is_builtin
130
130
  and self.extractor
131
131
  in {
132
132
  SetSlotExtractor.LLM.value,
133
133
  SetSlotExtractor.COMMAND_PAYLOAD_READER.value,
134
+ SetSlotExtractor.NLU.value,
134
135
  }
135
136
  ):
136
137
  # Get the other predicted flows from the most recent message on the tracker.
@@ -148,7 +149,9 @@ class SetSlotCommand(Command):
148
149
  return []
149
150
 
150
151
  structlogger.debug("command_executor.set_slot", command=self)
151
- return [SlotSet(self.name, slot.coerce_value(self.value))]
152
+ return [
153
+ SlotSet(self.name, slot.coerce_value(self.value), filled_by=self.extractor)
154
+ ]
152
155
 
153
156
  def __hash__(self) -> int:
154
157
  return hash(self.value) + hash(self.name)
@@ -157,4 +160,40 @@ class SetSlotCommand(Command):
157
160
  if not isinstance(other, SetSlotCommand):
158
161
  return False
159
162
 
160
- return other.value == self.value and other.name == self.name
163
+ return (
164
+ str(other.value).lower() == str(self.value).lower()
165
+ and other.name == self.name
166
+ )
167
+
168
+ def to_dsl(self) -> str:
169
+ """Converts the command to a DSL string."""
170
+ mapper = {
171
+ CommandSyntaxVersion.v1: f"SetSlot({self.name}, {self.value})",
172
+ CommandSyntaxVersion.v2: f"set slot {self.name} {self.value}",
173
+ }
174
+ return mapper.get(
175
+ CommandSyntaxManager.get_syntax_version(),
176
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
177
+ )
178
+
179
+ @classmethod
180
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> SetSlotCommand:
181
+ """Converts the DSL string to a command."""
182
+ slot_name = str(match.group(1).strip())
183
+ slot_value = clean_extracted_value(match.group(2))
184
+ return SetSlotCommand(name=slot_name, value=get_nullable_slot_value(slot_value))
185
+
186
+ @staticmethod
187
+ def regex_pattern() -> str:
188
+ mapper = {
189
+ CommandSyntaxVersion.v1: (
190
+ r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
191
+ ),
192
+ CommandSyntaxVersion.v2: (
193
+ r"""^[\s\W\d]*set slot ['"`]?([a-zA-Z_][a-zA-Z0-9_-]*)['"`]? ['"`]?(.+?)['"`]*$""" # noqa: E501
194
+ ),
195
+ }
196
+ return mapper.get(
197
+ CommandSyntaxManager.get_syntax_version(),
198
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
199
+ )
@@ -1,10 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List
5
6
 
6
7
  import structlog
7
- from rasa.dialogue_understanding.commands import Command
8
+
9
+ from rasa.dialogue_understanding.commands.command import Command
10
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
+ CommandSyntaxManager,
12
+ CommandSyntaxVersion,
13
+ )
8
14
  from rasa.dialogue_understanding.patterns.skip_question import (
9
15
  SkipQuestionPatternFlowStackFrame,
10
16
  )
@@ -69,7 +75,31 @@ class SkipQuestionCommand(Command):
69
75
  return hash(self.command())
70
76
 
71
77
  def __eq__(self, other: object) -> bool:
72
- if not isinstance(other, SkipQuestionCommand):
73
- return False
78
+ return isinstance(other, SkipQuestionCommand)
79
+
80
+ def to_dsl(self) -> str:
81
+ """Converts the command to a DSL string."""
82
+ mapper = {
83
+ CommandSyntaxVersion.v1: "SkipQuestion()",
84
+ CommandSyntaxVersion.v2: "skip question",
85
+ }
86
+ return mapper.get(
87
+ CommandSyntaxManager.get_syntax_version(),
88
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
89
+ )
90
+
91
+ @classmethod
92
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> SkipQuestionCommand:
93
+ """Converts the DSL string to a command."""
94
+ return SkipQuestionCommand()
74
95
 
75
- return True
96
+ @staticmethod
97
+ def regex_pattern() -> str:
98
+ mapper = {
99
+ CommandSyntaxVersion.v1: r"SkipQuestion\(\)",
100
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*skip question['"`]*$""",
101
+ }
102
+ return mapper.get(
103
+ CommandSyntaxManager.get_syntax_version(),
104
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
105
+ )