rasa-pro 3.12.22__py3-none-any.whl → 3.13.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 (354) hide show
  1. rasa/__main__.py +3 -4
  2. rasa/api.py +1 -1
  3. rasa/cli/dialogue_understanding_test.py +1 -1
  4. rasa/cli/e2e_test.py +1 -8
  5. rasa/cli/evaluate.py +2 -2
  6. rasa/cli/export.py +5 -3
  7. rasa/cli/inspect.py +7 -0
  8. rasa/cli/llm_fine_tuning.py +1 -1
  9. rasa/cli/project_templates/default/config.yml +5 -32
  10. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_cancels_during_a_correction.yml +1 -1
  11. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +1 -1
  12. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_handle.yml +1 -1
  13. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_name.yml +1 -1
  14. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +1 -1
  15. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_lists_contacts.yml +1 -1
  16. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact.yml +1 -1
  17. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact_from_list.yml +1 -1
  18. rasa/cli/project_templates/default/endpoints.yml +18 -2
  19. rasa/cli/project_templates/defaults.py +133 -0
  20. rasa/cli/project_templates/tutorial/config.yml +1 -1
  21. rasa/cli/project_templates/tutorial/endpoints.yml +1 -1
  22. rasa/cli/run.py +1 -1
  23. rasa/cli/scaffold.py +2 -3
  24. rasa/cli/shell.py +6 -1
  25. rasa/cli/studio/download.py +0 -22
  26. rasa/cli/studio/link.py +36 -0
  27. rasa/cli/studio/pull.py +79 -0
  28. rasa/cli/studio/push.py +78 -0
  29. rasa/cli/studio/studio.py +12 -0
  30. rasa/cli/studio/train.py +1 -5
  31. rasa/cli/studio/upload.py +6 -4
  32. rasa/cli/train.py +5 -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 +24 -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/__init__.py +3 -0
  46. rasa/core/channels/botframework.py +2 -2
  47. rasa/core/channels/channel.py +2 -2
  48. rasa/core/channels/development_inspector.py +1 -1
  49. rasa/core/channels/facebook.py +1 -4
  50. rasa/core/channels/hangouts.py +8 -5
  51. rasa/core/channels/inspector/.eslintrc.cjs +12 -6
  52. rasa/core/channels/inspector/.prettierrc +5 -0
  53. rasa/core/channels/inspector/README.md +11 -5
  54. rasa/core/channels/inspector/dist/assets/{arc-9f75cc3b.js → arc-371401b1.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7f34db23.js → blockDiagram-38ab4fdb-3f126156.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-948bab2c.js → c4Diagram-3d4e48cf-12f22eb7.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/channel-f1efda17.js +1 -0
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-53b0dd0e.js → classDiagram-70f12bd4-03b1d386.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-fdf789e7.js → classDiagram-v2-f2320105-84f69d63.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/clone-fdf164e2.js +1 -0
  61. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-87c4ece5.js → createText-2e5e7dd3-ca47fd38.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-5a8b0749.js → edges-e0da2a9e-f837ca8a.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-66da90e2.js → erDiagram-9861fffd-8717ac54.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-10044f05.js → flowDb-956e92f1-94f38b83.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f338f66a.js → flowDiagram-66a62f08-b616f9fb.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-7d7a1629.js +1 -0
  67. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b13140aa.js → flowchart-elk-definition-4a651766-f5d24bb8.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-f2b4a55a.js → ganttDiagram-c361ad54-b43ba8d9.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-dedc298d.js → gitGraphDiagram-72cf32ee-c3aafaa5.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{graph-4ede11ff.js → graph-0d0a2c10.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{index-3862675e-65549d37.js → index-3862675e-58ea0305.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{index-3a23e736.js → index-cce6f8a1.js} +123 -123
  73. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-65439671.js → infoDiagram-f8f76790-b8f60461.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-56d03d98.js → journeyDiagram-49397b02-95be5545.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{layout-dd48f7f4.js → layout-da885b9b.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{line-1569ad2c.js → line-f1c817d3.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{linear-48bf4935.js → linear-d42801e6.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-688504c1.js → mindmap-definition-fc14e90a-a38923a6.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78b6d7e6.js → pieDiagram-8a3498a8-ca6e71e9.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-048b84b3.js → quadrantDiagram-120e2f19-b290dae9.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dd67f107.js → requirementDiagram-deff3bca-03f02ceb.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-8128436e.js → sankeyDiagram-04a897e0-c49eee40.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-1a0d1461.js → sequenceDiagram-704730f1-b2cd6a3d.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-46d388ed.js → stateDiagram-587899a1-e53a2028.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-ea42951a.js → stateDiagram-v2-d93cdb3a-e1982a03.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-7427ed0c.js → styles-6aaf32cf-d0226ca5.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-ff5e5a16.js → styles-9a916d00-0e21dc00.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-7b3680cf.js → styles-c10674c1-9588494e.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f860f2ad.js → svgDrawCommon-08f97a94-be478d4f.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-2eebf0c8.js → timeline-definition-85554ec2-74631749.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5d7f4e96.js → xychartDiagram-e933f94c-a043552f.js} +1 -1
  92. rasa/core/channels/inspector/dist/index.html +1 -1
  93. rasa/core/channels/inspector/package.json +3 -1
  94. rasa/core/channels/inspector/src/App.tsx +91 -90
  95. rasa/core/channels/inspector/src/components/Chat.tsx +45 -41
  96. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +40 -40
  97. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +57 -57
  98. rasa/core/channels/inspector/src/components/DialogueStack.tsx +36 -27
  99. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +4 -4
  100. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +7 -7
  101. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +28 -12
  102. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +9 -9
  103. rasa/core/channels/inspector/src/components/RasaLogo.tsx +5 -5
  104. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +55 -60
  105. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +5 -5
  106. rasa/core/channels/inspector/src/components/Slots.tsx +22 -22
  107. rasa/core/channels/inspector/src/components/Welcome.tsx +28 -31
  108. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +245 -0
  109. rasa/core/channels/inspector/src/helpers/audio/microphone-processor.js +12 -0
  110. rasa/core/channels/inspector/src/helpers/audio/playback-processor.js +36 -0
  111. rasa/core/channels/inspector/src/helpers/conversation.ts +7 -7
  112. rasa/core/channels/inspector/src/helpers/formatters.test.ts +181 -181
  113. rasa/core/channels/inspector/src/helpers/formatters.ts +111 -111
  114. rasa/core/channels/inspector/src/helpers/utils.ts +78 -61
  115. rasa/core/channels/inspector/src/main.tsx +8 -8
  116. rasa/core/channels/inspector/src/theme/Button/Button.ts +8 -8
  117. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +7 -7
  118. rasa/core/channels/inspector/src/theme/Input/Input.ts +9 -9
  119. rasa/core/channels/inspector/src/theme/Link/Link.ts +6 -6
  120. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +13 -13
  121. rasa/core/channels/inspector/src/theme/Table/Table.tsx +10 -10
  122. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +5 -5
  123. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +7 -7
  124. rasa/core/channels/inspector/src/theme/base/colors.ts +64 -64
  125. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +21 -18
  126. rasa/core/channels/inspector/src/theme/base/radii.ts +8 -8
  127. rasa/core/channels/inspector/src/theme/base/shadows.ts +5 -5
  128. rasa/core/channels/inspector/src/theme/base/sizes.ts +5 -5
  129. rasa/core/channels/inspector/src/theme/base/space.ts +12 -12
  130. rasa/core/channels/inspector/src/theme/base/styles.ts +5 -5
  131. rasa/core/channels/inspector/src/theme/base/typography.ts +12 -12
  132. rasa/core/channels/inspector/src/theme/base/zIndices.ts +3 -3
  133. rasa/core/channels/inspector/src/theme/index.ts +38 -38
  134. rasa/core/channels/inspector/src/types.ts +56 -50
  135. rasa/core/channels/inspector/yarn.lock +5 -0
  136. rasa/core/channels/mattermost.py +1 -1
  137. rasa/core/channels/rasa_chat.py +2 -4
  138. rasa/core/channels/rest.py +5 -4
  139. rasa/core/channels/socketio.py +56 -41
  140. rasa/core/channels/studio_chat.py +329 -68
  141. rasa/core/channels/vier_cvg.py +1 -2
  142. rasa/core/channels/voice_ready/audiocodes.py +4 -11
  143. rasa/core/channels/voice_ready/jambonz.py +5 -6
  144. rasa/core/channels/voice_ready/twilio_voice.py +13 -12
  145. rasa/core/channels/voice_ready/utils.py +22 -0
  146. rasa/core/channels/voice_stream/audiocodes.py +13 -16
  147. rasa/core/channels/voice_stream/browser_audio.py +1 -1
  148. rasa/core/channels/voice_stream/genesys.py +37 -18
  149. rasa/core/channels/voice_stream/jambonz.py +232 -0
  150. rasa/core/channels/voice_stream/tts/__init__.py +8 -0
  151. rasa/core/channels/voice_stream/twilio_media_streams.py +15 -12
  152. rasa/core/channels/voice_stream/voice_channel.py +71 -27
  153. rasa/core/concurrent_lock_store.py +24 -10
  154. rasa/core/evaluation/marker_tracker_loader.py +1 -1
  155. rasa/core/exporter.py +37 -1
  156. rasa/core/http_interpreter.py +3 -7
  157. rasa/core/information_retrieval/faiss.py +18 -11
  158. rasa/core/information_retrieval/ingestion/faq_parser.py +158 -0
  159. rasa/core/jobs.py +2 -1
  160. rasa/core/lock_store.py +151 -60
  161. rasa/core/nlg/contextual_response_rephraser.py +17 -7
  162. rasa/core/nlg/generator.py +5 -22
  163. rasa/core/nlg/interpolator.py +2 -3
  164. rasa/core/nlg/response.py +6 -43
  165. rasa/core/nlg/summarize.py +1 -1
  166. rasa/core/nlg/translate.py +0 -8
  167. rasa/core/policies/enterprise_search_policy.py +305 -189
  168. rasa/core/policies/enterprise_search_policy_config.py +241 -0
  169. rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_template.jinja2 +67 -0
  170. rasa/core/policies/flow_policy.py +1 -1
  171. rasa/core/policies/flows/flow_executor.py +102 -17
  172. rasa/core/policies/intentless_policy.py +56 -17
  173. rasa/core/processor.py +70 -49
  174. rasa/core/run.py +33 -11
  175. rasa/core/tracker_stores/__init__.py +0 -0
  176. rasa/core/{auth_retry_tracker_store.py → tracker_stores/auth_retry_tracker_store.py} +66 -1
  177. rasa/core/tracker_stores/dynamo_tracker_store.py +256 -0
  178. rasa/core/tracker_stores/mongo_tracker_store.py +223 -0
  179. rasa/core/tracker_stores/redis_tracker_store.py +252 -0
  180. rasa/core/tracker_stores/sql_tracker_store.py +582 -0
  181. rasa/core/tracker_stores/tracker_store.py +839 -0
  182. rasa/core/training/interactive.py +1 -1
  183. rasa/core/utils.py +24 -95
  184. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -1
  185. rasa/dialogue_understanding/coexistence/llm_based_router.py +13 -11
  186. rasa/dialogue_understanding/commands/can_not_handle_command.py +2 -0
  187. rasa/dialogue_understanding/commands/cancel_flow_command.py +3 -1
  188. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +2 -0
  189. rasa/dialogue_understanding/commands/clarify_command.py +6 -2
  190. rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -0
  191. rasa/dialogue_understanding/commands/correct_slots_command.py +5 -6
  192. rasa/dialogue_understanding/commands/error_command.py +1 -1
  193. rasa/dialogue_understanding/commands/human_handoff_command.py +3 -3
  194. rasa/dialogue_understanding/commands/knowledge_answer_command.py +2 -0
  195. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +2 -0
  196. rasa/dialogue_understanding/commands/set_slot_command.py +8 -4
  197. rasa/dialogue_understanding/commands/skip_question_command.py +3 -3
  198. rasa/dialogue_understanding/commands/start_flow_command.py +7 -3
  199. rasa/dialogue_understanding/generator/__init__.py +7 -1
  200. rasa/dialogue_understanding/generator/command_generator.py +4 -2
  201. rasa/dialogue_understanding/generator/command_parser.py +2 -2
  202. rasa/dialogue_understanding/generator/command_parser_validator.py +63 -0
  203. rasa/dialogue_understanding/generator/llm_based_command_generator.py +1 -2
  204. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +3 -2
  205. rasa/dialogue_understanding/generator/nlu_command_adapter.py +2 -2
  206. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_template.jinja2 +0 -2
  207. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +1 -0
  208. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +1 -0
  209. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +79 -0
  210. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +79 -0
  211. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +26 -461
  212. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +147 -0
  213. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +461 -0
  214. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +20 -64
  215. rasa/dialogue_understanding/patterns/cancel.py +1 -2
  216. rasa/dialogue_understanding/patterns/clarify.py +1 -1
  217. rasa/dialogue_understanding/patterns/correction.py +2 -2
  218. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +42 -27
  219. rasa/dialogue_understanding/patterns/domain_for_patterns.py +190 -0
  220. rasa/dialogue_understanding/processor/command_processor.py +6 -7
  221. rasa/dialogue_understanding_test/command_metric_calculation.py +7 -40
  222. rasa/dialogue_understanding_test/command_metrics.py +38 -0
  223. rasa/dialogue_understanding_test/du_test_case.py +58 -25
  224. rasa/dialogue_understanding_test/du_test_result.py +228 -132
  225. rasa/dialogue_understanding_test/du_test_runner.py +11 -2
  226. rasa/dialogue_understanding_test/du_test_schema.yml +3 -3
  227. rasa/dialogue_understanding_test/io.py +35 -8
  228. rasa/e2e_test/constants.py +1 -1
  229. rasa/e2e_test/e2e_test_runner.py +1 -1
  230. rasa/e2e_test/e2e_test_schema.yml +3 -3
  231. rasa/engine/constants.py +1 -1
  232. rasa/engine/graph.py +2 -2
  233. rasa/engine/recipes/default_recipe.py +1 -1
  234. rasa/engine/validation.py +3 -2
  235. rasa/hooks.py +2 -30
  236. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +2 -6
  237. rasa/model_manager/model_api.py +89 -1
  238. rasa/model_manager/runner_service.py +20 -4
  239. rasa/model_manager/socket_bridge.py +0 -7
  240. rasa/model_manager/trainer_service.py +10 -4
  241. rasa/plugin.py +2 -15
  242. rasa/privacy/__init__.py +0 -0
  243. rasa/privacy/constants.py +83 -0
  244. rasa/privacy/event_broker_utils.py +77 -0
  245. rasa/privacy/privacy_config.py +281 -0
  246. rasa/privacy/privacy_config_schema.json +86 -0
  247. rasa/privacy/privacy_filter.py +393 -0
  248. rasa/privacy/privacy_manager.py +594 -0
  249. rasa/server.py +23 -2
  250. rasa/shared/constants.py +17 -0
  251. rasa/shared/core/command_payload_reader.py +1 -5
  252. rasa/shared/core/constants.py +4 -3
  253. rasa/shared/core/domain.py +172 -11
  254. rasa/shared/core/events.py +100 -6
  255. rasa/shared/core/flows/flow.py +30 -5
  256. rasa/shared/core/flows/flow_step.py +19 -3
  257. rasa/shared/core/flows/flow_step_links.py +15 -0
  258. rasa/shared/core/flows/flow_step_sequence.py +6 -0
  259. rasa/shared/core/flows/flows_yaml_schema.json +3 -0
  260. rasa/shared/core/flows/nlu_trigger.py +13 -0
  261. rasa/shared/core/flows/steps/action.py +7 -4
  262. rasa/shared/core/flows/steps/call.py +11 -4
  263. rasa/shared/core/flows/steps/collect.py +71 -6
  264. rasa/shared/core/flows/steps/internal.py +6 -1
  265. rasa/shared/core/flows/steps/link.py +7 -4
  266. rasa/shared/core/flows/steps/no_operation.py +7 -4
  267. rasa/shared/core/flows/steps/set_slots.py +8 -4
  268. rasa/shared/core/flows/validation.py +25 -5
  269. rasa/shared/core/flows/yaml_flows_io.py +106 -5
  270. rasa/shared/core/slots.py +29 -1
  271. rasa/shared/core/trackers.py +21 -10
  272. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +1 -4
  273. rasa/shared/importers/importer.py +8 -0
  274. rasa/shared/providers/_configs/azure_openai_client_config.py +2 -2
  275. rasa/shared/providers/_configs/default_litellm_client_config.py +1 -1
  276. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -1
  277. rasa/shared/providers/_configs/openai_client_config.py +1 -1
  278. rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -1
  279. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -1
  280. rasa/shared/providers/_configs/utils.py +0 -99
  281. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -2
  282. rasa/shared/utils/common.py +43 -1
  283. rasa/shared/utils/configs.py +110 -0
  284. rasa/shared/utils/constants.py +0 -3
  285. rasa/shared/utils/llm.py +245 -8
  286. rasa/shared/utils/pykwalify_extensions.py +0 -9
  287. rasa/shared/utils/yaml.py +32 -0
  288. rasa/studio/constants.py +1 -0
  289. rasa/studio/data_handler.py +33 -12
  290. rasa/studio/download.py +117 -435
  291. rasa/studio/link.py +211 -0
  292. rasa/studio/prompts.py +221 -0
  293. rasa/studio/pull/__init__.py +0 -0
  294. rasa/studio/pull/data.py +222 -0
  295. rasa/studio/pull/domains.py +60 -0
  296. rasa/studio/pull/pull.py +239 -0
  297. rasa/studio/push.py +138 -0
  298. rasa/studio/results_logger.py +6 -1
  299. rasa/studio/train.py +1 -1
  300. rasa/studio/upload.py +243 -72
  301. rasa/studio/utils.py +33 -0
  302. rasa/telemetry.py +83 -26
  303. rasa/tracing/config.py +4 -5
  304. rasa/tracing/constants.py +19 -1
  305. rasa/tracing/instrumentation/attribute_extractors.py +68 -16
  306. rasa/tracing/instrumentation/instrumentation.py +54 -3
  307. rasa/tracing/instrumentation/metrics.py +98 -15
  308. rasa/tracing/metric_instrument_provider.py +75 -3
  309. rasa/utils/common.py +43 -22
  310. rasa/utils/endpoints.py +22 -1
  311. rasa/utils/licensing.py +2 -3
  312. rasa/utils/log_utils.py +1 -45
  313. rasa/validator.py +2 -8
  314. rasa/version.py +1 -1
  315. {rasa_pro-3.12.22.dist-info → rasa_pro-3.13.0.dist-info}/METADATA +11 -12
  316. {rasa_pro-3.12.22.dist-info → rasa_pro-3.13.0.dist-info}/RECORD +333 -309
  317. rasa/anonymization/__init__.py +0 -2
  318. rasa/anonymization/anonymisation_rule_yaml_reader.py +0 -91
  319. rasa/anonymization/anonymization_pipeline.py +0 -286
  320. rasa/anonymization/anonymization_rule_executor.py +0 -266
  321. rasa/anonymization/anonymization_rule_orchestrator.py +0 -119
  322. rasa/anonymization/schemas/config.yml +0 -47
  323. rasa/anonymization/utils.py +0 -118
  324. rasa/cli/project_templates/calm/config.yml +0 -10
  325. rasa/cli/project_templates/calm/credentials.yml +0 -33
  326. rasa/cli/project_templates/calm/endpoints.yml +0 -58
  327. rasa/cli/project_templates/default/actions/actions.py +0 -27
  328. rasa/cli/project_templates/default/data/nlu.yml +0 -91
  329. rasa/cli/project_templates/default/data/rules.yml +0 -13
  330. rasa/cli/project_templates/default/data/stories.yml +0 -30
  331. rasa/cli/project_templates/default/domain.yml +0 -34
  332. rasa/cli/project_templates/default/tests/test_stories.yml +0 -91
  333. rasa/core/channels/inspector/dist/assets/channel-dfa68278.js +0 -1
  334. rasa/core/channels/inspector/dist/assets/clone-edb7f119.js +0 -1
  335. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-65e7c670.js +0 -1
  336. rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -191
  337. rasa/core/tracker_store.py +0 -1792
  338. /rasa/cli/project_templates/{calm → default}/actions/action_template.py +0 -0
  339. /rasa/cli/project_templates/{calm → default}/actions/add_contact.py +0 -0
  340. /rasa/cli/project_templates/{calm → default}/actions/db.py +0 -0
  341. /rasa/cli/project_templates/{calm → default}/actions/list_contacts.py +0 -0
  342. /rasa/cli/project_templates/{calm → default}/actions/remove_contact.py +0 -0
  343. /rasa/cli/project_templates/{calm → default}/data/flows/add_contact.yml +0 -0
  344. /rasa/cli/project_templates/{calm → default}/data/flows/list_contacts.yml +0 -0
  345. /rasa/cli/project_templates/{calm → default}/data/flows/remove_contact.yml +0 -0
  346. /rasa/cli/project_templates/{calm → default}/db/contacts.json +0 -0
  347. /rasa/cli/project_templates/{calm → default}/domain/add_contact.yml +0 -0
  348. /rasa/cli/project_templates/{calm → default}/domain/list_contacts.yml +0 -0
  349. /rasa/cli/project_templates/{calm → default}/domain/remove_contact.yml +0 -0
  350. /rasa/cli/project_templates/{calm → default}/domain/shared.yml +0 -0
  351. /rasa/{cli/project_templates/calm/actions → core/information_retrieval/ingestion}/__init__.py +0 -0
  352. {rasa_pro-3.12.22.dist-info → rasa_pro-3.13.0.dist-info}/NOTICE +0 -0
  353. {rasa_pro-3.12.22.dist-info → rasa_pro-3.13.0.dist-info}/WHEEL +0 -0
  354. {rasa_pro-3.12.22.dist-info → rasa_pro-3.13.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,78 @@
1
+ import argparse
2
+ from typing import List, Text
3
+
4
+ from rasa.cli import SubParsersAction
5
+ from rasa.cli.arguments.default_arguments import (
6
+ add_config_param,
7
+ add_data_param,
8
+ add_domain_param,
9
+ add_endpoint_param,
10
+ )
11
+ from rasa.shared.constants import (
12
+ DEFAULT_DOMAIN_PATH,
13
+ DEFAULT_ENDPOINTS_PATH,
14
+ )
15
+ from rasa.studio.push import (
16
+ handle_push,
17
+ handle_push_config,
18
+ handle_push_endpoints,
19
+ )
20
+
21
+
22
+ def add_subparser(
23
+ subparsers: SubParsersAction,
24
+ parents: List[argparse.ArgumentParser],
25
+ domain: Text = DEFAULT_DOMAIN_PATH,
26
+ ) -> None:
27
+ """Register the `rasa studio push` command and its sub-commands.
28
+
29
+ Args:
30
+ subparsers: The subparsers to add the command to.
31
+ parents: Parent parsers, needed to ensure tree structure in argparse
32
+ domain: Path to the assistant's domain file.
33
+ """
34
+ push_parser = subparsers.add_parser(
35
+ "push",
36
+ parents=parents,
37
+ conflict_handler="resolve",
38
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
39
+ help="Push assistant data to Rasa Studio.",
40
+ )
41
+ push_subparsers = push_parser.add_subparsers()
42
+
43
+ # Arguments for pushing configuration only
44
+ config_parser = push_subparsers.add_parser(
45
+ "config",
46
+ parents=parents,
47
+ conflict_handler="resolve",
48
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
49
+ help="Push only the assistant configuration file.",
50
+ )
51
+ add_config_param(config_parser)
52
+ config_parser.set_defaults(func=handle_push_config)
53
+
54
+ # Arguments for pushing endpoints only
55
+ endpoints_parser = push_subparsers.add_parser(
56
+ "endpoints",
57
+ parents=parents,
58
+ conflict_handler="resolve",
59
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
60
+ help="Push ONLY the endpoints configuration file.",
61
+ )
62
+ add_endpoint_param(
63
+ endpoints_parser,
64
+ "Configuration file for the model endpoints.",
65
+ default=DEFAULT_ENDPOINTS_PATH,
66
+ )
67
+ endpoints_parser.set_defaults(func=handle_push_endpoints)
68
+
69
+ # Arguments for pushing the whole assistant data
70
+ add_domain_param(push_parser, domain)
71
+ add_data_param(push_parser)
72
+ add_config_param(push_parser)
73
+ add_endpoint_param(
74
+ push_parser,
75
+ "Configuration file for the model endpoints.",
76
+ default=DEFAULT_ENDPOINTS_PATH,
77
+ )
78
+ push_parser.set_defaults(func=handle_push)
rasa/cli/studio/studio.py CHANGED
@@ -5,10 +5,15 @@ from urllib.parse import ParseResult, urlparse
5
5
  import questionary
6
6
 
7
7
  import rasa.cli.studio.download
8
+ import rasa.cli.studio.link
9
+ import rasa.cli.studio.pull
10
+ import rasa.cli.studio.push
8
11
  import rasa.cli.studio.train
9
12
  import rasa.cli.studio.upload
10
13
  import rasa.shared.utils.cli
11
14
  from rasa.cli import SubParsersAction
15
+ from rasa.cli.utils import get_validated_path
16
+ from rasa.shared.constants import DEFAULT_DOMAIN_PATH, DEFAULT_DOMAIN_PATHS
12
17
  from rasa.studio.auth import StudioAuth
13
18
  from rasa.studio.config import StudioConfig
14
19
 
@@ -33,6 +38,13 @@ def add_subparser(
33
38
  rasa.cli.studio.upload.add_subparser(studio_subparsers, parents)
34
39
  rasa.cli.studio.download.add_subparser(studio_subparsers, parents)
35
40
 
41
+ domain = get_validated_path(
42
+ DEFAULT_DOMAIN_PATH, "domain", DEFAULT_DOMAIN_PATHS, none_is_valid=True
43
+ )
44
+ rasa.cli.studio.link.add_subparser(studio_subparsers, parents, domain)
45
+ rasa.cli.studio.push.add_subparser(studio_subparsers, parents, domain)
46
+ rasa.cli.studio.pull.add_subparser(studio_subparsers, parents, domain)
47
+
36
48
  _add_config_subparser(studio_subparsers, parents)
37
49
  _add_login_subparser(studio_subparsers, parents)
38
50
 
rasa/cli/studio/train.py CHANGED
@@ -20,10 +20,7 @@ def add_subparser(
20
20
  parents=parents,
21
21
  conflict_handler="resolve",
22
22
  formatter_class=argparse.ArgumentDefaultsHelpFormatter,
23
- help=(
24
- "Trains a Rasa model using Rasa Studio "
25
- "data and your NLU data and stories."
26
- ),
23
+ help="Trains a Rasa model using Rasa Studio data.",
27
24
  )
28
25
 
29
26
  train_parser.set_defaults(func=handle_train)
@@ -36,7 +33,6 @@ def set_studio_train_arguments(parser: argparse.ArgumentParser) -> None:
36
33
  parser.add_argument(
37
34
  "assistant_name",
38
35
  default=None,
39
- nargs=1,
40
36
  type=str,
41
37
  help="Name of the assistant on Rasa Studio",
42
38
  )
rasa/cli/studio/upload.py CHANGED
@@ -25,7 +25,7 @@ def add_subparser(
25
25
  parents=parents,
26
26
  conflict_handler="resolve",
27
27
  formatter_class=argparse.ArgumentDefaultsHelpFormatter,
28
- help="Upload primitives to Rasa Studio. Only works with NLU assistants.",
28
+ help="Upload primitives to Rasa Studio.",
29
29
  )
30
30
 
31
31
  upload_parser.set_defaults(func=handle_upload)
@@ -56,7 +56,9 @@ def set_upload_arguments(parser: argparse.ArgumentParser) -> None:
56
56
  )
57
57
 
58
58
  parser.add_argument(
59
- "--calm",
60
- action="store_true",
61
- help="If set, creates a new CALM assistant in Rasa Studio.",
59
+ "assistant_name",
60
+ default=None,
61
+ nargs="?",
62
+ type=str,
63
+ help="Name of the assistant on Rasa Studio",
62
64
  )
rasa/cli/train.py CHANGED
@@ -11,7 +11,7 @@ import rasa.cli.utils
11
11
  import rasa.core.utils
12
12
  import rasa.utils.common
13
13
  from rasa.cli import SubParsersAction
14
- from rasa.core import ContextualResponseRephraser
14
+ from rasa.core.nlg.contextual_response_rephraser import ContextualResponseRephraser
15
15
  from rasa.core.nlg.generator import NaturalLanguageGenerator
16
16
  from rasa.core.train import do_compare_training
17
17
  from rasa.engine.validation import validate_api_type_config_key_usage
@@ -112,6 +112,10 @@ def run_training(args: argparse.Namespace, can_exit: bool = False) -> Optional[T
112
112
  )
113
113
  config = rasa.cli.utils.get_validated_config(args.config, CONFIG_MANDATORY_KEYS)
114
114
 
115
+ # Validates and loads endpoints with proper endpoint file location
116
+ # This will initialise the endpoints singleton properly so that
117
+ # it can be used safely throughout the codebase with
118
+ # `AvailableEndpoints.get_instance()`
115
119
  _check_nlg_endpoint_validity(args.endpoints)
116
120
 
117
121
  training_files = [
rasa/cli/utils.py CHANGED
@@ -104,7 +104,7 @@ def get_validated_path(
104
104
  parameter=parameter,
105
105
  event_info=(f"Parameter '{parameter}' was not set. {shared_info}"),
106
106
  )
107
- else:
107
+ elif current not in default_options:
108
108
  structlogger.warn(
109
109
  "cli.get_validated_path.path_does_not_exists",
110
110
  path=current,
rasa/cli/x.py CHANGED
@@ -15,7 +15,7 @@ import rasa.utils.common
15
15
  import rasa.utils.io
16
16
  from rasa.cli import SubParsersAction
17
17
  from rasa.cli.arguments import x as arguments
18
- from rasa.core.utils import AvailableEndpoints
18
+ from rasa.core.available_endpoints import AvailableEndpoints
19
19
  from rasa.shared.constants import (
20
20
  DEFAULT_CREDENTIALS_PATH,
21
21
  DEFAULT_ENDPOINTS_PATH,
rasa/constants.py CHANGED
@@ -44,3 +44,5 @@ HTTP_STATUS_FORBIDDEN = 403
44
44
  HTTP_STATUS_NOT_FOUND = 404
45
45
 
46
46
  RASA_REMOTE_STORAGE_ENV_VAR_NAME = "RASA_REMOTE_STORAGE"
47
+
48
+ RASA_DIR_NAME = ".rasa"
rasa/core/__init__.py CHANGED
@@ -1,16 +0,0 @@
1
- import logging
2
-
3
- import rasa
4
- from rasa.core.nlg.contextual_response_rephraser import ContextualResponseRephraser
5
- from rasa.core.policies.enterprise_search_policy import EnterpriseSearchPolicy
6
- from rasa.core.policies.intentless_policy import IntentlessPolicy
7
-
8
- logging.getLogger(__name__).addHandler(logging.NullHandler())
9
-
10
- __version__ = rasa.__version__
11
-
12
- __all__ = [
13
- "EnterpriseSearchPolicy",
14
- "IntentlessPolicy",
15
- "ContextualResponseRephraser",
16
- ]
@@ -23,9 +23,11 @@ from rasa.core.constants import (
23
23
  KEY_IS_COEXISTENCE_ASSISTANT,
24
24
  UTTER_SOURCE_METADATA_KEY,
25
25
  )
26
+ from rasa.core.nlg.translate import get_translated_buttons, get_translated_text
26
27
  from rasa.core.policies.policy import PolicyPrediction
27
28
  from rasa.core.utils import add_bot_utterance_metadata
28
29
  from rasa.e2e_test.constants import KEY_STUB_CUSTOM_ACTIONS
30
+ from rasa.engine.language import Language
29
31
  from rasa.nlu.constants import (
30
32
  RESPONSE_SELECTOR_DEFAULT_INTENT,
31
33
  RESPONSE_SELECTOR_PREDICTION_KEY,
@@ -82,6 +84,7 @@ from rasa.shared.core.events import (
82
84
  UserUttered,
83
85
  )
84
86
  from rasa.shared.core.flows import FlowsList
87
+ from rasa.shared.core.flows.constants import KEY_TRANSLATION
85
88
  from rasa.shared.core.slot_mappings import (
86
89
  SlotFillingManager,
87
90
  extract_slot_value,
@@ -248,25 +251,36 @@ def action_for_name_or_text(
248
251
  return RemoteAction(action_name_or_text, action_endpoint)
249
252
 
250
253
 
251
- def create_bot_utterance(message: Dict[Text, Any]) -> BotUttered:
252
- """Create BotUttered event from message."""
253
- bot_message = BotUttered(
254
- text=message.pop(TEXT, None),
255
- data={
256
- ELEMENTS: message.pop(ELEMENTS, None),
257
- QUICK_REPLIES: message.pop(QUICK_REPLIES, None),
258
- BUTTONS: message.pop(BUTTONS, None),
259
- # for legacy / compatibility reasons we need to set the image
260
- # to be the attachment if there is no other attachment (the
261
- # `.get` is intentional - no `pop` as we still need the image`
262
- # property to set it in the following line)
263
- ATTACHMENT: message.pop(ATTACHMENT, None) or message.get(IMAGE, None),
264
- IMAGE: message.pop(IMAGE, None),
265
- CUSTOM: message.pop(CUSTOM, None),
266
- },
267
- metadata=message,
254
+ def create_bot_utterance(
255
+ message: Dict[Text, Any], language: Optional[Language] = None
256
+ ) -> BotUttered:
257
+ """Create BotUttered event from message with translation support."""
258
+ message_copy = copy.deepcopy(message)
259
+
260
+ text = get_translated_text(
261
+ text=message_copy.pop(TEXT, None),
262
+ translation=message_copy.pop(KEY_TRANSLATION, {}),
263
+ language=language,
264
+ )
265
+
266
+ buttons = get_translated_buttons(
267
+ buttons=message_copy.pop(BUTTONS, None), language=language
268
268
  )
269
- return bot_message
269
+
270
+ data = {
271
+ ELEMENTS: message_copy.pop(ELEMENTS, None),
272
+ QUICK_REPLIES: message_copy.pop(QUICK_REPLIES, None),
273
+ BUTTONS: buttons,
274
+ # for legacy / compatibility reasons we need to set the image
275
+ # to be the attachment if there is no other attachment (the
276
+ # `.get` is intentional - no `pop` as we still need the image`
277
+ # property to set it in the following line)
278
+ ATTACHMENT: message_copy.pop(ATTACHMENT, None) or message_copy.get(IMAGE, None),
279
+ IMAGE: message_copy.pop(IMAGE, None),
280
+ CUSTOM: message_copy.pop(CUSTOM, None),
281
+ }
282
+
283
+ return BotUttered(text=text, data=data, metadata=message_copy)
270
284
 
271
285
 
272
286
  class Action:
@@ -379,7 +393,7 @@ class ActionBotResponse(Action):
379
393
  message = add_bot_utterance_metadata(
380
394
  message, self.utter_action, nlg, domain, tracker
381
395
  )
382
- return [create_bot_utterance(message)]
396
+ return [create_bot_utterance(message, tracker.current_language)]
383
397
 
384
398
  def name(self) -> Text:
385
399
  """Returns action name."""
@@ -413,7 +427,7 @@ class ActionEndToEndResponse(Action):
413
427
  ) -> List[Event]:
414
428
  """Runs action (see parent class for full docstring)."""
415
429
  message = {"text": self.action_text}
416
- return [create_bot_utterance(message)]
430
+ return [create_bot_utterance(message, tracker.current_language)]
417
431
 
418
432
  def event_for_successful_execution(
419
433
  self,
@@ -879,10 +893,7 @@ class RemoteAction(Action):
879
893
  generated_response = response.pop("response", None)
880
894
  if generated_response is not None:
881
895
  draft = await nlg.generate(
882
- generated_response,
883
- tracker,
884
- output_channel.name(),
885
- **response,
896
+ generated_response, tracker, output_channel.name(), **response
886
897
  )
887
898
  if not draft:
888
899
  continue
@@ -898,9 +909,9 @@ class RemoteAction(Action):
898
909
  draft["buttons"].extend(buttons)
899
910
 
900
911
  # Avoid overwriting `draft` values with empty values
901
- response = {k: v for k, v in response.items() if v is not None}
912
+ response = {k: v for k, v in response.items() if v}
902
913
  draft.update(response)
903
- bot_messages.append(create_bot_utterance(draft))
914
+ bot_messages.append(create_bot_utterance(draft, tracker.current_language))
904
915
 
905
916
  return bot_messages
906
917
 
@@ -1057,7 +1068,6 @@ def _revert_rephrasing_events() -> List[Event]:
1057
1068
  ]
1058
1069
 
1059
1070
 
1060
- # TODO: this should be removed, e.g. it uses a hardcoded message and no translation
1061
1071
  class ActionDefaultAskAffirmation(Action):
1062
1072
  """Default implementation which asks the user to affirm his intent.
1063
1073
 
@@ -1109,7 +1119,7 @@ class ActionDefaultAskAffirmation(Action):
1109
1119
  "utter_action": self.name(),
1110
1120
  }
1111
1121
 
1112
- return [create_bot_utterance(message)]
1122
+ return [create_bot_utterance(message, tracker.current_language)]
1113
1123
 
1114
1124
 
1115
1125
  class ActionDefaultAskRephrase(ActionBotResponse):
@@ -1142,7 +1152,11 @@ class ActionSendText(Action):
1142
1152
  fallback = {"text": ""}
1143
1153
  metadata_copy = copy.deepcopy(metadata) if metadata else {}
1144
1154
  message = metadata_copy.get("message", fallback)
1145
- return [create_bot_utterance(message)]
1155
+
1156
+ should_send_text = metadata_copy.get("should_send_text", True)
1157
+ if should_send_text:
1158
+ return [create_bot_utterance(message, tracker.current_language)]
1159
+ return []
1146
1160
 
1147
1161
 
1148
1162
  class ActionExtractSlots(Action):
@@ -25,7 +25,7 @@ class ActionRepeatBotMessages(Action):
25
25
  """Return the name of the action."""
26
26
  return ACTION_REPEAT_BOT_MESSAGES
27
27
 
28
- def _get_last_bot_events(self, tracker: DialogueStateTracker) -> List[Event]:
28
+ def _get_last_bot_events(self, tracker: DialogueStateTracker) -> List[BotUttered]:
29
29
  """Get the last consecutive bot events before the most recent user message.
30
30
 
31
31
  This function scans the dialogue history in reverse to find the last sequence of
@@ -48,33 +48,21 @@ class ActionRepeatBotMessages(Action):
48
48
  The elif condition doesn't break when it sees User3 event.
49
49
  But it does at User2 event.
50
50
  """
51
- # Skip action if we are in a collect information step whose
52
- # default behavior is to repeat anyways
53
- top_frame = tracker.stack.top(
54
- lambda frame: isinstance(frame, RepeatBotMessagesPatternFlowStackFrame)
55
- or isinstance(frame, UserSilencePatternFlowStackFrame)
56
- )
57
- if isinstance(top_frame, CollectInformationPatternFlowStackFrame):
58
- return []
59
51
  # filter user and bot events
60
- filtered = [
52
+ user_and_bot_events = [
61
53
  e for e in tracker.events if isinstance(e, (BotUttered, UserUttered))
62
54
  ]
63
- bot_events: List[Event] = []
55
+ last_bot_events: List[BotUttered] = []
64
56
 
65
57
  # find the last BotUttered events
66
- for e in reversed(filtered):
67
- if isinstance(e, BotUttered):
68
- # insert instead of append because the list is reversed
69
- bot_events.insert(0, e)
70
-
71
- # stop if a UserUttered event is found
72
- # only if we have collected some bot events already
73
- # this condition skips the first N UserUttered events
74
- elif bot_events:
58
+ for e in reversed(user_and_bot_events):
59
+ # stop when seeing a user event after having seen bot events already
60
+ if isinstance(e, UserUttered) and len(last_bot_events) > 0:
75
61
  break
62
+ elif isinstance(e, BotUttered):
63
+ last_bot_events.append(e)
76
64
 
77
- return bot_events
65
+ return list(reversed(last_bot_events))
78
66
 
79
67
  async def run(
80
68
  self,
@@ -85,5 +73,13 @@ class ActionRepeatBotMessages(Action):
85
73
  metadata: Optional[Dict[str, Any]] = None,
86
74
  ) -> List[Event]:
87
75
  """Send the last bot messages to the channel again"""
88
- bot_events = self._get_last_bot_events(tracker)
76
+ top_frame = tracker.stack.top(
77
+ lambda frame: isinstance(frame, RepeatBotMessagesPatternFlowStackFrame)
78
+ or isinstance(frame, UserSilencePatternFlowStackFrame)
79
+ )
80
+
81
+ bot_events: List[Event] = list(self._get_last_bot_events(tracker))
82
+ # drop the last bot event in a collect step as that part will be repeated anyway
83
+ if isinstance(top_frame, CollectInformationPatternFlowStackFrame):
84
+ bot_events = bot_events[:-1]
89
85
  return bot_events
@@ -105,7 +105,6 @@ def run_rejections(
105
105
  structlogger.error(
106
106
  "run.predicate.error",
107
107
  predicate=condition,
108
- document=document,
109
108
  error=str(e),
110
109
  )
111
110
  violation = True
@@ -217,6 +216,6 @@ class ActionRunSlotRejections(Action):
217
216
  message = add_bot_utterance_metadata(
218
217
  message, utterance, nlg, domain, tracker
219
218
  )
220
- events.append(create_bot_utterance(message))
219
+ events.append(create_bot_utterance(message, tracker.current_language))
221
220
 
222
221
  return events
rasa/core/agent.py CHANGED
@@ -13,6 +13,7 @@ from aiohttp import ClientError
13
13
 
14
14
  import rasa.shared.utils.io
15
15
  from rasa.core import jobs
16
+ from rasa.core.available_endpoints import AvailableEndpoints
16
17
  from rasa.core.channels.channel import OutputChannel, UserMessage
17
18
  from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
18
19
  from rasa.core.exceptions import AgentNotReady
@@ -22,18 +23,19 @@ from rasa.core.nlg import NaturalLanguageGenerator, TemplatedNaturalLanguageGene
22
23
  from rasa.core.persistor import StorageType
23
24
  from rasa.core.policies.policy import PolicyPrediction
24
25
  from rasa.core.processor import MessageProcessor
25
- from rasa.core.tracker_store import (
26
+ from rasa.core.tracker_stores.tracker_store import (
26
27
  FailSafeTrackerStore,
27
28
  InMemoryTrackerStore,
28
29
  TrackerStore,
29
30
  )
30
- from rasa.core.utils import AvailableEndpoints
31
31
  from rasa.exceptions import ModelNotFound
32
32
  from rasa.nlu.utils import is_url
33
+ from rasa.privacy.privacy_manager import BackgroundPrivacyManager
33
34
  from rasa.shared.constants import DEFAULT_SENDER_ID
34
35
  from rasa.shared.core.domain import Domain
35
36
  from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
36
37
  from rasa.shared.exceptions import RasaException
38
+ from rasa.telemetry import track_privacy_enabled
37
39
  from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
38
40
  from rasa.utils.endpoints import EndpointConfig
39
41
 
@@ -215,13 +217,14 @@ async def load_agent(
215
217
  The instantiated `Agent` or `None`.
216
218
  """
217
219
  from rasa.core.brokers.broker import EventBroker
218
- from rasa.core.tracker_store import TrackerStore
220
+ from rasa.core.tracker_stores.tracker_store import TrackerStore
219
221
 
220
222
  tracker_store = None
221
223
  lock_store = None
222
224
  generator = None
223
225
  action_endpoint = None
224
226
  http_interpreter = None
227
+ privacy_manager = None
225
228
 
226
229
  if endpoints:
227
230
  broker = await EventBroker.create(endpoints.event_broker, loop=loop)
@@ -234,6 +237,18 @@ async def load_agent(
234
237
  model_server = endpoints.model if endpoints.model else model_server
235
238
  if endpoints.nlu:
236
239
  http_interpreter = RasaNLUHttpInterpreter(endpoints.nlu)
240
+ if endpoints.privacy:
241
+ in_memory_tracker_store = (
242
+ tracker_store
243
+ if isinstance(tracker_store, InMemoryTrackerStore)
244
+ else None
245
+ )
246
+ privacy_manager = await BackgroundPrivacyManager.create_instance(
247
+ endpoints=endpoints,
248
+ event_loop=loop,
249
+ in_memory_tracker_store=in_memory_tracker_store,
250
+ )
251
+ track_privacy_enabled(privacy_manager.config, broker)
237
252
 
238
253
  agent = Agent(
239
254
  generator=generator,
@@ -244,6 +259,7 @@ async def load_agent(
244
259
  remote_storage=remote_storage,
245
260
  http_interpreter=http_interpreter,
246
261
  endpoints=endpoints,
262
+ privacy_manager=privacy_manager,
247
263
  )
248
264
 
249
265
  try:
@@ -306,6 +322,7 @@ class Agent:
306
322
  remote_storage: Optional[StorageType] = None,
307
323
  http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
308
324
  endpoints: Optional[AvailableEndpoints] = None,
325
+ privacy_manager: Optional[BackgroundPrivacyManager] = None,
309
326
  ):
310
327
  """Initializes an `Agent`."""
311
328
  self.domain = domain
@@ -321,6 +338,7 @@ class Agent:
321
338
  self._set_fingerprint(fingerprint)
322
339
  self.model_server = model_server
323
340
  self.remote_storage = remote_storage
341
+ self.privacy_manager = privacy_manager
324
342
 
325
343
  @classmethod
326
344
  def load(
@@ -336,6 +354,7 @@ class Agent:
336
354
  remote_storage: Optional[StorageType] = None,
337
355
  http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
338
356
  endpoints: Optional[AvailableEndpoints] = None,
357
+ privacy_manager: Optional[BackgroundPrivacyManager] = None,
339
358
  ) -> Agent:
340
359
  """Constructs a new agent and loads the processor and model."""
341
360
  agent = Agent(
@@ -349,6 +368,7 @@ class Agent:
349
368
  remote_storage=remote_storage,
350
369
  http_interpreter=http_interpreter,
351
370
  endpoints=endpoints,
371
+ privacy_manager=privacy_manager,
352
372
  )
353
373
  agent.load_model(model_path=model_path, fingerprint=fingerprint)
354
374
  return agent
@@ -365,6 +385,7 @@ class Agent:
365
385
  generator=self.nlg,
366
386
  http_interpreter=self.http_interpreter,
367
387
  endpoints=self.endpoints,
388
+ privacy_manager=self.privacy_manager,
368
389
  )
369
390
  self.domain = self.processor.domain
370
391