rasa-pro 3.11.5__py3-none-any.whl → 3.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (559) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +135 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  73. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  76. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  82. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
  88. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
  95. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  96. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
  97. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
  99. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
  103. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
  106. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
  107. rasa/core/channels/inspector/dist/index.html +1 -1
  108. rasa/core/channels/inspector/package.json +1 -0
  109. rasa/core/channels/inspector/src/App.tsx +15 -2
  110. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  111. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  112. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  113. rasa/core/channels/inspector/yarn.lock +5 -0
  114. rasa/core/channels/mattermost.py +4 -4
  115. rasa/core/channels/rasa_chat.py +4 -4
  116. rasa/core/channels/rest.py +11 -12
  117. rasa/core/channels/rocketchat.py +4 -3
  118. rasa/core/channels/slack.py +6 -5
  119. rasa/core/channels/socketio.py +8 -28
  120. rasa/core/channels/studio_chat.py +212 -0
  121. rasa/core/channels/telegram.py +105 -55
  122. rasa/core/channels/twilio.py +3 -3
  123. rasa/core/channels/vier_cvg.py +2 -2
  124. rasa/core/channels/voice_ready/audiocodes.py +9 -9
  125. rasa/core/channels/voice_ready/jambonz.py +5 -5
  126. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  127. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  128. rasa/core/channels/voice_ready/utils.py +2 -2
  129. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  130. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  131. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  132. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  133. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  134. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  135. rasa/core/channels/voice_stream/call_state.py +6 -2
  136. rasa/core/channels/voice_stream/genesys.py +320 -0
  137. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  138. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  139. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  140. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  141. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  142. rasa/core/channels/voice_stream/util.py +1 -1
  143. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  144. rasa/core/channels/webexteams.py +3 -4
  145. rasa/core/constants.py +2 -0
  146. rasa/core/evaluation/marker.py +7 -6
  147. rasa/core/evaluation/marker_base.py +15 -16
  148. rasa/core/evaluation/marker_stats.py +3 -4
  149. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  150. rasa/core/exporter.py +4 -4
  151. rasa/core/featurizers/precomputation.py +8 -8
  152. rasa/core/featurizers/single_state_featurizer.py +7 -7
  153. rasa/core/featurizers/tracker_featurizers.py +13 -13
  154. rasa/core/http_interpreter.py +3 -4
  155. rasa/core/information_retrieval/__init__.py +1 -1
  156. rasa/core/information_retrieval/faiss.py +4 -4
  157. rasa/core/information_retrieval/information_retrieval.py +2 -2
  158. rasa/core/information_retrieval/milvus.py +3 -3
  159. rasa/core/information_retrieval/qdrant.py +3 -3
  160. rasa/core/jobs.py +1 -0
  161. rasa/core/lock.py +2 -3
  162. rasa/core/lock_store.py +3 -3
  163. rasa/core/migrate.py +12 -9
  164. rasa/core/nlg/__init__.py +1 -1
  165. rasa/core/nlg/callback.py +2 -3
  166. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  167. rasa/core/nlg/generator.py +85 -17
  168. rasa/core/nlg/interpolator.py +4 -3
  169. rasa/core/nlg/response.py +9 -7
  170. rasa/core/nlg/summarize.py +1 -0
  171. rasa/core/nlg/translate.py +55 -0
  172. rasa/core/persistor.py +3 -3
  173. rasa/core/policies/ensemble.py +10 -9
  174. rasa/core/policies/enterprise_search_policy.py +87 -21
  175. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  176. rasa/core/policies/flow_policy.py +13 -14
  177. rasa/core/policies/flows/flow_executor.py +85 -55
  178. rasa/core/policies/intentless_policy.py +6 -7
  179. rasa/core/policies/memoization.py +22 -20
  180. rasa/core/policies/policy.py +24 -22
  181. rasa/core/policies/rule_policy.py +37 -36
  182. rasa/core/policies/ted_policy.py +87 -85
  183. rasa/core/policies/unexpected_intent_policy.py +77 -75
  184. rasa/core/processor.py +167 -74
  185. rasa/core/run.py +5 -4
  186. rasa/core/secrets_manager/endpoints.py +2 -3
  187. rasa/core/secrets_manager/factory.py +2 -3
  188. rasa/core/secrets_manager/secret_manager.py +2 -3
  189. rasa/core/secrets_manager/vault.py +2 -2
  190. rasa/core/test.py +30 -30
  191. rasa/core/tracker_store.py +138 -49
  192. rasa/core/train.py +1 -1
  193. rasa/core/training/__init__.py +2 -2
  194. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  195. rasa/core/training/interactive.py +13 -13
  196. rasa/core/training/story_conflict.py +4 -5
  197. rasa/core/training/training.py +3 -5
  198. rasa/core/utils.py +5 -5
  199. rasa/core/visualize.py +1 -1
  200. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  201. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  202. rasa/dialogue_understanding/commands/__init__.py +22 -22
  203. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  204. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  205. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  206. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  207. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  208. rasa/dialogue_understanding/commands/command.py +3 -2
  209. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  210. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  211. rasa/dialogue_understanding/commands/error_command.py +1 -1
  212. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  213. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  214. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  215. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  216. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  217. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  218. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  219. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  220. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  221. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  222. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  223. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  224. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  225. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  226. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  227. rasa/dialogue_understanding/commands/utils.py +126 -43
  228. rasa/dialogue_understanding/constants.py +2 -0
  229. rasa/dialogue_understanding/generator/__init__.py +2 -0
  230. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  231. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  232. rasa/dialogue_understanding/generator/constants.py +12 -4
  233. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  234. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  235. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  236. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  237. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  238. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  239. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  240. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  241. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  242. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  243. rasa/dialogue_understanding/generator/utils.py +76 -0
  244. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  245. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  246. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  247. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  248. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  249. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  250. rasa/dialogue_understanding/patterns/completed.py +1 -1
  251. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  252. rasa/dialogue_understanding/patterns/correction.py +17 -3
  253. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  254. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  255. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  256. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  257. rasa/dialogue_understanding/patterns/search.py +1 -1
  258. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  259. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  260. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  261. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  262. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  263. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  264. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  265. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  266. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  267. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  268. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  269. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  270. rasa/dialogue_understanding/stack/utils.py +56 -10
  271. rasa/dialogue_understanding/utils.py +164 -0
  272. rasa/dialogue_understanding_test/README.md +429 -0
  273. rasa/dialogue_understanding_test/__init__.py +0 -0
  274. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  275. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  276. rasa/dialogue_understanding_test/constants.py +22 -0
  277. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  278. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  279. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  280. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  281. rasa/dialogue_understanding_test/io.py +443 -0
  282. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  283. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  285. rasa/dialogue_understanding_test/utils.py +70 -0
  286. rasa/dialogue_understanding_test/validation.py +77 -0
  287. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  288. rasa/e2e_test/assertions.py +202 -175
  289. rasa/e2e_test/assertions_schema.yml +6 -0
  290. rasa/e2e_test/constants.py +16 -1
  291. rasa/e2e_test/e2e_config.py +102 -41
  292. rasa/e2e_test/e2e_config_schema.yml +28 -10
  293. rasa/e2e_test/e2e_test_case.py +5 -5
  294. rasa/e2e_test/e2e_test_converter.py +2 -3
  295. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  296. rasa/e2e_test/e2e_test_result.py +1 -1
  297. rasa/e2e_test/e2e_test_runner.py +143 -38
  298. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  299. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  300. rasa/e2e_test/stub_custom_action.py +1 -1
  301. rasa/e2e_test/utils/generative_assertions.py +243 -0
  302. rasa/e2e_test/utils/io.py +123 -93
  303. rasa/e2e_test/utils/validation.py +101 -3
  304. rasa/engine/caching.py +5 -7
  305. rasa/engine/constants.py +1 -1
  306. rasa/engine/graph.py +3 -2
  307. rasa/engine/language.py +182 -0
  308. rasa/engine/recipes/config_files/default_config.yml +4 -0
  309. rasa/engine/recipes/default_components.py +13 -15
  310. rasa/engine/recipes/default_recipe.py +65 -49
  311. rasa/engine/recipes/graph_recipe.py +10 -7
  312. rasa/engine/recipes/recipe.py +2 -2
  313. rasa/engine/runner/dask.py +2 -2
  314. rasa/engine/runner/interface.py +1 -0
  315. rasa/engine/storage/local_model_storage.py +6 -4
  316. rasa/engine/storage/resource.py +2 -1
  317. rasa/engine/storage/storage.py +8 -3
  318. rasa/engine/training/components.py +2 -1
  319. rasa/engine/training/fingerprinting.py +4 -2
  320. rasa/engine/training/graph_trainer.py +4 -4
  321. rasa/engine/training/hooks.py +2 -2
  322. rasa/engine/validation.py +36 -33
  323. rasa/exceptions.py +3 -2
  324. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  325. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  326. rasa/graph_components/providers/domain_provider.py +3 -2
  327. rasa/graph_components/providers/flows_provider.py +2 -3
  328. rasa/graph_components/providers/forms_provider.py +4 -4
  329. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  330. rasa/graph_components/providers/responses_provider.py +4 -4
  331. rasa/graph_components/providers/rule_only_provider.py +3 -2
  332. rasa/graph_components/providers/story_graph_provider.py +8 -8
  333. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  334. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  335. rasa/graph_components/validators/finetuning_validator.py +10 -8
  336. rasa/hooks.py +19 -14
  337. rasa/jupyter.py +2 -2
  338. rasa/llm_fine_tuning/annotation_module.py +4 -4
  339. rasa/llm_fine_tuning/conversations.py +5 -33
  340. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  341. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  342. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  343. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  344. rasa/llm_fine_tuning/storage.py +3 -3
  345. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  346. rasa/llm_fine_tuning/utils.py +7 -0
  347. rasa/markers/marker.py +2 -3
  348. rasa/markers/marker_base.py +1 -2
  349. rasa/markers/upload.py +2 -2
  350. rasa/markers/validate.py +2 -3
  351. rasa/model.py +3 -5
  352. rasa/model_manager/config.py +1 -1
  353. rasa/model_manager/model_api.py +5 -4
  354. rasa/model_manager/runner_service.py +13 -10
  355. rasa/model_manager/socket_bridge.py +15 -9
  356. rasa/model_manager/studio_jwt_auth.py +1 -0
  357. rasa/model_manager/trainer_service.py +9 -7
  358. rasa/model_manager/utils.py +1 -1
  359. rasa/model_manager/warm_rasa_process.py +14 -9
  360. rasa/model_service.py +5 -6
  361. rasa/model_testing.py +13 -15
  362. rasa/model_training.py +29 -29
  363. rasa/nlu/classifiers/diet_classifier.py +72 -73
  364. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  365. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  366. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  367. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  368. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  369. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  370. rasa/nlu/convert.py +2 -2
  371. rasa/nlu/emulators/dialogflow.py +3 -3
  372. rasa/nlu/emulators/luis.py +5 -5
  373. rasa/nlu/emulators/no_emulator.py +1 -0
  374. rasa/nlu/emulators/wit.py +4 -4
  375. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  376. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  377. rasa/nlu/extractors/entity_synonyms.py +10 -9
  378. rasa/nlu/extractors/extractor.py +16 -16
  379. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  380. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  381. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  382. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  383. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  384. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  385. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  386. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  387. rasa/nlu/featurizers/featurizer.py +5 -4
  388. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  389. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  390. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  391. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  392. rasa/nlu/model.py +0 -1
  393. rasa/nlu/selectors/response_selector.py +67 -68
  394. rasa/nlu/test.py +38 -38
  395. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  396. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  397. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  398. rasa/nlu/tokenizers/tokenizer.py +6 -7
  399. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  400. rasa/nlu/utils/bilou_utils.py +7 -7
  401. rasa/nlu/utils/hugging_face/registry.py +22 -22
  402. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  403. rasa/nlu/utils/mitie_utils.py +2 -1
  404. rasa/nlu/utils/pattern_utils.py +1 -1
  405. rasa/nlu/utils/spacy_utils.py +3 -3
  406. rasa/plugin.py +12 -1
  407. rasa/server.py +3 -2
  408. rasa/shared/constants.py +45 -18
  409. rasa/shared/core/command_payload_reader.py +15 -7
  410. rasa/shared/core/constants.py +34 -4
  411. rasa/shared/core/conversation.py +1 -2
  412. rasa/shared/core/domain.py +19 -20
  413. rasa/shared/core/events.py +60 -39
  414. rasa/shared/core/flows/__init__.py +0 -1
  415. rasa/shared/core/flows/constants.py +11 -0
  416. rasa/shared/core/flows/flow.py +107 -26
  417. rasa/shared/core/flows/flow_step.py +4 -3
  418. rasa/shared/core/flows/flow_step_links.py +1 -2
  419. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  420. rasa/shared/core/flows/flows_list.py +3 -3
  421. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  422. rasa/shared/core/flows/nlu_trigger.py +1 -1
  423. rasa/shared/core/flows/steps/__init__.py +2 -2
  424. rasa/shared/core/flows/steps/action.py +1 -1
  425. rasa/shared/core/flows/steps/call.py +1 -1
  426. rasa/shared/core/flows/steps/collect.py +22 -40
  427. rasa/shared/core/flows/steps/internal.py +1 -1
  428. rasa/shared/core/flows/steps/link.py +1 -1
  429. rasa/shared/core/flows/steps/no_operation.py +2 -2
  430. rasa/shared/core/flows/steps/set_slots.py +1 -1
  431. rasa/shared/core/flows/utils.py +44 -4
  432. rasa/shared/core/flows/validation.py +4 -6
  433. rasa/shared/core/generator.py +20 -21
  434. rasa/shared/core/slot_mappings.py +360 -121
  435. rasa/shared/core/slots.py +163 -6
  436. rasa/shared/core/trackers.py +108 -33
  437. rasa/shared/core/training_data/loading.py +1 -1
  438. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  439. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  440. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  441. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  442. rasa/shared/core/training_data/structures.py +11 -12
  443. rasa/shared/core/training_data/visualization.py +10 -10
  444. rasa/shared/data.py +6 -6
  445. rasa/shared/engine/caching.py +0 -1
  446. rasa/shared/exceptions.py +2 -2
  447. rasa/shared/importers/importer.py +58 -2
  448. rasa/shared/importers/rasa.py +5 -6
  449. rasa/shared/importers/utils.py +1 -1
  450. rasa/shared/nlu/constants.py +9 -0
  451. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  452. rasa/shared/nlu/training_data/features.py +3 -3
  453. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  454. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  455. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  456. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  457. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  458. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  459. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  460. rasa/shared/nlu/training_data/loading.py +4 -4
  461. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  462. rasa/shared/nlu/training_data/message.py +13 -14
  463. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  464. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  465. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  466. rasa/shared/nlu/training_data/training_data.py +12 -13
  467. rasa/shared/nlu/training_data/util.py +11 -10
  468. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  469. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  470. rasa/shared/providers/_configs/client_config.py +3 -1
  471. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  472. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  473. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  474. rasa/shared/providers/_configs/model_group_config.py +8 -5
  475. rasa/shared/providers/_configs/oauth_config.py +33 -0
  476. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  477. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  478. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  479. rasa/shared/providers/_configs/utils.py +1 -0
  480. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  481. rasa/shared/providers/_utils.py +5 -5
  482. rasa/shared/providers/constants.py +6 -0
  483. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  484. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  485. rasa/shared/providers/embedding/embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  487. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  488. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  489. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  490. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  491. rasa/shared/providers/llm/llm_client.py +24 -8
  492. rasa/shared/providers/llm/llm_response.py +61 -2
  493. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  494. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  495. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  496. rasa/shared/providers/mappings.py +18 -19
  497. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  498. rasa/shared/providers/router/router_client.py +3 -1
  499. rasa/shared/utils/cli.py +1 -1
  500. rasa/shared/utils/common.py +15 -1
  501. rasa/shared/utils/constants.py +3 -0
  502. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  503. rasa/shared/utils/health_check/health_check.py +3 -3
  504. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  505. rasa/shared/utils/io.py +1 -1
  506. rasa/shared/utils/llm.py +100 -18
  507. rasa/shared/utils/pykwalify_extensions.py +25 -1
  508. rasa/shared/utils/schemas/domain.yml +26 -1
  509. rasa/shared/utils/schemas/events.py +1 -1
  510. rasa/shared/utils/yaml.py +24 -20
  511. rasa/studio/auth.py +3 -3
  512. rasa/studio/config.py +1 -2
  513. rasa/studio/data_handler.py +3 -3
  514. rasa/studio/download.py +1 -1
  515. rasa/studio/results_logger.py +3 -3
  516. rasa/studio/upload.py +21 -5
  517. rasa/telemetry.py +127 -48
  518. rasa/tracing/config.py +5 -3
  519. rasa/tracing/constants.py +12 -0
  520. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  521. rasa/tracing/instrumentation/instrumentation.py +61 -5
  522. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  523. rasa/tracing/instrumentation/metrics.py +52 -11
  524. rasa/tracing/metric_instrument_provider.py +54 -14
  525. rasa/utils/common.py +12 -24
  526. rasa/utils/endpoints.py +1 -1
  527. rasa/utils/io.py +7 -7
  528. rasa/utils/licensing.py +3 -4
  529. rasa/utils/log_utils.py +7 -6
  530. rasa/utils/ml_utils.py +1 -0
  531. rasa/utils/plotting.py +3 -3
  532. rasa/utils/sanic_error_handler.py +1 -1
  533. rasa/utils/tensorflow/callback.py +2 -2
  534. rasa/utils/tensorflow/crf.py +2 -2
  535. rasa/utils/tensorflow/data_generator.py +5 -5
  536. rasa/utils/tensorflow/environment.py +3 -3
  537. rasa/utils/tensorflow/feature_array.py +2 -3
  538. rasa/utils/tensorflow/layers.py +18 -12
  539. rasa/utils/tensorflow/layers_utils.py +2 -1
  540. rasa/utils/tensorflow/metrics.py +2 -2
  541. rasa/utils/tensorflow/model_data.py +7 -7
  542. rasa/utils/tensorflow/model_data_utils.py +10 -9
  543. rasa/utils/tensorflow/models.py +31 -32
  544. rasa/utils/tensorflow/rasa_layers.py +20 -19
  545. rasa/utils/tensorflow/types.py +2 -1
  546. rasa/utils/train_utils.py +23 -21
  547. rasa/utils/url_tools.py +1 -1
  548. rasa/validator.py +594 -115
  549. rasa/version.py +1 -1
  550. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  551. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  552. rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
  553. rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
  554. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
  555. rasa_pro-3.11.5.dist-info/RECORD +0 -785
  556. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  557. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  558. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  559. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -13,6 +13,7 @@ import { DialogueStack } from "./components/DialogueStack";
13
13
  import { DialougeInformation } from "./components/DialogueInformation";
14
14
  import { LoadingSpinner } from "./components/LoadingSpinner";
15
15
  import { DiagramFlow } from "./components/DiagramFlow";
16
+ import { RecruitmentPanel } from "./components/RecruitmentPanel";
16
17
  import { formatSlots } from "./helpers/formatters";
17
18
  import { Slot, Stack, Event, Flow, SelectedStack, Tracker } from "./types";
18
19
  import {
@@ -35,6 +36,9 @@ export function App() {
35
36
  const [stack, setStack] = useState<Stack[]>([]);
36
37
  const [frame, setFrame] = useState<SelectedStack | undefined>(undefined);
37
38
 
39
+ // State to control the visibility of the RecruitmentPanel
40
+ const [showRecruitmentPanel, setShowRecruitmentPanel] = useState(true);
41
+
38
42
  // we only show the transcript if we are not on the socket io channel
39
43
  // on the socketio channel, we show the chat component instead
40
44
  const shouldShowTranscript = !window.location.href.includes("socketio");
@@ -165,7 +169,9 @@ export function App() {
165
169
  height: "100%",
166
170
  overflow: "hidden",
167
171
  gridTemplateColumns: "1fr",
168
- gridTemplateRows: "max-content minmax(10rem, 17.5rem) minmax(10rem, auto)",
172
+ gridTemplateRows: showRecruitmentPanel
173
+ ? "max-content max-content minmax(10rem, auto)"
174
+ : "max-content minmax(10rem, 17.5rem) minmax(10rem, auto)",
169
175
  gridRowGap: rasaSpace[1],
170
176
  };
171
177
 
@@ -177,13 +183,20 @@ export function App() {
177
183
  });
178
184
  };
179
185
 
186
+ const handleCloseRecruitmentPanel = () => {
187
+ setShowRecruitmentPanel(false);
188
+ };
189
+
180
190
  if (!rasaChatSessionId && !window.location.href.includes("socketio")) return <LoadingSpinner />;
181
191
 
182
192
  return (
183
193
  <Grid sx={gridSx}>
184
194
  <GridItem overflow="hidden">
185
195
  <Grid sx={leftColumnSx}>
186
- <Welcome sx={boxSx} />
196
+ <Welcome sx={boxSx} isRecruitmentVisible={showRecruitmentPanel} />
197
+ {showRecruitmentPanel && (
198
+ <RecruitmentPanel onClose={handleCloseRecruitmentPanel} />
199
+ )}
187
200
  <DialogueStack
188
201
  sx={boxSx}
189
202
  stack={stack}
@@ -30,3 +30,34 @@ export const RasaLogo = (props: BoxProps) => {
30
30
  </Box>
31
31
  );
32
32
  };
33
+
34
+ export const RasaLogoDark = (props: BoxProps) => {
35
+ return (
36
+ <Box
37
+ as="svg"
38
+ {...props}
39
+ xmlns="http://www.w3.org/2000/svg"
40
+ width="41"
41
+ height="51"
42
+ fill="none"
43
+ viewBox="0 0 41 51"
44
+ >
45
+ <path
46
+ fill="#7622D2"
47
+ fillRule="evenodd"
48
+ d="M34.041 10.59V7.508H21.385v12.847h3.037v-3.867h6.582v3.854h3.037v-9.763.013zm-3.037 2.827h-6.582V10.59h6.582v2.826zM19.36 29.74V35.52H6.956v-3.083h9.366V30.64H6.956v-7.965H19.36v3.083H9.994v1.798h9.366v2.184zM34.041 25.75v-3.084H21.385v12.847h3.037v-3.867h6.582V35.5h3.037v-9.764.013zm-3.037 2.826h-6.582v-2.827h6.582v2.827z"
49
+ clipRule="evenodd"
50
+ ></path>
51
+ <path
52
+ fill="#7622D2"
53
+ d="M36.826 4.689v33.578h-5.248v5.724l-9.487-5.318-.744-.417H4.179V4.69h32.654-.007zm3.298-3.34H.881v40.258h19.618l14.368 8.054v-8.054h5.25V1.349h.007z"
54
+ ></path>
55
+ <path
56
+ fill="#7622D2"
57
+ fillRule="evenodd"
58
+ d="M15.287 15.464l3.888-1.436.185-.074V7.515H6.956v.257l-.028 12.59h3.038V17.43l2.278-.838 3.417 3.77h3.752l-4.126-4.897zM9.97 14.15v-3.55h6.351V11.8l-6.351 2.348z"
59
+ clipRule="evenodd"
60
+ ></path>
61
+ </Box>
62
+ );
63
+ };
@@ -0,0 +1,68 @@
1
+ // RecruitmentPanel.tsx
2
+ import {
3
+ Box,
4
+ Flex,
5
+ Heading,
6
+ IconButton,
7
+ Text,
8
+ Button,
9
+ } from "@chakra-ui/react";
10
+ import { CloseIcon } from "@chakra-ui/icons";
11
+ import { useOurTheme } from "../theme";
12
+
13
+ interface RecruitmentPanelProps {
14
+ onClose: () => void;
15
+ }
16
+
17
+ export const RecruitmentPanel: React.FC<RecruitmentPanelProps> = ({ onClose }) => {
18
+ const { rasaRadii } = useOurTheme();
19
+
20
+ const textColor = "white";
21
+ const iconColor = "white";
22
+
23
+ const boxSx = {
24
+ borderRadius: rasaRadii.normal,
25
+ padding: "1rem",
26
+ bgGradient: "linear(to-b, #4E61E1, #7622D2)",
27
+ color: textColor,
28
+ };
29
+
30
+ return (
31
+ <Box sx={boxSx}>
32
+ <Flex justify="space-between" align="center">
33
+ <Flex align="center">
34
+ <Heading as="h3" size="lg" fontWeight="bold" color={textColor}>
35
+ Help us Improve Rasa Pro!
36
+ </Heading>
37
+ </Flex>
38
+ <IconButton
39
+ aria-label="Close"
40
+ icon={<CloseIcon color={iconColor} />}
41
+ size="sm"
42
+ onClick={onClose}
43
+ bg="transparent"
44
+ _hover={{ bg: "rgba(255, 255, 255, 0.2)" }}
45
+ />
46
+ </Flex>
47
+ <Flex align="center" mt="0.5rem" justify="space-between">
48
+ <Text fontSize="sm" color={textColor}>
49
+ We're looking for users to share their feedback.
50
+ </Text>
51
+ <Button
52
+ as="a"
53
+ href="https://calendly.com/alvaro-rasa/rasa-pro-installation"
54
+ target="_blank"
55
+ rel="noopener noreferrer"
56
+ color="#7622D2"
57
+ bg="white"
58
+ fontWeight="bold"
59
+ ml="1rem"
60
+ size="sm"
61
+ _hover={{ bg: "whiteAlpha.800" }}
62
+ >
63
+ Sign up
64
+ </Button>
65
+ </Flex>
66
+ </Box>
67
+ );
68
+ };
@@ -5,33 +5,35 @@ import {
5
5
  Heading,
6
6
  Link,
7
7
  Text,
8
- useColorModeValue,
9
8
  } from "@chakra-ui/react";
10
- import { RasaLogo } from "./RasaLogo";
9
+ import { RasaLogo, RasaLogoDark } from "./RasaLogo";
11
10
  import { useOurTheme } from "../theme";
12
11
 
13
- export const Welcome = ({ sx, ...props }: FlexProps) => {
12
+ interface WelcomeProps extends FlexProps {
13
+ isRecruitmentVisible?: boolean;
14
+ }
15
+
16
+ export const Welcome = ({ sx, isRecruitmentVisible, ...props }: WelcomeProps) => {
14
17
  const { rasaSpace } = useOurTheme();
15
18
 
16
19
  const containerSx = {
17
20
  ...sx,
18
- color: useColorModeValue("neutral.50", "neutral.50"),
19
- bgGradient: "linear(to-b, #4E61E1, #7622D2)",
21
+ color: isRecruitmentVisible ? "black" : "neutral.50",
22
+ bg: isRecruitmentVisible ? "white" : undefined,
23
+ bgGradient: isRecruitmentVisible ? undefined : "linear(to-b, #4E61E1, #7622D2)",
20
24
  };
21
25
 
22
26
  const linkSx = {
23
27
  flexGrow: 0,
24
- color: useColorModeValue("neutral.50", "neutral.50"),
28
+ color: isRecruitmentVisible ? "#0000EE" : "neutral.50",
29
+ textDecoration: "underline",
25
30
  _hover: {
26
- color: useColorModeValue("neutral.400", "neutral.400"),
31
+ color: isRecruitmentVisible
32
+ ? "link.visited"
33
+ : "neutral.400",
27
34
  },
28
35
  };
29
36
 
30
- const logoSx = {
31
- flexShrink:0,
32
- marginLeft: "auto"
33
- };
34
-
35
37
  return (
36
38
  <Flex sx={containerSx} {...props}>
37
39
  <Box>
@@ -48,7 +50,11 @@ export const Welcome = ({ sx, ...props }: FlexProps) => {
48
50
  ml={rasaSpace[0.25]}
49
51
  >Browse the docs</Link>
50
52
  </Box>
51
- <RasaLogo sx={logoSx}/>
53
+ {isRecruitmentVisible ? (
54
+ <RasaLogoDark sx={{ flexShrink: 0, marginLeft: "auto" }}/>
55
+ ) : (
56
+ <RasaLogo sx={{ flexShrink: 0, marginLeft: "auto" }}/>
57
+ )}
52
58
  </Flex>
53
59
  );
54
60
  };
@@ -531,6 +531,11 @@
531
531
  dependencies:
532
532
  "@chakra-ui/shared-utils" "2.0.5"
533
533
 
534
+ "@chakra-ui/icons@^2.2.4":
535
+ version "2.2.4"
536
+ resolved "https://registry.yarnpkg.com/@chakra-ui/icons/-/icons-2.2.4.tgz#fc3f59a7e377d6e4efdbe8ee0a3aec7f29a4ab32"
537
+ integrity sha512-l5QdBgwrAg3Sc2BRqtNkJpfuLw/pWRDwwT58J6c4PqQT6wzXxyNa8Q0PForu1ltB5qEiFb1kxr/F/HO1EwNa6g==
538
+
534
539
  "@chakra-ui/image@2.1.0":
535
540
  version "2.1.0"
536
541
  resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-2.1.0.tgz#6c205f1ca148e3bf58345b0b5d4eb3d959eb9f87"
@@ -1,15 +1,15 @@
1
1
  import json
2
-
3
2
  import logging
3
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
4
+
4
5
  import requests
5
6
  from requests import Response
6
7
  from sanic import Blueprint, response
7
8
  from sanic.request import Request
8
- from typing import Text, Dict, Any, List, Callable, Awaitable, Optional
9
-
10
- from rasa.core.channels.channel import UserMessage, OutputChannel, InputChannel
11
9
  from sanic.response import HTTPResponse
12
10
 
11
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
12
+
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
15
 
@@ -1,17 +1,17 @@
1
1
  import json
2
- from typing import Text, Optional, Dict, Any
2
+ import logging
3
+ from typing import Any, Dict, Optional, Text
3
4
 
4
5
  import aiohttp
5
- import logging
6
- from sanic.exceptions import SanicException
7
6
  import jwt
8
7
  import jwt.exceptions
8
+ from sanic.exceptions import SanicException
9
+ from sanic.request import Request
9
10
 
10
11
  import rasa.core.channels.channel
11
12
  from rasa.core.channels.channel import InputChannel
12
13
  from rasa.core.channels.rest import RestInput
13
14
  from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
14
- from sanic.request import Request
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
@@ -3,32 +3,31 @@ import copy
3
3
  import inspect
4
4
  import json
5
5
  import logging
6
+ from asyncio import CancelledError, Queue
6
7
  from functools import partial
7
-
8
- import structlog
9
- from asyncio import Queue, CancelledError
10
- from sanic import Blueprint, response
11
- from sanic.request import Request
12
8
  from typing import (
13
- Text,
14
- Dict,
15
9
  Any,
16
- Optional,
17
- Callable,
18
10
  Awaitable,
11
+ Callable,
12
+ Dict,
19
13
  NoReturn,
14
+ Optional,
15
+ Text,
20
16
  Union,
21
17
  )
22
- from sanic.response import HTTPResponse, ResponseStream, BaseHTTPResponse
18
+
19
+ import structlog
20
+ from sanic import Blueprint, response
21
+ from sanic.request import Request
22
+ from sanic.response import BaseHTTPResponse, HTTPResponse, ResponseStream
23
23
 
24
24
  import rasa.utils.endpoints
25
25
  from rasa.core.channels.channel import (
26
- InputChannel,
27
26
  CollectingOutputChannel,
27
+ InputChannel,
28
28
  UserMessage,
29
29
  )
30
30
 
31
-
32
31
  logger = logging.getLogger(__name__)
33
32
  structlogger = structlog.get_logger()
34
33
 
@@ -1,11 +1,12 @@
1
1
  import logging
2
+ from typing import Any, Awaitable, Callable, Dict, Iterable, List, Optional, Text
3
+
2
4
  from sanic import Blueprint, response
3
5
  from sanic.request import Request
4
- from typing import Text, Dict, Any, List, Iterable, Optional, Callable, Awaitable
5
-
6
- from rasa.core.channels.channel import UserMessage, OutputChannel, InputChannel
7
6
  from sanic.response import HTTPResponse
8
7
 
8
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
9
+
9
10
  logger = logging.getLogger(__name__)
10
11
 
11
12
 
@@ -1,22 +1,23 @@
1
1
  import asyncio
2
2
  import hashlib
3
3
  import hmac
4
- from http import HTTPStatus
5
4
  import json
6
5
  import logging
7
6
  import re
8
7
  import time
8
+ from http import HTTPStatus
9
9
  from typing import Any, Awaitable, Callable, Dict, List, Optional, Set, Text
10
10
 
11
- from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
12
- from rasa.shared.constants import DOCS_URL_CONNECTORS_SLACK
13
- from rasa.shared.exceptions import InvalidConfigException
14
- import rasa.shared.utils.io
15
11
  from sanic import Blueprint, response
16
12
  from sanic.request import Request
17
13
  from sanic.response import HTTPResponse
18
14
  from slack_sdk.web.async_client import AsyncWebClient
19
15
 
16
+ import rasa.shared.utils.io
17
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
18
+ from rasa.shared.constants import DOCS_URL_CONNECTORS_SLACK
19
+ from rasa.shared.exceptions import InvalidConfigException
20
+
20
21
  logger = logging.getLogger(__name__)
21
22
 
22
23
 
@@ -1,17 +1,18 @@
1
1
  import inspect
2
+ import json
2
3
  import logging
3
4
  import uuid
4
- import json
5
5
  from typing import Any, Awaitable, Callable, Dict, Iterable, List, Optional, Text
6
6
 
7
- import rasa.core.channels.channel
8
- from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
9
- import rasa.shared.utils.io
10
- from sanic import Blueprint, response, Sanic
7
+ from sanic import Blueprint, Sanic, response
11
8
  from sanic.request import Request
12
9
  from sanic.response import HTTPResponse
13
10
  from socketio import AsyncServer
14
11
 
12
+ import rasa.core.channels.channel
13
+ import rasa.shared.utils.io
14
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
15
+
15
16
  logger = logging.getLogger(__name__)
16
17
 
17
18
 
@@ -54,31 +55,9 @@ class SocketIOOutput(OutputChannel):
54
55
  super().__init__()
55
56
  self.sio = sio
56
57
  self.bot_message_evt = bot_message_evt
57
- self.last_event_timestamp = (
58
- -1
59
- ) # Initialize with -1 to send all events on first message
60
-
61
- def _get_new_events(self) -> List[Dict[Text, Any]]:
62
- """Get events that are newer than the last sent event."""
63
- events = self.tracker_state.get("events", []) if self.tracker_state else []
64
- new_events = [
65
- event for event in events if event["timestamp"] > self.last_event_timestamp
66
- ]
67
- if new_events:
68
- self.last_event_timestamp = new_events[-1]["timestamp"]
69
- return new_events
70
58
 
71
59
  async def _send_message(self, socket_id: Text, response: Any) -> None:
72
60
  """Sends a message to the recipient using the bot event."""
73
- # send tracker state (contains stack, slots and more)
74
- await self.sio.emit("tracker_state", self.tracker_state, room=socket_id)
75
-
76
- # send new events
77
- new_events = self._get_new_events()
78
- if new_events:
79
- await self.sio.emit("rasa_events", new_events, room=socket_id)
80
-
81
- # send bot response
82
61
  await self.sio.emit(self.bot_message_evt, response, room=socket_id)
83
62
 
84
63
  async def send_text_message(
@@ -214,7 +193,7 @@ class SocketIOInput(InputChannel):
214
193
 
215
194
  def blueprint(
216
195
  self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
217
- ) -> Blueprint:
196
+ ) -> SocketBlueprint:
218
197
  """Defines a Sanic blueprint."""
219
198
  # Workaround so that socketio works with requests from other origins.
220
199
  # https://github.com/miguelgrinberg/python-socketio/issues/205#issuecomment-493769183
@@ -289,6 +268,7 @@ class SocketIOInput(InputChannel):
289
268
  metadata = data.get(self.metadata_key, {})
290
269
  if isinstance(metadata, Text):
291
270
  metadata = json.loads(metadata)
271
+
292
272
  message = UserMessage(
293
273
  data.get("message", ""),
294
274
  output_channel,
@@ -0,0 +1,212 @@
1
+ import asyncio
2
+ import json
3
+ from functools import partial
4
+ from typing import (
5
+ TYPE_CHECKING,
6
+ Any,
7
+ Awaitable,
8
+ Callable,
9
+ Dict,
10
+ List,
11
+ Optional,
12
+ Text,
13
+ )
14
+
15
+ import structlog
16
+ from sanic import Sanic
17
+
18
+ from rasa.core.channels.socketio import SocketBlueprint, SocketIOInput
19
+ from rasa.hooks import hookimpl
20
+ from rasa.plugin import plugin_manager
21
+ from rasa.shared.core.constants import ACTION_LISTEN_NAME
22
+ from rasa.shared.core.events import ActionExecuted
23
+ from rasa.shared.core.trackers import EventVerbosity
24
+
25
+ if TYPE_CHECKING:
26
+ from rasa.core.channels.channel import UserMessage
27
+ from rasa.shared.core.trackers import DialogueStateTracker
28
+
29
+
30
+ structlogger = structlog.get_logger()
31
+
32
+
33
+ def tracker_as_dump(tracker: "DialogueStateTracker") -> str:
34
+ """Create a dump of the tracker state."""
35
+ from rasa.shared.core.trackers import get_trackers_for_conversation_sessions
36
+
37
+ multiple_tracker_sessions = get_trackers_for_conversation_sessions(tracker)
38
+
39
+ if 0 <= len(multiple_tracker_sessions) <= 1:
40
+ last_tracker = tracker
41
+ else:
42
+ last_tracker = multiple_tracker_sessions[-1]
43
+
44
+ state = last_tracker.current_state(EventVerbosity.AFTER_RESTART)
45
+ return json.dumps(state)
46
+
47
+
48
+ def does_need_action_prediction(tracker: "DialogueStateTracker") -> bool:
49
+ """Check if the tracker needs an action prediction."""
50
+ return (
51
+ len(tracker.events) == 0
52
+ or not isinstance(tracker.events[-1], ActionExecuted)
53
+ or tracker.events[-1].action_name != ACTION_LISTEN_NAME
54
+ )
55
+
56
+
57
+ class StudioTrackerUpdatePlugin:
58
+ """Plugin for publishing tracker updates a socketio channel."""
59
+
60
+ def __init__(self, socket_channel: "StudioChatInput") -> None:
61
+ self.socket_channel = socket_channel
62
+ self.tasks: List[asyncio.Task] = []
63
+
64
+ def _cancel_tasks(self) -> None:
65
+ """Cancel all remaining tasks."""
66
+ for task in self.tasks:
67
+ task.cancel()
68
+ self.tasks = []
69
+
70
+ def _cleanup_tasks(self) -> None:
71
+ """Remove tasks that have already completed."""
72
+ self.tasks = [task for task in self.tasks if not task.done()]
73
+
74
+ @hookimpl # type: ignore[misc]
75
+ def after_new_user_message(self, tracker: "DialogueStateTracker") -> None:
76
+ """Triggers a tracker update notification after a new user message."""
77
+ self.handle_tracker_update(tracker)
78
+
79
+ @hookimpl # type: ignore[misc]
80
+ def after_action_executed(self, tracker: "DialogueStateTracker") -> None:
81
+ """Triggers a tracker update notification after an action is executed."""
82
+ self.handle_tracker_update(tracker)
83
+
84
+ def handle_tracker_update(self, tracker: "DialogueStateTracker") -> None:
85
+ """Handles a tracker update when triggered by a hook."""
86
+ structlogger.info("studio_chat.after_tracker_update", tracker=tracker)
87
+ # directly create a dump to avoid the tracker getting modified by another
88
+ # function before it gets published (since the publishing is scheduled
89
+ # as an async task)
90
+ tracker_dump = tracker_as_dump(tracker)
91
+ task = asyncio.create_task(
92
+ self.socket_channel.publish_tracker_update(tracker.sender_id, tracker_dump)
93
+ )
94
+ self.tasks.append(task)
95
+ self._cleanup_tasks()
96
+
97
+ @hookimpl # type: ignore[misc]
98
+ def after_server_stop(self) -> None:
99
+ """Cancels all remaining tasks when the server stops."""
100
+ self._cancel_tasks()
101
+
102
+
103
+ class StudioChatInput(SocketIOInput):
104
+ """Input channel for the communication between Rasa Studio and Rasa Pro."""
105
+
106
+ @classmethod
107
+ def name(cls) -> Text:
108
+ return "studio_chat"
109
+
110
+ def __init__(
111
+ self,
112
+ *args: Any,
113
+ **kwargs: Any,
114
+ ) -> None:
115
+ """Creates a ``SocketIOInput`` object."""
116
+ from rasa.core.agent import Agent
117
+
118
+ super().__init__(*args, **kwargs)
119
+ self.agent: Optional[Agent] = None
120
+
121
+ self._register_tracker_update_hook()
122
+
123
+ def _register_tracker_update_hook(self) -> None:
124
+ plugin_manager().register(StudioTrackerUpdatePlugin(self))
125
+
126
+ async def on_tracker_updated(self, tracker: "DialogueStateTracker") -> None:
127
+ """Triggers a tracker update notification after a change to the tracker."""
128
+ await self.publish_tracker_update(tracker.sender_id, tracker_as_dump(tracker))
129
+
130
+ async def publish_tracker_update(self, sender_id: str, tracker_dump: Dict) -> None:
131
+ """Publishes a tracker update notification to the websocket."""
132
+ if not self.sio:
133
+ structlogger.error("studio_chat.on_tracker_updated.sio_not_initialized")
134
+ return
135
+ await self.sio.emit("tracker", tracker_dump, room=sender_id)
136
+
137
+ async def on_message_proxy(
138
+ self,
139
+ on_new_message: Callable[["UserMessage"], Awaitable[Any]],
140
+ message: "UserMessage",
141
+ ) -> None:
142
+ """Proxies the on_new_message call to the underlying channel.
143
+
144
+ Triggers a tracker update notification after processing the message.
145
+ """
146
+ await on_new_message(message)
147
+
148
+ if not self.agent:
149
+ structlogger.error("studio_chat.on_message_proxy.agent_not_initialized")
150
+ return
151
+
152
+ tracker = await self.agent.tracker_store.retrieve(message.sender_id)
153
+ if tracker is None:
154
+ structlogger.error("studio_chat.on_message_proxy.tracker_not_found")
155
+ return
156
+
157
+ await self.on_tracker_updated(tracker)
158
+
159
+ async def handle_tracker_update(self, sid: str, data: Dict) -> None:
160
+ from rasa.shared.core.trackers import DialogueStateTracker
161
+
162
+ structlogger.debug(
163
+ "studio_chat.sio.handle_tracker_update",
164
+ sid=sid,
165
+ sender_id=data["sender_id"],
166
+ )
167
+ if self.agent is None:
168
+ structlogger.error("studio_chat.sio.agent_not_initialized")
169
+ return None
170
+
171
+ if not (domain := self.agent.domain):
172
+ structlogger.error("studio_chat.sio.domain_not_initialized")
173
+ return None
174
+
175
+ async with self.agent.lock_store.lock(data["sender_id"]):
176
+ tracker = DialogueStateTracker.from_dict(
177
+ data["sender_id"], data["events"], domain.slots
178
+ )
179
+
180
+ # will override an existing tracker with the same id!
181
+ await self.agent.tracker_store.save(tracker)
182
+
183
+ processor = self.agent.processor
184
+ if processor and does_need_action_prediction(tracker):
185
+ output_channel = self.get_output_channel()
186
+
187
+ await processor._run_prediction_loop(output_channel, tracker)
188
+ await processor.run_anonymization_pipeline(tracker)
189
+ await self.agent.tracker_store.save(tracker)
190
+
191
+ await self.on_tracker_updated(tracker)
192
+
193
+ def blueprint(
194
+ self, on_new_message: Callable[["UserMessage"], Awaitable[Any]]
195
+ ) -> SocketBlueprint:
196
+ socket_blueprint = super().blueprint(
197
+ partial(self.on_message_proxy, on_new_message)
198
+ )
199
+
200
+ if not self.sio:
201
+ structlogger.error("studio_chat.blueprint.sio_not_initialized")
202
+ return socket_blueprint
203
+
204
+ @socket_blueprint.listener("after_server_start") # type: ignore[misc]
205
+ async def after_server_start(app: Sanic, _: asyncio.AbstractEventLoop) -> None:
206
+ self.agent = app.ctx.agent
207
+
208
+ @self.sio.on("update_tracker", namespace=self.namespace)
209
+ async def on_update_tracker(sid: Text, data: Dict) -> None:
210
+ await self.handle_tracker_update(sid, data)
211
+
212
+ return socket_blueprint