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
@@ -1,10 +1,21 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
- from typing import Any, Dict, List
5
+ from typing import Any, Dict, List, Optional
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
+ )
14
+ from rasa.dialogue_understanding.patterns.clarify import FLOW_PATTERN_CLARIFICATION
15
+ from rasa.dialogue_understanding.patterns.continue_interrupted import (
16
+ ContinueInterruptedPatternFlowStackFrame,
17
+ )
18
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
8
19
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
9
20
  FlowStackFrameType,
10
21
  UserFlowStackFrame,
@@ -66,6 +77,10 @@ class StartFlowCommand(Command):
66
77
  applied_events: List[Event] = []
67
78
 
68
79
  if self.flow in user_flows_on_the_stack(stack):
80
+ top_frame = stack.top()
81
+ if top_frame is not None and top_frame.type() == FLOW_PATTERN_CLARIFICATION:
82
+ return self.change_flow_frame_position_in_the_stack(stack, tracker)
83
+
69
84
  structlogger.debug(
70
85
  "command_executor.skip_command.already_started_flow", command=self
71
86
  )
@@ -105,3 +120,64 @@ class StartFlowCommand(Command):
105
120
  return False
106
121
 
107
122
  return other.flow == self.flow
123
+
124
+ def to_dsl(self) -> str:
125
+ """Converts the command to a DSL string."""
126
+ mapper = {
127
+ CommandSyntaxVersion.v1: f"StartFlow({self.flow})",
128
+ CommandSyntaxVersion.v2: f"start flow {self.flow}",
129
+ }
130
+ return mapper.get(
131
+ CommandSyntaxManager.get_syntax_version(),
132
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
133
+ )
134
+
135
+ @classmethod
136
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> Optional[StartFlowCommand]:
137
+ """Converts the DSL string to a command."""
138
+ return StartFlowCommand(flow=str(match.group(1).strip()))
139
+
140
+ @staticmethod
141
+ def regex_pattern() -> str:
142
+ mapper = {
143
+ CommandSyntaxVersion.v1: r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)",
144
+ CommandSyntaxVersion.v2: (
145
+ r"""^[\s\W\d]*start flow ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
146
+ ),
147
+ }
148
+ return mapper.get(
149
+ CommandSyntaxManager.get_syntax_version(),
150
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
151
+ )
152
+
153
+ def change_flow_frame_position_in_the_stack(
154
+ self, stack: DialogueStack, tracker: DialogueStateTracker
155
+ ) -> List[Event]:
156
+ """Changes the position of the flow frame in the stack.
157
+
158
+ This is a special case when pattern clarification is the active flow and
159
+ the same flow is selected to start. In this case, the existing flow frame
160
+ should be moved up in the stack.
161
+ """
162
+ frames = stack.frames[:]
163
+
164
+ for idx, frame in enumerate(frames):
165
+ if isinstance(frame, UserFlowStackFrame) and frame.flow_id == self.flow:
166
+ structlogger.debug(
167
+ "command_executor.change_flow_position_during_clarification",
168
+ command=self,
169
+ index=idx,
170
+ )
171
+ # pop the continue interrupted flow frame if it exists
172
+ next_frame = frames[idx + 1] if idx + 1 < len(frames) else None
173
+ if (
174
+ isinstance(next_frame, ContinueInterruptedPatternFlowStackFrame)
175
+ and next_frame.previous_flow_name == self.flow
176
+ ):
177
+ stack.frames.pop(idx + 1)
178
+ # move up the existing flow from the stack
179
+ stack.frames.pop(idx)
180
+ stack.push(frame)
181
+ return tracker.create_stack_updated_events(stack)
182
+
183
+ return []
@@ -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.user_silence import (
7
8
  UserSilencePatternFlowStackFrame,
8
9
  )
@@ -53,7 +54,4 @@ class UserSilenceCommand(Command):
53
54
  return hash(self.command())
54
55
 
55
56
  def __eq__(self, other: object) -> bool:
56
- if not isinstance(other, UserSilenceCommand):
57
- return False
58
-
59
- return True
57
+ return isinstance(other, UserSilenceCommand)
@@ -1,45 +1,128 @@
1
- from typing import Dict, Type
2
-
3
- from rasa.dialogue_understanding.commands import (
4
- CancelFlowCommand,
5
- CannotHandleCommand,
6
- ChitChatAnswerCommand,
7
- Command,
8
- HumanHandoffCommand,
9
- KnowledgeAnswerCommand,
10
- SessionStartCommand,
11
- SkipQuestionCommand,
12
- RestartCommand,
13
- )
14
- from rasa.dialogue_understanding.commands.user_silence_command import UserSilenceCommand
15
- from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
16
- from rasa.dialogue_understanding.patterns.cannot_handle import (
17
- CannotHandlePatternFlowStackFrame,
18
- )
19
- from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
20
- from rasa.dialogue_understanding.patterns.human_handoff import (
21
- HumanHandoffPatternFlowStackFrame,
22
- )
23
- from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
24
- from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
25
- from rasa.dialogue_understanding.patterns.session_start import (
26
- SessionStartPatternFlowStackFrame,
27
- )
28
- from rasa.dialogue_understanding.patterns.skip_question import (
29
- SkipQuestionPatternFlowStackFrame,
30
- )
31
- from rasa.dialogue_understanding.patterns.user_silence import (
32
- UserSilencePatternFlowStackFrame,
1
+ from typing import TYPE_CHECKING, List, Optional, Tuple, Union
2
+
3
+ import structlog
4
+
5
+ from rasa.dialogue_understanding.patterns.validate_slot import (
6
+ ValidateSlotPatternFlowStackFrame,
33
7
  )
8
+ from rasa.shared.constants import ACTION_ASK_PREFIX, UTTER_ASK_PREFIX
9
+ from rasa.shared.core.events import Event, SlotSet
10
+ from rasa.shared.core.slots import Slot
11
+ from rasa.shared.core.trackers import DialogueStateTracker
12
+
13
+ if TYPE_CHECKING:
14
+ from rasa.dialogue_understanding.commands import StartFlowCommand
15
+ from rasa.shared.core.flows import FlowsList
16
+
17
+ structlogger = structlog.get_logger()
18
+
19
+
20
+ def start_flow_by_name(
21
+ flow_name: str, flows: "FlowsList"
22
+ ) -> Optional["StartFlowCommand"]:
23
+ from rasa.dialogue_understanding.commands import StartFlowCommand
24
+
25
+ if flow_name in flows.user_flow_ids:
26
+ return StartFlowCommand(flow=flow_name)
27
+ else:
28
+ structlogger.debug(
29
+ "command_parser.start_flow_by_name.invalid_flow_id", flow=flow_name
30
+ )
31
+ return None
32
+
33
+
34
+ def extract_cleaned_options(options_str: str) -> List[str]:
35
+ """Extract and clean options from a string."""
36
+ delimiters = [",", " "]
37
+
38
+ for delimiter in delimiters:
39
+ options_str = options_str.replace(delimiter, " ")
40
+
41
+ return sorted(
42
+ opt.strip().strip('"').strip("'") for opt in options_str.split() if opt.strip()
43
+ )
44
+
45
+
46
+ def is_none_value(value: str) -> bool:
47
+ """Check if the value is a none value."""
48
+ if not value:
49
+ return True
50
+ return value in {
51
+ "[missing information]",
52
+ "[missing]",
53
+ "None",
54
+ "undefined",
55
+ "null",
56
+ }
57
+
58
+
59
+ def clean_extracted_value(value: str) -> str:
60
+ """Clean up the extracted value from the llm."""
61
+ # replace any combination of single quotes, double quotes, and spaces
62
+ # from the beginning and end of the string
63
+ return value.strip("'\" ")
64
+
65
+
66
+ def get_nullable_slot_value(slot_value: str) -> Union[str, None]:
67
+ """Get the slot value or None if the value is a none value.
68
+
69
+ Args:
70
+ slot_value: the value to coerce
71
+
72
+ Returns:
73
+ The slot value or None if the value is a none value.
74
+ """
75
+ return slot_value if not is_none_value(slot_value) else None
76
+
77
+
78
+ def initialize_pattern_validate_slot(
79
+ slot: Slot,
80
+ ) -> Optional[ValidateSlotPatternFlowStackFrame]:
81
+ """Initialize the pattern to validate a slot value."""
82
+ if not slot.requires_validation():
83
+ return None
84
+
85
+ validation = slot.validation
86
+ slot_name = slot.name
87
+ return ValidateSlotPatternFlowStackFrame(
88
+ validate=slot_name,
89
+ refill_utter=validation.refill_utter or f"{UTTER_ASK_PREFIX}{slot_name}", # type: ignore[union-attr]
90
+ refill_action=f"{ACTION_ASK_PREFIX}{slot_name}",
91
+ rejections=validation.rejections, # type: ignore[union-attr]
92
+ )
93
+
94
+
95
+ def create_validate_frames_from_slot_set_events(
96
+ tracker: DialogueStateTracker,
97
+ events: List[Event],
98
+ validate_frames: List[ValidateSlotPatternFlowStackFrame] = [],
99
+ should_break: bool = False,
100
+ ) -> Tuple[DialogueStateTracker, List[ValidateSlotPatternFlowStackFrame]]:
101
+ """Process SlotSet events and create validation frames.
102
+
103
+ Args:
104
+ tracker: The dialogue state tracker.
105
+ events: List of events to process.
106
+ should_break: whether or not to break after the first non-SlotSet event.
107
+ if True, break out of the event loop as soon as the first non-SlotSet
108
+ event is encountered.
109
+ if False, continue processing the events until the end.
110
+
111
+ Returns:
112
+ Tuple of (updated tracker, list of validation frames).
113
+ """
114
+ for event in events:
115
+ if not isinstance(event, SlotSet):
116
+ if should_break:
117
+ # we want to only process the most recent SlotSet events
118
+ # so we break once we encounter a different event
119
+ break
120
+ continue
121
+
122
+ slot = tracker.slots.get(event.key)
123
+ frame = initialize_pattern_validate_slot(slot)
124
+
125
+ if frame:
126
+ validate_frames.append(frame)
34
127
 
35
- triggerable_pattern_to_command_class: Dict[str, Type[Command]] = {
36
- SessionStartPatternFlowStackFrame.flow_id: SessionStartCommand,
37
- UserSilencePatternFlowStackFrame.flow_id: UserSilenceCommand,
38
- CancelPatternFlowStackFrame.flow_id: CancelFlowCommand,
39
- ChitchatPatternFlowStackFrame.flow_id: ChitChatAnswerCommand,
40
- HumanHandoffPatternFlowStackFrame.flow_id: HumanHandoffCommand,
41
- SearchPatternFlowStackFrame.flow_id: KnowledgeAnswerCommand,
42
- SkipQuestionPatternFlowStackFrame.flow_id: SkipQuestionCommand,
43
- CannotHandlePatternFlowStackFrame.flow_id: CannotHandleCommand,
44
- RestartPatternFlowStackFrame.flow_id: RestartCommand,
45
- }
128
+ return tracker, validate_frames
@@ -0,0 +1,2 @@
1
+ RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME = "RASA_RECORD_COMMANDS_AND_PROMPTS"
2
+ KEY_MINIMIZE_NUM_CALLS = "minimize_num_calls"
@@ -9,6 +9,7 @@ from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_gen
9
9
  MultiStepLLMCommandGenerator,
10
10
  )
11
11
  from rasa.dialogue_understanding.generator.single_step.single_step_llm_command_generator import ( # noqa: E501
12
+ CompactLLMCommandGenerator,
12
13
  SingleStepLLMCommandGenerator,
13
14
  )
14
15
 
@@ -18,4 +19,5 @@ __all__ = [
18
19
  "LLMCommandGenerator",
19
20
  "MultiStepLLMCommandGenerator",
20
21
  "SingleStepLLMCommandGenerator",
22
+ "CompactLLMCommandGenerator",
21
23
  ]
@@ -1,27 +1,31 @@
1
1
  from dataclasses import dataclass
2
- from typing import Any, Dict, List, Optional, Text
2
+ from typing import Any, Dict, List, Optional, Set, Text, Tuple
3
3
 
4
4
  import structlog
5
5
 
6
6
  from rasa.dialogue_understanding.commands import (
7
7
  Command,
8
+ CorrectSlotsCommand,
9
+ ErrorCommand,
8
10
  SetSlotCommand,
9
11
  StartFlowCommand,
10
- ErrorCommand,
11
12
  )
12
- from rasa.dialogue_understanding.commands.set_slot_command import SetSlotExtractor
13
- from rasa.shared.core.constants import SlotMappingType
13
+ from rasa.dialogue_understanding.utils import (
14
+ _handle_via_nlu_in_coexistence,
15
+ )
16
+ from rasa.shared.constants import (
17
+ RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
18
+ RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
19
+ )
14
20
  from rasa.shared.core.domain import Domain
15
21
  from rasa.shared.core.flows import FlowsList
16
- from rasa.shared.core.slot_mappings import SlotFillingManager
17
22
  from rasa.shared.core.trackers import DialogueStateTracker
23
+ from rasa.shared.nlu.constants import (
24
+ COMMANDS,
25
+ TEXT,
26
+ )
18
27
  from rasa.shared.nlu.training_data.message import Message
19
- from rasa.shared.nlu.constants import COMMANDS, TEXT
20
28
  from rasa.shared.utils.llm import DEFAULT_MAX_USER_INPUT_CHARACTERS
21
- from rasa.shared.constants import (
22
- RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
23
- RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
24
- )
25
29
 
26
30
  structlogger = structlog.get_logger()
27
31
 
@@ -89,9 +93,9 @@ class CommandGenerator:
89
93
  )
90
94
 
91
95
  for message in messages:
92
- if message.get(COMMANDS):
93
- # do not overwrite commands if they are already present
94
- # i.e. another command generator already predicted commands
96
+ if _handle_via_nlu_in_coexistence(tracker, message):
97
+ # Skip running the CALM pipeline if the message should
98
+ # be handled by the NLU-based system in a coexistence mode.
95
99
  continue
96
100
 
97
101
  commands = await self._evaluate_and_predict(
@@ -103,9 +107,6 @@ class CommandGenerator:
103
107
  commands = self._check_commands_against_startable_flows(
104
108
  commands, startable_flows
105
109
  )
106
- commands = self._check_commands_against_slot_mappings(
107
- commands, tracker, domain
108
- )
109
110
  commands_dicts = [command.as_dict() for command in commands]
110
111
  message.set(COMMANDS, commands_dicts, add_to_output=True)
111
112
 
@@ -193,11 +194,100 @@ class CommandGenerator:
193
194
  flows: The flows to use for command prediction.
194
195
  tracker: The tracker containing the conversation history up to now.
195
196
  **kwargs: Keyword arguments for forward compatibility.
197
+
196
198
  Returns:
197
199
  The predicted commands.
198
200
  """
199
201
  raise NotImplementedError()
200
202
 
203
+ def _check_commands_overlap(
204
+ self, prior_commands: List[Command], commands: List[Command]
205
+ ) -> List[Command]:
206
+ """Check if there is overlap between the prior commands and the current ones.
207
+
208
+ Args:
209
+ prior_commands: The prior commands.
210
+ commands: The commands to check.
211
+
212
+ Returns:
213
+ The final commands.
214
+ """
215
+ if not prior_commands:
216
+ return commands
217
+
218
+ prior_commands, commands = self._check_slot_command_overlap(
219
+ prior_commands, commands
220
+ )
221
+
222
+ prior_start_flow_names = {
223
+ command.flow
224
+ for command in prior_commands
225
+ if isinstance(command, StartFlowCommand)
226
+ }
227
+ current_start_flow_names = {
228
+ command.flow
229
+ for command in commands
230
+ if isinstance(command, StartFlowCommand)
231
+ }
232
+
233
+ return self._check_start_flow_command_overlap(
234
+ prior_commands,
235
+ commands,
236
+ prior_start_flow_names,
237
+ current_start_flow_names,
238
+ )
239
+
240
+ def _check_start_flow_command_overlap(
241
+ self,
242
+ prior_commands: List[Command],
243
+ commands: List[Command],
244
+ prior_start_flow_names: Set[str],
245
+ current_start_flow_names: Set[str],
246
+ ) -> List[Command]:
247
+ """Get the final commands.
248
+
249
+ Args:
250
+ prior_commands: The prior commands.
251
+ commands: The currently predicted commands to check.
252
+ prior_start_flow_names: The names of the flows from the prior commands.
253
+ current_start_flow_names: The names of the flows from the current commands.
254
+
255
+ Returns:
256
+ The final commands.
257
+ """
258
+ raise NotImplementedError()
259
+
260
+ def _check_slot_command_overlap(
261
+ self,
262
+ prior_commands: List[Command],
263
+ commands: List[Command],
264
+ ) -> Tuple[List[Command], List[Command]]:
265
+ """Check if the current commands overlap with the prior commands."""
266
+ prior_slot_names = gather_slot_names(prior_commands)
267
+ current_slot_names = gather_slot_names(commands)
268
+ overlapping_slot_names = prior_slot_names.intersection(current_slot_names)
269
+
270
+ structlogger.debug(
271
+ "command_generator.check_slot_command_overlap",
272
+ overlapping_slot_names=overlapping_slot_names,
273
+ )
274
+
275
+ if not overlapping_slot_names:
276
+ return prior_commands, commands
277
+
278
+ return self._filter_slot_commands(
279
+ prior_commands, commands, overlapping_slot_names
280
+ )
281
+
282
+ def _filter_slot_commands(
283
+ self,
284
+ prior_commands: List[Command],
285
+ commands: List[Command],
286
+ overlapping_slot_names: Set[str],
287
+ ) -> Tuple[List[Command], List[Command]]:
288
+ """Filter out the overlapping slot commands."""
289
+ raise NotImplementedError()
290
+
201
291
  def _check_commands_against_startable_flows(
202
292
  self, commands: List[Command], startable_flows: FlowsList
203
293
  ) -> List[Command]:
@@ -274,70 +364,21 @@ class CommandGenerator:
274
364
  return len(message.get(TEXT, "").strip()) == 0
275
365
 
276
366
  @staticmethod
277
- def _check_commands_against_slot_mappings(
278
- commands: List[Command],
279
- tracker: DialogueStateTracker,
280
- domain: Optional[Domain] = None,
281
- ) -> List[Command]:
282
- """Check if the LLM-issued slot commands are fillable.
283
-
284
- The LLM-issued slot commands are fillable if the slot
285
- mappings are satisfied.
286
- """
287
- if not domain:
288
- return commands
289
-
290
- llm_fillable_slot_names = [
291
- command.name
292
- for command in commands
293
- if isinstance(command, SetSlotCommand)
294
- and command.extractor == SetSlotExtractor.LLM.value
367
+ def _get_prior_commands(message: Message) -> List[Command]:
368
+ """Get the prior commands from the tracker."""
369
+ return [
370
+ Command.command_from_json(command) for command in message.get(COMMANDS, [])
295
371
  ]
296
372
 
297
- if not llm_fillable_slot_names:
298
- return commands
299
373
 
300
- llm_fillable_slots = [
301
- slot for slot in domain.slots if slot.name in llm_fillable_slot_names
302
- ]
303
-
304
- slot_filling_manager = SlotFillingManager(domain, tracker)
305
- slots_to_be_removed = []
306
-
307
- structlogger.debug(
308
- "command_processor.check_commands_against_slot_mappings.active_flow",
309
- active_flow=tracker.active_flow,
310
- )
311
-
312
- for slot in llm_fillable_slots:
313
- should_fill_slot = False
314
- for mapping in slot.mappings:
315
- mapping_type = SlotMappingType(mapping.get("type"))
316
-
317
- should_fill_slot = slot_filling_manager.should_fill_slot(
318
- slot.name, mapping_type, mapping
319
- )
320
-
321
- if should_fill_slot:
322
- break
323
-
324
- if not should_fill_slot:
325
- structlogger.debug(
326
- "command_processor.check_commands_against_slot_mappings.slot_not_fillable",
327
- slot_name=slot.name,
328
- )
329
- slots_to_be_removed.append(slot.name)
330
-
331
- if not slots_to_be_removed:
332
- return commands
333
-
334
- filtered_commands = [
335
- command
336
- for command in commands
337
- if not (
338
- isinstance(command, SetSlotCommand)
339
- and command.name in slots_to_be_removed
340
- )
341
- ]
374
+ def gather_slot_names(commands: List[Command]) -> Set[str]:
375
+ """Gather all slot names from the commands."""
376
+ slot_names = set()
377
+ for command in commands:
378
+ if isinstance(command, SetSlotCommand):
379
+ slot_names.add(command.name)
380
+ if isinstance(command, CorrectSlotsCommand):
381
+ for slot in command.corrected_slots:
382
+ slot_names.add(slot.name)
342
383
 
343
- return filtered_commands
384
+ return slot_names