rasa-pro 3.12.18.dev1__py3-none-any.whl → 3.13.0a1.dev2__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 (341) hide show
  1. rasa/__init__.py +0 -6
  2. rasa/__main__.py +3 -4
  3. rasa/api.py +1 -1
  4. rasa/builder/create_openai_vector_store.py +69 -0
  5. rasa/builder/llm-helper-schema.json +69 -0
  6. rasa/builder/prompt_to_bot.py +650 -0
  7. rasa/builder/scrape_rasa_docs.py +97 -0
  8. rasa/builder/skill_to_bot_prompt.jinja +158 -0
  9. rasa/cli/dialogue_understanding_test.py +1 -1
  10. rasa/cli/e2e_test.py +1 -1
  11. rasa/cli/evaluate.py +2 -2
  12. rasa/cli/export.py +3 -3
  13. rasa/cli/llm_fine_tuning.py +1 -1
  14. rasa/cli/project_templates/default/config.yml +5 -32
  15. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_cancels_during_a_correction.yml +1 -1
  16. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +1 -1
  17. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_handle.yml +1 -1
  18. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_name.yml +1 -1
  19. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +1 -1
  20. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_lists_contacts.yml +1 -1
  21. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact.yml +1 -1
  22. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact_from_list.yml +1 -1
  23. rasa/cli/project_templates/default/endpoints.yml +18 -2
  24. rasa/cli/project_templates/defaults.py +133 -0
  25. rasa/cli/run.py +1 -1
  26. rasa/cli/scaffold.py +2 -3
  27. rasa/cli/studio/download.py +1 -1
  28. rasa/cli/studio/link.py +53 -0
  29. rasa/cli/studio/pull.py +78 -0
  30. rasa/cli/studio/push.py +78 -0
  31. rasa/cli/studio/studio.py +12 -0
  32. rasa/cli/studio/upload.py +5 -3
  33. rasa/cli/train.py +1 -1
  34. rasa/cli/utils.py +1 -1
  35. rasa/cli/x.py +1 -1
  36. rasa/constants.py +2 -0
  37. rasa/core/__init__.py +0 -16
  38. rasa/core/actions/action.py +42 -31
  39. rasa/core/actions/action_repeat_bot_messages.py +18 -22
  40. rasa/core/actions/action_run_slot_rejections.py +1 -2
  41. rasa/core/agent.py +18 -3
  42. rasa/core/available_endpoints.py +146 -0
  43. rasa/core/brokers/kafka.py +4 -0
  44. rasa/core/brokers/pika.py +5 -2
  45. rasa/core/brokers/sql.py +1 -1
  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-02053cc1.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7f34db23.js → blockDiagram-38ab4fdb-008b6289.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-948bab2c.js → c4Diagram-3d4e48cf-fb2597be.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/channel-078dada8.js +1 -0
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-53b0dd0e.js → classDiagram-70f12bd4-7f847e00.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-fdf789e7.js → classDiagram-v2-f2320105-ba1d689b.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/clone-5b4516de.js +1 -0
  61. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-87c4ece5.js → createText-2e5e7dd3-dd8e67c4.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-5a8b0749.js → edges-e0da2a9e-10784939.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-66da90e2.js → erDiagram-9861fffd-24947ae6.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-10044f05.js → flowDb-956e92f1-a9ced505.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f338f66a.js → flowDiagram-66a62f08-afda9c7c.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-f9613071.js +1 -0
  67. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b13140aa.js → flowchart-elk-definition-4a651766-6ef530b8.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-f2b4a55a.js → ganttDiagram-c361ad54-0c7dd39a.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-dedc298d.js → gitGraphDiagram-72cf32ee-b57239d6.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{graph-4ede11ff.js → graph-9ed57cec.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{index-3862675e-65549d37.js → index-3862675e-233090de.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{index-3a23e736.js → index-72184470.js} +123 -123
  73. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-65439671.js → infoDiagram-f8f76790-aa116649.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-56d03d98.js → journeyDiagram-49397b02-e51877cc.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{layout-dd48f7f4.js → layout-3ca3798c.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{line-1569ad2c.js → line-26ee10d3.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{linear-48bf4935.js → linear-aedded32.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-688504c1.js → mindmap-definition-fc14e90a-d8957261.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78b6d7e6.js → pieDiagram-8a3498a8-d771f885.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-048b84b3.js → quadrantDiagram-120e2f19-09fdf50c.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dd67f107.js → requirementDiagram-deff3bca-9f0af02e.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-8128436e.js → sankeyDiagram-04a897e0-84415b37.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-1a0d1461.js → sequenceDiagram-704730f1-8dec4055.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-46d388ed.js → stateDiagram-587899a1-c5431d07.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-ea42951a.js → stateDiagram-v2-d93cdb3a-274e77d9.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-7427ed0c.js → styles-6aaf32cf-e364a1d7.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-ff5e5a16.js → styles-9a916d00-0dae36f6.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-7b3680cf.js → styles-c10674c1-c4641675.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f860f2ad.js → svgDrawCommon-08f97a94-831fe9a1.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-2eebf0c8.js → timeline-definition-85554ec2-c3304b3a.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5d7f4e96.js → xychartDiagram-e933f94c-da799369.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 +337 -71
  141. rasa/core/channels/vier_cvg.py +1 -2
  142. rasa/core/channels/voice_ready/audiocodes.py +4 -11
  143. rasa/core/channels/voice_stream/audiocodes.py +8 -5
  144. rasa/core/channels/voice_stream/browser_audio.py +1 -1
  145. rasa/core/channels/voice_stream/genesys.py +2 -2
  146. rasa/core/channels/voice_stream/tts/__init__.py +8 -0
  147. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -5
  148. rasa/core/channels/voice_stream/voice_channel.py +65 -23
  149. rasa/core/concurrent_lock_store.py +24 -10
  150. rasa/core/evaluation/marker_tracker_loader.py +1 -1
  151. rasa/core/exporter.py +1 -1
  152. rasa/core/http_interpreter.py +3 -7
  153. rasa/core/information_retrieval/faiss.py +18 -11
  154. rasa/core/information_retrieval/ingestion/__init__.py +0 -0
  155. rasa/core/information_retrieval/ingestion/faq_parser.py +158 -0
  156. rasa/core/jobs.py +2 -1
  157. rasa/core/lock_store.py +151 -60
  158. rasa/core/nlg/contextual_response_rephraser.py +17 -7
  159. rasa/core/nlg/generator.py +5 -22
  160. rasa/core/nlg/interpolator.py +2 -3
  161. rasa/core/nlg/response.py +6 -43
  162. rasa/core/nlg/summarize.py +1 -1
  163. rasa/core/nlg/translate.py +0 -8
  164. rasa/core/policies/enterprise_search_policy.py +262 -62
  165. rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_template.jinja2 +63 -0
  166. rasa/core/policies/flow_policy.py +1 -1
  167. rasa/core/policies/flows/flow_executor.py +96 -17
  168. rasa/core/policies/intentless_policy.py +57 -20
  169. rasa/core/processor.py +114 -54
  170. rasa/core/run.py +33 -11
  171. rasa/core/tracker_stores/__init__.py +0 -0
  172. rasa/core/{auth_retry_tracker_store.py → tracker_stores/auth_retry_tracker_store.py} +5 -1
  173. rasa/core/tracker_stores/dynamo_tracker_store.py +218 -0
  174. rasa/core/tracker_stores/mongo_tracker_store.py +206 -0
  175. rasa/core/tracker_stores/redis_tracker_store.py +219 -0
  176. rasa/core/tracker_stores/sql_tracker_store.py +555 -0
  177. rasa/core/tracker_stores/tracker_store.py +805 -0
  178. rasa/core/training/interactive.py +1 -1
  179. rasa/core/utils.py +24 -95
  180. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -1
  181. rasa/dialogue_understanding/coexistence/llm_based_router.py +10 -6
  182. rasa/dialogue_understanding/commands/can_not_handle_command.py +2 -0
  183. rasa/dialogue_understanding/commands/cancel_flow_command.py +5 -1
  184. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +2 -0
  185. rasa/dialogue_understanding/commands/clarify_command.py +4 -0
  186. rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -0
  187. rasa/dialogue_understanding/commands/correct_slots_command.py +1 -3
  188. rasa/dialogue_understanding/commands/human_handoff_command.py +2 -0
  189. rasa/dialogue_understanding/commands/knowledge_answer_command.py +2 -0
  190. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +2 -0
  191. rasa/dialogue_understanding/commands/set_slot_command.py +10 -0
  192. rasa/dialogue_understanding/commands/skip_question_command.py +2 -0
  193. rasa/dialogue_understanding/commands/start_flow_command.py +4 -0
  194. rasa/dialogue_understanding/commands/utils.py +26 -2
  195. rasa/dialogue_understanding/generator/__init__.py +7 -1
  196. rasa/dialogue_understanding/generator/command_generator.py +4 -2
  197. rasa/dialogue_understanding/generator/command_parser.py +2 -2
  198. rasa/dialogue_understanding/generator/command_parser_validator.py +63 -0
  199. rasa/dialogue_understanding/generator/llm_based_command_generator.py +5 -17
  200. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -3
  201. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +4 -44
  202. rasa/dialogue_understanding/generator/nlu_command_adapter.py +2 -2
  203. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +78 -0
  204. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +26 -474
  205. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +147 -0
  206. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +477 -0
  207. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +11 -64
  208. rasa/dialogue_understanding/patterns/cancel.py +1 -2
  209. rasa/dialogue_understanding/patterns/clarify.py +1 -1
  210. rasa/dialogue_understanding/patterns/correction.py +2 -2
  211. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +37 -25
  212. rasa/dialogue_understanding/patterns/domain_for_patterns.py +190 -0
  213. rasa/dialogue_understanding/processor/command_processor.py +6 -7
  214. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +17 -4
  215. rasa/dialogue_understanding/stack/utils.py +3 -1
  216. rasa/dialogue_understanding/utils.py +68 -12
  217. rasa/dialogue_understanding_test/command_metric_calculation.py +7 -40
  218. rasa/dialogue_understanding_test/command_metrics.py +38 -0
  219. rasa/dialogue_understanding_test/du_test_case.py +58 -25
  220. rasa/dialogue_understanding_test/du_test_result.py +228 -132
  221. rasa/dialogue_understanding_test/du_test_runner.py +11 -2
  222. rasa/dialogue_understanding_test/io.py +35 -8
  223. rasa/e2e_test/e2e_test_runner.py +1 -1
  224. rasa/engine/constants.py +1 -1
  225. rasa/engine/graph.py +2 -2
  226. rasa/engine/recipes/default_recipe.py +1 -1
  227. rasa/engine/validation.py +3 -2
  228. rasa/hooks.py +2 -85
  229. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +1 -5
  230. rasa/llm_fine_tuning/utils.py +2 -4
  231. rasa/model_manager/model_api.py +90 -2
  232. rasa/model_manager/socket_bridge.py +0 -7
  233. rasa/model_manager/trainer_service.py +15 -12
  234. rasa/plugin.py +2 -15
  235. rasa/privacy/__init__.py +0 -0
  236. rasa/privacy/constants.py +83 -0
  237. rasa/privacy/event_broker_utils.py +77 -0
  238. rasa/privacy/privacy_config.py +281 -0
  239. rasa/privacy/privacy_config_schema.json +86 -0
  240. rasa/privacy/privacy_filter.py +340 -0
  241. rasa/privacy/privacy_manager.py +576 -0
  242. rasa/server.py +23 -2
  243. rasa/shared/constants.py +13 -4
  244. rasa/shared/core/command_payload_reader.py +1 -5
  245. rasa/shared/core/constants.py +4 -3
  246. rasa/shared/core/domain.py +172 -11
  247. rasa/shared/core/events.py +100 -6
  248. rasa/shared/core/flows/flow.py +35 -8
  249. rasa/shared/core/flows/flow_step.py +26 -4
  250. rasa/shared/core/flows/flow_step_links.py +15 -0
  251. rasa/shared/core/flows/flow_step_sequence.py +6 -0
  252. rasa/shared/core/flows/flows_yaml_schema.json +3 -0
  253. rasa/shared/core/flows/nlu_trigger.py +13 -0
  254. rasa/shared/core/flows/steps/action.py +7 -4
  255. rasa/shared/core/flows/steps/call.py +11 -4
  256. rasa/shared/core/flows/steps/collect.py +71 -6
  257. rasa/shared/core/flows/steps/internal.py +6 -1
  258. rasa/shared/core/flows/steps/link.py +7 -4
  259. rasa/shared/core/flows/steps/no_operation.py +7 -4
  260. rasa/shared/core/flows/steps/set_slots.py +8 -4
  261. rasa/shared/core/flows/validation.py +16 -3
  262. rasa/shared/core/flows/yaml_flows_io.py +106 -5
  263. rasa/shared/core/slots.py +33 -1
  264. rasa/shared/core/trackers.py +4 -10
  265. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +1 -4
  266. rasa/shared/importers/importer.py +14 -0
  267. rasa/shared/importers/static.py +63 -0
  268. rasa/shared/providers/constants.py +0 -9
  269. rasa/shared/providers/llm/_base_litellm_client.py +4 -14
  270. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -2
  271. rasa/shared/providers/llm/litellm_router_llm_client.py +7 -17
  272. rasa/shared/providers/llm/llm_client.py +15 -24
  273. rasa/shared/providers/llm/self_hosted_llm_client.py +2 -10
  274. rasa/shared/utils/common.py +43 -1
  275. rasa/shared/utils/llm.py +155 -3
  276. rasa/shared/utils/yaml.py +32 -0
  277. rasa/studio/data_handler.py +3 -3
  278. rasa/studio/download/__init__.py +0 -0
  279. rasa/studio/download/domains.py +49 -0
  280. rasa/studio/download/download.py +416 -0
  281. rasa/studio/download/flows.py +351 -0
  282. rasa/studio/link.py +200 -0
  283. rasa/studio/pull.py +94 -0
  284. rasa/studio/push.py +131 -0
  285. rasa/studio/results_logger.py +6 -1
  286. rasa/studio/upload.py +185 -71
  287. rasa/telemetry.py +83 -26
  288. rasa/tracing/config.py +4 -5
  289. rasa/tracing/constants.py +19 -1
  290. rasa/tracing/instrumentation/attribute_extractors.py +49 -11
  291. rasa/tracing/instrumentation/instrumentation.py +54 -3
  292. rasa/tracing/instrumentation/metrics.py +98 -15
  293. rasa/tracing/metric_instrument_provider.py +75 -3
  294. rasa/utils/common.py +37 -27
  295. rasa/utils/endpoints.py +22 -1
  296. rasa/utils/licensing.py +2 -3
  297. rasa/utils/log_utils.py +1 -45
  298. rasa/validator.py +9 -11
  299. rasa/version.py +1 -1
  300. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev2.dist-info}/METADATA +12 -14
  301. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev2.dist-info}/RECORD +318 -294
  302. rasa/anonymization/__init__.py +0 -2
  303. rasa/anonymization/anonymisation_rule_yaml_reader.py +0 -91
  304. rasa/anonymization/anonymization_pipeline.py +0 -286
  305. rasa/anonymization/anonymization_rule_executor.py +0 -266
  306. rasa/anonymization/anonymization_rule_orchestrator.py +0 -119
  307. rasa/anonymization/schemas/config.yml +0 -47
  308. rasa/anonymization/utils.py +0 -118
  309. rasa/cli/project_templates/calm/config.yml +0 -10
  310. rasa/cli/project_templates/calm/credentials.yml +0 -33
  311. rasa/cli/project_templates/calm/endpoints.yml +0 -58
  312. rasa/cli/project_templates/default/actions/actions.py +0 -27
  313. rasa/cli/project_templates/default/data/nlu.yml +0 -91
  314. rasa/cli/project_templates/default/data/rules.yml +0 -13
  315. rasa/cli/project_templates/default/data/stories.yml +0 -30
  316. rasa/cli/project_templates/default/domain.yml +0 -34
  317. rasa/cli/project_templates/default/tests/test_stories.yml +0 -91
  318. rasa/core/channels/inspector/dist/assets/channel-dfa68278.js +0 -1
  319. rasa/core/channels/inspector/dist/assets/clone-edb7f119.js +0 -1
  320. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-65e7c670.js +0 -1
  321. rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -191
  322. rasa/core/tracker_store.py +0 -1792
  323. rasa/monkey_patches.py +0 -91
  324. rasa/studio/download.py +0 -489
  325. /rasa/{cli/project_templates/calm/actions → builder}/__init__.py +0 -0
  326. /rasa/cli/project_templates/{calm → default}/actions/action_template.py +0 -0
  327. /rasa/cli/project_templates/{calm → default}/actions/add_contact.py +0 -0
  328. /rasa/cli/project_templates/{calm → default}/actions/db.py +0 -0
  329. /rasa/cli/project_templates/{calm → default}/actions/list_contacts.py +0 -0
  330. /rasa/cli/project_templates/{calm → default}/actions/remove_contact.py +0 -0
  331. /rasa/cli/project_templates/{calm → default}/data/flows/add_contact.yml +0 -0
  332. /rasa/cli/project_templates/{calm → default}/data/flows/list_contacts.yml +0 -0
  333. /rasa/cli/project_templates/{calm → default}/data/flows/remove_contact.yml +0 -0
  334. /rasa/cli/project_templates/{calm → default}/db/contacts.json +0 -0
  335. /rasa/cli/project_templates/{calm → default}/domain/add_contact.yml +0 -0
  336. /rasa/cli/project_templates/{calm → default}/domain/list_contacts.yml +0 -0
  337. /rasa/cli/project_templates/{calm → default}/domain/remove_contact.yml +0 -0
  338. /rasa/cli/project_templates/{calm → default}/domain/shared.yml +0 -0
  339. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev2.dist-info}/NOTICE +0 -0
  340. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev2.dist-info}/WHEEL +0 -0
  341. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev2.dist-info}/entry_points.txt +0 -0
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)
@@ -0,0 +1,218 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from typing import TYPE_CHECKING, Any, Dict, Iterable, Optional, Text
5
+
6
+ import structlog
7
+ from boto3.dynamodb.conditions import Key
8
+
9
+ import rasa.utils
10
+ from rasa.constants import DEFAULT_SANIC_WORKERS, ENV_SANIC_WORKERS
11
+ from rasa.core.tracker_stores.tracker_store import (
12
+ SerializedTrackerAsDict,
13
+ TrackerStore,
14
+ )
15
+ from rasa.shared.core.domain import Domain
16
+ from rasa.shared.core.trackers import DialogueStateTracker
17
+ from rasa.shared.exceptions import RasaException
18
+ from rasa.utils.endpoints import EndpointConfig
19
+
20
+ structlogger = structlog.get_logger(__name__)
21
+
22
+ if TYPE_CHECKING:
23
+ import boto3.resources.factory.dynamodb.Table
24
+
25
+
26
+ class DynamoTrackerStore(TrackerStore, SerializedTrackerAsDict):
27
+ """Stores conversation history in DynamoDB."""
28
+
29
+ def __init__(
30
+ self,
31
+ domain: Domain,
32
+ table_name: Text = "states",
33
+ region: Text = "us-east-1",
34
+ event_broker: Optional[EndpointConfig] = None,
35
+ **kwargs: Dict[Text, Any],
36
+ ) -> None:
37
+ """Initialize `DynamoTrackerStore`.
38
+
39
+ Args:
40
+ domain: Domain associated with this tracker store.
41
+ table_name: The name of the DynamoDB table, does not need to be present a
42
+ priori.
43
+ region: The name of the region associated with the client.
44
+ A client is associated with a single region.
45
+ event_broker: An event broker used to publish events.
46
+ kwargs: Additional kwargs.
47
+ """
48
+ import boto3
49
+
50
+ self.client = boto3.client("dynamodb", region_name=region)
51
+ self.region = region
52
+ self.table_name = table_name
53
+ self.db = self.get_or_create_table(table_name)
54
+ super().__init__(domain, event_broker, **kwargs)
55
+
56
+ def get_or_create_table(
57
+ self, table_name: Text
58
+ ) -> "boto3.resources.factory.dynamodb.Table":
59
+ """Returns table or creates one if the table name is not in the table list."""
60
+ import boto3
61
+
62
+ dynamo = boto3.resource("dynamodb", region_name=self.region)
63
+ try:
64
+ self.client.describe_table(TableName=table_name)
65
+ except self.client.exceptions.ResourceNotFoundException:
66
+ sanic_workers_count = int(
67
+ os.environ.get(ENV_SANIC_WORKERS, DEFAULT_SANIC_WORKERS)
68
+ )
69
+
70
+ if sanic_workers_count > 1:
71
+ structlogger.error(
72
+ "dynamo_tracker_store.table_creation_not_supported_in_multi_worker_mode",
73
+ event_info=(
74
+ "DynamoDB table creation is not "
75
+ "supported in multi-worker mode. "
76
+ "Table should already exist.",
77
+ ),
78
+ )
79
+ raise RasaException(
80
+ "DynamoDB table creation is not supported in "
81
+ "case of multiple sanic workers. To create the table either "
82
+ "run Rasa with a single worker or create the table manually."
83
+ "Here are the defaults which can be used to "
84
+ "create the table manually: "
85
+ f"Table name: {table_name}, Primary key: sender_id, "
86
+ f"key type `HASH`, attribute type `S` (String), "
87
+ "Provisioned throughput: Read capacity units: 5, "
88
+ "Write capacity units: 5"
89
+ )
90
+
91
+ table = dynamo.create_table(
92
+ TableName=self.table_name,
93
+ KeySchema=[{"AttributeName": "sender_id", "KeyType": "HASH"}],
94
+ AttributeDefinitions=[
95
+ {"AttributeName": "sender_id", "AttributeType": "S"}
96
+ ],
97
+ ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5},
98
+ )
99
+
100
+ # Wait until the table exists.
101
+ table.meta.client.get_waiter("table_exists").wait(TableName=table_name)
102
+ else:
103
+ table = dynamo.Table(table_name)
104
+
105
+ return table
106
+
107
+ async def save(self, tracker: DialogueStateTracker) -> None:
108
+ """Saves the current conversation state."""
109
+ await self.stream_events(tracker)
110
+ serialized = self.serialise_tracker(tracker)
111
+
112
+ self.db.put_item(Item=serialized)
113
+
114
+ async def delete(self, sender_id: Text) -> None:
115
+ """Delete tracker for the given sender_id."""
116
+ if not await self.exists(sender_id):
117
+ structlogger.info(
118
+ "dynamo_tracker_store.delete.no_tracker_for_sender_id",
119
+ event_info=f"Could not find tracker for conversation ID '{sender_id}'.",
120
+ )
121
+ return None
122
+
123
+ self.db.delete_item(
124
+ Key={"sender_id": sender_id},
125
+ ConditionExpression="attribute_exists(sender_id)",
126
+ )
127
+ structlogger.info(
128
+ "dynamo_tracker_store.delete.deleted_tracker",
129
+ sender_id=sender_id,
130
+ )
131
+
132
+ @staticmethod
133
+ def serialise_tracker(
134
+ tracker: "DialogueStateTracker",
135
+ ) -> Dict:
136
+ """Serializes the tracker, returns object with decimal types.
137
+
138
+ DynamoDB cannot store `float`s, so we'll convert them to `Decimal`s.
139
+ """
140
+ return rasa.utils.json_utils.replace_floats_with_decimals(
141
+ SerializedTrackerAsDict.serialise_tracker(tracker)
142
+ )
143
+
144
+ async def retrieve(self, sender_id: Text) -> Optional[DialogueStateTracker]:
145
+ """Retrieve dialogues for a sender_id in reverse-chronological order.
146
+
147
+ Based on the session_date sort key.
148
+ """
149
+ return await self._retrieve(sender_id, fetch_all_sessions=False)
150
+
151
+ async def retrieve_full_tracker(
152
+ self, sender_id: Text
153
+ ) -> Optional[DialogueStateTracker]:
154
+ """Retrieves tracker for all conversation sessions.
155
+
156
+ Args:
157
+ sender_id: Conversation ID to fetch the tracker for.
158
+ """
159
+ return await self._retrieve(sender_id, fetch_all_sessions=True)
160
+
161
+ async def _retrieve(
162
+ self, sender_id: Text, fetch_all_sessions: bool
163
+ ) -> Optional[DialogueStateTracker]:
164
+ """Returns tracker matching sender_id.
165
+
166
+ Args:
167
+ sender_id: Conversation ID to fetch the tracker for.
168
+ fetch_all_sessions: Whether to fetch all sessions or only the last one.
169
+ """
170
+ dialogues = self.db.query(
171
+ KeyConditionExpression=Key("sender_id").eq(sender_id),
172
+ ScanIndexForward=False,
173
+ )["Items"]
174
+
175
+ if not dialogues:
176
+ return None
177
+
178
+ events_with_floats = []
179
+ for dialogue in dialogues:
180
+ if dialogue.get("events"):
181
+ events = rasa.utils.json_utils.replace_decimals_with_floats(
182
+ dialogue["events"]
183
+ )
184
+ events_with_floats += events
185
+
186
+ if self.domain is None:
187
+ slots = []
188
+ else:
189
+ slots = self.domain.slots
190
+
191
+ tracker = DialogueStateTracker.from_dict(sender_id, events_with_floats, slots)
192
+
193
+ if fetch_all_sessions:
194
+ return tracker
195
+
196
+ # only return the last session
197
+ multiple_tracker_sessions = (
198
+ rasa.shared.core.trackers.get_trackers_for_conversation_sessions(tracker)
199
+ )
200
+
201
+ if len(multiple_tracker_sessions) <= 1:
202
+ return tracker
203
+
204
+ return multiple_tracker_sessions[-1]
205
+
206
+ async def keys(self) -> Iterable[Text]:
207
+ """Returns sender_ids of the `DynamoTrackerStore`."""
208
+ response = self.db.scan(ProjectionExpression="sender_id")
209
+ sender_ids = [i["sender_id"] for i in response["Items"]]
210
+
211
+ while response.get("LastEvaluatedKey"):
212
+ response = self.db.scan(
213
+ ProjectionExpression="sender_id",
214
+ ExclusiveStartKey=response["LastEvaluatedKey"],
215
+ )
216
+ sender_ids.extend([i["sender_id"] for i in response["Items"]])
217
+
218
+ return sender_ids
@@ -0,0 +1,206 @@
1
+ from __future__ import annotations
2
+
3
+ import itertools
4
+ from typing import Any, Dict, Iterable, Iterator, List, Optional, Text
5
+
6
+ import structlog
7
+ from pymongo.synchronous.collection import Collection
8
+
9
+ from rasa.core.brokers.broker import EventBroker
10
+ from rasa.core.tracker_stores.tracker_store import SerializedTrackerAsText, TrackerStore
11
+ from rasa.shared.core.domain import Domain
12
+ from rasa.shared.core.events import SessionStarted
13
+ from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
14
+
15
+ structlogger = structlog.get_logger(__name__)
16
+
17
+
18
+ class MongoTrackerStore(TrackerStore, SerializedTrackerAsText):
19
+ """Stores conversation history in Mongo.
20
+
21
+ Property methods:
22
+ conversations: returns the current conversation
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ domain: Domain,
28
+ host: Optional[Text] = "mongodb://localhost:27017",
29
+ db: Optional[Text] = "rasa",
30
+ username: Optional[Text] = None,
31
+ password: Optional[Text] = None,
32
+ auth_source: Optional[Text] = "admin",
33
+ collection: Text = "conversations",
34
+ event_broker: Optional[EventBroker] = None,
35
+ **kwargs: Dict[Text, Any],
36
+ ) -> None:
37
+ from pymongo import MongoClient
38
+ from pymongo.database import Database
39
+
40
+ self.client: MongoClient = MongoClient(
41
+ host,
42
+ username=username,
43
+ password=password,
44
+ authSource=auth_source,
45
+ # delay connect until process forking is done
46
+ connect=False,
47
+ )
48
+
49
+ self.db = Database(self.client, db)
50
+ self.collection = collection
51
+ super().__init__(domain, event_broker, **kwargs)
52
+
53
+ self._ensure_indices()
54
+
55
+ @property
56
+ def conversations(self) -> Collection:
57
+ """Returns the current conversation."""
58
+ return self.db[self.collection]
59
+
60
+ def _ensure_indices(self) -> None:
61
+ """Create an index on the sender_id."""
62
+ self.conversations.create_index("sender_id")
63
+
64
+ @staticmethod
65
+ def _current_tracker_state_without_events(tracker: DialogueStateTracker) -> Dict:
66
+ # get current tracker state and remove `events` key from state
67
+ # since events are pushed separately in the `update_one()` operation
68
+ state = tracker.current_state(EventVerbosity.ALL)
69
+ state.pop("events", None)
70
+
71
+ return state
72
+
73
+ async def delete(self, sender_id: Text) -> None:
74
+ """Delete tracker for the given sender_id.
75
+
76
+ Args:
77
+ sender_id: Sender id of the tracker to be deleted.
78
+ """
79
+ if not await self.exists(sender_id):
80
+ structlogger.info(
81
+ "mongo_tracker_store.delete.no_tracker_for_sender_id",
82
+ event_info=f"Could not find tracker for conversation ID '{sender_id}'.",
83
+ )
84
+ return None
85
+ self.conversations.delete_one({"sender_id": sender_id})
86
+
87
+ structlogger.info(
88
+ "mongo_tracker_store.delete.deleted_tracker",
89
+ sender_id=sender_id,
90
+ )
91
+
92
+ async def save(self, tracker: DialogueStateTracker) -> None:
93
+ """Saves the current conversation state."""
94
+ await self.stream_events(tracker)
95
+
96
+ additional_events = self._additional_events(tracker)
97
+
98
+ self.conversations.update_one(
99
+ {"sender_id": tracker.sender_id},
100
+ {
101
+ "$set": self._current_tracker_state_without_events(tracker),
102
+ "$push": {
103
+ "events": {"$each": [e.as_dict() for e in additional_events]}
104
+ },
105
+ },
106
+ upsert=True,
107
+ )
108
+
109
+ def _additional_events(self, tracker: DialogueStateTracker) -> Iterator:
110
+ """Return events from the tracker which aren't currently stored.
111
+
112
+ Args:
113
+ tracker: Tracker to inspect.
114
+
115
+ Returns:
116
+ List of serialised events that aren't currently stored.
117
+
118
+ """
119
+ stored = self.conversations.find_one({"sender_id": tracker.sender_id}) or {}
120
+ all_events = self._events_from_serialized_tracker(stored)
121
+
122
+ number_events_since_last_session = len(
123
+ self._events_since_last_session_start(all_events)
124
+ )
125
+
126
+ return itertools.islice(
127
+ tracker.events, number_events_since_last_session, len(tracker.events)
128
+ )
129
+
130
+ @staticmethod
131
+ def _events_from_serialized_tracker(serialised: Dict) -> List[Dict]:
132
+ return serialised.get("events", [])
133
+
134
+ @staticmethod
135
+ def _events_since_last_session_start(events: List[Dict]) -> List[Dict]:
136
+ """Retrieve events since and including the latest `SessionStart` event.
137
+
138
+ Args:
139
+ events: All events for a conversation ID.
140
+
141
+ Returns:
142
+ List of serialised events since and including the latest `SessionStarted`
143
+ event. Returns all events if no such event is found.
144
+
145
+ """
146
+ events_after_session_start = []
147
+ for event in reversed(events):
148
+ events_after_session_start.append(event)
149
+ if event["event"] == SessionStarted.type_name:
150
+ break
151
+
152
+ return list(reversed(events_after_session_start))
153
+
154
+ async def _retrieve(
155
+ self, sender_id: Text, fetch_events_from_all_sessions: bool
156
+ ) -> Optional[List[Dict[Text, Any]]]:
157
+ stored = self.conversations.find_one({"sender_id": sender_id})
158
+
159
+ # look for conversations which have used an `int` sender_id in the past
160
+ # and update them.
161
+ if not stored and sender_id.isdigit():
162
+ from pymongo import ReturnDocument
163
+
164
+ stored = self.conversations.find_one_and_update(
165
+ {"sender_id": int(sender_id)},
166
+ {"$set": {"sender_id": str(sender_id)}},
167
+ return_document=ReturnDocument.AFTER,
168
+ )
169
+
170
+ if not stored:
171
+ return None
172
+
173
+ events = self._events_from_serialized_tracker(stored)
174
+
175
+ if not fetch_events_from_all_sessions:
176
+ events = self._events_since_last_session_start(events)
177
+
178
+ return events
179
+
180
+ async def retrieve(self, sender_id: Text) -> Optional[DialogueStateTracker]:
181
+ """Retrieves tracker for the latest conversation session."""
182
+ events = await self._retrieve(sender_id, fetch_events_from_all_sessions=False)
183
+
184
+ if not events:
185
+ return None
186
+
187
+ return DialogueStateTracker.from_dict(sender_id, events, self.domain.slots)
188
+
189
+ async def retrieve_full_tracker(
190
+ self, conversation_id: Text
191
+ ) -> Optional[DialogueStateTracker]:
192
+ """Fetching all tracker events across conversation sessions."""
193
+ events = await self._retrieve(
194
+ conversation_id, fetch_events_from_all_sessions=True
195
+ )
196
+
197
+ if not events:
198
+ return None
199
+
200
+ return DialogueStateTracker.from_dict(
201
+ conversation_id, events, self.domain.slots
202
+ )
203
+
204
+ async def keys(self) -> Iterable[Text]:
205
+ """Returns sender_ids of the Mongo Tracker Store."""
206
+ return [c["sender_id"] for c in self.conversations.find()]