rasa-pro 3.9.18__py3-none-any.whl β 3.10.4__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.
- README.md +26 -57
- rasa/__init__.py +1 -2
- rasa/__main__.py +5 -0
- rasa/anonymization/anonymization_rule_executor.py +2 -2
- rasa/api.py +26 -22
- rasa/cli/arguments/data.py +27 -2
- rasa/cli/arguments/default_arguments.py +25 -3
- rasa/cli/arguments/run.py +9 -9
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +70 -8
- rasa/cli/e2e_test.py +108 -433
- rasa/cli/interactive.py +1 -0
- rasa/cli/llm_fine_tuning.py +395 -0
- rasa/cli/project_templates/calm/endpoints.yml +1 -1
- rasa/cli/project_templates/tutorial/endpoints.yml +1 -1
- rasa/cli/run.py +14 -13
- rasa/cli/scaffold.py +10 -8
- rasa/cli/train.py +8 -7
- rasa/cli/utils.py +15 -0
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +98 -49
- rasa/core/actions/action_run_slot_rejections.py +4 -1
- rasa/core/actions/custom_action_executor.py +9 -6
- rasa/core/actions/direct_custom_actions_executor.py +80 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +68 -0
- rasa/core/actions/grpc_custom_action_executor.py +2 -2
- rasa/core/actions/http_custom_action_executor.py +6 -5
- rasa/core/agent.py +21 -17
- rasa/core/channels/__init__.py +2 -0
- rasa/core/channels/audiocodes.py +1 -16
- rasa/core/channels/inspector/dist/index.html +0 -2
- rasa/core/channels/inspector/index.html +0 -2
- rasa/core/channels/voice_aware/__init__.py +0 -0
- rasa/core/channels/voice_aware/jambonz.py +103 -0
- rasa/core/channels/voice_aware/jambonz_protocol.py +344 -0
- rasa/core/channels/voice_aware/utils.py +20 -0
- rasa/core/channels/voice_native/__init__.py +0 -0
- rasa/core/constants.py +6 -1
- rasa/core/featurizers/single_state_featurizer.py +1 -22
- rasa/core/featurizers/tracker_featurizers.py +18 -115
- rasa/core/information_retrieval/faiss.py +7 -4
- rasa/core/information_retrieval/information_retrieval.py +8 -0
- rasa/core/information_retrieval/milvus.py +9 -2
- rasa/core/information_retrieval/qdrant.py +1 -1
- rasa/core/nlg/contextual_response_rephraser.py +32 -10
- rasa/core/nlg/summarize.py +4 -3
- rasa/core/policies/enterprise_search_policy.py +100 -44
- rasa/core/policies/flows/flow_executor.py +130 -94
- rasa/core/policies/intentless_policy.py +52 -28
- rasa/core/policies/ted_policy.py +33 -58
- rasa/core/policies/unexpected_intent_policy.py +7 -15
- rasa/core/processor.py +20 -53
- rasa/core/run.py +5 -4
- rasa/core/tracker_store.py +8 -4
- rasa/core/utils.py +45 -56
- rasa/dialogue_understanding/coexistence/llm_based_router.py +45 -12
- rasa/dialogue_understanding/commands/__init__.py +4 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +0 -6
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +1 -5
- rasa/dialogue_understanding/commands/utils.py +38 -0
- rasa/dialogue_understanding/generator/constants.py +10 -3
- rasa/dialogue_understanding/generator/flow_retrieval.py +14 -5
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +12 -2
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -87
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +28 -6
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +90 -37
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +15 -15
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/processor/command_processor.py +13 -14
- rasa/e2e_test/aggregate_test_stats_calculator.py +124 -0
- rasa/e2e_test/assertions.py +1181 -0
- rasa/e2e_test/assertions_schema.yml +106 -0
- rasa/e2e_test/constants.py +20 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +131 -8
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +26 -6
- rasa/e2e_test/e2e_test_runner.py +491 -72
- rasa/e2e_test/e2e_test_schema.yml +96 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +596 -0
- rasa/e2e_test/utils/validation.py +80 -0
- rasa/engine/recipes/default_components.py +0 -2
- rasa/engine/storage/local_model_storage.py +0 -1
- rasa/env.py +9 -0
- rasa/keys +1 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/notebooks/unsloth_finetuning.ipynb +407 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/model_training.py +48 -16
- rasa/nlu/classifiers/diet_classifier.py +25 -38
- rasa/nlu/classifiers/logistic_regression_classifier.py +9 -44
- rasa/nlu/classifiers/sklearn_intent_classifier.py +16 -37
- rasa/nlu/extractors/crf_entity_extractor.py +50 -93
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +45 -78
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +17 -52
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +3 -5
- rasa/nlu/persistor.py +129 -32
- rasa/server.py +45 -10
- rasa/shared/constants.py +63 -15
- rasa/shared/core/domain.py +15 -12
- rasa/shared/core/events.py +28 -2
- rasa/shared/core/flows/flow.py +208 -13
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flows_list.py +28 -10
- rasa/shared/core/flows/flows_yaml_schema.json +269 -193
- rasa/shared/core/flows/validation.py +112 -25
- rasa/shared/core/flows/yaml_flows_io.py +149 -10
- rasa/shared/core/trackers.py +6 -0
- rasa/shared/core/training_data/visualization.html +2 -2
- rasa/shared/exceptions.py +4 -0
- rasa/shared/importers/importer.py +60 -11
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/nlu/constants.py +2 -0
- rasa/shared/nlu/training_data/features.py +2 -120
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +181 -0
- rasa/shared/providers/_configs/client_config.py +57 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +130 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +234 -0
- rasa/shared/providers/_configs/openai_client_config.py +175 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +171 -0
- rasa/shared/providers/_configs/utils.py +101 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +254 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +277 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +102 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +227 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +338 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +84 -0
- rasa/shared/providers/llm/llm_client.py +76 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +155 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +169 -0
- rasa/shared/providers/mappings.py +75 -0
- rasa/shared/utils/cli.py +30 -0
- rasa/shared/utils/io.py +65 -3
- rasa/shared/utils/llm.py +223 -200
- rasa/shared/utils/yaml.py +122 -7
- rasa/studio/download.py +19 -13
- rasa/studio/train.py +2 -3
- rasa/studio/upload.py +2 -3
- rasa/telemetry.py +113 -58
- rasa/tracing/config.py +2 -3
- rasa/tracing/instrumentation/attribute_extractors.py +29 -17
- rasa/tracing/instrumentation/instrumentation.py +4 -47
- rasa/utils/common.py +18 -19
- rasa/utils/endpoints.py +7 -4
- rasa/utils/io.py +66 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +9 -1
- rasa/utils/ml_utils.py +4 -2
- rasa/utils/tensorflow/model_data.py +193 -2
- rasa/validator.py +196 -1
- rasa/version.py +1 -1
- {rasa_pro-3.9.18.dist-info β rasa_pro-3.10.4.dist-info}/METADATA +47 -72
- {rasa_pro-3.9.18.dist-info β rasa_pro-3.10.4.dist-info}/RECORD +186 -121
- rasa/nlu/classifiers/llm_intent_classifier.py +0 -519
- rasa/shared/providers/openai/clients.py +0 -43
- rasa/shared/providers/openai/session_handler.py +0 -110
- rasa/utils/tensorflow/feature_array.py +0 -366
- /rasa/{shared/providers/openai β cli/project_templates/tutorial/actions}/__init__.py +0 -0
- /rasa/cli/project_templates/tutorial/{actions.py β actions/actions.py} +0 -0
- {rasa_pro-3.9.18.dist-info β rasa_pro-3.10.4.dist-info}/NOTICE +0 -0
- {rasa_pro-3.9.18.dist-info β rasa_pro-3.10.4.dist-info}/WHEEL +0 -0
- {rasa_pro-3.9.18.dist-info β rasa_pro-3.10.4.dist-info}/entry_points.txt +0 -0
rasa/validator.py
CHANGED
|
@@ -7,6 +7,7 @@ from typing import Set, Text, Optional, Dict, Any, List, Tuple
|
|
|
7
7
|
|
|
8
8
|
from jinja2 import Template
|
|
9
9
|
from pypred import Predicate
|
|
10
|
+
from pypred.ast import Literal, CompareOperator, NegateOperator
|
|
10
11
|
|
|
11
12
|
import rasa.core.training.story_conflict
|
|
12
13
|
from rasa.core.channels import UserMessage
|
|
@@ -44,7 +45,7 @@ from rasa.shared.core.domain import (
|
|
|
44
45
|
)
|
|
45
46
|
from rasa.shared.core.generator import TrainingDataGenerator
|
|
46
47
|
from rasa.shared.core.constants import SlotMappingType, MAPPING_TYPE
|
|
47
|
-
from rasa.shared.core.slots import ListSlot, Slot
|
|
48
|
+
from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, ListSlot, Slot
|
|
48
49
|
from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
|
|
49
50
|
YAMLStoryReader,
|
|
50
51
|
)
|
|
@@ -893,6 +894,191 @@ class Validator:
|
|
|
893
894
|
|
|
894
895
|
return pred, all_good
|
|
895
896
|
|
|
897
|
+
def _extract_predicate_syntax_tree(self, predicate: Predicate) -> Any:
|
|
898
|
+
"""Extract the predicate syntax tree from the given predicate.
|
|
899
|
+
|
|
900
|
+
Args:
|
|
901
|
+
predicate: The predicate from which to extract the syntax tree.
|
|
902
|
+
|
|
903
|
+
Returns:
|
|
904
|
+
The extracted syntax tree.
|
|
905
|
+
"""
|
|
906
|
+
if isinstance(predicate.ast, NegateOperator):
|
|
907
|
+
return predicate.ast.left
|
|
908
|
+
return predicate.ast
|
|
909
|
+
|
|
910
|
+
def _extract_slot_name_and_slot_value(
|
|
911
|
+
self,
|
|
912
|
+
predicate_syntax_tree: Any,
|
|
913
|
+
) -> tuple:
|
|
914
|
+
"""Extract the slot name and slot value from the predicate syntax tree.
|
|
915
|
+
|
|
916
|
+
Args:
|
|
917
|
+
predicate_syntax_tree: The predicate syntax tree.
|
|
918
|
+
|
|
919
|
+
Returns:
|
|
920
|
+
A tuple containing the slot name and slot value.
|
|
921
|
+
"""
|
|
922
|
+
try:
|
|
923
|
+
if isinstance(predicate_syntax_tree.left, Literal):
|
|
924
|
+
slot_name = predicate_syntax_tree.left.value.split(".")
|
|
925
|
+
slot_value = predicate_syntax_tree.right.value
|
|
926
|
+
else:
|
|
927
|
+
slot_name = predicate_syntax_tree.right.value.split(".")
|
|
928
|
+
slot_value = predicate_syntax_tree.left.value
|
|
929
|
+
except AttributeError:
|
|
930
|
+
# predicate only has negation and doesn't need to be checked further
|
|
931
|
+
return None, None
|
|
932
|
+
return slot_name, slot_value
|
|
933
|
+
|
|
934
|
+
def _validate_categorical_value_check(
|
|
935
|
+
self,
|
|
936
|
+
slot_name: str,
|
|
937
|
+
slot_value: Any,
|
|
938
|
+
valid_slot_values: List[str],
|
|
939
|
+
all_good: bool,
|
|
940
|
+
step_id: str,
|
|
941
|
+
link_condition: str,
|
|
942
|
+
flow_id: str,
|
|
943
|
+
) -> bool:
|
|
944
|
+
"""Validates the categorical slot check.
|
|
945
|
+
|
|
946
|
+
Validates that the categorical slot is checked against valid values.
|
|
947
|
+
|
|
948
|
+
Args:
|
|
949
|
+
slot_name: name of the slot to be checked
|
|
950
|
+
slot_value: value of the slot to be checked
|
|
951
|
+
valid_slot_values: valid values for the given slot
|
|
952
|
+
all_good: flag whether all the validations have passed so far
|
|
953
|
+
step_id: id of the step in which the values are being checked
|
|
954
|
+
link_condition: condition where the values are being checked
|
|
955
|
+
flow_id: id of the flow where the values are being checked
|
|
956
|
+
|
|
957
|
+
Returns:
|
|
958
|
+
False, if validation failed, previous value of all_good, otherwise
|
|
959
|
+
"""
|
|
960
|
+
valid_slot_values.append(None)
|
|
961
|
+
# slot_value can either be None, a string or a list of Literal objects
|
|
962
|
+
if slot_value is None:
|
|
963
|
+
slot_value = [None]
|
|
964
|
+
if isinstance(slot_value, str):
|
|
965
|
+
slot_value = [Literal(slot_value)]
|
|
966
|
+
|
|
967
|
+
slot_values_validity = [
|
|
968
|
+
sv is None
|
|
969
|
+
or re.sub(r'^[\'"](.+)[\'"]$', r"\1", sv.value) in valid_slot_values
|
|
970
|
+
for sv in slot_value
|
|
971
|
+
]
|
|
972
|
+
if not all(slot_values_validity):
|
|
973
|
+
invalid_slot_values = [
|
|
974
|
+
sv
|
|
975
|
+
for (sv, slot_value_valid) in zip(slot_value, slot_values_validity)
|
|
976
|
+
if not slot_value_valid
|
|
977
|
+
]
|
|
978
|
+
structlogger.error(
|
|
979
|
+
"validator.verify_predicates.link.invalid_condition",
|
|
980
|
+
step=step_id,
|
|
981
|
+
link=link_condition,
|
|
982
|
+
flow=flow_id,
|
|
983
|
+
event_info=(
|
|
984
|
+
f"Detected invalid condition '{link_condition}' "
|
|
985
|
+
f"at step '{step_id}' for flow id '{flow_id}'. "
|
|
986
|
+
f"Values {invalid_slot_values} are not valid values "
|
|
987
|
+
f"for slot {slot_name}. "
|
|
988
|
+
f"Please make sure that all conditions are valid."
|
|
989
|
+
),
|
|
990
|
+
)
|
|
991
|
+
return False
|
|
992
|
+
return all_good
|
|
993
|
+
|
|
994
|
+
def _validate_categorical_and_boolean_values_check(
|
|
995
|
+
self,
|
|
996
|
+
predicate: Predicate,
|
|
997
|
+
all_good: bool,
|
|
998
|
+
step_id: str,
|
|
999
|
+
link_condition: str,
|
|
1000
|
+
flow_id: str,
|
|
1001
|
+
) -> bool:
|
|
1002
|
+
"""Validates the categorical and boolean slot checks.
|
|
1003
|
+
|
|
1004
|
+
Validates that the categorical and boolean slots
|
|
1005
|
+
are checked against valid values.
|
|
1006
|
+
|
|
1007
|
+
Args:
|
|
1008
|
+
predicate: condition that is supposed to be validated
|
|
1009
|
+
all_good: flag whether all the validations have passed so far
|
|
1010
|
+
step_id: id of the step in which the values are being checked
|
|
1011
|
+
link_condition: condition where the values are being checked
|
|
1012
|
+
flow_id: id of the flow where the values are being checked
|
|
1013
|
+
|
|
1014
|
+
Returns:
|
|
1015
|
+
False, if validation failed, previous value of all_good, otherwise
|
|
1016
|
+
"""
|
|
1017
|
+
predicate_syntax_tree = self._extract_predicate_syntax_tree(predicate)
|
|
1018
|
+
slot_name, slot_value = self._extract_slot_name_and_slot_value(
|
|
1019
|
+
predicate_syntax_tree
|
|
1020
|
+
)
|
|
1021
|
+
|
|
1022
|
+
if slot_name is None:
|
|
1023
|
+
return all_good
|
|
1024
|
+
|
|
1025
|
+
if slot_name[0] == "slots":
|
|
1026
|
+
slot_name = slot_name[1]
|
|
1027
|
+
# slots.{{context.variable}} gets evaluated to `slots.None`,
|
|
1028
|
+
# these predicates can only be validated during runtime
|
|
1029
|
+
if slot_name == "None":
|
|
1030
|
+
return all_good
|
|
1031
|
+
else:
|
|
1032
|
+
return all_good
|
|
1033
|
+
|
|
1034
|
+
try:
|
|
1035
|
+
slot = next(slot for slot in self.domain.slots if slot.name == slot_name)
|
|
1036
|
+
except StopIteration:
|
|
1037
|
+
structlogger.error(
|
|
1038
|
+
"validator.verify_predicates.link.invalid_condition",
|
|
1039
|
+
step=step_id,
|
|
1040
|
+
link=link_condition,
|
|
1041
|
+
flow=flow_id,
|
|
1042
|
+
event_info=(
|
|
1043
|
+
f"Detected invalid condition '{link_condition}' "
|
|
1044
|
+
f"at step '{step_id}' for flow id '{flow_id}'. "
|
|
1045
|
+
f"Slot {slot_name} is not defined in the domain file. "
|
|
1046
|
+
f"Please make sure that all conditions are valid."
|
|
1047
|
+
),
|
|
1048
|
+
)
|
|
1049
|
+
return False
|
|
1050
|
+
if isinstance(slot, CategoricalSlot):
|
|
1051
|
+
return self._validate_categorical_value_check(
|
|
1052
|
+
slot_name,
|
|
1053
|
+
slot_value,
|
|
1054
|
+
slot.values,
|
|
1055
|
+
all_good,
|
|
1056
|
+
step_id,
|
|
1057
|
+
link_condition,
|
|
1058
|
+
flow_id,
|
|
1059
|
+
)
|
|
1060
|
+
|
|
1061
|
+
if (
|
|
1062
|
+
isinstance(slot, BooleanSlot)
|
|
1063
|
+
and isinstance(predicate_syntax_tree, CompareOperator)
|
|
1064
|
+
and not isinstance(predicate_syntax_tree.right.value, bool)
|
|
1065
|
+
):
|
|
1066
|
+
structlogger.error(
|
|
1067
|
+
"validator.verify_predicates.link.invalid_condition",
|
|
1068
|
+
step=step_id,
|
|
1069
|
+
link=link_condition,
|
|
1070
|
+
flow=flow_id,
|
|
1071
|
+
event_info=(
|
|
1072
|
+
f"Detected invalid condition '{link_condition}' "
|
|
1073
|
+
f"at step '{step_id}' for flow id '{flow_id}'. "
|
|
1074
|
+
f"Boolean slots can only be compared to "
|
|
1075
|
+
f"boolean values (true, false). "
|
|
1076
|
+
f"Please make sure that all conditions are valid."
|
|
1077
|
+
),
|
|
1078
|
+
)
|
|
1079
|
+
return False
|
|
1080
|
+
return all_good
|
|
1081
|
+
|
|
896
1082
|
def verify_predicates(self) -> bool:
|
|
897
1083
|
"""Validate predicates used in flow step links and slot rejections."""
|
|
898
1084
|
all_good = True
|
|
@@ -946,6 +1132,15 @@ class Validator:
|
|
|
946
1132
|
),
|
|
947
1133
|
)
|
|
948
1134
|
all_good = False
|
|
1135
|
+
|
|
1136
|
+
all_good = self._validate_categorical_and_boolean_values_check(
|
|
1137
|
+
predicate,
|
|
1138
|
+
all_good=all_good,
|
|
1139
|
+
step_id=step.id,
|
|
1140
|
+
link_condition=link.condition,
|
|
1141
|
+
flow_id=flow.id,
|
|
1142
|
+
)
|
|
1143
|
+
|
|
949
1144
|
if isinstance(step, CollectInformationFlowStep):
|
|
950
1145
|
predicates = [predicate.if_ for predicate in step.rejections]
|
|
951
1146
|
for predicate in predicates:
|
rasa/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: rasa-pro
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.10.4
|
|
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
|
|
@@ -19,6 +19,7 @@ Provides-Extra: full
|
|
|
19
19
|
Provides-Extra: gh-release-notes
|
|
20
20
|
Provides-Extra: jieba
|
|
21
21
|
Provides-Extra: metal
|
|
22
|
+
Provides-Extra: mlflow
|
|
22
23
|
Provides-Extra: spacy
|
|
23
24
|
Provides-Extra: transformers
|
|
24
25
|
Requires-Dist: CacheControl (>=0.12.14,<0.13.0)
|
|
@@ -31,8 +32,9 @@ Requires-Dist: aiohttp (>=3.9.4,<3.10)
|
|
|
31
32
|
Requires-Dist: apscheduler (>=3.10,<3.11)
|
|
32
33
|
Requires-Dist: attrs (>=23.1,<23.2)
|
|
33
34
|
Requires-Dist: azure-storage-blob (>=12.16.0,<12.17.0)
|
|
34
|
-
Requires-Dist: boto3 (>=1.
|
|
35
|
+
Requires-Dist: boto3 (>=1.35.5,<1.36.0)
|
|
35
36
|
Requires-Dist: certifi (>=2024.2.2)
|
|
37
|
+
Requires-Dist: cloudpickle (>=2.2.1,<3.1)
|
|
36
38
|
Requires-Dist: colorama (>=0.4.6,<0.5.0) ; sys_platform == "win32"
|
|
37
39
|
Requires-Dist: colorclass (>=2.2,<2.3)
|
|
38
40
|
Requires-Dist: coloredlogs (>=15,<16)
|
|
@@ -41,9 +43,10 @@ Requires-Dist: confluent-kafka (>=2.3.0,<3.0.0)
|
|
|
41
43
|
Requires-Dist: cryptography (>=42.0.5)
|
|
42
44
|
Requires-Dist: cvg-python-sdk (>=0.5.1,<0.6.0)
|
|
43
45
|
Requires-Dist: dask (==2022.10.2) ; python_version >= "3.9" and python_version < "3.11"
|
|
46
|
+
Requires-Dist: diskcache (>=5.6.3,<5.7.0)
|
|
44
47
|
Requires-Dist: dnspython (==2.6.1)
|
|
45
48
|
Requires-Dist: faiss-cpu (>=1.7.4,<2.0.0)
|
|
46
|
-
Requires-Dist: faker (>=
|
|
49
|
+
Requires-Dist: faker (>=26.0.0,<27.0.0)
|
|
47
50
|
Requires-Dist: fbmessenger (>=6.0.0,<6.1.0)
|
|
48
51
|
Requires-Dist: github3.py (>=3.2.0,<3.3.0) ; extra == "gh-release-notes"
|
|
49
52
|
Requires-Dist: google-auth (>=2.23.4,<3)
|
|
@@ -53,26 +56,31 @@ Requires-Dist: importlib-metadata (>=6.8.0,<7.0.0)
|
|
|
53
56
|
Requires-Dist: importlib-resources (>=6.1.1,<7.0.0)
|
|
54
57
|
Requires-Dist: jieba (>=0.42.1,<0.43) ; extra == "jieba" or extra == "full"
|
|
55
58
|
Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
|
|
59
|
+
Requires-Dist: joblib (>=1.2.0,<1.3.0)
|
|
56
60
|
Requires-Dist: jsonpatch (>=1.33,<2.0)
|
|
57
|
-
Requires-Dist: jsonpickle (>=3.
|
|
58
|
-
Requires-Dist: jsonschema (>=4.
|
|
61
|
+
Requires-Dist: jsonpickle (>=3.0,<3.1)
|
|
62
|
+
Requires-Dist: jsonschema (>=4.22)
|
|
59
63
|
Requires-Dist: keras (==2.14.0)
|
|
60
|
-
Requires-Dist: langchain (>=0.0
|
|
64
|
+
Requires-Dist: langchain (>=0.2.0,<0.3.0)
|
|
65
|
+
Requires-Dist: langchain-community (>=0.2.0,<0.3.0)
|
|
66
|
+
Requires-Dist: litellm (>=1.44.7,<1.45.0)
|
|
61
67
|
Requires-Dist: matplotlib (>=3.7,<3.8)
|
|
62
68
|
Requires-Dist: mattermostwrapper (>=2.2,<2.3)
|
|
69
|
+
Requires-Dist: mlflow (>=2.15.1,<3.0.0) ; extra == "mlflow"
|
|
63
70
|
Requires-Dist: networkx (>=3.1,<3.2)
|
|
64
71
|
Requires-Dist: numpy (>=1.23.5,<1.25.0) ; python_version >= "3.9" and python_version < "3.11"
|
|
65
|
-
Requires-Dist: openai (>=
|
|
72
|
+
Requires-Dist: openai (>=1.40.0,<1.41.0)
|
|
73
|
+
Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
|
|
66
74
|
Requires-Dist: opentelemetry-api (>=1.16.0,<1.17.0)
|
|
67
75
|
Requires-Dist: opentelemetry-exporter-jaeger (>=1.16.0,<1.17.0)
|
|
68
76
|
Requires-Dist: opentelemetry-exporter-otlp (>=1.16.0,<1.17.0)
|
|
69
77
|
Requires-Dist: opentelemetry-sdk (>=1.16.0,<1.17.0)
|
|
70
|
-
Requires-Dist: packaging (>=
|
|
78
|
+
Requires-Dist: packaging (>=23.2,<23.3)
|
|
71
79
|
Requires-Dist: pep440-version-utils (>=1.1.0,<1.2.0)
|
|
72
80
|
Requires-Dist: pluggy (>=1.2.0,<2.0.0)
|
|
73
81
|
Requires-Dist: portalocker (>=2.7.0,<3.0.0)
|
|
74
82
|
Requires-Dist: presidio-analyzer (>=2.2.33,<2.2.34)
|
|
75
|
-
Requires-Dist: presidio-anonymizer (>=2.2.
|
|
83
|
+
Requires-Dist: presidio-anonymizer (>=2.2.354,<3.0.0)
|
|
76
84
|
Requires-Dist: prompt-toolkit (>=3.0.28,<3.0.29)
|
|
77
85
|
Requires-Dist: protobuf (>=4.23.3,<4.25.4)
|
|
78
86
|
Requires-Dist: psutil (>=5.9.5,<6.0.0)
|
|
@@ -81,27 +89,26 @@ Requires-Dist: pycountry (>=22.3.5,<23.0.0)
|
|
|
81
89
|
Requires-Dist: pydantic (>=2.0,<3.0)
|
|
82
90
|
Requires-Dist: pydot (>=1.4,<1.5)
|
|
83
91
|
Requires-Dist: pykwalify (>=1.8,<1.9)
|
|
84
|
-
Requires-Dist: pymilvus (
|
|
92
|
+
Requires-Dist: pymilvus (<2.4.2)
|
|
85
93
|
Requires-Dist: pymongo[srv,tls] (>=4.6.3,<4.7)
|
|
86
94
|
Requires-Dist: pypred (>=0.4.0,<0.5.0)
|
|
87
95
|
Requires-Dist: python-dateutil (>=2.8.2,<2.9.0)
|
|
88
96
|
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
|
89
97
|
Requires-Dist: python-engineio (>=4.5.1,<6,!=5.0.0)
|
|
90
|
-
Requires-Dist: python-keycloak (>=3.
|
|
98
|
+
Requires-Dist: python-keycloak (>=3.12.0,<4.0.0)
|
|
91
99
|
Requires-Dist: python-socketio (>=5.8,<6)
|
|
92
100
|
Requires-Dist: pytz (>=2022.7.1,<2023.0)
|
|
93
101
|
Requires-Dist: pyyaml (>=6.0)
|
|
94
102
|
Requires-Dist: qdrant-client (>=1.9.0,<2.0.0)
|
|
95
103
|
Requires-Dist: questionary (>=1.10.0,<2.1.0)
|
|
96
104
|
Requires-Dist: randomname (>=0.2.1,<0.3.0)
|
|
97
|
-
Requires-Dist: rasa-sdk (==3.
|
|
105
|
+
Requires-Dist: rasa-sdk (==3.10.0)
|
|
98
106
|
Requires-Dist: redis (>=4.6.0,<6.0)
|
|
99
107
|
Requires-Dist: regex (>=2022.10.31,<2022.11)
|
|
100
108
|
Requires-Dist: requests (>=2.31.0,<2.32.0)
|
|
101
109
|
Requires-Dist: rich (>=13.4.2,<14.0.0)
|
|
102
110
|
Requires-Dist: rocketchat_API (>=1.30.0,<1.31.0)
|
|
103
111
|
Requires-Dist: ruamel.yaml (>=0.17.21,<0.17.22)
|
|
104
|
-
Requires-Dist: safetensors (>=0.4.5,<0.5.0)
|
|
105
112
|
Requires-Dist: sanic (>=22.12,<22.13)
|
|
106
113
|
Requires-Dist: sanic-cors (>=2.2.0,<2.3.0)
|
|
107
114
|
Requires-Dist: sanic-jwt (>=1.8.0,<2.0.0)
|
|
@@ -112,7 +119,6 @@ Requires-Dist: sentencepiece[sentencepiece] (>=0.1.99,<0.2.0) ; extra == "transf
|
|
|
112
119
|
Requires-Dist: sentry-sdk (>=1.14.0,<1.15.0)
|
|
113
120
|
Requires-Dist: setuptools (>=70.0.0,<70.1.0)
|
|
114
121
|
Requires-Dist: sklearn-crfsuite (>=0.3.6,<0.4.0)
|
|
115
|
-
Requires-Dist: skops (>=0.10.0,<0.11.0)
|
|
116
122
|
Requires-Dist: slack-sdk (>=3.27.1,<4.0.0)
|
|
117
123
|
Requires-Dist: spacy (>=3.5.4,<4.0.0) ; extra == "spacy" or extra == "full"
|
|
118
124
|
Requires-Dist: structlog (>=23.1.0,<23.2.0)
|
|
@@ -130,7 +136,7 @@ Requires-Dist: tensorflow-metal (==1.1.0) ; (sys_platform == "darwin" and platfo
|
|
|
130
136
|
Requires-Dist: tensorflow-text (==2.14.0) ; sys_platform != "win32" and (platform_machine != "arm64" and platform_machine != "aarch64")
|
|
131
137
|
Requires-Dist: tensorflow_hub (>=0.13.0,<0.14.0)
|
|
132
138
|
Requires-Dist: terminaltables (>=3.1.10,<3.2.0)
|
|
133
|
-
Requires-Dist: tiktoken (>=0.
|
|
139
|
+
Requires-Dist: tiktoken (>=0.7.0,<0.8.0)
|
|
134
140
|
Requires-Dist: tqdm (>=4.66.2,<5.0.0)
|
|
135
141
|
Requires-Dist: transformers (>=4.36.2,<4.37.0) ; extra == "transformers" or extra == "full"
|
|
136
142
|
Requires-Dist: twilio (>=8.4,<8.5)
|
|
@@ -157,35 +163,39 @@ Description-Content-Type: text/markdown
|
|
|
157
163
|
|
|
158
164
|
<hr />
|
|
159
165
|
|
|
166
|
+
<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">
|
|
160
167
|
|
|
161
|
-
Rasa Pro is
|
|
168
|
+
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.
|
|
162
169
|
|
|
163
|
-
|
|
170
|
+
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.
|
|
164
171
|
|
|
165
|
-
|
|
172
|
+
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.
|
|
166
173
|
|
|
167
|
-
|
|
168
|
-
-
|
|
169
|
-
- **Customizable and Open:** Fully customizable code that allows developers to modify Rasa Pro to meet specific requirements, ensuring flexibility and adaptability to various conversational AI needs.
|
|
170
|
-
- **Robustness and Control:** Maintain strict adherence to business logic, preventing unwanted behaviors like prompt injection and hallucinations, leading to more reliable responses and secure interactions.
|
|
171
|
-
- **Built-in Security:** Safeguard sensitive data, control access, and ensure secure deployment, essential for production environments that demand high levels of security and compliance.
|
|
174
|
+
---
|
|
175
|
+
- π€ [Read The Docs](https://rasa.com/docs/rasa-pro/)
|
|
172
176
|
|
|
177
|
+
- π [Install Rasa Pro](https://rasa.com/docs/rasa-pro/installation/python/installation)
|
|
173
178
|
|
|
179
|
+
---
|
|
174
180
|
|
|
175
|
-
|
|
181
|
+
## README Contents:
|
|
182
|
+
- [Development Internals](#development-internals)
|
|
183
|
+
- [Releases](#releases)
|
|
184
|
+
- [Troubleshooting](#troubleshooting)
|
|
176
185
|
|
|
177
|
-
|
|
186
|
+
## Development Internals
|
|
178
187
|
|
|
179
|
-
|
|
188
|
+
### Installing Poetry
|
|
180
189
|
|
|
181
|
-
|
|
190
|
+
Rasa uses Poetry for packaging and dependency management. If you want to build it from source,
|
|
191
|
+
you have to install Poetry first. Please follow
|
|
192
|
+
[the official guide](https://python-poetry.org/docs/#installation) to see all possible options.
|
|
182
193
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
194
|
+
To update an existing poetry version to the [version](.github/poetry_version.txt), currently used in rasa, run:
|
|
195
|
+
```shell
|
|
196
|
+
poetry self update <version>
|
|
197
|
+
```
|
|
187
198
|
|
|
188
|
-
<<<<<<< HEAD
|
|
189
199
|
### Managing environments
|
|
190
200
|
|
|
191
201
|
The official [Poetry guide](https://python-poetry.org/docs/managing-environments/) suggests to use
|
|
@@ -379,39 +389,6 @@ To check the types execute
|
|
|
379
389
|
make types
|
|
380
390
|
```
|
|
381
391
|
|
|
382
|
-
### Backporting
|
|
383
|
-
|
|
384
|
-
In order to port changes to `main` and across release branches, we use the `backport` workflow located at
|
|
385
|
-
the `.github/workflows/backport.yml` path.
|
|
386
|
-
This workflow is triggered by the `backport-to-<release-branch>` label applied to a PR, for example `backport-to-3.8.x`.
|
|
387
|
-
Current available target branches are `main` and maintained release branches.
|
|
388
|
-
|
|
389
|
-
When a PR gets labelled `backport-to-<release-branch>`, a PR is opened by the `backport-github-action` as soon as the
|
|
390
|
-
source PR gets closed (by merging). If you want to close the PR without merging changes, make sure to remove the `backport-to-<release-branch>` label.
|
|
391
|
-
|
|
392
|
-
The PR author which the action assigns to the backporting PR has to resolve any conflicts before approving and merging.
|
|
393
|
-
Release PRs should also be labelled with `backport-to-main` to backport the `CHANGELOG.md` updates to `main`.
|
|
394
|
-
Backporting version updates should be accepted to the `main` branch from the latest release branch only.
|
|
395
|
-
|
|
396
|
-
Here are some guidelines to follow when backporting changes and resolving conflicts:
|
|
397
|
-
|
|
398
|
-
a) for conflicts in `version.py`: accept only the version from the latest release branch. Do not merge version changes
|
|
399
|
-
from earlier release branches into `main` because this could cause issues when trying to make the next minor release.
|
|
400
|
-
|
|
401
|
-
b) for conflicts in `pyproject.toml`: if related to the `rasa-pro` version, accept only the latest release branch;
|
|
402
|
-
if related to other dependencies, accept `main` or whichever is the higher upgrade (main usually has the updated
|
|
403
|
-
dependencies because we only do housekeeping on `main`, apart from vulnerability updates). Be mindful of dependencies that
|
|
404
|
-
are removed from `main` but still exist in former release branches (for example `langchain`).
|
|
405
|
-
|
|
406
|
-
c) for conflicts in `poetry.lock`: accept changes which were already present on the target branch, then run
|
|
407
|
-
`poetry lock --no-update` so that the lock file contains your changes from `pyproject.toml` too.
|
|
408
|
-
|
|
409
|
-
d) for conflicts in `CHANGELOG.md`: Manually place the changelog in their allocated section (e.g. 3.8.10 will go under the
|
|
410
|
-
3.8 section with the other releases, rather than go at the top of the file)
|
|
411
|
-
|
|
412
|
-
If the backporting workflow fails, you are encouraged to cherry-pick the commits manually and create a PR to
|
|
413
|
-
the target branch. Alternatively, you can install the backporting CLI tool as described [here](https://github.com/sorenlouv/backport?tab=readme-ov-file#install).
|
|
414
|
-
|
|
415
392
|
## Releases
|
|
416
393
|
Rasa has implemented robust policies governing version naming, as well as release pace for major, minor, and patch releases.
|
|
417
394
|
|
|
@@ -494,12 +471,9 @@ Releasing a new version is quite simple, as the packages are build and distribut
|
|
|
494
471
|
9. If however an error occurs in the build, then we should see a failure message automatically posted in the company's Slack (`dev-tribe` channel) like this [one](https://rasa-hq.slack.com/archives/C01M5TAHDHA/p1701444735622919)
|
|
495
472
|
(In this case do the following checks):
|
|
496
473
|
- Check the workflows in [Github Actions](https://github.com/RasaHQ/rasa-private/actions) and make sure that the merged PR of the current release is completed successfully. To easily find your PR you can use the filters `event: push` and `branch: <version number>` (example on release 2.4 you can see [here](https://github.com/RasaHQ/rasa/actions/runs/643344876))
|
|
497
|
-
- If the workflow is not completed, then try to re
|
|
474
|
+
- If the workflow is not completed, then try to re run the workflow in case that solves the problem
|
|
498
475
|
- If the problem persists, check also the log files and try to find the root cause of the issue
|
|
499
476
|
- If you still cannot resolve the error, contact the infrastructure team by providing any helpful information from your investigation
|
|
500
|
-
10. If the release is successful, add the newly created release branch to the backporting configuration in the `.backportrc.json` file to
|
|
501
|
-
the `targetBranchesChoices` list. This is necessary for the backporting workflow to work correctly with new release branches.
|
|
502
|
-
|
|
503
477
|
|
|
504
478
|
### Cutting a Patch release
|
|
505
479
|
|
|
@@ -548,6 +522,10 @@ steps.
|
|
|
548
522
|
|
|
549
523
|
Please refer to the [Rasa Product Release and Maintenance Policy](https://rasa.com/rasa-product-release-and-maintenance-policy/) page.
|
|
550
524
|
|
|
525
|
+
### Active workflows on the CI
|
|
526
|
+
|
|
527
|
+
Please refer to the [WORKFLOW_README FILE](https://github.com/RasaHQ/rasa-private/blob/main/WORKFLOW_README.md)
|
|
528
|
+
|
|
551
529
|
## Troubleshooting
|
|
552
530
|
|
|
553
531
|
- When running docker commands, if you encounter this error: `OSError No space left on device`, consider running:
|
|
@@ -557,7 +535,4 @@ Please refer to the [Rasa Product Release and Maintenance Policy](https://rasa.c
|
|
|
557
535
|
```
|
|
558
536
|
|
|
559
537
|
For more information on this command, please see the [Official Docker Documentation](https://docs.docker.com/engine/reference/commandline/system_prune/).
|
|
560
|
-
=======
|
|
561
|
-
for more. Also feel free to reach out to us on the [Rasa forum](https://forum.rasa.com/).
|
|
562
|
-
>>>>>>> 2c5cd7bc639 (update readme.md from main branch on 3.10.x (#1597))
|
|
563
538
|
|