rasa-pro 3.8.16__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 (644) hide show
  1. README.md +380 -0
  2. rasa/__init__.py +10 -0
  3. rasa/__main__.py +151 -0
  4. rasa/anonymization/__init__.py +2 -0
  5. rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
  6. rasa/anonymization/anonymization_pipeline.py +287 -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 +117 -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 +566 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +251 -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 +33 -0
  47. rasa/cli/project_templates/calm/domain/list_contacts.yml +14 -0
  48. rasa/cli/project_templates/calm/domain/remove_contact.yml +31 -0
  49. rasa/cli/project_templates/calm/domain/shared.yml +5 -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/domain.yml +17 -0
  74. rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
  75. rasa/cli/run.py +136 -0
  76. rasa/cli/scaffold.py +268 -0
  77. rasa/cli/shell.py +141 -0
  78. rasa/cli/studio/__init__.py +0 -0
  79. rasa/cli/studio/download.py +51 -0
  80. rasa/cli/studio/studio.py +110 -0
  81. rasa/cli/studio/train.py +59 -0
  82. rasa/cli/studio/upload.py +85 -0
  83. rasa/cli/telemetry.py +90 -0
  84. rasa/cli/test.py +280 -0
  85. rasa/cli/train.py +260 -0
  86. rasa/cli/utils.py +453 -0
  87. rasa/cli/visualize.py +40 -0
  88. rasa/cli/x.py +205 -0
  89. rasa/constants.py +37 -0
  90. rasa/core/__init__.py +17 -0
  91. rasa/core/actions/__init__.py +0 -0
  92. rasa/core/actions/action.py +1450 -0
  93. rasa/core/actions/action_clean_stack.py +59 -0
  94. rasa/core/actions/action_run_slot_rejections.py +207 -0
  95. rasa/core/actions/action_trigger_chitchat.py +31 -0
  96. rasa/core/actions/action_trigger_flow.py +109 -0
  97. rasa/core/actions/action_trigger_search.py +31 -0
  98. rasa/core/actions/constants.py +2 -0
  99. rasa/core/actions/forms.py +737 -0
  100. rasa/core/actions/loops.py +111 -0
  101. rasa/core/actions/two_stage_fallback.py +186 -0
  102. rasa/core/agent.py +557 -0
  103. rasa/core/auth_retry_tracker_store.py +122 -0
  104. rasa/core/brokers/__init__.py +0 -0
  105. rasa/core/brokers/broker.py +126 -0
  106. rasa/core/brokers/file.py +58 -0
  107. rasa/core/brokers/kafka.py +322 -0
  108. rasa/core/brokers/pika.py +387 -0
  109. rasa/core/brokers/sql.py +86 -0
  110. rasa/core/channels/__init__.py +55 -0
  111. rasa/core/channels/audiocodes.py +463 -0
  112. rasa/core/channels/botframework.py +339 -0
  113. rasa/core/channels/callback.py +85 -0
  114. rasa/core/channels/channel.py +419 -0
  115. rasa/core/channels/console.py +243 -0
  116. rasa/core/channels/development_inspector.py +93 -0
  117. rasa/core/channels/facebook.py +422 -0
  118. rasa/core/channels/hangouts.py +335 -0
  119. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  120. rasa/core/channels/inspector/.gitignore +23 -0
  121. rasa/core/channels/inspector/README.md +54 -0
  122. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  123. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  124. rasa/core/channels/inspector/custom.d.ts +3 -0
  125. rasa/core/channels/inspector/dist/assets/arc-5623b6dc.js +1 -0
  126. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  127. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-685c106a.js +10 -0
  128. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-8cbed007.js +2 -0
  129. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-5889cf12.js +2 -0
  130. rasa/core/channels/inspector/dist/assets/createText-62fc7601-24c249d7.js +7 -0
  131. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-7dd06a75.js +4 -0
  132. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-62c1e54c.js +51 -0
  133. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-ce49b86f.js +6 -0
  134. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-4067e48f.js +4 -0
  135. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-85583a23.js +1 -0
  136. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-59fe4051.js +139 -0
  137. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-47e3a43b.js +266 -0
  138. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-5a2ac0d9.js +70 -0
  139. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  140. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  141. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  142. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  143. rasa/core/channels/inspector/dist/assets/index-268a75c0.js +1040 -0
  144. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-dfb8efc4.js +1 -0
  145. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  146. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-b0c470f2.js +7 -0
  147. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  148. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-2edb829a.js +139 -0
  149. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  150. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  151. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  152. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  153. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  154. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  155. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  156. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  157. rasa/core/channels/inspector/dist/assets/layout-b6873d69.js +1 -0
  158. rasa/core/channels/inspector/dist/assets/line-1efc5781.js +1 -0
  159. rasa/core/channels/inspector/dist/assets/linear-661e9b94.js +1 -0
  160. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-2d2e727f.js +109 -0
  161. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  162. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  163. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-9d3ea93d.js +35 -0
  164. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-06a178a2.js +7 -0
  165. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-0bfedffc.js +52 -0
  166. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-d76d0a04.js +8 -0
  167. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-37bb4341.js +122 -0
  168. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-f52f7f57.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-4a986a20.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/styles-080da4f6-7dd9ae12.js +110 -0
  171. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-46e1ca14.js +159 -0
  172. rasa/core/channels/inspector/dist/assets/styles-9c745c82-4a97439a.js +207 -0
  173. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-823917a3.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-9ea72896.js +61 -0
  175. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-b631a8b6.js +7 -0
  176. rasa/core/channels/inspector/dist/index.html +39 -0
  177. rasa/core/channels/inspector/index.html +37 -0
  178. rasa/core/channels/inspector/jest.config.ts +13 -0
  179. rasa/core/channels/inspector/package.json +48 -0
  180. rasa/core/channels/inspector/setupTests.ts +2 -0
  181. rasa/core/channels/inspector/src/App.tsx +170 -0
  182. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +97 -0
  183. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  184. rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
  185. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  186. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  187. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
  188. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  189. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  190. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  191. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  192. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  193. rasa/core/channels/inspector/src/helpers/formatters.test.ts +385 -0
  194. rasa/core/channels/inspector/src/helpers/formatters.ts +239 -0
  195. rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
  196. rasa/core/channels/inspector/src/main.tsx +13 -0
  197. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  198. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  199. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  200. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  201. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  202. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  203. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  204. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  205. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  206. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  207. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  208. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  209. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  210. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  211. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  212. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  213. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  214. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  215. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  216. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  217. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  222. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  223. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  224. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  225. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  226. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  227. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  228. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  229. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  230. rasa/core/channels/inspector/src/types.ts +64 -0
  231. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  232. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  233. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  234. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  235. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  236. rasa/core/channels/inspector/tsconfig.json +26 -0
  237. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  238. rasa/core/channels/inspector/vite.config.ts +8 -0
  239. rasa/core/channels/inspector/yarn.lock +6156 -0
  240. rasa/core/channels/mattermost.py +229 -0
  241. rasa/core/channels/rasa_chat.py +126 -0
  242. rasa/core/channels/rest.py +210 -0
  243. rasa/core/channels/rocketchat.py +175 -0
  244. rasa/core/channels/slack.py +620 -0
  245. rasa/core/channels/socketio.py +274 -0
  246. rasa/core/channels/telegram.py +298 -0
  247. rasa/core/channels/twilio.py +169 -0
  248. rasa/core/channels/twilio_voice.py +367 -0
  249. rasa/core/channels/vier_cvg.py +374 -0
  250. rasa/core/channels/webexteams.py +135 -0
  251. rasa/core/concurrent_lock_store.py +210 -0
  252. rasa/core/constants.py +107 -0
  253. rasa/core/evaluation/__init__.py +0 -0
  254. rasa/core/evaluation/marker.py +267 -0
  255. rasa/core/evaluation/marker_base.py +925 -0
  256. rasa/core/evaluation/marker_stats.py +294 -0
  257. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  258. rasa/core/exceptions.py +29 -0
  259. rasa/core/exporter.py +284 -0
  260. rasa/core/featurizers/__init__.py +0 -0
  261. rasa/core/featurizers/precomputation.py +410 -0
  262. rasa/core/featurizers/single_state_featurizer.py +402 -0
  263. rasa/core/featurizers/tracker_featurizers.py +1172 -0
  264. rasa/core/http_interpreter.py +89 -0
  265. rasa/core/information_retrieval/__init__.py +0 -0
  266. rasa/core/information_retrieval/faiss.py +116 -0
  267. rasa/core/information_retrieval/information_retrieval.py +72 -0
  268. rasa/core/information_retrieval/milvus.py +59 -0
  269. rasa/core/information_retrieval/qdrant.py +102 -0
  270. rasa/core/jobs.py +63 -0
  271. rasa/core/lock.py +139 -0
  272. rasa/core/lock_store.py +344 -0
  273. rasa/core/migrate.py +404 -0
  274. rasa/core/nlg/__init__.py +3 -0
  275. rasa/core/nlg/callback.py +147 -0
  276. rasa/core/nlg/contextual_response_rephraser.py +270 -0
  277. rasa/core/nlg/generator.py +230 -0
  278. rasa/core/nlg/interpolator.py +143 -0
  279. rasa/core/nlg/response.py +155 -0
  280. rasa/core/nlg/summarize.py +69 -0
  281. rasa/core/policies/__init__.py +0 -0
  282. rasa/core/policies/ensemble.py +329 -0
  283. rasa/core/policies/enterprise_search_policy.py +717 -0
  284. rasa/core/policies/enterprise_search_prompt_template.jinja2 +62 -0
  285. rasa/core/policies/flow_policy.py +205 -0
  286. rasa/core/policies/flows/__init__.py +0 -0
  287. rasa/core/policies/flows/flow_exceptions.py +44 -0
  288. rasa/core/policies/flows/flow_executor.py +582 -0
  289. rasa/core/policies/flows/flow_step_result.py +43 -0
  290. rasa/core/policies/intentless_policy.py +924 -0
  291. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  292. rasa/core/policies/memoization.py +538 -0
  293. rasa/core/policies/policy.py +716 -0
  294. rasa/core/policies/rule_policy.py +1276 -0
  295. rasa/core/policies/ted_policy.py +2146 -0
  296. rasa/core/policies/unexpected_intent_policy.py +1015 -0
  297. rasa/core/processor.py +1331 -0
  298. rasa/core/run.py +315 -0
  299. rasa/core/secrets_manager/__init__.py +0 -0
  300. rasa/core/secrets_manager/constants.py +32 -0
  301. rasa/core/secrets_manager/endpoints.py +391 -0
  302. rasa/core/secrets_manager/factory.py +233 -0
  303. rasa/core/secrets_manager/secret_manager.py +262 -0
  304. rasa/core/secrets_manager/vault.py +576 -0
  305. rasa/core/test.py +1337 -0
  306. rasa/core/tracker_store.py +1664 -0
  307. rasa/core/train.py +107 -0
  308. rasa/core/training/__init__.py +89 -0
  309. rasa/core/training/converters/__init__.py +0 -0
  310. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  311. rasa/core/training/interactive.py +1742 -0
  312. rasa/core/training/story_conflict.py +381 -0
  313. rasa/core/training/training.py +93 -0
  314. rasa/core/utils.py +344 -0
  315. rasa/core/visualize.py +70 -0
  316. rasa/dialogue_understanding/__init__.py +0 -0
  317. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  318. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  319. rasa/dialogue_understanding/coexistence/intent_based_router.py +189 -0
  320. rasa/dialogue_understanding/coexistence/llm_based_router.py +261 -0
  321. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  322. rasa/dialogue_understanding/commands/__init__.py +45 -0
  323. rasa/dialogue_understanding/commands/can_not_handle_command.py +61 -0
  324. rasa/dialogue_understanding/commands/cancel_flow_command.py +116 -0
  325. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +48 -0
  326. rasa/dialogue_understanding/commands/clarify_command.py +77 -0
  327. rasa/dialogue_understanding/commands/command.py +85 -0
  328. rasa/dialogue_understanding/commands/correct_slots_command.py +288 -0
  329. rasa/dialogue_understanding/commands/error_command.py +67 -0
  330. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  331. rasa/dialogue_understanding/commands/handle_code_change_command.py +64 -0
  332. rasa/dialogue_understanding/commands/human_handoff_command.py +57 -0
  333. rasa/dialogue_understanding/commands/knowledge_answer_command.py +48 -0
  334. rasa/dialogue_understanding/commands/noop_command.py +45 -0
  335. rasa/dialogue_understanding/commands/set_slot_command.py +125 -0
  336. rasa/dialogue_understanding/commands/skip_question_command.py +66 -0
  337. rasa/dialogue_understanding/commands/start_flow_command.py +98 -0
  338. rasa/dialogue_understanding/generator/__init__.py +6 -0
  339. rasa/dialogue_understanding/generator/command_generator.py +257 -0
  340. rasa/dialogue_understanding/generator/command_prompt_template.jinja2 +57 -0
  341. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  342. rasa/dialogue_understanding/generator/flow_retrieval.py +410 -0
  343. rasa/dialogue_understanding/generator/llm_command_generator.py +637 -0
  344. rasa/dialogue_understanding/generator/nlu_command_adapter.py +157 -0
  345. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  346. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  347. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  348. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  349. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  350. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  351. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  352. rasa/dialogue_understanding/patterns/completed.py +40 -0
  353. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  354. rasa/dialogue_understanding/patterns/correction.py +278 -0
  355. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +243 -0
  356. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  357. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  358. rasa/dialogue_understanding/patterns/search.py +37 -0
  359. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  360. rasa/dialogue_understanding/processor/__init__.py +0 -0
  361. rasa/dialogue_understanding/processor/command_processor.py +578 -0
  362. rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
  363. rasa/dialogue_understanding/stack/__init__.py +0 -0
  364. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  365. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  366. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  367. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  368. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  369. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  370. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  371. rasa/dialogue_understanding/stack/utils.py +211 -0
  372. rasa/e2e_test/__init__.py +0 -0
  373. rasa/e2e_test/constants.py +10 -0
  374. rasa/e2e_test/e2e_test_case.py +322 -0
  375. rasa/e2e_test/e2e_test_result.py +34 -0
  376. rasa/e2e_test/e2e_test_runner.py +659 -0
  377. rasa/e2e_test/e2e_test_schema.yml +67 -0
  378. rasa/engine/__init__.py +0 -0
  379. rasa/engine/caching.py +464 -0
  380. rasa/engine/constants.py +17 -0
  381. rasa/engine/exceptions.py +14 -0
  382. rasa/engine/graph.py +625 -0
  383. rasa/engine/loader.py +36 -0
  384. rasa/engine/recipes/__init__.py +0 -0
  385. rasa/engine/recipes/config_files/default_config.yml +44 -0
  386. rasa/engine/recipes/default_components.py +99 -0
  387. rasa/engine/recipes/default_recipe.py +1252 -0
  388. rasa/engine/recipes/graph_recipe.py +79 -0
  389. rasa/engine/recipes/recipe.py +93 -0
  390. rasa/engine/runner/__init__.py +0 -0
  391. rasa/engine/runner/dask.py +256 -0
  392. rasa/engine/runner/interface.py +49 -0
  393. rasa/engine/storage/__init__.py +0 -0
  394. rasa/engine/storage/local_model_storage.py +248 -0
  395. rasa/engine/storage/resource.py +110 -0
  396. rasa/engine/storage/storage.py +203 -0
  397. rasa/engine/training/__init__.py +0 -0
  398. rasa/engine/training/components.py +176 -0
  399. rasa/engine/training/fingerprinting.py +64 -0
  400. rasa/engine/training/graph_trainer.py +256 -0
  401. rasa/engine/training/hooks.py +164 -0
  402. rasa/engine/validation.py +839 -0
  403. rasa/env.py +5 -0
  404. rasa/exceptions.py +69 -0
  405. rasa/graph_components/__init__.py +0 -0
  406. rasa/graph_components/converters/__init__.py +0 -0
  407. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  408. rasa/graph_components/providers/__init__.py +0 -0
  409. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  410. rasa/graph_components/providers/domain_provider.py +71 -0
  411. rasa/graph_components/providers/flows_provider.py +74 -0
  412. rasa/graph_components/providers/forms_provider.py +44 -0
  413. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  414. rasa/graph_components/providers/responses_provider.py +44 -0
  415. rasa/graph_components/providers/rule_only_provider.py +49 -0
  416. rasa/graph_components/providers/story_graph_provider.py +43 -0
  417. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  418. rasa/graph_components/validators/__init__.py +0 -0
  419. rasa/graph_components/validators/default_recipe_validator.py +552 -0
  420. rasa/graph_components/validators/finetuning_validator.py +302 -0
  421. rasa/hooks.py +113 -0
  422. rasa/jupyter.py +63 -0
  423. rasa/keys +1 -0
  424. rasa/markers/__init__.py +0 -0
  425. rasa/markers/marker.py +269 -0
  426. rasa/markers/marker_base.py +828 -0
  427. rasa/markers/upload.py +74 -0
  428. rasa/markers/validate.py +21 -0
  429. rasa/model.py +118 -0
  430. rasa/model_testing.py +457 -0
  431. rasa/model_training.py +535 -0
  432. rasa/nlu/__init__.py +7 -0
  433. rasa/nlu/classifiers/__init__.py +3 -0
  434. rasa/nlu/classifiers/classifier.py +5 -0
  435. rasa/nlu/classifiers/diet_classifier.py +1874 -0
  436. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  437. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  438. rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
  439. rasa/nlu/classifiers/logistic_regression_classifier.py +240 -0
  440. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  441. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  442. rasa/nlu/classifiers/sklearn_intent_classifier.py +309 -0
  443. rasa/nlu/constants.py +77 -0
  444. rasa/nlu/convert.py +40 -0
  445. rasa/nlu/emulators/__init__.py +0 -0
  446. rasa/nlu/emulators/dialogflow.py +55 -0
  447. rasa/nlu/emulators/emulator.py +49 -0
  448. rasa/nlu/emulators/luis.py +86 -0
  449. rasa/nlu/emulators/no_emulator.py +10 -0
  450. rasa/nlu/emulators/wit.py +56 -0
  451. rasa/nlu/extractors/__init__.py +0 -0
  452. rasa/nlu/extractors/crf_entity_extractor.py +672 -0
  453. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  454. rasa/nlu/extractors/entity_synonyms.py +178 -0
  455. rasa/nlu/extractors/extractor.py +470 -0
  456. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  457. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  458. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  459. rasa/nlu/featurizers/__init__.py +0 -0
  460. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  461. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +449 -0
  462. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  463. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +772 -0
  464. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  465. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  466. rasa/nlu/featurizers/featurizer.py +89 -0
  467. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  468. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +840 -0
  469. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +539 -0
  470. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +269 -0
  471. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  472. rasa/nlu/model.py +24 -0
  473. rasa/nlu/persistor.py +240 -0
  474. rasa/nlu/run.py +27 -0
  475. rasa/nlu/selectors/__init__.py +0 -0
  476. rasa/nlu/selectors/response_selector.py +990 -0
  477. rasa/nlu/test.py +1943 -0
  478. rasa/nlu/tokenizers/__init__.py +0 -0
  479. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  480. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  481. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  482. rasa/nlu/tokenizers/tokenizer.py +239 -0
  483. rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
  484. rasa/nlu/utils/__init__.py +35 -0
  485. rasa/nlu/utils/bilou_utils.py +462 -0
  486. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  487. rasa/nlu/utils/hugging_face/registry.py +108 -0
  488. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  489. rasa/nlu/utils/mitie_utils.py +113 -0
  490. rasa/nlu/utils/pattern_utils.py +168 -0
  491. rasa/nlu/utils/spacy_utils.py +312 -0
  492. rasa/plugin.py +90 -0
  493. rasa/server.py +1536 -0
  494. rasa/shared/__init__.py +0 -0
  495. rasa/shared/constants.py +181 -0
  496. rasa/shared/core/__init__.py +0 -0
  497. rasa/shared/core/constants.py +168 -0
  498. rasa/shared/core/conversation.py +46 -0
  499. rasa/shared/core/domain.py +2106 -0
  500. rasa/shared/core/events.py +2507 -0
  501. rasa/shared/core/flows/__init__.py +7 -0
  502. rasa/shared/core/flows/flow.py +353 -0
  503. rasa/shared/core/flows/flow_step.py +146 -0
  504. rasa/shared/core/flows/flow_step_links.py +319 -0
  505. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  506. rasa/shared/core/flows/flows_list.py +211 -0
  507. rasa/shared/core/flows/flows_yaml_schema.json +217 -0
  508. rasa/shared/core/flows/nlu_trigger.py +117 -0
  509. rasa/shared/core/flows/steps/__init__.py +24 -0
  510. rasa/shared/core/flows/steps/action.py +51 -0
  511. rasa/shared/core/flows/steps/call.py +64 -0
  512. rasa/shared/core/flows/steps/collect.py +112 -0
  513. rasa/shared/core/flows/steps/constants.py +5 -0
  514. rasa/shared/core/flows/steps/continuation.py +36 -0
  515. rasa/shared/core/flows/steps/end.py +22 -0
  516. rasa/shared/core/flows/steps/internal.py +44 -0
  517. rasa/shared/core/flows/steps/link.py +51 -0
  518. rasa/shared/core/flows/steps/no_operation.py +48 -0
  519. rasa/shared/core/flows/steps/set_slots.py +50 -0
  520. rasa/shared/core/flows/steps/start.py +30 -0
  521. rasa/shared/core/flows/validation.py +527 -0
  522. rasa/shared/core/flows/yaml_flows_io.py +278 -0
  523. rasa/shared/core/generator.py +907 -0
  524. rasa/shared/core/slot_mappings.py +235 -0
  525. rasa/shared/core/slots.py +647 -0
  526. rasa/shared/core/trackers.py +1159 -0
  527. rasa/shared/core/training_data/__init__.py +0 -0
  528. rasa/shared/core/training_data/loading.py +90 -0
  529. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  530. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  531. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  532. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  533. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  534. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  535. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +442 -0
  536. rasa/shared/core/training_data/structures.py +838 -0
  537. rasa/shared/core/training_data/visualization.html +146 -0
  538. rasa/shared/core/training_data/visualization.py +603 -0
  539. rasa/shared/data.py +192 -0
  540. rasa/shared/engine/__init__.py +0 -0
  541. rasa/shared/engine/caching.py +26 -0
  542. rasa/shared/exceptions.py +129 -0
  543. rasa/shared/importers/__init__.py +0 -0
  544. rasa/shared/importers/importer.py +705 -0
  545. rasa/shared/importers/multi_project.py +203 -0
  546. rasa/shared/importers/rasa.py +100 -0
  547. rasa/shared/importers/utils.py +34 -0
  548. rasa/shared/nlu/__init__.py +0 -0
  549. rasa/shared/nlu/constants.py +45 -0
  550. rasa/shared/nlu/interpreter.py +10 -0
  551. rasa/shared/nlu/training_data/__init__.py +0 -0
  552. rasa/shared/nlu/training_data/entities_parser.py +209 -0
  553. rasa/shared/nlu/training_data/features.py +374 -0
  554. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  555. rasa/shared/nlu/training_data/formats/dialogflow.py +162 -0
  556. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  557. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  558. rasa/shared/nlu/training_data/formats/rasa_yaml.py +605 -0
  559. rasa/shared/nlu/training_data/formats/readerwriter.py +245 -0
  560. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  561. rasa/shared/nlu/training_data/loading.py +137 -0
  562. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  563. rasa/shared/nlu/training_data/message.py +477 -0
  564. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  565. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  566. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  567. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  568. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  569. rasa/shared/nlu/training_data/training_data.py +732 -0
  570. rasa/shared/nlu/training_data/util.py +223 -0
  571. rasa/shared/providers/__init__.py +0 -0
  572. rasa/shared/providers/openai/__init__.py +0 -0
  573. rasa/shared/providers/openai/clients.py +43 -0
  574. rasa/shared/providers/openai/session_handler.py +110 -0
  575. rasa/shared/utils/__init__.py +0 -0
  576. rasa/shared/utils/cli.py +72 -0
  577. rasa/shared/utils/common.py +308 -0
  578. rasa/shared/utils/constants.py +1 -0
  579. rasa/shared/utils/io.py +403 -0
  580. rasa/shared/utils/llm.py +405 -0
  581. rasa/shared/utils/pykwalify_extensions.py +26 -0
  582. rasa/shared/utils/schemas/__init__.py +0 -0
  583. rasa/shared/utils/schemas/config.yml +2 -0
  584. rasa/shared/utils/schemas/domain.yml +142 -0
  585. rasa/shared/utils/schemas/events.py +212 -0
  586. rasa/shared/utils/schemas/model_config.yml +46 -0
  587. rasa/shared/utils/schemas/stories.yml +173 -0
  588. rasa/shared/utils/yaml.py +777 -0
  589. rasa/studio/__init__.py +0 -0
  590. rasa/studio/auth.py +252 -0
  591. rasa/studio/config.py +127 -0
  592. rasa/studio/constants.py +16 -0
  593. rasa/studio/data_handler.py +352 -0
  594. rasa/studio/download.py +350 -0
  595. rasa/studio/train.py +136 -0
  596. rasa/studio/upload.py +408 -0
  597. rasa/telemetry.py +1583 -0
  598. rasa/tracing/__init__.py +0 -0
  599. rasa/tracing/config.py +338 -0
  600. rasa/tracing/constants.py +38 -0
  601. rasa/tracing/instrumentation/__init__.py +0 -0
  602. rasa/tracing/instrumentation/attribute_extractors.py +663 -0
  603. rasa/tracing/instrumentation/instrumentation.py +939 -0
  604. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +142 -0
  605. rasa/tracing/instrumentation/metrics.py +206 -0
  606. rasa/tracing/metric_instrument_provider.py +125 -0
  607. rasa/utils/__init__.py +0 -0
  608. rasa/utils/beta.py +83 -0
  609. rasa/utils/cli.py +27 -0
  610. rasa/utils/common.py +635 -0
  611. rasa/utils/converter.py +53 -0
  612. rasa/utils/endpoints.py +303 -0
  613. rasa/utils/io.py +326 -0
  614. rasa/utils/licensing.py +319 -0
  615. rasa/utils/log_utils.py +174 -0
  616. rasa/utils/mapper.py +210 -0
  617. rasa/utils/ml_utils.py +145 -0
  618. rasa/utils/plotting.py +362 -0
  619. rasa/utils/singleton.py +23 -0
  620. rasa/utils/tensorflow/__init__.py +0 -0
  621. rasa/utils/tensorflow/callback.py +112 -0
  622. rasa/utils/tensorflow/constants.py +116 -0
  623. rasa/utils/tensorflow/crf.py +492 -0
  624. rasa/utils/tensorflow/data_generator.py +440 -0
  625. rasa/utils/tensorflow/environment.py +161 -0
  626. rasa/utils/tensorflow/exceptions.py +5 -0
  627. rasa/utils/tensorflow/layers.py +1565 -0
  628. rasa/utils/tensorflow/layers_utils.py +113 -0
  629. rasa/utils/tensorflow/metrics.py +281 -0
  630. rasa/utils/tensorflow/model_data.py +991 -0
  631. rasa/utils/tensorflow/model_data_utils.py +500 -0
  632. rasa/utils/tensorflow/models.py +936 -0
  633. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  634. rasa/utils/tensorflow/transformer.py +640 -0
  635. rasa/utils/tensorflow/types.py +6 -0
  636. rasa/utils/train_utils.py +572 -0
  637. rasa/utils/yaml.py +54 -0
  638. rasa/validator.py +1035 -0
  639. rasa/version.py +3 -0
  640. rasa_pro-3.8.16.dist-info/METADATA +528 -0
  641. rasa_pro-3.8.16.dist-info/NOTICE +5 -0
  642. rasa_pro-3.8.16.dist-info/RECORD +644 -0
  643. rasa_pro-3.8.16.dist-info/WHEEL +4 -0
  644. rasa_pro-3.8.16.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,939 @@
1
+ import contextlib
2
+ import functools
3
+ import importlib
4
+ import inspect
5
+ import json
6
+ import logging
7
+ import time
8
+ from typing import (
9
+ Any,
10
+ AsyncIterator,
11
+ Awaitable,
12
+ Callable,
13
+ Dict,
14
+ List,
15
+ Optional,
16
+ TYPE_CHECKING,
17
+ Text,
18
+ Type,
19
+ TypeVar,
20
+ )
21
+
22
+ from multidict import MultiDict
23
+ from opentelemetry.context import Context
24
+
25
+ import rasa.shared.utils.io
26
+ from opentelemetry.sdk.trace import TracerProvider
27
+ from opentelemetry.trace import SpanKind, Tracer
28
+ from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
29
+ from rasa.core.actions.action import Action, RemoteAction
30
+ from rasa.core.agent import Agent
31
+ from rasa.core.channels import OutputChannel
32
+ from rasa.core.information_retrieval.information_retrieval import InformationRetrieval
33
+ from rasa.core.lock_store import LockStore
34
+ from rasa.core.nlg import NaturalLanguageGenerator
35
+ from rasa.core.policies.flows.flow_step_result import FlowActionPrediction
36
+ from rasa.core.policies.policy import Policy, PolicyPrediction
37
+ from rasa.core.processor import MessageProcessor
38
+ from rasa.core.tracker_store import TrackerStore
39
+ from rasa.dialogue_understanding.commands import Command
40
+ from rasa.dialogue_understanding.generator.llm_command_generator import (
41
+ LLMCommandGenerator,
42
+ )
43
+ from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
44
+ from rasa.engine.graph import GraphNode
45
+ from rasa.engine.training.graph_trainer import GraphTrainer
46
+ from rasa.shared.constants import DOCS_BASE_URL
47
+ from rasa.shared.core.flows import FlowsList
48
+ from rasa.shared.core.trackers import DialogueStateTracker
49
+ from rasa.shared.nlu.training_data.message import Message
50
+ from rasa.tracing.instrumentation.intentless_policy_instrumentation import (
51
+ _instrument_extract_ai_responses,
52
+ _instrument_generate_answer,
53
+ _instrument_select_few_shot_conversations,
54
+ _instrument_select_response_examples,
55
+ )
56
+ from rasa.tracing.instrumentation.metrics import (
57
+ record_llm_command_generator_metrics,
58
+ record_callable_duration_metrics,
59
+ record_request_size_in_bytes,
60
+ )
61
+ from rasa.utils.endpoints import EndpointConfig
62
+
63
+ from rasa.tracing.instrumentation import attribute_extractors
64
+
65
+ if TYPE_CHECKING:
66
+ from langchain.schema import Document
67
+
68
+ # The `TypeVar` representing the return type for a function to be wrapped.
69
+ S = TypeVar("S")
70
+ # The `TypeVar` representing the type of the argument passed to the function to be
71
+ # wrapped.
72
+ T = TypeVar("T")
73
+
74
+ logger = logging.getLogger(__name__)
75
+ INSTRUMENTED_BOOLEAN_ATTRIBUTE_NAME = "class_has_been_instrumented"
76
+ INSTRUMENTED_MODULE_BOOLEAN_ATTRIBUTE_NAME = "module_has_been_instrumented"
77
+ COMMAND_PROCESSOR_MODULE_NAME = (
78
+ "rasa.dialogue_understanding.processor.command_processor"
79
+ )
80
+ FLOW_EXECUTOR_MODULE_NAME = "rasa.core.policies.flows.flow_executor"
81
+
82
+
83
+ def _check_extractor_argument_list(
84
+ fn: Callable[[T, Any, Any], S],
85
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
86
+ ) -> bool:
87
+ if attr_extractor is None:
88
+ return False
89
+
90
+ fn_args = inspect.signature(fn)
91
+ attr_args = inspect.signature(attr_extractor)
92
+
93
+ are_arglists_congruent = fn_args.parameters.keys() == attr_args.parameters.keys()
94
+
95
+ if not are_arglists_congruent:
96
+ logger.warning(
97
+ f"Argument lists for {fn.__name__} and {attr_extractor.__name__}"
98
+ f" do not match up. {fn.__name__} will be traced without attributes."
99
+ )
100
+
101
+ return are_arglists_congruent
102
+
103
+
104
+ def extract_tracing_context_from_headers(
105
+ headers: Dict[str, Any],
106
+ ) -> Optional[Context]:
107
+ """Extracts the tracing context from the headers."""
108
+ tracing_carrier = MultiDict(
109
+ [
110
+ (key, value)
111
+ for key, value in headers.items()
112
+ if key.lower() not in ("content-length", "content-encoding")
113
+ ]
114
+ )
115
+ context = (
116
+ TraceContextTextMapPropagator().extract(headers) if tracing_carrier else None
117
+ )
118
+
119
+ return context
120
+
121
+
122
+ def traceable(
123
+ fn: Callable[[T, Any, Any], S],
124
+ tracer: Tracer,
125
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
126
+ metrics_recorder: Optional[Callable],
127
+ ) -> Callable[[T, Any, Any], S]:
128
+ """Wrap a non-`async` function by tracing functionality.
129
+
130
+ :param fn: The function to be wrapped.
131
+ :param tracer: The `Tracer` that shall be used for tracing this function.
132
+ :param attr_extractor: A function that is applied to the function's instance and
133
+ the function's arguments.
134
+ :param metrics_recorder: A function that records metric measurements.
135
+ :return: The wrapped function.
136
+ """
137
+ should_extract_args = _check_extractor_argument_list(fn, attr_extractor)
138
+
139
+ @functools.wraps(fn)
140
+ def wrapper(self: T, *args: Any, **kwargs: Any) -> S:
141
+ attrs = (
142
+ attr_extractor(self, *args, **kwargs)
143
+ if attr_extractor and should_extract_args
144
+ else {}
145
+ )
146
+
147
+ module_name = attrs.pop("module_name", "")
148
+ if module_name in ["command_processor", FLOW_EXECUTOR_MODULE_NAME]:
149
+ span_name = f"{module_name}.{fn.__name__}"
150
+ else:
151
+ span_name = f"{self.__class__.__name__}.{fn.__name__}"
152
+ with tracer.start_as_current_span(span_name, attributes=attrs):
153
+ start_time = time.perf_counter_ns()
154
+
155
+ result = fn(self, *args, **kwargs)
156
+
157
+ end_time = time.perf_counter_ns()
158
+ record_callable_duration_metrics(self, start_time, end_time)
159
+
160
+ if metrics_recorder:
161
+ metrics_recorder(attrs)
162
+
163
+ return result
164
+
165
+ return wrapper
166
+
167
+
168
+ def traceable_async(
169
+ fn: Callable[[T, Any, Any], Awaitable[S]],
170
+ tracer: Tracer,
171
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
172
+ header_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
173
+ metrics_recorder: Optional[Callable],
174
+ ) -> Callable[[T, Any, Any], Awaitable[S]]:
175
+ """Wrap an `async` function by tracing functionality.
176
+
177
+ :param fn: The function to be wrapped.
178
+ :param tracer: The `Tracer` that shall be used for tracing this function.
179
+ :param attr_extractor: A function that is applied to the function's instance and
180
+ the function's arguments.
181
+ :param header_extractor: A function that is applied to the function's arguments
182
+ :param metrics_recorder: A function that records metric measurements.
183
+ :return: The wrapped function.
184
+ """
185
+ should_extract_args = _check_extractor_argument_list(fn, attr_extractor)
186
+
187
+ @functools.wraps(fn)
188
+ async def async_wrapper(self: T, *args: Any, **kwargs: Any) -> S:
189
+ attrs = (
190
+ attr_extractor(self, *args, **kwargs)
191
+ if attr_extractor and should_extract_args
192
+ else {}
193
+ )
194
+ headers = header_extractor(*args, **kwargs) if header_extractor else {}
195
+ context = extract_tracing_context_from_headers(headers)
196
+
197
+ if issubclass(self.__class__, GraphNode) and fn.__name__ == "__call__":
198
+ span_name = f"{self.__class__.__name__}." + attrs.get(
199
+ "component_class", "GraphNode"
200
+ )
201
+ else:
202
+ span_name = f"{self.__class__.__name__}.{fn.__name__}"
203
+
204
+ with tracer.start_as_current_span(
205
+ span_name,
206
+ attributes=attrs,
207
+ context=context,
208
+ ) as span:
209
+ TraceContextTextMapPropagator().inject(headers)
210
+
211
+ ctx = span.get_span_context()
212
+ logger.debug(
213
+ f"The trace id for the current span '{span_name}' is '{ctx.trace_id}'."
214
+ )
215
+
216
+ start_time = time.perf_counter_ns()
217
+
218
+ result = await fn(self, *args, **kwargs)
219
+
220
+ end_time = time.perf_counter_ns()
221
+ record_callable_duration_metrics(self, start_time, end_time, **attrs)
222
+
223
+ if metrics_recorder:
224
+ metrics_recorder(attrs)
225
+
226
+ return result
227
+
228
+ return async_wrapper
229
+
230
+
231
+ def traceable_async_generator(
232
+ fn: Callable[[T, Any, Any], AsyncIterator[S]],
233
+ tracer: Tracer,
234
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
235
+ ) -> Callable[[T, Any, Any], AsyncIterator[AsyncIterator[S]]]:
236
+ """Wrap an `async` function that `yield`s by tracing functionality.
237
+
238
+ :param fn: The function to be wrapped.
239
+ :param tracer: The `Tracer` that shall be used for tracing this function.
240
+ :param attr_extractor: A function that is applied to the function's instance and
241
+ the function's arguments.
242
+ :return: The wrapped function.
243
+ """
244
+ should_extract_args = _check_extractor_argument_list(fn, attr_extractor)
245
+
246
+ @functools.wraps(fn)
247
+ async def async_wrapper(
248
+ self: T, *args: Any, **kwargs: Any
249
+ ) -> AsyncIterator[AsyncIterator[S]]:
250
+ attrs = (
251
+ attr_extractor(self, *args, **kwargs)
252
+ if attr_extractor and should_extract_args
253
+ else {}
254
+ )
255
+ with tracer.start_as_current_span(
256
+ f"{self.__class__.__name__}.{fn.__name__}", attributes=attrs
257
+ ):
258
+ yield fn(self, *args, **kwargs)
259
+
260
+ return async_wrapper
261
+
262
+
263
+ # This `TypeVar` restricts the agent_class to be instrumented to subclasses of `Agent`.
264
+ AgentType = TypeVar("AgentType", bound=Agent)
265
+ # This `TypeVar` restricts the processor_class to be instrumented to subclasses of
266
+ # `MessageProcessor`.
267
+ ProcessorType = TypeVar("ProcessorType", bound=MessageProcessor)
268
+ TrackerStoreType = TypeVar("TrackerStoreType", bound=TrackerStore)
269
+ GraphNodeType = TypeVar("GraphNodeType", bound=GraphNode)
270
+ # This `TypeVar` restricts the lock_store_class to be instrumented to subclasses of
271
+ # `LockStore`.
272
+ LockStoreType = TypeVar("LockStoreType", bound=LockStore)
273
+ GraphTrainerType = TypeVar("GraphTrainerType", bound=GraphTrainer)
274
+ LLMCommandGeneratorType = TypeVar("LLMCommandGeneratorType", bound=LLMCommandGenerator)
275
+ CommandType = TypeVar("CommandType", bound=Command)
276
+ PolicyType = TypeVar("PolicyType", bound=Policy)
277
+ InformationRetrievalType = TypeVar(
278
+ "InformationRetrievalType", bound=InformationRetrieval
279
+ )
280
+ NLUCommandAdapterType = TypeVar("NLUCommandAdapterType", bound=NLUCommandAdapter)
281
+ EndpointConfigType = TypeVar("EndpointConfigType", bound=EndpointConfig)
282
+
283
+
284
+ def instrument(
285
+ tracer_provider: TracerProvider,
286
+ agent_class: Optional[Type[AgentType]] = None,
287
+ processor_class: Optional[Type[ProcessorType]] = None,
288
+ tracker_store_class: Optional[Type[TrackerStoreType]] = None,
289
+ graph_node_class: Optional[Type[GraphNodeType]] = None,
290
+ lock_store_class: Optional[Type[LockStoreType]] = None,
291
+ graph_trainer_class: Optional[Type[GraphTrainerType]] = None,
292
+ llm_command_generator_class: Optional[Type[LLMCommandGeneratorType]] = None,
293
+ command_subclasses: Optional[List[Type[CommandType]]] = None,
294
+ contextual_response_rephraser_class: Optional[Any] = None,
295
+ policy_subclasses: Optional[List[Type[PolicyType]]] = None,
296
+ vector_store_subclasses: Optional[List[Type[InformationRetrievalType]]] = None,
297
+ nlu_command_adapter_class: Optional[Type[NLUCommandAdapterType]] = None,
298
+ endpoint_config_class: Optional[Type[EndpointConfigType]] = None,
299
+ ) -> None:
300
+ """Substitute methods to be traced by their traced counterparts.
301
+
302
+ Because of type bounds on `AgentType` and `ProcessorType`,
303
+ we ensure that only subtypes of `Agent`
304
+ and `MessageProcessor` can be instrumented, respectively.
305
+
306
+ :param tracer_provider: The `TracerProvider` to be used for configuring tracing
307
+ on the substituted methods.
308
+ :param agent_class: The `Agent` to be instrumented. If `None` is given, no `Agent`
309
+ will be instrumented.
310
+ :param processor_class: The `MessageProcessor` to be instrumented. If `None` is
311
+ given, no `MessageProcessor` will be instrumented.
312
+ :param tracker_store_class: The `TrackerStore` to be instrumented. If `None` is
313
+ given, no `TrackerStore` will be instrumented.
314
+ :param graph_node_class: The `GraphNode` to be instrumented. If `None` is
315
+ given, no `GraphNode` will be instrumented.
316
+ :param lock_store_class: The `LockStore` to be instrumented. If `None` is
317
+ given, no `LockStore` will be instrumented.
318
+ :param graph_trainer_class: The `GraphTrainer` to be instrumented. If `None` is
319
+ given, no `GraphTrainer` will be instrumented.
320
+ :param llm_command_generator_class: The `LLMCommandGenerator` to be instrumented.
321
+ If `None` is given, no `LLMCommandGenerator` will be instrumented.
322
+ :param command_subclasses: The subclasses of `Command` to be instrumented. If `None`
323
+ is given, no subclass of `Command` will be instrumented.
324
+ :param contextual_response_rephraser_class: The `ContextualResponseRephraser` to
325
+ be instrumented. If `None` is given, no `ContextualResponseRephraser` will be
326
+ instrumented.
327
+ :param policy_subclasses: The subclasses of `Policy` to be instrumented. If `None`
328
+ is given, no subclass of `Policy` will be instrumented.
329
+ :param vector_store_subclasses: The subclasses of `InformationRetrieval` to be
330
+ instrumented. If `None` is given, no subclass of `InformationRetrieval` will be
331
+ instrumented.
332
+ :param nlu_command_adapter_class: The `NLUCommandAdapter` to be instrumented. If
333
+ `None` is given, no `NLUCommandAdapter` will be instrumented.
334
+ :param endpoint_config_class: The `EndpointConfig` to be instrumented. If
335
+ `None` is given, no `EndpointConfig` will be instrumented.
336
+ """
337
+ if agent_class is not None and not class_is_instrumented(agent_class):
338
+ _instrument_method(
339
+ tracer_provider.get_tracer(agent_class.__module__),
340
+ agent_class,
341
+ "handle_message",
342
+ attribute_extractors.extract_attrs_for_agent,
343
+ attribute_extractors.extract_headers,
344
+ )
345
+ mark_class_as_instrumented(agent_class)
346
+
347
+ if processor_class is not None and not class_is_instrumented(processor_class):
348
+ _instrument_processor(tracer_provider, processor_class)
349
+ mark_class_as_instrumented(processor_class)
350
+
351
+ if tracker_store_class is not None and not class_is_instrumented(
352
+ tracker_store_class
353
+ ):
354
+ _instrument_method(
355
+ tracer_provider.get_tracer(tracker_store_class.__module__),
356
+ tracker_store_class,
357
+ "_stream_new_events",
358
+ attribute_extractors.extract_attrs_for_tracker_store,
359
+ )
360
+ mark_class_as_instrumented(tracker_store_class)
361
+
362
+ if graph_node_class is not None and not class_is_instrumented(graph_node_class):
363
+ _instrument_method(
364
+ tracer_provider.get_tracer(graph_node_class.__module__),
365
+ graph_node_class,
366
+ "__call__",
367
+ attribute_extractors.extract_attrs_for_graph_node,
368
+ )
369
+ mark_class_as_instrumented(graph_node_class)
370
+
371
+ if lock_store_class is not None and not class_is_instrumented(lock_store_class):
372
+ # Not so straightforward: to wrap a function that is decorated as a
373
+ # `@asynccontextmanager`, we need to first unwrap the original function, then
374
+ # wrap that with the tracing functionality, and re-decorate as an
375
+ # `@asynccontextmanager`.
376
+ lock_method = inspect.unwrap(lock_store_class.lock)
377
+ traced_lock_method = traceable_async_generator(
378
+ lock_method,
379
+ tracer_provider.get_tracer(lock_store_class.__module__),
380
+ attribute_extractors.extract_attrs_for_lock_store,
381
+ )
382
+ lock_store_class.lock = contextlib.asynccontextmanager(traced_lock_method) # type: ignore[assignment] # noqa: E501
383
+
384
+ logger.debug(f"Instrumented '{lock_store_class.__name__}.lock'.")
385
+
386
+ mark_class_as_instrumented(lock_store_class)
387
+
388
+ if graph_trainer_class is not None and not class_is_instrumented(
389
+ graph_trainer_class
390
+ ):
391
+ _instrument_method(
392
+ tracer_provider.get_tracer(graph_trainer_class.__module__),
393
+ graph_trainer_class,
394
+ "train",
395
+ attribute_extractors.extract_attrs_for_graph_trainer,
396
+ )
397
+ mark_class_as_instrumented(graph_trainer_class)
398
+
399
+ if llm_command_generator_class is not None and not class_is_instrumented(
400
+ llm_command_generator_class
401
+ ):
402
+ _instrument_method(
403
+ tracer_provider.get_tracer(llm_command_generator_class.__module__),
404
+ llm_command_generator_class,
405
+ "_generate_action_list_using_llm",
406
+ attribute_extractors.extract_attrs_for_llm_command_generator,
407
+ metrics_recorder=record_llm_command_generator_metrics,
408
+ )
409
+ _instrument_method(
410
+ tracer_provider.get_tracer(llm_command_generator_class.__module__),
411
+ llm_command_generator_class,
412
+ "_check_commands_against_startable_flows",
413
+ attribute_extractors.extract_attrs_for_check_commands_against_startable_flows,
414
+ )
415
+ mark_class_as_instrumented(llm_command_generator_class)
416
+
417
+ if command_subclasses:
418
+ for command_subclass in command_subclasses:
419
+ if command_subclass is not None and not class_is_instrumented(
420
+ command_subclass
421
+ ):
422
+ _instrument_method(
423
+ tracer_provider.get_tracer(command_subclass.__module__),
424
+ command_subclass,
425
+ "run_command_on_tracker",
426
+ attribute_extractors.extract_attrs_for_command,
427
+ )
428
+ mark_class_as_instrumented(command_subclass)
429
+
430
+ if contextual_response_rephraser_class is not None and not class_is_instrumented(
431
+ contextual_response_rephraser_class
432
+ ):
433
+ _instrument_method(
434
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
435
+ contextual_response_rephraser_class,
436
+ "_generate_llm_response",
437
+ attribute_extractors.extract_attrs_for_contextual_response_rephraser,
438
+ )
439
+ _instrument_method(
440
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
441
+ contextual_response_rephraser_class,
442
+ "_create_history",
443
+ attribute_extractors.extract_attrs_for_create_history,
444
+ )
445
+ _instrument_method(
446
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
447
+ contextual_response_rephraser_class,
448
+ "generate",
449
+ attribute_extractors.extract_attrs_for_generate,
450
+ )
451
+ mark_class_as_instrumented(contextual_response_rephraser_class)
452
+
453
+ if not module_is_instrumented(COMMAND_PROCESSOR_MODULE_NAME):
454
+ _instrument_command_processor_module(tracer_provider)
455
+
456
+ if not module_is_instrumented(FLOW_EXECUTOR_MODULE_NAME):
457
+ _instrument_flow_executor_module(tracer_provider)
458
+
459
+ if policy_subclasses:
460
+ for policy_subclass in policy_subclasses:
461
+ if policy_subclass is not None and not class_is_instrumented(
462
+ policy_subclass
463
+ ):
464
+ _instrument_method(
465
+ tracer_provider.get_tracer(policy_subclass.__module__),
466
+ policy_subclass,
467
+ "_prediction",
468
+ attribute_extractors.extract_attrs_for_policy_prediction,
469
+ )
470
+
471
+ _instrument_intentless_policy(
472
+ tracer_provider,
473
+ policy_subclass,
474
+ )
475
+
476
+ _instrument_enterprise_search_policy(
477
+ tracer_provider,
478
+ policy_subclass,
479
+ )
480
+
481
+ mark_class_as_instrumented(policy_subclass)
482
+
483
+ if vector_store_subclasses:
484
+ for vector_store_subclass in vector_store_subclasses:
485
+ if vector_store_subclass is not None and not class_is_instrumented(
486
+ vector_store_subclass
487
+ ):
488
+ _instrument_information_retrieval_search(
489
+ tracer_provider.get_tracer(vector_store_subclass.__module__),
490
+ vector_store_subclass,
491
+ )
492
+ mark_class_as_instrumented(vector_store_subclass)
493
+
494
+ if nlu_command_adapter_class is not None and not class_is_instrumented(
495
+ nlu_command_adapter_class
496
+ ):
497
+ _instrument_nlu_command_adapter_predict_commands(
498
+ tracer_provider.get_tracer(nlu_command_adapter_class.__module__),
499
+ nlu_command_adapter_class,
500
+ )
501
+ mark_class_as_instrumented(nlu_command_adapter_class)
502
+
503
+ if endpoint_config_class is not None and not class_is_instrumented(
504
+ endpoint_config_class
505
+ ):
506
+ _instrument_method(
507
+ tracer_provider.get_tracer(endpoint_config_class.__module__),
508
+ endpoint_config_class,
509
+ "request",
510
+ attribute_extractors.extract_attrs_for_endpoint_config,
511
+ metrics_recorder=record_request_size_in_bytes,
512
+ )
513
+
514
+
515
+ def _instrument_nlu_command_adapter_predict_commands(
516
+ tracer: Tracer, nlu_command_adapter_class: Type[NLUCommandAdapterType]
517
+ ) -> None:
518
+ def tracing_nlu_command_adapter_predict_commands_wrapper(fn: Callable) -> Callable:
519
+ @functools.wraps(fn)
520
+ async def wrapper(
521
+ self: NLUCommandAdapter,
522
+ message: Message,
523
+ flows: FlowsList,
524
+ tracker: Optional[DialogueStateTracker] = None,
525
+ ) -> List[Command]:
526
+ with tracer.start_as_current_span(
527
+ f"{self.__class__.__name__}.{fn.__name__}"
528
+ ) as span:
529
+ commands = await fn(self, message, flows, tracker)
530
+
531
+ span.set_attributes(
532
+ {
533
+ "commands": json.dumps(
534
+ [command.as_dict() for command in commands]
535
+ ),
536
+ "intent": json.dumps(message.get("intent", {}).get("name")),
537
+ }
538
+ )
539
+ return commands
540
+
541
+ return wrapper
542
+
543
+ nlu_command_adapter_class.predict_commands = tracing_nlu_command_adapter_predict_commands_wrapper( # type: ignore[assignment] # noqa: E501
544
+ nlu_command_adapter_class.predict_commands
545
+ )
546
+
547
+ logger.debug(
548
+ f"Instrumented '{nlu_command_adapter_class.__name__}.predict_commands'."
549
+ )
550
+
551
+
552
+ def _instrument_information_retrieval_search(
553
+ tracer: Tracer, vector_store_class: Type[InformationRetrievalType]
554
+ ) -> None:
555
+ def tracing_information_retrieval_search_wrapper(fn: Callable) -> Callable:
556
+ @functools.wraps(fn)
557
+ async def wrapper(
558
+ self: InformationRetrieval, query: Text, threshold: float = 0.0
559
+ ) -> List["Document"]:
560
+ with tracer.start_as_current_span(
561
+ f"{self.__class__.__name__}.{fn.__name__}"
562
+ ) as span:
563
+ documents = await fn(self, query, threshold)
564
+ span.set_attributes(
565
+ {
566
+ "query": query,
567
+ "document_metadata": json.dumps(
568
+ [document.metadata for document in documents]
569
+ ),
570
+ }
571
+ )
572
+ return documents
573
+
574
+ return wrapper
575
+
576
+ vector_store_class.search = tracing_information_retrieval_search_wrapper( # type: ignore[assignment] # noqa: E501
577
+ vector_store_class.search
578
+ )
579
+
580
+ logger.debug(f"Instrumented '{vector_store_class.__name__}.search' method.")
581
+
582
+
583
+ def _instrument_enterprise_search_policy(
584
+ tracer_provider: TracerProvider, policy_class: Type[PolicyType]
585
+ ) -> None:
586
+ if policy_class.__module__ != "rasa.core.policies.enterprise_search_policy":
587
+ return None
588
+
589
+ tracer = tracer_provider.get_tracer(policy_class.__module__)
590
+
591
+ _instrument_method(
592
+ tracer,
593
+ policy_class,
594
+ "_generate_llm_answer",
595
+ attribute_extractors.extract_attrs_for_enterprise_search_generate_llm_answer,
596
+ )
597
+
598
+
599
+ def _instrument_intentless_policy(
600
+ tracer_provider: TracerProvider, policy_class: Type[PolicyType]
601
+ ) -> None:
602
+ if policy_class.__module__ != "rasa.core.policies.intentless_policy":
603
+ return None
604
+
605
+ tracer = tracer_provider.get_tracer(policy_class.__module__)
606
+
607
+ _instrument_method(
608
+ tracer,
609
+ policy_class,
610
+ "_prediction_result",
611
+ attribute_extractors.extract_attrs_for_intentless_policy_prediction_result,
612
+ )
613
+ _instrument_method(
614
+ tracer,
615
+ policy_class,
616
+ "find_closest_response",
617
+ attribute_extractors.extract_attrs_for_intentless_policy_find_closest_response,
618
+ )
619
+ _instrument_select_response_examples(tracer, policy_class)
620
+ _instrument_select_few_shot_conversations(tracer, policy_class)
621
+ _instrument_extract_ai_responses(tracer, policy_class)
622
+ _instrument_generate_answer(tracer, policy_class)
623
+ _instrument_method(
624
+ tracer,
625
+ policy_class,
626
+ "_generate_llm_answer",
627
+ attribute_extractors.extract_attrs_for_intentless_policy_generate_llm_answer,
628
+ )
629
+
630
+
631
+ def _instrument_processor(
632
+ tracer_provider: TracerProvider, processor_class: Type[ProcessorType]
633
+ ) -> None:
634
+ tracer = tracer_provider.get_tracer(processor_class.__module__)
635
+ _instrument_method(
636
+ tracer,
637
+ processor_class,
638
+ "handle_message",
639
+ None,
640
+ attribute_extractors.extract_headers,
641
+ )
642
+ _instrument_method(
643
+ tracer,
644
+ processor_class,
645
+ "log_message",
646
+ None,
647
+ attribute_extractors.extract_headers,
648
+ )
649
+ _instrument_run_action(tracer, processor_class)
650
+ _instrument_method(
651
+ tracer,
652
+ processor_class,
653
+ "save_tracker",
654
+ attribute_extractors.extract_number_of_events,
655
+ )
656
+ _instrument_method(tracer, processor_class, "_run_prediction_loop", None)
657
+ _instrument_method(
658
+ tracer,
659
+ processor_class,
660
+ "_predict_next_with_tracker",
661
+ attribute_extractors.extract_intent_name_and_slots,
662
+ )
663
+ _instrument_get_tracker(tracer, processor_class)
664
+
665
+
666
+ # Wrapping `get_tracker` works a bit differently since in this case, we actually need
667
+ # to extract the attributes from the return value.
668
+ def _instrument_get_tracker(
669
+ tracer: Tracer, processor_class: Type[ProcessorType]
670
+ ) -> None:
671
+ def tracing_get_tracker_wrapper(fn: Callable) -> Callable:
672
+ @functools.wraps(fn)
673
+ async def wrapper(
674
+ self: Type[ProcessorType], conversation_id: Text
675
+ ) -> DialogueStateTracker:
676
+ with tracer.start_as_current_span(
677
+ f"{self.__class__.__name__}.{fn.__name__}"
678
+ ) as span:
679
+ tracker: DialogueStateTracker = await fn(self, conversation_id)
680
+ span.set_attributes({"number_of_events": len(tracker.events)})
681
+ return tracker
682
+
683
+ return wrapper
684
+
685
+ processor_class.get_tracker = tracing_get_tracker_wrapper( # type: ignore[assignment] # noqa: E501
686
+ processor_class.get_tracker
687
+ )
688
+
689
+ logger.debug(f"Instrumented '{processor_class.__name__}.get_tracker'.")
690
+
691
+
692
+ def _instrument_command_processor_module(tracer_provider: TracerProvider) -> None:
693
+ _instrument_function(
694
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
695
+ COMMAND_PROCESSOR_MODULE_NAME,
696
+ "execute_commands",
697
+ attribute_extractors.extract_attrs_for_execute_commands,
698
+ )
699
+ _instrument_function(
700
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
701
+ COMMAND_PROCESSOR_MODULE_NAME,
702
+ "validate_state_of_commands",
703
+ attribute_extractors.extract_attrs_for_validate_state_of_commands,
704
+ )
705
+ _instrument_function(
706
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
707
+ COMMAND_PROCESSOR_MODULE_NAME,
708
+ "clean_up_commands",
709
+ attribute_extractors.extract_attrs_for_clean_up_commands,
710
+ )
711
+ _instrument_function(
712
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
713
+ COMMAND_PROCESSOR_MODULE_NAME,
714
+ "remove_duplicated_set_slots",
715
+ attribute_extractors.extract_attrs_for_remove_duplicated_set_slots,
716
+ )
717
+ mark_module_as_instrumented(COMMAND_PROCESSOR_MODULE_NAME)
718
+
719
+
720
+ def _instrument_flow_executor_module(tracer_provider: TracerProvider) -> None:
721
+ _instrument_function(
722
+ tracer_provider.get_tracer(FLOW_EXECUTOR_MODULE_NAME),
723
+ FLOW_EXECUTOR_MODULE_NAME,
724
+ "advance_flows",
725
+ attribute_extractors.extract_attrs_for_advance_flows,
726
+ )
727
+ _instrument_advance_flows_until_next_action(
728
+ tracer_provider.get_tracer(FLOW_EXECUTOR_MODULE_NAME),
729
+ FLOW_EXECUTOR_MODULE_NAME,
730
+ "advance_flows_until_next_action",
731
+ )
732
+ _instrument_function(
733
+ tracer_provider.get_tracer(FLOW_EXECUTOR_MODULE_NAME),
734
+ FLOW_EXECUTOR_MODULE_NAME,
735
+ "run_step",
736
+ attribute_extractors.extract_attrs_for_run_step,
737
+ )
738
+ mark_module_as_instrumented(FLOW_EXECUTOR_MODULE_NAME)
739
+
740
+
741
+ def _instrument_advance_flows_until_next_action(
742
+ tracer: Tracer,
743
+ module_name: str,
744
+ function_name: str,
745
+ ) -> None:
746
+ def tracing_advance_flows_until_next_action_wrapper(fn: Callable) -> Callable:
747
+ @functools.wraps(fn)
748
+ def wrapper(
749
+ tracker: DialogueStateTracker,
750
+ available_actions: List[str],
751
+ flows: FlowsList,
752
+ ) -> FlowActionPrediction:
753
+ with tracer.start_as_current_span(f"{module_name}.{fn.__name__}") as span:
754
+ prediction: FlowActionPrediction = fn(tracker, available_actions, flows)
755
+
756
+ span.set_attributes(
757
+ {
758
+ "action_name": prediction.action_name
759
+ if prediction.action_name
760
+ else "None",
761
+ "score": prediction.score,
762
+ "metadata": json.dumps(prediction.metadata)
763
+ if prediction.metadata
764
+ else "{}",
765
+ "events": json.dumps(
766
+ [event.__class__.__name__ for event in prediction.events]
767
+ if prediction.events
768
+ else [],
769
+ ),
770
+ }
771
+ )
772
+
773
+ return prediction
774
+
775
+ return wrapper
776
+
777
+ module = importlib.import_module(module_name)
778
+ function_to_trace = getattr(module, function_name)
779
+
780
+ traced_function = tracing_advance_flows_until_next_action_wrapper(function_to_trace)
781
+
782
+ setattr(module, function_name, traced_function)
783
+
784
+ logger.debug(
785
+ f"Instrumented function '{function_name}' in the module '{module_name}'. "
786
+ )
787
+
788
+
789
+ def _instrument_method(
790
+ tracer: Tracer,
791
+ instrumented_class: Type,
792
+ method_name: Text,
793
+ attr_extractor: Optional[Callable],
794
+ header_extractor: Optional[Callable] = None,
795
+ metrics_recorder: Optional[Callable] = None,
796
+ ) -> None:
797
+ method_to_trace = getattr(instrumented_class, method_name)
798
+ traced_method = _wrap_with_tracing_decorator(
799
+ method_to_trace, tracer, attr_extractor, header_extractor, metrics_recorder
800
+ )
801
+ setattr(instrumented_class, method_name, traced_method)
802
+
803
+ logger.debug(f"Instrumented '{instrumented_class.__name__}.{method_name}'.")
804
+
805
+
806
+ def _instrument_function(
807
+ tracer: Tracer,
808
+ module_name: Text,
809
+ function_name: Text,
810
+ attr_extractor: Optional[Callable],
811
+ header_extractor: Optional[Callable] = None,
812
+ ) -> None:
813
+ module = importlib.import_module(module_name)
814
+ function_to_trace = getattr(module, function_name)
815
+ traced_function = _wrap_with_tracing_decorator(
816
+ function_to_trace, tracer, attr_extractor, header_extractor
817
+ )
818
+
819
+ setattr(module, function_name, traced_function)
820
+
821
+ logger.debug(
822
+ f"Instrumented function '{function_name}' in the module '{module_name}'. "
823
+ )
824
+
825
+
826
+ def _wrap_with_tracing_decorator(
827
+ callable_to_trace: Callable,
828
+ tracer: Tracer,
829
+ attr_extractor: Optional[Callable],
830
+ header_extractor: Optional[Callable] = None,
831
+ metrics_recorder: Optional[Callable] = None,
832
+ ) -> Callable:
833
+ if inspect.iscoroutinefunction(callable_to_trace):
834
+ traced_callable = traceable_async(
835
+ callable_to_trace,
836
+ tracer,
837
+ attr_extractor,
838
+ header_extractor,
839
+ metrics_recorder,
840
+ )
841
+ else:
842
+ traced_callable = traceable(
843
+ callable_to_trace, tracer, attr_extractor, metrics_recorder
844
+ )
845
+
846
+ return traced_callable
847
+
848
+
849
+ def _instrument_run_action(
850
+ tracer: Tracer, processor_class: Type[ProcessorType]
851
+ ) -> None:
852
+ def tracing_run_action_wrapper(fn: Callable) -> Callable:
853
+ @functools.wraps(fn)
854
+ async def wrapper(
855
+ self: Type[ProcessorType],
856
+ action: Action,
857
+ tracker: DialogueStateTracker,
858
+ output_channel: OutputChannel,
859
+ nlg: NaturalLanguageGenerator,
860
+ prediction: PolicyPrediction,
861
+ ) -> bool:
862
+ attrs = {
863
+ "action_name": action.name(),
864
+ "sender_id": tracker.sender_id,
865
+ "message_id": tracker.latest_message.message_id or "default", # type: ignore[union-attr] # noqa: E501
866
+ }
867
+ with tracer.start_as_current_span(
868
+ f"{self.__class__.__name__}.{fn.__name__}",
869
+ kind=SpanKind.CLIENT,
870
+ attributes=attrs,
871
+ ):
872
+ if isinstance(action, RemoteAction):
873
+ if not isinstance(action.action_endpoint, EndpointConfig):
874
+ rasa.shared.utils.io.raise_warning(
875
+ f"No endpoint is configured to propagate the trace of this "
876
+ f"custom action {action.name()}. Please take a look at "
877
+ f"the docs and set an endpoint configuration in the "
878
+ f"endpoints.yml file",
879
+ docs=f"{DOCS_BASE_URL}/custom-actions",
880
+ )
881
+ else:
882
+ propagator = TraceContextTextMapPropagator()
883
+ propagator.inject(action.action_endpoint.headers)
884
+
885
+ return await fn(self, action, tracker, output_channel, nlg, prediction)
886
+
887
+ return wrapper
888
+
889
+ processor_class._run_action = tracing_run_action_wrapper( # type: ignore[assignment] # noqa: E501
890
+ processor_class._run_action
891
+ )
892
+
893
+ logger.debug(f"Instrumented '{processor_class.__name__}._run_action'.")
894
+
895
+
896
+ def _mangled_instrumented_boolean_attribute_name(instrumented_class: Type) -> Text:
897
+ # see https://peps.python.org/pep-0008/#method-names-and-instance-variables
898
+ # and https://stackoverflow.com/a/50401073
899
+ return f"_{instrumented_class.__name__}__{INSTRUMENTED_BOOLEAN_ATTRIBUTE_NAME}"
900
+
901
+
902
+ def class_is_instrumented(instrumented_class: Type) -> bool:
903
+ """Check if a class has already been instrumented."""
904
+ return getattr(
905
+ instrumented_class,
906
+ _mangled_instrumented_boolean_attribute_name(instrumented_class),
907
+ False,
908
+ )
909
+
910
+
911
+ def mark_class_as_instrumented(instrumented_class: Type) -> None:
912
+ """Mark a class as instrumented if it isn't already marked."""
913
+ if not class_is_instrumented(instrumented_class):
914
+ setattr(
915
+ instrumented_class,
916
+ _mangled_instrumented_boolean_attribute_name(instrumented_class),
917
+ True,
918
+ )
919
+
920
+
921
+ def _instrumented_module_boolean_attribute_name(module_name: Text) -> Text:
922
+ return f"{module_name}_{INSTRUMENTED_MODULE_BOOLEAN_ATTRIBUTE_NAME}"
923
+
924
+
925
+ def module_is_instrumented(module_name: Text) -> bool:
926
+ """Check if a module has already been instrumented."""
927
+ module = importlib.import_module(module_name)
928
+ return getattr(
929
+ module,
930
+ _instrumented_module_boolean_attribute_name(module_name),
931
+ False,
932
+ )
933
+
934
+
935
+ def mark_module_as_instrumented(module_name: Text) -> None:
936
+ """Mark a module as instrumented if it isn't already marked."""
937
+ module = importlib.import_module(module_name)
938
+ if not module_is_instrumented(module_name):
939
+ setattr(module, _instrumented_module_boolean_attribute_name(module_name), True)