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
@@ -1,18 +1,18 @@
1
- from typing import Dict, Any, List
1
+ from typing import Any, Dict, List, Type
2
2
 
3
3
  import structlog
4
4
 
5
5
  from rasa.dialogue_understanding.commands import Command, SetSlotCommand
6
- from rasa.dialogue_understanding.generator import SingleStepLLMCommandGenerator
6
+ from rasa.dialogue_understanding.generator.llm_based_command_generator import (
7
+ LLMBasedCommandGenerator,
8
+ )
7
9
  from rasa.llm_fine_tuning.conversations import Conversation, ConversationStep
8
10
  from rasa.llm_fine_tuning.paraphrasing.rephrased_user_message import (
9
11
  RephrasedUserMessage,
10
12
  )
11
13
  from rasa.shared.core.flows import FlowsList
12
14
  from rasa.shared.exceptions import ProviderClientAPIException
13
- from rasa.shared.utils.llm import (
14
- llm_factory,
15
- )
15
+ from rasa.shared.utils.llm import llm_factory
16
16
 
17
17
  structlogger = structlog.get_logger()
18
18
 
@@ -26,6 +26,7 @@ class RephraseValidator:
26
26
  self,
27
27
  rephrasings: List[RephrasedUserMessage],
28
28
  conversation: Conversation,
29
+ llm_command_generator: Type[LLMBasedCommandGenerator],
29
30
  ) -> List[RephrasedUserMessage]:
30
31
  """Split rephrased user messages into passing and failing.
31
32
 
@@ -38,6 +39,7 @@ class RephraseValidator:
38
39
  Args:
39
40
  rephrasings: The rephrased user messages.
40
41
  conversation: The conversation.
42
+ llm_command_generator: A LLM based command generator class.
41
43
 
42
44
  Returns:
43
45
  A list of rephrased user messages including the passing and failing
@@ -49,7 +51,9 @@ class RephraseValidator:
49
51
  current_rephrasings = rephrasings[i]
50
52
 
51
53
  for rephrase in current_rephrasings.rephrasings:
52
- if await self._validate_rephrase_is_passing(rephrase, step):
54
+ if await self._validate_rephrase_is_passing(
55
+ rephrase, step, llm_command_generator
56
+ ):
53
57
  current_rephrasings.passed_rephrasings.append(rephrase)
54
58
  else:
55
59
  current_rephrasings.failed_rephrasings.append(rephrase)
@@ -60,25 +64,26 @@ class RephraseValidator:
60
64
  self,
61
65
  rephrase: str,
62
66
  step: ConversationStep,
67
+ llm_command_generator: Type[LLMBasedCommandGenerator],
63
68
  ) -> bool:
64
69
  prompt = self._update_prompt(
65
70
  rephrase, step.original_test_step.text, step.llm_prompt
66
71
  )
67
72
 
68
- action_list = await self._invoke_llm(prompt)
73
+ action_list = await self._invoke_llm(
74
+ prompt, llm_command_generator.get_default_llm_config()
75
+ )
69
76
 
70
77
  commands_from_original_utterance = step.llm_commands
71
- commands_from_rephrased_utterance = (
72
- SingleStepLLMCommandGenerator.parse_commands(action_list, None, self.flows)
78
+ commands_from_rephrased_utterance = llm_command_generator.parse_commands( # type: ignore
79
+ action_list, None, self.flows
73
80
  )
74
81
  return self._check_commands_match(
75
82
  commands_from_original_utterance, commands_from_rephrased_utterance
76
83
  )
77
84
 
78
- async def _invoke_llm(self, prompt: str) -> str:
79
- from rasa.dialogue_understanding.generator.constants import DEFAULT_LLM_CONFIG
80
-
81
- llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
85
+ async def _invoke_llm(self, prompt: str, default_llm_config: Dict[str, Any]) -> str:
86
+ llm = llm_factory(self.llm_config, default_llm_config)
82
87
 
83
88
  try:
84
89
  llm_response = await llm.acompletion(prompt)
@@ -1,8 +1,11 @@
1
- from typing import List, Dict, Any, Tuple
1
+ from typing import Any, Dict, List, Tuple, Type
2
2
 
3
3
  import structlog
4
4
  from tqdm import tqdm
5
5
 
6
+ from rasa.dialogue_understanding.generator.llm_based_command_generator import (
7
+ LLMBasedCommandGenerator,
8
+ )
6
9
  from rasa.llm_fine_tuning.conversations import Conversation
7
10
  from rasa.llm_fine_tuning.paraphrasing.conversation_rephraser import (
8
11
  ConversationRephraser,
@@ -25,6 +28,7 @@ async def create_paraphrased_conversations(
25
28
  rephrase_config: Dict[str, Any],
26
29
  num_rephrases: int,
27
30
  flows: FlowsList,
31
+ llm_command_generator: Type[LLMBasedCommandGenerator],
28
32
  llm_command_generator_config: Dict[str, Any],
29
33
  storage_context: StorageContext,
30
34
  ) -> Tuple[List[Conversation], Dict[str, Any]]:
@@ -71,7 +75,7 @@ async def create_paraphrased_conversations(
71
75
  rephrasings = _filter_rephrasings(rephrasings, conversations[i])
72
76
  # check if the rephrasings are still producing the same commands
73
77
  rephrasings = await validator.validate_rephrasings(
74
- rephrasings, current_conversation
78
+ rephrasings, current_conversation, llm_command_generator
75
79
  )
76
80
  except ProviderClientAPIException as e:
77
81
  structlogger.error(
@@ -1,9 +1,9 @@
1
1
  import json
2
2
  import os
3
- from abc import abstractmethod, ABC
3
+ from abc import ABC, abstractmethod
4
4
  from enum import Enum
5
5
  from pathlib import Path
6
- from typing import List, Optional, TYPE_CHECKING
6
+ from typing import TYPE_CHECKING, List, Optional
7
7
 
8
8
  import rasa.shared.utils.io
9
9
  import rasa.utils.io
@@ -11,9 +11,9 @@ from rasa.llm_fine_tuning.conversations import Conversation
11
11
  from rasa.shared.utils.yaml import write_yaml
12
12
 
13
13
  if TYPE_CHECKING:
14
+ from rasa.e2e_test.e2e_test_case import TestSuite
14
15
  from rasa.llm_fine_tuning.llm_data_preparation_module import LLMDataExample
15
16
  from rasa.llm_fine_tuning.train_test_split_module import DataExampleFormat
16
- from rasa.e2e_test.e2e_test_case import TestSuite
17
17
 
18
18
 
19
19
  class StorageType(Enum):
@@ -1,27 +1,18 @@
1
1
  import random
2
2
  from collections import defaultdict
3
3
  from dataclasses import dataclass
4
- from typing import Any, Dict, List, Protocol, Set, Tuple
4
+ from typing import Any, Dict, List, Protocol, Set, Tuple, Type
5
5
 
6
6
  import structlog
7
7
 
8
+ from rasa.dialogue_understanding.commands.prompt_command import PromptCommand
8
9
  from rasa.e2e_test.e2e_test_case import TestSuite
9
10
  from rasa.llm_fine_tuning.llm_data_preparation_module import LLMDataExample
10
11
  from rasa.llm_fine_tuning.storage import StorageContext
12
+ from rasa.llm_fine_tuning.utils import commands_as_string
11
13
 
12
14
  TRAIN_TEST_MODULE_STORAGE_LOCATION = "4_train_test_split"
13
15
 
14
- SUPPORTED_COMMANDS = [
15
- "SetSlot",
16
- "StartFlow",
17
- "CancelFlow",
18
- "ChitChat",
19
- "SkipQuestion",
20
- "SearchAndReply",
21
- "HumanHandoff",
22
- "Clarify",
23
- ]
24
-
25
16
  INSTRUCTION_DATA_FORMAT = "instruction"
26
17
  CONVERSATIONAL_DATA_FORMAT = "conversational"
27
18
 
@@ -77,17 +68,19 @@ class ConversationalDataFormat(DataExampleFormat):
77
68
  }
78
69
 
79
70
 
80
- def _get_command_types_covered_by_llm_data_point(commands: LLMDataExample) -> Set[str]:
71
+ def _get_command_types_covered_by_llm_data_point(
72
+ data_point: LLMDataExample,
73
+ ) -> Set[Type[PromptCommand]]:
81
74
  """Get the command types covered by the LLM data point.
82
75
 
83
76
  This function returns the set of command types from the output present in a
84
- LLMDataExample object. Eg: The function returns {'SetSlot', 'StartFlow'} when the
85
- LLMDataExample.output is 'SetSlot(slot, abc), SetSlot(slot, cde), StartFlow(xyz)'.
77
+ LLMDataExample object. Eg: The function returns {'SetSlotCommand',
78
+ 'StartFlowCommand'} when the LLMDataExample.output is 'SetSlotCommand(slot, abc),
79
+ SetSlotCommand(slot, cde), StartFlowCommand(xyz)'.
86
80
  """
87
81
  commands_covered = set()
88
- for command in SUPPORTED_COMMANDS:
89
- if command in commands.output:
90
- commands_covered.add(command)
82
+ for command in data_point.output:
83
+ commands_covered.add(command.__class__)
91
84
  return commands_covered
92
85
 
93
86
 
@@ -146,14 +139,18 @@ def _get_minimum_test_case_groups_to_cover_all_commands(
146
139
  {
147
140
  "test_case_name": "t1",
148
141
  "data_examples": [],
149
- "commands": {"SetSlot", "CancelFlow"}
142
+ "commands": {"SetSlotCommand", "CancelFlowCommand"}
150
143
  },
151
- {"test_case_name": "t2", "data_examples": [], "commands": {"CancelFlow"}},
152
- {"test_case_name": "t3", "data_examples": [], "commands": {"StartFlow"}},
144
+ {
145
+ "test_case_name": "t2",
146
+ "data_examples": [],
147
+ "commands": {"CancelFlowCommand"}
148
+ },
149
+ {"test_case_name": "t3", "data_examples": [], "commands": {"StartFlowCommand"}},
153
150
  {
154
151
  "test_case_name": "t4",
155
152
  "data_examples": [],
156
- "commands": {"SetSlot", "StartFlow"}
153
+ "commands": {"SetSlotCommand", "StartFlowCommand"}
157
154
  },
158
155
  ]
159
156
 
@@ -166,7 +163,7 @@ def _get_minimum_test_case_groups_to_cover_all_commands(
166
163
  command for test_group in grouped_data for command in test_group[KEY_COMMANDS]
167
164
  )
168
165
  selected_test_cases = []
169
- covered_commands: Set[str] = set()
166
+ covered_commands: Set[Type[PromptCommand]] = set()
170
167
 
171
168
  while covered_commands != all_commands:
172
169
  # Find the test case group that covers the most number of uncovered commands
@@ -187,7 +184,7 @@ def _get_minimum_test_case_groups_to_cover_all_commands(
187
184
 
188
185
  structlogger.info(
189
186
  "llm_fine_tuning.train_test_split_module.command_coverage_in_train_dataset",
190
- covered_commands=covered_commands,
187
+ covered_commands=[command.__name__ for command in covered_commands],
191
188
  )
192
189
  return selected_test_cases
193
190
 
@@ -205,7 +202,10 @@ def _get_finetuning_data_in_instruction_data_format(
205
202
  data: List[Dict[str, Any]],
206
203
  ) -> List[DataExampleFormat]:
207
204
  return [
208
- InstructionDataFormat(llm_data_example.prompt, llm_data_example.output)
205
+ InstructionDataFormat(
206
+ llm_data_example.prompt,
207
+ commands_as_string(llm_data_example.output),
208
+ )
209
209
  for test_group in data
210
210
  for llm_data_example in test_group[KEY_DATA_EXAMPLES]
211
211
  ]
@@ -232,7 +232,7 @@ def _get_finetuning_data_in_conversational_data_format(
232
232
  [
233
233
  ConversationalMessageDataFormat("user", llm_data_example.prompt),
234
234
  ConversationalMessageDataFormat(
235
- "assistant", llm_data_example.output
235
+ "assistant", commands_as_string(llm_data_example.output)
236
236
  ),
237
237
  ]
238
238
  )
@@ -271,7 +271,7 @@ def _check_and_log_missing_validation_dataset_command_coverage(
271
271
  structlogger.warning(
272
272
  "llm_fine_tuning.train_test_split_module.missing_commands_in_validation_dat"
273
273
  "aset",
274
- missing_commands=missing_commands,
274
+ missing_commands=[command.__name__ for command in missing_commands],
275
275
  )
276
276
 
277
277
 
@@ -0,0 +1,7 @@
1
+ from typing import List
2
+
3
+ from rasa.dialogue_understanding.commands.prompt_command import PromptCommand
4
+
5
+
6
+ def commands_as_string(commands: List[PromptCommand], delimiter: str = "\n") -> str:
7
+ return delimiter.join([command.to_dsl() for command in commands])
rasa/markers/marker.py CHANGED
@@ -1,15 +1,14 @@
1
1
  import logging
2
2
  from typing import List, Optional, Text
3
3
 
4
- from rasa.shared.core.domain import Domain
5
- from rasa.shared.core.events import ActionExecuted, Event, SlotSet, UserUttered
6
-
7
4
  from rasa.markers.marker_base import (
8
5
  ConditionMarker,
9
6
  Marker,
10
7
  MarkerRegistry,
11
8
  OperatorMarker,
12
9
  )
10
+ from rasa.shared.core.domain import Domain
11
+ from rasa.shared.core.events import ActionExecuted, Event, SlotSet, UserUttered
13
12
 
14
13
  logger = logging.getLogger(__name__)
15
14
 
@@ -6,9 +6,9 @@ from abc import ABC, abstractmethod
6
6
  from dataclasses import dataclass
7
7
  from pathlib import Path
8
8
  from typing import (
9
- ClassVar,
10
9
  TYPE_CHECKING,
11
10
  Any,
11
+ ClassVar,
12
12
  Dict,
13
13
  Iterator,
14
14
  List,
@@ -30,7 +30,6 @@ from rasa.shared.core.domain import Domain
30
30
  from rasa.shared.core.events import ActionExecuted, Event, UserUttered
31
31
  from rasa.shared.exceptions import InvalidConfigException, RasaException
32
32
  from rasa.utils.io import WriteRow
33
-
34
33
  from rasa.utils.yaml import (
35
34
  collect_configs_from_yaml_files,
36
35
  collect_yaml_files_from_path,
rasa/markers/upload.py CHANGED
@@ -3,10 +3,10 @@ from pathlib import Path
3
3
  from typing import Any, Dict, List, Text
4
4
 
5
5
  import requests
6
- from rasa.shared.core.domain import Domain
7
- from rasa.shared.utils.cli import print_error_and_exit
8
6
 
9
7
  from rasa.markers.validate import validate_marker_file
8
+ from rasa.shared.core.domain import Domain
9
+ from rasa.shared.utils.cli import print_error_and_exit
10
10
  from rasa.utils.yaml import (
11
11
  YAML_CONFIGS,
12
12
  collect_configs_from_yaml_files,
rasa/markers/validate.py CHANGED
@@ -1,10 +1,9 @@
1
1
  from pathlib import Path
2
2
 
3
- from rasa.shared.core.domain import Domain
4
- from rasa.shared.utils.cli import print_error_and_exit
5
-
6
3
  from rasa.markers.marker import OrMarker
7
4
  from rasa.markers.marker_base import Marker
5
+ from rasa.shared.core.domain import Domain
6
+ from rasa.shared.utils.cli import print_error_and_exit
8
7
 
9
8
 
10
9
  def validate_marker_file(domain: Domain, markers_path: Path) -> None:
rasa/model.py CHANGED
@@ -3,13 +3,11 @@ import hashlib
3
3
  import logging
4
4
  import os
5
5
  from pathlib import Path
6
- from subprocess import check_output, DEVNULL, CalledProcessError
7
- from typing import Text, Optional, Union
8
-
9
- from rasa.shared.constants import DEFAULT_MODELS_PATH
6
+ from subprocess import DEVNULL, CalledProcessError, check_output
7
+ from typing import Optional, Text, Union
10
8
 
11
9
  from rasa.exceptions import ModelNotFound
12
-
10
+ from rasa.shared.constants import DEFAULT_MODELS_PATH
13
11
 
14
12
  logger = logging.getLogger(__name__)
15
13
 
@@ -1,5 +1,5 @@
1
- import sys
2
1
  import os
2
+ import sys
3
3
 
4
4
  DEFAULT_SERVER_BASE_WORKING_DIRECTORY = "working-data"
5
5
 
@@ -1,21 +1,22 @@
1
1
  import asyncio
2
- from functools import wraps
3
2
  import os
3
+ from functools import wraps
4
4
  from http import HTTPStatus
5
5
  from typing import Any, Callable, Dict, Optional, Union
6
+
6
7
  import dotenv
7
8
  import psutil
9
+ import structlog
8
10
  from sanic import Blueprint, Sanic, response
9
- from sanic.response import json
10
11
  from sanic.exceptions import NotFound
11
12
  from sanic.request import Request
12
- import structlog
13
+ from sanic.response import json
13
14
  from socketio import AsyncServer
14
15
 
16
+ from rasa.constants import MODEL_ARCHIVE_EXTENSION
15
17
  from rasa.exceptions import ModelNotFound
16
18
  from rasa.model_manager import config
17
19
  from rasa.model_manager.config import SERVER_BASE_URL
18
- from rasa.constants import MODEL_ARCHIVE_EXTENSION
19
20
  from rasa.model_manager.runner_service import (
20
21
  BotSession,
21
22
  BotSessionStatus,
@@ -1,22 +1,22 @@
1
1
  import os
2
2
  import shutil
3
+ import subprocess
4
+ from enum import Enum
3
5
  from typing import Dict, Optional
6
+
4
7
  import aiohttp
5
8
  import structlog
6
- import subprocess
7
9
  from pydantic import BaseModel, ConfigDict
8
- from enum import Enum
9
10
 
11
+ from rasa.constants import MODEL_ARCHIVE_EXTENSION
10
12
  from rasa.exceptions import ModelNotFound
13
+ from rasa.model_manager import config
11
14
  from rasa.model_manager.utils import (
15
+ logs_path,
12
16
  models_base_path,
13
17
  subpath,
14
18
  write_encoded_data_to_file,
15
19
  )
16
- from rasa.constants import MODEL_ARCHIVE_EXTENSION
17
-
18
- from rasa.model_manager import config
19
- from rasa.model_manager.utils import logs_path
20
20
  from rasa.model_manager.warm_rasa_process import start_rasa_process
21
21
 
22
22
  structlogger = structlog.get_logger()
@@ -258,10 +258,13 @@ def run_bot(
258
258
 
259
259
  async def update_bot_status(bot: BotSession) -> None:
260
260
  """Update the status of a bot based on the process return code."""
261
- if bot.has_died_recently():
262
- set_bot_status_to_stopped(bot)
263
- elif await bot.completed_startup_recently():
264
- set_bot_status_to_running(bot)
261
+ try:
262
+ if bot.has_died_recently():
263
+ set_bot_status_to_stopped(bot)
264
+ elif await bot.completed_startup_recently():
265
+ set_bot_status_to_running(bot)
266
+ except Exception as e:
267
+ structlogger.error("model_runner.update_bot_status.error", error=str(e))
265
268
 
266
269
 
267
270
  def terminate_bot(bot: BotSession) -> None:
@@ -1,8 +1,10 @@
1
+ import json
1
2
  from typing import Any, Dict, Optional
2
3
 
3
- from socketio import AsyncServer
4
4
  import structlog
5
+ from socketio import AsyncServer
5
6
  from socketio.asyncio_client import AsyncClient
7
+ from socketio.exceptions import ConnectionRefusedError
6
8
 
7
9
  from rasa.model_manager.runner_service import BotSession
8
10
  from rasa.model_manager.studio_jwt_auth import (
@@ -28,7 +30,7 @@ async def socketio_websocket_traffic_wrapper(
28
30
 
29
31
  if auth_token is None:
30
32
  structlogger.error("model_runner.user_no_token", sid=sid)
31
- return False
33
+ raise ConnectionRefusedError("model_runner.user_no_token")
32
34
 
33
35
  try:
34
36
  authenticate_user_to_service(auth_token)
@@ -37,22 +39,22 @@ async def socketio_websocket_traffic_wrapper(
37
39
  structlogger.error(
38
40
  "model_runner.user_authentication_failed", sid=sid, error=str(error)
39
41
  )
40
- return False
42
+ raise ConnectionRefusedError("model_runner.user_authentication_failed")
41
43
 
42
44
  deployment_id = auth.get("deployment_id") if auth else None
43
45
 
44
46
  if deployment_id is None:
45
47
  structlogger.error("model_runner.bot_no_deployment_id", sid=sid)
46
- return False
48
+ raise ConnectionRefusedError("model_runner.bot_no_deployment_id")
47
49
 
48
50
  bot = running_bots.get(deployment_id)
49
51
  if bot is None:
50
52
  structlogger.error("model_runner.bot_not_found", deployment_id=deployment_id)
51
- return False
53
+ raise ConnectionRefusedError("model_runner.bot_not_found")
52
54
 
53
55
  if not bot.is_alive():
54
56
  structlogger.error("model_runner.bot_not_alive", deployment_id=deployment_id)
55
- return False
57
+ raise ConnectionRefusedError("model_runner.bot_not_alive")
56
58
 
57
59
  client = await create_bridge_client(sio, bot.internal_url, sid, deployment_id)
58
60
 
@@ -66,7 +68,7 @@ async def socketio_websocket_traffic_wrapper(
66
68
  structlogger.error(
67
69
  "model_runner.bot_connection_failed", deployment_id=deployment_id
68
70
  )
69
- return False
71
+ raise ConnectionRefusedError("model_runner.bot_connection_failed")
70
72
 
71
73
 
72
74
  def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession]) -> None:
@@ -92,7 +94,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
92
94
 
93
95
  @sio.on("*")
94
96
  async def handle_message(event: str, sid: str, data: Dict[str, Any]) -> None:
95
- """ "Bridge messages between user and bot.
97
+ """Bridge messages between user and bot.
96
98
 
97
99
  Both incoming user messages to the bot_url and
98
100
  bot responses sent back to the client need to
@@ -111,7 +113,7 @@ async def create_bridge_client(
111
113
  ) -> AsyncClient:
112
114
  """Create a new socket bridge client.
113
115
 
114
- Forwards messages comming from the bot to the user.
116
+ Forwards messages coming from the bot to the user.
115
117
  """
116
118
  client = AsyncClient()
117
119
 
@@ -129,6 +131,10 @@ async def create_bridge_client(
129
131
  structlogger.debug("model_runner.bot_message", deployment_id=deployment_id)
130
132
  await sio.emit("bot_message", data, room=sid)
131
133
 
134
+ @client.event # type: ignore[misc]
135
+ async def tracker(data: Dict[str, Any]) -> None:
136
+ await sio.emit("tracker", json.loads(data), room=sid)
137
+
132
138
  @client.event # type: ignore[misc]
133
139
  async def disconnect() -> None:
134
140
  structlogger.debug(
@@ -6,6 +6,7 @@ from typing import Any, Dict, Optional
6
6
  import jwt
7
7
  import requests
8
8
  import structlog
9
+
9
10
  from rasa.shared.exceptions import RasaException
10
11
 
11
12
  structlogger = structlog.get_logger()
@@ -1,23 +1,25 @@
1
1
  import os
2
- from typing import Any, Dict, Optional
3
2
  import shutil
4
- import structlog
5
3
  import subprocess
4
+ from enum import Enum
5
+ from typing import Any, Dict, Optional
6
+
7
+ import structlog
8
+ from pydantic import BaseModel, ConfigDict
9
+
6
10
  from rasa.constants import MODEL_ARCHIVE_EXTENSION
11
+ from rasa.model_manager import config
7
12
  from rasa.model_manager.utils import (
13
+ ensure_base_directory_exists,
14
+ logs_path,
8
15
  models_base_path,
9
16
  subpath,
10
17
  write_encoded_data_to_file,
11
18
  )
12
- from pydantic import BaseModel, ConfigDict
13
- from enum import Enum
14
-
15
- from rasa.model_manager import config
16
19
  from rasa.model_manager.warm_rasa_process import (
17
20
  start_rasa_process,
18
21
  )
19
22
  from rasa.model_training import generate_random_model_name
20
- from rasa.model_manager.utils import ensure_base_directory_exists, logs_path
21
23
 
22
24
  structlogger = structlog.get_logger()
23
25
 
@@ -1,5 +1,5 @@
1
- import os
2
1
  import base64
2
+ import os
3
3
  from typing import Optional
4
4
 
5
5
  import structlog
@@ -1,12 +1,16 @@
1
+ import os
1
2
  import shlex
2
3
  import subprocess
3
- from rasa.__main__ import main
4
- import os
4
+ import uuid
5
+ from dataclasses import dataclass
5
6
  from typing import List
7
+
6
8
  import structlog
7
- from dataclasses import dataclass
8
- import uuid
9
9
 
10
+ from rasa.__main__ import main
11
+ from rasa.dialogue_understanding.constants import (
12
+ RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME,
13
+ )
10
14
  from rasa.model_manager import config
11
15
  from rasa.model_manager.utils import ensure_base_directory_exists, logs_path
12
16
 
@@ -42,7 +46,7 @@ def _create_warm_rasa_process() -> WarmRasaProcess:
42
46
  ]
43
47
 
44
48
  envs = os.environ.copy()
45
- envs["RASA_TELEMETRY_ENABLED"] = "false"
49
+ envs[RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME] = "true"
46
50
 
47
51
  log_id = uuid.uuid4().hex
48
52
  log_path = logs_path(log_id)
@@ -146,14 +150,15 @@ def warmup() -> None:
146
150
  directly start.
147
151
  """
148
152
  try:
149
- import presidio_analyzer # noqa: F401
150
- import litellm # noqa: F401
151
153
  import langchain # noqa: F401
152
- import tensorflow # noqa: F401
154
+ import litellm # noqa: F401
153
155
  import matplotlib # noqa: F401
154
- import pandas # noqa: F401
155
156
  import numpy # noqa: F401
157
+ import pandas # noqa: F401
158
+ import presidio_analyzer # noqa: F401
156
159
  import spacy # noqa: F401
160
+ import tensorflow # noqa: F401
161
+
157
162
  import rasa.validator # noqa: F401
158
163
  except ImportError:
159
164
  pass
rasa/model_service.py CHANGED
@@ -1,18 +1,15 @@
1
1
  import logging
2
+ from urllib.parse import urlparse
2
3
 
3
- from sanic import Sanic
4
4
  import structlog
5
+ from sanic import Sanic
5
6
 
6
7
  from rasa.cli.scaffold import print_error_and_exit
7
8
  from rasa.core.persistor import RemoteStorageType, get_persistor
8
9
  from rasa.core.utils import list_routes
9
- from rasa.model_manager import model_api
10
- from rasa.model_manager import config
10
+ from rasa.model_manager import config, model_api
11
11
  from rasa.model_manager.config import SERVER_BASE_URL, SERVER_PORT
12
12
  from rasa.utils.common import configure_logging_and_warnings
13
- import rasa.utils.licensing
14
- from urllib.parse import urlparse
15
-
16
13
  from rasa.utils.log_utils import configure_structlog
17
14
  from rasa.utils.sanic_error_handler import register_custom_sanic_error_handler
18
15
 
@@ -64,6 +61,8 @@ def main() -> None:
64
61
  The API server can receive requests to train models, run bots, and manage
65
62
  the lifecycle of models and bots.
66
63
  """
64
+ import rasa.utils.licensing
65
+
67
66
  log_level = logging.DEBUG
68
67
  configure_logging_and_warnings(
69
68
  log_level=log_level,