rasa-pro 3.14.0.dev20250922__py3-none-any.whl → 3.14.0rc2__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 (304) 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/copilot/constants.py +4 -1
  30. rasa/builder/copilot/copilot.py +155 -79
  31. rasa/builder/copilot/models.py +304 -108
  32. rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
  33. rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
  34. rasa/builder/guardrails/constants.py +3 -0
  35. rasa/builder/guardrails/models.py +45 -10
  36. rasa/builder/guardrails/policy_checker.py +324 -0
  37. rasa/builder/guardrails/utils.py +42 -276
  38. rasa/builder/jobs.py +182 -12
  39. rasa/builder/llm_service.py +32 -5
  40. rasa/builder/models.py +13 -3
  41. rasa/builder/project_generator.py +6 -1
  42. rasa/builder/service.py +31 -15
  43. rasa/builder/training_service.py +18 -24
  44. rasa/builder/validation_service.py +1 -1
  45. rasa/cli/arguments/default_arguments.py +12 -0
  46. rasa/cli/arguments/run.py +2 -0
  47. rasa/cli/arguments/train.py +2 -0
  48. rasa/cli/data.py +10 -8
  49. rasa/cli/dialogue_understanding_test.py +10 -7
  50. rasa/cli/e2e_test.py +9 -6
  51. rasa/cli/evaluate.py +4 -2
  52. rasa/cli/export.py +5 -2
  53. rasa/cli/inspect.py +8 -4
  54. rasa/cli/interactive.py +5 -4
  55. rasa/cli/llm_fine_tuning.py +11 -6
  56. rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
  57. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  58. rasa/cli/run.py +12 -10
  59. rasa/cli/scaffold.py +4 -4
  60. rasa/cli/shell.py +9 -5
  61. rasa/cli/studio/studio.py +1 -1
  62. rasa/cli/test.py +34 -14
  63. rasa/cli/train.py +41 -28
  64. rasa/cli/utils.py +1 -393
  65. rasa/cli/validation/__init__.py +0 -0
  66. rasa/cli/validation/bot_config.py +223 -0
  67. rasa/cli/validation/config_path_validation.py +257 -0
  68. rasa/cli/x.py +8 -4
  69. rasa/constants.py +7 -1
  70. rasa/core/actions/action.py +51 -10
  71. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  72. rasa/core/agent.py +19 -2
  73. rasa/core/available_agents.py +229 -0
  74. rasa/core/brokers/kafka.py +5 -1
  75. rasa/core/channels/__init__.py +82 -35
  76. rasa/core/channels/development_inspector.py +3 -3
  77. rasa/core/channels/inspector/README.md +25 -13
  78. rasa/core/channels/inspector/dist/assets/{arc-35222594.js → arc-6177260a.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-a0efbfd3.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-0584c0f2.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  82. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-39f40dbe.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-1ad755f3.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  85. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-b0f4f0fe.js → createText-2e5e7dd3-088372e2.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-9039bff9.js → edges-e0da2a9e-58676240.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-65c9b127.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4f08b38e.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-e95c362a.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  91. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-703c3015.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-699328ea.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-04cf4b05.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/{graph-ee94449e.js → graph-0a6f8466.js} +1 -1
  95. rasa/core/channels/inspector/dist/assets/{index-3862675e-940162b4.js → index-3862675e-7610671a.js} +1 -1
  96. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  97. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-c79c2866.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-84489d30.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  99. rasa/core/channels/inspector/dist/assets/{layout-a9aa9858.js → layout-e7fbc2bf.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{line-eb73cf26.js → line-a8aa457c.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{linear-b3399f9a.js → linear-3351e0d2.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-b095bf1a.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  103. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-07644b66.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-573a3f9c.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d457e1e1.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  106. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-9d26e1a2.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  107. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-3a9cde10.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  108. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-4f3e8cec.js → stateDiagram-587899a1-0e770395.js} +1 -1
  109. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-e617e5bf.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  110. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-eab30d2f.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  111. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-09994be2.js → styles-9a916d00-884a8b5b.js} +1 -1
  112. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-b7110364.js → styles-c10674c1-dc097813.js} +1 -1
  113. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-3ebc92ad.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  114. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-7d13d2f2.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  115. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-488385e1.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  116. rasa/core/channels/inspector/dist/index.html +1 -1
  117. rasa/core/channels/inspector/package.json +18 -18
  118. rasa/core/channels/inspector/src/App.tsx +29 -4
  119. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  120. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  121. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +7 -4
  122. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  123. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  124. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  125. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  126. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  127. rasa/core/channels/inspector/src/types.ts +21 -0
  128. rasa/core/channels/inspector/yarn.lock +336 -189
  129. rasa/core/channels/studio_chat.py +6 -6
  130. rasa/core/channels/telegram.py +4 -9
  131. rasa/core/channels/voice_stream/genesys.py +1 -1
  132. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  133. rasa/core/channels/voice_stream/twilio_media_streams.py +5 -1
  134. rasa/core/channels/voice_stream/voice_channel.py +3 -0
  135. rasa/core/concurrent_lock_store.py +38 -21
  136. rasa/core/config/__init__.py +0 -0
  137. rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
  138. rasa/core/config/configuration.py +260 -0
  139. rasa/core/config/credentials.py +19 -0
  140. rasa/core/config/message_procesing_config.py +34 -0
  141. rasa/core/constants.py +10 -0
  142. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +69 -4
  143. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +2 -1
  144. rasa/core/lock_store.py +4 -0
  145. rasa/core/policies/enterprise_search_policy.py +5 -3
  146. rasa/core/policies/flow_policy.py +4 -4
  147. rasa/core/policies/flows/agent_executor.py +632 -0
  148. rasa/core/policies/flows/flow_executor.py +136 -75
  149. rasa/core/policies/flows/mcp_tool_executor.py +298 -0
  150. rasa/core/policies/intentless_policy.py +1 -1
  151. rasa/core/policies/ted_policy.py +20 -12
  152. rasa/core/policies/unexpected_intent_policy.py +6 -0
  153. rasa/core/processor.py +68 -44
  154. rasa/core/redis_connection_factory.py +7 -2
  155. rasa/core/run.py +37 -8
  156. rasa/core/test.py +4 -0
  157. rasa/core/tracker_stores/redis_tracker_store.py +4 -0
  158. rasa/core/tracker_stores/sql_tracker_store.py +3 -1
  159. rasa/core/tracker_stores/tracker_store.py +3 -7
  160. rasa/core/train.py +1 -1
  161. rasa/core/training/interactive.py +20 -18
  162. rasa/core/training/story_conflict.py +5 -5
  163. rasa/core/utils.py +22 -23
  164. rasa/dialogue_understanding/commands/__init__.py +8 -0
  165. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  166. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  167. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  168. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  169. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  170. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  171. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  172. rasa/dialogue_understanding/commands/utils.py +124 -2
  173. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  174. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  175. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  176. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  177. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  178. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  179. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  180. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  181. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  182. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  183. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  184. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  185. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  186. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  187. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  188. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  189. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  190. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  191. rasa/dialogue_understanding/stack/utils.py +57 -3
  192. rasa/dialogue_understanding/utils.py +24 -4
  193. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  194. rasa/e2e_test/e2e_test_runner.py +13 -3
  195. rasa/engine/caching.py +2 -2
  196. rasa/engine/constants.py +1 -1
  197. rasa/engine/recipes/default_components.py +138 -49
  198. rasa/engine/recipes/default_recipe.py +108 -11
  199. rasa/engine/runner/dask.py +8 -5
  200. rasa/engine/validation.py +19 -6
  201. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  202. rasa/hooks.py +5 -5
  203. rasa/llm_fine_tuning/utils.py +2 -2
  204. rasa/model_training.py +60 -47
  205. rasa/nlu/classifiers/diet_classifier.py +198 -98
  206. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  207. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  208. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  209. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  210. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  211. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  212. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  213. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  214. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  215. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  216. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  217. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  218. rasa/nlu/selectors/response_selector.py +10 -2
  219. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  220. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  221. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  222. rasa/nlu/utils/mitie_utils.py +3 -0
  223. rasa/nlu/utils/spacy_utils.py +3 -2
  224. rasa/plugin.py +8 -8
  225. rasa/privacy/privacy_manager.py +12 -3
  226. rasa/server.py +15 -3
  227. rasa/shared/agents/__init__.py +0 -0
  228. rasa/shared/agents/auth/__init__.py +0 -0
  229. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  230. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  231. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  232. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  233. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  234. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  235. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
  236. rasa/shared/agents/auth/constants.py +12 -0
  237. rasa/shared/agents/auth/types.py +12 -0
  238. rasa/shared/agents/utils.py +35 -0
  239. rasa/shared/constants.py +8 -0
  240. rasa/shared/core/constants.py +16 -1
  241. rasa/shared/core/domain.py +0 -7
  242. rasa/shared/core/events.py +327 -0
  243. rasa/shared/core/flows/constants.py +5 -0
  244. rasa/shared/core/flows/flows_list.py +21 -5
  245. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  246. rasa/shared/core/flows/steps/call.py +49 -5
  247. rasa/shared/core/flows/steps/collect.py +98 -13
  248. rasa/shared/core/flows/validation.py +372 -8
  249. rasa/shared/core/flows/yaml_flows_io.py +3 -2
  250. rasa/shared/core/slots.py +2 -2
  251. rasa/shared/core/trackers.py +5 -2
  252. rasa/shared/exceptions.py +16 -0
  253. rasa/shared/importers/rasa.py +1 -1
  254. rasa/shared/importers/utils.py +9 -3
  255. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  256. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  257. rasa/shared/providers/llm/llm_client.py +7 -3
  258. rasa/shared/providers/llm/llm_response.py +66 -0
  259. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  260. rasa/shared/utils/common.py +24 -0
  261. rasa/shared/utils/health_check/health_check.py +7 -3
  262. rasa/shared/utils/llm.py +39 -16
  263. rasa/shared/utils/mcp/__init__.py +0 -0
  264. rasa/shared/utils/mcp/server_connection.py +247 -0
  265. rasa/shared/utils/mcp/utils.py +20 -0
  266. rasa/shared/utils/schemas/events.py +42 -0
  267. rasa/shared/utils/yaml.py +3 -1
  268. rasa/studio/pull/pull.py +3 -2
  269. rasa/studio/train.py +8 -7
  270. rasa/studio/upload.py +3 -6
  271. rasa/telemetry.py +69 -5
  272. rasa/tracing/config.py +45 -12
  273. rasa/tracing/constants.py +14 -0
  274. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  275. rasa/tracing/instrumentation/instrumentation.py +626 -21
  276. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  277. rasa/tracing/instrumentation/metrics.py +32 -0
  278. rasa/tracing/metric_instrument_provider.py +68 -0
  279. rasa/utils/common.py +92 -1
  280. rasa/utils/endpoints.py +11 -2
  281. rasa/utils/log_utils.py +96 -5
  282. rasa/utils/ml_utils.py +1 -1
  283. rasa/utils/tensorflow/__init__.py +7 -0
  284. rasa/utils/tensorflow/callback.py +136 -101
  285. rasa/utils/tensorflow/crf.py +1 -1
  286. rasa/utils/tensorflow/data_generator.py +21 -8
  287. rasa/utils/tensorflow/layers.py +21 -11
  288. rasa/utils/tensorflow/metrics.py +7 -3
  289. rasa/utils/tensorflow/models.py +56 -8
  290. rasa/utils/tensorflow/rasa_layers.py +8 -6
  291. rasa/utils/tensorflow/transformer.py +2 -3
  292. rasa/utils/train_utils.py +54 -24
  293. rasa/validator.py +5 -5
  294. rasa/version.py +1 -1
  295. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/METADATA +47 -41
  296. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/RECORD +299 -238
  297. rasa/builder/scrape_rasa_docs.py +0 -97
  298. rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +0 -1
  299. rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +0 -1
  300. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +0 -1
  301. rasa/core/channels/inspector/dist/assets/index-c941dcb3.js +0 -1336
  302. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/NOTICE +0 -0
  303. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/WHEEL +0 -0
  304. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/entry_points.txt +0 -0
rasa/builder/models.py CHANGED
@@ -136,12 +136,14 @@ class JobStatusEvent(ServerSentEvent):
136
136
  cls,
137
137
  status: str,
138
138
  message: Optional[str] = None,
139
+ payload: Optional[Dict[str, Any]] = None,
139
140
  ) -> "JobStatusEvent":
140
141
  """Factory for job-status events.
141
142
 
142
143
  Args:
143
144
  status: The job status (e.g. "training", "train_success").
144
145
  message: Optional error message for error events.
146
+ payload: Optional additional payload data to include in the event.
145
147
 
146
148
  Returns:
147
149
  A JobStatusEvent instance with the appropriate event type and data.
@@ -150,11 +152,13 @@ class JobStatusEvent(ServerSentEvent):
150
152
  ServerSentEventType.error if message else ServerSentEventType.progress
151
153
  )
152
154
 
153
- payload: Dict[str, Any] = {"status": status}
155
+ event_payload: Dict[str, Any] = {"status": status}
154
156
  if message:
155
- payload["message"] = message
157
+ event_payload["message"] = message
158
+ if payload:
159
+ event_payload.update(payload)
156
160
 
157
- return cls(event=event_type.value, data=payload)
161
+ return cls(event=event_type.value, data=event_payload)
158
162
 
159
163
 
160
164
  class ValidationResult(BaseModel):
@@ -193,6 +197,11 @@ class JobStatus(str, Enum):
193
197
  validation_success = "validation_success"
194
198
  validation_error = "validation_error"
195
199
 
200
+ copilot_analysis_start = "copilot_analysis_start"
201
+ copilot_analyzing = "copilot_analyzing"
202
+ copilot_analysis_success = "copilot_analysis_success"
203
+ copilot_analysis_error = "copilot_analysis_error"
204
+
196
205
 
197
206
  class JobCreateResponse(BaseModel):
198
207
  job_id: str = Field(...)
@@ -206,6 +215,7 @@ class TrainingInput(BaseModel):
206
215
 
207
216
  importer: TrainingDataImporter = Field(..., description="Training data importer")
208
217
  endpoints_file: Path = Field(..., description="Path to the endpoints file")
218
+ config_file: Path = Field(..., description="Path to the config file")
209
219
 
210
220
 
211
221
  class AgentStatus(str, Enum):
@@ -192,11 +192,16 @@ class ProjectGenerator:
192
192
  """Get the endpoints file."""
193
193
  return self.project_folder / "endpoints.yml"
194
194
 
195
+ def _get_config_file(self) -> Path:
196
+ """Get the config file."""
197
+ return self.project_folder / "config.yml"
198
+
195
199
  def get_training_input(self) -> TrainingInput:
196
200
  """Get the training input."""
197
201
  return TrainingInput(
198
202
  importer=self._create_importer(),
199
203
  endpoints_file=self._get_endpoints_file(),
204
+ config_file=self._get_config_file(),
200
205
  )
201
206
 
202
207
  def _create_importer(self) -> TrainingDataImporter:
@@ -208,7 +213,7 @@ class ProjectGenerator:
208
213
  domain_path = self.project_folder / "domain"
209
214
 
210
215
  return TrainingDataImporter.load_from_config(
211
- config_path=str(self.project_folder / "config.yml"),
216
+ config_path=str(self._get_config_file()),
212
217
  domain_path=str(domain_path),
213
218
  training_data_paths=[str(self.project_folder / "data")],
214
219
  args={},
rasa/builder/service.py CHANGED
@@ -17,6 +17,8 @@ from rasa.builder.config import (
17
17
  COPILOT_HANDLER_ROLLING_BUFFER_SIZE,
18
18
  GUARDRAILS_ENABLE_BLOCKING,
19
19
  HELLO_RASA_PROJECT_ID,
20
+ LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
21
+ LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
20
22
  )
21
23
  from rasa.builder.copilot.constants import ROLE_USER, SIGNATURE_VERSION_V1
22
24
  from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
@@ -47,10 +49,6 @@ from rasa.builder.guardrails.constants import (
47
49
  BlockScope,
48
50
  )
49
51
  from rasa.builder.guardrails.store import guardrails_store
50
- from rasa.builder.guardrails.utils import (
51
- check_assistant_chat_for_policy_violations,
52
- check_copilot_chat_for_policy_violations,
53
- )
54
52
  from rasa.builder.job_manager import job_manager
55
53
  from rasa.builder.jobs import (
56
54
  run_prompt_to_bot_job,
@@ -534,7 +532,19 @@ async def get_bot_files(request: Request) -> HTTPResponse:
534
532
  "**Error Events (can occur at any time):**\n"
535
533
  "- `validation_error` - Bot configuration files are invalid\n"
536
534
  "- `train_error` - Files updated but training failed\n"
535
+ "- `copilot_analysis_start` - Copilot analysis started (includes `copilot_job_id` "
536
+ "in payload)\n"
537
537
  "- `error` - Unexpected error occurred\n\n"
538
+ "**Copilot Analysis Events:**\n"
539
+ "When training or validation fails, a separate copilot analysis job is "
540
+ "automatically started. The `copilot_analysis_start` event includes a "
541
+ "`copilot_job_id` in the payload.\nConnect to `/job-events/<copilot_job_id>` to "
542
+ "receive the following events:\n"
543
+ "- `copilot_analyzing` - Copilot is analyzing errors and providing suggestions. "
544
+ "Uses the same SSE event payload format as the `/copilot` endpoint with `content`, "
545
+ "`response_category`, and `completeness` fields.\n"
546
+ "- `copilot_analysis_success` - Copilot analysis completed with references.\n"
547
+ "- `copilot_analysis_error` - Copilot analysis failed\n\n"
538
548
  "**Usage:**\n"
539
549
  "1. Send POST request with Content-Type: application/json\n"
540
550
  "2. The response will be a JSON object `{job_id: ...}`\n"
@@ -1044,7 +1054,8 @@ async def copilot(request: Request) -> None:
1044
1054
  # Offload telemetry logging to a background task
1045
1055
  request.app.add_task(
1046
1056
  asyncio.to_thread(
1047
- telemetry.log_user_turn, req.last_message.get_text_content()
1057
+ telemetry.log_user_turn,
1058
+ req.last_message.get_flattened_text_content(),
1048
1059
  )
1049
1060
  )
1050
1061
 
@@ -1081,11 +1092,15 @@ async def copilot(request: Request) -> None:
1081
1092
  tracker_context = TrackerContext.from_tracker(
1082
1093
  tracker, max_turns=COPILOT_ASSISTANT_TRACKER_MAX_TURNS
1083
1094
  )
1084
- if tracker_context is not None:
1085
- tracker_context = await check_assistant_chat_for_policy_violations(
1095
+ if (
1096
+ tracker_context is not None
1097
+ and llm_service.guardrails_policy_checker is not None
1098
+ ):
1099
+ tracker_context = await llm_service.guardrails_policy_checker.check_assistant_chat_for_policy_violations( # noqa: E501
1086
1100
  tracker_context=tracker_context,
1087
1101
  hello_rasa_user_id=user_id,
1088
1102
  hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
1103
+ lakera_project_id=LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
1089
1104
  )
1090
1105
 
1091
1106
  # Copilot doesn't need to know about the docs and any file that is not a core
@@ -1103,13 +1118,14 @@ async def copilot(request: Request) -> None:
1103
1118
 
1104
1119
  # 5. Run guardrail policy checks. If any policy violations are detected,
1105
1120
  # send a response and end the stream.
1106
- guardrail_response: Optional[
1107
- GeneratedContent
1108
- ] = await check_copilot_chat_for_policy_violations(
1109
- context=context,
1110
- hello_rasa_user_id=user_id,
1111
- hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
1112
- )
1121
+ guardrail_response: Optional[GeneratedContent] = None
1122
+ if llm_service.guardrails_policy_checker is not None:
1123
+ guardrail_response = await llm_service.guardrails_policy_checker.check_copilot_chat_for_policy_violations( # noqa: E501
1124
+ context=context,
1125
+ hello_rasa_user_id=user_id,
1126
+ hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
1127
+ lakera_project_id=LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
1128
+ )
1113
1129
  if guardrail_response is not None:
1114
1130
  blocked_or_violation_message = (
1115
1131
  await _handle_guardrail_violation_and_maybe_block(
@@ -1156,7 +1172,7 @@ async def copilot(request: Request) -> None:
1156
1172
  system_message=generation_context.system_message,
1157
1173
  chat_history=generation_context.chat_history,
1158
1174
  last_user_message=(
1159
- req.last_message.get_text_content()
1175
+ req.last_message.get_flattened_text_content()
1160
1176
  if (req.last_message and req.last_message.role == ROLE_USER)
1161
1177
  else None
1162
1178
  ),
@@ -11,9 +11,10 @@ from rasa.builder.exceptions import AgentLoadError, TrainingError
11
11
  from rasa.builder.models import TrainingInput
12
12
  from rasa.core.agent import Agent, load_agent
13
13
  from rasa.core.channels.studio_chat import StudioChatInput
14
- from rasa.core.utils import AvailableEndpoints, read_endpoints_from_path
14
+ from rasa.core.config.configuration import Configuration
15
15
  from rasa.model import get_latest_model
16
16
  from rasa.model_training import TrainingResult, train
17
+ from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH
17
18
  from rasa.shared.importers.importer import TrainingDataImporter
18
19
 
19
20
  structlogger = structlog.get_logger()
@@ -42,14 +43,13 @@ async def train_and_load_agent(input: TrainingInput) -> Agent:
42
43
  AgentLoadError: If agent loading fails
43
44
  """
44
45
  try:
45
- # Setup endpoints for training validation
46
- await _setup_endpoints(input.endpoints_file)
47
-
48
46
  # Train the model
49
- training_result = await _train_model(input.importer)
47
+ training_result = await _train_model(
48
+ input.importer, input.endpoints_file, input.config_file
49
+ )
50
50
 
51
51
  # Load the agent
52
- agent_instance = await _load_agent(training_result.model)
52
+ agent_instance = await _load_agent(training_result.model, input.endpoints_file)
53
53
 
54
54
  # Verify agent is ready
55
55
  if not agent_instance.is_ready():
@@ -96,7 +96,9 @@ async def try_load_existing_agent(project_folder: str) -> Optional[Agent]:
96
96
  )
97
97
 
98
98
  # Get available endpoints for agent loading
99
- available_endpoints = AvailableEndpoints.get_instance()
99
+ available_endpoints = Configuration.initialise_endpoints(
100
+ endpoints_path=Path(project_folder) / DEFAULT_ENDPOINTS_PATH
101
+ ).endpoints
100
102
 
101
103
  # Load the agent
102
104
  agent = await load_agent(
@@ -124,27 +126,17 @@ async def try_load_existing_agent(project_folder: str) -> Optional[Agent]:
124
126
  return None
125
127
 
126
128
 
127
- async def _setup_endpoints(endpoints_file: Path) -> None:
128
- """Setup endpoints configuration for training."""
129
- try:
130
- # Reset and load endpoints
131
- AvailableEndpoints.reset_instance()
132
- read_endpoints_from_path(endpoints_file)
133
-
134
- structlogger.debug("training.endpoints_setup", endpoints_file=endpoints_file)
135
-
136
- except Exception as e:
137
- raise TrainingError(f"Failed to setup endpoints: {e}")
138
-
139
-
140
- async def _train_model(importer: TrainingDataImporter) -> TrainingResult:
129
+ async def _train_model(
130
+ importer: TrainingDataImporter, endpoints_file: Path, config_file: Path
131
+ ) -> TrainingResult:
141
132
  """Train the Rasa model."""
142
133
  try:
143
134
  structlogger.info("training.started")
144
135
 
145
136
  training_result = await train(
146
137
  domain="",
147
- config="",
138
+ config=str(config_file),
139
+ endpoints=str(endpoints_file),
148
140
  training_files=None,
149
141
  file_importer=importer,
150
142
  )
@@ -160,12 +152,14 @@ async def _train_model(importer: TrainingDataImporter) -> TrainingResult:
160
152
  raise TrainingError(f"Model training failed: {e}")
161
153
 
162
154
 
163
- async def _load_agent(model_path: str) -> Agent:
155
+ async def _load_agent(model_path: str, endpoints_file: Path) -> Agent:
164
156
  """Load the trained agent."""
165
157
  try:
166
158
  structlogger.info("training.loading_agent", model_path=model_path)
167
159
 
168
- available_endpoints = AvailableEndpoints.get_instance()
160
+ available_endpoints = Configuration.initialise_endpoints(
161
+ endpoints_path=endpoints_file
162
+ ).endpoints
169
163
  if available_endpoints is None:
170
164
  raise AgentLoadError("No endpoints available for agent loading")
171
165
 
@@ -9,7 +9,7 @@ import structlog
9
9
  from rasa.builder import config
10
10
  from rasa.builder.exceptions import ValidationError
11
11
  from rasa.builder.logging_utils import capture_validation_logs
12
- from rasa.cli.utils import validate_files
12
+ from rasa.cli.validation.bot_config import validate_files
13
13
  from rasa.shared.importers.importer import TrainingDataImporter
14
14
 
15
15
  structlogger = structlog.get_logger()
@@ -3,6 +3,7 @@ import logging
3
3
  from enum import Enum
4
4
  from typing import List, Optional, Text, Union
5
5
 
6
+ from rasa.core.constants import DEFAULT_SUB_AGENTS
6
7
  from rasa.core.persistor import RemoteStorageType, StorageType, parse_remote_storage
7
8
  from rasa.shared.constants import (
8
9
  DEFAULT_CONFIG_PATH,
@@ -217,3 +218,14 @@ def add_skip_validation_flag(
217
218
  action="append",
218
219
  help="Skip YAML validation for selected parts of the training data.",
219
220
  )
221
+
222
+
223
+ def add_sub_agents_param(
224
+ parser: Union[argparse.ArgumentParser, argparse._ActionsContainer],
225
+ ) -> None:
226
+ parser.add_argument(
227
+ "--sub-agents",
228
+ type=str,
229
+ default=DEFAULT_SUB_AGENTS,
230
+ help="Directory that specifies sub-agents to use (default: %(default)s).",
231
+ )
rasa/cli/arguments/run.py CHANGED
@@ -7,6 +7,7 @@ from rasa.cli.arguments.default_arguments import (
7
7
  add_model_param,
8
8
  add_remote_storage_param,
9
9
  add_skip_validation_flag,
10
+ add_sub_agents_param,
10
11
  )
11
12
  from rasa.core import constants
12
13
  from rasa.env import (
@@ -24,6 +25,7 @@ def set_run_arguments(parser: argparse.ArgumentParser) -> None:
24
25
  add_server_arguments(parser)
25
26
  add_inspect_argument(parser)
26
27
  add_skip_validation_flag(parser)
28
+ add_sub_agents_param(parser)
27
29
 
28
30
 
29
31
  def set_run_action_arguments(parser: argparse.ArgumentParser) -> None:
@@ -10,6 +10,7 @@ from rasa.cli.arguments.default_arguments import (
10
10
  add_remote_root_only_param,
11
11
  add_remote_storage_param,
12
12
  add_stories_param,
13
+ add_sub_agents_param,
13
14
  )
14
15
  from rasa.graph_components.providers.training_tracker_provider import (
15
16
  TrainingTrackerProvider,
@@ -43,6 +44,7 @@ def set_train_arguments(parser: argparse.ArgumentParser) -> None:
43
44
  )
44
45
  add_remote_storage_param(parser)
45
46
  add_remote_root_only_param(parser)
47
+ add_sub_agents_param(parser)
46
48
 
47
49
 
48
50
  def set_train_core_arguments(parser: argparse.ArgumentParser) -> None:
rasa/cli/data.py CHANGED
@@ -15,6 +15,8 @@ from rasa import telemetry
15
15
  from rasa.cli import SubParsersAction
16
16
  from rasa.cli.arguments import data as arguments
17
17
  from rasa.cli.arguments import default_arguments
18
+ from rasa.cli.validation.bot_config import validate_files
19
+ from rasa.cli.validation.config_path_validation import get_validated_path
18
20
  from rasa.e2e_test.e2e_config import create_llm_e2e_test_converter_config
19
21
  from rasa.e2e_test.e2e_test_converter import E2ETestConverter
20
22
  from rasa.e2e_test.utils.e2e_yaml_utils import E2ETestYAMLWriter
@@ -137,7 +139,7 @@ def _add_data_validate_parsers(
137
139
  )
138
140
  _append_story_structure_arguments(validate_parser)
139
141
  validate_parser.set_defaults(
140
- func=lambda args: rasa.cli.utils.validate_files(
142
+ func=lambda args: validate_files(
141
143
  args.fail_on_warnings, args.max_history, _build_training_data_importer(args)
142
144
  )
143
145
  )
@@ -153,7 +155,7 @@ def _add_data_validate_parsers(
153
155
  _append_story_structure_arguments(story_structure_parser)
154
156
 
155
157
  story_structure_parser.set_defaults(
156
- func=lambda args: rasa.cli.utils.validate_files(
158
+ func=lambda args: validate_files(
157
159
  args.fail_on_warnings,
158
160
  args.max_history,
159
161
  _build_training_data_importer(args),
@@ -169,7 +171,7 @@ def _add_data_validate_parsers(
169
171
  help="Checks for inconsistencies in the flows files.",
170
172
  )
171
173
  flows_structure_parser.set_defaults(
172
- func=lambda args: rasa.cli.utils.validate_files(
174
+ func=lambda args: validate_files(
173
175
  args.fail_on_warnings,
174
176
  args.max_history,
175
177
  _build_training_data_importer(args),
@@ -185,7 +187,7 @@ def _add_data_validate_parsers(
185
187
  help="Checks for inconsistencies of the flow and response translation.",
186
188
  )
187
189
  translations_structure_parser.set_defaults(
188
- func=lambda args: rasa.cli.utils.validate_files(
190
+ func=lambda args: validate_files(
189
191
  args.fail_on_warnings,
190
192
  args.max_history,
191
193
  _build_training_data_importer(args),
@@ -196,12 +198,12 @@ def _add_data_validate_parsers(
196
198
 
197
199
 
198
200
  def _build_training_data_importer(args: argparse.Namespace) -> "TrainingDataImporter":
199
- config = rasa.cli.utils.get_validated_path(
201
+ config = get_validated_path(
200
202
  args.config, "config", DEFAULT_CONFIG_PATH, none_is_valid=True
201
203
  )
202
204
 
203
205
  # Exit the validation if the domain path is invalid
204
- domain = rasa.cli.utils.get_validated_path(
206
+ domain = get_validated_path(
205
207
  args.domain, "domain", DEFAULT_DOMAIN_PATHS, none_is_valid=False
206
208
  )
207
209
 
@@ -231,7 +233,7 @@ def split_nlu_data(args: argparse.Namespace) -> None:
231
233
  Args:
232
234
  args: Commandline arguments
233
235
  """
234
- data_path = rasa.cli.utils.get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
236
+ data_path = get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
235
237
  data_path = rasa.shared.data.get_nlu_directory(data_path)
236
238
 
237
239
  nlu_data = rasa.shared.nlu.training_data.loading.load_data(data_path)
@@ -258,7 +260,7 @@ def split_stories_data(args: argparse.Namespace) -> None:
258
260
  YAMLStoryReader,
259
261
  )
260
262
 
261
- data_path = rasa.cli.utils.get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
263
+ data_path = get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
262
264
  data_files = rasa.shared.data.get_data_files(
263
265
  data_path, YAMLStoryReader.is_stories_file
264
266
  )
@@ -3,6 +3,7 @@ import asyncio
3
3
  import datetime
4
4
  import importlib
5
5
  import sys
6
+ from pathlib import Path
6
7
  from typing import Any, Dict, List, Optional, Type, cast
7
8
 
8
9
  import structlog
@@ -14,9 +15,11 @@ from rasa.cli.arguments.default_arguments import (
14
15
  add_endpoint_param,
15
16
  add_model_param,
16
17
  add_remote_storage_param,
18
+ add_sub_agents_param,
17
19
  )
18
20
  from rasa.core.agent import Agent
19
- from rasa.core.available_endpoints import AvailableEndpoints
21
+ from rasa.core.config.available_endpoints import AvailableEndpoints
22
+ from rasa.core.config.configuration import Configuration
20
23
  from rasa.core.exceptions import AgentNotReady
21
24
  from rasa.core.processor import MessageProcessor
22
25
  from rasa.dialogue_understanding.commands import Command
@@ -47,7 +50,6 @@ from rasa.dialogue_understanding_test.validation import (
47
50
  from rasa.e2e_test.e2e_test_case import TestSuite
48
51
  from rasa.exceptions import RasaException
49
52
  from rasa.shared.constants import (
50
- DEFAULT_ENDPOINTS_PATH,
51
53
  LLM_CONFIG_KEY,
52
54
  ROUTE_TO_CALM_SLOT,
53
55
  )
@@ -174,6 +176,8 @@ def add_du_test_arguments(parser: argparse.ArgumentParser) -> None:
174
176
  ),
175
177
  )
176
178
 
179
+ add_sub_agents_param(du_arguments)
180
+
177
181
 
178
182
  def ensure_calm_only_bot(agent: Agent) -> None:
179
183
  if agent.domain is None or agent.processor is None:
@@ -218,6 +222,7 @@ def execute_dialogue_understanding_tests(args: argparse.Namespace) -> None:
218
222
  model_path=args.model,
219
223
  model_server=endpoints.model,
220
224
  remote_storage=args.remote_storage,
225
+ sub_agents_path=args.sub_agents,
221
226
  )
222
227
  except AgentNotReady as error:
223
228
  structlogger.error(
@@ -323,11 +328,9 @@ def get_valid_test_suite(
323
328
 
324
329
 
325
330
  def set_up_available_endpoints(args: argparse.Namespace) -> AvailableEndpoints:
326
- """Set up the available endpoints for the test runner."""
327
- args.endpoints = rasa.cli.utils.get_validated_path(
328
- args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
329
- )
330
- endpoints = AvailableEndpoints.get_instance(args.endpoints)
331
+ endpoints = Configuration.initialise_endpoints(
332
+ endpoints_path=Path(args.endpoints)
333
+ ).endpoints
331
334
 
332
335
  # Ignore all endpoints apart from action server, model, and nlu
333
336
  # to ensure InMemoryTrackerStore is being used instead of production
rasa/cli/e2e_test.py CHANGED
@@ -17,8 +17,9 @@ from rasa.cli.arguments.default_arguments import (
17
17
  add_endpoint_param,
18
18
  add_model_param,
19
19
  add_remote_storage_param,
20
+ add_sub_agents_param,
20
21
  )
21
- from rasa.core.available_endpoints import AvailableEndpoints
22
+ from rasa.core.config.configuration import Configuration, EndpointsConfigPath
22
23
  from rasa.core.exceptions import AgentNotReady
23
24
  from rasa.e2e_test.aggregate_test_stats_calculator import (
24
25
  AggregateTestStatsCalculator,
@@ -50,7 +51,7 @@ from rasa.e2e_test.utils.io import (
50
51
  )
51
52
  from rasa.e2e_test.utils.validation import validate_model_path
52
53
  from rasa.exceptions import RasaException
53
- from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH, DEFAULT_MODELS_PATH
54
+ from rasa.shared.constants import DEFAULT_MODELS_PATH
54
55
  from rasa.utils.endpoints import EndpointConfig
55
56
 
56
57
  RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME = "RASA_PRO_BETA_FINE_TUNING_RECIPE"
@@ -147,6 +148,8 @@ def add_e2e_test_arguments(parser: argparse.ArgumentParser) -> None:
147
148
  help="Directory where to save coverage report to.",
148
149
  )
149
150
 
151
+ add_sub_agents_param(parser)
152
+
150
153
 
151
154
  def execute_e2e_tests(args: argparse.Namespace) -> None:
152
155
  """Run the end-to-end tests.
@@ -154,10 +157,9 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
154
157
  Args:
155
158
  args: Commandline arguments.
156
159
  """
157
- args.endpoints = rasa.cli.utils.get_validated_path(
158
- args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
159
- )
160
- endpoints = AvailableEndpoints.get_instance(args.endpoints)
160
+ endpoints = Configuration.initialise_endpoints(
161
+ endpoints_path=EndpointsConfigPath.validate(args.endpoints)
162
+ ).endpoints
161
163
 
162
164
  # Ignore all endpoints apart from action server, model, nlu and nlg
163
165
  # to ensure InMemoryTrackerStore is being used instead of production
@@ -192,6 +194,7 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
192
194
  model_server=endpoints.model,
193
195
  endpoints=endpoints,
194
196
  test_case_path=Path(test_case_path),
197
+ sub_agents_path=args.sub_agents,
195
198
  )
196
199
  except AgentNotReady as error:
197
200
  structlogger.error(
rasa/cli/evaluate.py CHANGED
@@ -6,7 +6,7 @@ import rasa.cli.arguments.evaluate as arguments
6
6
  import rasa.shared.utils.cli
7
7
  from rasa import telemetry
8
8
  from rasa.cli import SubParsersAction
9
- from rasa.core.available_endpoints import AvailableEndpoints
9
+ from rasa.core.config.configuration import Configuration
10
10
  from rasa.core.evaluation.marker_base import Marker, OperatorMarker
11
11
  from rasa.core.evaluation.marker_tracker_loader import MarkerTrackerLoader
12
12
  from rasa.core.tracker_stores.tracker_store import TrackerStore
@@ -217,6 +217,8 @@ def _create_tracker_loader(
217
217
  A MarkerTrackerLoader object configured with the specified strategy against
218
218
  the configured tracker store.
219
219
  """
220
- endpoints = AvailableEndpoints.get_instance(endpoint_config)
220
+ endpoints = Configuration.initialise_endpoints(
221
+ endpoints_path=Path(endpoint_config)
222
+ ).endpoints
221
223
  tracker_store = TrackerStore.create(endpoints.tracker_store, domain=domain)
222
224
  return MarkerTrackerLoader(tracker_store, strategy, count, seed)
rasa/cli/export.py CHANGED
@@ -11,13 +11,14 @@ from rasa import telemetry
11
11
  from rasa.cli import SubParsersAction
12
12
  from rasa.cli.arguments import export as arguments
13
13
  from rasa.core.brokers.pika import PikaEventBroker
14
+ from rasa.core.config.configuration import Configuration
14
15
  from rasa.exceptions import PublishingError
15
16
  from rasa.shared.constants import DOCS_URL_EVENT_BROKERS, DOCS_URL_TRACKER_STORES
16
17
  from rasa.shared.exceptions import RasaException
17
18
 
18
19
  if typing.TYPE_CHECKING:
19
- from rasa.core.available_endpoints import AvailableEndpoints
20
20
  from rasa.core.brokers.broker import EventBroker
21
+ from rasa.core.config.available_endpoints import AvailableEndpoints
21
22
  from rasa.core.exporter import Exporter
22
23
  from rasa.core.tracker_stores.tracker_store import TrackerStore
23
24
 
@@ -179,7 +180,9 @@ def export_trackers(args: argparse.Namespace) -> None:
179
180
  async def _export_trackers(args: argparse.Namespace) -> None:
180
181
  _assert_max_timestamp_is_greater_than_min_timestamp(args)
181
182
 
182
- endpoints = rasa.core.utils.read_endpoints_from_path(args.endpoints)
183
+ endpoints = Configuration.initialise_endpoints(
184
+ endpoints_path=args.endpoints
185
+ ).endpoints
183
186
  tracker_store = _get_tracker_store(endpoints)
184
187
  event_broker = await _get_event_broker(endpoints)
185
188
  _prepare_event_broker(event_broker)
rasa/cli/inspect.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import argparse
2
2
  import webbrowser
3
3
  from asyncio import AbstractEventLoop
4
+ from pathlib import Path
4
5
  from typing import List, Optional, Text
5
6
 
6
7
  from sanic import Sanic
@@ -8,8 +9,9 @@ from sanic import Sanic
8
9
  from rasa import telemetry
9
10
  from rasa.cli import SubParsersAction
10
11
  from rasa.cli.arguments import shell as arguments
12
+ from rasa.cli.arguments.default_arguments import add_sub_agents_param
11
13
  from rasa.core import constants
12
- from rasa.core.available_endpoints import AvailableEndpoints
14
+ from rasa.core.config.configuration import Configuration
13
15
  from rasa.engine.storage.local_model_storage import LocalModelStorage
14
16
  from rasa.exceptions import ModelNotFound
15
17
  from rasa.model import get_local_model
@@ -44,6 +46,8 @@ def add_subparser(
44
46
  "--voice", help="Enable voice", action="store_true", default=False
45
47
  )
46
48
 
49
+ add_sub_agents_param(inspect_parser)
50
+
47
51
  # it'd be confusing to expose those arguments to the user,
48
52
  # so we remove them
49
53
  remove_argument_from_parser(inspect_parser, "--credentials")
@@ -64,7 +68,7 @@ async def open_inspector_in_browser(
64
68
  def inspect(args: argparse.Namespace) -> None:
65
69
  """Inspect the bot using the most recent model."""
66
70
  import rasa.cli.run
67
- from rasa.cli.utils import get_validated_path
71
+ from rasa.cli.validation.config_path_validation import get_validated_path
68
72
  from rasa.shared.constants import DEFAULT_MODELS_PATH
69
73
 
70
74
  async def after_start_hook_open_inspector(_: Sanic, __: AbstractEventLoop) -> None:
@@ -87,8 +91,8 @@ def inspect(args: argparse.Namespace) -> None:
87
91
  # Load endpoints with proper endpoint file location
88
92
  # This will initialise the endpoints singleton properly so that
89
93
  # it can be used safely throughout the codebase with
90
- # `AvailableEndpoints.get_instance()`
91
- AvailableEndpoints.get_instance(args.endpoints)
94
+ # `Configuration.get_instance().endpoints`
95
+ Configuration.initialise_endpoints(endpoints_path=Path(args.endpoints))
92
96
 
93
97
  try:
94
98
  model = get_local_model(model)
rasa/cli/interactive.py CHANGED
@@ -11,6 +11,8 @@ import rasa.utils.common
11
11
  from rasa import model
12
12
  from rasa.cli import SubParsersAction
13
13
  from rasa.cli.arguments import interactive as arguments
14
+ from rasa.cli.validation.config_path_validation import get_validated_path
15
+ from rasa.core.constants import DEFAULT_SUB_AGENTS
14
16
  from rasa.engine.storage.local_model_storage import LocalModelStorage
15
17
  from rasa.shared.constants import (
16
18
  ASSISTANT_ID_DEFAULT_VALUE,
@@ -109,6 +111,7 @@ def _set_not_required_args(args: argparse.Namespace) -> None:
109
111
  args.validation_max_history = None
110
112
  args.remote_storage = None
111
113
  args.keep_local_model_copy = False
114
+ args.sub_agents = DEFAULT_SUB_AGENTS # Default value for sub-agents
112
115
 
113
116
 
114
117
  def perform_interactive_learning(
@@ -133,7 +136,7 @@ def perform_interactive_learning(
133
136
  "Can not run interactive learning on an NLU-only model."
134
137
  )
135
138
 
136
- args.endpoints = rasa.cli.utils.get_validated_path(
139
+ args.endpoints = get_validated_path(
137
140
  args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
138
141
  )
139
142
 
@@ -142,9 +145,7 @@ def perform_interactive_learning(
142
145
 
143
146
  def get_provided_model(arg_model: Text) -> Optional[Union[Text, Path]]:
144
147
  """Checks model path input and selects model from it."""
145
- model_path = rasa.cli.utils.get_validated_path(
146
- arg_model, "model", DEFAULT_MODELS_PATH
147
- )
148
+ model_path = get_validated_path(arg_model, "model", DEFAULT_MODELS_PATH)
148
149
 
149
150
  return (
150
151
  model.get_latest_model(model_path) if os.path.isdir(model_path) else model_path