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

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

Potentially problematic release.


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

Files changed (580) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +137 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -1,68 +1,38 @@
1
1
  import importlib.resources
2
- import re
3
- from typing import Dict, Any, List, Optional, Text
2
+ from typing import Any, Dict, Optional, Text
4
3
 
5
4
  import structlog
6
5
 
7
- import rasa.shared.utils.io
8
- from rasa.dialogue_understanding.commands import (
9
- Command,
10
- ErrorCommand,
11
- SetSlotCommand,
12
- CancelFlowCommand,
13
- HumanHandoffCommand,
14
- ChitChatAnswerCommand,
15
- SkipQuestionCommand,
16
- KnowledgeAnswerCommand,
17
- ClarifyCommand,
18
- CannotHandleCommand,
19
- RepeatBotMessagesCommand,
6
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
7
+ CommandSyntaxManager,
8
+ CommandSyntaxVersion,
20
9
  )
21
10
  from rasa.dialogue_understanding.generator.constants import (
11
+ DEFAULT_LLM_CONFIG,
12
+ FLOW_RETRIEVAL_KEY,
22
13
  LLM_CONFIG_KEY,
23
14
  USER_INPUT_CONFIG_KEY,
24
- FLOW_RETRIEVAL_KEY,
25
- DEFAULT_LLM_CONFIG,
26
15
  )
27
- from rasa.dialogue_understanding.generator.flow_retrieval import (
28
- FlowRetrieval,
16
+ from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
17
+ from rasa.dialogue_understanding.generator.single_step.compact_llm_command_generator import ( # noqa: E501
18
+ CompactLLMCommandGenerator,
29
19
  )
30
- from rasa.dialogue_understanding.generator.llm_based_command_generator import (
31
- LLMBasedCommandGenerator,
32
- )
33
- from rasa.dialogue_understanding.stack.utils import top_flow_frame
34
- from rasa.engine.graph import ExecutionContext
35
20
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
36
21
  from rasa.engine.storage.resource import Resource
37
22
  from rasa.engine.storage.storage import ModelStorage
38
23
  from rasa.shared.constants import (
39
- ROUTE_TO_CALM_SLOT,
24
+ EMBEDDINGS_CONFIG_KEY,
40
25
  PROMPT_CONFIG_KEY,
41
26
  PROMPT_TEMPLATE_CONFIG_KEY,
42
- EMBEDDINGS_CONFIG_KEY,
43
27
  )
44
- from rasa.shared.core.flows import FlowsList
45
- from rasa.shared.core.trackers import DialogueStateTracker
46
- from rasa.shared.exceptions import ProviderClientAPIException
47
- from rasa.shared.nlu.constants import TEXT, LLM_COMMANDS, LLM_PROMPT
48
- from rasa.shared.nlu.training_data.message import Message
49
28
  from rasa.shared.utils.io import deep_container_fingerprint
50
- from rasa.shared.utils.llm import (
51
- get_prompt_template,
52
- tracker_as_readable_transcript,
53
- sanitize_message_for_prompt,
54
- resolve_model_client_config,
55
- )
56
- from rasa.utils.beta import ensure_beta_feature_is_enabled, BetaNotEnabledException
57
- from rasa.utils.log_utils import log_llm
58
-
59
- COMMAND_PROMPT_FILE_NAME = "command_prompt.jinja2"
29
+ from rasa.shared.utils.llm import get_prompt_template, resolve_model_client_config
60
30
 
61
31
  DEFAULT_COMMAND_PROMPT_TEMPLATE = importlib.resources.read_text(
62
- "rasa.dialogue_understanding.generator.single_step",
32
+ "rasa.dialogue_understanding.generator.prompt_templates",
63
33
  "command_prompt_template.jinja2",
64
34
  )
65
- SINGLE_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE = "config.json"
35
+
66
36
 
67
37
  structlogger = structlog.get_logger()
68
38
 
@@ -73,7 +43,7 @@ structlogger = structlog.get_logger()
73
43
  ],
74
44
  is_trainable=True,
75
45
  )
76
- class SingleStepLLMCommandGenerator(LLMBasedCommandGenerator):
46
+ class SingleStepLLMCommandGenerator(CompactLLMCommandGenerator):
77
47
  """A single step LLM-based command generator."""
78
48
 
79
49
  def __init__(
@@ -102,20 +72,15 @@ class SingleStepLLMCommandGenerator(LLMBasedCommandGenerator):
102
72
  "Please use the config parameter 'prompt_template' instead. "
103
73
  ),
104
74
  )
105
- config_prompt = (
106
- config.get(PROMPT_CONFIG_KEY)
107
- or config.get(PROMPT_TEMPLATE_CONFIG_KEY)
108
- or None
109
- )
110
- self.prompt_template = prompt_template or get_prompt_template(
111
- config_prompt,
112
- DEFAULT_COMMAND_PROMPT_TEMPLATE,
75
+ self.prompt_template = self.resolve_component_prompt_template(
76
+ config, prompt_template
113
77
  )
114
78
 
115
- self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
116
- self.repeat_command_enabled = self.is_repeat_command_enabled()
79
+ # Set the command syntax version to v1
80
+ CommandSyntaxManager.set_syntax_version(
81
+ self.get_component_command_syntax_version()
82
+ )
117
83
 
118
- ### Implementations of LLMBasedCommandGenerator parent
119
84
  @staticmethod
120
85
  def get_default_config() -> Dict[str, Any]:
121
86
  """The component's default config (see parent class for full docstring)."""
@@ -127,279 +92,10 @@ class SingleStepLLMCommandGenerator(LLMBasedCommandGenerator):
127
92
  FLOW_RETRIEVAL_KEY: FlowRetrieval.get_default_config(),
128
93
  }
129
94
 
130
- @classmethod
131
- def load(
132
- cls: Any,
133
- config: Dict[str, Any],
134
- model_storage: ModelStorage,
135
- resource: Resource,
136
- execution_context: ExecutionContext,
137
- **kwargs: Any,
138
- ) -> "SingleStepLLMCommandGenerator":
139
- """Loads trained component (see parent class for full docstring)."""
140
-
141
- # Perform health check of the LLM API endpoint
142
- llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY, {}))
143
- cls.perform_llm_health_check(
144
- llm_config,
145
- DEFAULT_LLM_CONFIG,
146
- "single_step_llm_command_generator.load",
147
- SingleStepLLMCommandGenerator.__name__,
148
- )
149
-
150
- # load prompt template from the model storage.
151
- prompt_template = cls.load_prompt_template_from_model_storage(
152
- model_storage, resource, COMMAND_PROMPT_FILE_NAME
153
- )
154
-
155
- # init base command generator
156
- command_generator = cls(config, model_storage, resource, prompt_template)
157
- # load flow retrieval if enabled
158
- if command_generator.enabled_flow_retrieval:
159
- command_generator.flow_retrieval = cls.load_flow_retrival(
160
- command_generator.config, model_storage, resource
161
- )
162
-
163
- return command_generator
164
-
165
- def persist(self) -> None:
166
- """Persist this component to disk for future loading."""
167
- self._persist_prompt_template()
168
- self._persist_config()
169
- if self.flow_retrieval is not None:
170
- self.flow_retrieval.persist()
171
-
172
- def _persist_prompt_template(self) -> None:
173
- """Persist prompt template for future loading."""
174
- with self._model_storage.write_to(self._resource) as path:
175
- rasa.shared.utils.io.write_text_file(
176
- self.prompt_template, path / COMMAND_PROMPT_FILE_NAME
177
- )
178
-
179
- def _persist_config(self) -> None:
180
- """Persist config as a source of truth for resolved clients."""
181
- with self._model_storage.write_to(self._resource) as path:
182
- rasa.shared.utils.io.dump_obj_as_json_to_file(
183
- path / SINGLE_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE, self.config
184
- )
185
-
186
- async def predict_commands(
187
- self,
188
- message: Message,
189
- flows: FlowsList,
190
- tracker: Optional[DialogueStateTracker] = None,
191
- **kwargs: Any,
192
- ) -> List[Command]:
193
- """Predict commands using the LLM.
194
-
195
- Args:
196
- message: The message from the user.
197
- flows: The flows available to the user.
198
- tracker: The tracker containing the current state of the conversation.
199
- **kwargs: Keyword arguments for forward compatibility.
200
-
201
- Returns:
202
- The commands generated by the llm.
203
- """
204
- if tracker is None or flows.is_empty():
205
- # cannot do anything if there are no flows or no tracker
206
- return []
207
-
208
- try:
209
- commands = await self._predict_commands(message, flows, tracker)
210
- except ProviderClientAPIException:
211
- # if command predictions resulted in API exception
212
- # "predict" the ErrorCommand
213
- commands = [ErrorCommand()]
214
-
215
- if not commands:
216
- # no commands are parsed or there's an invalid command
217
- structlogger.warning(
218
- "single_step_llm_command_generator.predict_commands",
219
- message="No commands were predicted as the LLM response could "
220
- "not be parsed or the LLM responded with an invalid command."
221
- "Returning a CannotHandleCommand instead.",
222
- )
223
- commands = [CannotHandleCommand()]
224
-
225
- if tracker.has_coexistence_routing_slot:
226
- # if coexistence feature is used, set the routing slot
227
- commands += [SetSlotCommand(ROUTE_TO_CALM_SLOT, True)]
228
-
229
- log_llm(
230
- logger=structlogger,
231
- log_module="SingleStepLLMCommandGenerator",
232
- log_event="llm_command_generator.predict_commands.finished",
233
- commands=commands,
234
- )
235
-
236
- return commands
237
-
238
- async def _predict_commands(
239
- self,
240
- message: Message,
241
- flows: FlowsList,
242
- tracker: Optional[DialogueStateTracker] = None,
243
- ) -> List[Command]:
244
- """Predict commands using the LLM.
245
-
246
- Args:
247
- message: The message from the user.
248
- flows: The flows available to the user.
249
- tracker: The tracker containing the current state of the conversation.
250
-
251
- Returns:
252
- The commands generated by the llm.
253
-
254
- Raises:
255
- ProviderClientAPIException: If API calls raised an error.
256
- """
257
- # retrieve flows
258
- filtered_flows = await self.filter_flows(message, flows, tracker)
259
-
260
- flow_prompt = self.render_template(message, tracker, filtered_flows, flows)
261
- log_llm(
262
- logger=structlogger,
263
- log_module="SingleStepLLMCommandGenerator",
264
- log_event="llm_command_generator.predict_commands.prompt_rendered",
265
- prompt=flow_prompt,
266
- )
267
-
268
- action_list = await self.invoke_llm(flow_prompt)
269
- # The check for 'None' maintains compatibility with older versions
270
- # of LLMCommandGenerator. In previous implementations, 'invoke_llm'
271
- # might return 'None' to indicate a failure to generate actions.
272
- if action_list is None:
273
- return [ErrorCommand()]
274
-
275
- log_llm(
276
- logger=structlogger,
277
- log_module="SingleStepLLMCommandGenerator",
278
- log_event="llm_command_generator.predict_commands.actions_generated",
279
- action_list=action_list,
280
- )
281
-
282
- commands = self.parse_commands(action_list, tracker, flows)
283
-
284
- self._update_message_parse_data_for_fine_tuning(message, commands, flow_prompt)
285
-
286
- return commands
287
-
288
- @staticmethod
289
- def _update_message_parse_data_for_fine_tuning(
290
- message: Message, commands: List[Command], prompt: str
291
- ) -> None:
292
- from rasa.llm_fine_tuning.annotation_module import preparing_fine_tuning_data
293
-
294
- if preparing_fine_tuning_data:
295
- # Add commands and prompt to the message object in order to create
296
- # prompt -> commands pairs for fine-tuning
297
- message.set(
298
- LLM_COMMANDS,
299
- [command.as_dict() for command in commands],
300
- add_to_output=True,
301
- )
302
- message.set(LLM_PROMPT, prompt, add_to_output=True)
303
-
304
- @classmethod
305
- def parse_commands(
306
- cls, actions: Optional[str], tracker: DialogueStateTracker, flows: FlowsList
307
- ) -> List[Command]:
308
- """Parse the actions returned by the llm into intent and entities.
309
-
310
- Args:
311
- actions: The actions returned by the llm.
312
- tracker: The tracker containing the current state of the conversation.
313
- flows: the list of flows
314
-
315
- Returns:
316
- The parsed commands.
317
- """
318
- if actions is None:
319
- return []
320
-
321
- commands: List[Command] = []
322
-
323
- slot_set_re = re.compile(
324
- r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
325
- )
326
- start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
327
- cancel_flow_re = re.compile(r"CancelFlow\(\)")
328
- chitchat_re = re.compile(r"ChitChat\(\)")
329
- skip_question_re = re.compile(r"SkipQuestion\(\)")
330
- knowledge_re = re.compile(r"SearchAndReply\(\)")
331
- humand_handoff_re = re.compile(r"HumanHandoff\(\)")
332
- clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
333
- repeat_re = re.compile(r"RepeatLastBotMessages\(\)")
334
-
335
- for action in actions.strip().splitlines():
336
- if match := slot_set_re.search(action):
337
- slot_name = match.group(1).strip()
338
- slot_value = cls.clean_extracted_value(match.group(2))
339
- # error case where the llm tries to start a flow using a slot set
340
- if slot_name == "flow_name":
341
- commands.extend(cls.start_flow_by_name(slot_value, flows))
342
- else:
343
- typed_slot_value = cls.get_nullable_slot_value(slot_value)
344
- commands.append(
345
- SetSlotCommand(name=slot_name, value=typed_slot_value)
346
- )
347
- elif match := start_flow_re.search(action):
348
- flow_name = match.group(1).strip()
349
- commands.extend(cls.start_flow_by_name(flow_name, flows))
350
- elif cancel_flow_re.search(action):
351
- commands.append(CancelFlowCommand())
352
- elif chitchat_re.search(action):
353
- commands.append(ChitChatAnswerCommand())
354
- elif skip_question_re.search(action):
355
- commands.append(SkipQuestionCommand())
356
- elif knowledge_re.search(action):
357
- commands.append(KnowledgeAnswerCommand())
358
- elif humand_handoff_re.search(action):
359
- commands.append(HumanHandoffCommand())
360
- elif repeat_re.search(action):
361
- commands.append(RepeatBotMessagesCommand())
362
- elif match := clarify_re.search(action):
363
- options = sorted([opt.strip() for opt in match.group(1).split(",")])
364
- # Remove surrounding quotes if present
365
- cleaned_options = []
366
- for flow in options:
367
- if (flow.startswith('"') and flow.endswith('"')) or (
368
- flow.startswith("'") and flow.endswith("'")
369
- ):
370
- cleaned_options.append(flow[1:-1])
371
- else:
372
- cleaned_options.append(flow)
373
- # check if flow is valid
374
- valid_options = [
375
- flow for flow in cleaned_options if flow in flows.user_flow_ids
376
- ]
377
- if len(set(valid_options)) == 1:
378
- commands.extend(cls.start_flow_by_name(valid_options[0], flows))
379
- elif len(valid_options) > 1:
380
- commands.append(ClarifyCommand(valid_options))
381
-
382
- if not commands:
383
- structlogger.debug(
384
- "single_step_llm_command_generator.parse_commands",
385
- message="No commands were parsed from the LLM actions.",
386
- actions=actions,
387
- )
388
-
389
- return commands
390
-
391
95
  @classmethod
392
96
  def fingerprint_addon(cls: Any, config: Dict[str, Any]) -> Optional[str]:
393
97
  """Add a fingerprint for the graph."""
394
- config_prompt = (
395
- config.get(PROMPT_CONFIG_KEY)
396
- or config.get(PROMPT_TEMPLATE_CONFIG_KEY)
397
- or None
398
- )
399
- prompt_template = get_prompt_template(
400
- config_prompt,
401
- DEFAULT_COMMAND_PROMPT_TEMPLATE,
402
- )
98
+ prompt_template = cls.resolve_component_prompt_template(config)
403
99
  llm_config = resolve_model_client_config(
404
100
  config.get(LLM_CONFIG_KEY), SingleStepLLMCommandGenerator.__name__
405
101
  )
@@ -411,68 +107,27 @@ class SingleStepLLMCommandGenerator(LLMBasedCommandGenerator):
411
107
  [prompt_template, llm_config, embedding_config]
412
108
  )
413
109
 
414
- ### Helper methods
415
- def render_template(
416
- self,
417
- message: Message,
418
- tracker: DialogueStateTracker,
419
- startable_flows: FlowsList,
420
- all_flows: FlowsList,
421
- ) -> str:
422
- """Render the jinja template to create the prompt for the LLM.
423
-
424
- Args:
425
- message: The current message from the user.
426
- tracker: The tracker containing the current state of the conversation.
427
- startable_flows: The flows startable at this point in time by the user.
428
- all_flows: all flows present in the assistant
429
-
430
- Returns:
431
- The rendered prompt template.
432
- """
433
- # need to make this distinction here because current step of the
434
- # top_calling_frame would be the call step, but we need the collect step from
435
- # the called frame. If no call is active calling and called frame are the same.
436
- top_calling_frame = top_flow_frame(tracker.stack)
437
- top_called_frame = top_flow_frame(tracker.stack, ignore_call_frames=False)
110
+ @staticmethod
111
+ def get_default_llm_config() -> Dict[str, Any]:
112
+ """Get the default LLM config for the command generator."""
113
+ return DEFAULT_LLM_CONFIG
438
114
 
439
- top_flow = top_calling_frame.flow(all_flows) if top_calling_frame else None
440
- current_step = top_called_frame.step(all_flows) if top_called_frame else None
115
+ @staticmethod
116
+ def get_component_command_syntax_version() -> CommandSyntaxVersion:
117
+ return CommandSyntaxVersion.v1
441
118
 
442
- flow_slots = self.prepare_current_flow_slots_for_template(
443
- top_flow, current_step, tracker
119
+ @staticmethod
120
+ def resolve_component_prompt_template(
121
+ config: Dict[str, Any], prompt_template: Optional[str] = None
122
+ ) -> Optional[str]:
123
+ """Get the prompt template from the config or the default prompt template."""
124
+ # Get the default prompt template based on the model name.
125
+ config_prompt = (
126
+ config.get(PROMPT_CONFIG_KEY)
127
+ or config.get(PROMPT_TEMPLATE_CONFIG_KEY)
128
+ or None
444
129
  )
445
- current_slot, current_slot_description = self.prepare_current_slot_for_template(
446
- current_step
130
+ return prompt_template or get_prompt_template(
131
+ config_prompt,
132
+ DEFAULT_COMMAND_PROMPT_TEMPLATE,
447
133
  )
448
- current_conversation = tracker_as_readable_transcript(tracker)
449
- latest_user_message = sanitize_message_for_prompt(message.get(TEXT))
450
- current_conversation += f"\nUSER: {latest_user_message}"
451
-
452
- inputs = {
453
- "available_flows": self.prepare_flows_for_template(
454
- startable_flows, tracker
455
- ),
456
- "current_conversation": current_conversation,
457
- "flow_slots": flow_slots,
458
- "current_flow": top_flow.id if top_flow is not None else None,
459
- "current_slot": current_slot,
460
- "current_slot_description": current_slot_description,
461
- "user_message": latest_user_message,
462
- "is_repeat_command_enabled": self.repeat_command_enabled,
463
- }
464
-
465
- return self.compile_template(self.prompt_template).render(**inputs)
466
-
467
- def is_repeat_command_enabled(self) -> bool:
468
- """Check for feature flag"""
469
- RASA_PRO_BETA_REPEAT_COMMAND_ENV_VAR_NAME = "RASA_PRO_BETA_REPEAT_COMMAND"
470
- try:
471
- ensure_beta_feature_is_enabled(
472
- "Repeat Command",
473
- env_flag=RASA_PRO_BETA_REPEAT_COMMAND_ENV_VAR_NAME,
474
- )
475
- except BetaNotEnabledException:
476
- return False
477
-
478
- return True
@@ -0,0 +1,76 @@
1
+ from typing import Dict, List, Set, Type
2
+
3
+ from rasa.dialogue_understanding.commands import (
4
+ CancelFlowCommand,
5
+ CannotHandleCommand,
6
+ ChitChatAnswerCommand,
7
+ Command,
8
+ CorrectSlotsCommand,
9
+ HumanHandoffCommand,
10
+ KnowledgeAnswerCommand,
11
+ RestartCommand,
12
+ SessionStartCommand,
13
+ SetSlotCommand,
14
+ SkipQuestionCommand,
15
+ )
16
+ from rasa.dialogue_understanding.commands.user_silence_command import UserSilenceCommand
17
+ from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
18
+ from rasa.dialogue_understanding.patterns.cannot_handle import (
19
+ CannotHandlePatternFlowStackFrame,
20
+ )
21
+ from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
22
+ from rasa.dialogue_understanding.patterns.human_handoff import (
23
+ HumanHandoffPatternFlowStackFrame,
24
+ )
25
+ from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
26
+ from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
27
+ from rasa.dialogue_understanding.patterns.session_start import (
28
+ SessionStartPatternFlowStackFrame,
29
+ )
30
+ from rasa.dialogue_understanding.patterns.skip_question import (
31
+ SkipQuestionPatternFlowStackFrame,
32
+ )
33
+ from rasa.dialogue_understanding.patterns.user_silence import (
34
+ UserSilencePatternFlowStackFrame,
35
+ )
36
+
37
+ triggerable_pattern_to_command_class: Dict[str, Type[Command]] = {
38
+ SessionStartPatternFlowStackFrame.flow_id: SessionStartCommand,
39
+ UserSilencePatternFlowStackFrame.flow_id: UserSilenceCommand,
40
+ CancelPatternFlowStackFrame.flow_id: CancelFlowCommand,
41
+ ChitchatPatternFlowStackFrame.flow_id: ChitChatAnswerCommand,
42
+ HumanHandoffPatternFlowStackFrame.flow_id: HumanHandoffCommand,
43
+ SearchPatternFlowStackFrame.flow_id: KnowledgeAnswerCommand,
44
+ SkipQuestionPatternFlowStackFrame.flow_id: SkipQuestionCommand,
45
+ CannotHandlePatternFlowStackFrame.flow_id: CannotHandleCommand,
46
+ RestartPatternFlowStackFrame.flow_id: RestartCommand,
47
+ }
48
+
49
+
50
+ def filter_slot_commands(
51
+ commands: List[Command], overlapping_slot_names: Set[str]
52
+ ) -> List[Command]:
53
+ """Filter out slot commands that set overlapping slots."""
54
+ filtered_commands = []
55
+
56
+ for command in commands:
57
+ if (
58
+ isinstance(command, SetSlotCommand)
59
+ and command.name in overlapping_slot_names
60
+ ):
61
+ continue
62
+
63
+ if isinstance(command, CorrectSlotsCommand):
64
+ allowed_slots = [
65
+ slot
66
+ for slot in command.corrected_slots
67
+ if slot.name not in overlapping_slot_names
68
+ ]
69
+ if not allowed_slots:
70
+ continue
71
+
72
+ command.corrected_slots = allowed_slots
73
+
74
+ filtered_commands.append(command)
75
+
76
+ return filtered_commands
@@ -1,8 +1,10 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass, field
3
4
  from typing import Any, Dict, List, Optional
4
5
 
5
6
  import structlog
7
+
6
8
  from rasa.core.actions import action
7
9
  from rasa.core.channels.channel import OutputChannel
8
10
  from rasa.core.nlg.generator import NaturalLanguageGenerator
@@ -18,7 +20,6 @@ from rasa.shared.core.flows.steps.constants import END_STEP
18
20
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
19
21
  from rasa.shared.core.trackers import DialogueStateTracker
20
22
 
21
-
22
23
  structlogger = structlog.get_logger()
23
24
 
24
25
  FLOW_PATTERN_CANCEL = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "cancel_flow"
@@ -1,4 +1,5 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict, Optional, Text
4
5
 
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict
4
5
 
5
6
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
6
7
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
7
8
 
8
-
9
9
  FLOW_PATTERN_CHITCHAT = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "chitchat"
10
10
 
11
11
 
@@ -1,8 +1,10 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass, field
3
4
  from typing import Any, Dict, List, Optional
4
5
 
5
6
  import structlog
7
+
6
8
  from rasa.core.actions import action
7
9
  from rasa.core.channels.channel import OutputChannel
8
10
  from rasa.core.nlg.generator import NaturalLanguageGenerator
@@ -13,7 +15,6 @@ from rasa.shared.core.domain import Domain
13
15
  from rasa.shared.core.events import Event
14
16
  from rasa.shared.core.trackers import DialogueStateTracker
15
17
 
16
-
17
18
  structlogger = structlog.get_logger()
18
19
 
19
20
  FLOW_PATTERN_CLARIFICATION = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "clarification"
@@ -1,8 +1,10 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict
4
5
 
5
6
  import structlog
7
+
6
8
  from rasa.dialogue_understanding.stack.frames import (
7
9
  PatternFlowStackFrame,
8
10
  )
@@ -1,11 +1,14 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict, List, Optional
4
- from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
5
- from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
6
- from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
7
- from rasa.shared.core.flows.steps.collect import SlotRejection
8
5
 
6
+ from rasa.dialogue_understanding.stack.frames import (
7
+ DialogueStackFrame,
8
+ PatternFlowStackFrame,
9
+ )
10
+ from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
11
+ from rasa.shared.core.slots import SlotRejection
9
12
 
10
13
  FLOW_PATTERN_COLLECT_INFORMATION = (
11
14
  RASA_DEFAULT_FLOW_PATTERN_PREFIX + "collect_information"
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict
4
5
 
5
6
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
6
7
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
7
8
 
8
-
9
9
  FLOW_PATTERN_COMPLETED = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "completed"
10
10
 
11
11
 
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict
4
5
 
5
6
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
6
7
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
7
8
 
8
-
9
9
  FLOW_PATTERN_CONTINUE_INTERRUPTED = (
10
10
  RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
11
11
  )