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

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

Potentially problematic release.


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

Files changed (559) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +135 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  73. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  76. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  82. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
  88. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
  95. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  96. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
  97. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
  99. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
  103. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
  106. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
  107. rasa/core/channels/inspector/dist/index.html +1 -1
  108. rasa/core/channels/inspector/package.json +1 -0
  109. rasa/core/channels/inspector/src/App.tsx +15 -2
  110. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  111. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  112. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  113. rasa/core/channels/inspector/yarn.lock +5 -0
  114. rasa/core/channels/mattermost.py +4 -4
  115. rasa/core/channels/rasa_chat.py +4 -4
  116. rasa/core/channels/rest.py +11 -12
  117. rasa/core/channels/rocketchat.py +4 -3
  118. rasa/core/channels/slack.py +6 -5
  119. rasa/core/channels/socketio.py +8 -28
  120. rasa/core/channels/studio_chat.py +212 -0
  121. rasa/core/channels/telegram.py +105 -55
  122. rasa/core/channels/twilio.py +3 -3
  123. rasa/core/channels/vier_cvg.py +2 -2
  124. rasa/core/channels/voice_ready/audiocodes.py +9 -9
  125. rasa/core/channels/voice_ready/jambonz.py +5 -5
  126. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  127. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  128. rasa/core/channels/voice_ready/utils.py +2 -2
  129. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  130. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  131. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  132. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  133. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  134. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  135. rasa/core/channels/voice_stream/call_state.py +6 -2
  136. rasa/core/channels/voice_stream/genesys.py +320 -0
  137. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  138. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  139. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  140. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  141. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  142. rasa/core/channels/voice_stream/util.py +1 -1
  143. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  144. rasa/core/channels/webexteams.py +3 -4
  145. rasa/core/constants.py +2 -0
  146. rasa/core/evaluation/marker.py +7 -6
  147. rasa/core/evaluation/marker_base.py +15 -16
  148. rasa/core/evaluation/marker_stats.py +3 -4
  149. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  150. rasa/core/exporter.py +4 -4
  151. rasa/core/featurizers/precomputation.py +8 -8
  152. rasa/core/featurizers/single_state_featurizer.py +7 -7
  153. rasa/core/featurizers/tracker_featurizers.py +13 -13
  154. rasa/core/http_interpreter.py +3 -4
  155. rasa/core/information_retrieval/__init__.py +1 -1
  156. rasa/core/information_retrieval/faiss.py +4 -4
  157. rasa/core/information_retrieval/information_retrieval.py +2 -2
  158. rasa/core/information_retrieval/milvus.py +3 -3
  159. rasa/core/information_retrieval/qdrant.py +3 -3
  160. rasa/core/jobs.py +1 -0
  161. rasa/core/lock.py +2 -3
  162. rasa/core/lock_store.py +3 -3
  163. rasa/core/migrate.py +12 -9
  164. rasa/core/nlg/__init__.py +1 -1
  165. rasa/core/nlg/callback.py +2 -3
  166. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  167. rasa/core/nlg/generator.py +85 -17
  168. rasa/core/nlg/interpolator.py +4 -3
  169. rasa/core/nlg/response.py +9 -7
  170. rasa/core/nlg/summarize.py +1 -0
  171. rasa/core/nlg/translate.py +55 -0
  172. rasa/core/persistor.py +3 -3
  173. rasa/core/policies/ensemble.py +10 -9
  174. rasa/core/policies/enterprise_search_policy.py +87 -21
  175. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  176. rasa/core/policies/flow_policy.py +13 -14
  177. rasa/core/policies/flows/flow_executor.py +85 -55
  178. rasa/core/policies/intentless_policy.py +6 -7
  179. rasa/core/policies/memoization.py +22 -20
  180. rasa/core/policies/policy.py +24 -22
  181. rasa/core/policies/rule_policy.py +37 -36
  182. rasa/core/policies/ted_policy.py +87 -85
  183. rasa/core/policies/unexpected_intent_policy.py +77 -75
  184. rasa/core/processor.py +167 -74
  185. rasa/core/run.py +5 -4
  186. rasa/core/secrets_manager/endpoints.py +2 -3
  187. rasa/core/secrets_manager/factory.py +2 -3
  188. rasa/core/secrets_manager/secret_manager.py +2 -3
  189. rasa/core/secrets_manager/vault.py +2 -2
  190. rasa/core/test.py +30 -30
  191. rasa/core/tracker_store.py +138 -49
  192. rasa/core/train.py +1 -1
  193. rasa/core/training/__init__.py +2 -2
  194. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  195. rasa/core/training/interactive.py +13 -13
  196. rasa/core/training/story_conflict.py +4 -5
  197. rasa/core/training/training.py +3 -5
  198. rasa/core/utils.py +5 -5
  199. rasa/core/visualize.py +1 -1
  200. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  201. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  202. rasa/dialogue_understanding/commands/__init__.py +22 -22
  203. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  204. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  205. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  206. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  207. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  208. rasa/dialogue_understanding/commands/command.py +3 -2
  209. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  210. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  211. rasa/dialogue_understanding/commands/error_command.py +1 -1
  212. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  213. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  214. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  215. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  216. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  217. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  218. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  219. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  220. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  221. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  222. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  223. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  224. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  225. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  226. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  227. rasa/dialogue_understanding/commands/utils.py +126 -43
  228. rasa/dialogue_understanding/constants.py +2 -0
  229. rasa/dialogue_understanding/generator/__init__.py +2 -0
  230. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  231. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  232. rasa/dialogue_understanding/generator/constants.py +12 -4
  233. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  234. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  235. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  236. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  237. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  238. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  239. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  240. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  241. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  242. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  243. rasa/dialogue_understanding/generator/utils.py +76 -0
  244. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  245. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  246. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  247. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  248. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  249. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  250. rasa/dialogue_understanding/patterns/completed.py +1 -1
  251. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  252. rasa/dialogue_understanding/patterns/correction.py +17 -3
  253. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  254. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  255. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  256. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  257. rasa/dialogue_understanding/patterns/search.py +1 -1
  258. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  259. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  260. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  261. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  262. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  263. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  264. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  265. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  266. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  267. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  268. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  269. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  270. rasa/dialogue_understanding/stack/utils.py +56 -10
  271. rasa/dialogue_understanding/utils.py +164 -0
  272. rasa/dialogue_understanding_test/README.md +429 -0
  273. rasa/dialogue_understanding_test/__init__.py +0 -0
  274. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  275. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  276. rasa/dialogue_understanding_test/constants.py +22 -0
  277. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  278. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  279. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  280. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  281. rasa/dialogue_understanding_test/io.py +443 -0
  282. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  283. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  285. rasa/dialogue_understanding_test/utils.py +70 -0
  286. rasa/dialogue_understanding_test/validation.py +77 -0
  287. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  288. rasa/e2e_test/assertions.py +202 -175
  289. rasa/e2e_test/assertions_schema.yml +6 -0
  290. rasa/e2e_test/constants.py +16 -1
  291. rasa/e2e_test/e2e_config.py +102 -41
  292. rasa/e2e_test/e2e_config_schema.yml +28 -10
  293. rasa/e2e_test/e2e_test_case.py +5 -5
  294. rasa/e2e_test/e2e_test_converter.py +2 -3
  295. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  296. rasa/e2e_test/e2e_test_result.py +1 -1
  297. rasa/e2e_test/e2e_test_runner.py +143 -38
  298. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  299. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  300. rasa/e2e_test/stub_custom_action.py +1 -1
  301. rasa/e2e_test/utils/generative_assertions.py +243 -0
  302. rasa/e2e_test/utils/io.py +123 -93
  303. rasa/e2e_test/utils/validation.py +101 -3
  304. rasa/engine/caching.py +5 -7
  305. rasa/engine/constants.py +1 -1
  306. rasa/engine/graph.py +3 -2
  307. rasa/engine/language.py +182 -0
  308. rasa/engine/recipes/config_files/default_config.yml +4 -0
  309. rasa/engine/recipes/default_components.py +13 -15
  310. rasa/engine/recipes/default_recipe.py +65 -49
  311. rasa/engine/recipes/graph_recipe.py +10 -7
  312. rasa/engine/recipes/recipe.py +2 -2
  313. rasa/engine/runner/dask.py +2 -2
  314. rasa/engine/runner/interface.py +1 -0
  315. rasa/engine/storage/local_model_storage.py +6 -4
  316. rasa/engine/storage/resource.py +2 -1
  317. rasa/engine/storage/storage.py +8 -3
  318. rasa/engine/training/components.py +2 -1
  319. rasa/engine/training/fingerprinting.py +4 -2
  320. rasa/engine/training/graph_trainer.py +4 -4
  321. rasa/engine/training/hooks.py +2 -2
  322. rasa/engine/validation.py +36 -33
  323. rasa/exceptions.py +3 -2
  324. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  325. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  326. rasa/graph_components/providers/domain_provider.py +3 -2
  327. rasa/graph_components/providers/flows_provider.py +2 -3
  328. rasa/graph_components/providers/forms_provider.py +4 -4
  329. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  330. rasa/graph_components/providers/responses_provider.py +4 -4
  331. rasa/graph_components/providers/rule_only_provider.py +3 -2
  332. rasa/graph_components/providers/story_graph_provider.py +8 -8
  333. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  334. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  335. rasa/graph_components/validators/finetuning_validator.py +10 -8
  336. rasa/hooks.py +19 -14
  337. rasa/jupyter.py +2 -2
  338. rasa/llm_fine_tuning/annotation_module.py +4 -4
  339. rasa/llm_fine_tuning/conversations.py +5 -33
  340. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  341. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  342. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  343. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  344. rasa/llm_fine_tuning/storage.py +3 -3
  345. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  346. rasa/llm_fine_tuning/utils.py +7 -0
  347. rasa/markers/marker.py +2 -3
  348. rasa/markers/marker_base.py +1 -2
  349. rasa/markers/upload.py +2 -2
  350. rasa/markers/validate.py +2 -3
  351. rasa/model.py +3 -5
  352. rasa/model_manager/config.py +1 -1
  353. rasa/model_manager/model_api.py +5 -4
  354. rasa/model_manager/runner_service.py +13 -10
  355. rasa/model_manager/socket_bridge.py +15 -9
  356. rasa/model_manager/studio_jwt_auth.py +1 -0
  357. rasa/model_manager/trainer_service.py +9 -7
  358. rasa/model_manager/utils.py +1 -1
  359. rasa/model_manager/warm_rasa_process.py +14 -9
  360. rasa/model_service.py +5 -6
  361. rasa/model_testing.py +13 -15
  362. rasa/model_training.py +29 -29
  363. rasa/nlu/classifiers/diet_classifier.py +72 -73
  364. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  365. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  366. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  367. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  368. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  369. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  370. rasa/nlu/convert.py +2 -2
  371. rasa/nlu/emulators/dialogflow.py +3 -3
  372. rasa/nlu/emulators/luis.py +5 -5
  373. rasa/nlu/emulators/no_emulator.py +1 -0
  374. rasa/nlu/emulators/wit.py +4 -4
  375. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  376. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  377. rasa/nlu/extractors/entity_synonyms.py +10 -9
  378. rasa/nlu/extractors/extractor.py +16 -16
  379. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  380. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  381. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  382. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  383. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  384. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  385. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  386. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  387. rasa/nlu/featurizers/featurizer.py +5 -4
  388. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  389. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  390. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  391. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  392. rasa/nlu/model.py +0 -1
  393. rasa/nlu/selectors/response_selector.py +67 -68
  394. rasa/nlu/test.py +38 -38
  395. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  396. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  397. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  398. rasa/nlu/tokenizers/tokenizer.py +6 -7
  399. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  400. rasa/nlu/utils/bilou_utils.py +7 -7
  401. rasa/nlu/utils/hugging_face/registry.py +22 -22
  402. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  403. rasa/nlu/utils/mitie_utils.py +2 -1
  404. rasa/nlu/utils/pattern_utils.py +1 -1
  405. rasa/nlu/utils/spacy_utils.py +3 -3
  406. rasa/plugin.py +12 -1
  407. rasa/server.py +3 -2
  408. rasa/shared/constants.py +45 -18
  409. rasa/shared/core/command_payload_reader.py +15 -7
  410. rasa/shared/core/constants.py +34 -4
  411. rasa/shared/core/conversation.py +1 -2
  412. rasa/shared/core/domain.py +19 -20
  413. rasa/shared/core/events.py +60 -39
  414. rasa/shared/core/flows/__init__.py +0 -1
  415. rasa/shared/core/flows/constants.py +11 -0
  416. rasa/shared/core/flows/flow.py +107 -26
  417. rasa/shared/core/flows/flow_step.py +4 -3
  418. rasa/shared/core/flows/flow_step_links.py +1 -2
  419. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  420. rasa/shared/core/flows/flows_list.py +3 -3
  421. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  422. rasa/shared/core/flows/nlu_trigger.py +1 -1
  423. rasa/shared/core/flows/steps/__init__.py +2 -2
  424. rasa/shared/core/flows/steps/action.py +1 -1
  425. rasa/shared/core/flows/steps/call.py +1 -1
  426. rasa/shared/core/flows/steps/collect.py +22 -40
  427. rasa/shared/core/flows/steps/internal.py +1 -1
  428. rasa/shared/core/flows/steps/link.py +1 -1
  429. rasa/shared/core/flows/steps/no_operation.py +2 -2
  430. rasa/shared/core/flows/steps/set_slots.py +1 -1
  431. rasa/shared/core/flows/utils.py +44 -4
  432. rasa/shared/core/flows/validation.py +4 -6
  433. rasa/shared/core/generator.py +20 -21
  434. rasa/shared/core/slot_mappings.py +360 -121
  435. rasa/shared/core/slots.py +163 -6
  436. rasa/shared/core/trackers.py +108 -33
  437. rasa/shared/core/training_data/loading.py +1 -1
  438. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  439. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  440. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  441. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  442. rasa/shared/core/training_data/structures.py +11 -12
  443. rasa/shared/core/training_data/visualization.py +10 -10
  444. rasa/shared/data.py +6 -6
  445. rasa/shared/engine/caching.py +0 -1
  446. rasa/shared/exceptions.py +2 -2
  447. rasa/shared/importers/importer.py +58 -2
  448. rasa/shared/importers/rasa.py +5 -6
  449. rasa/shared/importers/utils.py +1 -1
  450. rasa/shared/nlu/constants.py +9 -0
  451. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  452. rasa/shared/nlu/training_data/features.py +3 -3
  453. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  454. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  455. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  456. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  457. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  458. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  459. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  460. rasa/shared/nlu/training_data/loading.py +4 -4
  461. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  462. rasa/shared/nlu/training_data/message.py +13 -14
  463. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  464. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  465. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  466. rasa/shared/nlu/training_data/training_data.py +12 -13
  467. rasa/shared/nlu/training_data/util.py +11 -10
  468. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  469. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  470. rasa/shared/providers/_configs/client_config.py +3 -1
  471. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  472. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  473. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  474. rasa/shared/providers/_configs/model_group_config.py +8 -5
  475. rasa/shared/providers/_configs/oauth_config.py +33 -0
  476. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  477. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  478. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  479. rasa/shared/providers/_configs/utils.py +1 -0
  480. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  481. rasa/shared/providers/_utils.py +5 -5
  482. rasa/shared/providers/constants.py +6 -0
  483. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  484. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  485. rasa/shared/providers/embedding/embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  487. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  488. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  489. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  490. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  491. rasa/shared/providers/llm/llm_client.py +24 -8
  492. rasa/shared/providers/llm/llm_response.py +61 -2
  493. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  494. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  495. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  496. rasa/shared/providers/mappings.py +18 -19
  497. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  498. rasa/shared/providers/router/router_client.py +3 -1
  499. rasa/shared/utils/cli.py +1 -1
  500. rasa/shared/utils/common.py +15 -1
  501. rasa/shared/utils/constants.py +3 -0
  502. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  503. rasa/shared/utils/health_check/health_check.py +3 -3
  504. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  505. rasa/shared/utils/io.py +1 -1
  506. rasa/shared/utils/llm.py +100 -18
  507. rasa/shared/utils/pykwalify_extensions.py +25 -1
  508. rasa/shared/utils/schemas/domain.yml +26 -1
  509. rasa/shared/utils/schemas/events.py +1 -1
  510. rasa/shared/utils/yaml.py +24 -20
  511. rasa/studio/auth.py +3 -3
  512. rasa/studio/config.py +1 -2
  513. rasa/studio/data_handler.py +3 -3
  514. rasa/studio/download.py +1 -1
  515. rasa/studio/results_logger.py +3 -3
  516. rasa/studio/upload.py +21 -5
  517. rasa/telemetry.py +127 -48
  518. rasa/tracing/config.py +5 -3
  519. rasa/tracing/constants.py +12 -0
  520. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  521. rasa/tracing/instrumentation/instrumentation.py +61 -5
  522. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  523. rasa/tracing/instrumentation/metrics.py +52 -11
  524. rasa/tracing/metric_instrument_provider.py +54 -14
  525. rasa/utils/common.py +12 -24
  526. rasa/utils/endpoints.py +1 -1
  527. rasa/utils/io.py +7 -7
  528. rasa/utils/licensing.py +3 -4
  529. rasa/utils/log_utils.py +7 -6
  530. rasa/utils/ml_utils.py +1 -0
  531. rasa/utils/plotting.py +3 -3
  532. rasa/utils/sanic_error_handler.py +1 -1
  533. rasa/utils/tensorflow/callback.py +2 -2
  534. rasa/utils/tensorflow/crf.py +2 -2
  535. rasa/utils/tensorflow/data_generator.py +5 -5
  536. rasa/utils/tensorflow/environment.py +3 -3
  537. rasa/utils/tensorflow/feature_array.py +2 -3
  538. rasa/utils/tensorflow/layers.py +18 -12
  539. rasa/utils/tensorflow/layers_utils.py +2 -1
  540. rasa/utils/tensorflow/metrics.py +2 -2
  541. rasa/utils/tensorflow/model_data.py +7 -7
  542. rasa/utils/tensorflow/model_data_utils.py +10 -9
  543. rasa/utils/tensorflow/models.py +31 -32
  544. rasa/utils/tensorflow/rasa_layers.py +20 -19
  545. rasa/utils/tensorflow/types.py +2 -1
  546. rasa/utils/train_utils.py +23 -21
  547. rasa/utils/url_tools.py +1 -1
  548. rasa/validator.py +594 -115
  549. rasa/version.py +1 -1
  550. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  551. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  552. rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
  553. rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
  554. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
  555. rasa_pro-3.11.5.dist-info/RECORD +0 -785
  556. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  557. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  558. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  559. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
rasa/nlu/test.py CHANGED
@@ -1,69 +1,68 @@
1
1
  import copy
2
2
  import itertools
3
- import os
4
3
  import logging
5
- import structlog
6
- from pathlib import Path
7
-
8
- import numpy as np
4
+ import os
9
5
  from collections import defaultdict, namedtuple
10
- from tqdm import tqdm
6
+ from pathlib import Path
11
7
  from typing import (
8
+ TYPE_CHECKING,
9
+ Any,
10
+ Dict,
12
11
  Iterable,
13
12
  Iterator,
14
- Tuple,
15
13
  List,
16
- Set,
14
+ NamedTuple,
17
15
  Optional,
16
+ Set,
18
17
  Text,
18
+ Tuple,
19
19
  Union,
20
- Dict,
21
- Any,
22
- NamedTuple,
23
- TYPE_CHECKING,
24
20
  )
25
21
 
22
+ import numpy as np
23
+ import structlog
24
+ from tqdm import tqdm
25
+
26
+ import rasa.nlu.classifiers.fallback_classifier
27
+ import rasa.shared.utils.io
28
+ import rasa.utils.io as io_utils
29
+ import rasa.utils.plotting as plot_utils
26
30
  from rasa import telemetry
31
+ from rasa.constants import NLG_DATA_FILE, TEST_DATA_FILE, TRAIN_DATA_FILE
27
32
  from rasa.core.agent import Agent
28
33
  from rasa.core.channels import UserMessage
29
34
  from rasa.core.processor import MessageProcessor
30
- from rasa.shared.nlu.training_data.training_data import TrainingData
31
- from rasa.shared.utils.yaml import write_yaml
32
- from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
33
- import rasa.shared.utils.io
34
- import rasa.utils.plotting as plot_utils
35
- import rasa.utils.io as io_utils
36
-
37
- from rasa.constants import TEST_DATA_FILE, TRAIN_DATA_FILE, NLG_DATA_FILE
38
- import rasa.nlu.classifiers.fallback_classifier
35
+ from rasa.nlu.classifiers import fallback_classifier
39
36
  from rasa.nlu.constants import (
37
+ ENTITY_ATTRIBUTE_CONFIDENCE_GROUP,
38
+ ENTITY_ATTRIBUTE_CONFIDENCE_ROLE,
39
+ ENTITY_ATTRIBUTE_CONFIDENCE_TYPE,
40
40
  RESPONSE_SELECTOR_DEFAULT_INTENT,
41
- RESPONSE_SELECTOR_PROPERTY_NAME,
42
41
  RESPONSE_SELECTOR_PREDICTION_KEY,
43
- TOKENS_NAMES,
44
- ENTITY_ATTRIBUTE_CONFIDENCE_TYPE,
45
- ENTITY_ATTRIBUTE_CONFIDENCE_ROLE,
46
- ENTITY_ATTRIBUTE_CONFIDENCE_GROUP,
42
+ RESPONSE_SELECTOR_PROPERTY_NAME,
47
43
  RESPONSE_SELECTOR_RETRIEVAL_INTENTS,
44
+ TOKENS_NAMES,
48
45
  )
46
+ from rasa.nlu.tokenizers.tokenizer import Token
47
+ from rasa.shared.importers.importer import TrainingDataImporter
49
48
  from rasa.shared.nlu.constants import (
50
- TEXT,
51
- INTENT,
52
- INTENT_RESPONSE_KEY,
53
49
  ENTITIES,
54
- EXTRACTOR,
55
- PRETRAINED_EXTRACTORS,
56
- ENTITY_ATTRIBUTE_TYPE,
57
50
  ENTITY_ATTRIBUTE_GROUP,
58
51
  ENTITY_ATTRIBUTE_ROLE,
59
- NO_ENTITY_TAG,
52
+ ENTITY_ATTRIBUTE_TYPE,
53
+ EXTRACTOR,
54
+ INTENT,
60
55
  INTENT_NAME_KEY,
56
+ INTENT_RESPONSE_KEY,
57
+ NO_ENTITY_TAG,
61
58
  PREDICTED_CONFIDENCE_KEY,
59
+ PRETRAINED_EXTRACTORS,
60
+ TEXT,
62
61
  )
63
- from rasa.nlu.classifiers import fallback_classifier
64
- from rasa.nlu.tokenizers.tokenizer import Token
65
- from rasa.shared.importers.importer import TrainingDataImporter
66
62
  from rasa.shared.nlu.training_data.formats.rasa_yaml import RasaYAMLWriter
63
+ from rasa.shared.nlu.training_data.training_data import TrainingData
64
+ from rasa.shared.utils.yaml import write_yaml
65
+ from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
67
66
 
68
67
  if TYPE_CHECKING:
69
68
  from typing_extensions import TypedDict
@@ -660,10 +659,11 @@ def _calculate_report(
660
659
  report_as_dict: Optional[bool] = None,
661
660
  exclude_label: Optional[Text] = None,
662
661
  ) -> Tuple[Union[Text, Dict], float, float, float, np.ndarray, List[Text]]:
663
- from rasa.model_testing import get_evaluation_metrics
664
662
  import sklearn.metrics
665
663
  import sklearn.utils.multiclass
666
664
 
665
+ from rasa.model_testing import get_evaluation_metrics
666
+
667
667
  confusion_matrix = sklearn.metrics.confusion_matrix(targets, predictions)
668
668
  labels = sklearn.utils.multiclass.unique_labels(targets, predictions)
669
669
 
@@ -1104,8 +1104,8 @@ def do_any_extractors_not_support_overlap(extractors: Optional[Set[Text]]) -> bo
1104
1104
  if extractors is None:
1105
1105
  return False
1106
1106
 
1107
- from rasa.nlu.extractors.crf_entity_extractor import CRFEntityExtractor
1108
1107
  from rasa.nlu.classifiers.diet_classifier import DIETClassifier
1108
+ from rasa.nlu.extractors.crf_entity_extractor import CRFEntityExtractor
1109
1109
 
1110
1110
  return not extractors.isdisjoint(
1111
1111
  {CRFEntityExtractor.__name__, DIETClassifier.__name__}
@@ -1,4 +1,5 @@
1
1
  from __future__ import annotations
2
+
2
3
  import glob
3
4
  import logging
4
5
  import os
@@ -9,10 +10,8 @@ from rasa.engine.graph import ExecutionContext
9
10
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
10
11
  from rasa.engine.storage.resource import Resource
11
12
  from rasa.engine.storage.storage import ModelStorage
12
-
13
13
  from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
14
14
  from rasa.shared.nlu.training_data.message import Message
15
-
16
15
  from rasa.shared.nlu.training_data.training_data import TrainingData
17
16
 
18
17
  logger = logging.getLogger(__name__)
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
- from typing import List, Text, Dict, Any
2
+
3
+ from typing import Any, Dict, List, Text
3
4
 
4
5
  from rasa.engine.graph import ExecutionContext
5
6
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
@@ -7,7 +8,6 @@ from rasa.engine.storage.resource import Resource
7
8
  from rasa.engine.storage.storage import ModelStorage
8
9
  from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
9
10
  from rasa.shared.nlu.training_data.message import Message
10
-
11
11
  from rasa.shared.utils.io import DEFAULT_ENCODING
12
12
 
13
13
 
@@ -1,10 +1,10 @@
1
1
  import typing
2
- from typing import Dict, Text, List, Any, Optional, Type
2
+ from typing import Any, Dict, List, Optional, Text, Type
3
3
 
4
4
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
5
- from rasa.nlu.utils.spacy_utils import SpacyNLP
6
- from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
7
5
  from rasa.nlu.constants import SPACY_DOCS
6
+ from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
7
+ from rasa.nlu.utils.spacy_utils import SpacyNLP
8
8
  from rasa.shared.nlu.training_data.message import Message
9
9
 
10
10
  if typing.TYPE_CHECKING:
@@ -1,22 +1,21 @@
1
1
  import abc
2
2
  import logging
3
3
  import re
4
+ from typing import Any, Dict, List, Optional, Text
4
5
 
5
- from typing import Text, List, Dict, Any, Optional
6
-
6
+ import rasa.shared.utils.io
7
7
  from rasa.engine.graph import ExecutionContext, GraphComponent
8
8
  from rasa.engine.storage.resource import Resource
9
9
  from rasa.engine.storage.storage import ModelStorage
10
- from rasa.shared.nlu.training_data.training_data import TrainingData
11
- from rasa.shared.nlu.training_data.message import Message
12
- from rasa.nlu.constants import TOKENS_NAMES, MESSAGE_ATTRIBUTES
10
+ from rasa.nlu.constants import MESSAGE_ATTRIBUTES, TOKENS_NAMES
13
11
  from rasa.shared.nlu.constants import (
12
+ ACTION_NAME,
14
13
  INTENT,
15
14
  INTENT_RESPONSE_KEY,
16
15
  RESPONSE_IDENTIFIER_DELIMITER,
17
- ACTION_NAME,
18
16
  )
19
- import rasa.shared.utils.io
17
+ from rasa.shared.nlu.training_data.message import Message
18
+ from rasa.shared.nlu.training_data.training_data import TrainingData
20
19
 
21
20
  logger = logging.getLogger(__name__)
22
21
 
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
+
2
3
  from typing import Any, Dict, List, Optional, Text
3
4
 
4
5
  import regex
5
6
 
6
7
  import rasa.shared.utils.io
7
8
  import rasa.utils.io
8
-
9
9
  from rasa.engine.graph import ExecutionContext
10
10
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
11
11
  from rasa.engine.storage.resource import Resource
@@ -1,29 +1,29 @@
1
1
  import logging
2
2
  import operator
3
- from collections import defaultdict, Counter
4
- from typing import List, Tuple, Text, Optional, Dict, Any, TYPE_CHECKING
3
+ from collections import Counter, defaultdict
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple
5
5
 
6
6
  from rasa.nlu.constants import (
7
- TOKENS_NAMES,
8
7
  BILOU_ENTITIES,
9
8
  BILOU_ENTITIES_GROUP,
10
9
  BILOU_ENTITIES_ROLE,
10
+ TOKENS_NAMES,
11
11
  )
12
12
  from rasa.shared.nlu.constants import (
13
- TEXT,
14
13
  ENTITIES,
15
- ENTITY_ATTRIBUTE_START,
16
14
  ENTITY_ATTRIBUTE_END,
17
- ENTITY_ATTRIBUTE_TYPE,
18
15
  ENTITY_ATTRIBUTE_GROUP,
19
16
  ENTITY_ATTRIBUTE_ROLE,
17
+ ENTITY_ATTRIBUTE_START,
18
+ ENTITY_ATTRIBUTE_TYPE,
20
19
  NO_ENTITY_TAG,
20
+ TEXT,
21
21
  )
22
22
 
23
23
  if TYPE_CHECKING:
24
24
  from rasa.nlu.tokenizers.tokenizer import Token
25
- from rasa.shared.nlu.training_data.training_data import TrainingData
26
25
  from rasa.shared.nlu.training_data.message import Message
26
+ from rasa.shared.nlu.training_data.training_data import TrainingData
27
27
 
28
28
  logger = logging.getLogger(__name__)
29
29
 
@@ -6,42 +6,42 @@ from typing import Dict, Text, Type
6
6
  logging.getLogger("transformers.file_utils").setLevel(logging.WARNING)
7
7
 
8
8
  from transformers import ( # noqa: E402
9
- TFPreTrainedModel,
9
+ BertTokenizer,
10
+ CamembertTokenizer,
11
+ # XLMTokenizer,
12
+ DistilBertTokenizer,
13
+ GPT2Tokenizer,
14
+ OpenAIGPTTokenizer,
15
+ PreTrainedTokenizer,
16
+ RobertaTokenizer,
10
17
  TFBertModel,
11
- TFOpenAIGPTModel,
12
- TFGPT2Model,
13
- TFXLNetModel,
18
+ TFCamembertModel,
14
19
  # TFXLMModel,
15
20
  TFDistilBertModel,
21
+ TFGPT2Model,
22
+ TFOpenAIGPTModel,
23
+ TFPreTrainedModel,
16
24
  TFRobertaModel,
17
- TFCamembertModel,
18
- PreTrainedTokenizer,
19
- BertTokenizer,
20
- OpenAIGPTTokenizer,
21
- GPT2Tokenizer,
25
+ TFXLNetModel,
22
26
  XLNetTokenizer,
23
- # XLMTokenizer,
24
- DistilBertTokenizer,
25
- RobertaTokenizer,
26
- CamembertTokenizer,
27
27
  )
28
+
28
29
  from rasa.nlu.utils.hugging_face.transformers_pre_post_processors import ( # noqa: E402
30
+ bert_embeddings_post_processor,
31
+ bert_tokens_cleaner,
29
32
  bert_tokens_pre_processor,
33
+ camembert_tokens_pre_processor,
34
+ gpt2_tokens_cleaner,
35
+ gpt_embeddings_post_processor,
30
36
  gpt_tokens_pre_processor,
31
- xlnet_tokens_pre_processor,
37
+ openaigpt_tokens_cleaner,
38
+ roberta_embeddings_post_processor,
32
39
  roberta_tokens_pre_processor,
33
- bert_embeddings_post_processor,
34
- gpt_embeddings_post_processor,
35
40
  xlnet_embeddings_post_processor,
36
- roberta_embeddings_post_processor,
37
- bert_tokens_cleaner,
38
- openaigpt_tokens_cleaner,
39
- gpt2_tokens_cleaner,
40
41
  xlnet_tokens_cleaner,
41
- camembert_tokens_pre_processor,
42
+ xlnet_tokens_pre_processor,
42
43
  )
43
44
 
44
-
45
45
  model_class_dict: Dict[Text, Type[TFPreTrainedModel]] = {
46
46
  "bert": TFBertModel,
47
47
  "gpt": TFOpenAIGPTModel,
@@ -1,4 +1,5 @@
1
- from typing import List, Tuple, Text
1
+ from typing import List, Text, Tuple
2
+
2
3
  import numpy as np
3
4
 
4
5
 
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations
2
+
2
3
  import typing
3
4
  from pathlib import Path
4
5
  from typing import Any, Dict, List, Optional, Text
5
6
 
6
- from rasa.engine.graph import GraphComponent, ExecutionContext
7
+ from rasa.engine.graph import ExecutionContext, GraphComponent
7
8
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
8
9
  from rasa.engine.storage.resource import Resource
9
10
  from rasa.engine.storage.storage import ModelStorage
@@ -2,8 +2,8 @@ import re
2
2
  from typing import Dict, List, Text, Union
3
3
 
4
4
  import rasa.shared.utils.io
5
- from rasa.shared.nlu.training_data.training_data import TrainingData
6
5
  from rasa.shared.exceptions import InvalidConfigException
6
+ from rasa.shared.nlu.training_data.training_data import TrainingData
7
7
 
8
8
 
9
9
  def _convert_lookup_tables_to_regex(
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
- import typing
5
4
  import logging
5
+ import typing
6
6
  from typing import Any, Dict, List, Optional, Text, Tuple
7
7
 
8
8
  from rasa.engine.graph import ExecutionContext, GraphComponent
@@ -10,10 +10,10 @@ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
10
10
  from rasa.engine.storage.resource import Resource
11
11
  from rasa.engine.storage.storage import ModelStorage
12
12
  from rasa.nlu.constants import DENSE_FEATURIZABLE_ATTRIBUTES, SPACY_DOCS
13
- from rasa.shared.nlu.training_data.message import Message
14
- from rasa.shared.nlu.training_data.training_data import TrainingData
15
13
  from rasa.nlu.model import InvalidModelError
16
14
  from rasa.shared.constants import DOCS_URL_COMPONENTS
15
+ from rasa.shared.nlu.training_data.message import Message
16
+ from rasa.shared.nlu.training_data.training_data import TrainingData
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
rasa/plugin.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import argparse
4
4
  import functools
5
5
  import sys
6
- from typing import Any, List, Optional, TYPE_CHECKING, Text, Union
6
+ from typing import TYPE_CHECKING, Any, List, Optional, Text, Union
7
7
 
8
8
  import pluggy
9
9
 
@@ -13,6 +13,7 @@ if TYPE_CHECKING:
13
13
  from rasa.core.brokers.broker import EventBroker
14
14
  from rasa.core.tracker_store import TrackerStore
15
15
  from rasa.shared.core.domain import Domain
16
+ from rasa.shared.core.trackers import DialogueStateTracker
16
17
  from rasa.utils.endpoints import EndpointConfig
17
18
 
18
19
 
@@ -88,3 +89,13 @@ def after_server_stop() -> None:
88
89
  Use this hook to de-initialize any resources that require explicit cleanup like,
89
90
  thread shutdown, closing connections, etc.
90
91
  """
92
+
93
+
94
+ @hookspec # type: ignore[misc]
95
+ def after_new_user_message(tracker: "DialogueStateTracker") -> None:
96
+ """Hook specification for after a new user message is received."""
97
+
98
+
99
+ @hookspec # type: ignore[misc]
100
+ def after_action_executed(tracker: "DialogueStateTracker") -> None:
101
+ """Hook specification for after an action is executed."""
rasa/server.py CHANGED
@@ -60,9 +60,9 @@ from rasa.shared.constants import (
60
60
  DEFAULT_MODELS_PATH,
61
61
  DEFAULT_SENDER_ID,
62
62
  DOCS_BASE_URL,
63
+ DOCS_URL_FLOWS,
63
64
  DOCS_URL_TRAINING_DATA,
64
65
  TEST_STORIES_FILE_PREFIX,
65
- DOCS_URL_FLOWS,
66
66
  )
67
67
  from rasa.shared.core.domain import Domain, InvalidDomain
68
68
  from rasa.shared.core.events import Event
@@ -74,7 +74,7 @@ from rasa.shared.core.trackers import (
74
74
  from rasa.shared.core.training_data.story_writer.yaml_story_writer import (
75
75
  YAMLStoryWriter,
76
76
  )
77
- from rasa.shared.exceptions import YamlException, RasaException
77
+ from rasa.shared.exceptions import RasaException, YamlException
78
78
  from rasa.shared.importers.importer import TrainingDataImporter
79
79
  from rasa.shared.nlu.training_data.formats import RasaYAMLReader
80
80
  from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
@@ -1147,6 +1147,7 @@ def create_app(
1147
1147
  f"An unexpected error occurred during training. Error: {e}",
1148
1148
  )
1149
1149
  finally:
1150
+ rasa.shared.utils.common.display_research_study_prompt()
1150
1151
  with app.ctx.active_training_processes.get_lock():
1151
1152
  app.ctx.active_training_processes.value -= 1
1152
1153
 
rasa/shared/constants.py CHANGED
@@ -83,6 +83,7 @@ ENV_LOG_LEVEL_LLM = "LOG_LEVEL_LLM"
83
83
  ENV_LOG_LEVEL_LLM_MODULE_NAMES = {
84
84
  "LLMCommandGenerator": "LOG_LEVEL_LLM_COMMAND_GENERATOR",
85
85
  "SingleStepLLMCommandGenerator": "LOG_LEVEL_LLM_COMMAND_GENERATOR",
86
+ "CompactLLMCommandGenerator": "LOG_LEVEL_LLM_COMMAND_GENERATOR",
86
87
  "MultiStepLLMCommandGenerator": "LOG_LEVEL_LLM_COMMAND_GENERATOR",
87
88
  "EnterpriseSearchPolicy": "LOG_LEVEL_LLM_ENTERPRISE_SEARCH",
88
89
  "IntentlessPolicy": "LOG_LEVEL_LLM_INTENTLESS_POLICY",
@@ -102,16 +103,29 @@ ASSISTANT_ID_KEY = "assistant_id"
102
103
  ASSISTANT_ID_DEFAULT_VALUE = "placeholder_default"
103
104
 
104
105
  CONFIG_MANDATORY_COMMON_KEYS = [ASSISTANT_ID_KEY]
105
- CONFIG_AUTOCONFIGURABLE_KEYS_CORE = ["policies"]
106
- CONFIG_AUTOCONFIGURABLE_KEYS_NLU = ["pipeline"]
106
+ CONFIG_NAME_KEY = "name"
107
+ CONFIG_POLICIES_KEY = "policies"
108
+ CONFIG_PIPELINE_KEY = "pipeline"
109
+ CONFIG_LANGUAGE_KEY = "language"
110
+ CONFIG_ADDITIONAL_LANGUAGES_KEY = "additional_languages"
111
+ CONFIG_RECIPE_KEY = "recipe"
112
+ CONFIG_LLM_KEY = "llm"
113
+ CONFIG_MODEL_NAME_KEY = "model_name"
114
+ CONFIG_TRAIN_SCHEMA = "train_schema"
115
+ CONFIG_PREDICT_SCHEMA = "predict_schema"
116
+ CONFIG_AUTOCONFIGURABLE_KEYS_CORE = [CONFIG_POLICIES_KEY]
117
+ CONFIG_AUTOCONFIGURABLE_KEYS_NLU = [CONFIG_PIPELINE_KEY]
107
118
  CONFIG_AUTOCONFIGURABLE_KEYS = (
108
119
  CONFIG_AUTOCONFIGURABLE_KEYS_CORE + CONFIG_AUTOCONFIGURABLE_KEYS_NLU
109
120
  )
110
- CONFIG_KEYS_CORE = ["policies"] + CONFIG_MANDATORY_COMMON_KEYS
111
- CONFIG_KEYS_NLU = ["language", "pipeline"] + CONFIG_MANDATORY_COMMON_KEYS
121
+ CONFIG_KEYS_CORE = [CONFIG_POLICIES_KEY] + CONFIG_MANDATORY_COMMON_KEYS
122
+ CONFIG_KEYS_NLU = [
123
+ CONFIG_LANGUAGE_KEY,
124
+ CONFIG_PIPELINE_KEY,
125
+ ] + CONFIG_MANDATORY_COMMON_KEYS
112
126
  CONFIG_KEYS = CONFIG_KEYS_CORE + CONFIG_KEYS_NLU
113
127
  CONFIG_MANDATORY_KEYS_CORE: List[Text] = [] + CONFIG_MANDATORY_COMMON_KEYS
114
- CONFIG_MANDATORY_KEYS_NLU = ["language"] + CONFIG_MANDATORY_COMMON_KEYS
128
+ CONFIG_MANDATORY_KEYS_NLU = [CONFIG_LANGUAGE_KEY] + CONFIG_MANDATORY_COMMON_KEYS
115
129
  CONFIG_MANDATORY_KEYS = CONFIG_MANDATORY_KEYS_CORE + CONFIG_MANDATORY_KEYS_NLU
116
130
 
117
131
  # Keys related to Forms (in the Domain)
@@ -138,6 +152,8 @@ DEFAULT_MARKERS_CONFIG_PATH = "markers/config"
138
152
  DEFAULT_MARKERS_OUTPUT_PATH = "markers/output"
139
153
  DEFAULT_MARKERS_STATS_PATH = "markers/stats"
140
154
 
155
+ DEFAULT_PROMPT_PACKAGE_NAME = "rasa.dialogue_understanding.generator.prompt_templates"
156
+
141
157
  DIAGNOSTIC_DATA = "diagnostic_data"
142
158
 
143
159
  RESPONSE_CONDITION = "condition"
@@ -150,6 +166,7 @@ AZURE_AD_TOKEN_ENV_VAR = "AZURE_AD_TOKEN"
150
166
  AZURE_API_BASE_ENV_VAR = "AZURE_API_BASE"
151
167
  AZURE_API_VERSION_ENV_VAR = "AZURE_API_VERSION"
152
168
  AZURE_API_TYPE_ENV_VAR = "AZURE_API_TYPE"
169
+ AZURE_AD_SCOPES_ENV_VAR = "AZURE_AD_SCOPES"
153
170
  AZURE_SPEECH_API_KEY_ENV_VAR = "AZURE_SPEECH_API_KEY"
154
171
 
155
172
  DEEPGRAM_API_KEY_ENV_VAR = "DEEPGRAM_API_KEY"
@@ -177,6 +194,9 @@ PROVIDER_CONFIG_KEY = "provider"
177
194
  REQUEST_TIMEOUT_CONFIG_KEY = "request_timeout" # deprecated
178
195
  TIMEOUT_CONFIG_KEY = "timeout"
179
196
 
197
+ TEMPERATURE_CONFIG_KEY = "temperature"
198
+ MAX_TOKENS_CONFIG_KEY = "max_tokens"
199
+
180
200
  DEPLOYMENT_NAME_CONFIG_KEY = "deployment_name"
181
201
  DEPLOYMENT_CONFIG_KEY = "deployment"
182
202
  EMBEDDINGS_CONFIG_KEY = "embeddings"
@@ -186,7 +206,6 @@ MODEL_CONFIG_KEY = "model"
186
206
  MODEL_NAME_CONFIG_KEY = "model_name"
187
207
  PROMPT_CONFIG_KEY = "prompt"
188
208
  PROMPT_TEMPLATE_CONFIG_KEY = "prompt_template"
189
-
190
209
  STREAM_CONFIG_KEY = "stream"
191
210
  N_REPHRASES_CONFIG_KEY = "n"
192
211
  USE_CHAT_COMPLETIONS_ENDPOINT_CONFIG_KEY = "use_chat_completions_endpoint"
@@ -220,12 +239,6 @@ LITELLM_PARAMS_KEY = "litellm_params"
220
239
  LLM_API_HEALTH_CHECK_ENV_VAR = "LLM_API_HEALTH_CHECK"
221
240
  LLM_API_HEALTH_CHECK_DEFAULT_VALUE = "false"
222
241
 
223
- AZURE_API_KEY_ENV_VAR = "AZURE_API_KEY"
224
- AZURE_AD_TOKEN_ENV_VAR = "AZURE_AD_TOKEN"
225
- AZURE_API_BASE_ENV_VAR = "AZURE_API_BASE"
226
- AZURE_API_VERSION_ENV_VAR = "AZURE_API_VERSION"
227
- AZURE_API_TYPE_ENV_VAR = "AZURE_API_TYPE"
228
-
229
242
  AWS_REGION_NAME_CONFIG_KEY = "aws_region_name"
230
243
  AWS_ACCESS_KEY_ID_CONFIG_KEY = "aws_access_key_id"
231
244
  AWS_SECRET_ACCESS_KEY_CONFIG_KEY = "aws_secret_access_key"
@@ -254,6 +267,7 @@ LITELLM_SSL_CERTIFICATE_ENV_VAR = "SSL_CERTIFICATE"
254
267
 
255
268
  OPENAI_PROVIDER = "openai"
256
269
  AZURE_OPENAI_PROVIDER = "azure"
270
+ ANTHROPIC_PROVIDER = "anthropic"
257
271
  SELF_HOSTED_PROVIDER = "self-hosted"
258
272
  HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER = "huggingface_local"
259
273
  RASA_PROVIDER = "rasa"
@@ -261,17 +275,11 @@ RASA_PROVIDER = "rasa"
261
275
  SELF_HOSTED_VLLM_PREFIX = "hosted_vllm"
262
276
  SELF_HOSTED_VLLM_API_KEY_ENV_VAR = "HOSTED_VLLM_API_KEY"
263
277
 
264
- SELF_HOSTED_VLLM_PREFIX = "hosted_vllm"
265
- SELF_HOSTED_VLLM_API_KEY_ENV_VAR = "HOSTED_VLLM_API_KEY"
266
-
267
278
  VALID_PROVIDERS_FOR_API_TYPE_CONFIG_KEY = [
268
279
  OPENAI_PROVIDER,
269
280
  AZURE_OPENAI_PROVIDER,
270
281
  ]
271
282
 
272
- SELF_HOSTED_VLLM_PREFIX = "hosted_vllm"
273
- SELF_HOSTED_VLLM_API_KEY_ENV_VAR = "HOSTED_VLLM_API_KEY"
274
-
275
283
  AZURE_API_TYPE = "azure"
276
284
  OPENAI_API_TYPE = "openai"
277
285
 
@@ -308,3 +316,22 @@ SENSITIVE_DATA = [
308
316
  AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
309
317
  AWS_SESSION_TOKEN_CONFIG_KEY,
310
318
  ]
319
+
320
+ # Used for key values in BotUtterance.data
321
+ TEXT = "text"
322
+ ELEMENTS = "elements"
323
+ QUICK_REPLIES = "quick_replies"
324
+ BUTTONS = "buttons"
325
+ ATTACHMENT = "attachment"
326
+ IMAGE = "image"
327
+ CUSTOM = "custom"
328
+ TITLE = "title"
329
+ PAYLOAD = "payload"
330
+
331
+ # Used for LLM command generation
332
+ ROLE_USER = "user"
333
+ ROLE_SYSTEM = "system"
334
+
335
+ # Used for key values in ValidateSlotPatternFlowStackFrame
336
+ REFILL_UTTER = "refill_utter"
337
+ REJECTIONS = "rejections"
@@ -4,7 +4,9 @@ from typing import List, Optional
4
4
 
5
5
  import structlog
6
6
 
7
+ from rasa.dialogue_understanding.commands import Command
7
8
  from rasa.dialogue_understanding.commands.set_slot_command import SetSlotExtractor
9
+ from rasa.dialogue_understanding.utils import add_commands_to_message_parse_data
8
10
  from rasa.shared.core.domain import Domain
9
11
  from rasa.shared.nlu.constants import COMMANDS, SET_SLOT_COMMAND, TEXT
10
12
  from rasa.shared.nlu.training_data.message import Message
@@ -78,13 +80,18 @@ class CommandPayloadReader:
78
80
  )
79
81
 
80
82
  # Create new SetSlot commands from the extracted attributes.
81
- commands.append(
82
- {
83
- "command": SET_SLOT_COMMAND,
84
- "name": slot_name,
85
- "value": slot_value,
86
- "extractor": entity_extractor_name,
87
- }
83
+ command = {
84
+ "command": SET_SLOT_COMMAND,
85
+ "name": slot_name,
86
+ "value": slot_value,
87
+ "extractor": entity_extractor_name,
88
+ }
89
+ commands.append(command)
90
+
91
+ add_commands_to_message_parse_data(
92
+ message,
93
+ CommandPayloadReader.__name__,
94
+ [Command.command_from_json(command)],
88
95
  )
89
96
 
90
97
  structlogger.debug(
@@ -94,6 +101,7 @@ class CommandPayloadReader:
94
101
 
95
102
  # set the command(s) on the Message object
96
103
  message.set(COMMANDS, commands, add_to_output=True)
104
+
97
105
  return message
98
106
 
99
107
  @staticmethod