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
@@ -0,0 +1,260 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ from pathlib import Path
5
+ from typing import Literal, Optional
6
+
7
+ import structlog
8
+
9
+ from rasa.cli.validation.config_path_validation import get_validated_path
10
+ from rasa.core.config.available_endpoints import AvailableEndpoints
11
+ from rasa.core.config.credentials import CredentialsConfig
12
+ from rasa.core.config.message_procesing_config import MessageProcessingConfig
13
+ from rasa.shared.constants import (
14
+ DEFAULT_CONFIG_PATH,
15
+ DEFAULT_CREDENTIALS_PATH,
16
+ DEFAULT_ENDPOINTS_PATH,
17
+ )
18
+
19
+ logger = structlog.get_logger(__name__)
20
+
21
+
22
+ @dataclasses.dataclass
23
+ class ValidatedConfigPaths:
24
+ credentials_path: Optional[Path] = None
25
+ endpoints_path: Optional[Path] = None
26
+ message_processing_config_path: Optional[Path] = None
27
+
28
+
29
+ @dataclasses.dataclass
30
+ class ConfigPath:
31
+ target: Optional[Path] = None
32
+ type: Literal["credentials", "endpoints", "config"] = "endpoints"
33
+ alternative_targets: list[Path] = dataclasses.field(default_factory=list)
34
+ default_path: str = ""
35
+
36
+ @staticmethod
37
+ def _validate(
38
+ config_path: ConfigPath, can_be_missing: bool = True
39
+ ) -> Optional[Path]:
40
+ validated_path = get_validated_path(
41
+ config_path.target,
42
+ config_path.type,
43
+ config_path.alternative_targets,
44
+ can_be_missing,
45
+ )
46
+
47
+ if validated_path is None and can_be_missing:
48
+ logger.debug(
49
+ f"No {config_path.type} configuration file found. "
50
+ f"Proceeding without {config_path.type} configuration."
51
+ )
52
+
53
+ if isinstance(validated_path, str):
54
+ validated_path = Path(validated_path)
55
+
56
+ return validated_path
57
+
58
+
59
+ @dataclasses.dataclass
60
+ class CredentialsConfigPath(ConfigPath):
61
+ def __init__(self, target: Optional[Path] = None):
62
+ super().__init__(
63
+ target=target,
64
+ type="credentials",
65
+ alternative_targets=[Path(DEFAULT_CREDENTIALS_PATH)],
66
+ default_path=DEFAULT_CREDENTIALS_PATH,
67
+ )
68
+
69
+ @staticmethod
70
+ def validate(
71
+ target_config_path: Optional[Path] = None, can_be_missing: bool = True
72
+ ) -> Optional[Path]:
73
+ config_path = CredentialsConfigPath(target=target_config_path)
74
+ return ConfigPath._validate(config_path, can_be_missing)
75
+
76
+ @staticmethod
77
+ def default_file_path() -> Path:
78
+ return Path(DEFAULT_CREDENTIALS_PATH)
79
+
80
+ @staticmethod
81
+ def at_path(
82
+ root_path: Path,
83
+ ) -> Path:
84
+ return root_path / CredentialsConfigPath.default_file_path()
85
+
86
+
87
+ @dataclasses.dataclass
88
+ class EndpointsConfigPath(ConfigPath):
89
+ def __init__(self, target: Optional[Path] = None):
90
+ super().__init__(
91
+ target=target,
92
+ type="endpoints",
93
+ alternative_targets=[Path(DEFAULT_ENDPOINTS_PATH)],
94
+ default_path=DEFAULT_ENDPOINTS_PATH,
95
+ )
96
+
97
+ @staticmethod
98
+ def validate(
99
+ target_config_path: Optional[Path] = None, can_be_missing: bool = True
100
+ ) -> Optional[Path]:
101
+ config_path = EndpointsConfigPath(target=target_config_path)
102
+ return ConfigPath._validate(config_path, can_be_missing)
103
+
104
+ @staticmethod
105
+ def default_file_path() -> Path:
106
+ return Path(DEFAULT_ENDPOINTS_PATH)
107
+
108
+ @staticmethod
109
+ def at_path(
110
+ root_path: Path,
111
+ ) -> Path:
112
+ return root_path / EndpointsConfigPath.default_file_path()
113
+
114
+
115
+ @dataclasses.dataclass
116
+ class MessageProcessingConfigPath(ConfigPath):
117
+ def __init__(self, target: Optional[Path] = None):
118
+ super().__init__(
119
+ target=target,
120
+ type="config",
121
+ alternative_targets=[Path(DEFAULT_CONFIG_PATH)],
122
+ default_path=DEFAULT_CONFIG_PATH,
123
+ )
124
+
125
+ @staticmethod
126
+ def validate(
127
+ target_config_path: Optional[Path] = None, can_be_missing: bool = True
128
+ ) -> Optional[Path]:
129
+ config_path = MessageProcessingConfigPath(target=target_config_path)
130
+ return ConfigPath._validate(config_path, can_be_missing)
131
+
132
+ @staticmethod
133
+ def default_file_path() -> Path:
134
+ return Path(DEFAULT_CONFIG_PATH)
135
+
136
+ @staticmethod
137
+ def at_path(
138
+ root_path: Path,
139
+ ) -> Path:
140
+ return root_path / MessageProcessingConfigPath.default_file_path()
141
+
142
+
143
+ class Configuration:
144
+ _instance: Optional[Configuration] = None
145
+
146
+ def __init__(
147
+ self,
148
+ endpoints: AvailableEndpoints,
149
+ credentials: Optional[CredentialsConfig] = None,
150
+ message_processing_config: Optional[MessageProcessingConfig] = None,
151
+ ):
152
+ self.credentials = credentials
153
+ self.endpoints = endpoints
154
+ self.message_processing_config = message_processing_config
155
+
156
+ @classmethod
157
+ def initialise_empty(cls) -> Configuration:
158
+ if cls._instance is None:
159
+ cls._instance = Configuration(
160
+ credentials=None,
161
+ endpoints=AvailableEndpoints(),
162
+ message_processing_config=None,
163
+ )
164
+ return cls._instance
165
+
166
+ @classmethod
167
+ def initialise_endpoints(cls, endpoints_path: Path) -> Configuration:
168
+ logger.debug(
169
+ "configuration.initialise_endpoints.start", endpoints_path=endpoints_path
170
+ )
171
+
172
+ validated_endpoints_path = EndpointsConfigPath.validate(endpoints_path)
173
+ endpoints = (
174
+ AvailableEndpoints.read_endpoints(validated_endpoints_path)
175
+ if validated_endpoints_path
176
+ else AvailableEndpoints()
177
+ )
178
+ if cls._instance is None:
179
+ cls._instance = Configuration(
180
+ endpoints=endpoints, credentials=None, message_processing_config=None
181
+ )
182
+ else:
183
+ cls._instance.endpoints = endpoints
184
+ return cls._instance
185
+
186
+ @classmethod
187
+ def initialise_empty_endpoints(cls) -> Configuration:
188
+ logger.debug("configuration.initialise_empty_endpoints.start")
189
+ if cls._instance is None:
190
+ cls._instance = Configuration(
191
+ endpoints=AvailableEndpoints(),
192
+ credentials=None,
193
+ message_processing_config=None,
194
+ )
195
+ else:
196
+ cls._instance.endpoints = AvailableEndpoints()
197
+ return cls._instance
198
+
199
+ @classmethod
200
+ def initialise_message_processing(
201
+ cls, message_processing_config_path: Path
202
+ ) -> Configuration:
203
+ logger.debug(
204
+ "configuration.initialise_message_processing.start",
205
+ message_processing_config_path=message_processing_config_path,
206
+ )
207
+ validated_message_processing_path = MessageProcessingConfigPath.validate(
208
+ message_processing_config_path
209
+ )
210
+ message_processing_config = (
211
+ MessageProcessingConfig.load_from_file(validated_message_processing_path)
212
+ if validated_message_processing_path
213
+ else None
214
+ )
215
+ if cls._instance is None:
216
+ cls._instance = Configuration(
217
+ message_processing_config=message_processing_config,
218
+ credentials=None,
219
+ endpoints=AvailableEndpoints(),
220
+ )
221
+ else:
222
+ cls._instance.message_processing_config = message_processing_config
223
+ return cls._instance
224
+
225
+ @classmethod
226
+ def initialise_credentials(cls, credentials_path: Path) -> Configuration:
227
+ logger.debug(
228
+ "configuration.initialise_credentials.start",
229
+ credentials_path=credentials_path,
230
+ )
231
+
232
+ validated_credentials_path = CredentialsConfigPath.validate(credentials_path)
233
+
234
+ credentials = (
235
+ CredentialsConfig.load_from_file(validated_credentials_path)
236
+ if validated_credentials_path
237
+ else None
238
+ )
239
+ if cls._instance is None:
240
+ cls._instance = Configuration(
241
+ credentials=credentials,
242
+ endpoints=AvailableEndpoints(),
243
+ message_processing_config=None,
244
+ )
245
+ else:
246
+ cls._instance.credentials = credentials
247
+ return cls._instance
248
+
249
+ @classmethod
250
+ def get_instance(cls) -> Configuration:
251
+ if cls._instance is None:
252
+ raise Exception(
253
+ "Configuration not initialized. "
254
+ "Call appropriate 'initialise' methods to "
255
+ "load the config when Rasa Pro starts: "
256
+ "initialise_endpoints(), "
257
+ "initialise_credentials(), "
258
+ "initialise_message_processing()"
259
+ )
260
+ return cls._instance
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict
5
+
6
+ from rasa.shared.utils.yaml import read_config_file
7
+
8
+
9
+ class CredentialsConfig:
10
+ def __init__(
11
+ self, channels: Dict[str, Dict[str, Any]], config_file_path: Path
12
+ ) -> None:
13
+ self.channels = channels
14
+ self.config_file_path = config_file_path
15
+
16
+ @classmethod
17
+ def load_from_file(cls, file_path: Path) -> CredentialsConfig:
18
+ credentials_dict = read_config_file(file_path)
19
+ return cls(credentials_dict, file_path)
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List
5
+
6
+ from rasa.shared.utils.yaml import read_config_file
7
+
8
+
9
+ class MessageProcessingConfig:
10
+ def __init__(
11
+ self,
12
+ recipe: str,
13
+ language: str,
14
+ assistant_id: str,
15
+ pipeline: List[Dict[str, Any]],
16
+ policies: List[Dict[str, Any]],
17
+ ):
18
+ self.recipe = recipe
19
+ self.language = language
20
+ self.assistant_id = assistant_id
21
+ self.pipeline = pipeline
22
+ self.policies = policies
23
+
24
+ @classmethod
25
+ def load_from_file(cls, filepath: Path) -> MessageProcessingConfig:
26
+ credentials_dict = read_config_file(filepath)
27
+
28
+ recipe = credentials_dict.get("recipe", "")
29
+ language = credentials_dict.get("language", "")
30
+ assistant_id = credentials_dict.get("assistant_id", "")
31
+ pipeline = credentials_dict.get("pipeline", [])
32
+ policies = credentials_dict.get("policies", [])
33
+
34
+ return cls(recipe, language, assistant_id, pipeline, policies)
rasa/core/constants.py CHANGED
@@ -31,6 +31,10 @@ BEARER_TOKEN_PREFIX = "Bearer "
31
31
  # The lowest priority is intended to be used by machine learning policies.
32
32
  DEFAULT_POLICY_PRIORITY = 1
33
33
 
34
+ DEFAULT_SUB_AGENTS = "sub_agents"
35
+
36
+ MCP_SERVERS_KEY = "mcp_servers"
37
+
34
38
  # The priority of intent-prediction policies.
35
39
  # This should be below all rule based policies but higher than ML
36
40
  # based policies. This enables a loop inside ensemble where if none
@@ -119,3 +123,9 @@ SQL_TRACKER_STORE_SSL_ROOT_CERTIFICATE_ENV_VAR_NAME = (
119
123
  "SQL_TRACKER_STORE_SSL_ROOT_CERTIFICATE"
120
124
  )
121
125
  AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME = "AWS_ELASTICACHE_CLUSTER_NAME"
126
+ RDS_SQL_DB_AWS_IAM_ENABLED_ENV_VAR_NAME = "RDS_SQL_DB_AWS_IAM_ENABLED"
127
+ ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME = "ELASTICACHE_REDIS_AWS_IAM_ENABLED"
128
+ KAFKA_MSK_AWS_IAM_ENABLED_ENV_VAR_NAME = "KAFKA_MSK_AWS_IAM_ENABLED"
129
+ SQL_SERVICE_NAME = "sql"
130
+ REDIS_SERVICE_NAME = "redis"
131
+ KAFKA_SERVICE_NAME = "kafka"
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import threading
3
3
  import time
4
- from typing import Optional, Tuple
4
+ from typing import Dict, Optional, Tuple
5
5
  from urllib.parse import ParseResult, urlencode, urlunparse
6
6
 
7
7
  import boto3
@@ -14,6 +14,14 @@ from botocore.session import get_session
14
14
  from botocore.signers import RequestSigner
15
15
  from cachetools import TTLCache, cached
16
16
 
17
+ from rasa.core.constants import (
18
+ ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME,
19
+ KAFKA_MSK_AWS_IAM_ENABLED_ENV_VAR_NAME,
20
+ KAFKA_SERVICE_NAME,
21
+ RDS_SQL_DB_AWS_IAM_ENABLED_ENV_VAR_NAME,
22
+ REDIS_SERVICE_NAME,
23
+ SQL_SERVICE_NAME,
24
+ )
17
25
  from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
18
26
  IAMCredentialsProvider,
19
27
  IAMCredentialsProviderInput,
@@ -24,6 +32,25 @@ from rasa.shared.exceptions import ConnectionException
24
32
 
25
33
  structlogger = structlog.get_logger(__name__)
26
34
 
35
+ SERVICE_CONFIG: Dict[Tuple[SupportedServiceType, str], str] = {
36
+ (
37
+ SupportedServiceType.TRACKER_STORE,
38
+ SQL_SERVICE_NAME,
39
+ ): RDS_SQL_DB_AWS_IAM_ENABLED_ENV_VAR_NAME,
40
+ (
41
+ SupportedServiceType.TRACKER_STORE,
42
+ REDIS_SERVICE_NAME,
43
+ ): ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME,
44
+ (
45
+ SupportedServiceType.EVENT_BROKER,
46
+ KAFKA_SERVICE_NAME,
47
+ ): KAFKA_MSK_AWS_IAM_ENABLED_ENV_VAR_NAME,
48
+ (
49
+ SupportedServiceType.LOCK_STORE,
50
+ REDIS_SERVICE_NAME,
51
+ ): ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME,
52
+ }
53
+
27
54
 
28
55
  class AWSRDSIAMCredentialsProvider(IAMCredentialsProvider):
29
56
  """Generates temporary credentials for AWS RDS using IAM roles."""
@@ -203,21 +230,59 @@ class AWSElasticacheRedisIAMCredentialsProvider(redis.CredentialProvider):
203
230
  return TemporaryCredentials()
204
231
 
205
232
 
233
+ def is_iam_enabled(provider_input: "IAMCredentialsProviderInput") -> bool:
234
+ """Checks if IAM authentication is enabled for the given service."""
235
+ service_type = provider_input.service_type
236
+ service_name = provider_input.service_name
237
+ iam_enabled_env_var_name = SERVICE_CONFIG.get((service_type, service_name))
238
+
239
+ if not iam_enabled_env_var_name:
240
+ structlogger.warning(
241
+ "rasa.core.aws_iam_credentials_providers.is_iam_enabled.unsupported_service",
242
+ event_info=f"IAM authentication check requested for unsupported service: "
243
+ f"{service_name}",
244
+ )
245
+ return False
246
+
247
+ return os.getenv(iam_enabled_env_var_name, "false").lower() == "true"
248
+
249
+
206
250
  def create_aws_iam_credentials_provider(
207
251
  provider_input: "IAMCredentialsProviderInput",
208
252
  ) -> Optional["IAMCredentialsProvider"]:
209
253
  """Factory function to create an AWS IAM credentials provider."""
210
- if provider_input.service_name == SupportedServiceType.TRACKER_STORE:
254
+ iam_enabled = is_iam_enabled(provider_input)
255
+ if not iam_enabled:
256
+ structlogger.debug(
257
+ "rasa.core.aws_iam_credentials_providers.create_provider.iam_not_enabled",
258
+ event_info=f"IAM authentication not enabled for service: "
259
+ f"{provider_input.service_type}",
260
+ )
261
+ return None
262
+
263
+ if (
264
+ provider_input.service_type == SupportedServiceType.TRACKER_STORE
265
+ and provider_input.service_name == SQL_SERVICE_NAME
266
+ ):
211
267
  return AWSRDSIAMCredentialsProvider(
212
268
  username=provider_input.username,
213
269
  host=provider_input.host,
214
270
  port=provider_input.port,
215
271
  )
216
272
 
217
- if provider_input.service_name == SupportedServiceType.EVENT_BROKER:
273
+ if (
274
+ provider_input.service_type == SupportedServiceType.TRACKER_STORE
275
+ and provider_input.service_name == REDIS_SERVICE_NAME
276
+ ):
277
+ return AWSElasticacheRedisIAMCredentialsProvider(
278
+ username=provider_input.username,
279
+ cluster_name=provider_input.cluster_name,
280
+ )
281
+
282
+ if provider_input.service_type == SupportedServiceType.EVENT_BROKER:
218
283
  return AWSMSKafkaIAMCredentialsProvider()
219
284
 
220
- if provider_input.service_name == SupportedServiceType.LOCK_STORE:
285
+ if provider_input.service_type == SupportedServiceType.LOCK_STORE:
221
286
  return AWSElasticacheRedisIAMCredentialsProvider(
222
287
  username=provider_input.username,
223
288
  cluster_name=provider_input.cluster_name,
@@ -47,7 +47,8 @@ class SupportedServiceType(Enum):
47
47
  class IAMCredentialsProviderInput(BaseModel):
48
48
  """Input data for creating an IAM credentials provider."""
49
49
 
50
- service_name: SupportedServiceType
50
+ service_type: SupportedServiceType
51
+ service_name: str
51
52
  username: Optional[str] = None
52
53
  host: Optional[str] = None
53
54
  port: Optional[int] = None
rasa/core/lock_store.py CHANGED
@@ -18,6 +18,9 @@ from pydantic import (
18
18
 
19
19
  import rasa.shared.utils.common
20
20
  from rasa.core.constants import DEFAULT_LOCK_LIFETIME, IAM_CLOUD_PROVIDER_ENV_VAR_NAME
21
+ from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
22
+ SupportedServiceType,
23
+ )
21
24
  from rasa.core.lock import TicketLock
22
25
  from rasa.core.redis_connection_factory import (
23
26
  DeploymentMode,
@@ -336,6 +339,7 @@ class RedisLockStore(LockStore):
336
339
  redis_config = RedisConfig(
337
340
  host=str(self.config.host),
338
341
  port=self.config.port,
342
+ service_type=SupportedServiceType.LOCK_STORE,
339
343
  db=self.config.db,
340
344
  username=self.config.username,
341
345
  password=self.config.password,
@@ -12,7 +12,7 @@ from jinja2 import Template
12
12
  from pydantic import ValidationError
13
13
 
14
14
  import rasa.shared.utils.io
15
- from rasa.core.available_endpoints import AvailableEndpoints
15
+ from rasa.core.config.available_endpoints import AvailableEndpoints
16
16
  from rasa.core.constants import (
17
17
  UTTER_SOURCE_METADATA_KEY,
18
18
  )
@@ -63,6 +63,8 @@ from rasa.shared.constants import (
63
63
  )
64
64
  from rasa.shared.core.constants import (
65
65
  ACTION_CANCEL_FLOW,
66
+ ACTION_METADATA_MESSAGE_KEY,
67
+ ACTION_METADATA_TEXT_KEY,
66
68
  ACTION_SEND_TEXT_NAME,
67
69
  DEFAULT_SLOT_NAMES,
68
70
  )
@@ -585,8 +587,8 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
585
587
  return self._create_prediction_internal_error(domain, tracker)
586
588
 
587
589
  action_metadata = {
588
- "message": {
589
- "text": response,
590
+ ACTION_METADATA_MESSAGE_KEY: {
591
+ ACTION_METADATA_TEXT_KEY: response,
590
592
  SEARCH_RESULTS_METADATA_KEY: [
591
593
  result.text for result in documents.results
592
594
  ],
@@ -137,8 +137,8 @@ class FlowPolicy(Policy):
137
137
 
138
138
  # create executor and predict next action
139
139
  try:
140
- prediction = flow_executor.advance_flows(
141
- tracker, domain.action_names_or_texts, flows
140
+ prediction = await flow_executor.advance_flows(
141
+ tracker, domain.action_names_or_texts, flows, domain.slots
142
142
  )
143
143
  return self._create_prediction_result(
144
144
  prediction.action_name,
@@ -164,8 +164,8 @@ class FlowPolicy(Policy):
164
164
  # we retry, with the internal error frame on the stack
165
165
  events = tracker.create_stack_updated_events(updated_stack)
166
166
  tracker.update_with_events(events)
167
- prediction = flow_executor.advance_flows(
168
- tracker, domain.action_names_or_texts, flows
167
+ prediction = await flow_executor.advance_flows(
168
+ tracker, domain.action_names_or_texts, flows, domain.slots
169
169
  )
170
170
  collected_events = events + (prediction.events or [])
171
171
  return self._create_prediction_result(