rasa-pro 3.11.4__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 (580) 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 +137 -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/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -2,6 +2,7 @@ import importlib.resources
2
2
  import json
3
3
  import re
4
4
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text
5
+
5
6
  import dotenv
6
7
  import structlog
7
8
  from jinja2 import Template
@@ -16,8 +17,8 @@ from rasa.core.constants import (
16
17
  )
17
18
  from rasa.core.information_retrieval import (
18
19
  InformationRetrieval,
19
- SearchResult,
20
20
  InformationRetrievalException,
21
+ SearchResult,
21
22
  create_from_endpoint_config,
22
23
  )
23
24
  from rasa.core.information_retrieval.faiss import FAISS_Store
@@ -34,9 +35,9 @@ from rasa.dialogue_understanding.patterns.internal_error import (
34
35
  )
35
36
  from rasa.dialogue_understanding.stack.frames import (
36
37
  DialogueStackFrame,
38
+ PatternFlowStackFrame,
37
39
  SearchStackFrame,
38
40
  )
39
- from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
40
41
  from rasa.engine.graph import ExecutionContext
41
42
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
42
43
  from rasa.engine.storage.resource import Resource
@@ -46,12 +47,12 @@ from rasa.graph_components.providers.responses_provider import Responses
46
47
  from rasa.shared.constants import (
47
48
  EMBEDDINGS_CONFIG_KEY,
48
49
  MODEL_CONFIG_KEY,
50
+ MODEL_GROUP_ID_CONFIG_KEY,
51
+ MODEL_NAME_CONFIG_KEY,
52
+ OPENAI_PROVIDER,
49
53
  PROMPT_CONFIG_KEY,
50
54
  PROVIDER_CONFIG_KEY,
51
- OPENAI_PROVIDER,
52
55
  TIMEOUT_CONFIG_KEY,
53
- MODEL_NAME_CONFIG_KEY,
54
- MODEL_GROUP_ID_CONFIG_KEY,
55
56
  )
56
57
  from rasa.shared.core.constants import (
57
58
  ACTION_CANCEL_FLOW,
@@ -59,15 +60,23 @@ from rasa.shared.core.constants import (
59
60
  DEFAULT_SLOT_NAMES,
60
61
  )
61
62
  from rasa.shared.core.domain import Domain
62
- from rasa.shared.core.events import Event, UserUttered, BotUttered
63
+ from rasa.shared.core.events import BotUttered, Event, UserUttered
63
64
  from rasa.shared.core.generator import TrackerWithCachedStates
64
65
  from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
65
- from rasa.shared.exceptions import RasaException, FileIOException
66
+ from rasa.shared.exceptions import FileIOException, RasaException
67
+ from rasa.shared.nlu.constants import (
68
+ KEY_COMPONENT_NAME,
69
+ KEY_LLM_RESPONSE_METADATA,
70
+ KEY_PROMPT_NAME,
71
+ KEY_USER_PROMPT,
72
+ PROMPTS,
73
+ )
66
74
  from rasa.shared.nlu.training_data.training_data import TrainingData
67
75
  from rasa.shared.providers.embedding._langchain_embedding_client_adapter import (
68
76
  _LangchainEmbeddingClientAdapter,
69
77
  )
70
78
  from rasa.shared.providers.llm.llm_client import LLMClient
79
+ from rasa.shared.providers.llm.llm_response import LLMResponse, measure_llm_latency
71
80
  from rasa.shared.utils.cli import print_error_and_exit
72
81
  from rasa.shared.utils.health_check.embeddings_health_check_mixin import (
73
82
  EmbeddingsHealthCheckMixin,
@@ -80,9 +89,9 @@ from rasa.shared.utils.llm import (
80
89
  embedder_factory,
81
90
  get_prompt_template,
82
91
  llm_factory,
92
+ resolve_model_client_config,
83
93
  sanitize_message_for_prompt,
84
94
  tracker_as_readable_transcript,
85
- resolve_model_client_config,
86
95
  )
87
96
  from rasa.telemetry import (
88
97
  track_enterprise_search_policy_predict,
@@ -92,6 +101,7 @@ from rasa.telemetry import (
92
101
 
93
102
  if TYPE_CHECKING:
94
103
  from langchain.schema.embeddings import Embeddings
104
+
95
105
  from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
96
106
 
97
107
  from rasa.utils.log_utils import log_llm
@@ -272,6 +282,43 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
272
282
  # Wrap the embedding client in the adapter
273
283
  return _LangchainEmbeddingClientAdapter(client)
274
284
 
285
+ @classmethod
286
+ def _add_prompt_and_llm_response_to_latest_message(
287
+ cls,
288
+ tracker: DialogueStateTracker,
289
+ prompt_name: str,
290
+ user_prompt: str,
291
+ llm_response: Optional[LLMResponse] = None,
292
+ ) -> None:
293
+ """Stores the prompt and LLMResponse metadata in the tracker.
294
+
295
+ Args:
296
+ tracker: The DialogueStateTracker containing the current conversation state.
297
+ prompt_name: A name identifying prompt usage.
298
+ user_prompt: The user prompt that was sent to the LLM.
299
+ llm_response: The response object from the LLM (None if no response).
300
+ """
301
+ from rasa.dialogue_understanding.utils import record_commands_and_prompts
302
+
303
+ if not record_commands_and_prompts:
304
+ return
305
+
306
+ if not tracker.latest_message:
307
+ return
308
+
309
+ parse_data = tracker.latest_message.parse_data
310
+ if PROMPTS not in parse_data:
311
+ parse_data[PROMPTS] = [] # type: ignore[literal-required]
312
+
313
+ prompt_data: Dict[Text, Any] = {
314
+ KEY_COMPONENT_NAME: cls.__name__,
315
+ KEY_PROMPT_NAME: prompt_name,
316
+ KEY_USER_PROMPT: user_prompt,
317
+ KEY_LLM_RESPONSE_METADATA: llm_response.to_dict() if llm_response else None,
318
+ }
319
+
320
+ parse_data[PROMPTS].append(prompt_data) # type: ignore[literal-required]
321
+
275
322
  def train( # type: ignore[override]
276
323
  self,
277
324
  training_trackers: List[TrackerWithCachedStates],
@@ -498,13 +545,27 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
498
545
 
499
546
  if self.use_llm:
500
547
  prompt = self._render_prompt(tracker, documents.results)
501
- llm_answer = await self._generate_llm_answer(llm, prompt)
548
+ llm_response = await self._generate_llm_answer(llm, prompt)
549
+ llm_response = LLMResponse.ensure_llm_response(llm_response)
550
+
551
+ self._add_prompt_and_llm_response_to_latest_message(
552
+ tracker=tracker,
553
+ prompt_name="enterprise_search_prompt",
554
+ user_prompt=prompt,
555
+ llm_response=llm_response,
556
+ )
557
+
558
+ if llm_response is None or not llm_response.choices:
559
+ logger.debug(f"{logger_key}.no_llm_response")
560
+ response = None
561
+ else:
562
+ llm_answer = llm_response.choices[0]
502
563
 
503
- if self.citation_enabled:
504
- llm_answer = self.post_process_citations(llm_answer)
564
+ if self.citation_enabled:
565
+ llm_answer = self.post_process_citations(llm_answer)
505
566
 
506
- logger.debug(f"{logger_key}.llm_answer", llm_answer=llm_answer)
507
- response = llm_answer
567
+ logger.debug(f"{logger_key}.llm_answer", llm_answer=llm_answer)
568
+ response = llm_answer
508
569
  else:
509
570
  response = documents.results[0].metadata.get("answer", None)
510
571
  if not response:
@@ -516,7 +577,6 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
516
577
  "enterprise_search_policy.predict_action_probabilities.no_llm",
517
578
  search_results=documents,
518
579
  )
519
-
520
580
  if response is None:
521
581
  return self._create_prediction_internal_error(domain, tracker)
522
582
 
@@ -579,12 +639,21 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
579
639
  )
580
640
  return prompt
581
641
 
642
+ @measure_llm_latency
582
643
  async def _generate_llm_answer(
583
644
  self, llm: LLMClient, prompt: Text
584
- ) -> Optional[Text]:
645
+ ) -> Optional[LLMResponse]:
646
+ """Fetches an LLM completion for the provided prompt.
647
+
648
+ Args:
649
+ llm: The LLM client used to get the completion.
650
+ prompt: The prompt text to send to the model.
651
+
652
+ Returns:
653
+ An LLMResponse object, or None if the call fails.
654
+ """
585
655
  try:
586
- llm_response = await llm.acompletion(prompt)
587
- llm_answer = llm_response.choices[0]
656
+ return await llm.acompletion(prompt)
588
657
  except Exception as e:
589
658
  # unfortunately, langchain does not wrap LLM exceptions which means
590
659
  # we have to catch all exceptions here
@@ -592,9 +661,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
592
661
  "enterprise_search_policy._generate_llm_answer.llm_error",
593
662
  error=e,
594
663
  )
595
- llm_answer = None
596
-
597
- return llm_answer
664
+ return None
598
665
 
599
666
  def _create_prediction(
600
667
  self,
@@ -692,7 +759,6 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
692
759
  **kwargs: Any,
693
760
  ) -> "EnterpriseSearchPolicy":
694
761
  """Loads a trained policy (see parent class for full docstring)."""
695
-
696
762
  # Perform health checks for both LLM and embeddings client configs
697
763
  cls._perform_health_checks(config, "enterprise_search_policy.load")
698
764
 
@@ -4,7 +4,7 @@ If the answer is not known or cannot be determined from the provided documents o
4
4
  Use the following documents to answer the question:
5
5
  {% for doc in docs %}
6
6
  {{ loop.cycle("*")}}. {{ doc.metadata }}
7
- {{ doc.page_content }}
7
+ {{ doc.text }}
8
8
  {% endfor %}
9
9
 
10
10
  {% if citation_enabled %}
@@ -1,9 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, Text, List, Optional
4
- from rasa.core.policies.flows import flow_executor
3
+ from typing import Any, Dict, List, Optional, Text
4
+
5
+ import structlog
5
6
 
7
+ from rasa.core.constants import (
8
+ FLOW_POLICY_PRIORITY,
9
+ POLICY_MAX_HISTORY,
10
+ POLICY_PRIORITY,
11
+ )
12
+ from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
13
+ from rasa.core.policies.flows import flow_executor
6
14
  from rasa.core.policies.flows.flow_exceptions import FlowCircuitBreakerTrippedException
15
+ from rasa.core.policies.policy import Policy, PolicyPrediction
7
16
  from rasa.dialogue_understanding.patterns.internal_error import (
8
17
  InternalErrorPatternFlowStackFrame,
9
18
  )
@@ -14,27 +23,17 @@ from rasa.dialogue_understanding.stack.frames import (
14
23
  from rasa.dialogue_understanding.stack.utils import (
15
24
  end_top_user_flow,
16
25
  )
17
-
18
- from rasa.core.constants import (
19
- FLOW_POLICY_PRIORITY,
20
- POLICY_MAX_HISTORY,
21
- POLICY_PRIORITY,
22
- )
23
-
24
- from rasa.shared.core.events import Event
25
- from rasa.shared.core.flows import FlowsList
26
- from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
27
- from rasa.core.policies.policy import Policy, PolicyPrediction
28
26
  from rasa.engine.graph import ExecutionContext
29
27
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
30
28
  from rasa.engine.storage.resource import Resource
31
29
  from rasa.engine.storage.storage import ModelStorage
32
30
  from rasa.shared.core.domain import Domain
31
+ from rasa.shared.core.events import Event
32
+ from rasa.shared.core.flows import FlowsList
33
33
  from rasa.shared.core.generator import TrackerWithCachedStates
34
34
  from rasa.shared.core.trackers import (
35
35
  DialogueStateTracker,
36
36
  )
37
- import structlog
38
37
 
39
38
  structlogger = structlog.get_logger()
40
39
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, Text, List, Optional
3
+ from typing import Any, Dict, List, Optional, Text
4
4
 
5
5
  import structlog
6
6
  from jinja2 import Template
@@ -9,20 +9,21 @@ from structlog.contextvars import (
9
9
  bound_contextvars,
10
10
  )
11
11
 
12
- from rasa.core.constants import STEP_ID_METADATA_KEY, ACTIVE_FLOW_METADATA_KEY
12
+ from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
13
13
  from rasa.core.policies.flows.flow_exceptions import (
14
14
  FlowCircuitBreakerTrippedException,
15
15
  FlowException,
16
16
  NoNextStepInFlowException,
17
17
  )
18
18
  from rasa.core.policies.flows.flow_step_result import (
19
- FlowActionPrediction,
20
19
  ContinueFlowWithNextStep,
20
+ FlowActionPrediction,
21
21
  FlowStepResult,
22
22
  PauseFlowReturnPrediction,
23
23
  )
24
24
  from rasa.dialogue_understanding.commands import CancelFlowCommand
25
25
  from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
26
+ from rasa.dialogue_understanding.patterns.clarify import ClarifyPatternFlowStackFrame
26
27
  from rasa.dialogue_understanding.patterns.collect_information import (
27
28
  CollectInformationPatternFlowStackFrame,
28
29
  )
@@ -50,9 +51,12 @@ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
50
51
  )
51
52
  from rasa.dialogue_understanding.stack.utils import (
52
53
  top_user_flow_frame,
54
+ user_flows_on_the_stack,
53
55
  )
54
56
  from rasa.shared.constants import RASA_PATTERN_HUMAN_HANDOFF
55
- from rasa.shared.core.constants import ACTION_LISTEN_NAME, SlotMappingType
57
+ from rasa.shared.core.constants import (
58
+ ACTION_LISTEN_NAME,
59
+ )
56
60
  from rasa.shared.core.events import (
57
61
  Event,
58
62
  FlowCompleted,
@@ -67,22 +71,22 @@ from rasa.shared.core.flows.flow import (
67
71
  FlowStep,
68
72
  )
69
73
  from rasa.shared.core.flows.flow_step_links import (
70
- StaticFlowStepLink,
71
- IfFlowStepLink,
72
74
  ElseFlowStepLink,
75
+ IfFlowStepLink,
76
+ StaticFlowStepLink,
73
77
  )
74
78
  from rasa.shared.core.flows.steps import (
75
79
  ActionFlowStep,
76
- SetSlotsFlowStep,
77
- LinkFlowStep,
78
- ContinueFlowStep,
79
- EndFlowStep,
80
80
  CallFlowStep,
81
81
  CollectInformationFlowStep,
82
+ ContinueFlowStep,
83
+ EndFlowStep,
84
+ LinkFlowStep,
82
85
  NoOperationFlowStep,
86
+ SetSlotsFlowStep,
83
87
  )
84
- from rasa.shared.core.flows.steps.collect import SlotRejection
85
- from rasa.shared.core.slots import Slot
88
+ from rasa.shared.core.flows.steps.constants import START_STEP
89
+ from rasa.shared.core.slots import Slot, SlotRejection
86
90
  from rasa.shared.core.trackers import (
87
91
  DialogueStateTracker,
88
92
  )
@@ -238,7 +242,10 @@ def events_for_collect_step_execution(
238
242
 
239
243
 
240
244
  def trigger_pattern_continue_interrupted(
241
- current_frame: DialogueStackFrame, stack: DialogueStack, flows: FlowsList
245
+ current_frame: DialogueStackFrame,
246
+ stack: DialogueStack,
247
+ flows: FlowsList,
248
+ tracker: DialogueStateTracker,
242
249
  ) -> List[Event]:
243
250
  """Trigger the pattern to continue an interrupted flow if needed."""
244
251
  events: List[Event] = []
@@ -261,7 +268,9 @@ def trigger_pattern_continue_interrupted(
261
268
  ):
262
269
  stack.push(
263
270
  ContinueInterruptedPatternFlowStackFrame(
264
- previous_flow_name=interrupted_user_flow.readable_name(),
271
+ previous_flow_name=interrupted_user_flow.readable_name(
272
+ language=tracker.current_language
273
+ ),
265
274
  )
266
275
  )
267
276
  events.append(
@@ -271,6 +280,33 @@ def trigger_pattern_continue_interrupted(
271
280
  return events
272
281
 
273
282
 
283
+ def trigger_pattern_clarification(
284
+ current_frame: DialogueStackFrame, stack: DialogueStack, flows: FlowsList
285
+ ) -> None:
286
+ """Trigger the pattern to clarify which topic to continue if needed."""
287
+ if not isinstance(current_frame, UserFlowStackFrame):
288
+ return None
289
+
290
+ if current_frame.frame_type in [
291
+ FlowStackFrameType.CALL,
292
+ FlowStackFrameType.INTERRUPT,
293
+ ]:
294
+ # we want to return to the flow that called
295
+ # the current flow or the flow that was interrupted
296
+ # by the current flow
297
+ return None
298
+
299
+ pending_flows = [
300
+ flows.flow_by_id(frame.flow_id)
301
+ for frame in stack.frames
302
+ if isinstance(frame, UserFlowStackFrame)
303
+ and frame.flow_id != current_frame.flow_id
304
+ ]
305
+
306
+ flow_names = [flow.readable_name() for flow in pending_flows if flow is not None]
307
+ stack.push(ClarifyPatternFlowStackFrame(names=flow_names))
308
+
309
+
274
310
  def trigger_pattern_completed(
275
311
  current_frame: DialogueStackFrame, stack: DialogueStack, flows: FlowsList
276
312
  ) -> None:
@@ -282,6 +318,9 @@ def trigger_pattern_completed(
282
318
  or isinstance(current_frame, SearchPatternFlowStackFrame)
283
319
  ):
284
320
  completed_flow = current_frame.flow(flows)
321
+ if not completed_flow.run_pattern_completed:
322
+ return
323
+
285
324
  completed_flow_name = completed_flow.readable_name() if completed_flow else None
286
325
  stack.push(
287
326
  CompletedPatternFlowStackFrame(
@@ -316,7 +355,7 @@ def reset_scoped_slots(
316
355
  def _reset_slot(slot_name: Text, dialogue_tracker: DialogueStateTracker) -> None:
317
356
  slot = dialogue_tracker.slots.get(slot_name, None)
318
357
  initial_value = slot.initial_value if slot else None
319
- events.append(SlotSet(slot_name, initial_value))
358
+ events.append(SlotSet(slot_name, initial_value, metadata={"reset": True}))
320
359
 
321
360
  if (
322
361
  isinstance(current_frame, UserFlowStackFrame)
@@ -448,6 +487,7 @@ def advance_flows_until_next_action(
448
487
  tracker,
449
488
  available_actions,
450
489
  flows,
490
+ previous_step_id,
451
491
  )
452
492
  new_events = step_result.events
453
493
  if (
@@ -464,6 +504,9 @@ def advance_flows_until_next_action(
464
504
  new_events.insert(
465
505
  idx, FlowCompleted(active_frame.flow_id, previous_step_id)
466
506
  )
507
+ attach_stack_metadata_to_events(
508
+ next_step.id, current_flow.id, new_events
509
+ )
467
510
  tracker.update_stack(step_stack)
468
511
  tracker.update_with_events(new_events)
469
512
 
@@ -535,36 +578,15 @@ def cancel_flow_and_push_internal_error(stack: DialogueStack, flow_name: str) ->
535
578
  stack.push(InternalErrorPatternFlowStackFrame())
536
579
 
537
580
 
538
- def validate_custom_slot_mappings(
539
- step: CollectInformationFlowStep,
540
- stack: DialogueStack,
541
- tracker: DialogueStateTracker,
542
- available_actions: List[str],
543
- flow_name: str,
544
- ) -> bool:
545
- """Validate a slot with custom mappings.
546
-
547
- If invalid, trigger pattern_internal_error and return False.
548
- """
549
- slot = tracker.slots.get(step.collect, None)
550
- slot_mappings = slot.mappings if slot else []
551
- for mapping in slot_mappings:
552
- if (
553
- mapping.get("type") == SlotMappingType.CUSTOM.value
554
- and mapping.get("action") is None
555
- ):
556
- # this is a slot that must be filled by a custom action
557
- # check if collect_action exists
558
- if step.collect_action not in available_actions:
559
- structlogger.error(
560
- "flow.step.run.collect_action_not_found_for_custom_slot_mapping",
561
- action=step.collect_action,
562
- collect=step.collect,
563
- )
564
- cancel_flow_and_push_internal_error(stack, flow_name)
565
- return False
566
-
567
- return True
581
+ def attach_stack_metadata_to_events(
582
+ step_id: str,
583
+ flow_id: str,
584
+ events: List[Event],
585
+ ) -> None:
586
+ """Attach the stack metadata to the events."""
587
+ for event in events:
588
+ event.metadata[STEP_ID_METADATA_KEY] = step_id
589
+ event.metadata[ACTIVE_FLOW_METADATA_KEY] = flow_id
568
590
 
569
591
 
570
592
  def run_step(
@@ -574,6 +596,7 @@ def run_step(
574
596
  tracker: DialogueStateTracker,
575
597
  available_actions: List[str],
576
598
  flows: FlowsList,
599
+ previous_step_id: str,
577
600
  ) -> FlowStepResult:
578
601
  """Run a single step of a flow.
579
602
 
@@ -591,12 +614,19 @@ def run_step(
591
614
  tracker: The tracker to run the step on.
592
615
  available_actions: The actions that are available in the domain.
593
616
  flows: All flows.
617
+ previous_step_id: The ID of the previous step.
594
618
 
595
619
  Returns:
596
620
  A result of running the step describing where to transition to.
597
621
  """
598
622
  initial_events: List[Event] = []
599
- if step == flow.first_step_in_flow():
623
+ if previous_step_id == START_STEP:
624
+ # if the previous step id is the start step, we need to add a flow
625
+ # started event to the initial events.
626
+ # we can't use the current step to check this, as the current step is the
627
+ # first step in the flow -> other steps might link to this flow, so the
628
+ # only reliable way to check if we are starting a new flow is checking for
629
+ # the START_STEP meta step
600
630
  initial_events.append(FlowStarted(flow.id, metadata=stack.current_context()))
601
631
 
602
632
  if isinstance(step, CollectInformationFlowStep):
@@ -645,7 +675,15 @@ def _run_end_step(
645
675
  structlogger.debug("flow.step.run.flow_end")
646
676
  current_frame = stack.pop()
647
677
  trigger_pattern_completed(current_frame, stack, flows)
648
- resumed_events = trigger_pattern_continue_interrupted(current_frame, stack, flows)
678
+ resumed_events = []
679
+ if len(user_flows_on_the_stack(stack)) > 1:
680
+ # if there are more user flows on the stack,
681
+ # we need to trigger the pattern clarify
682
+ trigger_pattern_clarification(current_frame, stack, flows)
683
+ else:
684
+ resumed_events = trigger_pattern_continue_interrupted(
685
+ current_frame, stack, flows, tracker
686
+ )
649
687
  reset_events: List[Event] = reset_scoped_slots(current_frame, flow, tracker)
650
688
  return ContinueFlowWithNextStep(
651
689
  events=initial_events + reset_events + resumed_events, has_flow_ended=True
@@ -736,14 +774,6 @@ def _run_collect_information_step(
736
774
  # if we return any other FlowStepResult, the assistant will stay silent
737
775
  # instead of triggering the internal error pattern
738
776
  return ContinueFlowWithNextStep(events=initial_events)
739
- is_mapping_valid = validate_custom_slot_mappings(
740
- step, stack, tracker, available_actions, flow_name
741
- )
742
-
743
- if not is_mapping_valid:
744
- # if we return any other FlowStepResult, the assistant will stay silent
745
- # instead of triggering the internal error pattern
746
- return ContinueFlowWithNextStep(events=initial_events)
747
777
 
748
778
  structlogger.debug("flow.step.run.collect")
749
779
  trigger_pattern_ask_collect_information(
@@ -1,7 +1,7 @@
1
1
  import importlib.resources
2
2
  import math
3
3
  from dataclasses import dataclass, field
4
- from typing import Any, Dict, List, Optional, Set, TYPE_CHECKING, Text, Tuple
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Text, Tuple
5
5
 
6
6
  import structlog
7
7
  import tiktoken
@@ -30,19 +30,18 @@ from rasa.engine.storage.storage import ModelStorage
30
30
  from rasa.graph_components.providers.forms_provider import Forms
31
31
  from rasa.graph_components.providers.responses_provider import Responses
32
32
  from rasa.shared.constants import (
33
- REQUIRED_SLOTS_KEY,
34
33
  EMBEDDINGS_CONFIG_KEY,
35
34
  LLM_CONFIG_KEY,
36
35
  MODEL_CONFIG_KEY,
36
+ MODEL_GROUP_ID_CONFIG_KEY,
37
37
  MODEL_NAME_CONFIG_KEY,
38
+ OPENAI_PROVIDER,
38
39
  PROMPT_CONFIG_KEY,
39
40
  PROVIDER_CONFIG_KEY,
40
- OPENAI_PROVIDER,
41
+ REQUIRED_SLOTS_KEY,
41
42
  TIMEOUT_CONFIG_KEY,
42
- MODEL_GROUP_ID_CONFIG_KEY,
43
43
  )
44
- from rasa.shared.core.constants import ACTION_LISTEN_NAME
45
- from rasa.shared.core.constants import ACTION_TRIGGER_CHITCHAT
44
+ from rasa.shared.core.constants import ACTION_LISTEN_NAME, ACTION_TRIGGER_CHITCHAT
46
45
  from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
47
46
  from rasa.shared.core.events import (
48
47
  ActionExecuted,
@@ -75,9 +74,9 @@ from rasa.shared.utils.llm import (
75
74
  embedder_factory,
76
75
  get_prompt_template,
77
76
  llm_factory,
77
+ resolve_model_client_config,
78
78
  sanitize_message_for_prompt,
79
79
  tracker_as_readable_transcript,
80
- resolve_model_client_config,
81
80
  )
82
81
  from rasa.utils.log_utils import log_llm
83
82
  from rasa.utils.ml_utils import (
@@ -1,39 +1,41 @@
1
1
  from __future__ import annotations
2
- import copy
3
- import zlib
4
2
 
5
3
  import base64
4
+ import copy
6
5
  import json
7
6
  import logging
8
- import structlog
7
+ import zlib
8
+ from pathlib import Path
9
+ from typing import Any, Dict, List, Optional, Text
9
10
 
11
+ import structlog
10
12
  from tqdm import tqdm
11
- from typing import Optional, Any, Dict, List, Text
12
- from pathlib import Path
13
13
 
14
- import rasa.utils.io
15
14
  import rasa.shared.utils.io
15
+ import rasa.utils.io
16
+ from rasa.core.constants import (
17
+ DEFAULT_MAX_HISTORY,
18
+ MEMOIZATION_POLICY_PRIORITY,
19
+ POLICY_MAX_HISTORY,
20
+ POLICY_PRIORITY,
21
+ )
22
+ from rasa.core.featurizers.tracker_featurizers import (
23
+ FEATURIZER_FILE,
24
+ MaxHistoryTrackerFeaturizer,
25
+ TrackerFeaturizer,
26
+ )
27
+ from rasa.core.policies.policy import Policy, PolicyPrediction, SupportedData
16
28
  from rasa.engine.graph import ExecutionContext
17
29
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
18
30
  from rasa.engine.storage.resource import Resource
19
31
  from rasa.engine.storage.storage import ModelStorage
20
- from rasa.shared.core.domain import State, Domain
32
+ from rasa.shared.core.constants import ACTION_LISTEN_NAME
33
+ from rasa.shared.core.domain import Domain, State
21
34
  from rasa.shared.core.events import ActionExecuted
22
- from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
23
- from rasa.core.featurizers.tracker_featurizers import MaxHistoryTrackerFeaturizer
24
- from rasa.core.featurizers.tracker_featurizers import FEATURIZER_FILE
25
- from rasa.shared.exceptions import FileIOException
26
- from rasa.core.policies.policy import PolicyPrediction, Policy, SupportedData
27
- from rasa.shared.core.trackers import DialogueStateTracker
28
35
  from rasa.shared.core.generator import TrackerWithCachedStates
36
+ from rasa.shared.core.trackers import DialogueStateTracker
37
+ from rasa.shared.exceptions import FileIOException
29
38
  from rasa.shared.utils.io import is_logging_disabled
30
- from rasa.core.constants import (
31
- MEMOIZATION_POLICY_PRIORITY,
32
- DEFAULT_MAX_HISTORY,
33
- POLICY_MAX_HISTORY,
34
- POLICY_PRIORITY,
35
- )
36
- from rasa.shared.core.constants import ACTION_LISTEN_NAME
37
39
 
38
40
  logger = logging.getLogger(__name__)
39
41
  structlogger = structlog.get_logger()