rasa-pro 3.12.18__py3-none-any.whl → 3.13.0a1.dev1__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 (330) hide show
  1. rasa/__main__.py +3 -4
  2. rasa/api.py +1 -1
  3. rasa/builder/create_openai_vector_store.py +69 -0
  4. rasa/builder/llm-helper-schema.json +69 -0
  5. rasa/builder/prompt_to_bot.py +645 -0
  6. rasa/builder/scrape_rasa_docs.py +97 -0
  7. rasa/builder/skill_to_bot_prompt.jinja +158 -0
  8. rasa/cli/dialogue_understanding_test.py +1 -1
  9. rasa/cli/e2e_test.py +1 -1
  10. rasa/cli/evaluate.py +2 -2
  11. rasa/cli/export.py +3 -3
  12. rasa/cli/llm_fine_tuning.py +1 -1
  13. rasa/cli/project_templates/default/config.yml +5 -32
  14. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_cancels_during_a_correction.yml +1 -1
  15. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +1 -1
  16. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_handle.yml +1 -1
  17. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_name.yml +1 -1
  18. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +1 -1
  19. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_lists_contacts.yml +1 -1
  20. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact.yml +1 -1
  21. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact_from_list.yml +1 -1
  22. rasa/cli/project_templates/default/endpoints.yml +18 -2
  23. rasa/cli/project_templates/defaults.py +133 -0
  24. rasa/cli/run.py +1 -1
  25. rasa/cli/scaffold.py +2 -3
  26. rasa/cli/studio/download.py +1 -1
  27. rasa/cli/studio/link.py +53 -0
  28. rasa/cli/studio/pull.py +78 -0
  29. rasa/cli/studio/push.py +78 -0
  30. rasa/cli/studio/studio.py +12 -0
  31. rasa/cli/studio/upload.py +5 -3
  32. rasa/cli/train.py +1 -1
  33. rasa/cli/utils.py +1 -1
  34. rasa/cli/x.py +1 -1
  35. rasa/constants.py +2 -0
  36. rasa/core/__init__.py +0 -16
  37. rasa/core/actions/action.py +43 -29
  38. rasa/core/actions/action_repeat_bot_messages.py +18 -22
  39. rasa/core/actions/action_run_slot_rejections.py +1 -2
  40. rasa/core/agent.py +18 -3
  41. rasa/core/available_endpoints.py +146 -0
  42. rasa/core/brokers/kafka.py +4 -0
  43. rasa/core/brokers/pika.py +5 -2
  44. rasa/core/brokers/sql.py +1 -1
  45. rasa/core/channels/botframework.py +2 -2
  46. rasa/core/channels/channel.py +2 -2
  47. rasa/core/channels/development_inspector.py +1 -1
  48. rasa/core/channels/facebook.py +1 -4
  49. rasa/core/channels/hangouts.py +8 -5
  50. rasa/core/channels/inspector/.eslintrc.cjs +12 -6
  51. rasa/core/channels/inspector/.prettierrc +5 -0
  52. rasa/core/channels/inspector/README.md +11 -5
  53. rasa/core/channels/inspector/dist/assets/{arc-9f75cc3b.js → arc-02053cc1.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7f34db23.js → blockDiagram-38ab4fdb-008b6289.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-948bab2c.js → c4Diagram-3d4e48cf-fb2597be.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/channel-078dada8.js +1 -0
  57. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-53b0dd0e.js → classDiagram-70f12bd4-7f847e00.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-fdf789e7.js → classDiagram-v2-f2320105-ba1d689b.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/clone-5b4516de.js +1 -0
  60. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-87c4ece5.js → createText-2e5e7dd3-dd8e67c4.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-5a8b0749.js → edges-e0da2a9e-10784939.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-66da90e2.js → erDiagram-9861fffd-24947ae6.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-10044f05.js → flowDb-956e92f1-a9ced505.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f338f66a.js → flowDiagram-66a62f08-afda9c7c.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-f9613071.js +1 -0
  66. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b13140aa.js → flowchart-elk-definition-4a651766-6ef530b8.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-f2b4a55a.js → ganttDiagram-c361ad54-0c7dd39a.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-dedc298d.js → gitGraphDiagram-72cf32ee-b57239d6.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{graph-4ede11ff.js → graph-9ed57cec.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{index-3862675e-65549d37.js → index-3862675e-233090de.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{index-3a23e736.js → index-72184470.js} +123 -123
  72. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-65439671.js → infoDiagram-f8f76790-aa116649.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-56d03d98.js → journeyDiagram-49397b02-e51877cc.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{layout-dd48f7f4.js → layout-3ca3798c.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{line-1569ad2c.js → line-26ee10d3.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{linear-48bf4935.js → linear-aedded32.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-688504c1.js → mindmap-definition-fc14e90a-d8957261.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78b6d7e6.js → pieDiagram-8a3498a8-d771f885.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-048b84b3.js → quadrantDiagram-120e2f19-09fdf50c.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dd67f107.js → requirementDiagram-deff3bca-9f0af02e.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-8128436e.js → sankeyDiagram-04a897e0-84415b37.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-1a0d1461.js → sequenceDiagram-704730f1-8dec4055.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-46d388ed.js → stateDiagram-587899a1-c5431d07.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-ea42951a.js → stateDiagram-v2-d93cdb3a-274e77d9.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-7427ed0c.js → styles-6aaf32cf-e364a1d7.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-ff5e5a16.js → styles-9a916d00-0dae36f6.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-7b3680cf.js → styles-c10674c1-c4641675.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f860f2ad.js → svgDrawCommon-08f97a94-831fe9a1.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-2eebf0c8.js → timeline-definition-85554ec2-c3304b3a.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5d7f4e96.js → xychartDiagram-e933f94c-da799369.js} +1 -1
  91. rasa/core/channels/inspector/dist/index.html +1 -1
  92. rasa/core/channels/inspector/package.json +3 -1
  93. rasa/core/channels/inspector/src/App.tsx +91 -90
  94. rasa/core/channels/inspector/src/components/Chat.tsx +45 -41
  95. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +40 -40
  96. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +57 -57
  97. rasa/core/channels/inspector/src/components/DialogueStack.tsx +36 -27
  98. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +4 -4
  99. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +7 -7
  100. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +28 -12
  101. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +9 -9
  102. rasa/core/channels/inspector/src/components/RasaLogo.tsx +5 -5
  103. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +55 -60
  104. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +5 -5
  105. rasa/core/channels/inspector/src/components/Slots.tsx +22 -22
  106. rasa/core/channels/inspector/src/components/Welcome.tsx +28 -31
  107. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +245 -0
  108. rasa/core/channels/inspector/src/helpers/audio/microphone-processor.js +12 -0
  109. rasa/core/channels/inspector/src/helpers/audio/playback-processor.js +36 -0
  110. rasa/core/channels/inspector/src/helpers/conversation.ts +7 -7
  111. rasa/core/channels/inspector/src/helpers/formatters.test.ts +181 -181
  112. rasa/core/channels/inspector/src/helpers/formatters.ts +111 -111
  113. rasa/core/channels/inspector/src/helpers/utils.ts +78 -61
  114. rasa/core/channels/inspector/src/main.tsx +8 -8
  115. rasa/core/channels/inspector/src/theme/Button/Button.ts +8 -8
  116. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +7 -7
  117. rasa/core/channels/inspector/src/theme/Input/Input.ts +9 -9
  118. rasa/core/channels/inspector/src/theme/Link/Link.ts +6 -6
  119. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +13 -13
  120. rasa/core/channels/inspector/src/theme/Table/Table.tsx +10 -10
  121. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +5 -5
  122. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +7 -7
  123. rasa/core/channels/inspector/src/theme/base/colors.ts +64 -64
  124. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +21 -18
  125. rasa/core/channels/inspector/src/theme/base/radii.ts +8 -8
  126. rasa/core/channels/inspector/src/theme/base/shadows.ts +5 -5
  127. rasa/core/channels/inspector/src/theme/base/sizes.ts +5 -5
  128. rasa/core/channels/inspector/src/theme/base/space.ts +12 -12
  129. rasa/core/channels/inspector/src/theme/base/styles.ts +5 -5
  130. rasa/core/channels/inspector/src/theme/base/typography.ts +12 -12
  131. rasa/core/channels/inspector/src/theme/base/zIndices.ts +3 -3
  132. rasa/core/channels/inspector/src/theme/index.ts +38 -38
  133. rasa/core/channels/inspector/src/types.ts +56 -50
  134. rasa/core/channels/inspector/yarn.lock +5 -0
  135. rasa/core/channels/mattermost.py +1 -1
  136. rasa/core/channels/rasa_chat.py +2 -4
  137. rasa/core/channels/rest.py +5 -4
  138. rasa/core/channels/socketio.py +56 -41
  139. rasa/core/channels/studio_chat.py +337 -71
  140. rasa/core/channels/vier_cvg.py +1 -2
  141. rasa/core/channels/voice_ready/audiocodes.py +4 -11
  142. rasa/core/channels/voice_stream/audiocodes.py +8 -5
  143. rasa/core/channels/voice_stream/browser_audio.py +1 -1
  144. rasa/core/channels/voice_stream/genesys.py +2 -2
  145. rasa/core/channels/voice_stream/tts/__init__.py +8 -0
  146. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -5
  147. rasa/core/channels/voice_stream/voice_channel.py +65 -23
  148. rasa/core/concurrent_lock_store.py +24 -10
  149. rasa/core/evaluation/marker_tracker_loader.py +1 -1
  150. rasa/core/exporter.py +1 -1
  151. rasa/core/http_interpreter.py +3 -7
  152. rasa/core/information_retrieval/faiss.py +18 -11
  153. rasa/core/information_retrieval/ingestion/__init__.py +0 -0
  154. rasa/core/information_retrieval/ingestion/faq_parser.py +158 -0
  155. rasa/core/jobs.py +2 -1
  156. rasa/core/lock_store.py +151 -60
  157. rasa/core/nlg/contextual_response_rephraser.py +17 -7
  158. rasa/core/nlg/generator.py +5 -22
  159. rasa/core/nlg/interpolator.py +2 -3
  160. rasa/core/nlg/response.py +6 -43
  161. rasa/core/nlg/summarize.py +1 -1
  162. rasa/core/nlg/translate.py +0 -8
  163. rasa/core/policies/enterprise_search_policy.py +262 -62
  164. rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_template.jinja2 +63 -0
  165. rasa/core/policies/flow_policy.py +1 -1
  166. rasa/core/policies/flows/flow_executor.py +96 -17
  167. rasa/core/policies/intentless_policy.py +56 -17
  168. rasa/core/processor.py +64 -49
  169. rasa/core/run.py +33 -11
  170. rasa/core/tracker_stores/__init__.py +0 -0
  171. rasa/core/{auth_retry_tracker_store.py → tracker_stores/auth_retry_tracker_store.py} +5 -1
  172. rasa/core/tracker_stores/dynamo_tracker_store.py +218 -0
  173. rasa/core/tracker_stores/mongo_tracker_store.py +206 -0
  174. rasa/core/tracker_stores/redis_tracker_store.py +219 -0
  175. rasa/core/tracker_stores/sql_tracker_store.py +555 -0
  176. rasa/core/tracker_stores/tracker_store.py +805 -0
  177. rasa/core/training/interactive.py +1 -1
  178. rasa/core/utils.py +24 -95
  179. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -1
  180. rasa/dialogue_understanding/coexistence/llm_based_router.py +9 -6
  181. rasa/dialogue_understanding/commands/can_not_handle_command.py +2 -0
  182. rasa/dialogue_understanding/commands/cancel_flow_command.py +5 -1
  183. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +2 -0
  184. rasa/dialogue_understanding/commands/clarify_command.py +4 -0
  185. rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -0
  186. rasa/dialogue_understanding/commands/correct_slots_command.py +1 -3
  187. rasa/dialogue_understanding/commands/human_handoff_command.py +2 -0
  188. rasa/dialogue_understanding/commands/knowledge_answer_command.py +2 -0
  189. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +2 -0
  190. rasa/dialogue_understanding/commands/set_slot_command.py +4 -0
  191. rasa/dialogue_understanding/commands/skip_question_command.py +2 -0
  192. rasa/dialogue_understanding/commands/start_flow_command.py +4 -0
  193. rasa/dialogue_understanding/generator/__init__.py +7 -1
  194. rasa/dialogue_understanding/generator/command_generator.py +4 -2
  195. rasa/dialogue_understanding/generator/command_parser.py +2 -2
  196. rasa/dialogue_understanding/generator/command_parser_validator.py +63 -0
  197. rasa/dialogue_understanding/generator/llm_based_command_generator.py +1 -2
  198. rasa/dialogue_understanding/generator/nlu_command_adapter.py +2 -2
  199. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +78 -0
  200. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +26 -461
  201. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +147 -0
  202. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +477 -0
  203. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +11 -64
  204. rasa/dialogue_understanding/patterns/cancel.py +1 -2
  205. rasa/dialogue_understanding/patterns/clarify.py +1 -1
  206. rasa/dialogue_understanding/patterns/correction.py +2 -2
  207. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +37 -25
  208. rasa/dialogue_understanding/patterns/domain_for_patterns.py +190 -0
  209. rasa/dialogue_understanding/processor/command_processor.py +6 -7
  210. rasa/dialogue_understanding/stack/utils.py +3 -1
  211. rasa/dialogue_understanding_test/command_metric_calculation.py +7 -40
  212. rasa/dialogue_understanding_test/command_metrics.py +38 -0
  213. rasa/dialogue_understanding_test/du_test_case.py +58 -25
  214. rasa/dialogue_understanding_test/du_test_result.py +228 -132
  215. rasa/dialogue_understanding_test/du_test_runner.py +11 -2
  216. rasa/dialogue_understanding_test/du_test_schema.yml +3 -3
  217. rasa/dialogue_understanding_test/io.py +35 -8
  218. rasa/e2e_test/e2e_test_runner.py +1 -1
  219. rasa/e2e_test/e2e_test_schema.yml +3 -3
  220. rasa/engine/constants.py +1 -1
  221. rasa/engine/graph.py +2 -2
  222. rasa/engine/recipes/default_recipe.py +1 -1
  223. rasa/engine/validation.py +3 -2
  224. rasa/hooks.py +2 -30
  225. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +1 -5
  226. rasa/model_manager/model_api.py +90 -2
  227. rasa/model_manager/socket_bridge.py +0 -7
  228. rasa/model_manager/trainer_service.py +15 -12
  229. rasa/plugin.py +2 -15
  230. rasa/privacy/__init__.py +0 -0
  231. rasa/privacy/constants.py +83 -0
  232. rasa/privacy/event_broker_utils.py +77 -0
  233. rasa/privacy/privacy_config.py +281 -0
  234. rasa/privacy/privacy_config_schema.json +86 -0
  235. rasa/privacy/privacy_filter.py +340 -0
  236. rasa/privacy/privacy_manager.py +576 -0
  237. rasa/server.py +23 -2
  238. rasa/shared/constants.py +14 -0
  239. rasa/shared/core/command_payload_reader.py +1 -5
  240. rasa/shared/core/constants.py +4 -3
  241. rasa/shared/core/domain.py +172 -11
  242. rasa/shared/core/events.py +100 -6
  243. rasa/shared/core/flows/flow.py +35 -8
  244. rasa/shared/core/flows/flow_step.py +26 -4
  245. rasa/shared/core/flows/flow_step_links.py +15 -0
  246. rasa/shared/core/flows/flow_step_sequence.py +6 -0
  247. rasa/shared/core/flows/flows_yaml_schema.json +3 -0
  248. rasa/shared/core/flows/nlu_trigger.py +13 -0
  249. rasa/shared/core/flows/steps/action.py +7 -4
  250. rasa/shared/core/flows/steps/call.py +11 -4
  251. rasa/shared/core/flows/steps/collect.py +71 -6
  252. rasa/shared/core/flows/steps/internal.py +6 -1
  253. rasa/shared/core/flows/steps/link.py +7 -4
  254. rasa/shared/core/flows/steps/no_operation.py +7 -4
  255. rasa/shared/core/flows/steps/set_slots.py +8 -4
  256. rasa/shared/core/flows/validation.py +16 -3
  257. rasa/shared/core/flows/yaml_flows_io.py +106 -5
  258. rasa/shared/core/slots.py +33 -1
  259. rasa/shared/core/trackers.py +4 -10
  260. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +1 -4
  261. rasa/shared/importers/importer.py +14 -0
  262. rasa/shared/importers/static.py +63 -0
  263. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -2
  264. rasa/shared/utils/common.py +43 -1
  265. rasa/shared/utils/llm.py +155 -3
  266. rasa/shared/utils/yaml.py +32 -0
  267. rasa/studio/data_handler.py +3 -3
  268. rasa/studio/download/__init__.py +0 -0
  269. rasa/studio/download/domains.py +49 -0
  270. rasa/studio/download/download.py +416 -0
  271. rasa/studio/download/flows.py +351 -0
  272. rasa/studio/link.py +200 -0
  273. rasa/studio/pull.py +94 -0
  274. rasa/studio/push.py +131 -0
  275. rasa/studio/results_logger.py +6 -1
  276. rasa/studio/upload.py +185 -71
  277. rasa/telemetry.py +83 -26
  278. rasa/tracing/config.py +4 -5
  279. rasa/tracing/constants.py +19 -1
  280. rasa/tracing/instrumentation/attribute_extractors.py +47 -9
  281. rasa/tracing/instrumentation/instrumentation.py +54 -3
  282. rasa/tracing/instrumentation/metrics.py +98 -15
  283. rasa/tracing/metric_instrument_provider.py +75 -3
  284. rasa/utils/common.py +37 -27
  285. rasa/utils/endpoints.py +22 -1
  286. rasa/utils/licensing.py +2 -3
  287. rasa/utils/log_utils.py +1 -45
  288. rasa/validator.py +9 -11
  289. rasa/version.py +1 -1
  290. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/METADATA +12 -13
  291. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/RECORD +308 -283
  292. rasa/anonymization/__init__.py +0 -2
  293. rasa/anonymization/anonymisation_rule_yaml_reader.py +0 -91
  294. rasa/anonymization/anonymization_pipeline.py +0 -286
  295. rasa/anonymization/anonymization_rule_executor.py +0 -266
  296. rasa/anonymization/anonymization_rule_orchestrator.py +0 -119
  297. rasa/anonymization/schemas/config.yml +0 -47
  298. rasa/anonymization/utils.py +0 -118
  299. rasa/cli/project_templates/calm/config.yml +0 -10
  300. rasa/cli/project_templates/calm/credentials.yml +0 -33
  301. rasa/cli/project_templates/calm/endpoints.yml +0 -58
  302. rasa/cli/project_templates/default/actions/actions.py +0 -27
  303. rasa/cli/project_templates/default/data/nlu.yml +0 -91
  304. rasa/cli/project_templates/default/data/rules.yml +0 -13
  305. rasa/cli/project_templates/default/data/stories.yml +0 -30
  306. rasa/cli/project_templates/default/domain.yml +0 -34
  307. rasa/cli/project_templates/default/tests/test_stories.yml +0 -91
  308. rasa/core/channels/inspector/dist/assets/channel-dfa68278.js +0 -1
  309. rasa/core/channels/inspector/dist/assets/clone-edb7f119.js +0 -1
  310. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-65e7c670.js +0 -1
  311. rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -191
  312. rasa/core/tracker_store.py +0 -1792
  313. rasa/studio/download.py +0 -489
  314. /rasa/{cli/project_templates/calm/actions → builder}/__init__.py +0 -0
  315. /rasa/cli/project_templates/{calm → default}/actions/action_template.py +0 -0
  316. /rasa/cli/project_templates/{calm → default}/actions/add_contact.py +0 -0
  317. /rasa/cli/project_templates/{calm → default}/actions/db.py +0 -0
  318. /rasa/cli/project_templates/{calm → default}/actions/list_contacts.py +0 -0
  319. /rasa/cli/project_templates/{calm → default}/actions/remove_contact.py +0 -0
  320. /rasa/cli/project_templates/{calm → default}/data/flows/add_contact.yml +0 -0
  321. /rasa/cli/project_templates/{calm → default}/data/flows/list_contacts.yml +0 -0
  322. /rasa/cli/project_templates/{calm → default}/data/flows/remove_contact.yml +0 -0
  323. /rasa/cli/project_templates/{calm → default}/db/contacts.json +0 -0
  324. /rasa/cli/project_templates/{calm → default}/domain/add_contact.yml +0 -0
  325. /rasa/cli/project_templates/{calm → default}/domain/list_contacts.yml +0 -0
  326. /rasa/cli/project_templates/{calm → default}/domain/remove_contact.yml +0 -0
  327. /rasa/cli/project_templates/{calm → default}/domain/shared.yml +0 -0
  328. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/NOTICE +0 -0
  329. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/WHEEL +0 -0
  330. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/entry_points.txt +0 -0
@@ -150,12 +150,12 @@ class FlowPolicy(Policy):
150
150
  except FlowCircuitBreakerTrippedException as e:
151
151
  structlogger.error(
152
152
  "flow.circuit_breaker",
153
- dialogue_stack=e.dialogue_stack,
154
153
  number_of_steps_taken=e.number_of_steps_taken,
155
154
  event_info=(
156
155
  "The flow circuit breaker tripped. "
157
156
  "There appears to be an infinite loop in the flows."
158
157
  ),
158
+ error=str(e),
159
159
  )
160
160
  # end the current flow and start the internal error flow
161
161
  updated_stack = tracker.stack
@@ -9,6 +9,7 @@ from structlog.contextvars import (
9
9
  bound_contextvars,
10
10
  )
11
11
 
12
+ from rasa.core.available_endpoints import AvailableEndpoints
12
13
  from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
13
14
  from rasa.core.policies.flows.flow_exceptions import (
14
15
  FlowCircuitBreakerTrippedException,
@@ -24,6 +25,7 @@ from rasa.core.policies.flows.flow_step_result import (
24
25
  from rasa.dialogue_understanding.commands import CancelFlowCommand
25
26
  from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
26
27
  from rasa.dialogue_understanding.patterns.collect_information import (
28
+ FLOW_PATTERN_COLLECT_INFORMATION,
27
29
  CollectInformationPatternFlowStackFrame,
28
30
  )
29
31
  from rasa.dialogue_understanding.patterns.completed import (
@@ -54,6 +56,7 @@ from rasa.dialogue_understanding.stack.utils import (
54
56
  from rasa.shared.constants import RASA_PATTERN_HUMAN_HANDOFF
55
57
  from rasa.shared.core.constants import (
56
58
  ACTION_LISTEN_NAME,
59
+ SILENCE_TIMEOUT_SLOT,
57
60
  )
58
61
  from rasa.shared.core.events import (
59
62
  Event,
@@ -123,7 +126,6 @@ def is_condition_satisfied(
123
126
  structlogger.error(
124
127
  "flow.predicate.error",
125
128
  predicate=predicate,
126
- document=document,
127
129
  error=str(e),
128
130
  )
129
131
  return False
@@ -177,7 +179,7 @@ def select_next_step_id(
177
179
  "flow.link.failed_to_select_branch",
178
180
  current=current,
179
181
  links=next_step.links,
180
- tracker=tracker,
182
+ sender_id=tracker.sender_id,
181
183
  )
182
184
  return None
183
185
 
@@ -191,7 +193,7 @@ def select_next_step_id(
191
193
  structlogger.error(
192
194
  "flow.step.failed_to_select_next_step",
193
195
  step=current,
194
- tracker=tracker,
196
+ sender_id=tracker.sender_id,
195
197
  )
196
198
  return None
197
199
 
@@ -226,19 +228,6 @@ def events_from_set_slots_step(step: SetSlotsFlowStep) -> List[Event]:
226
228
  return [SlotSet(slot["key"], slot["value"]) for slot in step.slots]
227
229
 
228
230
 
229
- def events_for_collect_step_execution(
230
- step: CollectInformationFlowStep, tracker: DialogueStateTracker
231
- ) -> List[Event]:
232
- """Create the events needed to prepare for the execution of a collect step."""
233
- # reset the slots that always need to be explicitly collected
234
- slot = tracker.slots.get(step.collect, None)
235
-
236
- if slot and step.ask_before_filling:
237
- return [SlotSet(step.collect, None)]
238
- else:
239
- return []
240
-
241
-
242
231
  def trigger_pattern_continue_interrupted(
243
232
  current_frame: DialogueStackFrame,
244
233
  stack: DialogueStack,
@@ -600,6 +589,12 @@ def run_step(
600
589
  # the START_STEP meta step
601
590
  initial_events.append(FlowStarted(flow.id, metadata=stack.current_context()))
602
591
 
592
+ # FLow does not start with collect step or we are not in collect information pattern
593
+ if _first_step_is_not_collect(
594
+ step, previous_step_id
595
+ ) and not _in_collect_information_pattern(flow):
596
+ _append_global_silence_timeout_event(initial_events, tracker)
597
+
603
598
  if isinstance(step, CollectInformationFlowStep):
604
599
  return _run_collect_information_step(
605
600
  available_actions,
@@ -629,12 +624,32 @@ def run_step(
629
624
  return ContinueFlowWithNextStep(events=initial_events)
630
625
 
631
626
  elif isinstance(step, EndFlowStep):
627
+ # If pattern collect information flow is ending,
628
+ # we need to reset the silence timeout slot to its global value.
629
+ if flow.id == FLOW_PATTERN_COLLECT_INFORMATION:
630
+ _append_global_silence_timeout_event(initial_events, tracker)
631
+
632
632
  return _run_end_step(flow, flows, initial_events, stack, tracker)
633
633
 
634
634
  else:
635
635
  raise FlowException(f"Unknown flow step type {type(step)}")
636
636
 
637
637
 
638
+ def _first_step_is_not_collect(
639
+ step: FlowStep,
640
+ previous_step_id: str,
641
+ ) -> bool:
642
+ """Check if the first step is not a collect information step."""
643
+ return (previous_step_id == START_STEP) and not isinstance(
644
+ step, CollectInformationFlowStep
645
+ )
646
+
647
+
648
+ def _in_collect_information_pattern(flow: Flow) -> bool:
649
+ """Check if the current flow is a collect information pattern."""
650
+ return flow.id == FLOW_PATTERN_COLLECT_INFORMATION
651
+
652
+
638
653
  def _run_end_step(
639
654
  flow: Flow,
640
655
  flows: FlowsList,
@@ -745,5 +760,69 @@ def _run_collect_information_step(
745
760
  step.collect, stack, step.rejections, step.utter, step.collect_action
746
761
  )
747
762
 
748
- events: List[Event] = events_for_collect_step_execution(step, tracker)
763
+ events: List[Event] = _events_for_collect_step_execution(step, tracker)
749
764
  return ContinueFlowWithNextStep(events=initial_events + events)
765
+
766
+
767
+ def _events_for_collect_step_execution(
768
+ step: CollectInformationFlowStep, tracker: DialogueStateTracker
769
+ ) -> List[Event]:
770
+ """Create the events needed to prepare for the execution of a collect step."""
771
+ # reset the slots that always need to be explicitly collected
772
+
773
+ events = _silence_timeout_events_for_collect_step(step, tracker)
774
+
775
+ slot = tracker.slots.get(step.collect, None)
776
+ if slot and step.ask_before_filling:
777
+ events.append(SlotSet(step.collect, None))
778
+
779
+ return events
780
+
781
+
782
+ def _silence_timeout_events_for_collect_step(
783
+ step: CollectInformationFlowStep, tracker: DialogueStateTracker
784
+ ) -> List[Event]:
785
+ events: List[Event] = []
786
+
787
+ silence_timeout = (
788
+ AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout
789
+ )
790
+
791
+ if step.silence_timeout:
792
+ structlogger.debug(
793
+ "flow.step.run.adjusting_silence_timeout",
794
+ duration=step.silence_timeout,
795
+ collect=step.collect,
796
+ )
797
+
798
+ silence_timeout = step.silence_timeout
799
+ else:
800
+ structlogger.debug(
801
+ "flow.step.run.reset_silence_timeout_to_global",
802
+ duration=silence_timeout,
803
+ collect=step.collect,
804
+ )
805
+
806
+ current_silence_timeout = tracker.get_slot(SILENCE_TIMEOUT_SLOT)
807
+
808
+ if current_silence_timeout != silence_timeout:
809
+ events.append(SlotSet(SILENCE_TIMEOUT_SLOT, silence_timeout))
810
+
811
+ return events
812
+
813
+
814
+ def _append_global_silence_timeout_event(
815
+ events: List[Event], tracker: DialogueStateTracker
816
+ ) -> None:
817
+ current_silence_timeout = tracker.get_slot(SILENCE_TIMEOUT_SLOT)
818
+ global_silence_timeout = (
819
+ AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout
820
+ )
821
+
822
+ if current_silence_timeout != global_silence_timeout:
823
+ events.append(
824
+ SlotSet(
825
+ SILENCE_TIMEOUT_SLOT,
826
+ AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout,
827
+ )
828
+ )
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple
5
5
 
6
6
  import structlog
7
7
  import tiktoken
8
+ from deprecated import deprecated # type: ignore[import]
8
9
  from jinja2 import Template
9
10
  from langchain.docstore.document import Document
10
11
  from langchain.schema.embeddings import Embeddings
@@ -37,18 +38,14 @@ from rasa.shared.constants import (
37
38
  MODEL_NAME_CONFIG_KEY,
38
39
  OPENAI_PROVIDER,
39
40
  PROMPT_CONFIG_KEY,
41
+ PROMPT_TEMPLATE_CONFIG_KEY,
40
42
  PROVIDER_CONFIG_KEY,
41
43
  TEMPERATURE_CONFIG_KEY,
42
44
  TIMEOUT_CONFIG_KEY,
43
45
  )
44
46
  from rasa.shared.core.constants import ACTION_LISTEN_NAME
45
47
  from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
46
- from rasa.shared.core.events import (
47
- ActionExecuted,
48
- BotUttered,
49
- Event,
50
- UserUttered,
51
- )
48
+ from rasa.shared.core.events import ActionExecuted, BotUttered, Event, UserUttered
52
49
  from rasa.shared.core.flows import FlowsList
53
50
  from rasa.shared.core.generator import TrackerWithCachedStates
54
51
  from rasa.shared.core.policies.utils import filter_responses_for_intentless_policy
@@ -60,18 +57,22 @@ from rasa.shared.providers.embedding._langchain_embedding_client_adapter import
60
57
  _LangchainEmbeddingClientAdapter,
61
58
  )
62
59
  from rasa.shared.providers.llm.llm_client import LLMClient
63
- from rasa.shared.utils.constants import LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON
60
+ from rasa.shared.utils.constants import (
61
+ LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON,
62
+ LOG_COMPONENT_SOURCE_METHOD_INIT,
63
+ )
64
64
  from rasa.shared.utils.health_check.embeddings_health_check_mixin import (
65
65
  EmbeddingsHealthCheckMixin,
66
66
  )
67
67
  from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
68
- from rasa.shared.utils.io import deep_container_fingerprint
68
+ from rasa.shared.utils.io import deep_container_fingerprint, raise_deprecation_warning
69
69
  from rasa.shared.utils.llm import (
70
70
  AI,
71
71
  DEFAULT_OPENAI_CHAT_MODEL_NAME,
72
72
  DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
73
73
  DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
74
74
  USER,
75
+ check_prompt_config_keys_and_warn_if_deprecated,
75
76
  combine_custom_and_default_config,
76
77
  embedder_factory,
77
78
  get_prompt_template,
@@ -123,9 +124,12 @@ DEFAULT_EMBEDDINGS_CONFIG = {
123
124
  MODEL_CONFIG_KEY: DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
124
125
  }
125
126
 
126
- DEFAULT_INTENTLESS_PROMPT_TEMPLATE = importlib.resources.open_text(
127
+ DEFAULT_INTENTLESS_PROMPT_TEMPLATE_FILE_NAME = importlib.resources.open_text(
127
128
  "rasa.core.policies", "intentless_prompt_template.jinja2"
128
129
  ).name
130
+ DEFAULT_INTENTLESS_PROMPT_TEMPLATE = importlib.resources.read_text(
131
+ "rasa.core.policies", "intentless_prompt_template.jinja2"
132
+ )
129
133
 
130
134
  INTENTLESS_PROMPT_TEMPLATE_FILE_NAME = "intentless_policy_prompt.jinja2"
131
135
  INTENTLESS_CONFIG_FILE_NAME = "config.json"
@@ -325,6 +329,9 @@ def conversation_as_prompt(conversation: Conversation) -> str:
325
329
  @DefaultV1Recipe.register(
326
330
  DefaultV1Recipe.ComponentType.POLICY_WITH_END_TO_END_SUPPORT, is_trainable=True
327
331
  )
332
+ @deprecated(
333
+ reason=("The IntentlessPolicy is deprecated and will be removed in Rasa `4.0.0`.")
334
+ )
328
335
  class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
329
336
  """Policy which uses a language model to generate the next action.
330
337
 
@@ -346,7 +353,7 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
346
353
  # ensures that the policy will not override a deterministic policy
347
354
  # which utilizes the nlu predictions confidence (e.g. Memoization).
348
355
  NLU_ABSTENTION_THRESHOLD: 0.9,
349
- PROMPT_CONFIG_KEY: DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
356
+ PROMPT_TEMPLATE_CONFIG_KEY: None, # TODO: remove in Rasa 4.0.0
350
357
  }
351
358
 
352
359
  @staticmethod
@@ -378,6 +385,9 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
378
385
  prompt_template: Optional[Text] = None,
379
386
  ) -> None:
380
387
  """Constructs a new Policy object."""
388
+ raise_deprecation_warning(
389
+ message=("Support for `IntentlessPolicy` will be removed in Rasa `4.0.0`.")
390
+ )
381
391
  super().__init__(config, model_storage, resource, execution_context, featurizer)
382
392
 
383
393
  # Resolve LLM config
@@ -400,11 +410,43 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
400
410
  self.response_index = responses_docsearch
401
411
  self.conversation_samples_index = samples_docsearch
402
412
  self.embedder = self._create_plain_embedder(config)
403
- self.prompt_template = prompt_template or rasa.shared.utils.io.read_file(
404
- self.config[PROMPT_CONFIG_KEY]
413
+
414
+ # Warn if the prompt config key is used to set the prompt template
415
+ check_prompt_config_keys_and_warn_if_deprecated(config, "intentless_policy")
416
+
417
+ self.prompt_template = prompt_template or self._resolve_prompt_template(
418
+ config, LOG_COMPONENT_SOURCE_METHOD_INIT
405
419
  )
406
420
  self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
407
421
 
422
+ @classmethod
423
+ def _resolve_prompt_template(
424
+ cls: Any,
425
+ config: dict,
426
+ log_source_method: str,
427
+ ) -> str:
428
+ """Resolves the prompt template from the config.
429
+
430
+ Args:
431
+ config: The config to resolve the prompt template from.
432
+ log_source_method: The method from which the prompt template is resolved.
433
+
434
+ Returns:
435
+ The resolved prompt template.
436
+ """
437
+ # Prefer prompt template over prompt config key.
438
+ prompt_template_file = (
439
+ config.get(PROMPT_TEMPLATE_CONFIG_KEY)
440
+ or config.get(PROMPT_CONFIG_KEY)
441
+ or DEFAULT_INTENTLESS_PROMPT_TEMPLATE_FILE_NAME
442
+ )
443
+ return get_prompt_template(
444
+ prompt_template_file,
445
+ DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
446
+ log_source_component=IntentlessPolicy.__name__,
447
+ log_source_method=log_source_method,
448
+ )
449
+
408
450
  @classmethod
409
451
  def _create_plain_embedder(cls, config: Dict[Text, Any]) -> Embeddings:
410
452
  """Creates an embedder that uses the OpenAI API.
@@ -943,11 +985,8 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
943
985
  @classmethod
944
986
  def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
945
987
  """Add a fingerprint of intentless policy for the graph."""
946
- prompt_template = get_prompt_template(
947
- config.get(PROMPT_CONFIG_KEY),
948
- DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
949
- log_source_component=IntentlessPolicy.__name__,
950
- log_source_method=LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON,
988
+ prompt_template = cls._resolve_prompt_template(
989
+ config, LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON
951
990
  )
952
991
 
953
992
  llm_config = resolve_model_client_config(
rasa/core/processor.py CHANGED
@@ -12,7 +12,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
12
12
  import structlog
13
13
 
14
14
  import rasa.core.actions.action
15
- import rasa.core.tracker_store
15
+ import rasa.core.tracker_stores.tracker_store
16
16
  import rasa.core.utils
17
17
  import rasa.shared.core.trackers
18
18
  import rasa.shared.utils.io
@@ -75,8 +75,8 @@ from rasa.shared.core.constants import (
75
75
  ACTION_SESSION_START_NAME,
76
76
  FOLLOWUP_ACTION,
77
77
  SESSION_START_METADATA_SLOT,
78
+ SILENCE_TIMEOUT_SLOT,
78
79
  SLOT_CONSECUTIVE_SILENCE_TIMEOUTS,
79
- SLOT_SILENCE_TIMEOUT,
80
80
  USER_INTENT_RESTART,
81
81
  USER_INTENT_SILENCE_TIMEOUT,
82
82
  SetSlotExtractor,
@@ -112,7 +112,8 @@ from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
112
112
  from rasa.utils.endpoints import EndpointConfig
113
113
 
114
114
  if TYPE_CHECKING:
115
- from rasa.core.utils import AvailableEndpoints
115
+ from rasa.core.available_endpoints import AvailableEndpoints
116
+ from rasa.privacy.privacy_manager import BackgroundPrivacyManager
116
117
 
117
118
  logger = logging.getLogger(__name__)
118
119
  structlogger = structlog.get_logger()
@@ -129,7 +130,7 @@ class MessageProcessor:
129
130
  def __init__(
130
131
  self,
131
132
  model_path: Union[Text, Path],
132
- tracker_store: rasa.core.tracker_store.TrackerStore,
133
+ tracker_store: rasa.core.tracker_stores.tracker_store.TrackerStore,
133
134
  lock_store: LockStore,
134
135
  generator: NaturalLanguageGenerator,
135
136
  action_endpoint: Optional[EndpointConfig] = None,
@@ -138,6 +139,7 @@ class MessageProcessor:
138
139
  on_circuit_break: Optional[LambdaType] = None,
139
140
  http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
140
141
  endpoints: Optional["AvailableEndpoints"] = None,
142
+ privacy_manager: Optional["BackgroundPrivacyManager"] = None,
141
143
  ) -> None:
142
144
  """Initializes a `MessageProcessor`."""
143
145
  self.nlg = generator
@@ -167,6 +169,9 @@ class MessageProcessor:
167
169
  self.model_path = Path(model_path)
168
170
  self.domain = self.model_metadata.domain
169
171
  self.http_interpreter = http_interpreter
172
+ self.privacy_manager = privacy_manager
173
+ if self.privacy_manager is not None:
174
+ self.privacy_manager.validate_sensitive_slots_in_domain(self.domain)
170
175
 
171
176
  @staticmethod
172
177
  def _load_model(
@@ -216,15 +221,30 @@ class MessageProcessor:
216
221
 
217
222
  await self._run_prediction_loop(message.output_channel, tracker)
218
223
 
219
- await self.run_anonymization_pipeline(tracker)
220
-
221
224
  await self.save_tracker(tracker)
222
225
 
226
+ self.trigger_anonymization(tracker)
227
+
223
228
  if isinstance(message.output_channel, CollectingOutputChannel):
224
229
  return message.output_channel.messages
225
230
 
226
231
  return None
227
232
 
233
+ def trigger_anonymization(self, tracker: DialogueStateTracker) -> None:
234
+ if self.privacy_manager is None:
235
+ structlogger.debug(
236
+ "processor.trigger_anonymization.skipping.pii_management_not_enabled",
237
+ )
238
+ return None
239
+
240
+ structlogger.info(
241
+ "rasa.core.processor.trigger_anonymization",
242
+ sender_id=tracker.sender_id,
243
+ event_info="Triggering anonymization for publishing anonymized "
244
+ "events to the event broker.",
245
+ )
246
+ return self.privacy_manager.run(tracker)
247
+
228
248
  async def run_action_extract_slots(
229
249
  self,
230
250
  output_channel: OutputChannel,
@@ -265,26 +285,6 @@ class MessageProcessor:
265
285
 
266
286
  return tracker
267
287
 
268
- async def run_anonymization_pipeline(self, tracker: DialogueStateTracker) -> None:
269
- """Run the anonymization pipeline on the new tracker events.
270
-
271
- Args:
272
- tracker: A tracker representing a conversation state.
273
- """
274
- anonymization_pipeline = plugin_manager().hook.get_anonymization_pipeline()
275
- if anonymization_pipeline is None:
276
- return None
277
-
278
- old_tracker = await self.tracker_store.retrieve(tracker.sender_id)
279
- new_events = rasa.shared.core.trackers.TrackerEventDiffEngine.event_difference(
280
- old_tracker, tracker
281
- )
282
-
283
- for event in new_events:
284
- body = {"sender_id": tracker.sender_id}
285
- body.update(event.as_dict())
286
- anonymization_pipeline.run(body)
287
-
288
288
  async def predict_next_for_sender_id(
289
289
  self, sender_id: Text
290
290
  ) -> Optional[Dict[Text, Any]]:
@@ -822,28 +822,8 @@ class MessageProcessor:
822
822
  )
823
823
 
824
824
  self._check_for_unseen_features(parse_data)
825
- # resetting timeouts variables whenever something that is not a timeout occurs
826
- if (
827
- parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
828
- != USER_INTENT_SILENCE_TIMEOUT
829
- and tracker
830
- ):
831
- if (
832
- SLOT_CONSECUTIVE_SILENCE_TIMEOUTS in tracker.slots
833
- and tracker.slots[SLOT_CONSECUTIVE_SILENCE_TIMEOUTS].value != 0.0
834
- ):
835
- tracker.update(SlotSet(SLOT_CONSECUTIVE_SILENCE_TIMEOUTS, 0.0))
836
- if (
837
- SLOT_SILENCE_TIMEOUT in tracker.slots
838
- and tracker.slots[SLOT_SILENCE_TIMEOUT].value
839
- != tracker.slots[SLOT_SILENCE_TIMEOUT].initial_value
840
- ):
841
- tracker.update(
842
- SlotSet(
843
- SLOT_SILENCE_TIMEOUT,
844
- tracker.slots[SLOT_SILENCE_TIMEOUT].initial_value,
845
- )
846
- )
825
+
826
+ self._initialise_consecutive_silence_timeout_slots(parse_data, tracker)
847
827
 
848
828
  return parse_data
849
829
 
@@ -1068,7 +1048,14 @@ class MessageProcessor:
1068
1048
 
1069
1049
  @staticmethod
1070
1050
  def _should_handle_message(tracker: DialogueStateTracker) -> bool:
1071
- return not tracker.is_paused() or (
1051
+ return not tracker.is_paused() or MessageProcessor._last_user_intent_is_restart(
1052
+ tracker
1053
+ )
1054
+
1055
+ @staticmethod
1056
+ def _last_user_intent_is_restart(tracker: DialogueStateTracker) -> bool:
1057
+ """Check if the last user intent is a restart intent."""
1058
+ return (
1072
1059
  tracker.latest_message is not None
1073
1060
  and tracker.latest_message.intent.get(INTENT_NAME_KEY)
1074
1061
  == USER_INTENT_RESTART
@@ -1615,3 +1602,31 @@ class MessageProcessor:
1615
1602
  )
1616
1603
 
1617
1604
  return tracker, validate_frames
1605
+
1606
+ @staticmethod
1607
+ def _initialise_consecutive_silence_timeout_slots(
1608
+ parse_data: Dict[str, Any],
1609
+ tracker: DialogueStateTracker,
1610
+ ) -> None:
1611
+ # resetting timeouts variables whenever something that is not a timeout occurs
1612
+ if (
1613
+ parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
1614
+ != USER_INTENT_SILENCE_TIMEOUT
1615
+ and tracker
1616
+ ):
1617
+ if (
1618
+ SLOT_CONSECUTIVE_SILENCE_TIMEOUTS in tracker.slots
1619
+ and tracker.slots[SLOT_CONSECUTIVE_SILENCE_TIMEOUTS].value != 0.0
1620
+ ):
1621
+ tracker.update(SlotSet(SLOT_CONSECUTIVE_SILENCE_TIMEOUTS, 0.0))
1622
+ if (
1623
+ SILENCE_TIMEOUT_SLOT in tracker.slots
1624
+ and tracker.slots[SILENCE_TIMEOUT_SLOT].value
1625
+ != tracker.slots[SILENCE_TIMEOUT_SLOT].initial_value
1626
+ ):
1627
+ tracker.update(
1628
+ SlotSet(
1629
+ SILENCE_TIMEOUT_SLOT,
1630
+ tracker.slots[SILENCE_TIMEOUT_SLOT].initial_value,
1631
+ )
1632
+ )
rasa/core/run.py CHANGED
@@ -30,12 +30,11 @@ from rasa import server, telemetry
30
30
  from rasa.constants import ENV_SANIC_BACKLOG
31
31
  from rasa.core import agent, channels, constants
32
32
  from rasa.core.agent import Agent
33
+ from rasa.core.available_endpoints import AvailableEndpoints
33
34
  from rasa.core.channels import console
34
35
  from rasa.core.channels.channel import InputChannel
35
36
  from rasa.core.channels.development_inspector import DevelopmentInspectProxy
36
37
  from rasa.core.persistor import StorageType
37
- from rasa.core.utils import AvailableEndpoints
38
- from rasa.plugin import plugin_manager
39
38
  from rasa.shared.exceptions import RasaException
40
39
  from rasa.shared.utils.yaml import read_config_file
41
40
  from rasa.utils import licensing
@@ -45,7 +44,7 @@ logger = logging.getLogger() # get the root logger
45
44
 
46
45
  def create_http_input_channels(
47
46
  channel: Optional[Text], credentials_file: Optional[Text]
48
- ) -> List["InputChannel"]:
47
+ ) -> List[InputChannel]:
49
48
  """Instantiate the chosen input channel."""
50
49
  if credentials_file:
51
50
  all_credentials = read_config_file(credentials_file)
@@ -59,22 +58,45 @@ def create_http_input_channels(
59
58
  "To connect to all given channels, omit the '--connector' "
60
59
  "argument.".format(channel)
61
60
  )
62
- return [_create_single_channel(channel, all_credentials.get(channel))]
61
+ return [
62
+ _create_single_channel(
63
+ channel,
64
+ all_credentials.get(channel),
65
+ )
66
+ ]
63
67
  else:
64
68
  return [_create_single_channel(c, k) for c, k in all_credentials.items()]
65
69
 
66
70
 
67
- def _create_single_channel(channel: Text, credentials: Dict[Text, Any]) -> Any:
71
+ def _create_single_channel(
72
+ channel: Text,
73
+ credentials: Optional[Dict[Text, Any]],
74
+ ) -> Any:
75
+ """Create a single input channel based on the channel name and credentials.
76
+
77
+ Args:
78
+ channel: The name of the input channel to create.
79
+ credentials: The credentials for the input channel.
80
+
81
+ Returns:
82
+ An instance of the input channel class.
83
+
84
+ Raises:
85
+ RasaException: If the channel class cannot be found or instantiated.
86
+ """
68
87
  from rasa.core.channels import BUILTIN_CHANNELS
69
88
 
70
89
  if channel in BUILTIN_CHANNELS:
71
- return BUILTIN_CHANNELS[channel].from_credentials(credentials)
90
+ channel_class = BUILTIN_CHANNELS[channel]
91
+
92
+ return channel_class.from_credentials(credentials)
72
93
  else:
73
94
  # try to load channel based on class name
74
95
  try:
75
96
  input_channel_class = rasa.shared.utils.common.class_from_module_path(
76
97
  channel
77
98
  )
99
+
78
100
  return input_channel_class.from_credentials(credentials)
79
101
  except (AttributeError, ImportError):
80
102
  raise RasaException(
@@ -108,7 +130,7 @@ def _is_apple_silicon_system() -> bool:
108
130
 
109
131
 
110
132
  def configure_app(
111
- input_channels: Optional[List["InputChannel"]] = None,
133
+ input_channels: Optional[List[InputChannel]] = None,
112
134
  cors: Optional[Union[Text, List[Text], None]] = None,
113
135
  auth_token: Optional[Text] = None,
114
136
  enable_api: bool = True,
@@ -190,10 +212,6 @@ def configure_app(
190
212
  logger.info("Killing Sanic server now.")
191
213
  running_app.stop() # kill the sanic server
192
214
 
193
- @app.after_server_stop
194
- async def after_server_stop(running_app: Sanic) -> None:
195
- plugin_manager().hook.after_server_stop()
196
-
197
215
  if server_listeners:
198
216
  for listener, event in server_listeners:
199
217
  app.register_listener(listener, event)
@@ -346,3 +364,7 @@ async def close_resources(app: Sanic, _: AbstractEventLoop) -> None:
346
364
  event_broker = current_agent.tracker_store.event_broker
347
365
  if event_broker:
348
366
  await event_broker.close()
367
+
368
+ privacy_manager = current_agent.privacy_manager
369
+ if privacy_manager:
370
+ privacy_manager.stop()
File without changes
@@ -3,7 +3,7 @@ from typing import Iterable, Optional, Text
3
3
 
4
4
  from rasa.core.brokers.broker import EventBroker
5
5
  from rasa.core.secrets_manager.secret_manager import EndpointResolver
6
- from rasa.core.tracker_store import TrackerStore, create_tracker_store
6
+ from rasa.core.tracker_stores.tracker_store import TrackerStore, create_tracker_store
7
7
  from rasa.shared.core.domain import Domain
8
8
  from rasa.shared.core.trackers import DialogueStateTracker
9
9
  from rasa.utils.endpoints import EndpointConfig
@@ -119,3 +119,7 @@ class AuthRetryTrackerStore(TrackerStore):
119
119
  """Recreate tracker store with updated credentials."""
120
120
  endpoint_config = EndpointResolver.update_config(self.endpoint_config)
121
121
  return create_tracker_store(endpoint_config, domain, event_broker)
122
+
123
+ async def delete(self, sender_id: Text) -> None:
124
+ """Delete tracker for the given sender_id."""
125
+ await self._tracker_store.delete(sender_id)