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

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

Potentially problematic release.


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

Files changed (580) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +137 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
rasa/telemetry.py CHANGED
@@ -15,10 +15,11 @@ from collections import defaultdict
15
15
  from datetime import datetime
16
16
  from functools import wraps
17
17
  from pathlib import Path
18
- from typing import Any, Callable, Dict, List, Optional, Text
18
+ from typing import Any, Callable, Dict, List, Optional, Text, Tuple, Type, cast
19
19
 
20
20
  import importlib_resources
21
21
  import requests
22
+ import structlog
22
23
  from terminaltables import SingleTable
23
24
 
24
25
  import rasa
@@ -32,34 +33,42 @@ from rasa.constants import (
32
33
  CONFIG_TELEMETRY_ENABLED,
33
34
  CONFIG_TELEMETRY_ID,
34
35
  )
36
+ from rasa.engine.storage.local_model_storage import LocalModelStorage
35
37
  from rasa.shared.constants import (
36
- PROMPT_CONFIG_KEY,
37
- PROMPT_TEMPLATE_CONFIG_KEY,
38
- LLM_API_HEALTH_CHECK_ENV_VAR,
38
+ ASSISTANT_ID_KEY,
39
+ CONFIG_LANGUAGE_KEY,
40
+ CONFIG_PIPELINE_KEY,
41
+ CONFIG_POLICIES_KEY,
42
+ CONFIG_PREDICT_SCHEMA,
43
+ CONFIG_RECIPE_KEY,
44
+ CONFIG_TRAIN_SCHEMA,
45
+ DOCS_URL_TELEMETRY,
39
46
  LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
47
+ LLM_API_HEALTH_CHECK_ENV_VAR,
40
48
  MODEL_GROUP_CONFIG_KEY,
49
+ PROMPT_CONFIG_KEY,
50
+ PROMPT_TEMPLATE_CONFIG_KEY,
51
+ UTTER_ASK_PREFIX,
41
52
  )
42
- from rasa.engine.storage.local_model_storage import LocalModelStorage
43
- from rasa.shared.constants import DOCS_URL_TELEMETRY, UTTER_ASK_PREFIX
44
53
  from rasa.shared.core.flows import Flow
45
54
  from rasa.shared.core.flows.steps import (
55
+ CallFlowStep,
46
56
  CollectInformationFlowStep,
47
- SetSlotsFlowStep,
48
57
  LinkFlowStep,
49
- CallFlowStep,
58
+ SetSlotsFlowStep,
50
59
  )
51
60
  from rasa.shared.exceptions import RasaException
52
61
  from rasa.utils import common as rasa_utils
53
62
 
54
63
  if typing.TYPE_CHECKING:
64
+ from rasa.core.agent import Agent
55
65
  from rasa.core.brokers.broker import EventBroker
56
- from rasa.core.tracker_store import TrackerStore
57
66
  from rasa.core.channels.channel import InputChannel
58
- from rasa.core.agent import Agent
59
- from rasa.shared.nlu.training_data.training_data import TrainingData
60
- from rasa.shared.importers.importer import TrainingDataImporter
67
+ from rasa.core.tracker_store import TrackerStore
61
68
  from rasa.core.utils import AvailableEndpoints
62
- from rasa.e2e_test.e2e_test_case import TestCase, Fixture, Metadata
69
+ from rasa.e2e_test.e2e_test_case import Fixture, Metadata, TestCase
70
+ from rasa.shared.importers.importer import TrainingDataImporter
71
+ from rasa.shared.nlu.training_data.training_data import TrainingData
63
72
 
64
73
  logger = logging.getLogger(__name__)
65
74
 
@@ -103,6 +112,7 @@ CI_ENVIRONMENT_TELL = [
103
112
  # https://rasa.com/docs/rasa-pro/telemetry/reference
104
113
  TRAINING_STARTED_EVENT = "Training Started"
105
114
  TRAINING_COMPLETED_EVENT = "Training Completed"
115
+ TRAINING_FAILED_EVENT = "Training Failed"
106
116
  TELEMETRY_DISABLED_EVENT = "Telemetry Disabled"
107
117
  TELEMETRY_DATA_SPLIT_EVENT = "Training Data Split"
108
118
  TELEMETRY_DATA_VALIDATED_EVENT = "Training Data Validated"
@@ -137,6 +147,8 @@ TELEMETRY_ENTERPRISE_SEARCH_POLICY_TRAINING_COMPLETED_EVENT = (
137
147
  "Enterprise Search Policy Training Completed"
138
148
  )
139
149
  TELEMETRY_ENTERPRISE_SEARCH_POLICY_PREDICT_EVENT = "Enterprise Search Policy Predicted"
150
+ TELEMETRY_VALIDATION_ERROR_LOG_EVENT = "Validation Error Logged"
151
+ TELEMETRY_UPLOAD_TO_STUDIO_FAILED_EVENT = "Upload to Studio Failed"
140
152
 
141
153
  # licensing events
142
154
  TELEMETRY_CONVERSATION_COUNT = "Conversation Count"
@@ -352,6 +364,7 @@ def _fetch_write_key(tool: Text, environment_variable: Text) -> Optional[Text]:
352
364
  write key, if a key was present.
353
365
  """
354
366
  import importlib_resources
367
+
355
368
  from rasa import __name__ as name
356
369
 
357
370
  if os.environ.get(environment_variable):
@@ -516,7 +529,6 @@ def _send_request(url: Text, payload: Dict[Text, Any]) -> None:
516
529
  """
517
530
  if _is_telemetry_debug_enabled():
518
531
  print_telemetry_payload(payload)
519
- return
520
532
 
521
533
  write_key = _get_telemetry_write_key()
522
534
  if not write_key:
@@ -602,7 +614,7 @@ def _default_context_fields() -> Dict[Text, Any]:
602
614
  Return:
603
615
  A new context containing information about the runtime environment.
604
616
  """
605
- from rasa.utils.licensing import property_of_active_license, get_license_hash
617
+ from rasa.utils.licensing import get_license_hash, property_of_active_license
606
618
 
607
619
  global TELEMETRY_CONTEXT
608
620
 
@@ -962,13 +974,14 @@ def track_model_training(
962
974
  training_id = uuid.uuid4().hex
963
975
 
964
976
  tracking_data = {
965
- "language": config.get("language"),
977
+ "language": config.get(CONFIG_LANGUAGE_KEY),
966
978
  "training_id": training_id,
967
979
  "type": model_type,
968
- "pipeline": config.get("pipeline"),
969
- "policies": config.get("policies"),
970
- "train_schema": config.get("train_schema"),
971
- "predict_schema": config.get("predict_schema"),
980
+ "assistant_id": config.get(ASSISTANT_ID_KEY),
981
+ "pipeline": config.get(CONFIG_PIPELINE_KEY),
982
+ "policies": config.get(CONFIG_POLICIES_KEY),
983
+ "train_schema": config.get(CONFIG_TRAIN_SCHEMA),
984
+ "predict_schema": config.get(CONFIG_PREDICT_SCHEMA),
972
985
  "model_groups": rasa.core.utils.AvailableEndpoints.get_instance().model_groups,
973
986
  "api_health_check_enabled": (
974
987
  os.getenv(
@@ -995,7 +1008,7 @@ def track_model_training(
995
1008
  "num_synonyms": len(nlu_data.entity_synonyms),
996
1009
  "num_regexes": len(nlu_data.regex_features),
997
1010
  "is_finetuning": is_finetuning,
998
- "recipe": config.get("recipe"),
1011
+ "recipe": config.get(CONFIG_RECIPE_KEY),
999
1012
  }
1000
1013
 
1001
1014
  flow_statistics = _collect_flow_statistics(flows.underlying_flows)
@@ -1010,13 +1023,28 @@ def track_model_training(
1010
1023
  tracking_data,
1011
1024
  )
1012
1025
  start = datetime.now()
1013
- yield
1026
+ try:
1027
+ yield
1028
+ except (Exception, SystemExit):
1029
+ runtime = datetime.now() - start
1030
+ _track(
1031
+ TRAINING_FAILED_EVENT,
1032
+ {
1033
+ "training_id": training_id,
1034
+ "assistant_id": config.get(ASSISTANT_ID_KEY),
1035
+ "type": model_type,
1036
+ "runtime": int(runtime.total_seconds()),
1037
+ },
1038
+ )
1039
+ raise
1040
+
1014
1041
  runtime = datetime.now() - start
1015
1042
 
1016
1043
  _track(
1017
1044
  TRAINING_COMPLETED_EVENT,
1018
1045
  {
1019
1046
  "training_id": training_id,
1047
+ "assistant_id": config.get(ASSISTANT_ID_KEY),
1020
1048
  "type": model_type,
1021
1049
  "runtime": int(runtime.total_seconds()),
1022
1050
  },
@@ -1096,28 +1124,29 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1096
1124
  Includes the model name, whether a custom prompt is used, whether flow
1097
1125
  retrieval is enabled, and flow retrieval embedding model.
1098
1126
  """
1099
- from rasa.shared.constants import (
1100
- EMBEDDINGS_CONFIG_KEY,
1101
- MODEL_CONFIG_KEY,
1102
- MODEL_NAME_CONFIG_KEY,
1103
- )
1104
1127
  from rasa.dialogue_understanding.generator import (
1128
+ CompactLLMCommandGenerator,
1129
+ LLMBasedCommandGenerator,
1105
1130
  LLMCommandGenerator,
1106
- SingleStepLLMCommandGenerator,
1107
1131
  MultiStepLLMCommandGenerator,
1108
- )
1109
- from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_generator import ( # noqa: E501
1110
- HANDLE_FLOWS_KEY,
1111
- FILL_SLOTS_KEY,
1132
+ SingleStepLLMCommandGenerator,
1112
1133
  )
1113
1134
  from rasa.dialogue_understanding.generator.constants import (
1114
- LLM_CONFIG_KEY,
1115
- DEFAULT_LLM_CONFIG,
1116
1135
  FLOW_RETRIEVAL_KEY,
1136
+ LLM_CONFIG_KEY,
1117
1137
  )
1118
1138
  from rasa.dialogue_understanding.generator.flow_retrieval import (
1119
1139
  DEFAULT_EMBEDDINGS_CONFIG,
1120
1140
  )
1141
+ from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_generator import ( # noqa: E501
1142
+ FILL_SLOTS_KEY,
1143
+ HANDLE_FLOWS_KEY,
1144
+ )
1145
+ from rasa.shared.constants import (
1146
+ EMBEDDINGS_CONFIG_KEY,
1147
+ MODEL_CONFIG_KEY,
1148
+ MODEL_NAME_CONFIG_KEY,
1149
+ )
1121
1150
 
1122
1151
  def find_command_generator_component(pipeline: List) -> Optional[Dict]:
1123
1152
  """Finds the LLMCommandGenerator component in the pipeline."""
@@ -1126,12 +1155,19 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1126
1155
  LLMCommandGenerator.__name__,
1127
1156
  SingleStepLLMCommandGenerator.__name__,
1128
1157
  MultiStepLLMCommandGenerator.__name__,
1158
+ CompactLLMCommandGenerator.__name__,
1129
1159
  ]:
1130
1160
  return component
1131
1161
  return None
1132
1162
 
1133
1163
  def extract_llm_command_generator_llm_client_settings(component: Dict) -> Dict:
1134
1164
  """Extracts settings related to LLM command generator."""
1165
+ component_class_lookup = {
1166
+ LLMCommandGenerator.__name__: LLMCommandGenerator,
1167
+ SingleStepLLMCommandGenerator.__name__: SingleStepLLMCommandGenerator,
1168
+ MultiStepLLMCommandGenerator.__name__: MultiStepLLMCommandGenerator,
1169
+ CompactLLMCommandGenerator.__name__: CompactLLMCommandGenerator,
1170
+ }
1135
1171
  llm_config = component.get(LLM_CONFIG_KEY, {})
1136
1172
  # Config at this stage is not yet resolved, so read from `model_group`
1137
1173
  llm_model_group_id = llm_config.get(MODEL_GROUP_CONFIG_KEY)
@@ -1139,7 +1175,11 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1139
1175
  MODEL_NAME_CONFIG_KEY
1140
1176
  )
1141
1177
  if llm_model_group_id is None and llm_model_name is None:
1142
- llm_model_name = DEFAULT_LLM_CONFIG[MODEL_CONFIG_KEY]
1178
+ component_clz = cast(
1179
+ Type[LLMBasedCommandGenerator],
1180
+ component_class_lookup[component["name"]],
1181
+ )
1182
+ llm_model_name = component_clz.get_default_llm_config()[MODEL_CONFIG_KEY]
1143
1183
 
1144
1184
  custom_prompt_used = (
1145
1185
  PROMPT_CONFIG_KEY in component or PROMPT_TEMPLATE_CONFIG_KEY in component
@@ -1204,7 +1244,7 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1204
1244
  FLOW_RETRIEVAL_EMBEDDING_MODEL_GROUP_ID: None,
1205
1245
  }
1206
1246
 
1207
- pipeline = config.get("pipeline", [])
1247
+ pipeline = config.get(CONFIG_PIPELINE_KEY, [])
1208
1248
  if not isinstance(pipeline, list):
1209
1249
  return command_generator_config
1210
1250
 
@@ -1315,24 +1355,28 @@ def track_server_start(
1315
1355
  """
1316
1356
  from rasa.core.utils import AvailableEndpoints
1317
1357
 
1318
- def project_fingerprint_from_model(
1358
+ def project_fingerprint_and_assistant_id_from_model(
1319
1359
  _model_directory: Optional[Text],
1320
- ) -> Optional[Text]:
1360
+ ) -> Tuple[Optional[Text], Optional[Text]]:
1321
1361
  """Gets project fingerprint from an app's loaded model."""
1322
1362
  if not model_directory:
1323
- return None
1363
+ return None, None
1324
1364
 
1325
1365
  try:
1326
1366
  model_archive = model.get_local_model(_model_directory)
1327
1367
  metadata = LocalModelStorage.metadata_from_archive(model_archive)
1328
1368
 
1329
- return metadata.project_fingerprint
1369
+ return metadata.project_fingerprint, metadata.assistant_id
1330
1370
  except Exception:
1331
- return None
1371
+ return None, None
1332
1372
 
1333
1373
  if not endpoints:
1334
1374
  endpoints = AvailableEndpoints()
1335
1375
 
1376
+ project, assistant_id = project_fingerprint_and_assistant_id_from_model(
1377
+ model_directory
1378
+ )
1379
+
1336
1380
  _track(
1337
1381
  TELEMETRY_SERVER_STARTED_EVENT,
1338
1382
  {
@@ -1354,7 +1398,8 @@ def track_server_start(
1354
1398
  "endpoints_event_broker": endpoints.event_broker.type
1355
1399
  if endpoints.event_broker
1356
1400
  else None,
1357
- "project": project_fingerprint_from_model(model_directory),
1401
+ "project": project,
1402
+ "assistant_id": assistant_id,
1358
1403
  },
1359
1404
  )
1360
1405
 
@@ -1372,24 +1417,30 @@ def track_project_init(path: Text) -> None:
1372
1417
 
1373
1418
 
1374
1419
  @ensure_telemetry_enabled
1375
- def track_shell_started(model_type: Text) -> None:
1420
+ def track_shell_started(model_type: Text, assistant_id: Text) -> None:
1376
1421
  """Track when a user starts a bot using rasa shell.
1377
1422
 
1378
1423
  Args:
1379
1424
  model_type: Type of the model, core / nlu or rasa.
1380
1425
  """
1381
- _track(TELEMETRY_SHELL_STARTED_EVENT, {"type": model_type})
1426
+ _track(
1427
+ TELEMETRY_SHELL_STARTED_EVENT,
1428
+ {"type": model_type, "assistant_id": assistant_id},
1429
+ )
1382
1430
 
1383
1431
 
1384
1432
  @ensure_telemetry_enabled
1385
- def track_inspect_started(model_type: Text) -> None:
1433
+ def track_inspect_started(channel: Text, assistant_id: Text) -> None:
1386
1434
  """Track when a user starts a bot using rasa inspect.
1387
1435
 
1388
1436
  Args:
1389
- channel: Channel name `socketio` (used for chat assistants)
1390
- or `browser_audio` (used for voice).
1437
+ channel: Type of channel used.
1438
+ assistant_id: ID of the assistant being inspected.
1391
1439
  """
1392
- _track(TELEMETRY_INSPECT_STARTED_EVENT, {"type": model_type})
1440
+ _track(
1441
+ TELEMETRY_INSPECT_STARTED_EVENT,
1442
+ {"type": channel, "assistant_id": assistant_id},
1443
+ )
1393
1444
 
1394
1445
 
1395
1446
  @ensure_telemetry_enabled
@@ -1867,3 +1918,31 @@ def track_e2e_test_conversion_completed(file_type: str, test_case_count: int) ->
1867
1918
  E2E_TEST_CONVERSION_TEST_CASE_COUNT: test_case_count,
1868
1919
  },
1869
1920
  )
1921
+
1922
+
1923
+ def track_validation_error_log(
1924
+ _: structlog.BoundLogger, method_name: str, event_dict: Dict
1925
+ ) -> Dict:
1926
+ """Track validation errors."""
1927
+ if is_telemetry_enabled() and method_name == "error":
1928
+ event_dict_copy = event_dict.copy()
1929
+
1930
+ _track(
1931
+ TELEMETRY_VALIDATION_ERROR_LOG_EVENT,
1932
+ {
1933
+ "log_level": method_name,
1934
+ "log_id": event_dict_copy.pop("event"),
1935
+ "message": event_dict_copy.pop("event_info", ""),
1936
+ **event_dict_copy,
1937
+ },
1938
+ )
1939
+ return event_dict
1940
+
1941
+
1942
+ @ensure_telemetry_enabled
1943
+ def track_upload_to_studio_failed(response_json: Dict[str, Any]) -> None:
1944
+ """Track when the upload to studio fails."""
1945
+ _track(
1946
+ TELEMETRY_UPLOAD_TO_STUDIO_FAILED_EVENT,
1947
+ {"studio_response_json": response_json},
1948
+ )
rasa/tracing/config.py CHANGED
@@ -29,9 +29,10 @@ from rasa.dialogue_understanding.commands import (
29
29
  FreeFormAnswerCommand,
30
30
  )
31
31
  from rasa.dialogue_understanding.generator import (
32
+ CompactLLMCommandGenerator,
32
33
  LLMCommandGenerator,
33
- SingleStepLLMCommandGenerator,
34
34
  MultiStepLLMCommandGenerator,
35
+ SingleStepLLMCommandGenerator,
35
36
  )
36
37
  from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
37
38
  from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
@@ -40,11 +41,11 @@ from rasa.engine.training.graph_trainer import GraphTrainer
40
41
  from rasa.tracing.constants import (
41
42
  ENDPOINTS_ENDPOINT_KEY,
42
43
  ENDPOINTS_INSECURE_KEY,
44
+ ENDPOINTS_METRICS_KEY,
43
45
  ENDPOINTS_OTLP_BACKEND_TYPE,
46
+ ENDPOINTS_ROOT_CERTIFICATES_KEY,
44
47
  ENDPOINTS_TRACING_KEY,
45
48
  ENDPOINTS_TRACING_SERVICE_NAME_KEY,
46
- ENDPOINTS_ROOT_CERTIFICATES_KEY,
47
- ENDPOINTS_METRICS_KEY,
48
49
  )
49
50
  from rasa.tracing.instrumentation import instrumentation
50
51
  from rasa.tracing.metric_instrument_provider import MetricInstrumentProvider
@@ -110,6 +111,7 @@ def configure_tracing(tracer_provider: Optional[TracerProvider]) -> None:
110
111
  endpoint_config_class=EndpointConfig,
111
112
  grpc_custom_action_executor_class=GRPCCustomActionExecutor,
112
113
  single_step_llm_command_generator_class=SingleStepLLMCommandGenerator,
114
+ compact_llm_command_generator_class=CompactLLMCommandGenerator,
113
115
  multi_step_llm_command_generator_class=MultiStepLLMCommandGenerator,
114
116
  custom_action_executor_subclasses=custom_action_executor_subclasses,
115
117
  flow_retrieval_class=FlowRetrieval,
rasa/tracing/constants.py CHANGED
@@ -32,6 +32,18 @@ SINGLE_STEP_LLM_COMMAND_GENERATOR_PROMPT_TOKEN_USAGE_METRIC_NAME = (
32
32
  SINGLE_STEP_LLM_COMMAND_GENERATOR_LLM_RESPONSE_DURATION_METRIC_NAME = (
33
33
  "single_step_llm_command_generator_llm_response_duration"
34
34
  )
35
+ COMPACT_LLM_COMMAND_GENERATOR_CPU_USAGE_METRIC_NAME = (
36
+ "compact_llm_command_generator_cpu_usage"
37
+ )
38
+ COMPACT_LLM_COMMAND_GENERATOR_MEMORY_USAGE_METRIC_NAME = (
39
+ "compact_llm_command_generator_memory_usage"
40
+ )
41
+ COMPACT_LLM_COMMAND_GENERATOR_PROMPT_TOKEN_USAGE_METRIC_NAME = (
42
+ "compact_llm_command_generator_prompt_token_usage"
43
+ )
44
+ COMPACT_LLM_COMMAND_GENERATOR_LLM_RESPONSE_DURATION_METRIC_NAME = (
45
+ "compact_llm_command_generator_llm_response_duration"
46
+ )
35
47
  MULTI_STEP_LLM_COMMAND_GENERATOR_CPU_USAGE_METRIC_NAME = (
36
48
  "multi_step_llm_command_generator_cpu_usage"
37
49
  )
@@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
5
5
 
6
6
  import tiktoken
7
7
  from numpy import ndarray
8
- from rasa.dialogue_understanding.generator.constants import FLOW_RETRIEVAL_KEY
9
8
  from rasa_sdk.grpc_py import action_webhook_pb2
10
9
 
11
10
  from rasa.core.actions.action import DirectCustomActionExecutor
@@ -19,34 +18,51 @@ from rasa.core.nlg.contextual_response_rephraser import ContextualResponseRephra
19
18
  from rasa.core.processor import MessageProcessor
20
19
  from rasa.core.tracker_store import TrackerStore
21
20
  from rasa.dialogue_understanding.commands import Command
22
- from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
23
21
  from rasa.dialogue_understanding.generator import LLMBasedCommandGenerator
22
+ from rasa.dialogue_understanding.generator.constants import FLOW_RETRIEVAL_KEY
23
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
24
+ from rasa.dialogue_understanding_test.du_test_result import (
25
+ KEY_TEST_CASES_ACCURACY,
26
+ KEY_USER_UTTERANCES_ACCURACY,
27
+ OUTPUT_COMPLETION_TOKEN_METRICS,
28
+ OUTPUT_LATENCY_METRICS,
29
+ OUTPUT_NAMES_OF_FAILED_TESTS,
30
+ OUTPUT_NAMES_OF_PASSED_TESTS,
31
+ OUTPUT_NUMBER_OF_FAILED_TESTS,
32
+ OUTPUT_NUMBER_OF_FAILED_USER_UTTERANCES,
33
+ OUTPUT_NUMBER_OF_PASSED_TESTS,
34
+ OUTPUT_NUMBER_OF_PASSED_USER_UTTERANCES,
35
+ OUTPUT_PROMPT_TOKEN_METRICS,
36
+ OUTPUT_TEST_CASES_ACCURACY,
37
+ OUTPUT_USER_UTTERANCES_ACCURACY,
38
+ DialogueUnderstandingTestSuiteResult,
39
+ )
24
40
  from rasa.engine.graph import ExecutionContext, GraphModelConfiguration, GraphNode
25
41
  from rasa.engine.training.graph_trainer import GraphTrainer
26
42
  from rasa.shared.constants import (
43
+ CONFIG_RECIPE_KEY,
44
+ DEPLOYMENT_CONFIG_KEY,
27
45
  EMBEDDINGS_CONFIG_KEY,
46
+ LLM_CONFIG_KEY,
28
47
  MODEL_CONFIG_KEY,
48
+ MODEL_GROUP_ID_CONFIG_KEY,
49
+ MODELS_CONFIG_KEY,
29
50
  PROVIDER_CONFIG_KEY,
30
51
  TIMEOUT_CONFIG_KEY,
31
- DEPLOYMENT_CONFIG_KEY,
32
- MODEL_GROUP_ID_CONFIG_KEY,
33
- LLM_CONFIG_KEY,
34
52
  )
35
53
  from rasa.shared.core.constants import REQUESTED_SLOT
36
54
  from rasa.shared.core.domain import Domain
37
55
  from rasa.shared.core.events import DialogueStackUpdated, Event
38
56
  from rasa.shared.core.flows import Flow, FlowsList, FlowStep
39
57
  from rasa.shared.core.trackers import DialogueStateTracker
58
+ from rasa.shared.core.training_data.structures import StoryGraph
40
59
  from rasa.shared.importers.importer import TrainingDataImporter
41
60
  from rasa.shared.nlu.constants import INTENT_NAME_KEY, SET_SLOT_COMMAND
42
- from rasa.shared.utils.llm import (
43
- combine_custom_and_default_config,
44
- )
61
+ from rasa.shared.utils.llm import combine_custom_and_default_config
45
62
  from rasa.tracing.constants import (
46
63
  PROMPT_TOKEN_LENGTH_ATTRIBUTE_NAME,
47
64
  REQUEST_BODY_SIZE_IN_BYTES_ATTRIBUTE_NAME,
48
65
  )
49
- from rasa.shared.core.training_data.structures import StoryGraph
50
66
 
51
67
  if TYPE_CHECKING:
52
68
  from langchain.llms.base import BaseLLM
@@ -255,7 +271,7 @@ def extract_attrs_for_graph_trainer(
255
271
  return {
256
272
  "training_type": model_configuration.training_type.model_type,
257
273
  "language": model_configuration.language,
258
- "recipe_name": importer.get_config().get("recipe"),
274
+ "recipe_name": importer.get_config().get(CONFIG_RECIPE_KEY),
259
275
  "output_filename": output_filename.name,
260
276
  "is_finetuning": is_finetuning,
261
277
  }
@@ -357,14 +373,13 @@ def extract_attrs_for_llm_based_command_generator(
357
373
  self: "LLMBasedCommandGenerator",
358
374
  prompt: str,
359
375
  ) -> Dict[str, Any]:
360
- from rasa.dialogue_understanding.generator.constants import DEFAULT_LLM_CONFIG
361
376
  from rasa.dialogue_understanding.generator.flow_retrieval import (
362
377
  DEFAULT_EMBEDDINGS_CONFIG,
363
378
  )
364
379
 
365
380
  attributes = extract_llm_config(
366
381
  self,
367
- default_llm_config=DEFAULT_LLM_CONFIG,
382
+ default_llm_config=self.get_default_llm_config(),
368
383
  default_embeddings_config=DEFAULT_EMBEDDINGS_CONFIG,
369
384
  )
370
385
 
@@ -570,6 +585,67 @@ def extract_attrs_for_advance_flows(
570
585
  }
571
586
 
572
587
 
588
+ def extract_attrs_for_du_print_test_results(
589
+ test_suite_result: DialogueUnderstandingTestSuiteResult,
590
+ output_prompt: bool,
591
+ ) -> Dict[str, Any]:
592
+ """Extract the attributes for
593
+ `rasa.dialogue_understanding_test.io.print_test_results` function.
594
+ """
595
+ from rasa.tracing.instrumentation.instrumentation import (
596
+ DIALOG_UNDERSTANDING_TEST_IO_MODULE_NAME,
597
+ )
598
+
599
+ attributes_dict = {
600
+ "module_name": DIALOG_UNDERSTANDING_TEST_IO_MODULE_NAME,
601
+ OUTPUT_TEST_CASES_ACCURACY: test_suite_result.accuracy[KEY_TEST_CASES_ACCURACY],
602
+ OUTPUT_USER_UTTERANCES_ACCURACY: test_suite_result.accuracy[
603
+ KEY_USER_UTTERANCES_ACCURACY
604
+ ],
605
+ OUTPUT_NUMBER_OF_PASSED_TESTS: test_suite_result.number_of_passed_tests,
606
+ OUTPUT_NUMBER_OF_FAILED_TESTS: test_suite_result.number_of_failed_tests,
607
+ OUTPUT_NUMBER_OF_PASSED_USER_UTTERANCES: test_suite_result.number_of_passed_user_utterances, # noqa: E501
608
+ OUTPUT_NUMBER_OF_FAILED_USER_UTTERANCES: test_suite_result.number_of_failed_user_utterances, # noqa: E501
609
+ OUTPUT_NAMES_OF_PASSED_TESTS: json.dumps(
610
+ test_suite_result.names_of_passed_tests
611
+ ),
612
+ OUTPUT_NAMES_OF_FAILED_TESTS: json.dumps(
613
+ test_suite_result.names_of_failed_tests
614
+ ),
615
+ }
616
+ if test_suite_result.command_metrics:
617
+ for (
618
+ command_name,
619
+ command_metric,
620
+ ) in test_suite_result.command_metrics.items():
621
+ # OpenTelemetry / Honeycomb doesn't support dictionaries/json values,
622
+ # so we need to set the values as separate attributes
623
+ for metric_name, value in command_metric.as_dict().items():
624
+ attributes_dict[f"{command_name}_{metric_name}"] = value
625
+
626
+ if test_suite_result.llm_config:
627
+ # check if model group syntax is used
628
+ if MODELS_CONFIG_KEY in test_suite_result.llm_config:
629
+ for idx, model_group in enumerate(
630
+ test_suite_result.llm_config[MODELS_CONFIG_KEY]
631
+ ):
632
+ for key, value in model_group.items():
633
+ if value is not None:
634
+ attributes_dict[f"llm_config_{idx}_{key}"] = value
635
+ else:
636
+ for key, value in test_suite_result.llm_config.items():
637
+ attributes_dict[f"llm_config_0_{key}"] = value
638
+
639
+ for key, value in test_suite_result.latency_metrics.items():
640
+ attributes_dict[f"{OUTPUT_LATENCY_METRICS}_{key}"] = value
641
+ for key, value in test_suite_result.prompt_token_metrics.items():
642
+ attributes_dict[f"{OUTPUT_PROMPT_TOKEN_METRICS}_{key}"] = value
643
+ for key, value in test_suite_result.completion_token_metrics.items():
644
+ attributes_dict[f"{OUTPUT_COMPLETION_TOKEN_METRICS}_{key}"] = value
645
+
646
+ return attributes_dict
647
+
648
+
573
649
  def extract_attrs_for_run_step(
574
650
  step: FlowStep,
575
651
  flow: Flow,
@@ -577,6 +653,7 @@ def extract_attrs_for_run_step(
577
653
  tracker: DialogueStateTracker,
578
654
  available_actions: List[str],
579
655
  flows: FlowsList,
656
+ previous_step_id: Text,
580
657
  ) -> Dict[str, Any]:
581
658
  current_context = extract_current_context_attribute(stack)
582
659
 
@@ -585,6 +662,7 @@ def extract_attrs_for_run_step(
585
662
  "step_description": step.description if step.description else "None",
586
663
  "current_flow_id": flow.id,
587
664
  "current_context": json.dumps(current_context),
665
+ "previous_step_id": previous_step_id,
588
666
  }
589
667
 
590
668
 
@@ -644,8 +722,8 @@ def extract_attrs_for_intentless_policy_generate_llm_answer(
644
722
  self: "IntentlessPolicy", llm: "BaseLLM", prompt: str
645
723
  ) -> Dict[str, Any]:
646
724
  from rasa.core.policies.intentless_policy import (
647
- DEFAULT_LLM_CONFIG,
648
725
  DEFAULT_EMBEDDINGS_CONFIG,
726
+ DEFAULT_LLM_CONFIG,
649
727
  )
650
728
 
651
729
  attributes = extract_llm_config(
@@ -661,8 +739,8 @@ def extract_attrs_for_enterprise_search_generate_llm_answer(
661
739
  self: "EnterpriseSearchPolicy", llm: "BaseLLM", prompt: str
662
740
  ) -> Dict[str, Any]:
663
741
  from rasa.core.policies.enterprise_search_policy import (
664
- DEFAULT_LLM_CONFIG,
665
742
  DEFAULT_EMBEDDINGS_CONFIG,
743
+ DEFAULT_LLM_CONFIG,
666
744
  )
667
745
 
668
746
  attributes = extract_llm_config(