rasa-pro 3.8.17__py3-none-any.whl → 3.9.14__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 (272) hide show
  1. README.md +5 -5
  2. rasa/__main__.py +14 -9
  3. rasa/anonymization/anonymization_pipeline.py +0 -1
  4. rasa/anonymization/anonymization_rule_executor.py +3 -3
  5. rasa/anonymization/utils.py +4 -3
  6. rasa/api.py +2 -2
  7. rasa/cli/arguments/default_arguments.py +1 -1
  8. rasa/cli/arguments/run.py +2 -2
  9. rasa/cli/arguments/test.py +1 -1
  10. rasa/cli/arguments/train.py +10 -10
  11. rasa/cli/e2e_test.py +27 -7
  12. rasa/cli/export.py +0 -1
  13. rasa/cli/license.py +3 -3
  14. rasa/cli/project_templates/calm/actions/action_template.py +1 -1
  15. rasa/cli/project_templates/calm/config.yml +1 -1
  16. rasa/cli/project_templates/calm/credentials.yml +1 -1
  17. rasa/cli/project_templates/calm/data/flows/add_contact.yml +1 -1
  18. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +1 -1
  19. rasa/cli/project_templates/calm/domain/add_contact.yml +8 -2
  20. rasa/cli/project_templates/calm/domain/list_contacts.yml +3 -0
  21. rasa/cli/project_templates/calm/domain/remove_contact.yml +9 -2
  22. rasa/cli/project_templates/calm/domain/shared.yml +5 -0
  23. rasa/cli/project_templates/calm/endpoints.yml +4 -4
  24. rasa/cli/project_templates/default/actions/actions.py +1 -1
  25. rasa/cli/project_templates/default/config.yml +5 -5
  26. rasa/cli/project_templates/default/credentials.yml +1 -1
  27. rasa/cli/project_templates/default/endpoints.yml +4 -4
  28. rasa/cli/project_templates/default/tests/test_stories.yml +1 -1
  29. rasa/cli/project_templates/tutorial/config.yml +1 -1
  30. rasa/cli/project_templates/tutorial/credentials.yml +1 -1
  31. rasa/cli/project_templates/tutorial/data/patterns.yml +6 -0
  32. rasa/cli/project_templates/tutorial/domain.yml +4 -0
  33. rasa/cli/project_templates/tutorial/endpoints.yml +6 -6
  34. rasa/cli/run.py +0 -1
  35. rasa/cli/scaffold.py +3 -2
  36. rasa/cli/studio/download.py +11 -0
  37. rasa/cli/studio/studio.py +180 -24
  38. rasa/cli/studio/upload.py +0 -8
  39. rasa/cli/telemetry.py +18 -6
  40. rasa/cli/utils.py +21 -10
  41. rasa/cli/x.py +3 -2
  42. rasa/core/actions/action.py +90 -315
  43. rasa/core/actions/action_exceptions.py +24 -0
  44. rasa/core/actions/constants.py +3 -0
  45. rasa/core/actions/custom_action_executor.py +188 -0
  46. rasa/core/actions/forms.py +11 -7
  47. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  48. rasa/core/actions/http_custom_action_executor.py +140 -0
  49. rasa/core/actions/loops.py +3 -0
  50. rasa/core/actions/two_stage_fallback.py +1 -1
  51. rasa/core/agent.py +2 -4
  52. rasa/core/brokers/pika.py +1 -2
  53. rasa/core/channels/audiocodes.py +1 -1
  54. rasa/core/channels/botframework.py +0 -1
  55. rasa/core/channels/callback.py +0 -1
  56. rasa/core/channels/console.py +6 -8
  57. rasa/core/channels/development_inspector.py +1 -1
  58. rasa/core/channels/facebook.py +0 -3
  59. rasa/core/channels/hangouts.py +0 -6
  60. rasa/core/channels/inspector/dist/assets/{arc-5623b6dc.js → arc-b6e548fe.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-685c106a.js → c4Diagram-d0fbc5ce-fa03ac9e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-8cbed007.js → classDiagram-936ed81e-ee67392a.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-5889cf12.js → classDiagram-v2-c3cb15f1-9b283fae.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-24c249d7.js → createText-62fc7601-8b6fcc2a.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-7dd06a75.js → edges-f2ad444c-22e77f4f.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-62c1e54c.js → erDiagram-9d236eb7-60ffc87f.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-ce49b86f.js → flowDb-1972c806-9dd802e4.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-4067e48f.js → flowDiagram-7ea5b25a-5fa1912f.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-1844e5a5.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-59fe4051.js → flowchart-elk-definition-abe16c3d-622a1fd2.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-47e3a43b.js → ganttDiagram-9b5ea136-e285a63a.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-5a2ac0d9.js → gitGraphDiagram-99d0ae7c-f237bdca.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-dfb8efc4.js → index-2c4b9a3b-4b03d70e.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{index-268a75c0.js → index-a5d3e69d.js} +4 -4
  75. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-b0c470f2.js → infoDiagram-736b4530-72a0fa5f.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-2edb829a.js → journeyDiagram-df861f2b-82218c41.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{layout-b6873d69.js → layout-78cff630.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{line-1efc5781.js → line-5038b469.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{linear-661e9b94.js → linear-c4fc4098.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-2d2e727f.js → mindmap-definition-beec6740-c33c8ea6.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-9d3ea93d.js → pieDiagram-dbbf0591-a8d03059.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-06a178a2.js → quadrantDiagram-4d7f4fd6-6a0e56b2.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-0bfedffc.js → requirementDiagram-6fc4c22a-2dc7c7bd.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-d76d0a04.js → sankeyDiagram-8f13d901-2360fe39.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-37bb4341.js → sequenceDiagram-b655622a-41b9f9ad.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-f52f7f57.js → stateDiagram-59f0c015-0aad326f.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-4a986a20.js → stateDiagram-v2-2b26beab-9847d984.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-7dd9ae12.js → styles-080da4f6-564d890e.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-46e1ca14.js → styles-3dcbcfbf-38957613.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-4a97439a.js → styles-9c745c82-f0fc6921.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-823917a3.js → svgDrawCommon-4835440b-ef3c5a77.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-9ea72896.js → timeline-definition-5b62e21b-bf3e91c1.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-b631a8b6.js → xychartDiagram-2b33534f-4d4026c0.js} +1 -1
  94. rasa/core/channels/inspector/dist/index.html +1 -1
  95. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +10 -0
  96. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -7
  97. rasa/core/channels/inspector/src/helpers/formatters.ts +3 -2
  98. rasa/core/channels/rest.py +36 -21
  99. rasa/core/channels/rocketchat.py +0 -1
  100. rasa/core/channels/socketio.py +1 -1
  101. rasa/core/channels/telegram.py +3 -3
  102. rasa/core/channels/webexteams.py +0 -1
  103. rasa/core/concurrent_lock_store.py +1 -1
  104. rasa/core/evaluation/marker_base.py +1 -3
  105. rasa/core/evaluation/marker_stats.py +1 -2
  106. rasa/core/featurizers/single_state_featurizer.py +2 -4
  107. rasa/core/featurizers/tracker_featurizers.py +0 -7
  108. rasa/core/information_retrieval/__init__.py +7 -0
  109. rasa/core/information_retrieval/faiss.py +9 -4
  110. rasa/core/information_retrieval/information_retrieval.py +64 -7
  111. rasa/core/information_retrieval/milvus.py +7 -14
  112. rasa/core/information_retrieval/qdrant.py +8 -15
  113. rasa/core/lock_store.py +0 -1
  114. rasa/core/migrate.py +1 -2
  115. rasa/core/nlg/callback.py +3 -4
  116. rasa/core/policies/enterprise_search_policy.py +86 -22
  117. rasa/core/policies/enterprise_search_prompt_template.jinja2 +4 -41
  118. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  119. rasa/core/policies/flows/flow_executor.py +104 -2
  120. rasa/core/policies/intentless_policy.py +7 -9
  121. rasa/core/policies/memoization.py +3 -3
  122. rasa/core/policies/policy.py +18 -9
  123. rasa/core/policies/rule_policy.py +8 -11
  124. rasa/core/policies/ted_policy.py +28 -30
  125. rasa/core/policies/unexpected_intent_policy.py +1 -2
  126. rasa/core/processor.py +136 -47
  127. rasa/core/run.py +41 -25
  128. rasa/core/secrets_manager/endpoints.py +2 -2
  129. rasa/core/secrets_manager/vault.py +6 -8
  130. rasa/core/test.py +3 -5
  131. rasa/core/tracker_store.py +49 -14
  132. rasa/core/train.py +1 -3
  133. rasa/core/training/interactive.py +9 -6
  134. rasa/core/utils.py +5 -10
  135. rasa/dialogue_understanding/coexistence/intent_based_router.py +11 -4
  136. rasa/dialogue_understanding/coexistence/llm_based_router.py +2 -3
  137. rasa/dialogue_understanding/commands/__init__.py +4 -0
  138. rasa/dialogue_understanding/commands/can_not_handle_command.py +9 -0
  139. rasa/dialogue_understanding/commands/cancel_flow_command.py +9 -0
  140. rasa/dialogue_understanding/commands/change_flow_command.py +38 -0
  141. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +9 -0
  142. rasa/dialogue_understanding/commands/clarify_command.py +9 -0
  143. rasa/dialogue_understanding/commands/correct_slots_command.py +9 -0
  144. rasa/dialogue_understanding/commands/error_command.py +12 -0
  145. rasa/dialogue_understanding/commands/handle_code_change_command.py +9 -0
  146. rasa/dialogue_understanding/commands/human_handoff_command.py +9 -0
  147. rasa/dialogue_understanding/commands/knowledge_answer_command.py +9 -0
  148. rasa/dialogue_understanding/commands/noop_command.py +9 -0
  149. rasa/dialogue_understanding/commands/set_slot_command.py +34 -3
  150. rasa/dialogue_understanding/commands/skip_question_command.py +9 -0
  151. rasa/dialogue_understanding/commands/start_flow_command.py +9 -0
  152. rasa/dialogue_understanding/generator/__init__.py +16 -1
  153. rasa/dialogue_understanding/generator/command_generator.py +92 -6
  154. rasa/dialogue_understanding/generator/constants.py +18 -0
  155. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -5
  156. rasa/dialogue_understanding/generator/llm_based_command_generator.py +467 -0
  157. rasa/dialogue_understanding/generator/llm_command_generator.py +39 -609
  158. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  159. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  160. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  161. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +827 -0
  162. rasa/dialogue_understanding/generator/nlu_command_adapter.py +69 -8
  163. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  164. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +345 -0
  165. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +44 -39
  166. rasa/dialogue_understanding/processor/command_processor.py +111 -3
  167. rasa/e2e_test/constants.py +1 -0
  168. rasa/e2e_test/e2e_test_case.py +44 -0
  169. rasa/e2e_test/e2e_test_runner.py +114 -11
  170. rasa/e2e_test/e2e_test_schema.yml +18 -0
  171. rasa/engine/caching.py +0 -1
  172. rasa/engine/graph.py +18 -6
  173. rasa/engine/recipes/config_files/default_config.yml +3 -3
  174. rasa/engine/recipes/default_components.py +1 -1
  175. rasa/engine/recipes/default_recipe.py +4 -5
  176. rasa/engine/recipes/recipe.py +1 -1
  177. rasa/engine/runner/dask.py +3 -9
  178. rasa/engine/storage/local_model_storage.py +0 -2
  179. rasa/engine/validation.py +179 -145
  180. rasa/exceptions.py +2 -2
  181. rasa/graph_components/validators/default_recipe_validator.py +3 -5
  182. rasa/hooks.py +0 -1
  183. rasa/model.py +1 -1
  184. rasa/model_training.py +1 -0
  185. rasa/nlu/classifiers/diet_classifier.py +8 -14
  186. rasa/nlu/extractors/crf_entity_extractor.py +4 -4
  187. rasa/nlu/extractors/duckling_entity_extractor.py +1 -1
  188. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +1 -5
  189. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +0 -4
  190. rasa/nlu/featurizers/featurizer.py +1 -1
  191. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +2 -4
  192. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +9 -12
  193. rasa/nlu/persistor.py +68 -26
  194. rasa/nlu/selectors/response_selector.py +7 -10
  195. rasa/nlu/test.py +0 -3
  196. rasa/nlu/utils/hugging_face/registry.py +1 -1
  197. rasa/nlu/utils/spacy_utils.py +1 -3
  198. rasa/server.py +22 -7
  199. rasa/shared/constants.py +12 -1
  200. rasa/shared/core/command_payload_reader.py +109 -0
  201. rasa/shared/core/constants.py +4 -5
  202. rasa/shared/core/domain.py +57 -56
  203. rasa/shared/core/events.py +4 -7
  204. rasa/shared/core/flows/flow.py +9 -0
  205. rasa/shared/core/flows/flows_list.py +12 -0
  206. rasa/shared/core/flows/steps/action.py +7 -2
  207. rasa/shared/core/generator.py +12 -11
  208. rasa/shared/core/slot_mappings.py +315 -24
  209. rasa/shared/core/slots.py +4 -2
  210. rasa/shared/core/trackers.py +32 -14
  211. rasa/shared/core/training_data/loading.py +0 -1
  212. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  213. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +11 -11
  214. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +5 -3
  215. rasa/shared/core/training_data/structures.py +1 -1
  216. rasa/shared/core/training_data/visualization.py +1 -1
  217. rasa/shared/data.py +58 -1
  218. rasa/shared/exceptions.py +36 -2
  219. rasa/shared/importers/importer.py +1 -2
  220. rasa/shared/importers/rasa.py +0 -1
  221. rasa/shared/nlu/constants.py +2 -0
  222. rasa/shared/nlu/training_data/entities_parser.py +1 -2
  223. rasa/shared/nlu/training_data/formats/dialogflow.py +3 -2
  224. rasa/shared/nlu/training_data/formats/rasa_yaml.py +3 -5
  225. rasa/shared/nlu/training_data/formats/readerwriter.py +0 -1
  226. rasa/shared/nlu/training_data/message.py +13 -0
  227. rasa/shared/nlu/training_data/training_data.py +0 -2
  228. rasa/shared/providers/openai/session_handler.py +2 -2
  229. rasa/shared/utils/constants.py +3 -0
  230. rasa/shared/utils/io.py +11 -0
  231. rasa/shared/utils/llm.py +1 -2
  232. rasa/shared/utils/pykwalify_extensions.py +1 -0
  233. rasa/shared/utils/schemas/domain.yml +3 -0
  234. rasa/shared/utils/yaml.py +44 -35
  235. rasa/studio/auth.py +26 -10
  236. rasa/studio/constants.py +2 -0
  237. rasa/studio/data_handler.py +114 -107
  238. rasa/studio/download.py +160 -27
  239. rasa/studio/results_logger.py +137 -0
  240. rasa/studio/train.py +6 -7
  241. rasa/studio/upload.py +159 -134
  242. rasa/telemetry.py +188 -34
  243. rasa/tracing/config.py +18 -3
  244. rasa/tracing/constants.py +26 -2
  245. rasa/tracing/instrumentation/attribute_extractors.py +50 -41
  246. rasa/tracing/instrumentation/instrumentation.py +290 -44
  247. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +7 -5
  248. rasa/tracing/instrumentation/metrics.py +109 -21
  249. rasa/tracing/metric_instrument_provider.py +83 -3
  250. rasa/utils/cli.py +2 -1
  251. rasa/utils/common.py +1 -1
  252. rasa/utils/endpoints.py +1 -2
  253. rasa/utils/io.py +6 -6
  254. rasa/utils/licensing.py +246 -31
  255. rasa/utils/ml_utils.py +1 -1
  256. rasa/utils/tensorflow/data_generator.py +1 -1
  257. rasa/utils/tensorflow/environment.py +1 -1
  258. rasa/utils/tensorflow/model_data.py +9 -11
  259. rasa/utils/tensorflow/model_data_utils.py +499 -500
  260. rasa/utils/tensorflow/models.py +5 -6
  261. rasa/utils/tensorflow/rasa_layers.py +15 -15
  262. rasa/utils/train_utils.py +1 -1
  263. rasa/utils/url_tools.py +53 -0
  264. rasa/validator.py +305 -3
  265. rasa/version.py +1 -1
  266. {rasa_pro-3.8.17.dist-info → rasa_pro-3.9.14.dist-info}/METADATA +22 -22
  267. {rasa_pro-3.8.17.dist-info → rasa_pro-3.9.14.dist-info}/RECORD +271 -253
  268. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-85583a23.js +0 -1
  269. /rasa/dialogue_understanding/generator/{command_prompt_template.jinja2 → single_step/command_prompt_template.jinja2} +0 -0
  270. {rasa_pro-3.8.17.dist-info → rasa_pro-3.9.14.dist-info}/NOTICE +0 -0
  271. {rasa_pro-3.8.17.dist-info → rasa_pro-3.9.14.dist-info}/WHEEL +0 -0
  272. {rasa_pro-3.8.17.dist-info → rasa_pro-3.9.14.dist-info}/entry_points.txt +0 -0
@@ -239,7 +239,7 @@ class RasaModel(Model):
239
239
 
240
240
  @staticmethod
241
241
  def _dynamic_signature(
242
- batch_in: Union[Tuple[tf.Tensor, ...], Tuple[np.ndarray, ...]]
242
+ batch_in: Union[Tuple[tf.Tensor, ...], Tuple[np.ndarray, ...]],
243
243
  ) -> List[List[tf.TensorSpec]]:
244
244
  element_spec = []
245
245
  for tensor in batch_in:
@@ -326,9 +326,9 @@ class RasaModel(Model):
326
326
  # We only need input, since output is always None and not
327
327
  # consumed by our TF graphs.
328
328
  batch_in = next(data_iterator)[0]
329
- batch_out: Dict[
330
- Text, Union[np.ndarray, Dict[Text, Any]]
331
- ] = self._rasa_predict(batch_in)
329
+ batch_out: Dict[Text, Union[np.ndarray, Dict[Text, Any]]] = (
330
+ self._rasa_predict(batch_in)
331
+ )
332
332
  if output_keys_expected:
333
333
  batch_out = {
334
334
  key: output
@@ -379,7 +379,7 @@ class RasaModel(Model):
379
379
  """Recursively replaces empty list or np array with None in a dictionary."""
380
380
 
381
381
  def _recurse(
382
- x: Union[Dict[Text, Any], List[Any], np.ndarray]
382
+ x: Union[Dict[Text, Any], List[Any], np.ndarray],
383
383
  ) -> Optional[Union[Dict[Text, Any], List[Any], np.ndarray]]:
384
384
  if isinstance(x, dict):
385
385
  return {k: _recurse(v) for k, v in x.items()}
@@ -891,7 +891,6 @@ class TransformerRasaModel(RasaModel):
891
891
  tag_name: Text,
892
892
  entity_tags: Optional[tf.Tensor] = None,
893
893
  ) -> Tuple[tf.Tensor, tf.Tensor, tf.Tensor]:
894
-
895
894
  tag_ids = tf.cast(tag_ids[:, :, 0], tf.int32)
896
895
 
897
896
  if entity_tags is not None:
@@ -418,7 +418,7 @@ class RasaFeatureCombiningLayer(RasaCustomLayer):
418
418
 
419
419
  @staticmethod
420
420
  def _get_present_feature_types(
421
- attribute_signature: Dict[Text, List[FeatureSignature]]
421
+ attribute_signature: Dict[Text, List[FeatureSignature]],
422
422
  ) -> Dict[Text, bool]:
423
423
  """Determines feature types that are present.
424
424
 
@@ -444,13 +444,13 @@ class RasaFeatureCombiningLayer(RasaCustomLayer):
444
444
  for feature_type, present in self._feature_types_present.items():
445
445
  if not present:
446
446
  continue
447
- self._tf_layers[
448
- f"sparse_dense.{feature_type}"
449
- ] = ConcatenateSparseDenseFeatures(
450
- attribute=attribute,
451
- feature_type=feature_type,
452
- feature_type_signature=attribute_signature[feature_type],
453
- config=config,
447
+ self._tf_layers[f"sparse_dense.{feature_type}"] = (
448
+ ConcatenateSparseDenseFeatures(
449
+ attribute=attribute,
450
+ feature_type=feature_type,
451
+ feature_type_signature=attribute_signature[feature_type],
452
+ config=config,
453
+ )
454
454
  )
455
455
 
456
456
  def _prepare_sequence_sentence_concat(
@@ -853,13 +853,13 @@ class RasaSequenceLayer(RasaCustomLayer):
853
853
  [not signature.is_sparse for signature in attribute_signature[SEQUENCE]]
854
854
  )
855
855
  if not expect_dense_seq_features:
856
- self._tf_layers[
857
- self.SPARSE_TO_DENSE_FOR_TOKEN_IDS
858
- ] = layers.DenseForSparse(
859
- units=2,
860
- use_bias=False,
861
- trainable=False,
862
- name=f"{self.SPARSE_TO_DENSE_FOR_TOKEN_IDS}.{attribute}",
856
+ self._tf_layers[self.SPARSE_TO_DENSE_FOR_TOKEN_IDS] = (
857
+ layers.DenseForSparse(
858
+ units=2,
859
+ use_bias=False,
860
+ trainable=False,
861
+ name=f"{self.SPARSE_TO_DENSE_FOR_TOKEN_IDS}.{attribute}",
862
+ )
863
863
  )
864
864
 
865
865
  def _calculate_output_units(
rasa/utils/train_utils.py CHANGED
@@ -453,7 +453,7 @@ def _check_evaluation_setting(component_config: Dict[Text, Any]) -> None:
453
453
  f"No checkpoint model will be saved."
454
454
  )
455
455
  rasa.shared.utils.io.raise_warning(warning)
456
- if CHECKPOINT_MODEL in component_config and component_config[CHECKPOINT_MODEL]:
456
+ if component_config.get(CHECKPOINT_MODEL):
457
457
  if (
458
458
  component_config[EVAL_NUM_EPOCHS] != -1
459
459
  and component_config[EVAL_NUM_EPOCHS] < 1
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+ import enum
3
+ from typing import Dict
4
+
5
+ from urllib.parse import urlparse
6
+
7
+ import structlog
8
+
9
+ structlogger = structlog.get_logger()
10
+
11
+
12
+ class UrlSchema(enum.Enum):
13
+ HTTP = "http"
14
+ HTTPS = "https"
15
+ FILE = "file"
16
+ FTP = "ftp"
17
+ SFTP = "sftp"
18
+ GRPC = "grpc"
19
+ UNKNOWN = "unknown"
20
+ NOT_SPECIFIED = "not_specified"
21
+
22
+ @property
23
+ def available_schemas(self) -> Dict[str, UrlSchema]:
24
+ """Get all available URL schemas except for the unknown schema."""
25
+ return {
26
+ schema.value: schema for schema in UrlSchema if schema != UrlSchema.UNKNOWN
27
+ }
28
+
29
+
30
+ def get_url_schema(url: str) -> UrlSchema:
31
+ """Get the schema of a URL.
32
+
33
+ Args:
34
+ url: The URL to parse.
35
+
36
+ Returns:
37
+ The schema of the URL.
38
+ """
39
+ parsed_url = urlparse(url)
40
+
41
+ if parsed_url.scheme == "":
42
+ return UrlSchema.NOT_SPECIFIED
43
+
44
+ try:
45
+ return UrlSchema(parsed_url.scheme)
46
+ except ValueError:
47
+ structlogger.warn(
48
+ "rasa.utils.url_tools.get_url_schema.unknown_schema",
49
+ event_info=f"Unknown URL schema '{parsed_url.scheme}'. "
50
+ f"Returning 'unknown'.",
51
+ )
52
+
53
+ return UrlSchema.UNKNOWN
rasa/validator.py CHANGED
@@ -9,7 +9,12 @@ from jinja2 import Template
9
9
  from pypred import Predicate
10
10
 
11
11
  import rasa.core.training.story_conflict
12
+ from rasa.core.channels import UserMessage
12
13
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
14
+ from rasa.shared.core.command_payload_reader import (
15
+ CommandPayloadReader,
16
+ MAX_NUMBER_OF_SLOTS,
17
+ )
13
18
  from rasa.shared.core.flows.flow_step_links import IfFlowStepLink
14
19
  from rasa.shared.core.flows.steps.set_slots import SetSlotsFlowStep
15
20
  from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
@@ -21,8 +26,10 @@ from rasa.shared.constants import (
21
26
  ASSISTANT_ID_DEFAULT_VALUE,
22
27
  ASSISTANT_ID_KEY,
23
28
  CONFIG_MANDATORY_KEYS,
29
+ DOCS_URL_DOMAIN,
24
30
  DOCS_URL_DOMAINS,
25
31
  DOCS_URL_FORMS,
32
+ DOCS_URL_RESPONSES,
26
33
  UTTER_PREFIX,
27
34
  DOCS_URL_ACTIONS,
28
35
  REQUIRED_SLOTS_KEY,
@@ -38,8 +45,14 @@ from rasa.shared.core.domain import (
38
45
  from rasa.shared.core.generator import TrainingDataGenerator
39
46
  from rasa.shared.core.constants import SlotMappingType, MAPPING_TYPE
40
47
  from rasa.shared.core.slots import ListSlot, Slot
48
+ from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
49
+ YAMLStoryReader,
50
+ )
41
51
  from rasa.shared.core.training_data.structures import StoryGraph
52
+ from rasa.shared.data import create_regex_pattern_reader
42
53
  from rasa.shared.importers.importer import TrainingDataImporter
54
+ from rasa.shared.nlu.constants import COMMANDS
55
+ from rasa.shared.nlu.training_data.message import Message
43
56
  from rasa.shared.nlu.training_data.training_data import TrainingData
44
57
  import rasa.shared.utils.cli
45
58
  import rasa.shared.utils.io
@@ -326,7 +339,7 @@ class Validator:
326
339
  continue
327
340
 
328
341
  if event.name not in self.domain.action_names_or_texts:
329
- structlogger.warn(
342
+ structlogger.error(
330
343
  "validator.verify_forms_in_stories_rules.not_in_domain",
331
344
  form=event.name,
332
345
  block=story.block_name,
@@ -365,7 +378,7 @@ class Validator:
365
378
  continue
366
379
 
367
380
  if event.action_name not in self.domain.action_names_or_texts:
368
- structlogger.warn(
381
+ structlogger.error(
369
382
  "validator.verify_actions_in_stories_rules.not_in_domain",
370
383
  action=event.action_name,
371
384
  block=story.block_name,
@@ -786,7 +799,7 @@ class Validator:
786
799
 
787
800
  for flow in self.flows.underlying_flows:
788
801
  flow_description = flow.description
789
- cleaned_description = flow_description.translate(punctuation_table) # type: ignore[union-attr] # noqa: E501
802
+ cleaned_description = flow_description.translate(punctuation_table) # type: ignore[union-attr]
790
803
  if cleaned_description in flow_descriptions:
791
804
  structlogger.error(
792
805
  "validator.verify_unique_flows.duplicate_description",
@@ -1033,3 +1046,292 @@ class Validator:
1033
1046
  structlogger.info("validation.flows.ended")
1034
1047
 
1035
1048
  return all_good
1049
+
1050
+ def validate_button_payloads(self) -> bool:
1051
+ """Check if the response button payloads are valid."""
1052
+ all_good = True
1053
+ for utter_name, response in self.domain.responses.items():
1054
+ for variation in response:
1055
+ for button in variation.get("buttons", []):
1056
+ payload = button.get("payload")
1057
+ if payload is None:
1058
+ structlogger.error(
1059
+ "validator.validate_button_payloads.missing_payload",
1060
+ event_info=(
1061
+ f"The button '{button.get('title')}' in response "
1062
+ f"'{utter_name}' does not have a payload. "
1063
+ f"Please add a payload to the button."
1064
+ ),
1065
+ )
1066
+ all_good = False
1067
+ continue
1068
+
1069
+ if not payload.strip():
1070
+ structlogger.error(
1071
+ "validator.validate_button_payloads.empty_payload",
1072
+ event_info=(
1073
+ f"The button '{button.get('title')}' in response "
1074
+ f"'{utter_name}' has an empty payload. "
1075
+ f"Please add a payload to the button."
1076
+ ),
1077
+ )
1078
+ all_good = False
1079
+ continue
1080
+
1081
+ regex_reader = create_regex_pattern_reader(
1082
+ UserMessage(text=payload), self.domain
1083
+ )
1084
+
1085
+ if regex_reader is None:
1086
+ structlogger.warning(
1087
+ "validator.validate_button_payloads.free_form_string",
1088
+ event_info=(
1089
+ "Using a free form string in payload of a button "
1090
+ "implies that the string will be sent to the NLU "
1091
+ "interpreter for parsing. To avoid the need for "
1092
+ "parsing at runtime, it is recommended to use one "
1093
+ "of the documented formats "
1094
+ "(https://rasa.com/docs/rasa-pro/concepts/responses#buttons)"
1095
+ ),
1096
+ )
1097
+ continue
1098
+
1099
+ if isinstance(
1100
+ regex_reader, CommandPayloadReader
1101
+ ) and regex_reader.is_above_slot_limit(payload):
1102
+ structlogger.error(
1103
+ "validator.validate_button_payloads.slot_limit_exceeded",
1104
+ event_info=(
1105
+ f"The button '{button.get('title')}' in response "
1106
+ f"'{utter_name}' has a payload that sets more than "
1107
+ f"{MAX_NUMBER_OF_SLOTS} slots. "
1108
+ f"Please make sure that the number of slots set by "
1109
+ f"the button payload does not exceed the limit."
1110
+ ),
1111
+ )
1112
+ all_good = False
1113
+ continue
1114
+
1115
+ if isinstance(regex_reader, YAMLStoryReader):
1116
+ # the payload could contain double curly braces
1117
+ # we need to remove 1 set of curly braces
1118
+ payload = payload.replace("{{", "{").replace("}}", "}")
1119
+
1120
+ resulting_message = regex_reader.unpack_regex_message(
1121
+ message=Message(data={"text": payload}), domain=self.domain
1122
+ )
1123
+
1124
+ if not (
1125
+ resulting_message.has_intent()
1126
+ or resulting_message.has_commands()
1127
+ ):
1128
+ structlogger.error(
1129
+ "validator.validate_button_payloads.invalid_payload_format",
1130
+ event_info=(
1131
+ f"The button '{button.get('title')}' in response "
1132
+ f"'{utter_name}' does not follow valid payload formats "
1133
+ f"for triggering a specific intent and entities or for "
1134
+ f"triggering a SetSlot command."
1135
+ ),
1136
+ calm_docs_link=DOCS_URL_RESPONSES + "#payload-syntax",
1137
+ nlu_docs_link=DOCS_URL_RESPONSES
1138
+ + "#triggering-intents-or-passing-entities",
1139
+ )
1140
+ all_good = False
1141
+
1142
+ if resulting_message.has_commands():
1143
+ # validate that slot names are unique
1144
+ slot_names = set()
1145
+ for command in resulting_message.get(COMMANDS, []):
1146
+ slot_name = command.get("name")
1147
+ if slot_name and slot_name in slot_names:
1148
+ structlogger.error(
1149
+ "validator.validate_button_payloads.duplicate_slot_name",
1150
+ event_info=(
1151
+ f"The button '{button.get('title')}' "
1152
+ f"in response '{utter_name}' has a "
1153
+ f"command to set the slot "
1154
+ f"'{slot_name}' multiple times. "
1155
+ f"Please make sure that each slot "
1156
+ f"is set only once."
1157
+ ),
1158
+ )
1159
+ all_good = False
1160
+ slot_names.add(slot_name)
1161
+
1162
+ return all_good
1163
+
1164
+ def validate_CALM_slot_mappings(self) -> bool:
1165
+ """Check if the usage of slot mappings in a CALM assistant is valid."""
1166
+ all_good = True
1167
+
1168
+ for slot in self.domain._user_slots:
1169
+ nlu_mappings = any(
1170
+ [
1171
+ SlotMappingType(
1172
+ mapping.get("type", SlotMappingType.FROM_LLM.value)
1173
+ ).is_predefined_type()
1174
+ for mapping in slot.mappings
1175
+ ]
1176
+ )
1177
+ llm_mappings = any(
1178
+ [
1179
+ SlotMappingType(mapping.get("type", SlotMappingType.FROM_LLM.value))
1180
+ == SlotMappingType.FROM_LLM
1181
+ for mapping in slot.mappings
1182
+ ]
1183
+ )
1184
+ custom_mappings = any(
1185
+ [
1186
+ SlotMappingType(mapping.get("type", SlotMappingType.FROM_LLM.value))
1187
+ == SlotMappingType.CUSTOM
1188
+ for mapping in slot.mappings
1189
+ ]
1190
+ )
1191
+
1192
+ all_good = self._slot_contains_all_mappings_types(
1193
+ llm_mappings, nlu_mappings, custom_mappings, slot.name, all_good
1194
+ )
1195
+
1196
+ all_good = self._custom_action_name_is_defined_in_the_domain(
1197
+ custom_mappings, slot, all_good
1198
+ )
1199
+
1200
+ all_good = self._config_contains_nlu_command_adapter(
1201
+ nlu_mappings, slot.name, all_good
1202
+ )
1203
+
1204
+ all_good = self._uses_from_llm_mappings_in_a_NLU_based_assistant(
1205
+ llm_mappings, slot.name, all_good
1206
+ )
1207
+
1208
+ return all_good
1209
+
1210
+ @staticmethod
1211
+ def _slot_contains_all_mappings_types(
1212
+ llm_mappings: bool,
1213
+ nlu_mappings: bool,
1214
+ custom_mappings: bool,
1215
+ slot_name: str,
1216
+ all_good: bool,
1217
+ ) -> bool:
1218
+ if llm_mappings and (nlu_mappings or custom_mappings):
1219
+ structlogger.error(
1220
+ "validator.validate_slot_mappings_in_CALM.llm_and_nlu_mappings",
1221
+ slot_name=slot_name,
1222
+ event_info=(
1223
+ f"The slot '{slot_name}' has both LLM and "
1224
+ f"NLU or custom slot mappings. "
1225
+ f"Please make sure that the slot has only one type of mapping."
1226
+ ),
1227
+ docs_link=DOCS_URL_DOMAIN + "#calm-slot-mappings",
1228
+ )
1229
+ all_good = False
1230
+
1231
+ return all_good
1232
+
1233
+ def _custom_action_name_is_defined_in_the_domain(
1234
+ self,
1235
+ custom_mappings: bool,
1236
+ slot: Slot,
1237
+ all_good: bool,
1238
+ ) -> bool:
1239
+ if not custom_mappings:
1240
+ return all_good
1241
+
1242
+ if not self.flows:
1243
+ return all_good
1244
+
1245
+ is_custom_action_defined = any(
1246
+ [
1247
+ mapping.get("action") is not None
1248
+ and mapping.get("action") in self.domain.action_names_or_texts
1249
+ for mapping in slot.mappings
1250
+ ]
1251
+ )
1252
+
1253
+ if is_custom_action_defined:
1254
+ return all_good
1255
+
1256
+ slot_collected_by_flows = any(
1257
+ [
1258
+ step.collect == slot.name
1259
+ for flow in self.flows.underlying_flows
1260
+ for step in flow.steps
1261
+ if isinstance(step, CollectInformationFlowStep)
1262
+ ]
1263
+ )
1264
+
1265
+ if not slot_collected_by_flows:
1266
+ # if the slot is not collected by any flow,
1267
+ # it could be a DM1 custom slot
1268
+ return all_good
1269
+
1270
+ custom_action_ask_name = f"action_ask_{slot.name}"
1271
+ if custom_action_ask_name not in self.domain.action_names_or_texts:
1272
+ structlogger.error(
1273
+ "validator.validate_slot_mappings_in_CALM.custom_action_not_in_domain",
1274
+ slot_name=slot.name,
1275
+ event_info=(
1276
+ f"The slot '{slot.name}' has a custom slot mapping, but "
1277
+ f"neither the action '{custom_action_ask_name}' nor "
1278
+ f"another custom action are defined in the domain file. "
1279
+ f"Please add one of the actions to your domain file."
1280
+ ),
1281
+ docs_link=DOCS_URL_DOMAIN + "#custom-slot-mappings",
1282
+ )
1283
+ all_good = False
1284
+
1285
+ return all_good
1286
+
1287
+ def _config_contains_nlu_command_adapter(
1288
+ self, nlu_mappings: bool, slot_name: str, all_good: bool
1289
+ ) -> bool:
1290
+ if not nlu_mappings:
1291
+ return all_good
1292
+
1293
+ if not self.flows:
1294
+ return all_good
1295
+
1296
+ contains_nlu_command_adapter = any(
1297
+ [
1298
+ component.get("name") == "NLUCommandAdapter"
1299
+ for component in self.config.get("pipeline", [])
1300
+ ]
1301
+ )
1302
+
1303
+ if not contains_nlu_command_adapter:
1304
+ structlogger.error(
1305
+ "validator.validate_slot_mappings_in_CALM.nlu_mappings_without_adapter",
1306
+ slot_name=slot_name,
1307
+ event_info=(
1308
+ f"The slot '{slot_name}' has NLU slot mappings, "
1309
+ f"but the NLUCommandAdapter is not present in the "
1310
+ f"pipeline. Please add the NLUCommandAdapter to the "
1311
+ f"pipeline in the config file."
1312
+ ),
1313
+ docs_link=DOCS_URL_DOMAIN + "#nlu-based-predefined-slot-mappings",
1314
+ )
1315
+ all_good = False
1316
+
1317
+ return all_good
1318
+
1319
+ def _uses_from_llm_mappings_in_a_NLU_based_assistant(
1320
+ self, llm_mappings: bool, slot_name: str, all_good: bool
1321
+ ) -> bool:
1322
+ if not llm_mappings:
1323
+ return all_good
1324
+
1325
+ if self.flows:
1326
+ return all_good
1327
+
1328
+ structlogger.error(
1329
+ "validator.validate_slot_mappings_in_CALM.llm_mappings_without_flows",
1330
+ slot_name=slot_name,
1331
+ event_info=(
1332
+ f"The slot '{slot_name}' has LLM slot mappings, "
1333
+ f"but no flows are present in the training data files. "
1334
+ f"Please add flows to the training data files."
1335
+ ),
1336
+ )
1337
+ return False
rasa/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # this file will automatically be changed,
2
2
  # do not add anything but the version number here!
3
- __version__ = "3.8.17"
3
+ __version__ = "3.9.14"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-pro
3
- Version: 3.8.17
3
+ Version: 3.9.14
4
4
  Summary: State-of-the-art open-core Conversational AI framework for Enterprises that natively leverages generative AI for effortless assistant development.
5
5
  Home-page: https://rasa.com
6
6
  Keywords: nlp,machine-learning,machine-learning-library,bot,bots,botkit,rasa conversational-agents,conversational-ai,chatbot,chatbot-framework,bot-framework
@@ -32,7 +32,7 @@ Requires-Dist: apscheduler (>=3.10,<3.11)
32
32
  Requires-Dist: attrs (>=23.1,<23.2)
33
33
  Requires-Dist: azure-storage-blob (>=12.16.0,<12.17.0)
34
34
  Requires-Dist: boto3 (>=1.27.1,<2.0.0)
35
- Requires-Dist: certifi (>=2023.7.22)
35
+ Requires-Dist: certifi (>=2024.2.2)
36
36
  Requires-Dist: cloudpickle (>=2.2.1,<3.1)
37
37
  Requires-Dist: colorama (>=0.4.6,<0.5.0) ; sys_platform == "win32"
38
38
  Requires-Dist: colorclass (>=2.2,<2.3)
@@ -48,7 +48,7 @@ Requires-Dist: faker (>=19.13.0,<20.0.0)
48
48
  Requires-Dist: fbmessenger (>=6.0.0,<6.1.0)
49
49
  Requires-Dist: github3.py (>=3.2.0,<3.3.0) ; extra == "gh-release-notes"
50
50
  Requires-Dist: google-auth (>=2.23.4,<3)
51
- Requires-Dist: google-cloud-storage (>=2.13.0,<3.0.0)
51
+ Requires-Dist: google-cloud-storage (>=2.14.0,<3.0.0)
52
52
  Requires-Dist: hvac (>=1.2.1,<2.0.0)
53
53
  Requires-Dist: importlib-metadata (>=6.8.0,<7.0.0)
54
54
  Requires-Dist: importlib-resources (>=6.1.1,<7.0.0)
@@ -65,18 +65,18 @@ Requires-Dist: mattermostwrapper (>=2.2,<2.3)
65
65
  Requires-Dist: networkx (>=3.1,<3.2)
66
66
  Requires-Dist: numpy (>=1.23.5,<1.25.0) ; python_version >= "3.9" and python_version < "3.11"
67
67
  Requires-Dist: openai (>=0.28.1,<0.29.0)
68
- Requires-Dist: opentelemetry-api (>=1.15.0,<1.16.0)
69
- Requires-Dist: opentelemetry-exporter-jaeger (>=1.15.0,<1.16.0)
70
- Requires-Dist: opentelemetry-exporter-otlp (>=1.15.0,<1.16.0)
71
- Requires-Dist: opentelemetry-sdk (>=1.15.0,<1.16.0)
72
- Requires-Dist: packaging (>=20.9,<21.0)
73
- Requires-Dist: pep440-version-utils (>=0.3.0,<0.4.0)
68
+ Requires-Dist: opentelemetry-api (>=1.16.0,<1.17.0)
69
+ Requires-Dist: opentelemetry-exporter-jaeger (>=1.16.0,<1.17.0)
70
+ Requires-Dist: opentelemetry-exporter-otlp (>=1.16.0,<1.17.0)
71
+ Requires-Dist: opentelemetry-sdk (>=1.16.0,<1.17.0)
72
+ Requires-Dist: packaging (>=21.3,<21.4)
73
+ Requires-Dist: pep440-version-utils (>=1.1.0,<1.2.0)
74
74
  Requires-Dist: pluggy (>=1.2.0,<2.0.0)
75
75
  Requires-Dist: portalocker (>=2.7.0,<3.0.0)
76
76
  Requires-Dist: presidio-analyzer (>=2.2.33,<2.2.34)
77
77
  Requires-Dist: presidio-anonymizer (>=2.2.33,<2.2.34)
78
78
  Requires-Dist: prompt-toolkit (>=3.0.28,<3.0.29)
79
- Requires-Dist: protobuf (>=4.23.3,<4.23.4)
79
+ Requires-Dist: protobuf (>=4.23.3,<4.25.4)
80
80
  Requires-Dist: psutil (>=5.9.5,<6.0.0)
81
81
  Requires-Dist: psycopg2-binary (>=2.9.9,<2.10.0)
82
82
  Requires-Dist: pycountry (>=22.3.5,<23.0.0)
@@ -94,26 +94,26 @@ Requires-Dist: python-socketio (>=5.8,<6)
94
94
  Requires-Dist: pytz (>=2022.7.1,<2023.0)
95
95
  Requires-Dist: pyyaml (>=6.0)
96
96
  Requires-Dist: qdrant-client (>=1.9.0,<2.0.0)
97
- Requires-Dist: questionary (>=1.10.0,<1.11.0)
97
+ Requires-Dist: questionary (>=1.10.0,<2.1.0)
98
98
  Requires-Dist: randomname (>=0.2.1,<0.3.0)
99
- Requires-Dist: rasa-sdk (>=3.8.0,<3.9.0)
99
+ Requires-Dist: rasa-sdk (==3.9.1)
100
100
  Requires-Dist: redis (>=4.6.0,<6.0)
101
101
  Requires-Dist: regex (>=2022.10.31,<2022.11)
102
102
  Requires-Dist: requests (>=2.31.0,<2.32.0)
103
103
  Requires-Dist: rich (>=13.4.2,<14.0.0)
104
104
  Requires-Dist: rocketchat_API (>=1.30.0,<1.31.0)
105
105
  Requires-Dist: ruamel.yaml (>=0.17.21,<0.17.22)
106
- Requires-Dist: sanic (>=21.12.2,<21.13.0)
107
- Requires-Dist: sanic-cors (>=2.0.1,<2.1.0)
106
+ Requires-Dist: sanic (>=22.12,<22.13)
107
+ Requires-Dist: sanic-cors (>=2.2.0,<2.3.0)
108
108
  Requires-Dist: sanic-jwt (>=1.8.0,<2.0.0)
109
- Requires-Dist: sanic-routing (>=0.7.2,<0.8.0)
109
+ Requires-Dist: sanic-routing (>=22.8.0,<23.0.0)
110
110
  Requires-Dist: scikit-learn (>=1.1.3,<1.2) ; python_version >= "3.9" and python_version < "3.11"
111
111
  Requires-Dist: scipy (>=1.10.1,<1.11.0) ; python_version >= "3.9" and python_version < "3.11"
112
112
  Requires-Dist: sentencepiece[sentencepiece] (>=0.1.99,<0.2.0) ; extra == "transformers" or extra == "full"
113
113
  Requires-Dist: sentry-sdk (>=1.14.0,<1.15.0)
114
114
  Requires-Dist: setuptools (>=70.0.0,<70.1.0)
115
115
  Requires-Dist: sklearn-crfsuite (>=0.3.6,<0.4.0)
116
- Requires-Dist: slack-sdk (>=3.21.3,<4.0.0)
116
+ Requires-Dist: slack-sdk (>=3.27.1,<4.0.0)
117
117
  Requires-Dist: spacy (>=3.5.4,<4.0.0) ; extra == "spacy" or extra == "full"
118
118
  Requires-Dist: structlog (>=23.1.0,<23.2.0)
119
119
  Requires-Dist: structlog-sentry (>=2.0.3,<3.0.0)
@@ -131,7 +131,7 @@ Requires-Dist: tensorflow-text (==2.14.0) ; sys_platform != "win32" and (platfor
131
131
  Requires-Dist: tensorflow_hub (>=0.13.0,<0.14.0)
132
132
  Requires-Dist: terminaltables (>=3.1.10,<3.2.0)
133
133
  Requires-Dist: tiktoken (>=0.4.0,<0.5.0)
134
- Requires-Dist: tqdm (>=4.66,<5.0)
134
+ Requires-Dist: tqdm (>=4.66.2,<5.0.0)
135
135
  Requires-Dist: transformers (>=4.36.2,<4.37.0) ; extra == "transformers" or extra == "full"
136
136
  Requires-Dist: twilio (>=8.4,<8.5)
137
137
  Requires-Dist: types-protobuf (==4.25.0.20240417)
@@ -157,11 +157,11 @@ Description-Content-Type: text/markdown
157
157
 
158
158
  <hr />
159
159
 
160
- <img align="right" height="255" src="https://www.rasa.com/assets/img/sara/sara-open-source-2.0.png" alt="An image of Sara, the Rasa mascot bird, holding a flag that reads Open Source with one wing, and a wrench in the other" title="Rasa Open Source">
160
+ <img align="right" height="255" src="https://www.rasa.com/assets/img/sara/sara-open-source-2.0.png" alt="An image of Sara, the Rasa mascot bird, holding a flag that reads Open Source with one wing, and a wrench in the other" title="Rasa Pro">
161
161
 
162
162
  Rasa Pro is an open core product that extends Rasa Open Source. With over 50 million downloads, Rasa Open Source is the most popular open source framework for building chat and voice-based AI assistants.
163
163
 
164
- Rasa Pro extends Rasa Open Source with CALM, a generative AI-native approach to developing assistants, combined with enterprise-ready analytics, security, and observability capabilities. A paid license is required to run Rasa Pro, but all Rasa Pro code is visible to end users and can be customized as needed.
164
+ Rasa Pro introduces CALM, a generative AI-native approach to developing assistants, combined with enterprise-ready analytics, security, and observability capabilities. A paid license is required to run Rasa Pro, but all Rasa Pro code is visible to end users and can be customized as needed.
165
165
 
166
166
  Rasa Pro is the pro-code component of our enterprise solution, Rasa Platform, for implementing resilient and trustworthy AI assistants at scale. Rasa Studio complements Rasa Pro with a low-code user interface, enabling anyone on your team to create and improve your assistant.
167
167
 
@@ -359,8 +359,8 @@ The Docker image is available on your local machine as `rasa-private-dev`.
359
359
 
360
360
  ### Code Style
361
361
 
362
- To ensure a standardized code style we use the formatter [black](https://github.com/ambv/black).
363
- To ensure our type annotations are correct we use the type checker [pytype](https://github.com/google/pytype).
362
+ To ensure a standardized code style we use the [ruff](https://docs.astral.sh/ruff/formatter/) formatter.
363
+ To ensure our type annotations are correct we use the type checker [mypy](https://mypy.readthedocs.io/en/stable/).
364
364
  If your code is not formatted properly or doesn't type check, GitHub will fail to build.
365
365
 
366
366
  #### Formatting
@@ -369,7 +369,7 @@ If you want to automatically format your code on every commit, you can use [pre-
369
369
  Just install it via `pip install pre-commit` and execute `pre-commit install` in the root folder.
370
370
  This will add a hook to the repository, which reformats files on every commit.
371
371
 
372
- If you want to set it up manually, install black via `poetry install`.
372
+ If you want to set it up manually, install `ruff` via `poetry install`.
373
373
  To reformat files execute
374
374
  ```
375
375
  make formatter