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
rasa/core/lock.py CHANGED
@@ -1,9 +1,8 @@
1
1
  import json
2
2
  import logging
3
- from collections import deque
4
-
5
3
  import time
6
- from typing import Text, Optional, Union, Deque, Dict, Any
4
+ from collections import deque
5
+ from typing import Any, Deque, Dict, Optional, Text, Union
7
6
 
8
7
  logger = logging.getLogger(__name__)
9
8
 
rasa/core/lock_store.py CHANGED
@@ -1,16 +1,16 @@
1
1
  from __future__ import annotations
2
+
2
3
  import asyncio
3
- from contextlib import asynccontextmanager
4
4
  import json
5
5
  import logging
6
6
  import os
7
-
7
+ from contextlib import asynccontextmanager
8
8
  from typing import AsyncGenerator, Dict, Optional, Text, Union
9
9
 
10
- from rasa.shared.exceptions import RasaException, ConnectionException
11
10
  import rasa.shared.utils.common
12
11
  from rasa.core.constants import DEFAULT_LOCK_LIFETIME
13
12
  from rasa.core.lock import TicketLock
13
+ from rasa.shared.exceptions import ConnectionException, RasaException
14
14
  from rasa.utils.endpoints import EndpointConfig
15
15
 
16
16
  logger = logging.getLogger(__name__)
rasa/core/migrate.py CHANGED
@@ -1,28 +1,31 @@
1
1
  import copy
2
2
  import shutil
3
3
  from pathlib import Path
4
- from typing import List, Dict, Text, Any, Tuple, Optional, Union
4
+ from typing import Any, Dict, List, Optional, Text, Tuple, Union
5
5
 
6
6
  from ruamel.yaml.scalarstring import DoubleQuotedScalarString
7
7
 
8
- import rasa.shared.utils.io
9
8
  import rasa.shared.utils.cli
10
- from rasa.shared.constants import REQUIRED_SLOTS_KEY, IGNORED_INTENTS
9
+ import rasa.shared.utils.io
10
+ from rasa.shared.constants import (
11
+ IGNORED_INTENTS,
12
+ LATEST_TRAINING_DATA_FORMAT_VERSION,
13
+ REQUIRED_SLOTS_KEY,
14
+ )
11
15
  from rasa.shared.core.constants import (
12
16
  ACTIVE_LOOP,
17
+ KEY_MAPPING_TYPE,
13
18
  REQUESTED_SLOT,
14
- SlotMappingType,
15
- MAPPING_TYPE,
16
19
  SLOT_MAPPINGS,
20
+ SlotMappingType,
17
21
  )
18
- from rasa.shared.constants import LATEST_TRAINING_DATA_FORMAT_VERSION
19
- from rasa.shared.core.domain import KEY_ENTITIES, KEY_SLOTS, KEY_FORMS, Domain
22
+ from rasa.shared.core.domain import KEY_ENTITIES, KEY_FORMS, KEY_SLOTS, Domain
20
23
  from rasa.shared.exceptions import RasaException
21
24
  from rasa.shared.utils.yaml import (
22
25
  KEY_TRAINING_DATA_FORMAT_VERSION,
23
26
  read_yaml,
24
- write_yaml,
25
27
  read_yaml_file,
28
+ write_yaml,
26
29
  )
27
30
 
28
31
  ORIGINAL_DOMAIN = "original_domain" # not a default, fixed
@@ -40,7 +43,7 @@ def _create_back_up(domain_file: Path, backup_location: Path) -> Dict[Text, Any]
40
43
  def _get_updated_mapping_condition(
41
44
  condition: Dict[Text, Text], mapping: Dict[Text, Any], slot_name: Text
42
45
  ) -> Dict[Text, Text]:
43
- if mapping.get(MAPPING_TYPE) not in [
46
+ if mapping.get(KEY_MAPPING_TYPE) not in [
44
47
  str(SlotMappingType.FROM_ENTITY),
45
48
  str(SlotMappingType.FROM_TRIGGER_INTENT),
46
49
  ]:
rasa/core/nlg/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
+ from rasa.core.nlg.callback import CallbackNaturalLanguageGenerator # noqa: F401
1
2
  from rasa.core.nlg.generator import NaturalLanguageGenerator # noqa: F401
2
3
  from rasa.core.nlg.response import TemplatedNaturalLanguageGenerator # noqa: F401
3
- from rasa.core.nlg.callback import CallbackNaturalLanguageGenerator # noqa: F401
rasa/core/nlg/callback.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  import logging
3
- from typing import List, Text, Any, Dict, Optional
3
+ from typing import Any, Dict, List, Optional, Text
4
4
 
5
5
  from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
6
6
  from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
@@ -100,8 +100,7 @@ class CallbackNaturalLanguageGenerator(NaturalLanguageGenerator):
100
100
  @staticmethod
101
101
  def validate_response(content: Optional[Dict[Text, Any]]) -> bool:
102
102
  """Validate the NLG response. Raises exception on failure."""
103
- from jsonschema import validate
104
- from jsonschema import ValidationError
103
+ from jsonschema import ValidationError, validate
105
104
 
106
105
  try:
107
106
  if content is None or content == "":
@@ -2,22 +2,31 @@ from typing import Any, Dict, Optional, Text
2
2
 
3
3
  import structlog
4
4
  from jinja2 import Template
5
+
5
6
  from rasa import telemetry
6
7
  from rasa.core.nlg.response import TemplatedNaturalLanguageGenerator
7
8
  from rasa.core.nlg.summarize import summarize_conversation
8
9
  from rasa.shared.constants import (
9
10
  LLM_CONFIG_KEY,
10
11
  MODEL_CONFIG_KEY,
12
+ MODEL_GROUP_ID_CONFIG_KEY,
11
13
  MODEL_NAME_CONFIG_KEY,
14
+ OPENAI_PROVIDER,
12
15
  PROMPT_CONFIG_KEY,
13
16
  PROVIDER_CONFIG_KEY,
14
- OPENAI_PROVIDER,
15
17
  TIMEOUT_CONFIG_KEY,
16
- MODEL_GROUP_ID_CONFIG_KEY,
17
18
  )
18
19
  from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
19
20
  from rasa.shared.core.events import BotUttered, UserUttered
20
21
  from rasa.shared.core.trackers import DialogueStateTracker
22
+ from rasa.shared.nlu.constants import (
23
+ KEY_COMPONENT_NAME,
24
+ KEY_LLM_RESPONSE_METADATA,
25
+ KEY_PROMPT_NAME,
26
+ KEY_USER_PROMPT,
27
+ PROMPTS,
28
+ )
29
+ from rasa.shared.providers.llm.llm_response import LLMResponse, measure_llm_latency
21
30
  from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
22
31
  from rasa.shared.utils.llm import (
23
32
  DEFAULT_OPENAI_GENERATE_MODEL_NAME,
@@ -27,8 +36,6 @@ from rasa.shared.utils.llm import (
27
36
  get_prompt_template,
28
37
  llm_factory,
29
38
  resolve_model_client_config,
30
- )
31
- from rasa.shared.utils.llm import (
32
39
  tracker_as_readable_transcript,
33
40
  )
34
41
  from rasa.utils.endpoints import EndpointConfig
@@ -57,7 +64,7 @@ DEFAULT_LLM_CONFIG = {
57
64
  DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE = """The following is a conversation with
58
65
  an AI assistant. The assistant is helpful, creative, clever, and very friendly.
59
66
  Rephrase the suggested AI response staying close to the original message and retaining
60
- its meaning. Use simple english.
67
+ its meaning. Use simple {{language}}.
61
68
 
62
69
  Context / previous conversation with the user:
63
70
  {{history}}
@@ -124,6 +131,55 @@ class ContextualResponseRephraser(
124
131
  ContextualResponseRephraser.__name__,
125
132
  )
126
133
 
134
+ @classmethod
135
+ def _add_prompt_and_llm_metadata_to_response(
136
+ cls,
137
+ response: Dict[str, Any],
138
+ prompt_name: str,
139
+ user_prompt: str,
140
+ llm_response: Optional["LLMResponse"] = None,
141
+ ) -> Dict[str, Any]:
142
+ """Stores the prompt and LLMResponse metadata to response.
143
+
144
+ Args:
145
+ response: The response to add the prompt and LLMResponse metadata to.
146
+ prompt_name: A name identifying prompt usage.
147
+ user_prompt: The user prompt that was sent to the LLM.
148
+ llm_response: The response object from the LLM (None if no response).
149
+ """
150
+ from rasa.dialogue_understanding.utils import record_commands_and_prompts
151
+
152
+ if not record_commands_and_prompts:
153
+ return response
154
+
155
+ prompt_data: Dict[Text, Any] = {
156
+ KEY_COMPONENT_NAME: cls.__name__,
157
+ KEY_PROMPT_NAME: prompt_name,
158
+ KEY_USER_PROMPT: user_prompt,
159
+ KEY_LLM_RESPONSE_METADATA: llm_response.to_dict() if llm_response else None,
160
+ }
161
+
162
+ prompts = response.get(PROMPTS, [])
163
+ prompts.append(prompt_data)
164
+ response[PROMPTS] = prompts
165
+ return response
166
+
167
+ @staticmethod
168
+ def get_language_label(tracker: DialogueStateTracker) -> str:
169
+ """Fetches the label of the language to be used for the rephraser.
170
+
171
+ Args:
172
+ tracker: The tracker to get the language from.
173
+
174
+ Returns:
175
+ The label of the current language, or "English" if no language is set.
176
+ """
177
+ return (
178
+ tracker.current_language.label
179
+ if tracker.current_language
180
+ else tracker.default_language.label
181
+ )
182
+
127
183
  def _last_message_if_human(self, tracker: DialogueStateTracker) -> Optional[str]:
128
184
  """Returns the latest message from the tracker.
129
185
 
@@ -142,20 +198,21 @@ class ContextualResponseRephraser(
142
198
  return None
143
199
  return None
144
200
 
145
- async def _generate_llm_response(self, prompt: str) -> Optional[str]:
146
- """Use LLM to generate a response.
201
+ @measure_llm_latency
202
+ async def _generate_llm_response(self, prompt: str) -> Optional[LLMResponse]:
203
+ """Use LLM to generate a response, returning an LLMResponse object
204
+ containing both the generated text (choices) and metadata.
147
205
 
148
206
  Args:
149
- prompt: the prompt to send to the LLM
207
+ prompt: The prompt to send to the LLM.
150
208
 
151
209
  Returns:
152
- generated text
210
+ An LLMResponse object if successful, otherwise None.
153
211
  """
154
212
  llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
155
213
 
156
214
  try:
157
- llm_response = await llm.acompletion(prompt)
158
- return llm_response.choices[0]
215
+ return await llm.acompletion(prompt)
159
216
  except Exception as e:
160
217
  # unfortunately, langchain does not wrap LLM exceptions which means
161
218
  # we have to catch all exceptions here
@@ -240,6 +297,7 @@ class ContextualResponseRephraser(
240
297
  suggested_response=response_text,
241
298
  current_input=current_input,
242
299
  slots=tracker.current_slot_values(),
300
+ language=self.get_language_label(tracker),
243
301
  )
244
302
  log_llm(
245
303
  logger=structlogger,
@@ -255,11 +313,21 @@ class ContextualResponseRephraser(
255
313
  or self.llm_property(MODEL_NAME_CONFIG_KEY),
256
314
  llm_model_group_id=self.llm_property(MODEL_GROUP_ID_CONFIG_KEY),
257
315
  )
258
- if not (updated_text := await self._generate_llm_response(prompt)):
259
- # If the LLM fails to generate a response, we
260
- # return the original response.
316
+ llm_response = await self._generate_llm_response(prompt)
317
+ llm_response = LLMResponse.ensure_llm_response(llm_response)
318
+
319
+ response = self._add_prompt_and_llm_metadata_to_response(
320
+ response=response,
321
+ prompt_name="rephrase_prompt",
322
+ user_prompt=prompt,
323
+ llm_response=llm_response,
324
+ )
325
+
326
+ if not (llm_response and llm_response.choices and llm_response.choices[0]):
327
+ # If the LLM fails to generate a response, return the original response.
261
328
  return response
262
329
 
330
+ updated_text = llm_response.choices[0]
263
331
  structlogger.debug(
264
332
  "nlg.rewrite.complete",
265
333
  response_text=response_text,
@@ -1,14 +1,17 @@
1
- import logging
2
- from typing import List, Optional, Union, Text, Any, Dict
1
+ from typing import Any, Dict, List, Optional, Text, Union
2
+
3
+ import structlog
4
+ from jinja2 import Template
5
+ from pypred import Predicate
3
6
 
4
7
  import rasa.shared.utils.common
5
8
  import rasa.shared.utils.io
6
9
  from rasa.shared.constants import CHANNEL, RESPONSE_CONDITION
7
10
  from rasa.shared.core.domain import Domain
8
- from rasa.utils.endpoints import EndpointConfig
9
11
  from rasa.shared.core.trackers import DialogueStateTracker
12
+ from rasa.utils.endpoints import EndpointConfig
10
13
 
11
- logger = logging.getLogger(__name__)
14
+ structlogger = structlog.get_logger()
12
15
 
13
16
 
14
17
  class NaturalLanguageGenerator:
@@ -74,7 +77,11 @@ def _create_from_endpoint_config(
74
77
  else:
75
78
  nlg = _load_from_module_name_in_endpoint_config(endpoint_config, domain)
76
79
 
77
- logger.debug(f"Instantiated NLG to '{nlg.__class__.__name__}'.")
80
+ structlogger.debug(
81
+ "rasa.core.nlg.generator.create",
82
+ nlg_class_name=nlg.__class__.__name__,
83
+ event_info=f"Instantiated NLG to '{nlg.__class__.__name__}'.",
84
+ )
78
85
  return nlg
79
86
 
80
87
 
@@ -112,18 +119,15 @@ class ResponseVariationFilter:
112
119
  ) -> bool:
113
120
  """Checks if the conditional response variation matches the filled slots."""
114
121
  constraints = response.get(RESPONSE_CONDITION, [])
115
- for constraint in constraints:
116
- name = constraint["name"]
117
- value = constraint["value"]
118
- filled_slots_value = filled_slots.get(name)
119
- if isinstance(filled_slots_value, str) and isinstance(value, str):
120
- if filled_slots_value.casefold() != value.casefold():
122
+ if isinstance(constraints, str) and not _evaluate_predicate(
123
+ constraints, filled_slots
124
+ ):
125
+ return False
126
+
127
+ elif isinstance(constraints, list):
128
+ for constraint in constraints:
129
+ if not _evaluate_and_deprecate_condition(constraint, filled_slots):
121
130
  return False
122
- # slot values can be of different data types
123
- # such as int, float, bool, etc. hence, this check
124
- # executes when slot values are not strings
125
- elif filled_slots_value != value:
126
- return False
127
131
 
128
132
  return True
129
133
 
@@ -180,7 +184,21 @@ class ResponseVariationFilter:
180
184
  if conditional_no_channel:
181
185
  return conditional_no_channel
182
186
 
183
- return default_no_channel
187
+ if default_no_channel:
188
+ return default_no_channel
189
+
190
+ # if there is no response variation selected,
191
+ # return the internal error response to prevent
192
+ # the bot from staying silent
193
+ structlogger.error(
194
+ "rasa.core.nlg.generator.responses_for_utter_action.no_response",
195
+ utter_action=utter_action,
196
+ event_info=f"No response variation selected for the predicted "
197
+ f"utterance {utter_action}. Please check you have provided "
198
+ f"a default variation and that all the conditions are valid. "
199
+ f"Returning the internal error response.",
200
+ )
201
+ return self.responses.get("utter_internal_error_rasa", [])
184
202
 
185
203
  def get_response_variation_id(
186
204
  self,
@@ -228,3 +246,53 @@ class ResponseVariationFilter:
228
246
  response_ids.add(response_variation_id)
229
247
 
230
248
  return True
249
+
250
+
251
+ def _evaluate_and_deprecate_condition(
252
+ constraint: Dict[Text, Any], filled_slots: Dict[Text, Any]
253
+ ) -> bool:
254
+ """Evaluates the condition of a response variation."""
255
+ rasa.shared.utils.io.raise_deprecation_warning(
256
+ "Using a dictionary as a condition in a response variation is deprecated. "
257
+ "Please use a pypred string predicate instead. "
258
+ "Dictionary conditions will be removed in Rasa Open Source 4.0.0 .",
259
+ warn_until_version="4.0.0",
260
+ )
261
+
262
+ name = constraint["name"]
263
+ value = constraint["value"]
264
+ filled_slots_value = filled_slots.get(name)
265
+ if isinstance(filled_slots_value, str) and isinstance(value, str):
266
+ if filled_slots_value.casefold() != value.casefold():
267
+ return False
268
+ # slot values can be of different data types
269
+ # such as int, float, bool, etc. hence, this check
270
+ # executes when slot values are not strings
271
+ elif filled_slots_value != value:
272
+ return False
273
+
274
+ return True
275
+
276
+
277
+ def _evaluate_predicate(constraint: str, filled_slots: Dict[Text, Any]) -> bool:
278
+ """Evaluates the condition of a response variation."""
279
+ context = {"slots": filled_slots}
280
+ document = context.copy()
281
+ try:
282
+ rendered_template = Template(constraint).render(context)
283
+ predicate = Predicate(rendered_template)
284
+ result = predicate.evaluate(document)
285
+ structlogger.debug(
286
+ "rasa.core.nlg.generator.evaluate_conditional_response_predicate",
287
+ predicate=predicate.description(),
288
+ result=result,
289
+ )
290
+ return result
291
+ except (TypeError, Exception) as e:
292
+ structlogger.error(
293
+ "rasa.core.nlg.generator.evaluate_conditional_response_predicate.error",
294
+ predicate=constraint,
295
+ document=document,
296
+ error=str(e),
297
+ )
298
+ return False
@@ -1,10 +1,11 @@
1
1
  import copy
2
- import re
3
2
  import logging
4
- from jinja2 import Template
3
+ import re
4
+ from typing import Any, Dict, List, Text, Union
5
+
5
6
  import jinja2
6
7
  import structlog
7
- from typing import Text, Dict, Union, Any, List
8
+ from jinja2 import Template
8
9
 
9
10
  from rasa.core.constants import JINJA2_TEMPLATE_ENGINE, RASA_FORMAT_TEMPLATE_ENGINE
10
11
 
rasa/core/nlg/response.py CHANGED
@@ -1,14 +1,13 @@
1
1
  import copy
2
2
  import logging
3
- from rasa.core.constants import DEFAULT_TEMPLATE_ENGINE, TEMPLATE_ENGINE_CONFIG_KEY
4
-
5
- from rasa.shared.core.trackers import DialogueStateTracker
6
- from typing import Text, Any, Dict, Optional, List
3
+ from typing import Any, Dict, List, Optional, Text
7
4
 
5
+ from rasa.core.constants import DEFAULT_TEMPLATE_ENGINE, TEMPLATE_ENGINE_CONFIG_KEY
8
6
  from rasa.core.nlg import interpolator
9
7
  from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
10
8
  from rasa.shared.constants import RESPONSE_CONDITION
11
9
  from rasa.shared.core.domain import RESPONSE_KEYS_TO_INTERPOLATE
10
+ from rasa.shared.core.trackers import DialogueStateTracker
12
11
  from rasa.shared.nlu.constants import METADATA
13
12
 
14
13
  logger = logging.getLogger(__name__)
@@ -50,9 +49,12 @@ class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
50
49
  selected_response = np.random.choice(suitable_responses)
51
50
  condition = selected_response.get(RESPONSE_CONDITION)
52
51
  if condition:
53
- formatted_response_conditions = self._format_response_conditions(
54
- condition
55
- )
52
+ if isinstance(condition, list):
53
+ formatted_response_conditions = (
54
+ self._format_response_conditions(condition)
55
+ )
56
+ else:
57
+ formatted_response_conditions = condition
56
58
  logger.debug(
57
59
  "Selecting response variation with conditions:"
58
60
  f"{formatted_response_conditions}"
@@ -2,6 +2,7 @@ from typing import Optional
2
2
 
3
3
  import structlog
4
4
  from jinja2 import Template
5
+
5
6
  from rasa.core.tracker_store import DialogueStateTracker
6
7
  from rasa.shared.providers.llm.llm_client import LLMClient
7
8
  from rasa.shared.utils.llm import (
@@ -0,0 +1,55 @@
1
+ from typing import Any, Dict, List, Optional, Text
2
+
3
+ from rasa.engine.language import Language
4
+ from rasa.shared.core.flows.constants import KEY_TRANSLATION
5
+
6
+
7
+ def get_translated_text(
8
+ text: Optional[Text],
9
+ translation: Dict[Text, Any],
10
+ language: Optional[Language] = None,
11
+ ) -> Optional[Text]:
12
+ """Get the translated text from the message.
13
+
14
+ Args:
15
+ text: The default text to use if no translation is found.
16
+ translation: The translations for the text.
17
+ language: The language to use for the translation.
18
+
19
+ Returns:
20
+ The translated text if found, otherwise the default text.
21
+ """
22
+ language_code = language.code if language else None
23
+ return translation.get(language_code, text)
24
+
25
+
26
+ def get_translated_buttons(
27
+ buttons: Optional[List[Dict[Text, Any]]], language: Optional[Language] = None
28
+ ) -> Optional[List[Dict[Text, Any]]]:
29
+ """Get the translated buttons from the message.
30
+
31
+ Args:
32
+ buttons: The default buttons to use if no translation is found.
33
+ language: The language to use for the translation.
34
+
35
+ Returns:
36
+ The translated buttons if found; otherwise, the default buttons.
37
+ """
38
+ if buttons is None:
39
+ return None
40
+
41
+ language_code = language.code if language else None
42
+ translated_buttons = []
43
+ for button in buttons:
44
+ translation = button.get(KEY_TRANSLATION, {})
45
+ language_translation = translation.get(language_code, {})
46
+
47
+ # Maintain the original key order to ensure
48
+ # accurate comparisons of BotUtter events.
49
+ translated_button = {
50
+ key: language_translation.get(key, button.get(key))
51
+ for key, value in button.items()
52
+ if key != KEY_TRANSLATION
53
+ }
54
+ translated_buttons.append(translated_button)
55
+ return translated_buttons
rasa/core/persistor.py CHANGED
@@ -9,14 +9,13 @@ from typing import TYPE_CHECKING, List, Optional, Text, Tuple, Union
9
9
 
10
10
  import structlog
11
11
 
12
- from rasa.exceptions import ModelNotFound
13
12
  import rasa.shared.utils.common
14
13
  import rasa.utils.common
15
14
  from rasa.constants import (
15
+ DEFAULT_BUCKET_NAME,
16
16
  HTTP_STATUS_FORBIDDEN,
17
17
  HTTP_STATUS_NOT_FOUND,
18
18
  MODEL_ARCHIVE_EXTENSION,
19
- DEFAULT_BUCKET_NAME,
20
19
  )
21
20
  from rasa.env import (
22
21
  AWS_ENDPOINT_URL_ENV,
@@ -26,6 +25,7 @@ from rasa.env import (
26
25
  BUCKET_NAME_ENV,
27
26
  REMOTE_STORAGE_PATH_ENV,
28
27
  )
28
+ from rasa.exceptions import ModelNotFound
29
29
  from rasa.shared.exceptions import RasaException
30
30
  from rasa.shared.utils.io import raise_warning
31
31
 
@@ -367,8 +367,8 @@ class GCSPersistor(Persistor):
367
367
  self.bucket = self.storage_client.bucket(bucket_name)
368
368
 
369
369
  def _ensure_bucket_exists(self, bucket_name: Text) -> None:
370
- from google.cloud import exceptions
371
370
  from google.auth import exceptions as auth_exceptions
371
+ from google.cloud import exceptions
372
372
 
373
373
  try:
374
374
  self.storage_client.get_bucket(bucket_name)
@@ -1,22 +1,23 @@
1
1
  from __future__ import annotations
2
- from abc import abstractmethod, ABC
3
- from typing import Optional, Text, List, Dict, Any
2
+
4
3
  import logging
4
+ from abc import ABC, abstractmethod
5
+ from typing import Any, Dict, List, Optional, Text
5
6
 
7
+ from rasa.core.policies.policy import PolicyPrediction
6
8
  from rasa.engine.graph import GraphComponent
7
- from rasa.engine.storage.storage import ModelStorage
8
- from rasa.engine.storage.resource import Resource
9
9
  from rasa.engine.runner.interface import ExecutionContext
10
- from rasa.core.policies.policy import PolicyPrediction
11
- from rasa.shared.exceptions import RasaException, InvalidConfigException
10
+ from rasa.engine.storage.resource import Resource
11
+ from rasa.engine.storage.storage import ModelStorage
12
12
  from rasa.shared.core.constants import ACTION_LISTEN_NAME
13
13
  from rasa.shared.core.domain import Domain
14
14
  from rasa.shared.core.events import (
15
- ActionExecutionRejected,
16
15
  ActionExecuted,
16
+ ActionExecutionRejected,
17
17
  DefinePrevUserUtteredFeaturization,
18
18
  )
19
19
  from rasa.shared.core.trackers import DialogueStateTracker
20
+ from rasa.shared.exceptions import InvalidConfigException, RasaException
20
21
 
21
22
  logger = logging.getLogger(__name__)
22
23
 
@@ -34,11 +35,11 @@ def is_not_in_training_data(
34
35
  `False` if and only if an action was predicted (i.e. `max_confidence` > 0) by
35
36
  a `MemoizationPolicy`
36
37
  """
37
- from rasa.core.policies.rule_policy import RulePolicy
38
38
  from rasa.core.policies.memoization import (
39
- MemoizationPolicy,
40
39
  AugmentedMemoizationPolicy,
40
+ MemoizationPolicy,
41
41
  )
42
+ from rasa.core.policies.rule_policy import RulePolicy
42
43
 
43
44
  if not policy_name:
44
45
  return True