rasa-pro 3.9.18__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 (662) hide show
  1. README.md +415 -0
  2. rasa/__init__.py +10 -0
  3. rasa/__main__.py +156 -0
  4. rasa/anonymization/__init__.py +2 -0
  5. rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
  6. rasa/anonymization/anonymization_pipeline.py +286 -0
  7. rasa/anonymization/anonymization_rule_executor.py +260 -0
  8. rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
  9. rasa/anonymization/schemas/config.yml +47 -0
  10. rasa/anonymization/utils.py +118 -0
  11. rasa/api.py +146 -0
  12. rasa/cli/__init__.py +5 -0
  13. rasa/cli/arguments/__init__.py +0 -0
  14. rasa/cli/arguments/data.py +81 -0
  15. rasa/cli/arguments/default_arguments.py +165 -0
  16. rasa/cli/arguments/evaluate.py +65 -0
  17. rasa/cli/arguments/export.py +51 -0
  18. rasa/cli/arguments/interactive.py +74 -0
  19. rasa/cli/arguments/run.py +204 -0
  20. rasa/cli/arguments/shell.py +13 -0
  21. rasa/cli/arguments/test.py +211 -0
  22. rasa/cli/arguments/train.py +263 -0
  23. rasa/cli/arguments/visualize.py +34 -0
  24. rasa/cli/arguments/x.py +30 -0
  25. rasa/cli/data.py +292 -0
  26. rasa/cli/e2e_test.py +586 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +250 -0
  29. rasa/cli/inspect.py +63 -0
  30. rasa/cli/interactive.py +164 -0
  31. rasa/cli/license.py +65 -0
  32. rasa/cli/markers.py +78 -0
  33. rasa/cli/project_templates/__init__.py +0 -0
  34. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  35. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  36. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  37. rasa/cli/project_templates/calm/actions/db.py +57 -0
  38. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  39. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  40. rasa/cli/project_templates/calm/config.yml +12 -0
  41. rasa/cli/project_templates/calm/credentials.yml +33 -0
  42. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  43. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  44. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  45. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  46. rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
  47. rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
  48. rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
  49. rasa/cli/project_templates/calm/domain/shared.yml +10 -0
  50. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  51. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  52. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  53. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  54. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  55. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  58. rasa/cli/project_templates/calm/endpoints.yml +45 -0
  59. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  60. rasa/cli/project_templates/default/actions/actions.py +27 -0
  61. rasa/cli/project_templates/default/config.yml +44 -0
  62. rasa/cli/project_templates/default/credentials.yml +33 -0
  63. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  64. rasa/cli/project_templates/default/data/rules.yml +13 -0
  65. rasa/cli/project_templates/default/data/stories.yml +30 -0
  66. rasa/cli/project_templates/default/domain.yml +34 -0
  67. rasa/cli/project_templates/default/endpoints.yml +42 -0
  68. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  69. rasa/cli/project_templates/tutorial/actions.py +22 -0
  70. rasa/cli/project_templates/tutorial/config.yml +11 -0
  71. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  72. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  73. rasa/cli/project_templates/tutorial/data/patterns.yml +6 -0
  74. rasa/cli/project_templates/tutorial/domain.yml +21 -0
  75. rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
  76. rasa/cli/run.py +135 -0
  77. rasa/cli/scaffold.py +269 -0
  78. rasa/cli/shell.py +141 -0
  79. rasa/cli/studio/__init__.py +0 -0
  80. rasa/cli/studio/download.py +62 -0
  81. rasa/cli/studio/studio.py +266 -0
  82. rasa/cli/studio/train.py +59 -0
  83. rasa/cli/studio/upload.py +77 -0
  84. rasa/cli/telemetry.py +102 -0
  85. rasa/cli/test.py +280 -0
  86. rasa/cli/train.py +260 -0
  87. rasa/cli/utils.py +464 -0
  88. rasa/cli/visualize.py +40 -0
  89. rasa/cli/x.py +206 -0
  90. rasa/constants.py +37 -0
  91. rasa/core/__init__.py +17 -0
  92. rasa/core/actions/__init__.py +0 -0
  93. rasa/core/actions/action.py +1225 -0
  94. rasa/core/actions/action_clean_stack.py +59 -0
  95. rasa/core/actions/action_exceptions.py +24 -0
  96. rasa/core/actions/action_run_slot_rejections.py +207 -0
  97. rasa/core/actions/action_trigger_chitchat.py +31 -0
  98. rasa/core/actions/action_trigger_flow.py +109 -0
  99. rasa/core/actions/action_trigger_search.py +31 -0
  100. rasa/core/actions/constants.py +5 -0
  101. rasa/core/actions/custom_action_executor.py +188 -0
  102. rasa/core/actions/forms.py +741 -0
  103. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  104. rasa/core/actions/http_custom_action_executor.py +140 -0
  105. rasa/core/actions/loops.py +114 -0
  106. rasa/core/actions/two_stage_fallback.py +186 -0
  107. rasa/core/agent.py +555 -0
  108. rasa/core/auth_retry_tracker_store.py +122 -0
  109. rasa/core/brokers/__init__.py +0 -0
  110. rasa/core/brokers/broker.py +126 -0
  111. rasa/core/brokers/file.py +58 -0
  112. rasa/core/brokers/kafka.py +322 -0
  113. rasa/core/brokers/pika.py +386 -0
  114. rasa/core/brokers/sql.py +86 -0
  115. rasa/core/channels/__init__.py +55 -0
  116. rasa/core/channels/audiocodes.py +463 -0
  117. rasa/core/channels/botframework.py +338 -0
  118. rasa/core/channels/callback.py +84 -0
  119. rasa/core/channels/channel.py +419 -0
  120. rasa/core/channels/console.py +241 -0
  121. rasa/core/channels/development_inspector.py +93 -0
  122. rasa/core/channels/facebook.py +419 -0
  123. rasa/core/channels/hangouts.py +329 -0
  124. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  125. rasa/core/channels/inspector/.gitignore +23 -0
  126. rasa/core/channels/inspector/README.md +54 -0
  127. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  128. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  129. rasa/core/channels/inspector/custom.d.ts +3 -0
  130. rasa/core/channels/inspector/dist/assets/arc-b6e548fe.js +1 -0
  131. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  132. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-fa03ac9e.js +10 -0
  133. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-ee67392a.js +2 -0
  134. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-9b283fae.js +2 -0
  135. rasa/core/channels/inspector/dist/assets/createText-62fc7601-8b6fcc2a.js +7 -0
  136. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-22e77f4f.js +4 -0
  137. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-60ffc87f.js +51 -0
  138. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9dd802e4.js +6 -0
  139. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-5fa1912f.js +4 -0
  140. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-1844e5a5.js +1 -0
  141. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-622a1fd2.js +139 -0
  142. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-e285a63a.js +266 -0
  143. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-f237bdca.js +70 -0
  144. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  145. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  146. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  147. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  148. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-4b03d70e.js +1 -0
  149. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  150. rasa/core/channels/inspector/dist/assets/index-a5d3e69d.js +1040 -0
  151. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-72a0fa5f.js +7 -0
  152. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  153. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-82218c41.js +139 -0
  154. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  155. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  156. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  157. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  158. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  159. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  160. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  161. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  162. rasa/core/channels/inspector/dist/assets/layout-78cff630.js +1 -0
  163. rasa/core/channels/inspector/dist/assets/line-5038b469.js +1 -0
  164. rasa/core/channels/inspector/dist/assets/linear-c4fc4098.js +1 -0
  165. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-c33c8ea6.js +109 -0
  166. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  167. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  168. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-a8d03059.js +35 -0
  169. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-6a0e56b2.js +7 -0
  170. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-2dc7c7bd.js +52 -0
  171. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-2360fe39.js +8 -0
  172. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-41b9f9ad.js +122 -0
  173. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-0aad326f.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-9847d984.js +1 -0
  175. rasa/core/channels/inspector/dist/assets/styles-080da4f6-564d890e.js +110 -0
  176. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-38957613.js +159 -0
  177. rasa/core/channels/inspector/dist/assets/styles-9c745c82-f0fc6921.js +207 -0
  178. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-ef3c5a77.js +1 -0
  179. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-bf3e91c1.js +61 -0
  180. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-4d4026c0.js +7 -0
  181. rasa/core/channels/inspector/dist/index.html +41 -0
  182. rasa/core/channels/inspector/index.html +39 -0
  183. rasa/core/channels/inspector/jest.config.ts +13 -0
  184. rasa/core/channels/inspector/package.json +48 -0
  185. rasa/core/channels/inspector/setupTests.ts +2 -0
  186. rasa/core/channels/inspector/src/App.tsx +170 -0
  187. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +107 -0
  188. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  189. rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
  190. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  191. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  192. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
  193. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  194. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  195. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  196. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  197. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  198. rasa/core/channels/inspector/src/helpers/formatters.test.ts +382 -0
  199. rasa/core/channels/inspector/src/helpers/formatters.ts +240 -0
  200. rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
  201. rasa/core/channels/inspector/src/main.tsx +13 -0
  202. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  203. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  204. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  205. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  206. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  207. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  208. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  209. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  210. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  211. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  212. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  213. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  214. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  215. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  216. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  217. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  222. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  223. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  224. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  225. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  226. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  227. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  228. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  229. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  230. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  231. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  232. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  233. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  234. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  235. rasa/core/channels/inspector/src/types.ts +64 -0
  236. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  237. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  238. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  239. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  240. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  241. rasa/core/channels/inspector/tsconfig.json +26 -0
  242. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  243. rasa/core/channels/inspector/vite.config.ts +8 -0
  244. rasa/core/channels/inspector/yarn.lock +6156 -0
  245. rasa/core/channels/mattermost.py +229 -0
  246. rasa/core/channels/rasa_chat.py +126 -0
  247. rasa/core/channels/rest.py +225 -0
  248. rasa/core/channels/rocketchat.py +174 -0
  249. rasa/core/channels/slack.py +620 -0
  250. rasa/core/channels/socketio.py +274 -0
  251. rasa/core/channels/telegram.py +298 -0
  252. rasa/core/channels/twilio.py +169 -0
  253. rasa/core/channels/twilio_voice.py +367 -0
  254. rasa/core/channels/vier_cvg.py +374 -0
  255. rasa/core/channels/webexteams.py +134 -0
  256. rasa/core/concurrent_lock_store.py +210 -0
  257. rasa/core/constants.py +107 -0
  258. rasa/core/evaluation/__init__.py +0 -0
  259. rasa/core/evaluation/marker.py +267 -0
  260. rasa/core/evaluation/marker_base.py +923 -0
  261. rasa/core/evaluation/marker_stats.py +293 -0
  262. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  263. rasa/core/exceptions.py +29 -0
  264. rasa/core/exporter.py +284 -0
  265. rasa/core/featurizers/__init__.py +0 -0
  266. rasa/core/featurizers/precomputation.py +410 -0
  267. rasa/core/featurizers/single_state_featurizer.py +421 -0
  268. rasa/core/featurizers/tracker_featurizers.py +1262 -0
  269. rasa/core/http_interpreter.py +89 -0
  270. rasa/core/information_retrieval/__init__.py +7 -0
  271. rasa/core/information_retrieval/faiss.py +121 -0
  272. rasa/core/information_retrieval/information_retrieval.py +129 -0
  273. rasa/core/information_retrieval/milvus.py +52 -0
  274. rasa/core/information_retrieval/qdrant.py +95 -0
  275. rasa/core/jobs.py +63 -0
  276. rasa/core/lock.py +139 -0
  277. rasa/core/lock_store.py +343 -0
  278. rasa/core/migrate.py +403 -0
  279. rasa/core/nlg/__init__.py +3 -0
  280. rasa/core/nlg/callback.py +146 -0
  281. rasa/core/nlg/contextual_response_rephraser.py +270 -0
  282. rasa/core/nlg/generator.py +230 -0
  283. rasa/core/nlg/interpolator.py +143 -0
  284. rasa/core/nlg/response.py +155 -0
  285. rasa/core/nlg/summarize.py +69 -0
  286. rasa/core/policies/__init__.py +0 -0
  287. rasa/core/policies/ensemble.py +329 -0
  288. rasa/core/policies/enterprise_search_policy.py +781 -0
  289. rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
  290. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  291. rasa/core/policies/flow_policy.py +205 -0
  292. rasa/core/policies/flows/__init__.py +0 -0
  293. rasa/core/policies/flows/flow_exceptions.py +44 -0
  294. rasa/core/policies/flows/flow_executor.py +705 -0
  295. rasa/core/policies/flows/flow_step_result.py +43 -0
  296. rasa/core/policies/intentless_policy.py +922 -0
  297. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  298. rasa/core/policies/memoization.py +538 -0
  299. rasa/core/policies/policy.py +725 -0
  300. rasa/core/policies/rule_policy.py +1273 -0
  301. rasa/core/policies/ted_policy.py +2169 -0
  302. rasa/core/policies/unexpected_intent_policy.py +1022 -0
  303. rasa/core/processor.py +1422 -0
  304. rasa/core/run.py +331 -0
  305. rasa/core/secrets_manager/__init__.py +0 -0
  306. rasa/core/secrets_manager/constants.py +32 -0
  307. rasa/core/secrets_manager/endpoints.py +391 -0
  308. rasa/core/secrets_manager/factory.py +233 -0
  309. rasa/core/secrets_manager/secret_manager.py +262 -0
  310. rasa/core/secrets_manager/vault.py +574 -0
  311. rasa/core/test.py +1335 -0
  312. rasa/core/tracker_store.py +1699 -0
  313. rasa/core/train.py +105 -0
  314. rasa/core/training/__init__.py +89 -0
  315. rasa/core/training/converters/__init__.py +0 -0
  316. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  317. rasa/core/training/interactive.py +1745 -0
  318. rasa/core/training/story_conflict.py +381 -0
  319. rasa/core/training/training.py +93 -0
  320. rasa/core/utils.py +339 -0
  321. rasa/core/visualize.py +70 -0
  322. rasa/dialogue_understanding/__init__.py +0 -0
  323. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  324. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  325. rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
  326. rasa/dialogue_understanding/coexistence/llm_based_router.py +260 -0
  327. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  328. rasa/dialogue_understanding/commands/__init__.py +49 -0
  329. rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
  330. rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
  331. rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
  332. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
  333. rasa/dialogue_understanding/commands/clarify_command.py +86 -0
  334. rasa/dialogue_understanding/commands/command.py +85 -0
  335. rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
  336. rasa/dialogue_understanding/commands/error_command.py +79 -0
  337. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  338. rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
  339. rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
  340. rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
  341. rasa/dialogue_understanding/commands/noop_command.py +54 -0
  342. rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
  343. rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
  344. rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
  345. rasa/dialogue_understanding/generator/__init__.py +21 -0
  346. rasa/dialogue_understanding/generator/command_generator.py +343 -0
  347. rasa/dialogue_understanding/generator/constants.py +18 -0
  348. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  349. rasa/dialogue_understanding/generator/flow_retrieval.py +412 -0
  350. rasa/dialogue_understanding/generator/llm_based_command_generator.py +467 -0
  351. rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
  352. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  353. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  354. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  355. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +827 -0
  356. rasa/dialogue_understanding/generator/nlu_command_adapter.py +218 -0
  357. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  358. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +57 -0
  359. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +345 -0
  360. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  361. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  362. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  363. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  364. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  365. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  366. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  367. rasa/dialogue_understanding/patterns/completed.py +40 -0
  368. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  369. rasa/dialogue_understanding/patterns/correction.py +278 -0
  370. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +248 -0
  371. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  372. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  373. rasa/dialogue_understanding/patterns/search.py +37 -0
  374. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  375. rasa/dialogue_understanding/processor/__init__.py +0 -0
  376. rasa/dialogue_understanding/processor/command_processor.py +687 -0
  377. rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
  378. rasa/dialogue_understanding/stack/__init__.py +0 -0
  379. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  380. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  381. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  382. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  383. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  384. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  385. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  386. rasa/dialogue_understanding/stack/utils.py +211 -0
  387. rasa/e2e_test/__init__.py +0 -0
  388. rasa/e2e_test/constants.py +11 -0
  389. rasa/e2e_test/e2e_test_case.py +366 -0
  390. rasa/e2e_test/e2e_test_result.py +34 -0
  391. rasa/e2e_test/e2e_test_runner.py +768 -0
  392. rasa/e2e_test/e2e_test_schema.yml +85 -0
  393. rasa/engine/__init__.py +0 -0
  394. rasa/engine/caching.py +463 -0
  395. rasa/engine/constants.py +17 -0
  396. rasa/engine/exceptions.py +14 -0
  397. rasa/engine/graph.py +637 -0
  398. rasa/engine/loader.py +36 -0
  399. rasa/engine/recipes/__init__.py +0 -0
  400. rasa/engine/recipes/config_files/default_config.yml +44 -0
  401. rasa/engine/recipes/default_components.py +99 -0
  402. rasa/engine/recipes/default_recipe.py +1251 -0
  403. rasa/engine/recipes/graph_recipe.py +79 -0
  404. rasa/engine/recipes/recipe.py +93 -0
  405. rasa/engine/runner/__init__.py +0 -0
  406. rasa/engine/runner/dask.py +250 -0
  407. rasa/engine/runner/interface.py +49 -0
  408. rasa/engine/storage/__init__.py +0 -0
  409. rasa/engine/storage/local_model_storage.py +246 -0
  410. rasa/engine/storage/resource.py +110 -0
  411. rasa/engine/storage/storage.py +203 -0
  412. rasa/engine/training/__init__.py +0 -0
  413. rasa/engine/training/components.py +176 -0
  414. rasa/engine/training/fingerprinting.py +64 -0
  415. rasa/engine/training/graph_trainer.py +256 -0
  416. rasa/engine/training/hooks.py +164 -0
  417. rasa/engine/validation.py +873 -0
  418. rasa/env.py +5 -0
  419. rasa/exceptions.py +69 -0
  420. rasa/graph_components/__init__.py +0 -0
  421. rasa/graph_components/converters/__init__.py +0 -0
  422. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  423. rasa/graph_components/providers/__init__.py +0 -0
  424. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  425. rasa/graph_components/providers/domain_provider.py +71 -0
  426. rasa/graph_components/providers/flows_provider.py +74 -0
  427. rasa/graph_components/providers/forms_provider.py +44 -0
  428. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  429. rasa/graph_components/providers/responses_provider.py +44 -0
  430. rasa/graph_components/providers/rule_only_provider.py +49 -0
  431. rasa/graph_components/providers/story_graph_provider.py +43 -0
  432. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  433. rasa/graph_components/validators/__init__.py +0 -0
  434. rasa/graph_components/validators/default_recipe_validator.py +550 -0
  435. rasa/graph_components/validators/finetuning_validator.py +302 -0
  436. rasa/hooks.py +112 -0
  437. rasa/jupyter.py +63 -0
  438. rasa/markers/__init__.py +0 -0
  439. rasa/markers/marker.py +269 -0
  440. rasa/markers/marker_base.py +828 -0
  441. rasa/markers/upload.py +74 -0
  442. rasa/markers/validate.py +21 -0
  443. rasa/model.py +118 -0
  444. rasa/model_testing.py +457 -0
  445. rasa/model_training.py +536 -0
  446. rasa/nlu/__init__.py +7 -0
  447. rasa/nlu/classifiers/__init__.py +3 -0
  448. rasa/nlu/classifiers/classifier.py +5 -0
  449. rasa/nlu/classifiers/diet_classifier.py +1881 -0
  450. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  451. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  452. rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
  453. rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
  454. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  455. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  456. rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
  457. rasa/nlu/constants.py +77 -0
  458. rasa/nlu/convert.py +40 -0
  459. rasa/nlu/emulators/__init__.py +0 -0
  460. rasa/nlu/emulators/dialogflow.py +55 -0
  461. rasa/nlu/emulators/emulator.py +49 -0
  462. rasa/nlu/emulators/luis.py +86 -0
  463. rasa/nlu/emulators/no_emulator.py +10 -0
  464. rasa/nlu/emulators/wit.py +56 -0
  465. rasa/nlu/extractors/__init__.py +0 -0
  466. rasa/nlu/extractors/crf_entity_extractor.py +715 -0
  467. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  468. rasa/nlu/extractors/entity_synonyms.py +178 -0
  469. rasa/nlu/extractors/extractor.py +470 -0
  470. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  471. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  472. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  473. rasa/nlu/featurizers/__init__.py +0 -0
  474. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  475. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
  476. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  477. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
  478. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  479. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  480. rasa/nlu/featurizers/featurizer.py +89 -0
  481. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  482. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
  483. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
  484. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
  485. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  486. rasa/nlu/model.py +24 -0
  487. rasa/nlu/persistor.py +282 -0
  488. rasa/nlu/run.py +27 -0
  489. rasa/nlu/selectors/__init__.py +0 -0
  490. rasa/nlu/selectors/response_selector.py +987 -0
  491. rasa/nlu/test.py +1940 -0
  492. rasa/nlu/tokenizers/__init__.py +0 -0
  493. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  494. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  495. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  496. rasa/nlu/tokenizers/tokenizer.py +239 -0
  497. rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
  498. rasa/nlu/utils/__init__.py +35 -0
  499. rasa/nlu/utils/bilou_utils.py +462 -0
  500. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  501. rasa/nlu/utils/hugging_face/registry.py +108 -0
  502. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  503. rasa/nlu/utils/mitie_utils.py +113 -0
  504. rasa/nlu/utils/pattern_utils.py +168 -0
  505. rasa/nlu/utils/spacy_utils.py +310 -0
  506. rasa/plugin.py +90 -0
  507. rasa/server.py +1551 -0
  508. rasa/shared/__init__.py +0 -0
  509. rasa/shared/constants.py +192 -0
  510. rasa/shared/core/__init__.py +0 -0
  511. rasa/shared/core/command_payload_reader.py +109 -0
  512. rasa/shared/core/constants.py +167 -0
  513. rasa/shared/core/conversation.py +46 -0
  514. rasa/shared/core/domain.py +2107 -0
  515. rasa/shared/core/events.py +2504 -0
  516. rasa/shared/core/flows/__init__.py +7 -0
  517. rasa/shared/core/flows/flow.py +362 -0
  518. rasa/shared/core/flows/flow_step.py +146 -0
  519. rasa/shared/core/flows/flow_step_links.py +319 -0
  520. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  521. rasa/shared/core/flows/flows_list.py +223 -0
  522. rasa/shared/core/flows/flows_yaml_schema.json +217 -0
  523. rasa/shared/core/flows/nlu_trigger.py +117 -0
  524. rasa/shared/core/flows/steps/__init__.py +24 -0
  525. rasa/shared/core/flows/steps/action.py +56 -0
  526. rasa/shared/core/flows/steps/call.py +64 -0
  527. rasa/shared/core/flows/steps/collect.py +112 -0
  528. rasa/shared/core/flows/steps/constants.py +5 -0
  529. rasa/shared/core/flows/steps/continuation.py +36 -0
  530. rasa/shared/core/flows/steps/end.py +22 -0
  531. rasa/shared/core/flows/steps/internal.py +44 -0
  532. rasa/shared/core/flows/steps/link.py +51 -0
  533. rasa/shared/core/flows/steps/no_operation.py +48 -0
  534. rasa/shared/core/flows/steps/set_slots.py +50 -0
  535. rasa/shared/core/flows/steps/start.py +30 -0
  536. rasa/shared/core/flows/validation.py +527 -0
  537. rasa/shared/core/flows/yaml_flows_io.py +278 -0
  538. rasa/shared/core/generator.py +908 -0
  539. rasa/shared/core/slot_mappings.py +526 -0
  540. rasa/shared/core/slots.py +649 -0
  541. rasa/shared/core/trackers.py +1177 -0
  542. rasa/shared/core/training_data/__init__.py +0 -0
  543. rasa/shared/core/training_data/loading.py +89 -0
  544. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  545. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  546. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  547. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  548. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  549. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  550. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
  551. rasa/shared/core/training_data/structures.py +838 -0
  552. rasa/shared/core/training_data/visualization.html +146 -0
  553. rasa/shared/core/training_data/visualization.py +603 -0
  554. rasa/shared/data.py +249 -0
  555. rasa/shared/engine/__init__.py +0 -0
  556. rasa/shared/engine/caching.py +26 -0
  557. rasa/shared/exceptions.py +163 -0
  558. rasa/shared/importers/__init__.py +0 -0
  559. rasa/shared/importers/importer.py +704 -0
  560. rasa/shared/importers/multi_project.py +203 -0
  561. rasa/shared/importers/rasa.py +99 -0
  562. rasa/shared/importers/utils.py +34 -0
  563. rasa/shared/nlu/__init__.py +0 -0
  564. rasa/shared/nlu/constants.py +47 -0
  565. rasa/shared/nlu/interpreter.py +10 -0
  566. rasa/shared/nlu/training_data/__init__.py +0 -0
  567. rasa/shared/nlu/training_data/entities_parser.py +208 -0
  568. rasa/shared/nlu/training_data/features.py +492 -0
  569. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  570. rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
  571. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  572. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  573. rasa/shared/nlu/training_data/formats/rasa_yaml.py +603 -0
  574. rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
  575. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  576. rasa/shared/nlu/training_data/loading.py +137 -0
  577. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  578. rasa/shared/nlu/training_data/message.py +490 -0
  579. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  580. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  581. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  582. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  583. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  584. rasa/shared/nlu/training_data/training_data.py +730 -0
  585. rasa/shared/nlu/training_data/util.py +223 -0
  586. rasa/shared/providers/__init__.py +0 -0
  587. rasa/shared/providers/openai/__init__.py +0 -0
  588. rasa/shared/providers/openai/clients.py +43 -0
  589. rasa/shared/providers/openai/session_handler.py +110 -0
  590. rasa/shared/utils/__init__.py +0 -0
  591. rasa/shared/utils/cli.py +72 -0
  592. rasa/shared/utils/common.py +308 -0
  593. rasa/shared/utils/constants.py +4 -0
  594. rasa/shared/utils/io.py +415 -0
  595. rasa/shared/utils/llm.py +404 -0
  596. rasa/shared/utils/pykwalify_extensions.py +27 -0
  597. rasa/shared/utils/schemas/__init__.py +0 -0
  598. rasa/shared/utils/schemas/config.yml +2 -0
  599. rasa/shared/utils/schemas/domain.yml +145 -0
  600. rasa/shared/utils/schemas/events.py +212 -0
  601. rasa/shared/utils/schemas/model_config.yml +46 -0
  602. rasa/shared/utils/schemas/stories.yml +173 -0
  603. rasa/shared/utils/yaml.py +786 -0
  604. rasa/studio/__init__.py +0 -0
  605. rasa/studio/auth.py +268 -0
  606. rasa/studio/config.py +127 -0
  607. rasa/studio/constants.py +18 -0
  608. rasa/studio/data_handler.py +359 -0
  609. rasa/studio/download.py +483 -0
  610. rasa/studio/results_logger.py +137 -0
  611. rasa/studio/train.py +135 -0
  612. rasa/studio/upload.py +433 -0
  613. rasa/telemetry.py +1737 -0
  614. rasa/tracing/__init__.py +0 -0
  615. rasa/tracing/config.py +353 -0
  616. rasa/tracing/constants.py +62 -0
  617. rasa/tracing/instrumentation/__init__.py +0 -0
  618. rasa/tracing/instrumentation/attribute_extractors.py +672 -0
  619. rasa/tracing/instrumentation/instrumentation.py +1185 -0
  620. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
  621. rasa/tracing/instrumentation/metrics.py +294 -0
  622. rasa/tracing/metric_instrument_provider.py +205 -0
  623. rasa/utils/__init__.py +0 -0
  624. rasa/utils/beta.py +83 -0
  625. rasa/utils/cli.py +28 -0
  626. rasa/utils/common.py +635 -0
  627. rasa/utils/converter.py +53 -0
  628. rasa/utils/endpoints.py +302 -0
  629. rasa/utils/io.py +260 -0
  630. rasa/utils/licensing.py +534 -0
  631. rasa/utils/log_utils.py +174 -0
  632. rasa/utils/mapper.py +210 -0
  633. rasa/utils/ml_utils.py +145 -0
  634. rasa/utils/plotting.py +362 -0
  635. rasa/utils/singleton.py +23 -0
  636. rasa/utils/tensorflow/__init__.py +0 -0
  637. rasa/utils/tensorflow/callback.py +112 -0
  638. rasa/utils/tensorflow/constants.py +116 -0
  639. rasa/utils/tensorflow/crf.py +492 -0
  640. rasa/utils/tensorflow/data_generator.py +440 -0
  641. rasa/utils/tensorflow/environment.py +161 -0
  642. rasa/utils/tensorflow/exceptions.py +5 -0
  643. rasa/utils/tensorflow/feature_array.py +366 -0
  644. rasa/utils/tensorflow/layers.py +1565 -0
  645. rasa/utils/tensorflow/layers_utils.py +113 -0
  646. rasa/utils/tensorflow/metrics.py +281 -0
  647. rasa/utils/tensorflow/model_data.py +798 -0
  648. rasa/utils/tensorflow/model_data_utils.py +499 -0
  649. rasa/utils/tensorflow/models.py +935 -0
  650. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  651. rasa/utils/tensorflow/transformer.py +640 -0
  652. rasa/utils/tensorflow/types.py +6 -0
  653. rasa/utils/train_utils.py +572 -0
  654. rasa/utils/url_tools.py +53 -0
  655. rasa/utils/yaml.py +54 -0
  656. rasa/validator.py +1337 -0
  657. rasa/version.py +3 -0
  658. rasa_pro-3.9.18.dist-info/METADATA +563 -0
  659. rasa_pro-3.9.18.dist-info/NOTICE +5 -0
  660. rasa_pro-3.9.18.dist-info/RECORD +662 -0
  661. rasa_pro-3.9.18.dist-info/WHEEL +4 -0
  662. rasa_pro-3.9.18.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,873 @@
1
+ import dataclasses
2
+ import inspect
3
+ import re
4
+ import logging
5
+ import sys
6
+ import typing
7
+ from typing import (
8
+ Optional,
9
+ Callable,
10
+ Text,
11
+ Tuple,
12
+ Dict,
13
+ Type,
14
+ Any,
15
+ Set,
16
+ Union,
17
+ TypeVar,
18
+ List,
19
+ )
20
+
21
+ import structlog
22
+ import typing_utils
23
+
24
+ import rasa.utils.common
25
+ from rasa.core import IntentlessPolicy
26
+ from rasa.core.policies.policy import PolicyPrediction
27
+ from rasa.core.utils import AvailableEndpoints
28
+ from rasa.dialogue_understanding.coexistence.constants import (
29
+ NLU_ENTRY,
30
+ CALM_ENTRY,
31
+ STICKY,
32
+ NON_STICKY,
33
+ )
34
+ from rasa.dialogue_understanding.generator import (
35
+ LLMBasedCommandGenerator,
36
+ )
37
+ from rasa.dialogue_understanding.patterns.chitchat import FLOW_PATTERN_CHITCHAT
38
+ from rasa.engine.constants import RESERVED_PLACEHOLDERS
39
+ from rasa.engine.exceptions import GraphSchemaValidationException
40
+ from rasa.engine.graph import (
41
+ GraphSchema,
42
+ GraphComponent,
43
+ SchemaNode,
44
+ ExecutionContext,
45
+ GraphModelConfiguration,
46
+ )
47
+ from rasa.engine.storage.resource import Resource
48
+ from rasa.engine.storage.storage import ModelStorage
49
+ from rasa.engine.training.fingerprinting import Fingerprintable
50
+ from rasa.shared.constants import DOCS_URL_GRAPH_COMPONENTS, ROUTE_TO_CALM_SLOT
51
+ from rasa.shared.core.constants import ACTION_RESET_ROUTING, ACTION_TRIGGER_CHITCHAT
52
+ from rasa.shared.core.domain import Domain
53
+ from rasa.shared.core.flows import FlowsList, Flow
54
+ from rasa.shared.core.slots import Slot
55
+ from rasa.shared.exceptions import RasaException
56
+ from rasa.shared.nlu.training_data.message import Message
57
+
58
+ from rasa.dialogue_understanding.coexistence.intent_based_router import (
59
+ IntentBasedRouter,
60
+ )
61
+ from rasa.dialogue_understanding.coexistence.llm_based_router import LLMBasedRouter
62
+
63
+ TypeAnnotation = Union[TypeVar, Text, Type, Optional[AvailableEndpoints]]
64
+
65
+ structlogger = structlog.get_logger()
66
+
67
+
68
+ @dataclasses.dataclass
69
+ class ParameterInfo:
70
+ """Stores metadata about a function parameter."""
71
+
72
+ type_annotation: TypeAnnotation
73
+ # `True` if we have a parameter like `**kwargs`
74
+ is_variable_length_keyword_arg: bool
75
+ has_default: bool
76
+
77
+
78
+ KEYWORDS_EXPECTED_TYPES: Dict[Text, TypeAnnotation] = {
79
+ "resource": Resource,
80
+ "execution_context": ExecutionContext,
81
+ "model_storage": ModelStorage,
82
+ "config": Dict[Text, Any],
83
+ }
84
+
85
+
86
+ def validate(model_configuration: GraphModelConfiguration) -> None:
87
+ """Validates a graph schema.
88
+
89
+ This tries to validate that the graph structure is correct (e.g. all nodes pass the
90
+ correct things into each other) as well as validates the individual graph
91
+ components.
92
+
93
+ Args:
94
+ model_configuration: The model configuration (schemas, language, etc.)
95
+
96
+ Raises:
97
+ GraphSchemaValidationException: If the validation failed.
98
+ """
99
+ _validate(model_configuration.train_schema, True, model_configuration.language)
100
+ _validate(model_configuration.predict_schema, False, model_configuration.language)
101
+
102
+ _validate_prediction_targets(
103
+ model_configuration.predict_schema,
104
+ core_target=model_configuration.core_target,
105
+ nlu_target=model_configuration.nlu_target,
106
+ )
107
+
108
+
109
+ def _validate(
110
+ schema: GraphSchema, is_train_graph: bool, language: Optional[Text]
111
+ ) -> None:
112
+ _validate_cycle(schema)
113
+
114
+ for node_name, node in schema.nodes.items():
115
+ _validate_interface_usage(node)
116
+ _validate_supported_languages(language, node)
117
+ _validate_required_packages(node)
118
+
119
+ run_fn_params, run_fn_return_type = _get_parameter_information(
120
+ node.uses, node.fn
121
+ )
122
+ _validate_run_fn(node, run_fn_params, run_fn_return_type, is_train_graph)
123
+
124
+ create_fn_params, _ = _get_parameter_information(
125
+ node.uses, node.constructor_name
126
+ )
127
+ _validate_constructor(node, create_fn_params)
128
+
129
+ _validate_needs(node, schema, create_fn_params, run_fn_params)
130
+
131
+ _validate_required_components(schema)
132
+
133
+
134
+ def _validate_prediction_targets(
135
+ schema: GraphSchema, core_target: Optional[Text], nlu_target: Text
136
+ ) -> None:
137
+ if not nlu_target:
138
+ raise GraphSchemaValidationException(
139
+ "Graph schema specifies no target for the 'nlu_target'. It is required "
140
+ "for a prediction graph to specify this. Please choose a valid node "
141
+ "name for this."
142
+ )
143
+
144
+ _validate_target(nlu_target, "NLU", List[Message], schema)
145
+
146
+ if core_target:
147
+ _validate_target(core_target, "Core", PolicyPrediction, schema)
148
+
149
+
150
+ def _validate_target(
151
+ target_name: Text, target_type: Text, expected_type: Type, schema: GraphSchema
152
+ ) -> None:
153
+ if target_name not in schema.nodes:
154
+ raise GraphSchemaValidationException(
155
+ f"Graph schema specifies invalid {target_type} target '{target_name}'. "
156
+ f"Please make sure specify a valid node name as target."
157
+ )
158
+
159
+ if any(target_name in node.needs.values() for node in schema.nodes.values()):
160
+ raise GraphSchemaValidationException(
161
+ f"One graph node uses the {target_type} target '{target_name}' as input. "
162
+ f"This is not allowed as NLU prediction and Core prediction are run "
163
+ f"separately."
164
+ )
165
+
166
+ target_node = schema.nodes[target_name]
167
+ _, target_return_type = _get_parameter_information(target_node.uses, target_node.fn)
168
+
169
+ if not typing_utils.issubtype(target_return_type, expected_type):
170
+ raise GraphSchemaValidationException(
171
+ f"Your {target_type} model's output component "
172
+ f"'{target_node.uses.__name__}' returns an invalid return "
173
+ f"type '{target_return_type}'. This is not allowed. The {target_type} "
174
+ f"model's last component is expected to return the type '{expected_type}'. "
175
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
176
+ )
177
+
178
+
179
+ def _validate_cycle(schema: GraphSchema) -> None:
180
+ for target_name in schema.target_names:
181
+ parents = schema.nodes[target_name].needs.values()
182
+ for parent_name in parents:
183
+ _walk_and_check_for_cycles([], parent_name, schema)
184
+
185
+
186
+ def _walk_and_check_for_cycles(
187
+ visited_so_far: List[Text], node_name: Text, schema: GraphSchema
188
+ ) -> None:
189
+ if node_name in visited_so_far:
190
+ raise GraphSchemaValidationException(
191
+ f"Node '{node_name}' has itself as dependency. Cycles are not allowed "
192
+ f"in the graph. Please make sure that '{node_name}' does not have itself "
193
+ f"specified in 'needs' and none of '{node_name}'s dependencies have "
194
+ f"'{node_name}' specified in 'needs'."
195
+ )
196
+
197
+ if node_name not in schema.nodes:
198
+ raise GraphSchemaValidationException(
199
+ f"Node '{node_name}' is not part of the graph. Node was expected to be "
200
+ f"present in the graph as it is used by another component."
201
+ )
202
+
203
+ parents = schema.nodes[node_name].needs.values()
204
+ for parent_name in parents:
205
+ if not _is_placeholder_input(parent_name):
206
+ _walk_and_check_for_cycles(
207
+ [*visited_so_far, node_name], parent_name, schema
208
+ )
209
+
210
+
211
+ def _is_placeholder_input(name: Text) -> bool:
212
+ return name in RESERVED_PLACEHOLDERS
213
+
214
+
215
+ def _validate_interface_usage(node: SchemaNode) -> None:
216
+ if not issubclass(node.uses, GraphComponent):
217
+ raise GraphSchemaValidationException(
218
+ f"Your model uses a component with class '{node.uses.__name__}'. "
219
+ f"This class does not implement the '{GraphComponent.__name__}' interface "
220
+ f"and can hence not be run within Rasa Pro. Please use a different "
221
+ f"component or implement the '{GraphComponent}' interface in class "
222
+ f"'{node.uses.__name__}'. "
223
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
224
+ )
225
+
226
+
227
+ def _validate_supported_languages(language: Optional[Text], node: SchemaNode) -> None:
228
+ supported_languages = node.uses.supported_languages()
229
+ not_supported_languages = node.uses.not_supported_languages()
230
+
231
+ if supported_languages and not_supported_languages:
232
+ raise RasaException(
233
+ "Only one of `supported_languages` and "
234
+ "`not_supported_languages` can return a value different from `None`."
235
+ )
236
+
237
+ if (
238
+ language
239
+ and supported_languages is not None
240
+ and language not in supported_languages
241
+ ):
242
+ raise GraphSchemaValidationException(
243
+ f"The component '{node.uses.__name__}' does not support the currently "
244
+ f"specified language '{language}'."
245
+ )
246
+
247
+ if (
248
+ language
249
+ and not_supported_languages is not None
250
+ and language in not_supported_languages
251
+ ):
252
+ raise GraphSchemaValidationException(
253
+ f"The component '{node.uses.__name__}' does not support the currently "
254
+ f"specified language '{language}'."
255
+ )
256
+
257
+
258
+ def _validate_required_packages(node: SchemaNode) -> None:
259
+ missing_packages = rasa.utils.common.find_unavailable_packages(
260
+ node.uses.required_packages()
261
+ )
262
+ if missing_packages:
263
+ raise GraphSchemaValidationException(
264
+ f"Component '{node.uses.__name__}' requires the following packages which "
265
+ f"are currently not installed: {', '.join(missing_packages)}."
266
+ )
267
+
268
+
269
+ def _get_parameter_information(
270
+ uses: Type[GraphComponent], method_name: Text
271
+ ) -> Tuple[Dict[Text, ParameterInfo], TypeAnnotation]:
272
+ fn = _get_fn(uses, method_name)
273
+
274
+ type_hints = _get_type_hints(uses, fn)
275
+ return_type = type_hints.pop("return", inspect.Parameter.empty)
276
+ type_hints.pop("cls", None)
277
+
278
+ params = inspect.signature(fn).parameters
279
+
280
+ type_info = {}
281
+ for param_name, type_annotation in type_hints.items():
282
+ inspect_info = params[param_name]
283
+ if inspect_info.kind == inspect.Parameter.VAR_POSITIONAL:
284
+ # We always pass things using keywords so we can ignore the any variable
285
+ # length positional arguments
286
+ continue
287
+
288
+ type_info[param_name] = ParameterInfo(
289
+ type_annotation=type_annotation,
290
+ is_variable_length_keyword_arg=inspect_info.kind
291
+ == inspect.Parameter.VAR_KEYWORD,
292
+ has_default=inspect_info.default != inspect.Parameter.empty,
293
+ )
294
+
295
+ return type_info, return_type
296
+
297
+
298
+ def _get_type_hints(
299
+ uses: Type[GraphComponent], fn: Callable
300
+ ) -> Dict[Text, TypeAnnotation]:
301
+ try:
302
+ return typing.get_type_hints(fn)
303
+ except NameError as e:
304
+ logging.debug(
305
+ f"Failed to retrieve type annotations for component "
306
+ f"'{uses.__name__}' due to error:\n{e}"
307
+ )
308
+ raise GraphSchemaValidationException(
309
+ f"Your model uses a component '{uses.__name__}' which has "
310
+ f"type annotations in its method '{fn.__name__}' which failed to be "
311
+ f"retrieved. Please make sure remove any forward "
312
+ f"reference by removing the quotes around the type "
313
+ f"(e.g. 'def foo() -> \"int\"' becomes 'def foo() -> int'. and make sure "
314
+ f"all type annotations can be resolved during runtime. Note that you might "
315
+ f"need to do a 'from __future__ import annotations' to avoid forward "
316
+ f"references."
317
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
318
+ )
319
+
320
+
321
+ def _get_fn(uses: Type[GraphComponent], method_name: Text) -> Callable:
322
+ fn = getattr(uses, method_name, None)
323
+ if fn is None:
324
+ raise GraphSchemaValidationException(
325
+ f"Your model uses a graph component '{uses.__name__}' which does not "
326
+ f"have the required "
327
+ f"method '{method_name}'. Please make sure you're either using "
328
+ f"the right component or that your component is registered with the "
329
+ f"correct component type."
330
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
331
+ )
332
+ return fn
333
+
334
+
335
+ def _validate_run_fn(
336
+ node: SchemaNode,
337
+ run_fn_params: Dict[Text, ParameterInfo],
338
+ run_fn_return_type: TypeAnnotation,
339
+ is_train_graph: bool,
340
+ ) -> None:
341
+ _validate_types_of_reserved_keywords(run_fn_params, node, node.fn)
342
+ _validate_run_fn_return_type(node, run_fn_return_type, is_train_graph)
343
+
344
+ for param_name in _required_args(run_fn_params):
345
+ if param_name not in node.needs:
346
+ raise GraphSchemaValidationException(
347
+ f"Your model uses a component '{node.uses.__name__}' which "
348
+ f"needs the param '{param_name}' to be provided to its method "
349
+ f"'{node.fn}'. Please make sure that you registered "
350
+ f"your component correctly and and that your model configuration is "
351
+ f"valid."
352
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
353
+ )
354
+
355
+
356
+ def _required_args(fn_params: Dict[Text, ParameterInfo]) -> Set[Text]:
357
+ keywords = set(KEYWORDS_EXPECTED_TYPES)
358
+ return {
359
+ param_name
360
+ for param_name, param in fn_params.items()
361
+ if not param.has_default
362
+ and not param.is_variable_length_keyword_arg
363
+ and param_name not in keywords
364
+ }
365
+
366
+
367
+ def _validate_run_fn_return_type(
368
+ node: SchemaNode, return_type: Type, is_training: bool
369
+ ) -> None:
370
+ if return_type == inspect.Parameter.empty:
371
+ raise GraphSchemaValidationException(
372
+ f"Your model uses a component '{node.uses.__name__}' whose "
373
+ f"method '{node.fn}' does not have a type annotation for "
374
+ f"its return value. Type annotations are required for all "
375
+ f"components to validate your model's structure."
376
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
377
+ )
378
+
379
+ # TODO: Handle forward references here
380
+ if typing_utils.issubtype(return_type, list):
381
+ return_type = typing_utils.get_args(return_type)[0]
382
+
383
+ if is_training and not isinstance(return_type, Fingerprintable):
384
+ raise GraphSchemaValidationException(
385
+ f"Your model uses a component '{node.uses.__name__}' whose method "
386
+ f"'{node.fn}' does not return a fingerprintable "
387
+ f"output. This is required for proper caching between model trainings. "
388
+ f"Please make sure you're using a return type which implements the "
389
+ f"'{Fingerprintable.__name__}' protocol."
390
+ )
391
+
392
+
393
+ def _validate_types_of_reserved_keywords(
394
+ params: Dict[Text, ParameterInfo], node: SchemaNode, fn_name: Text
395
+ ) -> None:
396
+ for param_name, param in params.items():
397
+ if param_name in KEYWORDS_EXPECTED_TYPES:
398
+ if not typing_utils.issubtype(
399
+ param.type_annotation, KEYWORDS_EXPECTED_TYPES[param_name]
400
+ ):
401
+ raise GraphSchemaValidationException(
402
+ f"Your model uses a component '{node.uses.__name__}' which has an "
403
+ f"incompatible type '{param.type_annotation}' for "
404
+ f"the '{param_name}' parameter in its '{fn_name}' method. "
405
+ f"The expected type is '{KEYWORDS_EXPECTED_TYPES[param_name]}'."
406
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
407
+ )
408
+
409
+
410
+ def _validate_constructor(
411
+ node: SchemaNode, create_fn_params: Dict[Text, ParameterInfo]
412
+ ) -> None:
413
+ _validate_types_of_reserved_keywords(create_fn_params, node, node.constructor_name)
414
+
415
+ required_args = _required_args(create_fn_params)
416
+
417
+ if required_args and node.eager:
418
+ raise GraphSchemaValidationException(
419
+ f"Your model uses a component '{node.uses.__name__}' which has a "
420
+ f"method '{node.constructor_name}' which has required parameters "
421
+ f"('{', '.join(required_args)}'). "
422
+ f"Extra parameters can only be supplied to the constructor method which is "
423
+ f"used during training."
424
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
425
+ )
426
+
427
+ for param_name in _required_args(create_fn_params):
428
+ if not node.eager and param_name not in node.needs:
429
+ raise GraphSchemaValidationException(
430
+ f"Your model uses a component '{node.uses.__name__}' which "
431
+ f"needs the param '{param_name}' to be provided to its method "
432
+ f"'{node.constructor_name}'. Please make sure that you registered "
433
+ f"your component correctly and and that your model configuration is "
434
+ f"valid."
435
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
436
+ )
437
+
438
+
439
+ def _validate_needs(
440
+ node: SchemaNode,
441
+ graph: GraphSchema,
442
+ create_fn_params: Dict[Text, ParameterInfo],
443
+ run_fn_params: Dict[Text, ParameterInfo],
444
+ ) -> None:
445
+ available_args, has_kwargs = _get_available_args(
446
+ node, create_fn_params, run_fn_params
447
+ )
448
+
449
+ for param_name, parent_name in node.needs.items():
450
+ if not has_kwargs and param_name not in available_args:
451
+ raise GraphSchemaValidationException(
452
+ f"Your model uses a component '{node.uses.__name__}' which is "
453
+ f"supposed to retrieve a value for the "
454
+ f"param '{param_name}' although "
455
+ f"its method '{node.fn}' does not accept a parameter with this "
456
+ f"name. Please make sure that you registered "
457
+ f"your component correctly and and that your model configuration is "
458
+ f"valid."
459
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
460
+ )
461
+
462
+ if not _is_placeholder_input(parent_name) and parent_name not in graph.nodes:
463
+ raise GraphSchemaValidationException(
464
+ f"Missing graph component '{parent_name}'."
465
+ f"Your model uses a component '{node.uses.__name__}' which expects "
466
+ f"input from the missing component. The component is missing from "
467
+ f"your model configuration. Please make sure that you registered "
468
+ f"your component correctly and and that your model configuration is "
469
+ f"valid."
470
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
471
+ )
472
+
473
+ required_type = available_args.get(param_name)
474
+
475
+ if not has_kwargs and required_type is not None:
476
+ parent = None
477
+ if _is_placeholder_input(parent_name):
478
+ parent_return_type: TypeAnnotation
479
+ parent_return_type = RESERVED_PLACEHOLDERS[parent_name] # type: ignore
480
+ else:
481
+ parent = graph.nodes[parent_name]
482
+ _, parent_return_type = _get_parameter_information(
483
+ parent.uses, parent.fn
484
+ )
485
+
486
+ _validate_parent_return_type(
487
+ node, parent, parent_return_type, required_type.type_annotation
488
+ )
489
+
490
+
491
+ def _get_available_args(
492
+ node: SchemaNode,
493
+ create_fn_params: Dict[Text, ParameterInfo],
494
+ run_fn_params: Dict[Text, ParameterInfo],
495
+ ) -> Tuple[Dict[Text, ParameterInfo], bool]:
496
+ has_kwargs = any(
497
+ param.is_variable_length_keyword_arg for param in run_fn_params.values()
498
+ )
499
+ available_args = run_fn_params.copy()
500
+ if node.eager is False:
501
+ has_kwargs = has_kwargs or any(
502
+ param.is_variable_length_keyword_arg for param in create_fn_params.values()
503
+ )
504
+ available_args.update(create_fn_params)
505
+ return available_args, has_kwargs
506
+
507
+
508
+ def _validate_parent_return_type(
509
+ node: SchemaNode,
510
+ parent_node: Optional[SchemaNode],
511
+ parent_return_type: TypeAnnotation,
512
+ required_type: TypeAnnotation,
513
+ ) -> None:
514
+ if not typing_utils.issubtype(parent_return_type, required_type):
515
+ parent_node_text = ""
516
+ if parent_node:
517
+ parent_node_text = f" by the component '{parent_node.uses.__name__}'"
518
+
519
+ raise GraphSchemaValidationException(
520
+ f"Your component '{node.uses.__name__}' expects an input of type "
521
+ f"'{required_type}' but it receives an input of type '{parent_return_type}'"
522
+ f"{parent_node_text}. "
523
+ f"Please make sure that you registered "
524
+ f"your component correctly and and that your model configuration is "
525
+ f"valid."
526
+ f"See {DOCS_URL_GRAPH_COMPONENTS} for more information."
527
+ )
528
+
529
+
530
+ def _validate_required_components(schema: GraphSchema) -> None:
531
+ unmet_requirements: Dict[Type, Set[Text]] = dict()
532
+ for target_name in schema.target_names:
533
+ unmet_requirements_for_target, _ = _recursively_check_required_components(
534
+ node_name=target_name, schema=schema
535
+ )
536
+ for component_type, node_names in unmet_requirements_for_target.items():
537
+ unmet_requirements.setdefault(component_type, set()).update(node_names)
538
+ if unmet_requirements:
539
+ errors = "\n".join(
540
+ [
541
+ f"The following components require a {component_type.__name__}: "
542
+ f"{', '.join(sorted(required_by))}. "
543
+ for component_type, required_by in unmet_requirements.items()
544
+ ]
545
+ )
546
+ num_nodes = len(
547
+ set(
548
+ node_name
549
+ for required_by in unmet_requirements.values()
550
+ for node_name in required_by
551
+ )
552
+ )
553
+ raise GraphSchemaValidationException(
554
+ f"{num_nodes} components are missing required components which have to "
555
+ f"run before themselves:\n"
556
+ f"{errors}"
557
+ f"Please add the required components to your model configuration."
558
+ )
559
+
560
+
561
+ def _recursively_check_required_components(
562
+ node_name: Text, schema: GraphSchema
563
+ ) -> Tuple[Dict[Type, Set[Text]], Set[Type]]:
564
+ """Collects unmet requirements and types used in the subtree rooted at `node_name`.
565
+
566
+ Args:
567
+ schema: the graph schema
568
+ node_name: the name of the root of the subtree
569
+ Returns:
570
+ unmet requirements, i.e. a mapping from component types to names of nodes that
571
+ are contained in the subtree rooted at `schema_node` that require that component
572
+ type but can't find it in their respective subtrees and
573
+ a set containing all component types of nodes that are ancestors of the
574
+ `schema_node` (or of the`schema_node` itself)
575
+ """
576
+ schema_node = schema.nodes[node_name]
577
+
578
+ unmet_requirements: Dict[Type, Set[Text]] = dict()
579
+ component_types = set()
580
+
581
+ # collect all component types used by ancestors and their unmet requirements
582
+ for parent_node_name in schema_node.needs.values():
583
+ if _is_placeholder_input(parent_node_name):
584
+ continue
585
+ (
586
+ unmet_requirements_of_ancestors,
587
+ ancestor_types,
588
+ ) = _recursively_check_required_components(
589
+ node_name=parent_node_name, schema=schema
590
+ )
591
+ for _type, nodes in unmet_requirements_of_ancestors.items():
592
+ unmet_requirements.setdefault(_type, set()).update(nodes)
593
+ component_types.update(ancestor_types)
594
+
595
+ # check which requirements of the `schema_node` are not fulfilled by
596
+ # comparing its requirements with the types found so far among the ancestor nodes
597
+ unmet_requirements_of_current_node = set(
598
+ required
599
+ for required in schema_node.uses.required_components()
600
+ if not any(
601
+ issubclass(used_subtype, required) for used_subtype in component_types
602
+ )
603
+ )
604
+
605
+ # add the unmet requirements and the type of the `schema_node`
606
+ for component_type in unmet_requirements_of_current_node:
607
+ unmet_requirements.setdefault(component_type, set()).add(node_name)
608
+ component_types.add(schema_node.uses)
609
+
610
+ return unmet_requirements, component_types
611
+
612
+
613
+ def validate_flow_component_dependencies(
614
+ flows: FlowsList, model_configuration: GraphModelConfiguration
615
+ ) -> None:
616
+ if (pattern_chitchat := flows.flow_by_id(FLOW_PATTERN_CHITCHAT)) is not None:
617
+ _validate_chitchat_dependencies(pattern_chitchat, model_configuration)
618
+
619
+
620
+ def _validate_chitchat_dependencies(
621
+ pattern_chitchat: Flow, model_configuration: GraphModelConfiguration
622
+ ) -> None:
623
+ """Validate that the IntentlessPolicy is configured if the pattern_chitchat
624
+ is using action_trigger_chitchat.
625
+ """
626
+ has_action_trigger_chitchat = pattern_chitchat.has_action_step(
627
+ ACTION_TRIGGER_CHITCHAT
628
+ )
629
+ has_intentless_policy_configured = model_configuration.predict_schema.has_node(
630
+ IntentlessPolicy
631
+ )
632
+
633
+ if has_action_trigger_chitchat and not has_intentless_policy_configured:
634
+ structlogger.warn(
635
+ f"flow_component_dependencies"
636
+ f".{FLOW_PATTERN_CHITCHAT}"
637
+ f".intentless_policy_not_configured",
638
+ event_info=(
639
+ f"`{FLOW_PATTERN_CHITCHAT}` has an action step with "
640
+ f"`{ACTION_TRIGGER_CHITCHAT}`, but `IntentlessPolicy` is not "
641
+ f"configured."
642
+ ),
643
+ )
644
+
645
+
646
+ def get_component_index(schema: GraphSchema, component_class: Type) -> Optional[int]:
647
+ """Extracts the index of a component of the given class in the schema.
648
+ This function assumes that each component's node name is stored in a way
649
+ that includes the index as part of the name, formatted as
650
+ "run_{ComponentName}{Index}", which is how it's created by the recipe.
651
+ """
652
+ # the index of the component is at the end of the node name
653
+ pattern = re.compile(r"\d+$")
654
+ for node_name, node in schema.nodes.items():
655
+ if issubclass(node.uses, component_class):
656
+ match = pattern.search(node_name)
657
+ if match:
658
+ index = int(match.group())
659
+ return index
660
+ # index is not found or there is no component with the given class
661
+ return None
662
+
663
+
664
+ def get_component_config(
665
+ schema: GraphSchema, component_class: Type
666
+ ) -> Optional[Dict[str, Any]]:
667
+ """Extracts the config of a component of the given class in the schema."""
668
+ for node_name, node in schema.nodes.items():
669
+ if issubclass(node.uses, component_class):
670
+ return node.config
671
+ return None
672
+
673
+
674
+ def validate_router_exclusivity(schema: GraphSchema) -> None:
675
+ """Validate that intent-based and llm-based routers are not
676
+ defined at the same time.
677
+ """
678
+ if schema.has_node(IntentBasedRouter) and schema.has_node(LLMBasedRouter):
679
+ structlogger.error(
680
+ "validation.coexistance.both_routers_defined",
681
+ event_info=(
682
+ "Both LLMBasedRouter and IntentBasedRouter are in the config. "
683
+ "Please use only one of them."
684
+ ),
685
+ )
686
+ sys.exit(1)
687
+
688
+
689
+ def validate_intent_based_router_position(schema: GraphSchema) -> None:
690
+ """Validate that if intent-based router is defined, it is positioned before
691
+ the llm command generator.
692
+ """
693
+ intent_based_router_pos = get_component_index(schema, IntentBasedRouter)
694
+ llm_command_generator_pos = get_component_index(schema, LLMBasedCommandGenerator)
695
+ if (
696
+ intent_based_router_pos is not None
697
+ and llm_command_generator_pos is not None
698
+ and intent_based_router_pos > llm_command_generator_pos
699
+ ):
700
+ structlogger.error(
701
+ "validation.coexistance.wrong_order_of_components",
702
+ event_info=(
703
+ "IntentBasedRouter should come before "
704
+ "a LLMBasedCommandGenerator in the pipeline."
705
+ ),
706
+ )
707
+ sys.exit(1)
708
+
709
+
710
+ def validate_that_slots_are_defined_if_router_is_defined(
711
+ schema: GraphSchema, routing_slots: List[Slot]
712
+ ) -> None:
713
+ # check whether intent-based or llm-based type of router is present
714
+ for router_type in [IntentBasedRouter, LLMBasedRouter]:
715
+ router_present = schema.has_node(router_type)
716
+ slot_has_issue = len(routing_slots) == 0 or routing_slots[0].type_name != "bool"
717
+ if router_present and slot_has_issue:
718
+ structlogger.error(
719
+ f"validation.coexistance.{ROUTE_TO_CALM_SLOT}_not_in_domain",
720
+ event_info=(
721
+ f"{router_type.__name__} is in the config, but the slot "
722
+ f"{ROUTE_TO_CALM_SLOT} is not in the domain or not of "
723
+ f"type bool."
724
+ ),
725
+ )
726
+ sys.exit(1)
727
+
728
+
729
+ def validate_that_router_is_defined_if_router_slots_are_in_domain(
730
+ schema: GraphSchema,
731
+ routing_slots: List[Slot],
732
+ ) -> None:
733
+ defined_router_slots = len(routing_slots) > 0
734
+ router_present = schema.has_node(IntentBasedRouter) or schema.has_node(
735
+ LLMBasedRouter
736
+ )
737
+ if defined_router_slots and (
738
+ not router_present or routing_slots[0].type_name != "bool"
739
+ ):
740
+ structlogger.error(
741
+ f"validation.coexistance"
742
+ f".{ROUTE_TO_CALM_SLOT}_in_domain_with_no_router_defined",
743
+ event_info=(
744
+ f"The slot {ROUTE_TO_CALM_SLOT} is in the domain but the "
745
+ f"LLMBasedRouter or the IntentBasedRouter is not in the config or "
746
+ f"the type of the slot is not bool."
747
+ ),
748
+ )
749
+ sys.exit(1)
750
+
751
+
752
+ def valid_nlu_entry_config(config: Optional[Dict[str, Any]]) -> bool:
753
+ return (
754
+ config is not None
755
+ and NLU_ENTRY in config
756
+ and isinstance(config[NLU_ENTRY], dict)
757
+ and STICKY in config[NLU_ENTRY]
758
+ and NON_STICKY in config[NLU_ENTRY]
759
+ )
760
+
761
+
762
+ def valid_calm_entry_config(config: Optional[Dict[str, Any]]) -> bool:
763
+ return (
764
+ config is not None
765
+ and CALM_ENTRY in config
766
+ and isinstance(config[CALM_ENTRY], dict)
767
+ and STICKY in config[CALM_ENTRY]
768
+ )
769
+
770
+
771
+ def validate_configuration(
772
+ schema: GraphSchema,
773
+ ) -> None:
774
+ """Validate the configuration of the existing coexistence routers."""
775
+ if schema.has_node(IntentBasedRouter, include_subtypes=False):
776
+ config = get_component_config(schema, IntentBasedRouter)
777
+ if not valid_calm_entry_config(config) or not valid_nlu_entry_config(config):
778
+ structlogger.error(
779
+ "validation.coexistance.invalid_configuration",
780
+ event_info=(
781
+ "The configuration of the IntentBasedRouter is invalid. "
782
+ "Please check the documentation.",
783
+ ),
784
+ )
785
+ sys.exit(1)
786
+
787
+ if schema.has_node(LLMBasedRouter, include_subtypes=False):
788
+ config = get_component_config(schema, LLMBasedRouter)
789
+ if not valid_calm_entry_config(config) or (
790
+ config is not None
791
+ and NLU_ENTRY in config
792
+ and not valid_nlu_entry_config(config)
793
+ ):
794
+ structlogger.error(
795
+ "validation.coexistance.invalid_configuration",
796
+ event_info=(
797
+ "The configuration of the LLMBasedRouter is invalid. "
798
+ "Please check the documentation.",
799
+ ),
800
+ )
801
+ sys.exit(1)
802
+
803
+
804
+ def validate_coexistance_routing_setup(
805
+ domain: Domain, model_configuration: GraphModelConfiguration, flows: FlowsList
806
+ ) -> None:
807
+ schema = model_configuration.predict_schema
808
+ routing_slots = [s for s in domain.slots if s.name == ROUTE_TO_CALM_SLOT]
809
+
810
+ def validate_that_router_or_router_slot_are_defined_if_action_reset_routing_is_used(
811
+ schema: GraphSchema, flows: FlowsList, routing_slots: List[Slot]
812
+ ) -> None:
813
+ slot_has_issue = len(routing_slots) == 0 or routing_slots[0].type_name != "bool"
814
+ router_present = schema.has_node(LLMBasedRouter) or schema.has_node(
815
+ IntentBasedRouter
816
+ )
817
+
818
+ if router_present or not slot_has_issue:
819
+ return
820
+
821
+ faulty_flows_with_action_reset_routing = [
822
+ flow for flow in flows if flow.has_action_step(ACTION_RESET_ROUTING)
823
+ ]
824
+
825
+ if faulty_flows_with_action_reset_routing:
826
+ for flow in faulty_flows_with_action_reset_routing:
827
+ structlogger.error(
828
+ f"validation.coexistance.{ACTION_RESET_ROUTING}_present_in_flow"
829
+ f"_without_router_or_{ROUTE_TO_CALM_SLOT}_slot",
830
+ event_info=(
831
+ f"The action - {ACTION_RESET_ROUTING} is used in the flow - "
832
+ f"{flow.id}, but a router (LLMBasedRouter/IntentBasedRouter) or"
833
+ f" {ROUTE_TO_CALM_SLOT} are not defined.",
834
+ ),
835
+ )
836
+ sys.exit(1)
837
+
838
+ validate_router_exclusivity(schema)
839
+ validate_intent_based_router_position(schema)
840
+ validate_that_slots_are_defined_if_router_is_defined(schema, routing_slots)
841
+ validate_that_router_is_defined_if_router_slots_are_in_domain(schema, routing_slots)
842
+ validate_configuration(schema)
843
+ validate_that_router_or_router_slot_are_defined_if_action_reset_routing_is_used(
844
+ schema, flows, routing_slots
845
+ )
846
+
847
+
848
+ def validate_command_generator_exclusivity(schema: GraphSchema) -> None:
849
+ """Validate that multiple command generators are not defined at same time."""
850
+ from rasa.dialogue_understanding.generator import (
851
+ LLMBasedCommandGenerator,
852
+ )
853
+
854
+ count = schema.count_nodes_of_a_given_type(
855
+ LLMBasedCommandGenerator, include_subtypes=True
856
+ )
857
+
858
+ if count > 1:
859
+ structlogger.error(
860
+ "validation.command_generator.multiple_command_generator_defined",
861
+ event_info=(
862
+ "Multiple LLM based command generators are defined in the config. "
863
+ "Please use only one LLM based command generator."
864
+ ),
865
+ )
866
+ sys.exit(1)
867
+
868
+
869
+ def validate_command_generator_setup(
870
+ model_configuration: GraphModelConfiguration,
871
+ ) -> None:
872
+ schema = model_configuration.predict_schema
873
+ validate_command_generator_exclusivity(schema)