rasa-pro 3.12.0.dev1__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 (790) hide show
  1. README.md +41 -0
  2. rasa/__init__.py +9 -0
  3. rasa/__main__.py +177 -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 +160 -0
  12. rasa/cli/__init__.py +5 -0
  13. rasa/cli/arguments/__init__.py +0 -0
  14. rasa/cli/arguments/data.py +106 -0
  15. rasa/cli/arguments/default_arguments.py +207 -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 +219 -0
  20. rasa/cli/arguments/shell.py +17 -0
  21. rasa/cli/arguments/test.py +211 -0
  22. rasa/cli/arguments/train.py +279 -0
  23. rasa/cli/arguments/visualize.py +34 -0
  24. rasa/cli/arguments/x.py +30 -0
  25. rasa/cli/data.py +354 -0
  26. rasa/cli/dialogue_understanding_test.py +251 -0
  27. rasa/cli/e2e_test.py +259 -0
  28. rasa/cli/evaluate.py +222 -0
  29. rasa/cli/export.py +250 -0
  30. rasa/cli/inspect.py +75 -0
  31. rasa/cli/interactive.py +166 -0
  32. rasa/cli/license.py +65 -0
  33. rasa/cli/llm_fine_tuning.py +403 -0
  34. rasa/cli/markers.py +78 -0
  35. rasa/cli/project_templates/__init__.py +0 -0
  36. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  37. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  38. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  39. rasa/cli/project_templates/calm/actions/db.py +57 -0
  40. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  41. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  42. rasa/cli/project_templates/calm/config.yml +10 -0
  43. rasa/cli/project_templates/calm/credentials.yml +33 -0
  44. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  45. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  46. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  47. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  48. rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
  49. rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
  50. rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
  51. rasa/cli/project_templates/calm/domain/shared.yml +10 -0
  52. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  53. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  54. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  55. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  58. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  59. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  60. rasa/cli/project_templates/calm/endpoints.yml +58 -0
  61. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  62. rasa/cli/project_templates/default/actions/actions.py +27 -0
  63. rasa/cli/project_templates/default/config.yml +44 -0
  64. rasa/cli/project_templates/default/credentials.yml +33 -0
  65. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  66. rasa/cli/project_templates/default/data/rules.yml +13 -0
  67. rasa/cli/project_templates/default/data/stories.yml +30 -0
  68. rasa/cli/project_templates/default/domain.yml +34 -0
  69. rasa/cli/project_templates/default/endpoints.yml +42 -0
  70. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  71. rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
  72. rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
  73. rasa/cli/project_templates/tutorial/config.yml +12 -0
  74. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  75. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  76. rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
  77. rasa/cli/project_templates/tutorial/domain.yml +35 -0
  78. rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
  79. rasa/cli/run.py +143 -0
  80. rasa/cli/scaffold.py +273 -0
  81. rasa/cli/shell.py +141 -0
  82. rasa/cli/studio/__init__.py +0 -0
  83. rasa/cli/studio/download.py +62 -0
  84. rasa/cli/studio/studio.py +296 -0
  85. rasa/cli/studio/train.py +59 -0
  86. rasa/cli/studio/upload.py +62 -0
  87. rasa/cli/telemetry.py +102 -0
  88. rasa/cli/test.py +280 -0
  89. rasa/cli/train.py +278 -0
  90. rasa/cli/utils.py +484 -0
  91. rasa/cli/visualize.py +40 -0
  92. rasa/cli/x.py +206 -0
  93. rasa/constants.py +45 -0
  94. rasa/core/__init__.py +17 -0
  95. rasa/core/actions/__init__.py +0 -0
  96. rasa/core/actions/action.py +1318 -0
  97. rasa/core/actions/action_clean_stack.py +59 -0
  98. rasa/core/actions/action_exceptions.py +24 -0
  99. rasa/core/actions/action_hangup.py +29 -0
  100. rasa/core/actions/action_repeat_bot_messages.py +89 -0
  101. rasa/core/actions/action_run_slot_rejections.py +210 -0
  102. rasa/core/actions/action_trigger_chitchat.py +31 -0
  103. rasa/core/actions/action_trigger_flow.py +109 -0
  104. rasa/core/actions/action_trigger_search.py +31 -0
  105. rasa/core/actions/constants.py +5 -0
  106. rasa/core/actions/custom_action_executor.py +191 -0
  107. rasa/core/actions/direct_custom_actions_executor.py +109 -0
  108. rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
  109. rasa/core/actions/forms.py +741 -0
  110. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  111. rasa/core/actions/http_custom_action_executor.py +145 -0
  112. rasa/core/actions/loops.py +114 -0
  113. rasa/core/actions/two_stage_fallback.py +186 -0
  114. rasa/core/agent.py +559 -0
  115. rasa/core/auth_retry_tracker_store.py +122 -0
  116. rasa/core/brokers/__init__.py +0 -0
  117. rasa/core/brokers/broker.py +126 -0
  118. rasa/core/brokers/file.py +58 -0
  119. rasa/core/brokers/kafka.py +324 -0
  120. rasa/core/brokers/pika.py +388 -0
  121. rasa/core/brokers/sql.py +86 -0
  122. rasa/core/channels/__init__.py +61 -0
  123. rasa/core/channels/botframework.py +338 -0
  124. rasa/core/channels/callback.py +84 -0
  125. rasa/core/channels/channel.py +456 -0
  126. rasa/core/channels/console.py +241 -0
  127. rasa/core/channels/development_inspector.py +197 -0
  128. rasa/core/channels/facebook.py +419 -0
  129. rasa/core/channels/hangouts.py +329 -0
  130. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  131. rasa/core/channels/inspector/.gitignore +23 -0
  132. rasa/core/channels/inspector/README.md +54 -0
  133. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  134. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  135. rasa/core/channels/inspector/custom.d.ts +3 -0
  136. rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
  137. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  138. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
  139. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
  140. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
  141. rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
  142. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
  143. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
  144. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
  145. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
  146. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
  147. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
  148. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
  149. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
  150. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  151. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  152. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  153. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  154. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
  155. rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
  156. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  157. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
  158. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  159. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
  160. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  161. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  162. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  163. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  164. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  165. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  166. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  167. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  168. rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
  171. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
  172. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  173. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
  175. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
  176. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
  177. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
  178. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
  179. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
  180. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
  181. rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
  182. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
  183. rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
  184. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
  185. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
  186. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
  187. rasa/core/channels/inspector/dist/index.html +42 -0
  188. rasa/core/channels/inspector/index.html +40 -0
  189. rasa/core/channels/inspector/jest.config.ts +13 -0
  190. rasa/core/channels/inspector/package.json +52 -0
  191. rasa/core/channels/inspector/setupTests.ts +2 -0
  192. rasa/core/channels/inspector/src/App.tsx +220 -0
  193. rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
  194. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
  195. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  196. rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
  197. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  198. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  199. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
  200. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  201. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  202. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  203. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  204. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  205. rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
  206. rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
  207. rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
  208. rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
  209. rasa/core/channels/inspector/src/main.tsx +13 -0
  210. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  211. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  212. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  213. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  214. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  215. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  216. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  217. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  218. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  222. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  223. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  224. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  225. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  226. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  227. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  228. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  229. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  230. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  231. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  232. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  233. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  234. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  235. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  236. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  237. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  238. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  239. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  240. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  241. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  242. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  243. rasa/core/channels/inspector/src/types.ts +84 -0
  244. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  245. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  246. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  247. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  248. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  249. rasa/core/channels/inspector/tsconfig.json +26 -0
  250. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  251. rasa/core/channels/inspector/vite.config.ts +8 -0
  252. rasa/core/channels/inspector/yarn.lock +6249 -0
  253. rasa/core/channels/mattermost.py +229 -0
  254. rasa/core/channels/rasa_chat.py +126 -0
  255. rasa/core/channels/rest.py +230 -0
  256. rasa/core/channels/rocketchat.py +174 -0
  257. rasa/core/channels/slack.py +620 -0
  258. rasa/core/channels/socketio.py +302 -0
  259. rasa/core/channels/telegram.py +298 -0
  260. rasa/core/channels/twilio.py +169 -0
  261. rasa/core/channels/vier_cvg.py +374 -0
  262. rasa/core/channels/voice_ready/__init__.py +0 -0
  263. rasa/core/channels/voice_ready/audiocodes.py +501 -0
  264. rasa/core/channels/voice_ready/jambonz.py +121 -0
  265. rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
  266. rasa/core/channels/voice_ready/twilio_voice.py +403 -0
  267. rasa/core/channels/voice_ready/utils.py +37 -0
  268. rasa/core/channels/voice_stream/__init__.py +0 -0
  269. rasa/core/channels/voice_stream/asr/__init__.py +0 -0
  270. rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
  271. rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
  272. rasa/core/channels/voice_stream/asr/azure.py +130 -0
  273. rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
  274. rasa/core/channels/voice_stream/audio_bytes.py +8 -0
  275. rasa/core/channels/voice_stream/browser_audio.py +107 -0
  276. rasa/core/channels/voice_stream/call_state.py +23 -0
  277. rasa/core/channels/voice_stream/tts/__init__.py +0 -0
  278. rasa/core/channels/voice_stream/tts/azure.py +106 -0
  279. rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
  280. rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
  281. rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
  282. rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
  283. rasa/core/channels/voice_stream/util.py +57 -0
  284. rasa/core/channels/voice_stream/voice_channel.py +427 -0
  285. rasa/core/channels/webexteams.py +134 -0
  286. rasa/core/concurrent_lock_store.py +210 -0
  287. rasa/core/constants.py +112 -0
  288. rasa/core/evaluation/__init__.py +0 -0
  289. rasa/core/evaluation/marker.py +267 -0
  290. rasa/core/evaluation/marker_base.py +923 -0
  291. rasa/core/evaluation/marker_stats.py +293 -0
  292. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  293. rasa/core/exceptions.py +29 -0
  294. rasa/core/exporter.py +284 -0
  295. rasa/core/featurizers/__init__.py +0 -0
  296. rasa/core/featurizers/precomputation.py +410 -0
  297. rasa/core/featurizers/single_state_featurizer.py +421 -0
  298. rasa/core/featurizers/tracker_featurizers.py +1262 -0
  299. rasa/core/http_interpreter.py +89 -0
  300. rasa/core/information_retrieval/__init__.py +7 -0
  301. rasa/core/information_retrieval/faiss.py +124 -0
  302. rasa/core/information_retrieval/information_retrieval.py +137 -0
  303. rasa/core/information_retrieval/milvus.py +59 -0
  304. rasa/core/information_retrieval/qdrant.py +96 -0
  305. rasa/core/jobs.py +63 -0
  306. rasa/core/lock.py +139 -0
  307. rasa/core/lock_store.py +343 -0
  308. rasa/core/migrate.py +403 -0
  309. rasa/core/nlg/__init__.py +3 -0
  310. rasa/core/nlg/callback.py +146 -0
  311. rasa/core/nlg/contextual_response_rephraser.py +320 -0
  312. rasa/core/nlg/generator.py +230 -0
  313. rasa/core/nlg/interpolator.py +143 -0
  314. rasa/core/nlg/response.py +155 -0
  315. rasa/core/nlg/summarize.py +70 -0
  316. rasa/core/persistor.py +538 -0
  317. rasa/core/policies/__init__.py +0 -0
  318. rasa/core/policies/ensemble.py +329 -0
  319. rasa/core/policies/enterprise_search_policy.py +905 -0
  320. rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
  321. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  322. rasa/core/policies/flow_policy.py +205 -0
  323. rasa/core/policies/flows/__init__.py +0 -0
  324. rasa/core/policies/flows/flow_exceptions.py +44 -0
  325. rasa/core/policies/flows/flow_executor.py +754 -0
  326. rasa/core/policies/flows/flow_step_result.py +43 -0
  327. rasa/core/policies/intentless_policy.py +1031 -0
  328. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  329. rasa/core/policies/memoization.py +538 -0
  330. rasa/core/policies/policy.py +725 -0
  331. rasa/core/policies/rule_policy.py +1273 -0
  332. rasa/core/policies/ted_policy.py +2169 -0
  333. rasa/core/policies/unexpected_intent_policy.py +1022 -0
  334. rasa/core/processor.py +1465 -0
  335. rasa/core/run.py +342 -0
  336. rasa/core/secrets_manager/__init__.py +0 -0
  337. rasa/core/secrets_manager/constants.py +36 -0
  338. rasa/core/secrets_manager/endpoints.py +391 -0
  339. rasa/core/secrets_manager/factory.py +241 -0
  340. rasa/core/secrets_manager/secret_manager.py +262 -0
  341. rasa/core/secrets_manager/vault.py +584 -0
  342. rasa/core/test.py +1335 -0
  343. rasa/core/tracker_store.py +1703 -0
  344. rasa/core/train.py +105 -0
  345. rasa/core/training/__init__.py +89 -0
  346. rasa/core/training/converters/__init__.py +0 -0
  347. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  348. rasa/core/training/interactive.py +1744 -0
  349. rasa/core/training/story_conflict.py +381 -0
  350. rasa/core/training/training.py +93 -0
  351. rasa/core/utils.py +366 -0
  352. rasa/core/visualize.py +70 -0
  353. rasa/dialogue_understanding/__init__.py +0 -0
  354. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  355. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  356. rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
  357. rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
  358. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  359. rasa/dialogue_understanding/commands/__init__.py +61 -0
  360. rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
  361. rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
  362. rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
  363. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
  364. rasa/dialogue_understanding/commands/clarify_command.py +86 -0
  365. rasa/dialogue_understanding/commands/command.py +85 -0
  366. rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
  367. rasa/dialogue_understanding/commands/error_command.py +79 -0
  368. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  369. rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
  370. rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
  371. rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
  372. rasa/dialogue_understanding/commands/noop_command.py +54 -0
  373. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
  374. rasa/dialogue_understanding/commands/restart_command.py +58 -0
  375. rasa/dialogue_understanding/commands/session_end_command.py +61 -0
  376. rasa/dialogue_understanding/commands/session_start_command.py +59 -0
  377. rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
  378. rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
  379. rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
  380. rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
  381. rasa/dialogue_understanding/commands/utils.py +45 -0
  382. rasa/dialogue_understanding/generator/__init__.py +21 -0
  383. rasa/dialogue_understanding/generator/command_generator.py +464 -0
  384. rasa/dialogue_understanding/generator/constants.py +27 -0
  385. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  386. rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
  387. rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
  388. rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
  389. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  390. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  391. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  392. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
  393. rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
  394. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  395. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
  396. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
  397. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  398. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  399. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  400. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  401. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  402. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  403. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  404. rasa/dialogue_understanding/patterns/completed.py +40 -0
  405. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  406. rasa/dialogue_understanding/patterns/correction.py +278 -0
  407. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
  408. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  409. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  410. rasa/dialogue_understanding/patterns/repeat.py +37 -0
  411. rasa/dialogue_understanding/patterns/restart.py +37 -0
  412. rasa/dialogue_understanding/patterns/search.py +37 -0
  413. rasa/dialogue_understanding/patterns/session_start.py +37 -0
  414. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  415. rasa/dialogue_understanding/patterns/user_silence.py +37 -0
  416. rasa/dialogue_understanding/processor/__init__.py +0 -0
  417. rasa/dialogue_understanding/processor/command_processor.py +720 -0
  418. rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
  419. rasa/dialogue_understanding/stack/__init__.py +0 -0
  420. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  421. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  422. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  423. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  424. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  425. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  426. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  427. rasa/dialogue_understanding/stack/utils.py +211 -0
  428. rasa/dialogue_understanding/utils.py +14 -0
  429. rasa/dialogue_understanding_test/__init__.py +0 -0
  430. rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
  431. rasa/dialogue_understanding_test/constants.py +17 -0
  432. rasa/dialogue_understanding_test/du_test_case.py +118 -0
  433. rasa/dialogue_understanding_test/du_test_result.py +11 -0
  434. rasa/dialogue_understanding_test/du_test_runner.py +93 -0
  435. rasa/dialogue_understanding_test/io.py +54 -0
  436. rasa/dialogue_understanding_test/validation.py +22 -0
  437. rasa/e2e_test/__init__.py +0 -0
  438. rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
  439. rasa/e2e_test/assertions.py +1345 -0
  440. rasa/e2e_test/assertions_schema.yml +129 -0
  441. rasa/e2e_test/constants.py +31 -0
  442. rasa/e2e_test/e2e_config.py +220 -0
  443. rasa/e2e_test/e2e_config_schema.yml +26 -0
  444. rasa/e2e_test/e2e_test_case.py +569 -0
  445. rasa/e2e_test/e2e_test_converter.py +363 -0
  446. rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
  447. rasa/e2e_test/e2e_test_coverage_report.py +364 -0
  448. rasa/e2e_test/e2e_test_result.py +54 -0
  449. rasa/e2e_test/e2e_test_runner.py +1192 -0
  450. rasa/e2e_test/e2e_test_schema.yml +181 -0
  451. rasa/e2e_test/pykwalify_extensions.py +39 -0
  452. rasa/e2e_test/stub_custom_action.py +70 -0
  453. rasa/e2e_test/utils/__init__.py +0 -0
  454. rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
  455. rasa/e2e_test/utils/io.py +598 -0
  456. rasa/e2e_test/utils/validation.py +178 -0
  457. rasa/engine/__init__.py +0 -0
  458. rasa/engine/caching.py +463 -0
  459. rasa/engine/constants.py +17 -0
  460. rasa/engine/exceptions.py +14 -0
  461. rasa/engine/graph.py +642 -0
  462. rasa/engine/loader.py +48 -0
  463. rasa/engine/recipes/__init__.py +0 -0
  464. rasa/engine/recipes/config_files/default_config.yml +41 -0
  465. rasa/engine/recipes/default_components.py +97 -0
  466. rasa/engine/recipes/default_recipe.py +1272 -0
  467. rasa/engine/recipes/graph_recipe.py +79 -0
  468. rasa/engine/recipes/recipe.py +93 -0
  469. rasa/engine/runner/__init__.py +0 -0
  470. rasa/engine/runner/dask.py +250 -0
  471. rasa/engine/runner/interface.py +49 -0
  472. rasa/engine/storage/__init__.py +0 -0
  473. rasa/engine/storage/local_model_storage.py +244 -0
  474. rasa/engine/storage/resource.py +110 -0
  475. rasa/engine/storage/storage.py +199 -0
  476. rasa/engine/training/__init__.py +0 -0
  477. rasa/engine/training/components.py +176 -0
  478. rasa/engine/training/fingerprinting.py +64 -0
  479. rasa/engine/training/graph_trainer.py +256 -0
  480. rasa/engine/training/hooks.py +164 -0
  481. rasa/engine/validation.py +1451 -0
  482. rasa/env.py +14 -0
  483. rasa/exceptions.py +69 -0
  484. rasa/graph_components/__init__.py +0 -0
  485. rasa/graph_components/converters/__init__.py +0 -0
  486. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  487. rasa/graph_components/providers/__init__.py +0 -0
  488. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  489. rasa/graph_components/providers/domain_provider.py +71 -0
  490. rasa/graph_components/providers/flows_provider.py +74 -0
  491. rasa/graph_components/providers/forms_provider.py +44 -0
  492. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  493. rasa/graph_components/providers/responses_provider.py +44 -0
  494. rasa/graph_components/providers/rule_only_provider.py +49 -0
  495. rasa/graph_components/providers/story_graph_provider.py +96 -0
  496. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  497. rasa/graph_components/validators/__init__.py +0 -0
  498. rasa/graph_components/validators/default_recipe_validator.py +550 -0
  499. rasa/graph_components/validators/finetuning_validator.py +302 -0
  500. rasa/hooks.py +111 -0
  501. rasa/jupyter.py +63 -0
  502. rasa/llm_fine_tuning/__init__.py +0 -0
  503. rasa/llm_fine_tuning/annotation_module.py +241 -0
  504. rasa/llm_fine_tuning/conversations.py +144 -0
  505. rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
  506. rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
  507. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
  508. rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
  509. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
  510. rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
  511. rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
  512. rasa/llm_fine_tuning/storage.py +174 -0
  513. rasa/llm_fine_tuning/train_test_split_module.py +441 -0
  514. rasa/markers/__init__.py +0 -0
  515. rasa/markers/marker.py +269 -0
  516. rasa/markers/marker_base.py +828 -0
  517. rasa/markers/upload.py +74 -0
  518. rasa/markers/validate.py +21 -0
  519. rasa/model.py +118 -0
  520. rasa/model_manager/__init__.py +0 -0
  521. rasa/model_manager/config.py +40 -0
  522. rasa/model_manager/model_api.py +559 -0
  523. rasa/model_manager/runner_service.py +286 -0
  524. rasa/model_manager/socket_bridge.py +146 -0
  525. rasa/model_manager/studio_jwt_auth.py +86 -0
  526. rasa/model_manager/trainer_service.py +325 -0
  527. rasa/model_manager/utils.py +87 -0
  528. rasa/model_manager/warm_rasa_process.py +187 -0
  529. rasa/model_service.py +112 -0
  530. rasa/model_testing.py +457 -0
  531. rasa/model_training.py +596 -0
  532. rasa/nlu/__init__.py +7 -0
  533. rasa/nlu/classifiers/__init__.py +3 -0
  534. rasa/nlu/classifiers/classifier.py +5 -0
  535. rasa/nlu/classifiers/diet_classifier.py +1881 -0
  536. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  537. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  538. rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
  539. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  540. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  541. rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
  542. rasa/nlu/constants.py +77 -0
  543. rasa/nlu/convert.py +40 -0
  544. rasa/nlu/emulators/__init__.py +0 -0
  545. rasa/nlu/emulators/dialogflow.py +55 -0
  546. rasa/nlu/emulators/emulator.py +49 -0
  547. rasa/nlu/emulators/luis.py +86 -0
  548. rasa/nlu/emulators/no_emulator.py +10 -0
  549. rasa/nlu/emulators/wit.py +56 -0
  550. rasa/nlu/extractors/__init__.py +0 -0
  551. rasa/nlu/extractors/crf_entity_extractor.py +715 -0
  552. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  553. rasa/nlu/extractors/entity_synonyms.py +178 -0
  554. rasa/nlu/extractors/extractor.py +470 -0
  555. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  556. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  557. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  558. rasa/nlu/featurizers/__init__.py +0 -0
  559. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  560. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
  561. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  562. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
  563. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  564. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  565. rasa/nlu/featurizers/featurizer.py +89 -0
  566. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  567. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
  568. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
  569. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
  570. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  571. rasa/nlu/model.py +24 -0
  572. rasa/nlu/run.py +27 -0
  573. rasa/nlu/selectors/__init__.py +0 -0
  574. rasa/nlu/selectors/response_selector.py +987 -0
  575. rasa/nlu/test.py +1940 -0
  576. rasa/nlu/tokenizers/__init__.py +0 -0
  577. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  578. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  579. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  580. rasa/nlu/tokenizers/tokenizer.py +239 -0
  581. rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
  582. rasa/nlu/utils/__init__.py +35 -0
  583. rasa/nlu/utils/bilou_utils.py +462 -0
  584. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  585. rasa/nlu/utils/hugging_face/registry.py +108 -0
  586. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  587. rasa/nlu/utils/mitie_utils.py +113 -0
  588. rasa/nlu/utils/pattern_utils.py +168 -0
  589. rasa/nlu/utils/spacy_utils.py +310 -0
  590. rasa/plugin.py +90 -0
  591. rasa/server.py +1588 -0
  592. rasa/shared/__init__.py +0 -0
  593. rasa/shared/constants.py +311 -0
  594. rasa/shared/core/__init__.py +0 -0
  595. rasa/shared/core/command_payload_reader.py +109 -0
  596. rasa/shared/core/constants.py +180 -0
  597. rasa/shared/core/conversation.py +46 -0
  598. rasa/shared/core/domain.py +2172 -0
  599. rasa/shared/core/events.py +2559 -0
  600. rasa/shared/core/flows/__init__.py +7 -0
  601. rasa/shared/core/flows/flow.py +562 -0
  602. rasa/shared/core/flows/flow_path.py +84 -0
  603. rasa/shared/core/flows/flow_step.py +146 -0
  604. rasa/shared/core/flows/flow_step_links.py +319 -0
  605. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  606. rasa/shared/core/flows/flows_list.py +258 -0
  607. rasa/shared/core/flows/flows_yaml_schema.json +303 -0
  608. rasa/shared/core/flows/nlu_trigger.py +117 -0
  609. rasa/shared/core/flows/steps/__init__.py +24 -0
  610. rasa/shared/core/flows/steps/action.py +56 -0
  611. rasa/shared/core/flows/steps/call.py +64 -0
  612. rasa/shared/core/flows/steps/collect.py +112 -0
  613. rasa/shared/core/flows/steps/constants.py +5 -0
  614. rasa/shared/core/flows/steps/continuation.py +36 -0
  615. rasa/shared/core/flows/steps/end.py +22 -0
  616. rasa/shared/core/flows/steps/internal.py +44 -0
  617. rasa/shared/core/flows/steps/link.py +51 -0
  618. rasa/shared/core/flows/steps/no_operation.py +48 -0
  619. rasa/shared/core/flows/steps/set_slots.py +50 -0
  620. rasa/shared/core/flows/steps/start.py +30 -0
  621. rasa/shared/core/flows/utils.py +39 -0
  622. rasa/shared/core/flows/validation.py +735 -0
  623. rasa/shared/core/flows/yaml_flows_io.py +405 -0
  624. rasa/shared/core/generator.py +908 -0
  625. rasa/shared/core/slot_mappings.py +526 -0
  626. rasa/shared/core/slots.py +654 -0
  627. rasa/shared/core/trackers.py +1183 -0
  628. rasa/shared/core/training_data/__init__.py +0 -0
  629. rasa/shared/core/training_data/loading.py +89 -0
  630. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  631. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  632. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  633. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  634. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  635. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  636. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
  637. rasa/shared/core/training_data/structures.py +858 -0
  638. rasa/shared/core/training_data/visualization.html +146 -0
  639. rasa/shared/core/training_data/visualization.py +603 -0
  640. rasa/shared/data.py +249 -0
  641. rasa/shared/engine/__init__.py +0 -0
  642. rasa/shared/engine/caching.py +26 -0
  643. rasa/shared/exceptions.py +167 -0
  644. rasa/shared/importers/__init__.py +0 -0
  645. rasa/shared/importers/importer.py +770 -0
  646. rasa/shared/importers/multi_project.py +215 -0
  647. rasa/shared/importers/rasa.py +108 -0
  648. rasa/shared/importers/remote_importer.py +196 -0
  649. rasa/shared/importers/utils.py +36 -0
  650. rasa/shared/nlu/__init__.py +0 -0
  651. rasa/shared/nlu/constants.py +53 -0
  652. rasa/shared/nlu/interpreter.py +10 -0
  653. rasa/shared/nlu/training_data/__init__.py +0 -0
  654. rasa/shared/nlu/training_data/entities_parser.py +208 -0
  655. rasa/shared/nlu/training_data/features.py +492 -0
  656. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  657. rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
  658. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  659. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  660. rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
  661. rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
  662. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  663. rasa/shared/nlu/training_data/loading.py +137 -0
  664. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  665. rasa/shared/nlu/training_data/message.py +490 -0
  666. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  667. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  668. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  669. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  670. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  671. rasa/shared/nlu/training_data/training_data.py +729 -0
  672. rasa/shared/nlu/training_data/util.py +223 -0
  673. rasa/shared/providers/__init__.py +0 -0
  674. rasa/shared/providers/_configs/__init__.py +0 -0
  675. rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
  676. rasa/shared/providers/_configs/client_config.py +59 -0
  677. rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
  678. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
  679. rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
  680. rasa/shared/providers/_configs/model_group_config.py +173 -0
  681. rasa/shared/providers/_configs/openai_client_config.py +177 -0
  682. rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
  683. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
  684. rasa/shared/providers/_configs/utils.py +117 -0
  685. rasa/shared/providers/_ssl_verification_utils.py +124 -0
  686. rasa/shared/providers/_utils.py +79 -0
  687. rasa/shared/providers/constants.py +7 -0
  688. rasa/shared/providers/embedding/__init__.py +0 -0
  689. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
  690. rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
  691. rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
  692. rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
  693. rasa/shared/providers/embedding/embedding_client.py +90 -0
  694. rasa/shared/providers/embedding/embedding_response.py +41 -0
  695. rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
  696. rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
  697. rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
  698. rasa/shared/providers/llm/__init__.py +0 -0
  699. rasa/shared/providers/llm/_base_litellm_client.py +265 -0
  700. rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
  701. rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
  702. rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
  703. rasa/shared/providers/llm/llm_client.py +78 -0
  704. rasa/shared/providers/llm/llm_response.py +50 -0
  705. rasa/shared/providers/llm/openai_llm_client.py +161 -0
  706. rasa/shared/providers/llm/rasa_llm_client.py +120 -0
  707. rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
  708. rasa/shared/providers/mappings.py +94 -0
  709. rasa/shared/providers/router/__init__.py +0 -0
  710. rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
  711. rasa/shared/providers/router/router_client.py +75 -0
  712. rasa/shared/utils/__init__.py +0 -0
  713. rasa/shared/utils/cli.py +102 -0
  714. rasa/shared/utils/common.py +324 -0
  715. rasa/shared/utils/constants.py +4 -0
  716. rasa/shared/utils/health_check/__init__.py +0 -0
  717. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
  718. rasa/shared/utils/health_check/health_check.py +258 -0
  719. rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
  720. rasa/shared/utils/io.py +499 -0
  721. rasa/shared/utils/llm.py +764 -0
  722. rasa/shared/utils/pykwalify_extensions.py +27 -0
  723. rasa/shared/utils/schemas/__init__.py +0 -0
  724. rasa/shared/utils/schemas/config.yml +2 -0
  725. rasa/shared/utils/schemas/domain.yml +145 -0
  726. rasa/shared/utils/schemas/events.py +214 -0
  727. rasa/shared/utils/schemas/model_config.yml +36 -0
  728. rasa/shared/utils/schemas/stories.yml +173 -0
  729. rasa/shared/utils/yaml.py +1068 -0
  730. rasa/studio/__init__.py +0 -0
  731. rasa/studio/auth.py +270 -0
  732. rasa/studio/config.py +136 -0
  733. rasa/studio/constants.py +19 -0
  734. rasa/studio/data_handler.py +368 -0
  735. rasa/studio/download.py +489 -0
  736. rasa/studio/results_logger.py +137 -0
  737. rasa/studio/train.py +134 -0
  738. rasa/studio/upload.py +563 -0
  739. rasa/telemetry.py +1876 -0
  740. rasa/tracing/__init__.py +0 -0
  741. rasa/tracing/config.py +355 -0
  742. rasa/tracing/constants.py +62 -0
  743. rasa/tracing/instrumentation/__init__.py +0 -0
  744. rasa/tracing/instrumentation/attribute_extractors.py +765 -0
  745. rasa/tracing/instrumentation/instrumentation.py +1306 -0
  746. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
  747. rasa/tracing/instrumentation/metrics.py +294 -0
  748. rasa/tracing/metric_instrument_provider.py +205 -0
  749. rasa/utils/__init__.py +0 -0
  750. rasa/utils/beta.py +83 -0
  751. rasa/utils/cli.py +28 -0
  752. rasa/utils/common.py +639 -0
  753. rasa/utils/converter.py +53 -0
  754. rasa/utils/endpoints.py +331 -0
  755. rasa/utils/io.py +252 -0
  756. rasa/utils/json_utils.py +60 -0
  757. rasa/utils/licensing.py +542 -0
  758. rasa/utils/log_utils.py +181 -0
  759. rasa/utils/mapper.py +210 -0
  760. rasa/utils/ml_utils.py +147 -0
  761. rasa/utils/plotting.py +362 -0
  762. rasa/utils/sanic_error_handler.py +32 -0
  763. rasa/utils/singleton.py +23 -0
  764. rasa/utils/tensorflow/__init__.py +0 -0
  765. rasa/utils/tensorflow/callback.py +112 -0
  766. rasa/utils/tensorflow/constants.py +116 -0
  767. rasa/utils/tensorflow/crf.py +492 -0
  768. rasa/utils/tensorflow/data_generator.py +440 -0
  769. rasa/utils/tensorflow/environment.py +161 -0
  770. rasa/utils/tensorflow/exceptions.py +5 -0
  771. rasa/utils/tensorflow/feature_array.py +366 -0
  772. rasa/utils/tensorflow/layers.py +1565 -0
  773. rasa/utils/tensorflow/layers_utils.py +113 -0
  774. rasa/utils/tensorflow/metrics.py +281 -0
  775. rasa/utils/tensorflow/model_data.py +798 -0
  776. rasa/utils/tensorflow/model_data_utils.py +499 -0
  777. rasa/utils/tensorflow/models.py +935 -0
  778. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  779. rasa/utils/tensorflow/transformer.py +640 -0
  780. rasa/utils/tensorflow/types.py +6 -0
  781. rasa/utils/train_utils.py +572 -0
  782. rasa/utils/url_tools.py +53 -0
  783. rasa/utils/yaml.py +54 -0
  784. rasa/validator.py +1644 -0
  785. rasa/version.py +3 -0
  786. rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
  787. rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
  788. rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
  789. rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
  790. rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,1306 @@
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
+ Text,
17
+ Type,
18
+ TypeVar,
19
+ )
20
+
21
+ from multidict import MultiDict
22
+ from opentelemetry.context import Context
23
+ from opentelemetry.sdk.trace import TracerProvider
24
+ from opentelemetry.trace import SpanKind, Tracer
25
+ from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
26
+
27
+ from rasa.core.actions.action import Action, RemoteAction, CustomActionExecutor
28
+ from rasa.core.actions.custom_action_executor import RetryCustomActionExecutor
29
+ from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
30
+ from rasa.core.agent import Agent
31
+ from rasa.core.channels import OutputChannel
32
+ from rasa.core.information_retrieval.information_retrieval import (
33
+ InformationRetrieval,
34
+ SearchResultList,
35
+ )
36
+ from rasa.core.lock_store import LockStore
37
+ from rasa.core.nlg import NaturalLanguageGenerator
38
+ from rasa.core.policies.flows.flow_step_result import FlowActionPrediction
39
+ from rasa.core.policies.policy import Policy, PolicyPrediction
40
+ from rasa.core.processor import MessageProcessor
41
+ from rasa.core.tracker_store import TrackerStore
42
+ from rasa.dialogue_understanding.commands import Command
43
+ from rasa.dialogue_understanding.generator import (
44
+ LLMCommandGenerator,
45
+ MultiStepLLMCommandGenerator,
46
+ SingleStepLLMCommandGenerator,
47
+ )
48
+ from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
49
+ from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
50
+ from rasa.engine.graph import GraphNode
51
+ from rasa.engine.training.graph_trainer import GraphTrainer
52
+ from rasa.shared.core.domain import Domain
53
+ from rasa.shared.core.flows import FlowsList
54
+ from rasa.shared.core.trackers import DialogueStateTracker
55
+ from rasa.shared.nlu.constants import SET_SLOT_COMMAND
56
+ from rasa.shared.nlu.training_data.message import Message
57
+ from rasa.tracing.constants import REQUEST_BODY_SIZE_IN_BYTES_ATTRIBUTE_NAME
58
+ from rasa.tracing.instrumentation import attribute_extractors
59
+ from rasa.tracing.instrumentation.intentless_policy_instrumentation import (
60
+ _instrument_extract_ai_responses,
61
+ _instrument_generate_answer,
62
+ _instrument_select_few_shot_conversations,
63
+ _instrument_select_response_examples,
64
+ )
65
+ from rasa.tracing.instrumentation.metrics import (
66
+ record_llm_command_generator_metrics,
67
+ record_single_step_llm_command_generator_metrics,
68
+ record_multi_step_llm_command_generator_metrics,
69
+ record_callable_duration_metrics,
70
+ record_request_size_in_bytes,
71
+ )
72
+ from rasa.utils.endpoints import concat_url, EndpointConfig
73
+
74
+ # The `TypeVar` representing the return type for a function to be wrapped.
75
+ S = TypeVar("S")
76
+ # The `TypeVar` representing the type of the argument passed to the function to be
77
+ # wrapped.
78
+ T = TypeVar("T")
79
+
80
+ logger = logging.getLogger(__name__)
81
+ INSTRUMENTED_BOOLEAN_ATTRIBUTE_NAME = "class_has_been_instrumented"
82
+ INSTRUMENTED_MODULE_BOOLEAN_ATTRIBUTE_NAME = "module_has_been_instrumented"
83
+ COMMAND_PROCESSOR_MODULE_NAME = (
84
+ "rasa.dialogue_understanding.processor.command_processor"
85
+ )
86
+ FLOW_EXECUTOR_MODULE_NAME = "rasa.core.policies.flows.flow_executor"
87
+
88
+
89
+ def _check_extractor_argument_list(
90
+ fn: Callable[[T, Any, Any], S],
91
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
92
+ ) -> bool:
93
+ if attr_extractor is None:
94
+ return False
95
+
96
+ fn_args = inspect.signature(fn)
97
+ attr_args = inspect.signature(attr_extractor)
98
+
99
+ are_arglists_congruent = fn_args.parameters.keys() == attr_args.parameters.keys()
100
+
101
+ if not are_arglists_congruent:
102
+ logger.warning(
103
+ f"Argument lists for {fn.__name__} and {attr_extractor.__name__}"
104
+ f" do not match up. {fn.__name__} will be traced without attributes."
105
+ )
106
+
107
+ return are_arglists_congruent
108
+
109
+
110
+ def extract_tracing_context_from_headers(
111
+ headers: Dict[str, Any],
112
+ ) -> Optional[Context]:
113
+ """Extracts the tracing context from the headers."""
114
+ tracing_carrier = MultiDict(
115
+ [
116
+ (key, value)
117
+ for key, value in headers.items()
118
+ if key.lower() not in ("content-length", "content-encoding")
119
+ ]
120
+ )
121
+ context = (
122
+ TraceContextTextMapPropagator().extract(headers) if tracing_carrier else None
123
+ )
124
+
125
+ return context
126
+
127
+
128
+ def traceable(
129
+ fn: Callable[[T, Any, Any], S],
130
+ tracer: Tracer,
131
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
132
+ metrics_recorder: Optional[Callable],
133
+ ) -> Callable[[T, Any, Any], S]:
134
+ """Wrap a non-`async` function by tracing functionality.
135
+
136
+ :param fn: The function to be wrapped.
137
+ :param tracer: The `Tracer` that shall be used for tracing this function.
138
+ :param attr_extractor: A function that is applied to the function's instance and
139
+ the function's arguments.
140
+ :param metrics_recorder: A function that records metric measurements.
141
+ :return: The wrapped function.
142
+ """
143
+ should_extract_args = _check_extractor_argument_list(fn, attr_extractor)
144
+
145
+ @functools.wraps(fn)
146
+ def wrapper(self: T, *args: Any, **kwargs: Any) -> S:
147
+ attrs = (
148
+ attr_extractor(self, *args, **kwargs)
149
+ if attr_extractor and should_extract_args
150
+ else {}
151
+ )
152
+
153
+ module_name = attrs.pop("module_name", "")
154
+ if module_name in ["command_processor", FLOW_EXECUTOR_MODULE_NAME]:
155
+ span_name = f"{module_name}.{fn.__name__}"
156
+ else:
157
+ span_name = f"{self.__class__.__name__}.{fn.__name__}"
158
+ with tracer.start_as_current_span(span_name, attributes=attrs):
159
+ start_time = time.perf_counter_ns()
160
+
161
+ result = fn(self, *args, **kwargs)
162
+
163
+ end_time = time.perf_counter_ns()
164
+ record_callable_duration_metrics(self, start_time, end_time)
165
+
166
+ if metrics_recorder:
167
+ metrics_recorder(attrs)
168
+
169
+ return result
170
+
171
+ return wrapper
172
+
173
+
174
+ def traceable_async(
175
+ fn: Callable[[T, Any, Any], Awaitable[S]],
176
+ tracer: Tracer,
177
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
178
+ header_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
179
+ metrics_recorder: Optional[Callable],
180
+ ) -> Callable[[T, Any, Any], Awaitable[S]]:
181
+ """Wrap an `async` function by tracing functionality.
182
+
183
+ :param fn: The function to be wrapped.
184
+ :param tracer: The `Tracer` that shall be used for tracing this function.
185
+ :param attr_extractor: A function that is applied to the function's instance and
186
+ the function's arguments.
187
+ :param header_extractor: A function that is applied to the function's arguments
188
+ :param metrics_recorder: A function that records metric measurements.
189
+ :return: The wrapped function.
190
+ """
191
+ should_extract_args = _check_extractor_argument_list(fn, attr_extractor)
192
+
193
+ @functools.wraps(fn)
194
+ async def async_wrapper(self: T, *args: Any, **kwargs: Any) -> S:
195
+ attrs = (
196
+ attr_extractor(self, *args, **kwargs)
197
+ if attr_extractor and should_extract_args
198
+ else {}
199
+ )
200
+ headers = header_extractor(*args, **kwargs) if header_extractor else {}
201
+ context = extract_tracing_context_from_headers(headers)
202
+
203
+ if issubclass(self.__class__, GraphNode) and fn.__name__ == "__call__":
204
+ span_name = f"{self.__class__.__name__}." + attrs.get(
205
+ "component_class", "GraphNode"
206
+ )
207
+ else:
208
+ span_name = f"{self.__class__.__name__}.{fn.__name__}"
209
+
210
+ with tracer.start_as_current_span(
211
+ span_name,
212
+ attributes=attrs,
213
+ context=context,
214
+ ) as span:
215
+ TraceContextTextMapPropagator().inject(headers)
216
+
217
+ ctx = span.get_span_context()
218
+ logger.debug(
219
+ f"The trace id for the current span '{span_name}' is '{ctx.trace_id}'."
220
+ )
221
+
222
+ start_time = time.perf_counter_ns()
223
+
224
+ result = await fn(self, *args, **kwargs)
225
+
226
+ end_time = time.perf_counter_ns()
227
+ record_callable_duration_metrics(self, start_time, end_time, **attrs)
228
+
229
+ if metrics_recorder:
230
+ metrics_recorder(attrs)
231
+
232
+ return result
233
+
234
+ return async_wrapper
235
+
236
+
237
+ def traceable_async_generator(
238
+ fn: Callable[[T, Any, Any], AsyncIterator[S]],
239
+ tracer: Tracer,
240
+ attr_extractor: Optional[Callable[[T, Any, Any], Dict[str, Any]]],
241
+ ) -> Callable[[T, Any, Any], AsyncIterator[AsyncIterator[S]]]:
242
+ """Wrap an `async` function that `yield`s by tracing functionality.
243
+
244
+ :param fn: The function to be wrapped.
245
+ :param tracer: The `Tracer` that shall be used for tracing this function.
246
+ :param attr_extractor: A function that is applied to the function's instance and
247
+ the function's arguments.
248
+ :return: The wrapped function.
249
+ """
250
+ should_extract_args = _check_extractor_argument_list(fn, attr_extractor)
251
+
252
+ @functools.wraps(fn)
253
+ async def async_wrapper(
254
+ self: T, *args: Any, **kwargs: Any
255
+ ) -> AsyncIterator[AsyncIterator[S]]:
256
+ attrs = (
257
+ attr_extractor(self, *args, **kwargs)
258
+ if attr_extractor and should_extract_args
259
+ else {}
260
+ )
261
+ with tracer.start_as_current_span(
262
+ f"{self.__class__.__name__}.{fn.__name__}", attributes=attrs
263
+ ):
264
+ yield fn(self, *args, **kwargs)
265
+
266
+ return async_wrapper
267
+
268
+
269
+ # This `TypeVar` restricts the agent_class to be instrumented to subclasses of `Agent`.
270
+ AgentType = TypeVar("AgentType", bound=Agent)
271
+ # This `TypeVar` restricts the processor_class to be instrumented to subclasses of
272
+ # `MessageProcessor`.
273
+ ProcessorType = TypeVar("ProcessorType", bound=MessageProcessor)
274
+ TrackerStoreType = TypeVar("TrackerStoreType", bound=TrackerStore)
275
+ GraphNodeType = TypeVar("GraphNodeType", bound=GraphNode)
276
+ # This `TypeVar` restricts the lock_store_class to be instrumented to subclasses of
277
+ # `LockStore`.
278
+ LockStoreType = TypeVar("LockStoreType", bound=LockStore)
279
+ GraphTrainerType = TypeVar("GraphTrainerType", bound=GraphTrainer)
280
+ LLMCommandGeneratorType = TypeVar("LLMCommandGeneratorType", bound=LLMCommandGenerator)
281
+ SingleStepLLMCommandGeneratorType = TypeVar(
282
+ "SingleStepLLMCommandGeneratorType", bound=SingleStepLLMCommandGenerator
283
+ )
284
+ MultiStepLLMCommandGeneratorType = TypeVar(
285
+ "MultiStepLLMCommandGeneratorType", bound=MultiStepLLMCommandGenerator
286
+ )
287
+ FlowRetrievalType = TypeVar("FlowRetrievalType", bound=FlowRetrieval)
288
+ CommandType = TypeVar("CommandType", bound=Command)
289
+ PolicyType = TypeVar("PolicyType", bound=Policy)
290
+ InformationRetrievalType = TypeVar(
291
+ "InformationRetrievalType", bound=InformationRetrieval
292
+ )
293
+ NLUCommandAdapterType = TypeVar("NLUCommandAdapterType", bound=NLUCommandAdapter)
294
+ EndpointConfigType = TypeVar("EndpointConfigType", bound=EndpointConfig)
295
+
296
+
297
+ def instrument(
298
+ tracer_provider: TracerProvider,
299
+ agent_class: Optional[Type[AgentType]] = None,
300
+ processor_class: Optional[Type[ProcessorType]] = None,
301
+ tracker_store_class: Optional[Type[TrackerStoreType]] = None,
302
+ graph_node_class: Optional[Type[GraphNodeType]] = None,
303
+ lock_store_class: Optional[Type[LockStoreType]] = None,
304
+ graph_trainer_class: Optional[Type[GraphTrainerType]] = None,
305
+ llm_command_generator_class: Optional[Type[LLMCommandGeneratorType]] = None,
306
+ command_subclasses: Optional[List[Type[CommandType]]] = None,
307
+ contextual_response_rephraser_class: Optional[Any] = None,
308
+ policy_subclasses: Optional[List[Type[PolicyType]]] = None,
309
+ vector_store_subclasses: Optional[List[Type[InformationRetrievalType]]] = None,
310
+ nlu_command_adapter_class: Optional[Type[NLUCommandAdapterType]] = None,
311
+ endpoint_config_class: Optional[Type[EndpointConfigType]] = None,
312
+ grpc_custom_action_executor_class: Optional[Type[GRPCCustomActionExecutor]] = None,
313
+ single_step_llm_command_generator_class: Optional[
314
+ Type[SingleStepLLMCommandGeneratorType]
315
+ ] = None,
316
+ multi_step_llm_command_generator_class: Optional[
317
+ Type[MultiStepLLMCommandGeneratorType]
318
+ ] = None,
319
+ custom_action_executor_subclasses: Optional[
320
+ List[Type[CustomActionExecutor]]
321
+ ] = None,
322
+ flow_retrieval_class: Optional[Type[FlowRetrievalType]] = None,
323
+ ) -> None:
324
+ """Substitute methods to be traced by their traced counterparts.
325
+
326
+ Because of type bounds on `AgentType` and `ProcessorType`,
327
+ we ensure that only subtypes of `Agent`
328
+ and `MessageProcessor` can be instrumented, respectively.
329
+
330
+ :param tracer_provider: The `TracerProvider` to be used for configuring tracing
331
+ on the substituted methods.
332
+ :param agent_class: The `Agent` to be instrumented. If `None` is given, no `Agent`
333
+ will be instrumented.
334
+ :param processor_class: The `MessageProcessor` to be instrumented. If `None` is
335
+ given, no `MessageProcessor` will be instrumented.
336
+ :param tracker_store_class: The `TrackerStore` to be instrumented. If `None` is
337
+ given, no `TrackerStore` will be instrumented.
338
+ :param graph_node_class: The `GraphNode` to be instrumented. If `None` is
339
+ given, no `GraphNode` will be instrumented.
340
+ :param lock_store_class: The `LockStore` to be instrumented. If `None` is
341
+ given, no `LockStore` will be instrumented.
342
+ :param graph_trainer_class: The `GraphTrainer` to be instrumented. If `None` is
343
+ given, no `GraphTrainer` will be instrumented.
344
+ :param llm_command_generator_class: The `LLMCommandGenerator` to be instrumented.
345
+ If `None` is given, no `LLMCommandGenerator` will be instrumented.
346
+ :param command_subclasses: The subclasses of `Command` to be instrumented. If `None`
347
+ is given, no subclass of `Command` will be instrumented.
348
+ :param contextual_response_rephraser_class: The `ContextualResponseRephraser` to
349
+ be instrumented. If `None` is given, no `ContextualResponseRephraser` will be
350
+ instrumented.
351
+ :param policy_subclasses: The subclasses of `Policy` to be instrumented. If `None`
352
+ is given, no subclass of `Policy` will be instrumented.
353
+ :param vector_store_subclasses: The subclasses of `InformationRetrieval` to be
354
+ instrumented. If `None` is given, no subclass of `InformationRetrieval` will be
355
+ instrumented.
356
+ :param nlu_command_adapter_class: The `NLUCommandAdapter` to be instrumented. If
357
+ `None` is given, no `NLUCommandAdapter` will be instrumented.
358
+ :param endpoint_config_class: The `EndpointConfig` to be instrumented. If
359
+ `None` is given, no `EndpointConfig` will be instrumented.
360
+ :param grpc_custom_action_executor_class: The `GRPCCustomActionExecution` to be
361
+ instrumented. If `None` is given, no `GRPCCustomActionExecution`
362
+ will be instrumented.
363
+ :param single_step_llm_command_generator_class: The `SingleStepLLMCommandGenerator`
364
+ to be instrumented. If `None` is given, no `SingleStepLLMCommandGenerator` will
365
+ be instrumented.
366
+ :param multi_step_llm_command_generator_class: The `MultiStepLLMCommandGenerator`
367
+ to be instrumented. If `None` is given, no `MultiStepLLMCommandGenerator` will
368
+ be instrumented.
369
+ :param custom_action_executor_subclasses: The subclasses of `CustomActionExecutor`
370
+ to be instrumented. If `None` is given, no subclass of `CustomActionExecutor`
371
+ will be instrumented.
372
+ """
373
+ if agent_class is not None and not class_is_instrumented(agent_class):
374
+ _instrument_method(
375
+ tracer_provider.get_tracer(agent_class.__module__),
376
+ agent_class,
377
+ "handle_message",
378
+ attribute_extractors.extract_attrs_for_agent,
379
+ attribute_extractors.extract_headers,
380
+ )
381
+ mark_class_as_instrumented(agent_class)
382
+
383
+ if processor_class is not None and not class_is_instrumented(processor_class):
384
+ _instrument_processor(tracer_provider, processor_class)
385
+ mark_class_as_instrumented(processor_class)
386
+
387
+ if tracker_store_class is not None and not class_is_instrumented(
388
+ tracker_store_class
389
+ ):
390
+ _instrument_method(
391
+ tracer_provider.get_tracer(tracker_store_class.__module__),
392
+ tracker_store_class,
393
+ "_stream_new_events",
394
+ attribute_extractors.extract_attrs_for_tracker_store,
395
+ )
396
+ mark_class_as_instrumented(tracker_store_class)
397
+
398
+ if graph_node_class is not None and not class_is_instrumented(graph_node_class):
399
+ _instrument_method(
400
+ tracer_provider.get_tracer(graph_node_class.__module__),
401
+ graph_node_class,
402
+ "__call__",
403
+ attribute_extractors.extract_attrs_for_graph_node,
404
+ )
405
+ mark_class_as_instrumented(graph_node_class)
406
+
407
+ if lock_store_class is not None and not class_is_instrumented(lock_store_class):
408
+ # Not so straightforward: to wrap a function that is decorated as a
409
+ # `@asynccontextmanager`, we need to first unwrap the original function, then
410
+ # wrap that with the tracing functionality, and re-decorate as an
411
+ # `@asynccontextmanager`.
412
+ lock_method = inspect.unwrap(lock_store_class.lock)
413
+ traced_lock_method = traceable_async_generator(
414
+ lock_method,
415
+ tracer_provider.get_tracer(lock_store_class.__module__),
416
+ attribute_extractors.extract_attrs_for_lock_store,
417
+ )
418
+ lock_store_class.lock = contextlib.asynccontextmanager(traced_lock_method) # type: ignore[assignment]
419
+
420
+ logger.debug(f"Instrumented '{lock_store_class.__name__}.lock'.")
421
+
422
+ mark_class_as_instrumented(lock_store_class)
423
+
424
+ if graph_trainer_class is not None and not class_is_instrumented(
425
+ graph_trainer_class
426
+ ):
427
+ _instrument_method(
428
+ tracer_provider.get_tracer(graph_trainer_class.__module__),
429
+ graph_trainer_class,
430
+ "train",
431
+ attribute_extractors.extract_attrs_for_graph_trainer,
432
+ )
433
+ mark_class_as_instrumented(graph_trainer_class)
434
+
435
+ if llm_command_generator_class is not None and not class_is_instrumented(
436
+ llm_command_generator_class
437
+ ):
438
+ _instrument_method(
439
+ tracer_provider.get_tracer(llm_command_generator_class.__module__),
440
+ llm_command_generator_class,
441
+ "invoke_llm",
442
+ attribute_extractors.extract_attrs_for_llm_based_command_generator,
443
+ metrics_recorder=record_llm_command_generator_metrics,
444
+ )
445
+ _instrument_method(
446
+ tracer_provider.get_tracer(llm_command_generator_class.__module__),
447
+ llm_command_generator_class,
448
+ "_check_commands_against_startable_flows",
449
+ attribute_extractors.extract_attrs_for_check_commands_against_startable_flows,
450
+ )
451
+ _instrument_perform_health_check_method_for_component(
452
+ tracer_provider.get_tracer(llm_command_generator_class.__module__),
453
+ llm_command_generator_class,
454
+ "perform_llm_health_check",
455
+ attribute_extractors.extract_attrs_for_performing_health_check,
456
+ )
457
+ mark_class_as_instrumented(llm_command_generator_class)
458
+
459
+ if (
460
+ single_step_llm_command_generator_class is not None
461
+ and not class_is_instrumented(single_step_llm_command_generator_class)
462
+ ):
463
+ _instrument_method(
464
+ tracer_provider.get_tracer(
465
+ single_step_llm_command_generator_class.__module__
466
+ ),
467
+ single_step_llm_command_generator_class,
468
+ "invoke_llm",
469
+ attribute_extractors.extract_attrs_for_llm_based_command_generator,
470
+ metrics_recorder=record_single_step_llm_command_generator_metrics,
471
+ )
472
+ _instrument_method(
473
+ tracer_provider.get_tracer(
474
+ single_step_llm_command_generator_class.__module__
475
+ ),
476
+ single_step_llm_command_generator_class,
477
+ "_check_commands_against_startable_flows",
478
+ attribute_extractors.extract_attrs_for_check_commands_against_startable_flows,
479
+ )
480
+ _instrument_perform_health_check_method_for_component(
481
+ tracer_provider.get_tracer(
482
+ single_step_llm_command_generator_class.__module__
483
+ ),
484
+ single_step_llm_command_generator_class,
485
+ "perform_llm_health_check",
486
+ attribute_extractors.extract_attrs_for_performing_health_check,
487
+ )
488
+ mark_class_as_instrumented(single_step_llm_command_generator_class)
489
+
490
+ if multi_step_llm_command_generator_class is not None and not class_is_instrumented(
491
+ multi_step_llm_command_generator_class
492
+ ):
493
+ _instrument_method(
494
+ tracer_provider.get_tracer(
495
+ multi_step_llm_command_generator_class.__module__
496
+ ),
497
+ multi_step_llm_command_generator_class,
498
+ "invoke_llm",
499
+ attribute_extractors.extract_attrs_for_llm_based_command_generator,
500
+ metrics_recorder=record_multi_step_llm_command_generator_metrics,
501
+ )
502
+ _instrument_multi_step_llm_command_generator_parse_commands(
503
+ tracer_provider.get_tracer(
504
+ multi_step_llm_command_generator_class.__module__
505
+ ),
506
+ multi_step_llm_command_generator_class,
507
+ )
508
+ _instrument_perform_health_check_method_for_component(
509
+ tracer_provider.get_tracer(
510
+ multi_step_llm_command_generator_class.__module__
511
+ ),
512
+ multi_step_llm_command_generator_class,
513
+ "perform_llm_health_check",
514
+ attribute_extractors.extract_attrs_for_performing_health_check,
515
+ )
516
+ mark_class_as_instrumented(multi_step_llm_command_generator_class)
517
+
518
+ if (
519
+ any(
520
+ llm_based_command_generator_class is not None
521
+ for llm_based_command_generator_class in (
522
+ llm_command_generator_class,
523
+ single_step_llm_command_generator_class,
524
+ multi_step_llm_command_generator_class,
525
+ )
526
+ )
527
+ and flow_retrieval_class is not None
528
+ and not class_is_instrumented(flow_retrieval_class)
529
+ ):
530
+ _instrument_perform_health_check_method_for_component(
531
+ tracer_provider.get_tracer(flow_retrieval_class.__module__),
532
+ flow_retrieval_class,
533
+ "perform_embeddings_health_check",
534
+ attribute_extractors.extract_attrs_for_performing_health_check,
535
+ )
536
+ mark_class_as_instrumented(flow_retrieval_class)
537
+
538
+ if command_subclasses:
539
+ for command_subclass in command_subclasses:
540
+ if command_subclass is not None and not class_is_instrumented(
541
+ command_subclass
542
+ ):
543
+ _instrument_method(
544
+ tracer_provider.get_tracer(command_subclass.__module__),
545
+ command_subclass,
546
+ "run_command_on_tracker",
547
+ attribute_extractors.extract_attrs_for_command,
548
+ )
549
+ mark_class_as_instrumented(command_subclass)
550
+
551
+ if contextual_response_rephraser_class is not None and not class_is_instrumented(
552
+ contextual_response_rephraser_class
553
+ ):
554
+ _instrument_method(
555
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
556
+ contextual_response_rephraser_class,
557
+ "_generate_llm_response",
558
+ attribute_extractors.extract_attrs_for_contextual_response_rephraser,
559
+ )
560
+ _instrument_method(
561
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
562
+ contextual_response_rephraser_class,
563
+ "_create_history",
564
+ attribute_extractors.extract_attrs_for_create_history,
565
+ )
566
+ _instrument_method(
567
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
568
+ contextual_response_rephraser_class,
569
+ "generate",
570
+ attribute_extractors.extract_attrs_for_generate,
571
+ )
572
+ _instrument_perform_health_check_method_for_component(
573
+ tracer_provider.get_tracer(contextual_response_rephraser_class.__module__),
574
+ contextual_response_rephraser_class,
575
+ "perform_llm_health_check",
576
+ attribute_extractors.extract_attrs_for_performing_health_check,
577
+ )
578
+ mark_class_as_instrumented(contextual_response_rephraser_class)
579
+
580
+ if not module_is_instrumented(COMMAND_PROCESSOR_MODULE_NAME):
581
+ _instrument_command_processor_module(tracer_provider)
582
+
583
+ if not module_is_instrumented(FLOW_EXECUTOR_MODULE_NAME):
584
+ _instrument_flow_executor_module(tracer_provider)
585
+
586
+ if policy_subclasses:
587
+ for policy_subclass in policy_subclasses:
588
+ if policy_subclass is not None and not class_is_instrumented(
589
+ policy_subclass
590
+ ):
591
+ _instrument_method(
592
+ tracer_provider.get_tracer(policy_subclass.__module__),
593
+ policy_subclass,
594
+ "_prediction",
595
+ attribute_extractors.extract_attrs_for_policy_prediction,
596
+ )
597
+
598
+ _instrument_intentless_policy(
599
+ tracer_provider,
600
+ policy_subclass,
601
+ )
602
+
603
+ _instrument_enterprise_search_policy(
604
+ tracer_provider,
605
+ policy_subclass,
606
+ )
607
+
608
+ mark_class_as_instrumented(policy_subclass)
609
+
610
+ if vector_store_subclasses:
611
+ for vector_store_subclass in vector_store_subclasses:
612
+ if vector_store_subclass is not None and not class_is_instrumented(
613
+ vector_store_subclass
614
+ ):
615
+ _instrument_information_retrieval_search(
616
+ tracer_provider.get_tracer(vector_store_subclass.__module__),
617
+ vector_store_subclass,
618
+ )
619
+ mark_class_as_instrumented(vector_store_subclass)
620
+
621
+ if nlu_command_adapter_class is not None and not class_is_instrumented(
622
+ nlu_command_adapter_class
623
+ ):
624
+ _instrument_nlu_command_adapter_predict_commands(
625
+ tracer_provider.get_tracer(nlu_command_adapter_class.__module__),
626
+ nlu_command_adapter_class,
627
+ )
628
+ mark_class_as_instrumented(nlu_command_adapter_class)
629
+
630
+ if endpoint_config_class is not None and not class_is_instrumented(
631
+ endpoint_config_class
632
+ ):
633
+ _instrument_endpoint_config(
634
+ tracer_provider.get_tracer(endpoint_config_class.__module__),
635
+ endpoint_config_class,
636
+ )
637
+
638
+ if grpc_custom_action_executor_class is not None and not class_is_instrumented(
639
+ grpc_custom_action_executor_class
640
+ ):
641
+ _instrument_grpc_custom_action_executor(
642
+ tracer_provider.get_tracer(grpc_custom_action_executor_class.__module__),
643
+ grpc_custom_action_executor_class,
644
+ )
645
+
646
+ if custom_action_executor_subclasses:
647
+ for custom_action_executor_subclass in custom_action_executor_subclasses:
648
+ if (
649
+ custom_action_executor_subclass is not None
650
+ and not class_is_instrumented(custom_action_executor_subclass)
651
+ ):
652
+ _instrument_method(
653
+ tracer_provider.get_tracer(
654
+ custom_action_executor_subclass.__module__
655
+ ),
656
+ custom_action_executor_subclass,
657
+ "run",
658
+ attribute_extractors.extract_attrs_for_custom_action_executor_run,
659
+ )
660
+
661
+ if issubclass(
662
+ custom_action_executor_subclass, GRPCCustomActionExecutor
663
+ ):
664
+ _instrument_method(
665
+ tracer=tracer_provider.get_tracer(
666
+ custom_action_executor_subclass.__module__
667
+ ),
668
+ instrumented_class=custom_action_executor_subclass,
669
+ method_name="_request",
670
+ attr_extractor=attribute_extractors.extract_attrs_for_grpc_custom_action_executor_request,
671
+ )
672
+
673
+ mark_class_as_instrumented(custom_action_executor_subclass)
674
+
675
+
676
+ def _instrument_nlu_command_adapter_predict_commands(
677
+ tracer: Tracer, nlu_command_adapter_class: Type[NLUCommandAdapterType]
678
+ ) -> None:
679
+ def tracing_nlu_command_adapter_predict_commands_wrapper(fn: Callable) -> Callable:
680
+ @functools.wraps(fn)
681
+ async def wrapper(
682
+ self: NLUCommandAdapter,
683
+ message: Message,
684
+ flows: FlowsList,
685
+ tracker: Optional[DialogueStateTracker] = None,
686
+ **kwargs: Any,
687
+ ) -> List[Command]:
688
+ with tracer.start_as_current_span(
689
+ f"{self.__class__.__name__}.{fn.__name__}"
690
+ ) as span:
691
+ commands = await fn(self, message, flows, tracker, **kwargs)
692
+
693
+ span.set_attributes(
694
+ {
695
+ "commands": json.dumps(
696
+ [command.as_dict() for command in commands]
697
+ ),
698
+ "intent": json.dumps(message.get("intent", {}).get("name")),
699
+ }
700
+ )
701
+ return commands
702
+
703
+ return wrapper
704
+
705
+ nlu_command_adapter_class.predict_commands = ( # type: ignore[assignment]
706
+ tracing_nlu_command_adapter_predict_commands_wrapper(
707
+ nlu_command_adapter_class.predict_commands
708
+ )
709
+ )
710
+
711
+ logger.debug(
712
+ f"Instrumented '{nlu_command_adapter_class.__name__}.predict_commands'."
713
+ )
714
+
715
+
716
+ def _instrument_multi_step_llm_command_generator_parse_commands(
717
+ tracer: Tracer,
718
+ multi_step_llm_command_generator_class: Type[MultiStepLLMCommandGeneratorType],
719
+ ) -> None:
720
+ def tracing_multi_step_llm_command_generator_parse_commands_wrapper(
721
+ fn: Callable,
722
+ ) -> Callable:
723
+ @functools.wraps(fn)
724
+ def wrapper(
725
+ cls: MultiStepLLMCommandGenerator,
726
+ actions: Optional[str],
727
+ tracker: DialogueStateTracker,
728
+ flows: FlowsList,
729
+ is_start_or_end_prompt: bool = False,
730
+ ) -> List[Command]:
731
+ with tracer.start_as_current_span(
732
+ f"{cls.__class__.__name__}.{fn.__name__}"
733
+ ) as span:
734
+ commands = fn(actions, tracker, flows, is_start_or_end_prompt)
735
+
736
+ commands_list = []
737
+ for command in commands:
738
+ command_as_dict = command.as_dict()
739
+ command_type = command.command()
740
+
741
+ if command_type == SET_SLOT_COMMAND:
742
+ slot_value = command_as_dict.pop("value", None)
743
+ command_as_dict["is_slot_value_missing_or_none"] = (
744
+ slot_value is None
745
+ )
746
+
747
+ commands_list.append(command_as_dict)
748
+
749
+ span.set_attributes({"commands": json.dumps(commands_list)})
750
+ return commands
751
+
752
+ return wrapper
753
+
754
+ multi_step_llm_command_generator_class.parse_commands = ( # type: ignore[assignment]
755
+ tracing_multi_step_llm_command_generator_parse_commands_wrapper(
756
+ multi_step_llm_command_generator_class.parse_commands
757
+ )
758
+ )
759
+
760
+
761
+ def _instrument_information_retrieval_search(
762
+ tracer: Tracer, vector_store_class: Type[InformationRetrievalType]
763
+ ) -> None:
764
+ def tracing_information_retrieval_search_wrapper(fn: Callable) -> Callable:
765
+ @functools.wraps(fn)
766
+ async def wrapper(
767
+ self: InformationRetrieval,
768
+ query: Text,
769
+ tracker_state: Dict[str, Any],
770
+ threshold: float = 0.0,
771
+ ) -> SearchResultList:
772
+ with tracer.start_as_current_span(
773
+ f"{self.__class__.__name__}.{fn.__name__}"
774
+ ) as span:
775
+ documents = await fn(self, query, tracker_state, threshold)
776
+ span.set_attributes(
777
+ {
778
+ "query": query,
779
+ "document_metadata": json.dumps(
780
+ [document.metadata for document in documents.results]
781
+ ),
782
+ }
783
+ )
784
+ return documents
785
+
786
+ return wrapper
787
+
788
+ vector_store_class.search = tracing_information_retrieval_search_wrapper( # type: ignore[assignment]
789
+ vector_store_class.search
790
+ )
791
+
792
+ logger.debug(f"Instrumented '{vector_store_class.__name__}.search' method.")
793
+
794
+
795
+ def _instrument_enterprise_search_policy(
796
+ tracer_provider: TracerProvider, policy_class: Type[PolicyType]
797
+ ) -> None:
798
+ if policy_class.__module__ != "rasa.core.policies.enterprise_search_policy":
799
+ return None
800
+
801
+ tracer = tracer_provider.get_tracer(policy_class.__module__)
802
+
803
+ _instrument_method(
804
+ tracer,
805
+ policy_class,
806
+ "_generate_llm_answer",
807
+ attribute_extractors.extract_attrs_for_enterprise_search_generate_llm_answer,
808
+ )
809
+ _instrument_perform_health_check_method_for_component(
810
+ tracer_provider.get_tracer(policy_class.__module__),
811
+ policy_class,
812
+ "perform_embeddings_health_check",
813
+ attribute_extractors.extract_attrs_for_performing_health_check,
814
+ )
815
+ _instrument_perform_health_check_method_for_component(
816
+ tracer_provider.get_tracer(policy_class.__module__),
817
+ policy_class,
818
+ "perform_llm_health_check",
819
+ attribute_extractors.extract_attrs_for_performing_health_check,
820
+ )
821
+
822
+
823
+ def _instrument_intentless_policy(
824
+ tracer_provider: TracerProvider, policy_class: Type[PolicyType]
825
+ ) -> None:
826
+ if policy_class.__module__ != "rasa.core.policies.intentless_policy":
827
+ return None
828
+
829
+ tracer = tracer_provider.get_tracer(policy_class.__module__)
830
+
831
+ _instrument_method(
832
+ tracer,
833
+ policy_class,
834
+ "_prediction_result",
835
+ attribute_extractors.extract_attrs_for_intentless_policy_prediction_result,
836
+ )
837
+ _instrument_method(
838
+ tracer,
839
+ policy_class,
840
+ "find_closest_response",
841
+ attribute_extractors.extract_attrs_for_intentless_policy_find_closest_response,
842
+ )
843
+ _instrument_select_response_examples(tracer, policy_class)
844
+ _instrument_select_few_shot_conversations(tracer, policy_class)
845
+ _instrument_extract_ai_responses(tracer, policy_class)
846
+ _instrument_generate_answer(tracer, policy_class)
847
+ _instrument_method(
848
+ tracer,
849
+ policy_class,
850
+ "_generate_llm_answer",
851
+ attribute_extractors.extract_attrs_for_intentless_policy_generate_llm_answer,
852
+ )
853
+ _instrument_perform_health_check_method_for_component(
854
+ tracer_provider.get_tracer(policy_class.__module__),
855
+ policy_class,
856
+ "perform_embeddings_health_check",
857
+ attribute_extractors.extract_attrs_for_performing_health_check,
858
+ )
859
+ _instrument_perform_health_check_method_for_component(
860
+ tracer_provider.get_tracer(policy_class.__module__),
861
+ policy_class,
862
+ "perform_llm_health_check",
863
+ attribute_extractors.extract_attrs_for_performing_health_check,
864
+ )
865
+
866
+
867
+ def _instrument_processor(
868
+ tracer_provider: TracerProvider, processor_class: Type[ProcessorType]
869
+ ) -> None:
870
+ tracer = tracer_provider.get_tracer(processor_class.__module__)
871
+ _instrument_method(
872
+ tracer,
873
+ processor_class,
874
+ "handle_message",
875
+ None,
876
+ attribute_extractors.extract_headers,
877
+ )
878
+ _instrument_method(
879
+ tracer,
880
+ processor_class,
881
+ "log_message",
882
+ None,
883
+ attribute_extractors.extract_headers,
884
+ )
885
+ _instrument_run_action(tracer, processor_class)
886
+ _instrument_method(
887
+ tracer,
888
+ processor_class,
889
+ "save_tracker",
890
+ attribute_extractors.extract_number_of_events,
891
+ )
892
+ _instrument_method(tracer, processor_class, "_run_prediction_loop", None)
893
+ _instrument_method(
894
+ tracer,
895
+ processor_class,
896
+ "_predict_next_with_tracker",
897
+ attribute_extractors.extract_intent_name_and_slots,
898
+ )
899
+ _instrument_get_tracker(tracer, processor_class)
900
+
901
+
902
+ # Wrapping `get_tracker` works a bit differently since in this case, we actually need
903
+ # to extract the attributes from the return value.
904
+ def _instrument_get_tracker(
905
+ tracer: Tracer, processor_class: Type[ProcessorType]
906
+ ) -> None:
907
+ def tracing_get_tracker_wrapper(fn: Callable) -> Callable:
908
+ @functools.wraps(fn)
909
+ async def wrapper(
910
+ self: Type[ProcessorType], conversation_id: Text
911
+ ) -> DialogueStateTracker:
912
+ with tracer.start_as_current_span(
913
+ f"{self.__class__.__name__}.{fn.__name__}"
914
+ ) as span:
915
+ tracker: DialogueStateTracker = await fn(self, conversation_id)
916
+ span.set_attributes({"number_of_events": len(tracker.events)})
917
+ return tracker
918
+
919
+ return wrapper
920
+
921
+ processor_class.get_tracker = tracing_get_tracker_wrapper( # type: ignore[assignment]
922
+ processor_class.get_tracker
923
+ )
924
+
925
+ logger.debug(f"Instrumented '{processor_class.__name__}.get_tracker'.")
926
+
927
+
928
+ def _instrument_command_processor_module(tracer_provider: TracerProvider) -> None:
929
+ _instrument_function(
930
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
931
+ COMMAND_PROCESSOR_MODULE_NAME,
932
+ "execute_commands",
933
+ attribute_extractors.extract_attrs_for_execute_commands,
934
+ )
935
+ _instrument_function(
936
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
937
+ COMMAND_PROCESSOR_MODULE_NAME,
938
+ "validate_state_of_commands",
939
+ attribute_extractors.extract_attrs_for_validate_state_of_commands,
940
+ )
941
+ _instrument_function(
942
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
943
+ COMMAND_PROCESSOR_MODULE_NAME,
944
+ "clean_up_commands",
945
+ attribute_extractors.extract_attrs_for_clean_up_commands,
946
+ )
947
+ _instrument_function(
948
+ tracer_provider.get_tracer(COMMAND_PROCESSOR_MODULE_NAME),
949
+ COMMAND_PROCESSOR_MODULE_NAME,
950
+ "remove_duplicated_set_slots",
951
+ attribute_extractors.extract_attrs_for_remove_duplicated_set_slots,
952
+ )
953
+ mark_module_as_instrumented(COMMAND_PROCESSOR_MODULE_NAME)
954
+
955
+
956
+ def _instrument_flow_executor_module(tracer_provider: TracerProvider) -> None:
957
+ _instrument_function(
958
+ tracer_provider.get_tracer(FLOW_EXECUTOR_MODULE_NAME),
959
+ FLOW_EXECUTOR_MODULE_NAME,
960
+ "advance_flows",
961
+ attribute_extractors.extract_attrs_for_advance_flows,
962
+ )
963
+ _instrument_advance_flows_until_next_action(
964
+ tracer_provider.get_tracer(FLOW_EXECUTOR_MODULE_NAME),
965
+ FLOW_EXECUTOR_MODULE_NAME,
966
+ "advance_flows_until_next_action",
967
+ )
968
+ _instrument_function(
969
+ tracer_provider.get_tracer(FLOW_EXECUTOR_MODULE_NAME),
970
+ FLOW_EXECUTOR_MODULE_NAME,
971
+ "run_step",
972
+ attribute_extractors.extract_attrs_for_run_step,
973
+ )
974
+ mark_module_as_instrumented(FLOW_EXECUTOR_MODULE_NAME)
975
+
976
+
977
+ def _instrument_advance_flows_until_next_action(
978
+ tracer: Tracer,
979
+ module_name: str,
980
+ function_name: str,
981
+ ) -> None:
982
+ def tracing_advance_flows_until_next_action_wrapper(fn: Callable) -> Callable:
983
+ @functools.wraps(fn)
984
+ def wrapper(
985
+ tracker: DialogueStateTracker,
986
+ available_actions: List[str],
987
+ flows: FlowsList,
988
+ ) -> FlowActionPrediction:
989
+ with tracer.start_as_current_span(f"{module_name}.{fn.__name__}") as span:
990
+ prediction: FlowActionPrediction = fn(tracker, available_actions, flows)
991
+
992
+ span.set_attributes(
993
+ {
994
+ "action_name": prediction.action_name
995
+ if prediction.action_name
996
+ else "None",
997
+ "score": prediction.score,
998
+ "metadata": json.dumps(prediction.metadata)
999
+ if prediction.metadata
1000
+ else "{}",
1001
+ "events": json.dumps(
1002
+ [event.__class__.__name__ for event in prediction.events]
1003
+ if prediction.events
1004
+ else [],
1005
+ ),
1006
+ }
1007
+ )
1008
+
1009
+ return prediction
1010
+
1011
+ return wrapper
1012
+
1013
+ module = importlib.import_module(module_name)
1014
+ function_to_trace = getattr(module, function_name)
1015
+
1016
+ traced_function = tracing_advance_flows_until_next_action_wrapper(function_to_trace)
1017
+
1018
+ setattr(module, function_name, traced_function)
1019
+
1020
+ logger.debug(
1021
+ f"Instrumented function '{function_name}' in the module '{module_name}'. "
1022
+ )
1023
+
1024
+
1025
+ def _instrument_method(
1026
+ tracer: Tracer,
1027
+ instrumented_class: Type,
1028
+ method_name: Text,
1029
+ attr_extractor: Optional[Callable],
1030
+ header_extractor: Optional[Callable] = None,
1031
+ metrics_recorder: Optional[Callable] = None,
1032
+ ) -> None:
1033
+ method_to_trace = getattr(instrumented_class, method_name)
1034
+ traced_method = _wrap_with_tracing_decorator(
1035
+ method_to_trace, tracer, attr_extractor, header_extractor, metrics_recorder
1036
+ )
1037
+ setattr(instrumented_class, method_name, traced_method)
1038
+
1039
+ logger.debug(f"Instrumented '{instrumented_class.__name__}.{method_name}'.")
1040
+
1041
+
1042
+ def _instrument_function(
1043
+ tracer: Tracer,
1044
+ module_name: Text,
1045
+ function_name: Text,
1046
+ attr_extractor: Optional[Callable],
1047
+ header_extractor: Optional[Callable] = None,
1048
+ ) -> None:
1049
+ module = importlib.import_module(module_name)
1050
+ function_to_trace = getattr(module, function_name)
1051
+ traced_function = _wrap_with_tracing_decorator(
1052
+ function_to_trace, tracer, attr_extractor, header_extractor
1053
+ )
1054
+
1055
+ setattr(module, function_name, traced_function)
1056
+
1057
+ logger.debug(
1058
+ f"Instrumented function '{function_name}' in the module '{module_name}'. "
1059
+ )
1060
+
1061
+
1062
+ def _wrap_with_tracing_decorator(
1063
+ callable_to_trace: Callable,
1064
+ tracer: Tracer,
1065
+ attr_extractor: Optional[Callable],
1066
+ header_extractor: Optional[Callable] = None,
1067
+ metrics_recorder: Optional[Callable] = None,
1068
+ ) -> Callable:
1069
+ if inspect.iscoroutinefunction(callable_to_trace):
1070
+ traced_callable = traceable_async(
1071
+ callable_to_trace,
1072
+ tracer,
1073
+ attr_extractor,
1074
+ header_extractor,
1075
+ metrics_recorder,
1076
+ )
1077
+ else:
1078
+ traced_callable = traceable(
1079
+ callable_to_trace, tracer, attr_extractor, metrics_recorder
1080
+ )
1081
+
1082
+ return traced_callable
1083
+
1084
+
1085
+ def _instrument_run_action(
1086
+ tracer: Tracer, processor_class: Type[ProcessorType]
1087
+ ) -> None:
1088
+ def tracing_run_action_wrapper(fn: Callable) -> Callable:
1089
+ @functools.wraps(fn)
1090
+ async def wrapper(
1091
+ self: Type[ProcessorType],
1092
+ action: Action,
1093
+ tracker: DialogueStateTracker,
1094
+ output_channel: OutputChannel,
1095
+ nlg: NaturalLanguageGenerator,
1096
+ prediction: PolicyPrediction,
1097
+ ) -> bool:
1098
+ attrs = {
1099
+ "action_name": action.name(),
1100
+ "sender_id": tracker.sender_id,
1101
+ "message_id": tracker.latest_message.message_id or "default", # type: ignore[union-attr]
1102
+ }
1103
+ if isinstance(action, RemoteAction):
1104
+ if isinstance(action.executor, RetryCustomActionExecutor):
1105
+ attrs["executor_class_name"] = type(
1106
+ action.executor._custom_action_executor
1107
+ ).__name__
1108
+ else:
1109
+ attrs["executor_class_name"] = type(action.executor).__name__
1110
+ with tracer.start_as_current_span(
1111
+ f"{self.__class__.__name__}.{fn.__name__}",
1112
+ kind=SpanKind.CLIENT,
1113
+ attributes=attrs,
1114
+ ):
1115
+ return await fn(self, action, tracker, output_channel, nlg, prediction)
1116
+
1117
+ return wrapper
1118
+
1119
+ processor_class._run_action = tracing_run_action_wrapper( # type: ignore[assignment]
1120
+ processor_class._run_action
1121
+ )
1122
+
1123
+ logger.debug(f"Instrumented '{processor_class.__name__}._run_action'.")
1124
+
1125
+
1126
+ def _instrument_endpoint_config(
1127
+ tracer: Tracer, endpoint_config_class: Type[EndpointConfigType]
1128
+ ) -> None:
1129
+ """Instrument the `request` method of the `EndpointConfig` class.
1130
+
1131
+ Args:
1132
+ tracer: The `Tracer` that shall be used for tracing.
1133
+ endpoint_config_class: The `EndpointConfig` to be instrumented.
1134
+ """
1135
+
1136
+ def tracing_endpoint_config_wrapper(fn: Callable) -> Callable:
1137
+ @functools.wraps(fn)
1138
+ async def wrapper(
1139
+ self: Type[EndpointConfigType],
1140
+ method: Text = "post",
1141
+ subpath: Optional[Text] = None,
1142
+ content_type: Optional[Text] = "application/json",
1143
+ compress: bool = False,
1144
+ **kwargs: Any,
1145
+ ) -> bool:
1146
+ request_body = kwargs.get("json")
1147
+ attrs: Dict[str, Any] = {"url": concat_url(self.url, subpath)}
1148
+
1149
+ if not request_body:
1150
+ attrs.update({REQUEST_BODY_SIZE_IN_BYTES_ATTRIBUTE_NAME: 0})
1151
+ else:
1152
+ attrs.update(
1153
+ {
1154
+ REQUEST_BODY_SIZE_IN_BYTES_ATTRIBUTE_NAME: len(
1155
+ json.dumps(request_body).encode("utf-8")
1156
+ )
1157
+ }
1158
+ )
1159
+ with tracer.start_as_current_span(
1160
+ f"{self.__class__.__name__}.{fn.__name__}",
1161
+ attributes=attrs,
1162
+ ):
1163
+ TraceContextTextMapPropagator().inject(self.headers)
1164
+
1165
+ start_time = time.perf_counter_ns()
1166
+ result = await fn(
1167
+ self, method, subpath, content_type, compress, **kwargs
1168
+ )
1169
+ end_time = time.perf_counter_ns()
1170
+
1171
+ record_callable_duration_metrics(self, start_time, end_time)
1172
+ record_request_size_in_bytes(attrs)
1173
+
1174
+ return result
1175
+
1176
+ return wrapper
1177
+
1178
+ endpoint_config_class.request = tracing_endpoint_config_wrapper( # type: ignore[assignment]
1179
+ endpoint_config_class.request
1180
+ )
1181
+
1182
+ logger.debug(f"Instrumented '{endpoint_config_class.__name__}.request'.")
1183
+
1184
+
1185
+ def _instrument_grpc_custom_action_executor(
1186
+ tracer: Tracer, grpc_custom_action_executor_class: Type[GRPCCustomActionExecutor]
1187
+ ) -> None:
1188
+ """Instrument the `run` method of the `GRPCCustomActionExecutor` class.
1189
+
1190
+ Args:
1191
+ tracer: The `Tracer` that shall be used for tracing.
1192
+ grpc_custom_action_executor_class: The `GRPCCustomActionExecutor` to
1193
+ be instrumented.
1194
+ """
1195
+
1196
+ def tracing_grpc_custom_action_executor_wrapper(fn: Callable) -> Callable:
1197
+ @functools.wraps(fn)
1198
+ async def wrapper(
1199
+ self: Type[GRPCCustomActionExecutor],
1200
+ tracker: Type[DialogueStateTracker],
1201
+ domain: Type[Domain],
1202
+ include_domain: bool = False,
1203
+ ) -> bool:
1204
+ TraceContextTextMapPropagator().inject(self.action_endpoint.headers)
1205
+ result = await fn(self, tracker, domain, include_domain)
1206
+ return result
1207
+
1208
+ return wrapper
1209
+
1210
+ grpc_custom_action_executor_class.run = tracing_grpc_custom_action_executor_wrapper( # type: ignore[assignment]
1211
+ grpc_custom_action_executor_class.run
1212
+ )
1213
+
1214
+ logger.debug(f"Instrumented '{grpc_custom_action_executor_class.__name__}.run.")
1215
+
1216
+
1217
+ def _instrument_perform_health_check_method_for_component(
1218
+ tracer: Tracer,
1219
+ instrumented_class: Type,
1220
+ method_name: Text,
1221
+ attr_extractor: Optional[Callable] = None,
1222
+ return_value_attr_extractor: Optional[Callable] = None,
1223
+ ) -> None:
1224
+ def tracing_perform_health_check_for_component(
1225
+ fn: Callable[..., S],
1226
+ ) -> Callable[..., S]:
1227
+ @functools.wraps(fn)
1228
+ def wrapper(*args: Any, **kwargs: Any) -> S:
1229
+ # Check the first argument to adjust for self/cls depending on how
1230
+ # the static method from LLMHealthCheckMixin / EmbeddingsLLMHealthCheckMixin
1231
+ # is called.
1232
+ if args and isinstance(
1233
+ args[0], (instrumented_class, type(instrumented_class))
1234
+ ):
1235
+ # The first argument is self/cls; align args to match the signature
1236
+ args = args[1:]
1237
+
1238
+ span_name = f"{instrumented_class.__name__}.{fn.__name__}"
1239
+ extracted_attrs = attr_extractor(*args, **kwargs) if attr_extractor else {}
1240
+
1241
+ with tracer.start_as_current_span(span_name) as span:
1242
+ result = fn(*args, **kwargs)
1243
+
1244
+ # Extract attributes from the return value, if an extractor is provided
1245
+ return_value_attributes = (
1246
+ return_value_attr_extractor(result, *args, **kwargs)
1247
+ if return_value_attr_extractor
1248
+ else {}
1249
+ )
1250
+
1251
+ span.set_attributes({**extracted_attrs, **return_value_attributes})
1252
+ return result
1253
+
1254
+ return wrapper
1255
+
1256
+ method_to_trace = getattr(instrumented_class, method_name)
1257
+ traced_method = tracing_perform_health_check_for_component(method_to_trace)
1258
+ setattr(instrumented_class, method_name, traced_method)
1259
+
1260
+ logger.debug(f"Instrumented '{instrumented_class.__name__}.{method_name}'.")
1261
+
1262
+
1263
+ def _mangled_instrumented_boolean_attribute_name(instrumented_class: Type) -> Text:
1264
+ # see https://peps.python.org/pep-0008/#method-names-and-instance-variables
1265
+ # and https://stackoverflow.com/a/50401073
1266
+ return f"_{instrumented_class.__name__}__{INSTRUMENTED_BOOLEAN_ATTRIBUTE_NAME}"
1267
+
1268
+
1269
+ def class_is_instrumented(instrumented_class: Type) -> bool:
1270
+ """Check if a class has already been instrumented."""
1271
+ return getattr(
1272
+ instrumented_class,
1273
+ _mangled_instrumented_boolean_attribute_name(instrumented_class),
1274
+ False,
1275
+ )
1276
+
1277
+
1278
+ def mark_class_as_instrumented(instrumented_class: Type) -> None:
1279
+ """Mark a class as instrumented if it isn't already marked."""
1280
+ if not class_is_instrumented(instrumented_class):
1281
+ setattr(
1282
+ instrumented_class,
1283
+ _mangled_instrumented_boolean_attribute_name(instrumented_class),
1284
+ True,
1285
+ )
1286
+
1287
+
1288
+ def _instrumented_module_boolean_attribute_name(module_name: Text) -> Text:
1289
+ return f"{module_name}_{INSTRUMENTED_MODULE_BOOLEAN_ATTRIBUTE_NAME}"
1290
+
1291
+
1292
+ def module_is_instrumented(module_name: Text) -> bool:
1293
+ """Check if a module has already been instrumented."""
1294
+ module = importlib.import_module(module_name)
1295
+ return getattr(
1296
+ module,
1297
+ _instrumented_module_boolean_attribute_name(module_name),
1298
+ False,
1299
+ )
1300
+
1301
+
1302
+ def mark_module_as_instrumented(module_name: Text) -> None:
1303
+ """Mark a module as instrumented if it isn't already marked."""
1304
+ module = importlib.import_module(module_name)
1305
+ if not module_is_instrumented(module_name):
1306
+ setattr(module, _instrumented_module_boolean_attribute_name(module_name), True)