rasa-pro 3.12.0.dev2__py3-none-any.whl → 3.12.0.dev4__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 (502) hide show
  1. rasa/__main__.py +7 -7
  2. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  3. rasa/anonymization/anonymization_pipeline.py +3 -3
  4. rasa/anonymization/anonymization_rule_executor.py +1 -1
  5. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  6. rasa/cli/arguments/data.py +2 -2
  7. rasa/cli/arguments/evaluate.py +2 -1
  8. rasa/cli/arguments/interactive.py +1 -1
  9. rasa/cli/arguments/run.py +1 -1
  10. rasa/cli/arguments/test.py +7 -5
  11. rasa/cli/arguments/train.py +3 -3
  12. rasa/cli/arguments/visualize.py +2 -2
  13. rasa/cli/arguments/x.py +1 -0
  14. rasa/cli/data.py +4 -3
  15. rasa/cli/dialogue_understanding_test.py +121 -18
  16. rasa/cli/evaluate.py +1 -1
  17. rasa/cli/export.py +6 -6
  18. rasa/cli/interactive.py +4 -5
  19. rasa/cli/llm_fine_tuning.py +5 -5
  20. rasa/cli/markers.py +1 -2
  21. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  22. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  23. rasa/cli/shell.py +2 -3
  24. rasa/cli/studio/download.py +1 -2
  25. rasa/cli/studio/studio.py +2 -3
  26. rasa/cli/studio/train.py +0 -1
  27. rasa/cli/telemetry.py +2 -2
  28. rasa/cli/test.py +11 -11
  29. rasa/cli/utils.py +7 -5
  30. rasa/core/__init__.py +0 -1
  31. rasa/core/actions/action.py +42 -21
  32. rasa/core/actions/action_hangup.py +1 -1
  33. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  34. rasa/core/actions/action_run_slot_rejections.py +2 -2
  35. rasa/core/actions/action_trigger_chitchat.py +1 -1
  36. rasa/core/actions/action_trigger_flow.py +5 -5
  37. rasa/core/actions/action_trigger_search.py +1 -1
  38. rasa/core/actions/forms.py +14 -12
  39. rasa/core/actions/http_custom_action_executor.py +8 -1
  40. rasa/core/actions/loops.py +3 -3
  41. rasa/core/actions/two_stage_fallback.py +13 -13
  42. rasa/core/auth_retry_tracker_store.py +1 -2
  43. rasa/core/brokers/broker.py +2 -1
  44. rasa/core/brokers/file.py +1 -1
  45. rasa/core/brokers/kafka.py +8 -8
  46. rasa/core/brokers/pika.py +8 -9
  47. rasa/core/brokers/sql.py +4 -3
  48. rasa/core/channels/__init__.py +3 -0
  49. rasa/core/channels/botframework.py +2 -2
  50. rasa/core/channels/callback.py +4 -4
  51. rasa/core/channels/channel.py +11 -11
  52. rasa/core/channels/console.py +0 -1
  53. rasa/core/channels/development_inspector.py +6 -6
  54. rasa/core/channels/facebook.py +5 -5
  55. rasa/core/channels/hangouts.py +7 -8
  56. rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
  66. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
  71. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
  90. rasa/core/channels/inspector/dist/index.html +3 -1
  91. rasa/core/channels/inspector/index.html +2 -0
  92. rasa/core/channels/inspector/src/App.tsx +1 -4
  93. rasa/core/channels/mattermost.py +4 -4
  94. rasa/core/channels/rasa_chat.py +4 -4
  95. rasa/core/channels/rest.py +11 -12
  96. rasa/core/channels/rocketchat.py +4 -3
  97. rasa/core/channels/slack.py +6 -5
  98. rasa/core/channels/socketio.py +7 -28
  99. rasa/core/channels/studio_chat.py +193 -0
  100. rasa/core/channels/telegram.py +73 -41
  101. rasa/core/channels/twilio.py +3 -3
  102. rasa/core/channels/vier_cvg.py +2 -2
  103. rasa/core/channels/voice_ready/audiocodes.py +8 -8
  104. rasa/core/channels/voice_ready/jambonz.py +5 -5
  105. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  106. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  107. rasa/core/channels/voice_ready/utils.py +1 -1
  108. rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
  109. rasa/core/channels/voice_stream/asr/azure.py +2 -2
  110. rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
  111. rasa/core/channels/voice_stream/browser_audio.py +9 -6
  112. rasa/core/channels/voice_stream/call_state.py +2 -1
  113. rasa/core/channels/voice_stream/tts/azure.py +1 -2
  114. rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
  115. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  116. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  117. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
  118. rasa/core/channels/voice_stream/util.py +1 -1
  119. rasa/core/channels/voice_stream/voice_channel.py +15 -15
  120. rasa/core/channels/webexteams.py +3 -4
  121. rasa/core/evaluation/marker.py +7 -6
  122. rasa/core/evaluation/marker_base.py +15 -16
  123. rasa/core/evaluation/marker_stats.py +3 -4
  124. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  125. rasa/core/exporter.py +4 -4
  126. rasa/core/featurizers/precomputation.py +8 -8
  127. rasa/core/featurizers/single_state_featurizer.py +7 -7
  128. rasa/core/featurizers/tracker_featurizers.py +13 -13
  129. rasa/core/http_interpreter.py +3 -4
  130. rasa/core/information_retrieval/__init__.py +1 -1
  131. rasa/core/information_retrieval/faiss.py +4 -4
  132. rasa/core/information_retrieval/information_retrieval.py +2 -2
  133. rasa/core/information_retrieval/milvus.py +3 -3
  134. rasa/core/information_retrieval/qdrant.py +3 -3
  135. rasa/core/jobs.py +1 -0
  136. rasa/core/lock.py +2 -3
  137. rasa/core/lock_store.py +3 -3
  138. rasa/core/migrate.py +11 -8
  139. rasa/core/nlg/__init__.py +1 -1
  140. rasa/core/nlg/callback.py +2 -3
  141. rasa/core/nlg/contextual_response_rephraser.py +63 -13
  142. rasa/core/nlg/generator.py +2 -2
  143. rasa/core/nlg/interpolator.py +4 -3
  144. rasa/core/nlg/response.py +3 -4
  145. rasa/core/nlg/summarize.py +1 -0
  146. rasa/core/persistor.py +3 -3
  147. rasa/core/policies/ensemble.py +10 -9
  148. rasa/core/policies/enterprise_search_policy.py +86 -21
  149. rasa/core/policies/flow_policy.py +13 -14
  150. rasa/core/policies/flows/flow_executor.py +35 -11
  151. rasa/core/policies/intentless_policy.py +6 -7
  152. rasa/core/policies/memoization.py +22 -20
  153. rasa/core/policies/policy.py +24 -22
  154. rasa/core/policies/rule_policy.py +37 -36
  155. rasa/core/policies/ted_policy.py +87 -85
  156. rasa/core/policies/unexpected_intent_policy.py +77 -75
  157. rasa/core/processor.py +96 -65
  158. rasa/core/run.py +1 -1
  159. rasa/core/secrets_manager/endpoints.py +2 -3
  160. rasa/core/secrets_manager/factory.py +2 -3
  161. rasa/core/secrets_manager/secret_manager.py +2 -3
  162. rasa/core/secrets_manager/vault.py +2 -2
  163. rasa/core/test.py +30 -30
  164. rasa/core/tracker_store.py +15 -15
  165. rasa/core/train.py +1 -1
  166. rasa/core/training/__init__.py +2 -2
  167. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  168. rasa/core/training/interactive.py +13 -13
  169. rasa/core/training/story_conflict.py +4 -5
  170. rasa/core/training/training.py +3 -5
  171. rasa/core/utils.py +5 -5
  172. rasa/core/visualize.py +1 -1
  173. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  174. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  175. rasa/dialogue_understanding/commands/__init__.py +22 -22
  176. rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
  177. rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
  178. rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
  179. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
  180. rasa/dialogue_understanding/commands/clarify_command.py +19 -3
  181. rasa/dialogue_understanding/commands/command.py +19 -3
  182. rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
  183. rasa/dialogue_understanding/commands/error_command.py +1 -1
  184. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  185. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  186. rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
  187. rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
  188. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  189. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
  190. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  191. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  192. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  193. rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
  194. rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
  195. rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
  196. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  197. rasa/dialogue_understanding/commands/utils.py +64 -45
  198. rasa/dialogue_understanding/constants.py +1 -0
  199. rasa/dialogue_understanding/generator/command_generator.py +2 -119
  200. rasa/dialogue_understanding/generator/command_parser.py +201 -0
  201. rasa/dialogue_understanding/generator/constants.py +2 -2
  202. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  203. rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
  204. rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
  205. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
  206. rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
  207. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
  208. rasa/dialogue_understanding/generator/utils.py +45 -0
  209. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  210. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  211. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  212. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  213. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  214. rasa/dialogue_understanding/patterns/collect_information.py +6 -3
  215. rasa/dialogue_understanding/patterns/completed.py +1 -1
  216. rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
  217. rasa/dialogue_understanding/patterns/correction.py +4 -2
  218. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  219. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  220. rasa/dialogue_understanding/patterns/search.py +1 -1
  221. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  222. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  223. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  224. rasa/dialogue_understanding/processor/command_processor.py +13 -9
  225. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  226. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  227. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  228. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  229. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  230. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  231. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  232. rasa/dialogue_understanding/stack/utils.py +8 -4
  233. rasa/dialogue_understanding/utils.py +121 -2
  234. rasa/dialogue_understanding_test/README.md +379 -0
  235. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  236. rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
  237. rasa/dialogue_understanding_test/constants.py +6 -1
  238. rasa/dialogue_understanding_test/du_test_case.py +252 -38
  239. rasa/dialogue_understanding_test/du_test_result.py +291 -2
  240. rasa/dialogue_understanding_test/du_test_runner.py +239 -10
  241. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  242. rasa/dialogue_understanding_test/io.py +338 -20
  243. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  244. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  245. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  246. rasa/dialogue_understanding_test/utils.py +70 -0
  247. rasa/dialogue_understanding_test/validation.py +59 -4
  248. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  249. rasa/e2e_test/assertions.py +1 -1
  250. rasa/e2e_test/e2e_config.py +1 -1
  251. rasa/e2e_test/e2e_test_case.py +3 -4
  252. rasa/e2e_test/e2e_test_converter.py +2 -3
  253. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  254. rasa/e2e_test/e2e_test_result.py +1 -1
  255. rasa/e2e_test/e2e_test_runner.py +134 -31
  256. rasa/e2e_test/stub_custom_action.py +1 -1
  257. rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
  258. rasa/e2e_test/utils/io.py +132 -65
  259. rasa/e2e_test/utils/validation.py +1 -1
  260. rasa/engine/caching.py +5 -7
  261. rasa/engine/constants.py +1 -1
  262. rasa/engine/graph.py +2 -2
  263. rasa/engine/recipes/default_components.py +13 -15
  264. rasa/engine/recipes/recipe.py +2 -2
  265. rasa/engine/runner/dask.py +2 -2
  266. rasa/engine/runner/interface.py +1 -0
  267. rasa/engine/storage/local_model_storage.py +5 -4
  268. rasa/engine/storage/resource.py +2 -1
  269. rasa/engine/storage/storage.py +5 -3
  270. rasa/engine/training/components.py +2 -1
  271. rasa/engine/training/fingerprinting.py +4 -2
  272. rasa/engine/training/graph_trainer.py +4 -4
  273. rasa/engine/training/hooks.py +2 -2
  274. rasa/engine/validation.py +34 -33
  275. rasa/exceptions.py +3 -2
  276. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  277. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  278. rasa/graph_components/providers/domain_provider.py +3 -2
  279. rasa/graph_components/providers/flows_provider.py +2 -3
  280. rasa/graph_components/providers/forms_provider.py +4 -4
  281. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  282. rasa/graph_components/providers/responses_provider.py +4 -4
  283. rasa/graph_components/providers/rule_only_provider.py +3 -2
  284. rasa/graph_components/providers/story_graph_provider.py +8 -8
  285. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  286. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  287. rasa/graph_components/validators/finetuning_validator.py +10 -8
  288. rasa/hooks.py +18 -12
  289. rasa/jupyter.py +2 -2
  290. rasa/llm_fine_tuning/annotation_module.py +4 -4
  291. rasa/llm_fine_tuning/conversations.py +6 -6
  292. rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
  293. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  294. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
  295. rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
  296. rasa/llm_fine_tuning/storage.py +3 -3
  297. rasa/markers/marker.py +2 -3
  298. rasa/markers/marker_base.py +1 -2
  299. rasa/markers/upload.py +2 -2
  300. rasa/markers/validate.py +2 -3
  301. rasa/model.py +3 -5
  302. rasa/model_manager/config.py +1 -1
  303. rasa/model_manager/model_api.py +5 -4
  304. rasa/model_manager/runner_service.py +6 -6
  305. rasa/model_manager/socket_bridge.py +8 -3
  306. rasa/model_manager/studio_jwt_auth.py +1 -0
  307. rasa/model_manager/trainer_service.py +9 -7
  308. rasa/model_manager/utils.py +1 -1
  309. rasa/model_manager/warm_rasa_process.py +14 -8
  310. rasa/model_service.py +5 -6
  311. rasa/model_testing.py +13 -15
  312. rasa/nlu/classifiers/diet_classifier.py +72 -73
  313. rasa/nlu/classifiers/fallback_classifier.py +9 -11
  314. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  315. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  316. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  317. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  318. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  319. rasa/nlu/convert.py +2 -2
  320. rasa/nlu/emulators/dialogflow.py +3 -3
  321. rasa/nlu/emulators/luis.py +5 -5
  322. rasa/nlu/emulators/no_emulator.py +1 -0
  323. rasa/nlu/emulators/wit.py +4 -4
  324. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  325. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  326. rasa/nlu/extractors/entity_synonyms.py +10 -9
  327. rasa/nlu/extractors/extractor.py +16 -16
  328. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  329. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  330. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  331. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  332. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  333. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  334. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  335. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  336. rasa/nlu/featurizers/featurizer.py +5 -4
  337. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  338. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  339. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  340. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  341. rasa/nlu/model.py +0 -1
  342. rasa/nlu/selectors/response_selector.py +67 -68
  343. rasa/nlu/test.py +38 -38
  344. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  345. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  346. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  347. rasa/nlu/tokenizers/tokenizer.py +6 -7
  348. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  349. rasa/nlu/utils/bilou_utils.py +7 -7
  350. rasa/nlu/utils/hugging_face/registry.py +22 -22
  351. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  352. rasa/nlu/utils/mitie_utils.py +2 -1
  353. rasa/nlu/utils/pattern_utils.py +1 -1
  354. rasa/nlu/utils/spacy_utils.py +3 -3
  355. rasa/plugin.py +12 -1
  356. rasa/server.py +37 -1
  357. rasa/shared/constants.py +22 -2
  358. rasa/shared/core/command_payload_reader.py +15 -7
  359. rasa/shared/core/constants.py +4 -1
  360. rasa/shared/core/conversation.py +1 -2
  361. rasa/shared/core/events.py +47 -37
  362. rasa/shared/core/flows/__init__.py +0 -1
  363. rasa/shared/core/flows/flow.py +11 -11
  364. rasa/shared/core/flows/flow_step.py +19 -13
  365. rasa/shared/core/flows/flow_step_links.py +21 -14
  366. rasa/shared/core/flows/flow_step_sequence.py +6 -4
  367. rasa/shared/core/flows/flows_list.py +3 -3
  368. rasa/shared/core/flows/nlu_trigger.py +1 -1
  369. rasa/shared/core/flows/steps/__init__.py +2 -2
  370. rasa/shared/core/flows/steps/action.py +4 -3
  371. rasa/shared/core/flows/steps/call.py +4 -4
  372. rasa/shared/core/flows/steps/collect.py +7 -4
  373. rasa/shared/core/flows/steps/continuation.py +3 -1
  374. rasa/shared/core/flows/steps/end.py +3 -1
  375. rasa/shared/core/flows/steps/internal.py +3 -2
  376. rasa/shared/core/flows/steps/link.py +6 -4
  377. rasa/shared/core/flows/steps/no_operation.py +7 -5
  378. rasa/shared/core/flows/steps/set_slots.py +4 -3
  379. rasa/shared/core/flows/steps/start.py +3 -1
  380. rasa/shared/core/flows/utils.py +1 -0
  381. rasa/shared/core/flows/validation.py +3 -5
  382. rasa/shared/core/generator.py +20 -21
  383. rasa/shared/core/slot_mappings.py +15 -15
  384. rasa/shared/core/slots.py +3 -3
  385. rasa/shared/core/trackers.py +31 -31
  386. rasa/shared/core/training_data/loading.py +1 -1
  387. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  388. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  389. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  390. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  391. rasa/shared/core/training_data/structures.py +11 -12
  392. rasa/shared/core/training_data/visualization.py +10 -10
  393. rasa/shared/data.py +6 -6
  394. rasa/shared/engine/caching.py +0 -1
  395. rasa/shared/exceptions.py +2 -2
  396. rasa/shared/importers/rasa.py +5 -6
  397. rasa/shared/importers/utils.py +1 -1
  398. rasa/shared/nlu/constants.py +3 -0
  399. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  400. rasa/shared/nlu/training_data/features.py +3 -3
  401. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  402. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  403. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  404. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  405. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  406. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  407. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  408. rasa/shared/nlu/training_data/loading.py +4 -4
  409. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  410. rasa/shared/nlu/training_data/message.py +13 -14
  411. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  412. rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
  413. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  414. rasa/shared/nlu/training_data/training_data.py +12 -13
  415. rasa/shared/nlu/training_data/util.py +11 -10
  416. rasa/shared/providers/_configs/azure_openai_client_config.py +3 -119
  417. rasa/shared/providers/_configs/client_config.py +1 -3
  418. rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
  419. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
  420. rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
  421. rasa/shared/providers/_configs/model_group_config.py +2 -7
  422. rasa/shared/providers/_configs/openai_client_config.py +1 -3
  423. rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
  424. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
  425. rasa/shared/providers/_configs/utils.py +1 -0
  426. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  427. rasa/shared/providers/_utils.py +5 -5
  428. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  429. rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -26
  430. rasa/shared/providers/embedding/embedding_client.py +1 -1
  431. rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
  432. rasa/shared/providers/llm/_base_litellm_client.py +1 -3
  433. rasa/shared/providers/llm/azure_openai_llm_client.py +25 -79
  434. rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
  435. rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
  436. rasa/shared/providers/llm/llm_client.py +1 -3
  437. rasa/shared/providers/llm/llm_response.py +41 -2
  438. rasa/shared/providers/llm/openai_llm_client.py +3 -9
  439. rasa/shared/providers/llm/rasa_llm_client.py +6 -20
  440. rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
  441. rasa/shared/providers/mappings.py +18 -19
  442. rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
  443. rasa/shared/providers/router/router_client.py +1 -3
  444. rasa/shared/utils/cli.py +1 -1
  445. rasa/shared/utils/common.py +1 -1
  446. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  447. rasa/shared/utils/health_check/health_check.py +3 -3
  448. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  449. rasa/shared/utils/io.py +1 -1
  450. rasa/shared/utils/llm.py +5 -9
  451. rasa/shared/utils/pykwalify_extensions.py +1 -1
  452. rasa/shared/utils/schemas/events.py +1 -1
  453. rasa/shared/utils/yaml.py +29 -26
  454. rasa/studio/auth.py +3 -3
  455. rasa/studio/config.py +1 -2
  456. rasa/studio/data_handler.py +3 -3
  457. rasa/studio/download.py +1 -1
  458. rasa/studio/results_logger.py +3 -3
  459. rasa/studio/upload.py +2 -0
  460. rasa/telemetry.py +31 -0
  461. rasa/tracing/config.py +3 -3
  462. rasa/tracing/instrumentation/attribute_extractors.py +54 -0
  463. rasa/tracing/instrumentation/instrumentation.py +25 -5
  464. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  465. rasa/tracing/instrumentation/metrics.py +11 -11
  466. rasa/tracing/metric_instrument_provider.py +14 -14
  467. rasa/utils/common.py +12 -9
  468. rasa/utils/endpoints.py +1 -1
  469. rasa/utils/io.py +7 -7
  470. rasa/utils/licensing.py +3 -4
  471. rasa/utils/log_utils.py +7 -6
  472. rasa/utils/ml_utils.py +1 -0
  473. rasa/utils/plotting.py +3 -3
  474. rasa/utils/sanic_error_handler.py +1 -1
  475. rasa/utils/tensorflow/callback.py +2 -2
  476. rasa/utils/tensorflow/crf.py +2 -2
  477. rasa/utils/tensorflow/data_generator.py +5 -5
  478. rasa/utils/tensorflow/environment.py +3 -3
  479. rasa/utils/tensorflow/feature_array.py +2 -3
  480. rasa/utils/tensorflow/layers.py +18 -12
  481. rasa/utils/tensorflow/layers_utils.py +2 -1
  482. rasa/utils/tensorflow/metrics.py +2 -2
  483. rasa/utils/tensorflow/model_data.py +7 -7
  484. rasa/utils/tensorflow/model_data_utils.py +10 -9
  485. rasa/utils/tensorflow/models.py +31 -32
  486. rasa/utils/tensorflow/rasa_layers.py +20 -19
  487. rasa/utils/tensorflow/types.py +2 -1
  488. rasa/utils/train_utils.py +23 -21
  489. rasa/utils/url_tools.py +1 -1
  490. rasa/validator.py +17 -1
  491. rasa/version.py +1 -1
  492. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/METADATA +9 -10
  493. rasa_pro-3.12.0.dev4.dist-info/RECORD +800 -0
  494. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
  495. rasa/shared/providers/_configs/azure_entra_id_client_creds.py +0 -40
  496. rasa/shared/providers/_configs/azure_entra_id_config.py +0 -533
  497. rasa/shared/providers/_configs/oauth_config.py +0 -33
  498. rasa/shared/providers/constants.py +0 -6
  499. rasa_pro-3.12.0.dev2.dist-info/RECORD +0 -793
  500. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/NOTICE +0 -0
  501. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/WHEEL +0 -0
  502. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,201 @@
1
+ import re
2
+ from functools import lru_cache
3
+ from typing import Any, Callable, Dict, List, Optional, Type, Union
4
+
5
+ import structlog
6
+
7
+ from rasa.dialogue_understanding.commands import (
8
+ CancelFlowCommand,
9
+ ChitChatAnswerCommand,
10
+ ClarifyCommand,
11
+ Command,
12
+ HumanHandoffCommand,
13
+ KnowledgeAnswerCommand,
14
+ RepeatBotMessagesCommand,
15
+ SetSlotCommand,
16
+ SkipQuestionCommand,
17
+ StartFlowCommand,
18
+ )
19
+ from rasa.dialogue_understanding.commands.utils import start_flow_by_name
20
+ from rasa.shared.core.flows import FlowsList
21
+
22
+ structlogger = structlog.get_logger()
23
+
24
+
25
+ DEFAULT_COMMANDS = [
26
+ SetSlotCommand,
27
+ StartFlowCommand,
28
+ CancelFlowCommand,
29
+ ChitChatAnswerCommand,
30
+ SkipQuestionCommand,
31
+ KnowledgeAnswerCommand,
32
+ HumanHandoffCommand,
33
+ ClarifyCommand,
34
+ RepeatBotMessagesCommand,
35
+ ]
36
+
37
+
38
+ @lru_cache(maxsize=128)
39
+ def _get_compiled_pattern(pattern_str: str) -> re.Pattern:
40
+ return re.compile(pattern_str)
41
+
42
+
43
+ def _create_default_commands(
44
+ default_commands_to_remove: Union[List[Type[Command]], List[str]],
45
+ ) -> List[Type[Command]]:
46
+ """Return an updated list of default commands after removing the provided commands.
47
+
48
+ Args:
49
+ default_commands_to_remove: A list of commands to remove from the default
50
+ commands.
51
+
52
+ Returns:
53
+ A copy of the default commands with the provided commands removed.
54
+ """
55
+ commands_after_removal = []
56
+ for command in DEFAULT_COMMANDS:
57
+ if (
58
+ command not in default_commands_to_remove
59
+ and command.__name__ not in default_commands_to_remove
60
+ ):
61
+ commands_after_removal.append(command)
62
+
63
+ return commands_after_removal
64
+
65
+
66
+ def _get_additional_parsing_logic(
67
+ command_clz: Type[Command],
68
+ ) -> Optional[Callable[[Command, FlowsList], Optional[Command]]]:
69
+ """Get additional parsing logic for a command."""
70
+ command_to_parsing_fn_mapper: Dict[
71
+ Type[Command], Callable[..., Optional[Command]]
72
+ ] = {
73
+ ClarifyCommand: _parse_clarify_command,
74
+ SetSlotCommand: _parse_set_slot_command,
75
+ StartFlowCommand: _parse_start_flow_command,
76
+ }
77
+ return command_to_parsing_fn_mapper.get(command_clz)
78
+
79
+
80
+ def parse_commands(
81
+ actions: Optional[str],
82
+ flows: FlowsList,
83
+ is_handle_flows_prompt: bool = False,
84
+ additional_commands: Optional[List[Type[Command]]] = None,
85
+ default_commands_to_remove: Optional[Union[List[Type[Command]], List[str]]] = None,
86
+ **kwargs: Any,
87
+ ) -> List[Command]:
88
+ """Parse a list of action commands."""
89
+ if not actions:
90
+ return []
91
+
92
+ commands: List[Command] = []
93
+ default_commands = DEFAULT_COMMANDS
94
+ if default_commands_to_remove:
95
+ default_commands = _create_default_commands(default_commands_to_remove)
96
+
97
+ for action in actions.strip().splitlines():
98
+ if is_handle_flows_prompt:
99
+ # Needed for multistep command generator.
100
+ if (
101
+ len(commands) >= 2
102
+ or len(commands) == 1
103
+ and isinstance(commands[0], ClarifyCommand)
104
+ ):
105
+ break
106
+ commands.extend(
107
+ _parse_standard_commands(default_commands, action.strip(), flows, **kwargs)
108
+ )
109
+ if additional_commands:
110
+ commands.extend(
111
+ _parse_custom_commands(
112
+ additional_commands, action.strip(), flows, **kwargs
113
+ )
114
+ )
115
+ return commands
116
+
117
+
118
+ def _parse_standard_commands(
119
+ standard_commands: List[Type[Command]],
120
+ action: str,
121
+ flows: FlowsList,
122
+ **kwargs: Any,
123
+ ) -> List[Command]:
124
+ """Parse predefined standard commands."""
125
+ commands: List[Command] = []
126
+ for command_clz in standard_commands:
127
+ pattern = _get_compiled_pattern(command_clz.regex_pattern())
128
+ if match := pattern.search(action):
129
+ parsed_command = command_clz.from_dsl(match, **kwargs)
130
+ if _additional_parsing_fn := _get_additional_parsing_logic(command_clz):
131
+ parsed_command = _additional_parsing_fn(parsed_command, flows, **kwargs)
132
+ if parsed_command:
133
+ commands.append(parsed_command)
134
+ return commands
135
+
136
+
137
+ def _parse_custom_commands(
138
+ custom_commands: List[Type[Command]],
139
+ action: str,
140
+ flows: FlowsList,
141
+ **kwargs: Any,
142
+ ) -> List[Command]:
143
+ """Parse custom commands."""
144
+ commands: List[Command] = []
145
+ for command_clz in custom_commands:
146
+ pattern = _get_compiled_pattern(command_clz.regex_pattern())
147
+ if match := pattern.search(action):
148
+ if parsed_command := command_clz.from_dsl(match, flows=flows, **kwargs):
149
+ commands.append(parsed_command)
150
+ return commands
151
+
152
+
153
+ def _parse_set_slot_command(
154
+ parsed_command: Optional[SetSlotCommand], flows: FlowsList, **kwargs: Any
155
+ ) -> Optional[Command]:
156
+ """Additional parsing logic for the SetSlotCommand."""
157
+ if not parsed_command:
158
+ return None
159
+ # error case where the llm tries to start a flow using a slot set
160
+ if parsed_command.name == "flow_name":
161
+ return start_flow_by_name(parsed_command.value, flows)
162
+ return parsed_command
163
+
164
+
165
+ def _parse_clarify_command(
166
+ parsed_command: Optional[ClarifyCommand], flows: FlowsList, **kwargs: Any
167
+ ) -> Optional[Command]:
168
+ """Additional parsing logic for the ClarifyCommand."""
169
+ if not parsed_command:
170
+ return None
171
+
172
+ # if no options are available
173
+ if not parsed_command.options:
174
+ # Return the command if options are optional; else, return an empty list
175
+ return (
176
+ ClarifyCommand([])
177
+ if kwargs.get("clarify_options_optional", False)
178
+ else None
179
+ )
180
+ valid_options = [
181
+ flow for flow in parsed_command.options if flow in flows.user_flow_ids
182
+ ]
183
+ unique_valid_options = list(set(valid_options))
184
+
185
+ # if there is only one valid option, start the flow
186
+ if len(unique_valid_options) == 1:
187
+ return start_flow_by_name(valid_options[0], flows)
188
+
189
+ # if there are multiple valid options, return a clarify command
190
+ if len(valid_options) > 1:
191
+ return ClarifyCommand(valid_options)
192
+ return None
193
+
194
+
195
+ def _parse_start_flow_command(
196
+ parsed_command: Optional[StartFlowCommand], flows: FlowsList, **kwargs: Any
197
+ ) -> Optional[Command]:
198
+ """Additional parsing logic for the StartFlowCommand."""
199
+ if not parsed_command:
200
+ return None
201
+ return start_flow_by_name(parsed_command.flow, flows)
@@ -1,7 +1,7 @@
1
1
  from rasa.shared.constants import (
2
- PROVIDER_CONFIG_KEY,
3
- OPENAI_PROVIDER,
4
2
  MODEL_CONFIG_KEY,
3
+ OPENAI_PROVIDER,
4
+ PROVIDER_CONFIG_KEY,
5
5
  TIMEOUT_CONFIG_KEY,
6
6
  )
7
7
  from rasa.shared.utils.llm import (
@@ -18,7 +18,7 @@ flows within a conversational context.
18
18
  """
19
19
 
20
20
  import importlib
21
- from typing import Dict, Text, Any, List, Optional
21
+ from typing import Any, Dict, List, Optional, Text
22
22
 
23
23
  import structlog
24
24
  from jinja2 import Template
@@ -27,19 +27,19 @@ from langchain.schema.embeddings import Embeddings
27
27
  from langchain_community.vectorstores.faiss import FAISS
28
28
  from langchain_community.vectorstores.utils import DistanceStrategy
29
29
 
30
+ import rasa.shared.utils.io
30
31
  from rasa.engine.storage.resource import Resource
31
32
  from rasa.engine.storage.storage import ModelStorage
32
- import rasa.shared.utils.io
33
33
  from rasa.shared.constants import (
34
34
  EMBEDDINGS_CONFIG_KEY,
35
- PROVIDER_CONFIG_KEY,
36
35
  OPENAI_PROVIDER,
36
+ PROVIDER_CONFIG_KEY,
37
37
  )
38
38
  from rasa.shared.core.domain import Domain
39
39
  from rasa.shared.core.flows import FlowsList
40
40
  from rasa.shared.core.trackers import DialogueStateTracker
41
41
  from rasa.shared.exceptions import ProviderClientAPIException
42
- from rasa.shared.nlu.constants import TEXT, FLOWS_FROM_SEMANTIC_SEARCH
42
+ from rasa.shared.nlu.constants import FLOWS_FROM_SEMANTIC_SEARCH, TEXT
43
43
  from rasa.shared.nlu.training_data.message import Message
44
44
  from rasa.shared.providers.embedding._langchain_embedding_client_adapter import (
45
45
  _LangchainEmbeddingClientAdapter,
@@ -48,13 +48,13 @@ from rasa.shared.utils.health_check.embeddings_health_check_mixin import (
48
48
  EmbeddingsHealthCheckMixin,
49
49
  )
50
50
  from rasa.shared.utils.llm import (
51
- tracker_as_readable_transcript,
52
- embedder_factory,
53
51
  DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
54
52
  USER,
55
- get_prompt_template,
56
53
  allowed_values_for_slot,
54
+ embedder_factory,
55
+ get_prompt_template,
57
56
  resolve_model_client_config,
57
+ tracker_as_readable_transcript,
58
58
  )
59
59
 
60
60
  DEFAULT_FLOW_DOCUMENT_TEMPLATE = importlib.resources.read_text(
@@ -1,6 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from functools import lru_cache
3
- from typing import Dict, Any, List, Optional, Tuple, Union, Text
3
+ from typing import Any, Dict, List, Optional, Text, Tuple, Union
4
4
 
5
5
  import structlog
6
6
  from jinja2 import Template
@@ -8,30 +8,29 @@ from jinja2 import Template
8
8
  import rasa.shared.utils.io
9
9
  from rasa.dialogue_understanding.commands import (
10
10
  Command,
11
- StartFlowCommand,
12
11
  )
13
12
  from rasa.dialogue_understanding.generator import CommandGenerator
14
13
  from rasa.dialogue_understanding.generator.constants import (
15
14
  DEFAULT_LLM_CONFIG,
16
- LLM_CONFIG_KEY,
17
- FLOW_RETRIEVAL_KEY,
18
15
  FLOW_RETRIEVAL_ACTIVE_KEY,
19
16
  FLOW_RETRIEVAL_FLOW_THRESHOLD,
17
+ FLOW_RETRIEVAL_KEY,
18
+ LLM_CONFIG_KEY,
20
19
  )
21
20
  from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
22
- from rasa.engine.graph import GraphComponent, ExecutionContext
21
+ from rasa.engine.graph import ExecutionContext, GraphComponent
23
22
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
24
23
  from rasa.engine.storage.resource import Resource
25
24
  from rasa.engine.storage.storage import ModelStorage
26
25
  from rasa.shared.core.domain import Domain
27
- from rasa.shared.core.flows import FlowStep, Flow, FlowsList
26
+ from rasa.shared.core.flows import Flow, FlowsList, FlowStep
28
27
  from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
29
28
  from rasa.shared.core.trackers import DialogueStateTracker
30
- from rasa.shared.exceptions import FileIOException
31
- from rasa.shared.exceptions import ProviderClientAPIException
29
+ from rasa.shared.exceptions import FileIOException, ProviderClientAPIException
32
30
  from rasa.shared.nlu.constants import FLOWS_IN_PROMPT
33
31
  from rasa.shared.nlu.training_data.message import Message
34
32
  from rasa.shared.nlu.training_data.training_data import TrainingData
33
+ from rasa.shared.providers.llm.llm_response import LLMResponse
35
34
  from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
36
35
  from rasa.shared.utils.llm import (
37
36
  allowed_values_for_slot,
@@ -304,22 +303,21 @@ class LLMBasedCommandGenerator(
304
303
  )
305
304
  return filtered_flows
306
305
 
307
- async def invoke_llm(self, prompt: Text) -> Optional[Text]:
306
+ async def invoke_llm(self, prompt: Text) -> Optional[LLMResponse]:
308
307
  """Use LLM to generate a response.
309
308
 
310
309
  Args:
311
310
  prompt: The prompt to send to the LLM.
312
311
 
313
312
  Returns:
314
- The generated text.
313
+ An LLMResponse object.
315
314
 
316
315
  Raises:
317
- ProviderClientAPIException if an error during API call.
316
+ ProviderClientAPIException: If an error occurs during the LLM API call.
318
317
  """
319
318
  llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
320
319
  try:
321
- llm_response = await llm.acompletion(prompt)
322
- return llm_response.choices[0]
320
+ return await llm.acompletion(prompt)
323
321
  except Exception as e:
324
322
  # unfortunately, langchain does not wrap LLM exceptions which means
325
323
  # we have to catch all exceptions here
@@ -328,50 +326,6 @@ class LLMBasedCommandGenerator(
328
326
  message="LLM call exception", original_exception=e
329
327
  )
330
328
 
331
- @staticmethod
332
- def start_flow_by_name(flow_name: str, flows: FlowsList) -> List[Command]:
333
- """Start a flow by name.
334
-
335
- If the flow does not exist, no command is returned.
336
- """
337
- if flow_name in flows.user_flow_ids:
338
- return [StartFlowCommand(flow=flow_name)]
339
- else:
340
- structlogger.debug(
341
- "llm_command_generator.flow.start_invalid_flow_id", flow=flow_name
342
- )
343
- return []
344
-
345
- @staticmethod
346
- def is_none_value(value: str) -> bool:
347
- """Check if the value is a none value."""
348
- return value in {
349
- "[missing information]",
350
- "[missing]",
351
- "None",
352
- "undefined",
353
- "null",
354
- }
355
-
356
- @staticmethod
357
- def clean_extracted_value(value: str) -> str:
358
- """Clean up the extracted value from the llm."""
359
- # replace any combination of single quotes, double quotes, and spaces
360
- # from the beginning and end of the string
361
- return value.strip("'\" ")
362
-
363
- @classmethod
364
- def get_nullable_slot_value(cls, slot_value: str) -> Union[str, None]:
365
- """Get the slot value or None if the value is a none value.
366
-
367
- Args:
368
- slot_value: the value to coerce
369
-
370
- Returns:
371
- The slot value or None if the value is a none value.
372
- """
373
- return slot_value if not cls.is_none_value(slot_value) else None
374
-
375
329
  def prepare_flows_for_template(
376
330
  self, flows: FlowsList, tracker: DialogueStateTracker
377
331
  ) -> List[Dict[str, Any]]:
@@ -10,6 +10,7 @@ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
10
10
  from rasa.engine.storage.resource import Resource
11
11
  from rasa.engine.storage.storage import ModelStorage
12
12
  from rasa.shared.exceptions import ProviderClientAPIException
13
+ from rasa.shared.providers.llm.llm_response import LLMResponse
13
14
  from rasa.shared.utils.io import raise_deprecation_warning
14
15
 
15
16
  structlogger = structlog.get_logger()
@@ -53,7 +54,7 @@ class LLMCommandGenerator(SingleStepLLMCommandGenerator):
53
54
  **kwargs,
54
55
  )
55
56
 
56
- async def invoke_llm(self, prompt: Text) -> Optional[Text]:
57
+ async def invoke_llm(self, prompt: Text) -> Optional[LLMResponse]:
57
58
  try:
58
59
  return await super().invoke_llm(prompt)
59
60
  except ProviderClientAPIException:
@@ -1,63 +1,63 @@
1
1
  import importlib.resources
2
- import re
3
- from typing import Dict, Any, List, Optional, Tuple, Union, Text
2
+ from typing import Any, Dict, List, Optional, Text, Tuple, Union
4
3
 
5
4
  import structlog
6
5
  from jinja2 import Template
7
6
 
8
7
  import rasa.shared.utils.io
9
8
  from rasa.dialogue_understanding.commands import (
9
+ CannotHandleCommand,
10
+ ChangeFlowCommand,
10
11
  Command,
11
12
  ErrorCommand,
12
13
  SetSlotCommand,
13
- CancelFlowCommand,
14
14
  StartFlowCommand,
15
- HumanHandoffCommand,
16
- ChitChatAnswerCommand,
17
- SkipQuestionCommand,
18
- KnowledgeAnswerCommand,
19
- ClarifyCommand,
20
- CannotHandleCommand,
21
15
  )
22
- from rasa.dialogue_understanding.commands.change_flow_command import ChangeFlowCommand
16
+ from rasa.dialogue_understanding.commands.can_not_handle_command import (
17
+ DATA_KEY_CANNOT_HANDLE_REASON,
18
+ )
19
+ from rasa.dialogue_understanding.generator.command_parser import (
20
+ parse_commands as parse_commands_using_command_parsers,
21
+ )
23
22
  from rasa.dialogue_understanding.generator.constants import (
23
+ DEFAULT_LLM_CONFIG,
24
+ FLOW_RETRIEVAL_KEY,
24
25
  LLM_CONFIG_KEY,
25
26
  USER_INPUT_CONFIG_KEY,
26
- FLOW_RETRIEVAL_KEY,
27
- DEFAULT_LLM_CONFIG,
28
27
  )
29
28
  from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
30
29
  from rasa.dialogue_understanding.generator.llm_based_command_generator import (
31
30
  LLMBasedCommandGenerator,
32
31
  )
33
32
  from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
34
- from rasa.dialogue_understanding.stack.utils import (
35
- top_flow_frame,
36
- top_user_flow_frame,
37
- user_flows_on_the_stack,
33
+ from rasa.dialogue_understanding.stack.utils import top_flow_frame, top_user_flow_frame
34
+ from rasa.dialogue_understanding.utils import (
35
+ add_commands_to_message_parse_data,
36
+ add_prompt_to_message_parse_data,
38
37
  )
39
38
  from rasa.engine.graph import ExecutionContext
40
39
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
41
40
  from rasa.engine.storage.resource import Resource
42
41
  from rasa.engine.storage.storage import ModelStorage
43
42
  from rasa.shared.constants import (
44
- RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED,
45
43
  EMBEDDINGS_CONFIG_KEY,
44
+ RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED,
45
+ ROUTE_TO_CALM_SLOT,
46
46
  )
47
- from rasa.shared.constants import ROUTE_TO_CALM_SLOT
48
- from rasa.shared.core.flows import FlowStep, Flow, FlowsList
47
+ from rasa.shared.core.flows import Flow, FlowsList, FlowStep
49
48
  from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
50
49
  from rasa.shared.core.trackers import DialogueStateTracker
51
50
  from rasa.shared.exceptions import ProviderClientAPIException
52
51
  from rasa.shared.nlu.constants import TEXT
53
52
  from rasa.shared.nlu.training_data.message import Message
53
+ from rasa.shared.providers.llm.llm_response import LLMResponse
54
54
  from rasa.shared.utils.io import deep_container_fingerprint
55
55
  from rasa.shared.utils.llm import (
56
- get_prompt_template,
57
- tracker_as_readable_transcript,
58
- sanitize_message_for_prompt,
59
56
  allowed_values_for_slot,
57
+ get_prompt_template,
60
58
  resolve_model_client_config,
59
+ sanitize_message_for_prompt,
60
+ tracker_as_readable_transcript,
61
61
  )
62
62
 
63
63
  # multistep template keys
@@ -199,7 +199,7 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
199
199
  message, flows, tracker
200
200
  )
201
201
  commands = self._clean_up_commands(commands)
202
- self._add_commands_to_message_parse_data(
202
+ add_commands_to_message_parse_data(
203
203
  message, MultiStepLLMCommandGenerator.__name__, commands
204
204
  )
205
205
  except ProviderClientAPIException:
@@ -242,86 +242,15 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
242
242
  Returns:
243
243
  The parsed commands.
244
244
  """
245
- if not actions:
246
- return []
247
-
248
- commands: List[Command] = []
249
-
250
- slot_set_re = re.compile(
251
- r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
245
+ commands = parse_commands_using_command_parsers(
246
+ actions,
247
+ flows,
248
+ is_handle_flows_prompt=is_handle_flows_prompt,
249
+ additional_commands=[CannotHandleCommand, ChangeFlowCommand],
250
+ data={
251
+ DATA_KEY_CANNOT_HANDLE_REASON: RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED
252
+ },
252
253
  )
253
- start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
254
- change_flow_re = re.compile(r"ChangeFlow\(\)")
255
- cancel_flow_re = re.compile(r"CancelFlow\(\)")
256
- chitchat_re = re.compile(r"ChitChat\(\)")
257
- skip_question_re = re.compile(r"SkipQuestion\(\)")
258
- knowledge_re = re.compile(r"SearchAndReply\(\)")
259
- humand_handoff_re = re.compile(r"HumanHandoff\(\)")
260
- clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
261
- cannot_handle_re = re.compile(r"CannotHandle\(\)")
262
-
263
- for action in actions.strip().splitlines():
264
- if is_handle_flows_prompt:
265
- if (
266
- len(commands) >= 2
267
- or len(commands) == 1
268
- and isinstance(commands[0], ClarifyCommand)
269
- ):
270
- break
271
-
272
- if cannot_handle_re.search(action):
273
- commands.append(
274
- CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)
275
- )
276
- if match := slot_set_re.search(action):
277
- slot_name = cls.clean_extracted_value(match.group(1).strip())
278
- slot_value = cls.clean_extracted_value(match.group(2))
279
- # error case where the llm tries to start a flow using a slot set
280
- if slot_name == "flow_name":
281
- commands.extend(cls.start_flow_by_name(slot_value, flows))
282
- else:
283
- typed_slot_value = cls.get_nullable_slot_value(slot_value)
284
- commands.append(
285
- SetSlotCommand(name=slot_name, value=typed_slot_value)
286
- )
287
- elif match := start_flow_re.search(action):
288
- flow_name = match.group(1).strip()
289
- commands.extend(cls.start_flow_by_name(flow_name, flows))
290
- elif cancel_flow_re.search(action):
291
- commands.append(CancelFlowCommand())
292
- elif chitchat_re.search(action):
293
- commands.append(ChitChatAnswerCommand())
294
- elif skip_question_re.search(action):
295
- commands.append(SkipQuestionCommand())
296
- elif knowledge_re.search(action):
297
- commands.append(KnowledgeAnswerCommand())
298
- elif humand_handoff_re.search(action):
299
- commands.append(HumanHandoffCommand())
300
- elif match := clarify_re.search(action):
301
- options = sorted([opt.strip() for opt in match.group(1).split(",")])
302
- # Remove surrounding quotes if present
303
- cleaned_options = []
304
- for flow in options:
305
- if (flow.startswith('"') and flow.endswith('"')) or (
306
- flow.startswith("'") and flow.endswith("'")
307
- ):
308
- cleaned_options.append(flow[1:-1])
309
- else:
310
- cleaned_options.append(flow)
311
- # check if flow is valid
312
- valid_options = [
313
- flow
314
- for flow in cleaned_options
315
- if flow in flows.user_flow_ids
316
- and flow not in user_flows_on_the_stack(tracker.stack)
317
- ]
318
- if len(valid_options) == 1:
319
- commands.extend(cls.start_flow_by_name(valid_options[0], flows))
320
- elif 1 < len(valid_options) <= 5:
321
- commands.append(ClarifyCommand(valid_options))
322
- elif change_flow_re.search(action):
323
- commands.append(ChangeFlowCommand())
324
-
325
254
  if not commands:
326
255
  structlogger.debug(
327
256
  "multi_step_llm_command_generator.parse_commands",
@@ -535,7 +464,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
535
464
  prompt=prompt,
536
465
  )
537
466
 
538
- actions = await self.invoke_llm(prompt)
467
+ response = await self.invoke_llm(prompt)
468
+ llm_response = LLMResponse.ensure_llm_response(response)
469
+ actions = None
470
+ if llm_response and llm_response.choices:
471
+ actions = llm_response.choices[0]
472
+
539
473
  structlogger.debug(
540
474
  "multi_step_llm_command_generator"
541
475
  ".predict_commands_for_active_flow"
@@ -546,11 +480,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
546
480
  commands = self.parse_commands(actions, tracker, available_flows)
547
481
 
548
482
  if commands:
549
- self._add_prompt_to_message_parse_data(
550
- message,
551
- MultiStepLLMCommandGenerator.__name__,
552
- "fill_slots_for_active_flow_prompt",
553
- prompt,
483
+ add_prompt_to_message_parse_data(
484
+ message=message,
485
+ component_name=MultiStepLLMCommandGenerator.__name__,
486
+ prompt_name="fill_slots_for_active_flow_prompt",
487
+ user_prompt=prompt,
488
+ llm_response=llm_response,
554
489
  )
555
490
 
556
491
  return commands
@@ -584,7 +519,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
584
519
  prompt=prompt,
585
520
  )
586
521
 
587
- actions = await self.invoke_llm(prompt)
522
+ response = await self.invoke_llm(prompt)
523
+ llm_response = LLMResponse.ensure_llm_response(response)
524
+ actions = None
525
+ if llm_response and llm_response.choices:
526
+ actions = llm_response.choices[0]
527
+
588
528
  structlogger.debug(
589
529
  "multi_step_llm_command_generator"
590
530
  ".predict_commands_for_handling_flows"
@@ -597,11 +537,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
597
537
  commands = self._filter_redundant_start_flow_commands(tracker, commands)
598
538
 
599
539
  if commands:
600
- self._add_prompt_to_message_parse_data(
601
- message,
602
- MultiStepLLMCommandGenerator.__name__,
603
- "handle_flows_prompt",
604
- prompt,
540
+ add_prompt_to_message_parse_data(
541
+ message=message,
542
+ component_name=MultiStepLLMCommandGenerator.__name__,
543
+ prompt_name="handle_flows_prompt",
544
+ user_prompt=prompt,
545
+ llm_response=llm_response,
605
546
  )
606
547
 
607
548
  return commands
@@ -668,7 +609,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
668
609
  prompt=prompt,
669
610
  )
670
611
 
671
- actions = await self.invoke_llm(prompt)
612
+ response = await self.invoke_llm(prompt)
613
+ llm_response = LLMResponse.ensure_llm_response(response)
614
+ actions = None
615
+ if llm_response and llm_response.choices:
616
+ actions = llm_response.choices[0]
617
+
672
618
  structlogger.debug(
673
619
  "multi_step_llm_command_generator"
674
620
  ".predict_commands_for_newly_started_flow"
@@ -694,11 +640,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
694
640
  )
695
641
 
696
642
  if commands:
697
- self._add_prompt_to_message_parse_data(
698
- message,
699
- MultiStepLLMCommandGenerator.__name__,
700
- "fill_slots_for_new_flow_prompt",
701
- prompt,
643
+ add_prompt_to_message_parse_data(
644
+ message=message,
645
+ component_name=MultiStepLLMCommandGenerator.__name__,
646
+ prompt_name="fill_slots_for_new_flow_prompt",
647
+ user_prompt=prompt,
648
+ llm_response=llm_response,
702
649
  )
703
650
 
704
651
  return commands