rasa-pro 3.10.14__py3-none-any.whl → 3.10.15__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.

rasa/api.py CHANGED
@@ -41,7 +41,7 @@ def run(
41
41
  from rasa.shared.constants import DOCS_BASE_URL
42
42
  from rasa.shared.utils.cli import print_warning
43
43
 
44
- _endpoints = AvailableEndpoints.read_endpoints(endpoints)
44
+ _endpoints = AvailableEndpoints.get_instance(endpoints)
45
45
 
46
46
  if not connector and not credentials:
47
47
  connector = "rest"
rasa/cli/e2e_test.py CHANGED
@@ -164,7 +164,7 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
164
164
  args.endpoints = rasa.cli.utils.get_validated_path(
165
165
  args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
166
166
  )
167
- endpoints = AvailableEndpoints.read_endpoints(args.endpoints)
167
+ endpoints = AvailableEndpoints.get_instance(args.endpoints)
168
168
 
169
169
  # Ignore all endpoints apart from action server, model, nlu and nlg
170
170
  # to ensure InMemoryTrackerStore is being used instead of production
rasa/cli/evaluate.py CHANGED
@@ -217,6 +217,6 @@ def _create_tracker_loader(
217
217
  A MarkerTrackerLoader object configured with the specified strategy against
218
218
  the configured tracker store.
219
219
  """
220
- endpoints = AvailableEndpoints.read_endpoints(endpoint_config)
220
+ endpoints = AvailableEndpoints.get_instance(endpoint_config)
221
221
  tracker_store = TrackerStore.create(endpoints.tracker_store, domain=domain)
222
222
  return MarkerTrackerLoader(tracker_store, strategy, count, seed)
@@ -352,7 +352,7 @@ def get_valid_endpoints(endpoints_file: str) -> AvailableEndpoints:
352
352
  validated_endpoints_file = rasa.cli.utils.get_validated_path(
353
353
  endpoints_file, "endpoints", DEFAULT_ENDPOINTS_PATH, True
354
354
  )
355
- endpoints = AvailableEndpoints.read_endpoints(validated_endpoints_file)
355
+ endpoints = AvailableEndpoints.get_instance(validated_endpoints_file)
356
356
 
357
357
  # Ignore all endpoints apart from action server, model, nlu and nlg
358
358
  # to ensure InMemoryTrackerStore is being used instead of production
rasa/cli/run.py CHANGED
@@ -106,7 +106,7 @@ def run(args: argparse.Namespace) -> None:
106
106
  return
107
107
 
108
108
  # start server if model server is configured
109
- endpoints = AvailableEndpoints.read_endpoints(args.endpoints)
109
+ endpoints = AvailableEndpoints.get_instance(args.endpoints)
110
110
  model_server = endpoints.model if endpoints and endpoints.model else None
111
111
  if model_server is not None:
112
112
  rasa_run(**vars(args))
rasa/cli/train.py CHANGED
@@ -14,8 +14,10 @@ import rasa.core.utils
14
14
  import rasa.utils.common
15
15
  from rasa.api import train as train_all
16
16
  from rasa.cli import SubParsersAction
17
+ from rasa.core import ContextualResponseRephraser
17
18
  from rasa.core.nlg.generator import NaturalLanguageGenerator
18
19
  from rasa.core.train import do_compare_training
20
+ from rasa.engine.validation import validate_api_type_config_key_usage
19
21
  from rasa.nlu.persistor import get_persistor
20
22
  from rasa.shared.constants import (
21
23
  CONFIG_MANDATORY_KEYS,
@@ -23,6 +25,7 @@ from rasa.shared.constants import (
23
25
  CONFIG_MANDATORY_KEYS_NLU,
24
26
  DEFAULT_DATA_PATH,
25
27
  DEFAULT_DOMAIN_PATHS,
28
+ LLM_CONFIG_KEY,
26
29
  )
27
30
  from rasa.shared.exceptions import RasaException
28
31
  from rasa.shared.importers.importer import TrainingDataImporter
@@ -75,6 +78,12 @@ def add_subparser(
75
78
  def _check_nlg_endpoint_validity(endpoint: Union[Path, str]) -> None:
76
79
  try:
77
80
  endpoints = rasa.core.utils.read_endpoints_from_path(endpoint)
81
+ if endpoints.nlg is not None:
82
+ validate_api_type_config_key_usage(
83
+ endpoints.nlg.kwargs,
84
+ LLM_CONFIG_KEY,
85
+ ContextualResponseRephraser.__name__,
86
+ )
78
87
  NaturalLanguageGenerator.create(endpoints.nlg)
79
88
  except Exception as e:
80
89
  structlogger.error(
rasa/cli/x.py CHANGED
@@ -179,7 +179,7 @@ def run_in_enterprise_connection_mode(args: argparse.Namespace) -> None:
179
179
  print_success("Starting a Rasa server in Rasa Enterprise connection mode... 🚀")
180
180
 
181
181
  credentials_path, endpoints_path = _get_credentials_and_endpoints_paths(args)
182
- endpoints = AvailableEndpoints.read_endpoints(endpoints_path)
182
+ endpoints = AvailableEndpoints.get_instance(endpoints_path)
183
183
 
184
184
  _rasa_service(args, endpoints, None, credentials_path)
185
185
 
@@ -76,6 +76,7 @@ from rasa.shared.utils.llm import (
76
76
  sanitize_message_for_prompt,
77
77
  tracker_as_readable_transcript,
78
78
  try_instantiate_llm_client,
79
+ try_instantiate_embedder,
79
80
  )
80
81
  from rasa.core.information_retrieval.faiss import FAISS_Store
81
82
  from rasa.core.information_retrieval import (
@@ -661,6 +662,18 @@ class EnterpriseSearchPolicy(Policy):
661
662
  execution_context: ExecutionContext,
662
663
  **kwargs: Any,
663
664
  ) -> "EnterpriseSearchPolicy":
665
+ try_instantiate_llm_client(
666
+ config.get(LLM_CONFIG_KEY),
667
+ DEFAULT_LLM_CONFIG,
668
+ "enterprise_search_policy.load",
669
+ EnterpriseSearchPolicy.__name__,
670
+ )
671
+ try_instantiate_embedder(
672
+ config.get(EMBEDDINGS_CONFIG_KEY),
673
+ DEFAULT_EMBEDDINGS_CONFIG,
674
+ "enterprise_search_policy.load",
675
+ EnterpriseSearchPolicy.__name__,
676
+ )
664
677
  """Loads a trained policy (see parent class for full docstring)."""
665
678
  prompt_template = None
666
679
  store_type = config.get(VECTOR_STORE_PROPERTY, {}).get(
@@ -695,7 +708,6 @@ class EnterpriseSearchPolicy(Policy):
695
708
  logger.warning(
696
709
  "enterprise_search_policy.load.failed", error=e, resource=resource.name
697
710
  )
698
-
699
711
  return cls(
700
712
  config,
701
713
  model_storage,
@@ -484,7 +484,8 @@ def validate_collect_step(
484
484
  step: CollectInformationFlowStep,
485
485
  stack: DialogueStack,
486
486
  available_actions: List[str],
487
- slots: Dict[Text, Slot],
487
+ slots: Dict[str, Slot],
488
+ flow_name: str,
488
489
  ) -> bool:
489
490
  """Validate that a collect step can be executed.
490
491
 
@@ -507,12 +508,12 @@ def validate_collect_step(
507
508
  slot_name=step.collect,
508
509
  )
509
510
 
510
- cancel_flow_and_push_internal_error(stack)
511
+ cancel_flow_and_push_internal_error(stack, flow_name)
511
512
 
512
513
  return False
513
514
 
514
515
 
515
- def cancel_flow_and_push_internal_error(stack: DialogueStack) -> None:
516
+ def cancel_flow_and_push_internal_error(stack: DialogueStack, flow_name: str) -> None:
516
517
  """Cancel the top user flow and push the internal error pattern."""
517
518
  top_frame = stack.top()
518
519
 
@@ -524,7 +525,7 @@ def cancel_flow_and_push_internal_error(stack: DialogueStack) -> None:
524
525
  canceled_frames = CancelFlowCommand.select_canceled_frames(stack)
525
526
  stack.push(
526
527
  CancelPatternFlowStackFrame(
527
- canceled_name=top_frame.flow_id,
528
+ canceled_name=flow_name,
528
529
  canceled_frames=canceled_frames,
529
530
  )
530
531
  )
@@ -536,6 +537,7 @@ def validate_custom_slot_mappings(
536
537
  stack: DialogueStack,
537
538
  tracker: DialogueStateTracker,
538
539
  available_actions: List[str],
540
+ flow_name: str,
539
541
  ) -> bool:
540
542
  """Validate a slot with custom mappings.
541
543
 
@@ -556,7 +558,7 @@ def validate_custom_slot_mappings(
556
558
  action=step.collect_action,
557
559
  collect=step.collect,
558
560
  )
559
- cancel_flow_and_push_internal_error(stack)
561
+ cancel_flow_and_push_internal_error(stack, flow_name)
560
562
  return False
561
563
 
562
564
  return True
@@ -596,7 +598,12 @@ def run_step(
596
598
 
597
599
  if isinstance(step, CollectInformationFlowStep):
598
600
  return _run_collect_information_step(
599
- available_actions, initial_events, stack, step, tracker
601
+ available_actions,
602
+ initial_events,
603
+ stack,
604
+ step,
605
+ tracker,
606
+ flow.readable_name(),
600
607
  )
601
608
 
602
609
  elif isinstance(step, ActionFlowStep):
@@ -716,15 +723,18 @@ def _run_collect_information_step(
716
723
  stack: DialogueStack,
717
724
  step: CollectInformationFlowStep,
718
725
  tracker: DialogueStateTracker,
726
+ flow_name: str,
719
727
  ) -> FlowStepResult:
720
- is_step_valid = validate_collect_step(step, stack, available_actions, tracker.slots)
728
+ is_step_valid = validate_collect_step(
729
+ step, stack, available_actions, tracker.slots, flow_name
730
+ )
721
731
 
722
732
  if not is_step_valid:
723
733
  # if we return any other FlowStepResult, the assistant will stay silent
724
734
  # instead of triggering the internal error pattern
725
735
  return ContinueFlowWithNextStep(events=initial_events)
726
736
  is_mapping_valid = validate_custom_slot_mappings(
727
- step, stack, tracker, available_actions
737
+ step, stack, tracker, available_actions, flow_name
728
738
  )
729
739
 
730
740
  if not is_mapping_valid:
@@ -71,6 +71,7 @@ from rasa.shared.utils.llm import (
71
71
  sanitize_message_for_prompt,
72
72
  tracker_as_readable_transcript,
73
73
  try_instantiate_llm_client,
74
+ try_instantiate_embedder,
74
75
  )
75
76
  from rasa.utils.ml_utils import (
76
77
  extract_ai_response_examples,
@@ -918,6 +919,18 @@ class IntentlessPolicy(Policy):
918
919
  **kwargs: Any,
919
920
  ) -> "IntentlessPolicy":
920
921
  """Loads a trained policy (see parent class for full docstring)."""
922
+ try_instantiate_llm_client(
923
+ config.get(LLM_CONFIG_KEY),
924
+ DEFAULT_LLM_CONFIG,
925
+ "intentless_policy.load",
926
+ IntentlessPolicy.__name__,
927
+ )
928
+ try_instantiate_embedder(
929
+ config.get(EMBEDDINGS_CONFIG_KEY),
930
+ DEFAULT_EMBEDDINGS_CONFIG,
931
+ "intentless_policy.load",
932
+ IntentlessPolicy.__name__,
933
+ )
921
934
  responses_docsearch = None
922
935
  samples_docsearch = None
923
936
  prompt_template = None
@@ -943,7 +956,6 @@ class IntentlessPolicy(Policy):
943
956
  structlogger.warning(
944
957
  "intentless_policy.load.failed", error=e, resource_name=resource.name
945
958
  )
946
-
947
959
  return cls(
948
960
  config,
949
961
  model_storage,
rasa/core/processor.py CHANGED
@@ -1254,11 +1254,13 @@ class MessageProcessor:
1254
1254
  tracker.update(events[0])
1255
1255
  return self.should_predict_another_action(action.name())
1256
1256
  except Exception:
1257
- logger.exception(
1258
- f"Encountered an exception while running action '{action.name()}'."
1259
- "Bot will continue, but the actions events are lost. "
1260
- "Please check the logs of your action server for "
1261
- "more information."
1257
+ structlogger.exception(
1258
+ "rasa.core.processor.run_action.exception",
1259
+ event_info=f"Encountered an exception while "
1260
+ f"running action '{action.name()}'."
1261
+ f"Bot will continue, but the actions events are lost. "
1262
+ f"Please check the logs of your action server for "
1263
+ f"more information.",
1262
1264
  )
1263
1265
  events = []
1264
1266
 
@@ -1688,7 +1688,7 @@ def run_interactive_learning(
1688
1688
  p = None
1689
1689
 
1690
1690
  app = run.configure_app(port=port, conversation_id="default", enable_api=True)
1691
- endpoints = AvailableEndpoints.read_endpoints(server_args.get("endpoints"))
1691
+ endpoints = AvailableEndpoints.get_instance(server_args.get("endpoints"))
1692
1692
 
1693
1693
  # before_server_start handlers make sure the agent is loaded before the
1694
1694
  # interactive learning IO starts
rasa/core/utils.py CHANGED
@@ -171,6 +171,8 @@ def is_limit_reached(num_messages: int, limit: Optional[int]) -> bool:
171
171
  class AvailableEndpoints:
172
172
  """Collection of configured endpoints."""
173
173
 
174
+ _instance = None
175
+
174
176
  @classmethod
175
177
  def read_endpoints(cls, endpoint_file: Text) -> "AvailableEndpoints":
176
178
  """Read the different endpoints from a yaml file."""
@@ -217,6 +219,14 @@ class AvailableEndpoints:
217
219
  self.event_broker = event_broker
218
220
  self.vector_store = vector_store
219
221
 
222
+ @classmethod
223
+ def get_instance(cls, endpoint_file: Optional[Text] = None) -> "AvailableEndpoints":
224
+ """Get the singleton instance of AvailableEndpoints."""
225
+ # Ensure that the instance is initialized only once.
226
+ if cls._instance is None:
227
+ cls._instance = cls.read_endpoints(endpoint_file)
228
+ return cls._instance
229
+
220
230
 
221
231
  def read_endpoints_from_path(
222
232
  endpoints_path: Optional[Union[Path, Text]] = None,
@@ -234,7 +244,7 @@ def read_endpoints_from_path(
234
244
  endpoints_config_path = cli_utils.get_validated_path(
235
245
  endpoints_path, "endpoints", DEFAULT_ENDPOINTS_PATH, True
236
246
  )
237
- return AvailableEndpoints.read_endpoints(endpoints_config_path)
247
+ return AvailableEndpoints.get_instance(endpoints_config_path)
238
248
 
239
249
 
240
250
  def _lock_store_is_multi_worker_compatible(
@@ -161,7 +161,14 @@ class LLMBasedRouter(GraphComponent):
161
161
  "llm_based_router.load.failed", error=e, resource=resource.name
162
162
  )
163
163
 
164
- return cls(config, model_storage, resource, prompt_template=prompt_template)
164
+ router = cls(config, model_storage, resource, prompt_template=prompt_template)
165
+ try_instantiate_llm_client(
166
+ router.config.get(LLM_CONFIG_KEY),
167
+ DEFAULT_LLM_CONFIG,
168
+ "llm_based_router.load",
169
+ LLMBasedRouter.__name__,
170
+ )
171
+ return router
165
172
 
166
173
  @classmethod
167
174
  def create(
@@ -50,6 +50,7 @@ from rasa.shared.utils.llm import (
50
50
  USER,
51
51
  get_prompt_template,
52
52
  allowed_values_for_slot,
53
+ try_instantiate_embedder,
53
54
  )
54
55
 
55
56
  DEFAULT_FLOW_DOCUMENT_TEMPLATE = importlib.resources.read_text(
@@ -142,6 +143,12 @@ class FlowRetrieval:
142
143
  """Load flow retrieval with previously populated FAISS vector store."""
143
144
  # initialize base flow retrieval
144
145
  flow_retrieval = FlowRetrieval(config, model_storage, resource)
146
+ try_instantiate_embedder(
147
+ flow_retrieval.config.get(EMBEDDINGS_CONFIG_KEY),
148
+ DEFAULT_EMBEDDINGS_CONFIG,
149
+ "flow_retrieval.load",
150
+ FlowRetrieval.__name__,
151
+ )
145
152
  # load vector store
146
153
  vector_store = cls._load_vector_store(
147
154
  flow_retrieval.config, model_storage, resource
@@ -24,6 +24,7 @@ from rasa.dialogue_understanding.generator.constants import (
24
24
  LLM_CONFIG_KEY,
25
25
  USER_INPUT_CONFIG_KEY,
26
26
  FLOW_RETRIEVAL_KEY,
27
+ DEFAULT_LLM_CONFIG,
27
28
  )
28
29
  from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
29
30
  from rasa.dialogue_understanding.generator.llm_based_command_generator import (
@@ -53,6 +54,7 @@ from rasa.shared.utils.llm import (
53
54
  tracker_as_readable_transcript,
54
55
  sanitize_message_for_prompt,
55
56
  allowed_values_for_slot,
57
+ try_instantiate_llm_client,
56
58
  )
57
59
 
58
60
  # multistep template keys
@@ -141,6 +143,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
141
143
  prompts = cls._load_prompt_templates(model_storage, resource)
142
144
  # init base command generator
143
145
  command_generator = cls(config, model_storage, resource, prompts)
146
+ try_instantiate_llm_client(
147
+ command_generator.config.get(LLM_CONFIG_KEY),
148
+ DEFAULT_LLM_CONFIG,
149
+ "multi_step_llm_command_generator.load",
150
+ MultiStepLLMCommandGenerator.__name__,
151
+ )
144
152
  # load flow retrieval if enabled
145
153
  if command_generator.enabled_flow_retrieval:
146
154
  command_generator.flow_retrieval = cls.load_flow_retrival(
@@ -21,6 +21,7 @@ from rasa.dialogue_understanding.generator.constants import (
21
21
  LLM_CONFIG_KEY,
22
22
  USER_INPUT_CONFIG_KEY,
23
23
  FLOW_RETRIEVAL_KEY,
24
+ DEFAULT_LLM_CONFIG,
24
25
  )
25
26
  from rasa.dialogue_understanding.generator.flow_retrieval import (
26
27
  FlowRetrieval,
@@ -48,6 +49,7 @@ from rasa.shared.utils.llm import (
48
49
  get_prompt_template,
49
50
  tracker_as_readable_transcript,
50
51
  sanitize_message_for_prompt,
52
+ try_instantiate_llm_client,
51
53
  )
52
54
  from rasa.utils.log_utils import log_llm
53
55
 
@@ -136,6 +138,12 @@ class SingleStepLLMCommandGenerator(LLMBasedCommandGenerator):
136
138
  )
137
139
  # init base command generator
138
140
  command_generator = cls(config, model_storage, resource, prompt_template)
141
+ try_instantiate_llm_client(
142
+ command_generator.config.get(LLM_CONFIG_KEY),
143
+ DEFAULT_LLM_CONFIG,
144
+ "single_step_llm_command_generator.load",
145
+ SingleStepLLMCommandGenerator.__name__,
146
+ )
139
147
  # load flow retrieval if enabled
140
148
  if command_generator.enabled_flow_retrieval:
141
149
  command_generator.flow_retrieval = cls.load_flow_retrival(
@@ -35,6 +35,7 @@ class AggregateTestStatsCalculator:
35
35
  self.test_cases = test_cases
36
36
 
37
37
  self.failed_assertion_set: Set["Assertion"] = set()
38
+ self.failed_test_cases_without_assertion_failure: Set[str] = set()
38
39
  self.passed_count_mapping = {
39
40
  subclass_type: 0
40
41
  for subclass_type in _get_all_assertion_subclasses().keys()
@@ -89,8 +90,14 @@ class AggregateTestStatsCalculator:
89
90
  passed_test_case_names = [
90
91
  passed.test_case.name for passed in self.passed_results
91
92
  ]
93
+ # We filter out test cases that failed without an assertion failure
94
+ filtered_test_cases = [
95
+ test_case
96
+ for test_case in self.test_cases
97
+ if test_case.name not in self.failed_test_cases_without_assertion_failure
98
+ ]
92
99
 
93
- for test_case in self.test_cases:
100
+ for test_case in filtered_test_cases:
94
101
  if test_case.name in passed_test_case_names:
95
102
  for step in test_case.steps:
96
103
  if step.assertions is None:
@@ -118,6 +125,9 @@ class AggregateTestStatsCalculator:
118
125
  "no_assertion_failure_in_failed_result",
119
126
  test_case=failed.test_case.name,
120
127
  )
128
+ self.failed_test_cases_without_assertion_failure.add(
129
+ failed.test_case.name
130
+ )
121
131
  continue
122
132
 
123
133
  self.failed_assertion_set.add(failed.assertion_failure.assertion)
@@ -452,6 +452,11 @@ class ActionExecutedAssertion(Assertion):
452
452
  **kwargs: Any,
453
453
  ) -> Tuple[Optional[AssertionFailure], Optional[Event]]:
454
454
  """Run the action executed assertion on the given events for that user turn."""
455
+ step_index = kwargs.get("step_index")
456
+ original_turn_events, turn_events = _get_turn_events_based_on_step_index(
457
+ step_index, turn_events, prior_events
458
+ )
459
+
455
460
  try:
456
461
  matching_event = next(
457
462
  event
@@ -464,7 +469,7 @@ class ActionExecutedAssertion(Assertion):
464
469
  error_message += assertion_order_error_message
465
470
 
466
471
  return self._generate_assertion_failure(
467
- error_message, prior_events, turn_events, self.line
472
+ error_message, prior_events, original_turn_events, self.line
468
473
  )
469
474
 
470
475
  return None, matching_event
@@ -519,6 +524,11 @@ class SlotWasSetAssertion(Assertion):
519
524
  """Run the slot_was_set assertion on the given events for that user turn."""
520
525
  matching_event = None
521
526
 
527
+ step_index = kwargs.get("step_index")
528
+ original_turn_events, turn_events = _get_turn_events_based_on_step_index(
529
+ step_index, turn_events, prior_events
530
+ )
531
+
522
532
  for slot in self.slots:
523
533
  matching_events = [
524
534
  event
@@ -557,7 +567,7 @@ class SlotWasSetAssertion(Assertion):
557
567
  error_message += assertion_order_error_message
558
568
 
559
569
  return self._generate_assertion_failure(
560
- error_message, prior_events, turn_events, slot.line
570
+ error_message, prior_events, original_turn_events, slot.line
561
571
  )
562
572
 
563
573
  return None, matching_event
@@ -595,6 +605,11 @@ class SlotWasNotSetAssertion(Assertion):
595
605
  """Run the slot_was_not_set assertion on the given events for that user turn."""
596
606
  matching_event = None
597
607
 
608
+ step_index = kwargs.get("step_index")
609
+ original_turn_events, turn_events = _get_turn_events_based_on_step_index(
610
+ step_index, turn_events, prior_events
611
+ )
612
+
598
613
  for slot in self.slots:
599
614
  matching_events = [
600
615
  event
@@ -630,7 +645,7 @@ class SlotWasNotSetAssertion(Assertion):
630
645
  error_message += assertion_order_error_message
631
646
 
632
647
  return self._generate_assertion_failure(
633
- error_message, prior_events, turn_events, slot.line
648
+ error_message, prior_events, original_turn_events, slot.line
634
649
  )
635
650
 
636
651
  return None, matching_event
@@ -723,6 +738,11 @@ class BotUtteredAssertion(Assertion):
723
738
  """Run the bot_uttered assertion on the given events for that user turn."""
724
739
  matching_event = None
725
740
 
741
+ step_index = kwargs.get("step_index")
742
+ original_turn_events, turn_events = _get_turn_events_based_on_step_index(
743
+ step_index, turn_events, prior_events
744
+ )
745
+
726
746
  if self.utter_name is not None:
727
747
  try:
728
748
  matching_event = next(
@@ -736,7 +756,7 @@ class BotUtteredAssertion(Assertion):
736
756
  error_message += assertion_order_error_message
737
757
 
738
758
  return self._generate_assertion_failure(
739
- error_message, prior_events, turn_events, self.line
759
+ error_message, prior_events, original_turn_events, self.line
740
760
  )
741
761
 
742
762
  if self.text_matches is not None:
@@ -756,7 +776,7 @@ class BotUtteredAssertion(Assertion):
756
776
  error_message += assertion_order_error_message
757
777
 
758
778
  return self._generate_assertion_failure(
759
- error_message, prior_events, turn_events, self.line
779
+ error_message, prior_events, original_turn_events, self.line
760
780
  )
761
781
 
762
782
  if self.buttons:
@@ -772,7 +792,7 @@ class BotUtteredAssertion(Assertion):
772
792
  )
773
793
  error_message += assertion_order_error_message
774
794
  return self._generate_assertion_failure(
775
- error_message, prior_events, turn_events, self.line
795
+ error_message, prior_events, original_turn_events, self.line
776
796
  )
777
797
 
778
798
  return None, matching_event
@@ -1179,3 +1199,25 @@ def _find_matching_generative_events(turn_events: List[Event]) -> List[BotUttere
1179
1199
  and event.metadata.get(UTTER_SOURCE_METADATA_KEY)
1180
1200
  in ELIGIBLE_UTTER_SOURCE_METADATA
1181
1201
  ]
1202
+
1203
+
1204
+ def _get_turn_events_based_on_step_index(
1205
+ step_index: int, turn_events: List[Event], prior_events: List[Event]
1206
+ ) -> Tuple[List[Event], List[Event]]:
1207
+ """Get the turn events based on the step index.
1208
+
1209
+ For the first step, we need to include the prior events as well
1210
+ in the same user turn. For the subsequent steps, we only need the
1211
+ events that follow the user uttered event on which the tracker
1212
+ was originally sliced by.
1213
+
1214
+ Returns:
1215
+ List[Event]: The copy of turn_events
1216
+ List[Event]: The turn events based on the step index
1217
+
1218
+ """
1219
+ original_turn_events = turn_events[:]
1220
+ if step_index == 0:
1221
+ return original_turn_events, prior_events + turn_events
1222
+
1223
+ return original_turn_events, turn_events
@@ -136,7 +136,7 @@ class E2ETestRunner:
136
136
  return turns
137
137
 
138
138
  tracker = await self.agent.processor.fetch_tracker_with_initial_session(
139
- sender_id
139
+ sender_id, output_channel=collector
140
140
  )
141
141
  # turn -1 i used to contain events that happen during
142
142
  # the start of the session and before the first user message
@@ -442,7 +442,7 @@ class E2ETestRunner:
442
442
  assertion_failure_found = False
443
443
  input_metadata = input_metadata if input_metadata else []
444
444
 
445
- for step in test_case.steps:
445
+ for index, step in enumerate(test_case.steps):
446
446
  if not step.assertions:
447
447
  structlogger.debug(
448
448
  "e2e_test_runner.run_assertions.no_assertions.skipping_step",
@@ -490,6 +490,7 @@ class E2ETestRunner:
490
490
  assertion_order_error_message=assertion_order_error_msg,
491
491
  llm_judge_config=self.llm_judge_config,
492
492
  step_text=step.text,
493
+ step_index=index,
493
494
  )
494
495
 
495
496
  if assertion_failure:
@@ -826,7 +827,7 @@ class E2ETestRunner:
826
827
  return
827
828
 
828
829
  tracker = await self.agent.processor.fetch_tracker_with_initial_session(
829
- sender_id
830
+ sender_id, output_channel=CollectingOutputChannel()
830
831
  )
831
832
 
832
833
  for fixture in fixtures:
rasa/engine/validation.py CHANGED
@@ -16,6 +16,7 @@ from typing import (
16
16
  Union,
17
17
  TypeVar,
18
18
  List,
19
+ Literal,
19
20
  )
20
21
 
21
22
  import structlog
@@ -34,6 +35,7 @@ from rasa.dialogue_understanding.coexistence.constants import (
34
35
  from rasa.dialogue_understanding.generator import (
35
36
  LLMBasedCommandGenerator,
36
37
  )
38
+ from rasa.dialogue_understanding.generator.constants import FLOW_RETRIEVAL_KEY
37
39
  from rasa.dialogue_understanding.patterns.chitchat import FLOW_PATTERN_CHITCHAT
38
40
  from rasa.engine.constants import RESERVED_PLACEHOLDERS
39
41
  from rasa.engine.exceptions import GraphSchemaValidationException
@@ -47,7 +49,15 @@ from rasa.engine.graph import (
47
49
  from rasa.engine.storage.resource import Resource
48
50
  from rasa.engine.storage.storage import ModelStorage
49
51
  from rasa.engine.training.fingerprinting import Fingerprintable
50
- from rasa.shared.constants import DOCS_URL_GRAPH_COMPONENTS, ROUTE_TO_CALM_SLOT
52
+ from rasa.shared.constants import (
53
+ DOCS_URL_GRAPH_COMPONENTS,
54
+ ROUTE_TO_CALM_SLOT,
55
+ API_TYPE_CONFIG_KEY,
56
+ VALID_PROVIDERS_FOR_API_TYPE_CONFIG_KEY,
57
+ PROVIDER_CONFIG_KEY,
58
+ LLM_CONFIG_KEY,
59
+ EMBEDDINGS_CONFIG_KEY,
60
+ )
51
61
  from rasa.shared.core.constants import ACTION_RESET_ROUTING, ACTION_TRIGGER_CHITCHAT
52
62
  from rasa.shared.core.domain import Domain
53
63
  from rasa.shared.core.flows import FlowsList, Flow
@@ -871,3 +881,70 @@ def validate_command_generator_setup(
871
881
  ) -> None:
872
882
  schema = model_configuration.predict_schema
873
883
  validate_command_generator_exclusivity(schema)
884
+
885
+
886
+ def validate_model_client_configuration_setup(config: Dict[str, Any]) -> None:
887
+ """Validates the model client configuration setup.
888
+
889
+ Validation fails, if
890
+ - the LLM/embeddings provider is defined using 'api_type' key for providers other
891
+ than 'openai' or 'azure'
892
+
893
+ Args:
894
+ config: The config dictionary
895
+ """
896
+ for outer_key in ["pipeline", "policies"]:
897
+ if outer_key not in config or config[outer_key] is None:
898
+ continue
899
+
900
+ for component_config in config[outer_key]:
901
+ for key in [LLM_CONFIG_KEY, EMBEDDINGS_CONFIG_KEY]:
902
+ validate_api_type_config_key_usage(component_config, key)
903
+
904
+ # as flow retrieval is not a component itself, we need to
905
+ # check it separately
906
+ if (
907
+ FLOW_RETRIEVAL_KEY in component_config
908
+ and EMBEDDINGS_CONFIG_KEY in component_config[FLOW_RETRIEVAL_KEY]
909
+ ):
910
+ validate_api_type_config_key_usage(
911
+ component_config[FLOW_RETRIEVAL_KEY],
912
+ EMBEDDINGS_CONFIG_KEY,
913
+ component_config["name"] + "." + FLOW_RETRIEVAL_KEY,
914
+ )
915
+
916
+
917
+ def validate_api_type_config_key_usage(
918
+ component_config: Dict[str, Any],
919
+ key: Literal["llm", "embeddings"],
920
+ component_name: Optional[str] = None,
921
+ ) -> None:
922
+ """Validate the LLM/embeddings configuration of a component.
923
+
924
+ Validation fails, if
925
+ - the LLM/embeddings provider is defined using 'api_type' key for providers other
926
+ than 'openai' or 'azure'
927
+
928
+ Args:
929
+ component_config: The config of the component
930
+ key: either 'llm' or 'embeddings'
931
+ component_name: the name of the component
932
+ """
933
+ if component_config is None or key not in component_config:
934
+ return
935
+
936
+ if API_TYPE_CONFIG_KEY in component_config[key]:
937
+ api_type = component_config[key][API_TYPE_CONFIG_KEY]
938
+ if api_type not in VALID_PROVIDERS_FOR_API_TYPE_CONFIG_KEY:
939
+ structlogger.error(
940
+ "validation.component.api_type_config_key_invalid",
941
+ event_info=(
942
+ f"You specified '{API_TYPE_CONFIG_KEY}: {api_type}' for "
943
+ f"'{component_name or component_config['name']}', which is not "
944
+ f"allowed. "
945
+ f"The '{API_TYPE_CONFIG_KEY}' key can only be used for the "
946
+ f"following providers: {VALID_PROVIDERS_FOR_API_TYPE_CONFIG_KEY}. "
947
+ f"For other providers, please use the '{PROVIDER_CONFIG_KEY}' key."
948
+ ),
949
+ )
950
+ sys.exit(1)
rasa/model_training.py CHANGED
@@ -312,6 +312,7 @@ async def _train_graph(
312
312
  rasa.engine.validation.validate_coexistance_routing_setup(
313
313
  domain, model_configuration, flows
314
314
  )
315
+ rasa.engine.validation.validate_model_client_configuration_setup(config)
315
316
  rasa.engine.validation.validate_flow_component_dependencies(
316
317
  flows, model_configuration
317
318
  )
rasa/shared/constants.py CHANGED
@@ -213,6 +213,11 @@ AZURE_OPENAI_PROVIDER = "azure"
213
213
  SELF_HOSTED_PROVIDER = "self-hosted"
214
214
  HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER = "huggingface_local"
215
215
 
216
+ VALID_PROVIDERS_FOR_API_TYPE_CONFIG_KEY = [
217
+ OPENAI_PROVIDER,
218
+ AZURE_OPENAI_PROVIDER,
219
+ ]
220
+
216
221
  SELF_HOSTED_VLLM_PREFIX = "hosted_vllm"
217
222
  SELF_HOSTED_VLLM_API_KEY_ENV_VAR = "HOSTED_VLLM_API_KEY"
218
223
 
rasa/shared/utils/llm.py CHANGED
@@ -1,3 +1,4 @@
1
+ import sys
1
2
  from functools import wraps
2
3
  from typing import (
3
4
  Any,
@@ -52,7 +53,6 @@ from rasa.shared.providers.mappings import (
52
53
  HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
53
54
  get_client_config_class_from_provider,
54
55
  )
55
- from rasa.shared.utils.cli import print_error_and_exit
56
56
 
57
57
  if TYPE_CHECKING:
58
58
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -418,12 +418,33 @@ def try_instantiate_llm_client(
418
418
  except (ProviderClientValidationError, ValueError) as e:
419
419
  structlogger.error(
420
420
  f"{log_source_function}.llm_instantiation_failed",
421
- message="Unable to instantiate LLM client.",
421
+ event_info=(
422
+ f"Unable to create the LLM client for component - "
423
+ f"{log_source_component}. Please make sure you specified the required "
424
+ f"environment variables and configuration keys."
425
+ ),
422
426
  error=e,
423
427
  )
424
- print_error_and_exit(
425
- f"Unable to create the LLM client for component - {log_source_component}. "
426
- f"Please make sure you specified the required environment variables "
427
- f"and configuration keys. "
428
- f"Error: {e}"
428
+ sys.exit(1)
429
+
430
+
431
+ def try_instantiate_embedder(
432
+ custom_embeddings_config: Optional[Dict],
433
+ default_embeddings_config: Optional[Dict],
434
+ log_source_function: str,
435
+ log_source_component: str,
436
+ ) -> EmbeddingClient:
437
+ """Validate embeddings configuration."""
438
+ try:
439
+ return embedder_factory(custom_embeddings_config, default_embeddings_config)
440
+ except (ProviderClientValidationError, ValueError) as e:
441
+ structlogger.error(
442
+ f"{log_source_function}.embedder_instantiation_failed",
443
+ event_info=(
444
+ f"Unable to create the Embedding client for component - "
445
+ f"{log_source_component}. Please make sure you specified the required "
446
+ f"environment variables and configuration keys."
447
+ ),
448
+ error=e,
429
449
  )
450
+ sys.exit(1)
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.10.14"
3
+ __version__ = "3.10.15"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-pro
3
- Version: 3.10.14
3
+ Version: 3.10.15
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
@@ -8,7 +8,7 @@ rasa/anonymization/anonymization_rule_executor.py,sha256=itRjw5xFjXadSYNX9YRyC9e
8
8
  rasa/anonymization/anonymization_rule_orchestrator.py,sha256=YJdkk4jVjy6PcCEpJMxUdU3sUoNPFvGe7BpVCvAFMPg,4116
9
9
  rasa/anonymization/schemas/config.yml,sha256=EP_af8HctyRT2f6Ywv9khpO58ZdP5_LkPItrXQgdNaU,1158
10
10
  rasa/anonymization/utils.py,sha256=y9i2tnlyG5ofNrNYGSCWl17wBYvEmTgw2zgoQ--p-vA,3623
11
- rasa/api.py,sha256=ZSFmjNsb3ZEof1mZdtCtxEbi8FHSt_jhEtrQ2mCpqis,5535
11
+ rasa/api.py,sha256=oBLKDMfkSecdfSwiCbyiz27wqo_1NGov6zbEcpYQGBQ,5533
12
12
  rasa/cli/__init__.py,sha256=eO5vp9rFCANtbTVU-pxN3iMBKw4p9WRcgzytt9MzinY,115
13
13
  rasa/cli/arguments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  rasa/cli/arguments/data.py,sha256=iINyxiRNVNhoNoY1V5jRMHXIrorW_d3k-K94Iw8a52g,3040
@@ -23,13 +23,13 @@ rasa/cli/arguments/train.py,sha256=CMf6h9oCDYS29UXEdVDuSYCkLJTobURhplmvMW4wlNQ,8
23
23
  rasa/cli/arguments/visualize.py,sha256=Su0qyXv4bEx5mrteRqEyf-K3JGQ1t2WCXOYlCpGYfAk,861
24
24
  rasa/cli/arguments/x.py,sha256=FQkarKvNBtzZ5xrPBhHWk-ZKPgEHvgE5ItwRL1TNR3I,1027
25
25
  rasa/cli/data.py,sha256=M33oHv3PCqDx4Gc5ifGmcZoEc6h2_uP8pRIygimjT8w,12695
26
- rasa/cli/e2e_test.py,sha256=eVNK8vMkPXBhDyxr8d9zTbQo42adbvyLMupVrNwGhWg,8361
27
- rasa/cli/evaluate.py,sha256=Lm311k47sJ7IFE9wSBudFAyVxTRsAAMdeRUWRCPVVug,7948
26
+ rasa/cli/e2e_test.py,sha256=guHIeX7qPwv8db4j9zsDG7MQbfUq92xO51u0iOR3eqw,8359
27
+ rasa/cli/evaluate.py,sha256=Wpyhq_8870jNyI4atWBSoiQEeqaRsBzl8EW6IsoXEe8,7946
28
28
  rasa/cli/export.py,sha256=60wPKS5513J7PRKZsVeCBrUGOcSizypdjg1iYDWLCMY,8203
29
29
  rasa/cli/inspect.py,sha256=LPudl2mmkY8-a8PW28Iq4t3xnurEFduyePFgeKSx0BA,2207
30
30
  rasa/cli/interactive.py,sha256=73r_SAdGAwkj214D5rmXyiuB_XDLidiBL3bFUMBo9QI,5974
31
31
  rasa/cli/license.py,sha256=oFZU5cQ6CD2DvBgnlss9DgJVHzkSpEVI6eNKlMHgAMM,3565
32
- rasa/cli/llm_fine_tuning.py,sha256=e6z36tFoi00uARWiPeGWhWxH05UdSgaTuJGXoJrcMiU,13215
32
+ rasa/cli/llm_fine_tuning.py,sha256=nyLb5rSg_wnZFpiMo53H4ftKqbk1WdpntelCbfpyXyE,13213
33
33
  rasa/cli/markers.py,sha256=KN0tA69FqwfBGMU82gfoh8mtyTH3LSmuz0V5N4poRcE,2485
34
34
  rasa/cli/project_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  rasa/cli/project_templates/calm/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -75,7 +75,7 @@ rasa/cli/project_templates/tutorial/data/flows.yml,sha256=9C23uQYm_JVguQJ7u51U4k
75
75
  rasa/cli/project_templates/tutorial/data/patterns.yml,sha256=rIO8yjg6QU_l35pjQKFaqsOLpaWDMv4q1FS5O7VCV1Q,304
76
76
  rasa/cli/project_templates/tutorial/domain.yml,sha256=DFnifO_0cD6PYKMsF011FoIDN_spaWbnuR7mhsF7dNk,402
77
77
  rasa/cli/project_templates/tutorial/endpoints.yml,sha256=Mmjm5KDuyL_46dIe0issP8MKNzESYWU0JyYPWPVlWFw,1479
78
- rasa/cli/run.py,sha256=Z_z4LHHjCREKLJQVgQjFUL6I8n8Mw8EUllw1efp-b_c,4255
78
+ rasa/cli/run.py,sha256=KTpAq-seXO6r-gDA8jpYX0HDa56SZVNrNWZSSk5PyKw,4253
79
79
  rasa/cli/scaffold.py,sha256=Eqv44T7b5cOd2FKLU1tSrAVPKwMfoiUIjc43PtaxJGg,7988
80
80
  rasa/cli/shell.py,sha256=wymYOj6jdUON0y7pe-rpRqarWDGaDquU7PRp8knxqHk,4264
81
81
  rasa/cli/studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -85,10 +85,10 @@ rasa/cli/studio/train.py,sha256=ruXA5UkaRbO3femk8w3I2cXKs06-34FYtB_9MKdP6hw,1572
85
85
  rasa/cli/studio/upload.py,sha256=kdHqrVGsEbbqH5fz_HusWwJEycB31SHaPlXer8lXAE0,2069
86
86
  rasa/cli/telemetry.py,sha256=ZywhlOpp0l2Yz9oEcOGA2ej3SEkSTisKPpBhn_fS7tc,3538
87
87
  rasa/cli/test.py,sha256=Ub7Cm9rFQ_tkB310jPYzVwU0Di88Z7IE0nLi1o-aYbA,8901
88
- rasa/cli/train.py,sha256=a8KB-zc9mFZrWYztpiC7g5Ab3O86KJcTlo_CBLyB7Tk,9934
88
+ rasa/cli/train.py,sha256=_fQi7Sx15LGDyJDV20FJJ2oDZoPGHBfV8xf2t5Kzkpk,10298
89
89
  rasa/cli/utils.py,sha256=Q4WFdSYrqQvMY2nZY4i2P-vBimUh_cS08KEN-PGkJlg,15662
90
90
  rasa/cli/visualize.py,sha256=YmRAATAfxHpgE8_PknGyM-oIujwICNzVftTzz6iLNNc,1256
91
- rasa/cli/x.py,sha256=1w-H6kb_3OG3zVPJ1isX67BTb_T-x2MJo4OGffCD4Vc,6827
91
+ rasa/cli/x.py,sha256=qJtNheYwdxxwZl-M2KcEbCk8lzWVGMfI6em-5-Xj05w,6825
92
92
  rasa/constants.py,sha256=XZYjc2dDN2q3ixchLfRRNGAqxD2uL5-z_ZYoqJwLgxM,1309
93
93
  rasa/core/__init__.py,sha256=DYHLve7F1yQBVOZTA63efVIwLiULMuihOfdpzw1j0os,457
94
94
  rasa/core/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -294,22 +294,22 @@ rasa/core/nlg/response.py,sha256=aHpy9BgjO7ub6v-sVPiQqutUA_7-UD1l3DJGVeQyp4k,588
294
294
  rasa/core/nlg/summarize.py,sha256=JO6VCfM_RnU0QX8Us42YkNOxC0ESKV1xcVH_sCW27ZU,2108
295
295
  rasa/core/policies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
296
296
  rasa/core/policies/ensemble.py,sha256=AjNOEy2Iubbe-LdKaoFUXG8ch6yPrg3bTvcTcAPmeOs,12959
297
- rasa/core/policies/enterprise_search_policy.py,sha256=4rZQtRUz4IxiVXlf48tNWjZVbJOGL5MQHZpss-bTmoU,31209
297
+ rasa/core/policies/enterprise_search_policy.py,sha256=U4vPSdODWEY6BkNxXKPXiH4yqMn8ERrvc5G-J0Kfdb0,31666
298
298
  rasa/core/policies/enterprise_search_prompt_template.jinja2,sha256=dCS_seyBGxMQoMsOjjvPp0dd31OSzZCJSZeev1FJK5Q,1187
299
299
  rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2,sha256=vRQBs3q13UmvRRgqA8-DmRtM7tqZP2ngwMVJ4gy7lE0,3302
300
300
  rasa/core/policies/flow_policy.py,sha256=wGb1l_59cGM9ZaexSIK5uXFi618739oNfLOxx2FC0_Y,7490
301
301
  rasa/core/policies/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
302
302
  rasa/core/policies/flows/flow_exceptions.py,sha256=_FQuN-cerQDM1pivce9bz4zylh5UYkljvYS1gjDukHI,1527
303
- rasa/core/policies/flows/flow_executor.py,sha256=okOxDzBekd9sMOLuxxVs6KLQj_xVqKgxO0sxKAA7gfg,25482
303
+ rasa/core/policies/flows/flow_executor.py,sha256=DNO_kUdisI93XIY9-QtYpqCp7faxEpkIqhcfFLkaets,25690
304
304
  rasa/core/policies/flows/flow_step_result.py,sha256=agjPrD6lahGSe2ViO5peBeoMdI9ngVGRSgtytgxmJmg,1360
305
- rasa/core/policies/intentless_policy.py,sha256=M2pUHtveJ7Oh6cDRX2NiFCnfRUP6HkW4PmOv_T-9Jv0,35121
305
+ rasa/core/policies/intentless_policy.py,sha256=Yc-kivB2yzbIUKD76TTnwKLQCl949UUERlcMdyz_MUU,35552
306
306
  rasa/core/policies/intentless_prompt_template.jinja2,sha256=KhIL3cruMmkxhrs5oVbqgSvK6ZiN_6TQ_jXrgtEB-ZY,677
307
307
  rasa/core/policies/memoization.py,sha256=XoRxUdYUGRfO47tAEyc5k5pUgt38a4fipO336EU5Vdc,19466
308
308
  rasa/core/policies/policy.py,sha256=HeVtIaV0dA1QcAG3vjdn-4g7-oUEJPL4u01ETJt78YA,27464
309
309
  rasa/core/policies/rule_policy.py,sha256=YNDPZUZkpKFCvZwKe1kSfP6LQnDL9CQ6JU69JRwdmWw,50729
310
310
  rasa/core/policies/ted_policy.py,sha256=_DHiDH5Upx1yFNzMXBA3SGdHBRfsitTLlr7howUHPoo,87750
311
311
  rasa/core/policies/unexpected_intent_policy.py,sha256=5pGe9EMS-NLHIDDhqY6KCH_Kv7_TGMzSbe_GsjuKH1w,39649
312
- rasa/core/processor.py,sha256=-Jf2WliPA7lUZ8DCNt4r7fdU7qLNQf4g-IhoGZIswN0,54434
312
+ rasa/core/processor.py,sha256=2bxD28CXcmsBuxDxXmYzz-e6GFsQv1j5FiNkm5wRyBY,54535
313
313
  rasa/core/run.py,sha256=s32pZE3B1uKIs20xIbSty0HxeQ9One63_8NeCODwpQE,11050
314
314
  rasa/core/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
315
  rasa/core/secrets_manager/constants.py,sha256=jVhtn_2PN2LQVq-FkeBEipztCQPYSVQq4_n2xq0wfoY,1051
@@ -323,16 +323,16 @@ rasa/core/train.py,sha256=WLx0qMS3mNV3RsGk4TFLbZg25QkxNIAKsPNj_p-HT2A,3521
323
323
  rasa/core/training/__init__.py,sha256=Hu_kfZAp0uBBLyaXlt4sOR6k5XSsgI8LRDqiOr6rFs8,3213
324
324
  rasa/core/training/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
325
325
  rasa/core/training/converters/responses_prefix_converter.py,sha256=5daXmnDAGjNvG4EXKO42jcR1hsr1HSxuHjn9j1V3Bfo,3879
326
- rasa/core/training/interactive.py,sha256=vVKi40z8z-nhPWogpcg9HWLaeYf_CPQyi0faZEXhxaA,60345
326
+ rasa/core/training/interactive.py,sha256=lk1f9klcTrWaN39nvPJEJ4762QVfmLHFL44Av01UbbQ,60343
327
327
  rasa/core/training/story_conflict.py,sha256=34Sj-GlhVTWva7a_Mk-wdm7zfEw_rlCcPHE35r1dGIc,13593
328
328
  rasa/core/training/training.py,sha256=Ci5s2DXiz4-j7ldLVpHRCKPnMBAJOhvc2t4ofUxhbqA,3067
329
- rasa/core/utils.py,sha256=zpmAqSqdAxjzfHnEXt300in5YoR1cSxZjQDv_pqQAoI,10985
329
+ rasa/core/utils.py,sha256=dKu46SiZ28all7V24uSjxjJJcqlkEGVCZapeQma1b4c,11362
330
330
  rasa/core/visualize.py,sha256=rCtg9I1T2RsJRAoQI7czIwT7fH_P-jO5LliNu_FjsQE,2125
331
331
  rasa/dialogue_understanding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
332
  rasa/dialogue_understanding/coexistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
333
333
  rasa/dialogue_understanding/coexistence/constants.py,sha256=RpgLKMG4s7AgII0fRV0siS0Zh2QVI0OVRunhgm4q_j4,94
334
334
  rasa/dialogue_understanding/coexistence/intent_based_router.py,sha256=3Pf7ZpmQnJWlaehAVZBSR9B1oWoR0NK7Ll0pLMCovDc,7609
335
- rasa/dialogue_understanding/coexistence/llm_based_router.py,sha256=_H2klVB-YjY80M4-1RE8IymtFuCKkjG1wRpGxalwexg,10037
335
+ rasa/dialogue_understanding/coexistence/llm_based_router.py,sha256=zM-fQJgBnYddk-cKwy0v6BIIJNM0fCWPScq9k6fHTyU,10260
336
336
  rasa/dialogue_understanding/coexistence/router_template.jinja2,sha256=CHWFreN0sv1EbPh-hf5AlCt3zxy2_llX1Pdn9Q11Y18,357
337
337
  rasa/dialogue_understanding/commands/__init__.py,sha256=B_1q6p2l1TOfIcmggSzXc0iETZ1RvTUSFwuQhPmRjtQ,2004
338
338
  rasa/dialogue_understanding/commands/can_not_handle_command.py,sha256=2sNnIo1jZ2UEadkBdEWmDasm2tBES59lzvFcf0iY51U,2235
@@ -358,17 +358,17 @@ rasa/dialogue_understanding/generator/__init__.py,sha256=Ykeb2wQ1DuiUWAWO0hLIPST
358
358
  rasa/dialogue_understanding/generator/command_generator.py,sha256=woJ4-59Iarugyxy0fT0zM0QnF8el8m2bBSpy-9Gh8U0,11945
359
359
  rasa/dialogue_understanding/generator/constants.py,sha256=yh4mAiIINkDcZs_xApEjMoMn7pFm3xhFmFF3DjStTco,680
360
360
  rasa/dialogue_understanding/generator/flow_document_template.jinja2,sha256=f4H6vVd-_nX_RtutMh1xD3ZQE_J2OyuPHAtiltfiAPY,253
361
- rasa/dialogue_understanding/generator/flow_retrieval.py,sha256=E7u1Ynb606LOLo_QEJke7NfdrWs9Z3MXjv0U15fbb18,16157
361
+ rasa/dialogue_understanding/generator/flow_retrieval.py,sha256=mSqXDz2DPl3Law-Smw7C3x3li85wfj8nkj6R_3Fw30w,16403
362
362
  rasa/dialogue_understanding/generator/llm_based_command_generator.py,sha256=Aktu_gdxAIQowfQ9KBcS2w3R9Hilc2ehLPB89ek9mVs,16627
363
363
  rasa/dialogue_understanding/generator/llm_command_generator.py,sha256=P1LA0eJxf33GKzN_baUWq1P9KNwYCvKZR-N-Z4zzdjA,2459
364
364
  rasa/dialogue_understanding/generator/multi_step/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
365
365
  rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2,sha256=Y0m673tAML3cFPaLM-urMXDsBYUUcXIw9YUpkAhGUuA,2933
366
366
  rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2,sha256=8l93_QBKBYnqLICVdiTu5ejZDE8F36BU8-qwba0px44,1927
367
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py,sha256=133WGlwv49PF4_DKM53u0J_pWrDs88dgUYc5fq1m6NQ,31568
367
+ rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py,sha256=Gvnr1hcrwF_4vvHsvIH5Au0S2g1-RxSirvhQuXXZIFE,31864
368
368
  rasa/dialogue_understanding/generator/nlu_command_adapter.py,sha256=_mltSp6JzB6tYmhxjTVxyjOzorO7-Poj2nLpHQrDsQs,9202
369
369
  rasa/dialogue_understanding/generator/single_step/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
370
370
  rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2,sha256=qVTuas5XgAv2M_hsihyXl-wAnBDEpg_uhVvNrR5m-h0,3751
371
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py,sha256=lzSGEqsKtRPWK9hP3GmaZazN39icII-MZp_0sykvpNQ,16031
371
+ rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py,sha256=fSvfcFAOh9g6Vh_vmO1RPAi5sYDgLMeVE084qfod8QA,16329
372
372
  rasa/dialogue_understanding/patterns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
373
  rasa/dialogue_understanding/patterns/cancel.py,sha256=IQ4GVHNnNCqwKRLlAqBtLsgolcbPPnHsHdb3aOAFhEs,3868
374
374
  rasa/dialogue_understanding/patterns/cannot_handle.py,sha256=pg0zJHl-hDBnl6y9IyxZzW57yuMdfD8xI8eiK6EVrG8,1406
@@ -399,8 +399,8 @@ rasa/dialogue_understanding/stack/frames/pattern_frame.py,sha256=EVrYWv5dCP7XTvN
399
399
  rasa/dialogue_understanding/stack/frames/search_frame.py,sha256=rJ9og28k_udUIjP-2Z5xeb_2T5HvCzwDCnxVG9K7lws,728
400
400
  rasa/dialogue_understanding/stack/utils.py,sha256=ysH6-IeMwNnKbF1__uMlq6I8zaGXFdMEpw1iYdEz4kA,7650
401
401
  rasa/e2e_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
402
- rasa/e2e_test/aggregate_test_stats_calculator.py,sha256=QQ3T4KssfO7CEMADaFKiqMV8GuAXmHBNoKKDkRnSFHY,4444
403
- rasa/e2e_test/assertions.py,sha256=O8nBexEf0a_ATvOwnxGLwNEbV7s9e8q-feddDqe1OcE,39378
402
+ rasa/e2e_test/aggregate_test_stats_calculator.py,sha256=XMI7t5xEP7Mo-F8cCCZx2w5ckUKa5sDvyitl6bk6hc8,4924
403
+ rasa/e2e_test/assertions.py,sha256=9_1TlhBCCI0y3cTFNWQkWKluHS9kQ_Itvas6basA5YU,40936
404
404
  rasa/e2e_test/assertions_schema.yml,sha256=0li9NpY1MY7Zic_4AhXpKbStmzgFyAw0JbSMGDkyGMo,2489
405
405
  rasa/e2e_test/constants.py,sha256=9VLGcPU-oUXseblI2pcYQifLTLC-c2dGmiEJ_feWgLw,972
406
406
  rasa/e2e_test/e2e_config.py,sha256=9FKZOSgbKvcw9KwDnBcYSzXldSlYD4YGqqT0cvfqMks,7188
@@ -410,7 +410,7 @@ rasa/e2e_test/e2e_test_converter.py,sha256=VxIx7uk36HzLIyEumJiR6G6-CyyqkV_lYoX-X
410
410
  rasa/e2e_test/e2e_test_converter_prompt.jinja2,sha256=EMy-aCd7jLARHmwAuZUGT5ABnNHjR872_pexRIMGA7c,2791
411
411
  rasa/e2e_test/e2e_test_coverage_report.py,sha256=Cv5bMtoOC240231YMNHz10ibSqm_UD1-eskQVdjPUsw,11326
412
412
  rasa/e2e_test/e2e_test_result.py,sha256=9LlH6vIQeK_dxDwMQ5RzlNHoxCNXpWC9S527-ch8kUA,1649
413
- rasa/e2e_test/e2e_test_runner.py,sha256=o-vCDTMV3xoElNV-Cj2_vnuDwhTxnQBXdMjRE5z1cko,44021
413
+ rasa/e2e_test/e2e_test_runner.py,sha256=ruMldKVFsJI1FjGUyi6HlnpTDYtHOf01-9wHqcEvSUA,44145
414
414
  rasa/e2e_test/e2e_test_schema.yml,sha256=0deWjuKRHNo6e_LSCnUoiw9NLIYf6dj1-zFPl_AqLYA,5632
415
415
  rasa/e2e_test/pykwalify_extensions.py,sha256=OGYKIKYJXd2S0NrWknoQuijyBQaE-oMLkfV_eMRkGSM,1331
416
416
  rasa/e2e_test/stub_custom_action.py,sha256=teq8c5I6IuUsFX4lPdeBLY3j0SLSMCC95KmKx7GrE8I,2369
@@ -442,7 +442,7 @@ rasa/engine/training/components.py,sha256=ZOSTbPEHth545q41B9geXKdEtIYZ3PaZdwSXrA
442
442
  rasa/engine/training/fingerprinting.py,sha256=lY4wHte37470MR6sBaERt0WT9NF06NUGTX9bRAh-W_4,2006
443
443
  rasa/engine/training/graph_trainer.py,sha256=fCnFZAv7UNxFjaLRY0MxPd18d3mO9It4Uk1Joq7Q3Mc,10636
444
444
  rasa/engine/training/hooks.py,sha256=u7HQXDJJT4pBzQUaIIfuM3YEreGjRdp0IEv6XUrRFtk,5469
445
- rasa/engine/validation.py,sha256=Hf7aVwGm7grV5ucRTF93hfQSGO5qLJNVLFo3h0i5AeY,33645
445
+ rasa/engine/validation.py,sha256=mrE32GzeKbnH-NYLsViKyemth_WilmPieriKCrlx6G8,36512
446
446
  rasa/env.py,sha256=zLzQMkATVIZj6s4C7RsLLOLT8g6-Q96m5iBaHW_mEA8,480
447
447
  rasa/exceptions.py,sha256=acZiGDb5zC1ZGv1oBPHImBeRKxyHOA_mW6N8e9nOEaU,2116
448
448
  rasa/graph_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -483,7 +483,7 @@ rasa/markers/upload.py,sha256=Ot1s_O-CEIB9c4CKUlfOldiJo92pdqxFUHOPCU7E_NU,2518
483
483
  rasa/markers/validate.py,sha256=YypXKRS87xxrMMEz9HpAQzYJUwg0OPbczMXBRNjlJq4,709
484
484
  rasa/model.py,sha256=GH1-N6Po3gL3nwfa9eGoN2bMRNMrn4f3mi17-osW3T0,3491
485
485
  rasa/model_testing.py,sha256=h0QUpJu6p_TDse3aHjCfYwI6OGH47b3Iuo5Ot0HQADM,14959
486
- rasa/model_training.py,sha256=1LoW9TMgzpXeXedLtzxmGHxOl1NBTbNDaqLzu2XayxE,20631
486
+ rasa/model_training.py,sha256=HrOTDdsVH4BRsJeeu_Lg8HiBrqQq30cGTG5myCJAy3M,20708
487
487
  rasa/nlu/__init__.py,sha256=D0IYuTK_ZQ_F_9xsy0bXxVCAtU62Fzvp8S7J9tmfI_c,123
488
488
  rasa/nlu/classifiers/__init__.py,sha256=Qvrf7_rfiMxm2Vt2fClb56R3QFExf7WPdFdL-AOvgsk,118
489
489
  rasa/nlu/classifiers/classifier.py,sha256=9fm1mORuFf1vowYIXmqE9yLRKdSC4nGQW7UqNZQipKY,133
@@ -546,7 +546,7 @@ rasa/nlu/utils/spacy_utils.py,sha256=pBvsCVKVuZ3b2Pjn-XuOVZ6lzZu9Voc2R4N1VczwtCM
546
546
  rasa/plugin.py,sha256=H_OZcHy_U3eAK-JHr43TSxcPqS0JEGcZkFvmumeeJEs,2670
547
547
  rasa/server.py,sha256=pUdhi5dkhzEj4bngj2bTUKJohepjpY-aZ4MGKHYZRH0,57775
548
548
  rasa/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
549
- rasa/shared/constants.py,sha256=MfO5vD2BRZMKWt_V3XiT7Yap1XhFWf5k13epuMG-P2s,9327
549
+ rasa/shared/constants.py,sha256=VU-x4UaXozMn05WaDjg-eD9GYpzjOmf_PTIo1hPRrQ8,9422
550
550
  rasa/shared/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
551
551
  rasa/shared/core/command_payload_reader.py,sha256=Vhiop9LWFawaEruRifBBrVmoEJ-fj1Tli1wBvsYu2_I,3563
552
552
  rasa/shared/core/constants.py,sha256=U1q0-oGMQ7aDsP5p6H4CRaBi-H-KZpm2IXpTzIbaEv8,5169
@@ -657,7 +657,7 @@ rasa/shared/utils/cli.py,sha256=bJpkf0VzzmtpmBnDnIl7SgvrntnBuaJQMHBXHm2WxcA,2916
657
657
  rasa/shared/utils/common.py,sha256=Z0sfpDosVHLhGDY-72lGVTPWsNC64z3HWSLdnZRG7yE,10057
658
658
  rasa/shared/utils/constants.py,sha256=ZNQu0RHM_7Q4A2hn6pD8XlKPEwzivNpfKiiQihwH8-U,141
659
659
  rasa/shared/utils/io.py,sha256=cYEkHjvuIB-XaK-Qchajv4lDMb_EZc3K-3CLwiEtUcA,15236
660
- rasa/shared/utils/llm.py,sha256=h35-N4LiT0qbg_6sab0GiYsPJe1Q1WHMLj6UhVuXOSY,13804
660
+ rasa/shared/utils/llm.py,sha256=PAgk53HhCu8owKUegvXB3hQUcDrv-X2qwtWstMuAnok,14530
661
661
  rasa/shared/utils/pykwalify_extensions.py,sha256=4W8gde8C6QpGCY_t9IEmaZSgjMuie1xH0F1DYyn83BM,883
662
662
  rasa/shared/utils/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
663
663
  rasa/shared/utils/schemas/config.yml,sha256=czxSADw9hOIZdhvFP8pVUQo810hs9_C8ZGfCPx17taM,27
@@ -720,9 +720,9 @@ rasa/utils/train_utils.py,sha256=f1NWpp5y6al0dzoQyyio4hc4Nf73DRoRSHDzEK6-C4E,212
720
720
  rasa/utils/url_tools.py,sha256=JQcHL2aLqLHu82k7_d9imUoETCm2bmlHaDpOJ-dKqBc,1218
721
721
  rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
722
722
  rasa/validator.py,sha256=ToRaa4dS859CJO3H2VGqS943O5qWOg45ypbDfFMKECU,62699
723
- rasa/version.py,sha256=z2i3uuT45OdhuDRVnuLCtmG8pfzzwC-13qbKorgsDmQ,118
724
- rasa_pro-3.10.14.dist-info/METADATA,sha256=ZDJzu4fsisgXmG0MJRp2XJGY2zHYrQUAddh2-G4Tezs,10919
725
- rasa_pro-3.10.14.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
726
- rasa_pro-3.10.14.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
727
- rasa_pro-3.10.14.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
728
- rasa_pro-3.10.14.dist-info/RECORD,,
723
+ rasa/version.py,sha256=aHCuIHQWH7VHn-hOBTaPwWHuMVCEbQOmmTIcFYIjyIw,118
724
+ rasa_pro-3.10.15.dist-info/METADATA,sha256=BgLjWEGNR09ZyPW9sfS03L7AiDUwDYevse3dVR4Ep78,10919
725
+ rasa_pro-3.10.15.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
726
+ rasa_pro-3.10.15.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
727
+ rasa_pro-3.10.15.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
728
+ rasa_pro-3.10.15.dist-info/RECORD,,