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,17 +1,7 @@
1
1
  import copy
2
2
  import logging
3
3
  from functools import lru_cache
4
- from typing import (
5
- TYPE_CHECKING,
6
- Any,
7
- Dict,
8
- List,
9
- Optional,
10
- Set,
11
- Text,
12
- Tuple,
13
- cast,
14
- )
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, cast
15
5
 
16
6
  from jsonschema import Draft202012Validator
17
7
 
@@ -29,11 +19,15 @@ from rasa.core.actions.e2e_stub_custom_action_executor import (
29
19
  from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
30
20
  from rasa.core.actions.http_custom_action_executor import HTTPCustomActionExecutor
31
21
  from rasa.core.constants import (
22
+ KEY_IS_CALM_SYSTEM,
23
+ KEY_IS_COEXISTENCE_ASSISTANT,
32
24
  UTTER_SOURCE_METADATA_KEY,
33
25
  )
26
+ from rasa.core.nlg.translate import get_translated_buttons, get_translated_text
34
27
  from rasa.core.policies.policy import PolicyPrediction
35
28
  from rasa.core.utils import add_bot_utterance_metadata
36
29
  from rasa.e2e_test.constants import KEY_STUB_CUSTOM_ACTIONS
30
+ from rasa.engine.language import Language
37
31
  from rasa.nlu.constants import (
38
32
  RESPONSE_SELECTOR_DEFAULT_INTENT,
39
33
  RESPONSE_SELECTOR_PREDICTION_KEY,
@@ -41,10 +35,17 @@ from rasa.nlu.constants import (
41
35
  RESPONSE_SELECTOR_UTTER_ACTION_KEY,
42
36
  )
43
37
  from rasa.shared.constants import (
38
+ ATTACHMENT,
39
+ BUTTONS,
40
+ CUSTOM,
44
41
  DEFAULT_NLU_FALLBACK_INTENT_NAME,
45
42
  DOCS_BASE_URL,
43
+ ELEMENTS,
46
44
  FLOW_PREFIX,
45
+ IMAGE,
46
+ QUICK_REPLIES,
47
47
  ROUTE_TO_CALM_SLOT,
48
+ TEXT,
48
49
  UTTER_PREFIX,
49
50
  )
50
51
  from rasa.shared.core.constants import (
@@ -55,19 +56,19 @@ from rasa.shared.core.constants import (
55
56
  ACTION_DEFAULT_FALLBACK_NAME,
56
57
  ACTION_EXTRACT_SLOTS,
57
58
  ACTION_LISTEN_NAME,
59
+ ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
60
+ ACTION_METADATA_EXECUTION_SUCCESS,
58
61
  ACTION_RESET_ROUTING,
59
62
  ACTION_RESTART_NAME,
60
63
  ACTION_REVERT_FALLBACK_EVENTS_NAME,
61
64
  ACTION_SEND_TEXT_NAME,
62
65
  ACTION_SESSION_START_NAME,
63
66
  ACTION_UNLIKELY_INTENT_NAME,
64
- ACTION_VALIDATE_SLOT_MAPPINGS,
65
67
  DEFAULT_SLOT_NAMES,
66
68
  KNOWLEDGE_BASE_SLOT_NAMES,
67
- MAPPING_TYPE,
68
69
  REQUESTED_SLOT,
69
70
  USER_INTENT_OUT_OF_SCOPE,
70
- SlotMappingType,
71
+ SetSlotExtractor,
71
72
  )
72
73
  from rasa.shared.core.domain import Domain
73
74
  from rasa.shared.core.events import (
@@ -83,19 +84,17 @@ from rasa.shared.core.events import (
83
84
  UserUttered,
84
85
  )
85
86
  from rasa.shared.core.flows import FlowsList
87
+ from rasa.shared.core.flows.constants import KEY_TRANSLATION
86
88
  from rasa.shared.core.slot_mappings import (
87
89
  SlotFillingManager,
88
90
  extract_slot_value,
89
91
  )
90
92
  from rasa.shared.core.trackers import DialogueStateTracker
91
93
  from rasa.shared.exceptions import RasaException
92
- from rasa.shared.nlu.constants import (
93
- INTENT_NAME_KEY,
94
- INTENT_RANKING_KEY,
95
- )
94
+ from rasa.shared.nlu.constants import INTENT_NAME_KEY, INTENT_RANKING_KEY
96
95
  from rasa.shared.utils.io import raise_warning
97
96
  from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
98
- from rasa.utils.endpoints import ClientResponseError, EndpointConfig
97
+ from rasa.utils.endpoints import EndpointConfig
99
98
  from rasa.utils.url_tools import UrlSchema, get_url_schema
100
99
 
101
100
  if TYPE_CHECKING:
@@ -109,12 +108,16 @@ logger = logging.getLogger(__name__)
109
108
  def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["Action"]:
110
109
  """List default actions."""
111
110
  from rasa.core.actions.action_clean_stack import ActionCleanStack
111
+ from rasa.core.actions.action_handle_digressions import (
112
+ ActionBlockDigressions,
113
+ ActionContinueDigression,
114
+ )
115
+ from rasa.core.actions.action_hangup import ActionHangup
116
+ from rasa.core.actions.action_repeat_bot_messages import ActionRepeatBotMessages
112
117
  from rasa.core.actions.action_run_slot_rejections import ActionRunSlotRejections
113
118
  from rasa.core.actions.action_trigger_chitchat import ActionTriggerChitchat
114
119
  from rasa.core.actions.action_trigger_search import ActionTriggerSearch
115
120
  from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
116
- from rasa.core.actions.action_hangup import ActionHangup
117
- from rasa.core.actions.action_repeat_bot_messages import ActionRepeatBotMessages
118
121
  from rasa.dialogue_understanding.patterns.cancel import ActionCancelFlow
119
122
  from rasa.dialogue_understanding.patterns.clarify import ActionClarifyFlows
120
123
  from rasa.dialogue_understanding.patterns.correction import ActionCorrectFlowSlot
@@ -143,6 +146,8 @@ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["A
143
146
  ActionResetRouting(),
144
147
  ActionHangup(),
145
148
  ActionRepeatBotMessages(),
149
+ ActionBlockDigressions(),
150
+ ActionContinueDigression(),
146
151
  ]
147
152
 
148
153
 
@@ -252,25 +257,36 @@ def action_for_name_or_text(
252
257
  return RemoteAction(action_name_or_text, action_endpoint)
253
258
 
254
259
 
255
- def create_bot_utterance(message: Dict[Text, Any]) -> BotUttered:
256
- """Create BotUttered event from message."""
257
- bot_message = BotUttered(
258
- text=message.pop("text", None),
259
- data={
260
- "elements": message.pop("elements", None),
261
- "quick_replies": message.pop("quick_replies", None),
262
- "buttons": message.pop("buttons", None),
263
- # for legacy / compatibility reasons we need to set the image
264
- # to be the attachment if there is no other attachment (the
265
- # `.get` is intentional - no `pop` as we still need the image`
266
- # property to set it in the following line)
267
- "attachment": message.pop("attachment", None) or message.get("image", None),
268
- "image": message.pop("image", None),
269
- "custom": message.pop("custom", None),
270
- },
271
- metadata=message,
260
+ def create_bot_utterance(
261
+ message: Dict[Text, Any], language: Optional[Language] = None
262
+ ) -> BotUttered:
263
+ """Create BotUttered event from message with translation support."""
264
+ message_copy = copy.deepcopy(message)
265
+
266
+ text = get_translated_text(
267
+ text=message_copy.pop(TEXT, None),
268
+ translation=message_copy.pop(KEY_TRANSLATION, {}),
269
+ language=language,
272
270
  )
273
- return bot_message
271
+
272
+ buttons = get_translated_buttons(
273
+ buttons=message_copy.pop(BUTTONS, None), language=language
274
+ )
275
+
276
+ data = {
277
+ ELEMENTS: message_copy.pop(ELEMENTS, None),
278
+ QUICK_REPLIES: message_copy.pop(QUICK_REPLIES, None),
279
+ BUTTONS: buttons,
280
+ # for legacy / compatibility reasons we need to set the image
281
+ # to be the attachment if there is no other attachment (the
282
+ # `.get` is intentional - no `pop` as we still need the image`
283
+ # property to set it in the following line)
284
+ ATTACHMENT: message_copy.pop(ATTACHMENT, None) or message_copy.get(IMAGE, None),
285
+ IMAGE: message_copy.pop(IMAGE, None),
286
+ CUSTOM: message_copy.pop(CUSTOM, None),
287
+ }
288
+
289
+ return BotUttered(text=text, data=data, metadata=message_copy)
274
290
 
275
291
 
276
292
  class Action:
@@ -310,22 +326,30 @@ class Action:
310
326
  return f"{self.__class__.__name__}('{self.name()}')"
311
327
 
312
328
  def event_for_successful_execution(
313
- self, prediction: PolicyPrediction
329
+ self,
330
+ prediction: PolicyPrediction,
331
+ was_successful: bool,
332
+ error_message: Optional[str],
314
333
  ) -> ActionExecuted:
315
334
  """Event which should be logged for the successful execution of this action.
316
335
 
317
336
  Args:
318
337
  prediction: Prediction which led to the execution of this event.
338
+ was_successful: Whether the action was executed successfully.
339
+ error_message: Error message if the action was not executed successfully.
319
340
 
320
341
  Returns:
321
342
  Event which should be logged onto the tracker.
322
343
  """
344
+ metadata = prediction.action_metadata or {}
345
+ metadata[ACTION_METADATA_EXECUTION_SUCCESS] = was_successful
346
+ metadata[ACTION_METADATA_EXECUTION_ERROR_MESSAGE] = error_message
323
347
  return ActionExecuted(
324
348
  self.name(),
325
349
  prediction.policy_name,
326
350
  prediction.max_confidence,
327
351
  hide_rule_turn=prediction.hide_rule_turn,
328
- metadata=prediction.action_metadata,
352
+ metadata=metadata,
329
353
  )
330
354
 
331
355
 
@@ -375,7 +399,7 @@ class ActionBotResponse(Action):
375
399
  message = add_bot_utterance_metadata(
376
400
  message, self.utter_action, nlg, domain, tracker
377
401
  )
378
- return [create_bot_utterance(message)]
402
+ return [create_bot_utterance(message, tracker.current_language)]
379
403
 
380
404
  def name(self) -> Text:
381
405
  """Returns action name."""
@@ -409,25 +433,34 @@ class ActionEndToEndResponse(Action):
409
433
  ) -> List[Event]:
410
434
  """Runs action (see parent class for full docstring)."""
411
435
  message = {"text": self.action_text}
412
- return [create_bot_utterance(message)]
436
+ return [create_bot_utterance(message, tracker.current_language)]
413
437
 
414
438
  def event_for_successful_execution(
415
- self, prediction: PolicyPrediction
439
+ self,
440
+ prediction: PolicyPrediction,
441
+ was_successful: bool,
442
+ error_message: Optional[str],
416
443
  ) -> ActionExecuted:
417
444
  """Event which should be logged for the successful execution of this action.
418
445
 
419
446
  Args:
420
447
  prediction: Prediction which led to the execution of this event.
448
+ was_successful: Whether the action was executed successfully.
449
+ error_message: Error message if the action was not executed successfully.
421
450
 
422
451
  Returns:
423
452
  Event which should be logged onto the tracker.
424
453
  """
454
+ metadata = prediction.action_metadata or {}
455
+ metadata[ACTION_METADATA_EXECUTION_SUCCESS] = was_successful
456
+ metadata[ACTION_METADATA_EXECUTION_ERROR_MESSAGE] = error_message
457
+
425
458
  return ActionExecuted(
426
459
  policy=prediction.policy_name,
427
460
  confidence=prediction.max_confidence,
428
461
  action_text=self.action_text,
429
462
  hide_rule_turn=prediction.hide_rule_turn,
430
- metadata=prediction.action_metadata,
463
+ metadata=metadata,
431
464
  )
432
465
 
433
466
 
@@ -727,10 +760,7 @@ class ActionDeactivateLoop(Action):
727
760
 
728
761
 
729
762
  class RemoteActionJSONValidator:
730
- """
731
- A validator class for ensuring that the JSON response from a custom action executor
732
- adheres to the expected schema.
733
- """
763
+ """Check action responses for JSON schema validation."""
734
764
 
735
765
  @staticmethod
736
766
  def action_response_format_spec() -> Dict[Text, Any]:
@@ -753,8 +783,7 @@ class RemoteActionJSONValidator:
753
783
 
754
784
  @classmethod
755
785
  def validate(cls, result: Dict[Text, Any]) -> bool:
756
- """
757
- Validate the given JSON result against the expected Action response schema.
786
+ """Validate the given JSON result against the expected Action response schema.
758
787
 
759
788
  This method uses a cached JSON schema validator to check if the provided result
760
789
  conforms to the predefined schema.
@@ -781,15 +810,14 @@ class RemoteActionJSONValidator:
781
810
  f". Failed to validate Action server response from API, "
782
811
  f"make sure your response from the Action endpoint is valid. "
783
812
  f"For more information about the format visit "
784
- f"{DOCS_BASE_URL}/custom-actions"
813
+ f"{DOCS_BASE_URL}/action-server/actions"
785
814
  )
786
815
  raise e
787
816
 
788
817
  @classmethod
789
818
  @lru_cache(maxsize=1)
790
819
  def get_action_response_validator(cls) -> Draft202012Validator:
791
- """
792
- Retrieve a cached JSON schema validator for the Action response schema.
820
+ """Retrieve a cached JSON schema validator for the Action response schema.
793
821
 
794
822
  Returns:
795
823
  Draft202012Validator: An instance of the JSON schema validator.
@@ -889,7 +917,7 @@ class RemoteAction(Action):
889
917
  # Avoid overwriting `draft` values with empty values
890
918
  response = {k: v for k, v in response.items() if v}
891
919
  draft.update(response)
892
- bot_messages.append(create_bot_utterance(draft))
920
+ bot_messages.append(create_bot_utterance(draft, tracker.current_language))
893
921
 
894
922
  return bot_messages
895
923
 
@@ -919,7 +947,14 @@ class RemoteAction(Action):
919
947
  )
920
948
 
921
949
  events = rasa.shared.core.events.deserialise_events(events_json)
922
- return cast(List[Event], bot_messages) + events
950
+
951
+ processed_events = []
952
+ for event in events:
953
+ if isinstance(event, SlotSet) and event.filled_by is None:
954
+ event.filled_by = SetSlotExtractor.CUSTOM.value
955
+ processed_events.append(event)
956
+
957
+ return cast(List[Event], bot_messages) + processed_events
923
958
 
924
959
  def name(self) -> Text:
925
960
  return self._name
@@ -1090,7 +1125,7 @@ class ActionDefaultAskAffirmation(Action):
1090
1125
  "utter_action": self.name(),
1091
1126
  }
1092
1127
 
1093
- return [create_bot_utterance(message)]
1128
+ return [create_bot_utterance(message, tracker.current_language)]
1094
1129
 
1095
1130
 
1096
1131
  class ActionDefaultAskRephrase(ActionBotResponse):
@@ -1123,7 +1158,7 @@ class ActionSendText(Action):
1123
1158
  fallback = {"text": ""}
1124
1159
  metadata_copy = copy.deepcopy(metadata) if metadata else {}
1125
1160
  message = metadata_copy.get("message", fallback)
1126
- return [create_bot_utterance(message)]
1161
+ return [create_bot_utterance(message, tracker.current_language)]
1127
1162
 
1128
1163
 
1129
1164
  class ActionExtractSlots(Action):
@@ -1144,113 +1179,6 @@ class ActionExtractSlots(Action):
1144
1179
  """Returns action_extract_slots name."""
1145
1180
  return ACTION_EXTRACT_SLOTS
1146
1181
 
1147
- async def _run_custom_action(
1148
- self,
1149
- custom_action: Text,
1150
- output_channel: "OutputChannel",
1151
- nlg: "NaturalLanguageGenerator",
1152
- tracker: "DialogueStateTracker",
1153
- domain: "Domain",
1154
- ) -> List[Event]:
1155
- slot_events: List[Event] = []
1156
- remote_action = RemoteAction(custom_action, self._action_endpoint)
1157
- disallowed_types = set()
1158
-
1159
- try:
1160
- custom_events = await remote_action.run(
1161
- output_channel, nlg, tracker, domain
1162
- )
1163
- for event in custom_events:
1164
- if isinstance(event, SlotSet):
1165
- slot_events.append(event)
1166
- elif isinstance(event, BotUttered):
1167
- slot_events.append(event)
1168
- else:
1169
- disallowed_types.add(event.type_name)
1170
- except (RasaException, ClientResponseError) as e:
1171
- logger.warning(
1172
- f"Failed to execute custom action '{custom_action}' "
1173
- f"as a result of error '{e!s}'. The default action "
1174
- f"'{self.name()}' failed to fill slots with custom "
1175
- f"mappings."
1176
- )
1177
-
1178
- for type_name in disallowed_types:
1179
- logger.info(
1180
- f"Running custom action '{custom_action}' has resulted "
1181
- f"in an event of type '{type_name}'. This is "
1182
- f"disallowed and the tracker will not be "
1183
- f"updated with this event."
1184
- )
1185
-
1186
- return slot_events
1187
-
1188
- async def _execute_custom_action(
1189
- self,
1190
- mapping: Dict[Text, Any],
1191
- executed_custom_actions: Set[Text],
1192
- output_channel: "OutputChannel",
1193
- nlg: "NaturalLanguageGenerator",
1194
- tracker: "DialogueStateTracker",
1195
- domain: "Domain",
1196
- calm_custom_action_names: Optional[Set[str]] = None,
1197
- ) -> Tuple[List[Event], Set[Text]]:
1198
- custom_action = mapping.get("action")
1199
-
1200
- if not custom_action or custom_action in executed_custom_actions:
1201
- return [], executed_custom_actions
1202
-
1203
- if (
1204
- calm_custom_action_names is not None
1205
- and custom_action in calm_custom_action_names
1206
- ):
1207
- return [], executed_custom_actions
1208
-
1209
- slot_events = await self._run_custom_action(
1210
- custom_action, output_channel, nlg, tracker, domain
1211
- )
1212
-
1213
- executed_custom_actions.add(custom_action)
1214
-
1215
- return slot_events, executed_custom_actions
1216
-
1217
- async def _execute_validation_action(
1218
- self,
1219
- extraction_events: List[Event],
1220
- output_channel: "OutputChannel",
1221
- nlg: "NaturalLanguageGenerator",
1222
- tracker: "DialogueStateTracker",
1223
- domain: "Domain",
1224
- ) -> List[Event]:
1225
- slot_events: List[SlotSet] = [
1226
- event for event in extraction_events if isinstance(event, SlotSet)
1227
- ]
1228
-
1229
- slot_candidates = "\n".join([e.key for e in slot_events])
1230
- logger.debug(f"Validating extracted slots: {slot_candidates}")
1231
-
1232
- if ACTION_VALIDATE_SLOT_MAPPINGS not in domain.user_actions:
1233
- return cast(List[Event], slot_events)
1234
-
1235
- _tracker = DialogueStateTracker.from_events(
1236
- tracker.sender_id,
1237
- tracker.events_after_latest_restart() + cast(List[Event], slot_events),
1238
- slots=domain.slots,
1239
- )
1240
- validate_events = await self._run_custom_action(
1241
- ACTION_VALIDATE_SLOT_MAPPINGS, output_channel, nlg, _tracker, domain
1242
- )
1243
- validated_slot_names = [
1244
- event.key for event in validate_events if isinstance(event, SlotSet)
1245
- ]
1246
-
1247
- # If the custom action doesn't return a SlotSet event for an extracted slot
1248
- # candidate we assume that it was valid. The custom action has to return a
1249
- # SlotSet(slot_name, None) event to mark a Slot as invalid.
1250
- return validate_events + [
1251
- event for event in slot_events if event.key not in validated_slot_names
1252
- ]
1253
-
1254
1182
  async def run(
1255
1183
  self,
1256
1184
  output_channel: "OutputChannel",
@@ -1261,60 +1189,59 @@ class ActionExtractSlots(Action):
1261
1189
  ) -> List[Event]:
1262
1190
  """Runs action. Please see parent class for the full docstring."""
1263
1191
  slot_events: List[Event] = []
1264
- executed_custom_actions: Set[Text] = set()
1265
-
1266
1192
  user_slots = [
1267
1193
  slot
1268
1194
  for slot in domain.slots
1269
1195
  if slot.name not in DEFAULT_SLOT_NAMES | KNOWLEDGE_BASE_SLOT_NAMES
1270
1196
  ]
1271
1197
 
1272
- calm_slot_names = set()
1273
- calm_custom_action_names = None
1274
- flows = None
1275
-
1276
- if metadata is not None:
1277
- flows = metadata.get("all_flows")
1278
-
1279
- if flows is not None:
1280
- flows = FlowsList.from_json(flows)
1281
- calm_slot_names = flows.available_slot_names()
1282
- calm_custom_action_names = flows.available_custom_actions()
1283
-
1198
+ all_flows = metadata.get("all_flows") if metadata else None
1199
+ flows = FlowsList.from_json(all_flows) if all_flows else None
1200
+ calm_slot_names = flows.available_slot_names() if flows else set()
1201
+ is_calm_system = metadata.get(KEY_IS_CALM_SYSTEM) if metadata else False
1202
+ is_coexistence_bot = (
1203
+ metadata.get(KEY_IS_COEXISTENCE_ASSISTANT) if metadata else False
1204
+ )
1284
1205
  slot_filling_manager = SlotFillingManager(
1285
- domain, tracker, action_endpoint=self._action_endpoint
1206
+ domain,
1207
+ tracker,
1208
+ action_endpoint=self._action_endpoint,
1286
1209
  )
1287
1210
 
1288
1211
  for slot in user_slots:
1289
1212
  # allows the action to set slots that are shared between
1290
1213
  # the NLU-based system and CALM system in a coexistence bot
1291
- if slot.name in calm_slot_names and not slot.shared_for_coexistence:
1292
- continue
1293
-
1294
- slot_value, is_extracted = extract_slot_value(slot, slot_filling_manager)
1295
- if is_extracted:
1296
- slot_events.append(SlotSet(slot.name, slot_value))
1297
-
1298
- for mapping in slot.mappings:
1299
- mapping_type = SlotMappingType(mapping.get(MAPPING_TYPE))
1300
- should_fill_custom_slot = mapping_type == SlotMappingType.CUSTOM
1301
-
1302
- if should_fill_custom_slot:
1303
- (
1304
- custom_evts,
1305
- executed_custom_actions,
1306
- ) = await self._execute_custom_action(
1307
- mapping,
1308
- executed_custom_actions,
1309
- output_channel,
1310
- nlg,
1311
- tracker,
1312
- domain,
1313
- calm_custom_action_names,
1214
+ if is_coexistence_bot:
1215
+ should_fill_slot_in_coexistence = (
1216
+ slot_filling_manager.should_fill_slot_in_coexistence(
1217
+ is_calm_system=is_calm_system,
1218
+ slot=slot,
1219
+ calm_slot_names=calm_slot_names,
1314
1220
  )
1315
- slot_events.extend(custom_evts)
1221
+ )
1222
+ if not should_fill_slot_in_coexistence:
1223
+ continue
1316
1224
 
1317
- validated_events = await self._execute_validation_action(
1318
- slot_events, output_channel, nlg, tracker, domain
1319
- )
1320
- return validated_events
1225
+ if not is_calm_system:
1226
+ slot_value, is_extracted = extract_slot_value(
1227
+ slot, slot_filling_manager
1228
+ )
1229
+ if is_extracted:
1230
+ slot_events.append(SlotSet(slot.name, slot_value))
1231
+
1232
+ custom_events = await slot_filling_manager.run_action_at_every_turn(
1233
+ slot,
1234
+ output_channel,
1235
+ nlg,
1236
+ )
1237
+ slot_events.extend(custom_events)
1238
+
1239
+ if not is_calm_system:
1240
+ validated_events = await slot_filling_manager.execute_validation_action(
1241
+ slot_events,
1242
+ output_channel,
1243
+ nlg,
1244
+ )
1245
+ return validated_events
1246
+
1247
+ return slot_events