rasa-pro 3.14.0a20__py3-none-any.whl → 3.14.0a23__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 (331) hide show
  1. rasa/__main__.py +15 -3
  2. rasa/agents/__init__.py +0 -0
  3. rasa/agents/agent_factory.py +122 -0
  4. rasa/agents/agent_manager.py +211 -0
  5. rasa/agents/constants.py +43 -0
  6. rasa/agents/core/__init__.py +0 -0
  7. rasa/agents/core/agent_protocol.py +107 -0
  8. rasa/agents/core/types.py +81 -0
  9. rasa/agents/exceptions.py +38 -0
  10. rasa/agents/protocol/__init__.py +5 -0
  11. rasa/agents/protocol/a2a/__init__.py +0 -0
  12. rasa/agents/protocol/a2a/a2a_agent.py +879 -0
  13. rasa/agents/protocol/mcp/__init__.py +0 -0
  14. rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
  15. rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
  16. rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
  17. rasa/agents/schemas/__init__.py +13 -0
  18. rasa/agents/schemas/agent_input.py +38 -0
  19. rasa/agents/schemas/agent_output.py +26 -0
  20. rasa/agents/schemas/agent_tool_result.py +65 -0
  21. rasa/agents/schemas/agent_tool_schema.py +186 -0
  22. rasa/agents/templates/__init__.py +0 -0
  23. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
  24. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
  25. rasa/agents/utils.py +206 -0
  26. rasa/agents/validation.py +485 -0
  27. rasa/api.py +24 -9
  28. rasa/builder/config.py +6 -2
  29. rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
  30. rasa/builder/guardrails/constants.py +3 -0
  31. rasa/builder/guardrails/models.py +45 -10
  32. rasa/builder/guardrails/policy_checker.py +324 -0
  33. rasa/builder/guardrails/utils.py +42 -276
  34. rasa/builder/llm_service.py +32 -5
  35. rasa/builder/models.py +1 -0
  36. rasa/builder/project_generator.py +6 -1
  37. rasa/builder/service.py +16 -13
  38. rasa/builder/training_service.py +18 -24
  39. rasa/builder/validation_service.py +1 -1
  40. rasa/cli/arguments/default_arguments.py +12 -0
  41. rasa/cli/arguments/run.py +2 -0
  42. rasa/cli/arguments/train.py +2 -0
  43. rasa/cli/data.py +10 -8
  44. rasa/cli/dialogue_understanding_test.py +10 -7
  45. rasa/cli/e2e_test.py +9 -6
  46. rasa/cli/evaluate.py +4 -2
  47. rasa/cli/export.py +5 -2
  48. rasa/cli/inspect.py +8 -4
  49. rasa/cli/interactive.py +5 -4
  50. rasa/cli/llm_fine_tuning.py +11 -6
  51. rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
  52. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  53. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  54. rasa/cli/project_templates/finance/data/general/goodbye.yml +1 -1
  55. rasa/cli/project_templates/finance/data/general/human_handoff.yml +1 -1
  56. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
  57. rasa/cli/project_templates/finance/domain/general/_shared.yml +0 -14
  58. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  59. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  60. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +3 -6
  61. rasa/cli/project_templates/finance/domain/general/welcome.yml +29 -1
  62. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
  63. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
  64. rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
  65. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  66. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
  67. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
  68. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
  69. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  70. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
  71. rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
  72. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +1 -1
  73. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +1 -1
  74. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +1 -1
  75. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +1 -1
  76. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  77. rasa/cli/run.py +12 -10
  78. rasa/cli/scaffold.py +4 -4
  79. rasa/cli/shell.py +9 -5
  80. rasa/cli/studio/studio.py +1 -1
  81. rasa/cli/test.py +34 -14
  82. rasa/cli/train.py +41 -28
  83. rasa/cli/utils.py +1 -393
  84. rasa/cli/validation/__init__.py +0 -0
  85. rasa/cli/validation/bot_config.py +223 -0
  86. rasa/cli/validation/config_path_validation.py +257 -0
  87. rasa/cli/x.py +8 -4
  88. rasa/constants.py +7 -1
  89. rasa/core/actions/action.py +51 -10
  90. rasa/core/actions/action_run_slot_rejections.py +1 -1
  91. rasa/core/actions/direct_custom_actions_executor.py +9 -2
  92. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  93. rasa/core/agent.py +19 -2
  94. rasa/core/available_agents.py +229 -0
  95. rasa/core/brokers/kafka.py +1 -1
  96. rasa/core/channels/__init__.py +82 -35
  97. rasa/core/channels/development_inspector.py +3 -3
  98. rasa/core/channels/inspector/README.md +25 -13
  99. rasa/core/channels/inspector/dist/assets/{arc-35222594.js → arc-6177260a.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-a0efbfd3.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-0584c0f2.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-39f40dbe.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-1ad755f3.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  106. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-b0f4f0fe.js → createText-2e5e7dd3-088372e2.js} +1 -1
  107. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-9039bff9.js → edges-e0da2a9e-58676240.js} +1 -1
  108. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-65c9b127.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  109. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4f08b38e.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  110. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-e95c362a.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  111. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  112. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-703c3015.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  113. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-699328ea.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  114. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-04cf4b05.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  115. rasa/core/channels/inspector/dist/assets/{graph-ee94449e.js → graph-0a6f8466.js} +1 -1
  116. rasa/core/channels/inspector/dist/assets/{index-3862675e-940162b4.js → index-3862675e-7610671a.js} +1 -1
  117. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  118. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-c79c2866.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  119. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-84489d30.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  120. rasa/core/channels/inspector/dist/assets/{layout-a9aa9858.js → layout-e7fbc2bf.js} +1 -1
  121. rasa/core/channels/inspector/dist/assets/{line-eb73cf26.js → line-a8aa457c.js} +1 -1
  122. rasa/core/channels/inspector/dist/assets/{linear-b3399f9a.js → linear-3351e0d2.js} +1 -1
  123. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-b095bf1a.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  124. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-07644b66.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  125. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-573a3f9c.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  126. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d457e1e1.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  127. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-9d26e1a2.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  128. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-3a9cde10.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  129. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-4f3e8cec.js → stateDiagram-587899a1-0e770395.js} +1 -1
  130. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-e617e5bf.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  131. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-eab30d2f.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  132. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-09994be2.js → styles-9a916d00-884a8b5b.js} +1 -1
  133. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-b7110364.js → styles-c10674c1-dc097813.js} +1 -1
  134. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-3ebc92ad.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  135. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-7d13d2f2.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  136. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-488385e1.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  137. rasa/core/channels/inspector/dist/index.html +1 -1
  138. rasa/core/channels/inspector/package.json +18 -18
  139. rasa/core/channels/inspector/src/App.tsx +29 -4
  140. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  141. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  142. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +7 -4
  143. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  144. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  145. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  146. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  147. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  148. rasa/core/channels/inspector/src/types.ts +21 -0
  149. rasa/core/channels/inspector/yarn.lock +336 -189
  150. rasa/core/channels/studio_chat.py +6 -6
  151. rasa/core/channels/telegram.py +4 -9
  152. rasa/core/channels/voice_stream/browser_audio.py +2 -0
  153. rasa/core/channels/voice_stream/genesys.py +1 -1
  154. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  155. rasa/core/channels/voice_stream/twilio_media_streams.py +5 -1
  156. rasa/core/channels/voice_stream/voice_channel.py +3 -0
  157. rasa/core/config/__init__.py +0 -0
  158. rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
  159. rasa/core/config/configuration.py +260 -0
  160. rasa/core/config/credentials.py +19 -0
  161. rasa/core/config/message_procesing_config.py +34 -0
  162. rasa/core/constants.py +5 -0
  163. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +88 -3
  164. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +2 -1
  165. rasa/core/lock_store.py +6 -4
  166. rasa/core/nlg/generator.py +1 -1
  167. rasa/core/policies/enterprise_search_policy.py +5 -3
  168. rasa/core/policies/flow_policy.py +4 -4
  169. rasa/core/policies/flows/agent_executor.py +632 -0
  170. rasa/core/policies/flows/flow_executor.py +137 -76
  171. rasa/core/policies/flows/mcp_tool_executor.py +298 -0
  172. rasa/core/policies/intentless_policy.py +1 -1
  173. rasa/core/policies/ted_policy.py +20 -12
  174. rasa/core/policies/unexpected_intent_policy.py +6 -0
  175. rasa/core/processor.py +68 -44
  176. rasa/core/redis_connection_factory.py +78 -20
  177. rasa/core/run.py +37 -8
  178. rasa/core/test.py +4 -0
  179. rasa/core/tracker_stores/sql_tracker_store.py +1 -1
  180. rasa/core/tracker_stores/tracker_store.py +3 -7
  181. rasa/core/train.py +1 -1
  182. rasa/core/training/interactive.py +20 -18
  183. rasa/core/training/story_conflict.py +5 -5
  184. rasa/core/utils.py +22 -23
  185. rasa/dialogue_understanding/commands/__init__.py +8 -0
  186. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  187. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  188. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  189. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  190. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  191. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  192. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  193. rasa/dialogue_understanding/commands/utils.py +124 -2
  194. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  195. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  196. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  197. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  198. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  199. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  200. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  201. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  202. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  203. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  204. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  205. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  206. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  207. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  208. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  209. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  210. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  211. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  212. rasa/dialogue_understanding/stack/utils.py +57 -3
  213. rasa/dialogue_understanding/utils.py +24 -4
  214. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  215. rasa/e2e_test/e2e_test_runner.py +13 -3
  216. rasa/engine/caching.py +2 -2
  217. rasa/engine/constants.py +1 -1
  218. rasa/engine/loader.py +12 -0
  219. rasa/engine/recipes/default_components.py +138 -49
  220. rasa/engine/recipes/default_recipe.py +108 -11
  221. rasa/engine/runner/dask.py +8 -5
  222. rasa/engine/validation.py +19 -6
  223. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  224. rasa/hooks.py +5 -5
  225. rasa/llm_fine_tuning/utils.py +2 -2
  226. rasa/model_training.py +60 -47
  227. rasa/nlu/classifiers/diet_classifier.py +198 -98
  228. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  229. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  230. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  231. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  232. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  233. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  234. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  235. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  236. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  237. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  238. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  239. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  240. rasa/nlu/selectors/response_selector.py +10 -2
  241. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  242. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  243. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  244. rasa/nlu/utils/mitie_utils.py +3 -0
  245. rasa/nlu/utils/spacy_utils.py +3 -2
  246. rasa/plugin.py +8 -8
  247. rasa/privacy/privacy_manager.py +12 -3
  248. rasa/server.py +15 -3
  249. rasa/shared/agents/__init__.py +0 -0
  250. rasa/shared/agents/auth/__init__.py +0 -0
  251. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  252. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  253. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  254. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  255. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  256. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  257. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
  258. rasa/shared/agents/auth/constants.py +12 -0
  259. rasa/shared/agents/auth/types.py +12 -0
  260. rasa/shared/agents/utils.py +35 -0
  261. rasa/shared/constants.py +8 -0
  262. rasa/shared/core/constants.py +16 -1
  263. rasa/shared/core/domain.py +0 -7
  264. rasa/shared/core/events.py +327 -0
  265. rasa/shared/core/flows/constants.py +5 -0
  266. rasa/shared/core/flows/flow.py +1 -1
  267. rasa/shared/core/flows/flows_list.py +21 -5
  268. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  269. rasa/shared/core/flows/steps/call.py +49 -5
  270. rasa/shared/core/flows/steps/collect.py +98 -13
  271. rasa/shared/core/flows/validation.py +372 -8
  272. rasa/shared/core/flows/yaml_flows_io.py +3 -2
  273. rasa/shared/core/slots.py +2 -2
  274. rasa/shared/core/trackers.py +5 -2
  275. rasa/shared/exceptions.py +16 -0
  276. rasa/shared/importers/rasa.py +1 -1
  277. rasa/shared/importers/utils.py +9 -3
  278. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  279. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  280. rasa/shared/providers/llm/llm_client.py +7 -3
  281. rasa/shared/providers/llm/llm_response.py +66 -0
  282. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  283. rasa/shared/utils/common.py +24 -0
  284. rasa/shared/utils/health_check/health_check.py +7 -3
  285. rasa/shared/utils/llm.py +39 -16
  286. rasa/shared/utils/mcp/__init__.py +0 -0
  287. rasa/shared/utils/mcp/server_connection.py +247 -0
  288. rasa/shared/utils/mcp/utils.py +20 -0
  289. rasa/shared/utils/schemas/events.py +42 -0
  290. rasa/shared/utils/yaml.py +3 -1
  291. rasa/studio/pull/pull.py +3 -2
  292. rasa/studio/train.py +8 -7
  293. rasa/studio/upload.py +3 -6
  294. rasa/telemetry.py +69 -5
  295. rasa/tracing/config.py +45 -12
  296. rasa/tracing/constants.py +14 -0
  297. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  298. rasa/tracing/instrumentation/instrumentation.py +626 -21
  299. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  300. rasa/tracing/instrumentation/metrics.py +32 -0
  301. rasa/tracing/metric_instrument_provider.py +68 -0
  302. rasa/utils/common.py +92 -1
  303. rasa/utils/endpoints.py +11 -2
  304. rasa/utils/log_utils.py +96 -5
  305. rasa/utils/ml_utils.py +1 -1
  306. rasa/utils/pypred.py +38 -0
  307. rasa/utils/tensorflow/__init__.py +7 -0
  308. rasa/utils/tensorflow/callback.py +136 -101
  309. rasa/utils/tensorflow/crf.py +1 -1
  310. rasa/utils/tensorflow/data_generator.py +21 -8
  311. rasa/utils/tensorflow/layers.py +21 -11
  312. rasa/utils/tensorflow/metrics.py +7 -3
  313. rasa/utils/tensorflow/models.py +56 -8
  314. rasa/utils/tensorflow/rasa_layers.py +8 -6
  315. rasa/utils/tensorflow/transformer.py +2 -3
  316. rasa/utils/train_utils.py +54 -24
  317. rasa/validator.py +17 -13
  318. rasa/version.py +1 -1
  319. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/METADATA +48 -42
  320. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/RECORD +323 -251
  321. rasa/builder/scrape_rasa_docs.py +0 -97
  322. rasa/cli/project_templates/finance/data/general/agent_details.yml +0 -6
  323. rasa/cli/project_templates/finance/domain/_system/patterns/pattern_session_start.yml +0 -11
  324. rasa/cli/project_templates/finance/domain/general/agent_details.yml +0 -31
  325. rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +0 -1
  326. rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +0 -1
  327. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +0 -1
  328. rasa/core/channels/inspector/dist/assets/index-c941dcb3.js +0 -1336
  329. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/NOTICE +0 -0
  330. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/WHEEL +0 -0
  331. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/entry_points.txt +0 -0
@@ -2648,6 +2648,333 @@ class FlowCancelled(SkipEventInMDStoryMixin):
2648
2648
  raise ValueError(f"Failed to parse flow_cancelled event. {e}")
2649
2649
 
2650
2650
 
2651
+ class AgentCompleted(SkipEventInMDStoryMixin):
2652
+ """Mark the completion of an agent."""
2653
+
2654
+ type_name = "agent_completed"
2655
+
2656
+ def __init__(
2657
+ self,
2658
+ agent_id: str,
2659
+ flow_id: str,
2660
+ status: Optional[str] = None,
2661
+ timestamp: Optional[float] = None,
2662
+ metadata: Optional[Dict[str, Any]] = None,
2663
+ ) -> None:
2664
+ self.agent_id = agent_id
2665
+ self.flow_id = flow_id
2666
+ self.status = status
2667
+ super().__init__(timestamp, metadata)
2668
+
2669
+ def __repr__(self) -> Text:
2670
+ """Returns event as string for debugging."""
2671
+ return (
2672
+ f"AgentCompleted(agent: {self.agent_id}, flow: {self.flow_id}, "
2673
+ f"status: {self.status})"
2674
+ )
2675
+
2676
+ def __str__(self) -> str:
2677
+ """Returns event as human-readable string."""
2678
+ return (
2679
+ f"{self.__class__.__name__}({self.agent_id}, {self.flow_id}, {self.status})"
2680
+ )
2681
+
2682
+ def __hash__(self) -> int:
2683
+ """Returns unique hash for event."""
2684
+ return hash((self.agent_id, self.flow_id, self.status))
2685
+
2686
+ def __eq__(self, other: Any) -> bool:
2687
+ """Compares object with other object."""
2688
+ if not isinstance(other, AgentCompleted):
2689
+ return NotImplemented
2690
+ return (self.agent_id, self.flow_id, self.status) == (
2691
+ other.agent_id,
2692
+ other.flow_id,
2693
+ other.status,
2694
+ )
2695
+
2696
+ def as_dict(self) -> Dict[str, Any]:
2697
+ """Returns serialized event."""
2698
+ serialized = super().as_dict()
2699
+ serialized.update(
2700
+ {"agent_id": self.agent_id, "flow_id": self.flow_id, "status": self.status}
2701
+ )
2702
+ return serialized
2703
+
2704
+ @classmethod
2705
+ def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentCompleted":
2706
+ if "agent_id" not in parameters:
2707
+ raise ValueError(
2708
+ "Failed to parse agent_completed event: agent_id is required"
2709
+ )
2710
+ if "flow_id" not in parameters:
2711
+ raise ValueError(
2712
+ "Failed to parse agent_completed event: flow_id is required"
2713
+ )
2714
+
2715
+ return AgentCompleted(
2716
+ parameters["agent_id"],
2717
+ parameters["flow_id"],
2718
+ parameters.get("status"),
2719
+ parameters.get("timestamp"),
2720
+ parameters.get("metadata"),
2721
+ )
2722
+
2723
+
2724
+ class AgentStarted(SkipEventInMDStoryMixin):
2725
+ """Mark the start of an agent."""
2726
+
2727
+ type_name = "agent_started"
2728
+
2729
+ def __init__(
2730
+ self,
2731
+ agent_id: str,
2732
+ flow_id: str,
2733
+ timestamp: Optional[float] = None,
2734
+ metadata: Optional[Dict[str, Any]] = None,
2735
+ context_id: Optional[str] = None,
2736
+ ) -> None:
2737
+ self.agent_id = agent_id
2738
+ self.flow_id = flow_id
2739
+ self.context_id = context_id
2740
+ super().__init__(timestamp, metadata)
2741
+
2742
+ def __repr__(self) -> str:
2743
+ """Returns event as string for debugging."""
2744
+ if self.context_id:
2745
+ return (
2746
+ f"AgentStarted(agent: {self.agent_id}, flow: {self.flow_id}, "
2747
+ f"context_id: {self.context_id})"
2748
+ )
2749
+ else:
2750
+ return f"AgentStarted(agent: {self.agent_id}, flow: {self.flow_id})"
2751
+
2752
+ def __str__(self) -> str:
2753
+ """Returns event as human-readable string."""
2754
+ return f"{self.__class__.__name__}({self.agent_id}, {self.flow_id})"
2755
+
2756
+ def __hash__(self) -> int:
2757
+ """Returns unique hash for event."""
2758
+ return hash((self.agent_id, self.flow_id))
2759
+
2760
+ def __eq__(self, other: Any) -> bool:
2761
+ """Compares object with other object."""
2762
+ if not isinstance(other, AgentStarted):
2763
+ return NotImplemented
2764
+ return (self.agent_id, self.flow_id) == (other.agent_id, other.flow_id)
2765
+
2766
+ def as_dict(self) -> Dict[str, Any]:
2767
+ """Returns serialized event."""
2768
+ serialized = super().as_dict()
2769
+ serialized.update({"agent_id": self.agent_id, "flow_id": self.flow_id})
2770
+ return serialized
2771
+
2772
+ @classmethod
2773
+ def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentStarted":
2774
+ if "agent_id" not in parameters:
2775
+ raise ValueError(
2776
+ "Failed to parse agent_started event: agent_id is required"
2777
+ )
2778
+ if "flow_id" not in parameters:
2779
+ raise ValueError("Failed to parse agent_started event: flow_id is required")
2780
+
2781
+ return AgentStarted(
2782
+ parameters["agent_id"],
2783
+ parameters["flow_id"],
2784
+ parameters.get("timestamp"),
2785
+ parameters.get("metadata"),
2786
+ )
2787
+
2788
+
2789
+ class AgentInterrupted(SkipEventInMDStoryMixin):
2790
+ """Mark the interruption of an agent."""
2791
+
2792
+ type_name = "agent_interrupted"
2793
+
2794
+ def __init__(
2795
+ self,
2796
+ agent_id: str,
2797
+ flow_id: str,
2798
+ timestamp: Optional[float] = None,
2799
+ metadata: Optional[Dict[str, Any]] = None,
2800
+ ) -> None:
2801
+ self.agent_id = agent_id
2802
+ self.flow_id = flow_id
2803
+ super().__init__(timestamp, metadata)
2804
+
2805
+ def __repr__(self) -> str:
2806
+ """Returns event as string for debugging."""
2807
+ return f"AgentInterrupted(agent: {self.agent_id}, flow: {self.flow_id})"
2808
+
2809
+ def __str__(self) -> str:
2810
+ """Returns event as human-readable string."""
2811
+ return f"{self.__class__.__name__}({self.agent_id}, {self.flow_id})"
2812
+
2813
+ def __hash__(self) -> int:
2814
+ """Returns unique hash for event."""
2815
+ return hash((self.agent_id, self.flow_id))
2816
+
2817
+ def __eq__(self, other: Any) -> bool:
2818
+ """Compares object with other object."""
2819
+ if not isinstance(other, AgentInterrupted):
2820
+ return NotImplemented
2821
+ return (self.agent_id, self.flow_id) == (other.agent_id, other.flow_id)
2822
+
2823
+ def as_dict(self) -> Dict[str, Any]:
2824
+ """Returns serialized event."""
2825
+ serialized = super().as_dict()
2826
+ serialized.update({"agent_id": self.agent_id, "flow_id": self.flow_id})
2827
+ return serialized
2828
+
2829
+ @classmethod
2830
+ def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentInterrupted":
2831
+ if "agent_id" not in parameters:
2832
+ raise ValueError(
2833
+ "Failed to parse agent_interrupted event: agent_id is required"
2834
+ )
2835
+ if "flow_id" not in parameters:
2836
+ raise ValueError(
2837
+ "Failed to parse agent_interrupted event: flow_id is required"
2838
+ )
2839
+
2840
+ return AgentInterrupted(
2841
+ parameters["agent_id"],
2842
+ parameters["flow_id"],
2843
+ parameters.get("timestamp"),
2844
+ parameters.get("metadata"),
2845
+ )
2846
+
2847
+
2848
+ class AgentCancelled(SkipEventInMDStoryMixin):
2849
+ """Mark the cancellation of an agent."""
2850
+
2851
+ type_name = "agent_cancelled"
2852
+
2853
+ def __init__(
2854
+ self,
2855
+ agent_id: str,
2856
+ flow_id: str,
2857
+ reason: Optional[str] = None,
2858
+ timestamp: Optional[float] = None,
2859
+ metadata: Optional[Dict[str, Any]] = None,
2860
+ ) -> None:
2861
+ self.agent_id = agent_id
2862
+ self.flow_id = flow_id
2863
+ self.reason = reason
2864
+ super().__init__(timestamp, metadata)
2865
+
2866
+ def __repr__(self) -> str:
2867
+ """Returns event as string for debugging."""
2868
+ return (
2869
+ f"AgentCancelled(agent: {self.agent_id}, flow: {self.flow_id}, "
2870
+ f"reason: {self.reason})"
2871
+ )
2872
+
2873
+ def __str__(self) -> str:
2874
+ """Returns event as human-readable string."""
2875
+ return (
2876
+ f"{self.__class__.__name__}({self.agent_id}, {self.flow_id}, {self.reason})"
2877
+ )
2878
+
2879
+ def __hash__(self) -> int:
2880
+ """Returns unique hash for event."""
2881
+ return hash((self.agent_id, self.flow_id, self.reason))
2882
+
2883
+ def __eq__(self, other: Any) -> bool:
2884
+ """Compares object with other object."""
2885
+ if not isinstance(other, AgentCancelled):
2886
+ return NotImplemented
2887
+ return (self.agent_id, self.flow_id, self.reason) == (
2888
+ other.agent_id,
2889
+ other.flow_id,
2890
+ other.reason,
2891
+ )
2892
+
2893
+ def as_dict(self) -> Dict[str, Any]:
2894
+ """Returns serialized event."""
2895
+ serialized = super().as_dict()
2896
+ serialized.update(
2897
+ {"agent_id": self.agent_id, "flow_id": self.flow_id, "reason": self.reason}
2898
+ )
2899
+ return serialized
2900
+
2901
+ @classmethod
2902
+ def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentCancelled":
2903
+ if "agent_id" not in parameters:
2904
+ raise ValueError(
2905
+ "Failed to parse agent_cancelled event: agent_id is required"
2906
+ )
2907
+ if "flow_id" not in parameters:
2908
+ raise ValueError(
2909
+ "Failed to parse agent_cancelled event: flow_id is required"
2910
+ )
2911
+
2912
+ return AgentCancelled(
2913
+ parameters["agent_id"],
2914
+ parameters["flow_id"],
2915
+ parameters.get("reason"),
2916
+ parameters.get("timestamp"),
2917
+ parameters.get("metadata"),
2918
+ )
2919
+
2920
+
2921
+ class AgentResumed(SkipEventInMDStoryMixin):
2922
+ """Mark the resumption of an agent."""
2923
+
2924
+ type_name = "agent_resumed"
2925
+
2926
+ def __init__(
2927
+ self,
2928
+ agent_id: str,
2929
+ flow_id: str,
2930
+ timestamp: Optional[float] = None,
2931
+ metadata: Optional[Dict[str, Any]] = None,
2932
+ ) -> None:
2933
+ self.agent_id = agent_id
2934
+ self.flow_id = flow_id
2935
+ super().__init__(timestamp, metadata)
2936
+
2937
+ def __repr__(self) -> str:
2938
+ """Returns event as string for debugging."""
2939
+ return f"AgentResumed(agent: {self.agent_id}, flow: {self.flow_id})"
2940
+
2941
+ def __str__(self) -> str:
2942
+ """Returns event as human-readable string."""
2943
+ return f"{self.__class__.__name__}({self.agent_id}, {self.flow_id})"
2944
+
2945
+ def __hash__(self) -> int:
2946
+ """Returns unique hash for event."""
2947
+ return hash((self.agent_id, self.flow_id))
2948
+
2949
+ def __eq__(self, other: Any) -> bool:
2950
+ """Compares object with other object."""
2951
+ if not isinstance(other, AgentResumed):
2952
+ return NotImplemented
2953
+ return (self.agent_id, self.flow_id) == (other.agent_id, other.flow_id)
2954
+
2955
+ def as_dict(self) -> Dict[str, Any]:
2956
+ """Returns serialized event."""
2957
+ serialized = super().as_dict()
2958
+ serialized.update({"agent_id": self.agent_id, "flow_id": self.flow_id})
2959
+ return serialized
2960
+
2961
+ @classmethod
2962
+ def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentResumed":
2963
+ if "agent_id" not in parameters:
2964
+ raise ValueError(
2965
+ "Failed to parse agent_resumed event: agent_id is required"
2966
+ )
2967
+ if "flow_id" not in parameters:
2968
+ raise ValueError("Failed to parse agent_resumed event: flow_id is required")
2969
+
2970
+ return AgentResumed(
2971
+ parameters["agent_id"],
2972
+ parameters["flow_id"],
2973
+ parameters.get("timestamp"),
2974
+ parameters.get("metadata"),
2975
+ )
2976
+
2977
+
2651
2978
  class SessionEnded(AlwaysEqualEventMixin):
2652
2979
  """Mark the end of a conversation session."""
2653
2980
 
@@ -11,3 +11,8 @@ KEY_RUN_PATTERN_COMPLETED = "run_pattern_completed"
11
11
  KEY_TRANSLATION = "translation"
12
12
  KEY_CALLED_FLOW = "called_flow"
13
13
  KEY_LINKED_FLOW = "linked_flow"
14
+
15
+ # MCP mapping field names
16
+ KEY_MAPPING_INPUT = "input"
17
+ KEY_MAPPING_OUTPUT = "output"
18
+ KEY_MAPPING_SLOT = "slot"
@@ -8,7 +8,6 @@ from typing import Any, Dict, List, Optional, Set, Text, Tuple, Union
8
8
 
9
9
  import structlog
10
10
  from pydantic import BaseModel
11
- from pypred import Predicate
12
11
 
13
12
  import rasa.shared.utils.io
14
13
  from rasa.engine.language import Language
@@ -53,6 +52,7 @@ from rasa.shared.core.flows.steps.constants import (
53
52
  )
54
53
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
55
54
  from rasa.shared.core.slots import Slot
55
+ from rasa.utils.pypred import Predicate
56
56
 
57
57
  structlogger = structlog.get_logger()
58
58
 
@@ -2,17 +2,21 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from pathlib import Path
5
- from typing import Any, Dict, Generator, List, Optional, Set, Text, Union
5
+ from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Set, Text, Union
6
6
 
7
7
  import rasa.shared.utils.io
8
8
  from rasa.shared.core.flows import Flow
9
9
  from rasa.shared.core.flows.flow_path import FlowPathsList
10
10
  from rasa.shared.core.flows.validation import (
11
11
  DuplicatedFlowIdException,
12
- validate_called_flows_exists,
12
+ validate_call_steps,
13
+ validate_exit_if_conditions,
14
+ validate_exit_if_exclusivity,
13
15
  validate_flow,
14
16
  validate_link_in_call_restriction,
15
17
  validate_linked_flows_exists,
18
+ validate_mcp_mapping_slots,
19
+ validate_mcp_server_references,
16
20
  validate_nlu_trigger,
17
21
  validate_patterns_are_not_called_or_linked,
18
22
  validate_patterns_are_not_calling_or_linking_other_flows,
@@ -20,6 +24,9 @@ from rasa.shared.core.flows.validation import (
20
24
  )
21
25
  from rasa.shared.core.slots import Slot
22
26
 
27
+ if TYPE_CHECKING:
28
+ from rasa.shared.core.domain import Domain
29
+
23
30
 
24
31
  @dataclass
25
32
  class FlowsList:
@@ -160,17 +167,26 @@ class FlowsList:
160
167
  else:
161
168
  return None
162
169
 
163
- def validate(self) -> None:
164
- """Validate the flows."""
170
+ def validate(self, domain: Optional["Domain"] = None) -> None:
171
+ """Validate the flows.
172
+
173
+ Args:
174
+ domain: Optional domain containing slot definitions. If provided,
175
+ exit_if conditions will be validated against defined slots.
176
+ """
165
177
  for flow in self.underlying_flows:
166
178
  validate_flow(flow)
167
179
  validate_nlu_trigger(self.underlying_flows)
168
180
  validate_link_in_call_restriction(self)
169
- validate_called_flows_exists(self)
181
+ validate_call_steps(self)
182
+ validate_mcp_server_references(self)
183
+ validate_mcp_mapping_slots(self, domain)
170
184
  validate_linked_flows_exists(self)
171
185
  validate_patterns_are_not_called_or_linked(self)
172
186
  validate_patterns_are_not_calling_or_linking_other_flows(self)
173
187
  validate_step_ids_are_unique(self)
188
+ validate_exit_if_conditions(self, domain)
189
+ validate_exit_if_exclusivity(self)
174
190
 
175
191
  @property
176
192
  def user_flow_ids(self) -> Set[str]: