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

@@ -260,7 +260,21 @@ class CorrectSlotsCommand(Command):
260
260
  )
261
261
  return []
262
262
 
263
- structlogger.debug("command_executor.correct_slots", command=self)
263
+ structlogger.debug("correct_slots_command", command=self)
264
+
265
+ # check if the correct slot is referring to a slot of a flow on the stack
266
+ # the slot also needs to be part of a collect step in any of those flows
267
+ # if this is not the case, we don't want to correct the slot
268
+ for slot in self.corrected_slots:
269
+ if not self.should_correct_slot(slot, tracker, all_flows):
270
+ structlogger.warning(
271
+ "correct_slots_command.skip_correct_slot",
272
+ correct_slot=slot,
273
+ reason="The slot is not part of a collect step in any of the flows "
274
+ "on the stack. Skipping correction.",
275
+ )
276
+ return []
277
+
264
278
  proposed_slots = self.corrected_slots_dict(tracker)
265
279
 
266
280
  correction_frame = self.create_correction_frame(
@@ -285,3 +299,27 @@ class CorrectSlotsCommand(Command):
285
299
  return False
286
300
 
287
301
  return True
302
+
303
+ def should_correct_slot(
304
+ self, slot: CorrectedSlot, tracker: DialogueStateTracker, all_flows: FlowsList
305
+ ) -> bool:
306
+ """Checks if the slot should be corrected.
307
+
308
+ Args:
309
+ slot: The slot to check.
310
+ tracker: The tracker.
311
+ all_flows: All flows in the assistant.
312
+ """
313
+ # get all flows on the stack
314
+ flows_on_stack = utils.user_flows_on_the_stack(tracker.stack)
315
+
316
+ # check if the slot is part of a collect step in any of the flows on the stack
317
+ for flow_id in flows_on_stack:
318
+ flow = all_flows.flow_by_id(flow_id)
319
+ if flow is None:
320
+ continue
321
+ for collect_step in flow.get_collect_steps():
322
+ if collect_step.collect == slot.name:
323
+ return True
324
+
325
+ return False
@@ -31,8 +31,9 @@ from rasa.dialogue_understanding.stack.frames import (
31
31
  BaseFlowStackFrame,
32
32
  )
33
33
  from rasa.dialogue_understanding.stack.utils import (
34
- filled_slots_for_active_flow,
35
34
  top_flow_frame,
35
+ filled_slots_for_active_flow,
36
+ top_user_flow_frame,
36
37
  )
37
38
  from rasa.engine.graph import ExecutionContext
38
39
  from rasa.shared.constants import (
@@ -113,8 +114,9 @@ def validate_state_of_commands(commands: List[Command]) -> None:
113
114
  # check that there is only at max one cancel flow command
114
115
  if sum(isinstance(c, CancelFlowCommand) for c in commands) > 1:
115
116
  structlogger.error(
116
- "command_processor.validate_state_of_commands.multiple_cancel_flow_commands",
117
- commands=commands,
117
+ "command_processor.validate_state_of_commands."
118
+ "multiple_cancel_flow_commands",
119
+ commands=[command.__class__.__name__ for command in commands],
118
120
  )
119
121
  raise ValueError("There can only be one cancel flow command.")
120
122
 
@@ -124,8 +126,9 @@ def validate_state_of_commands(commands: List[Command]) -> None:
124
126
  ]
125
127
  if free_form_answer_commands != commands[: len(free_form_answer_commands)]:
126
128
  structlogger.error(
127
- "command_processor.validate_state_of_commands.free_form_answer_commands_not_at_beginning",
128
- commands=commands,
129
+ "command_processor.validate_state_of_commands."
130
+ "free_form_answer_commands_not_at_beginning",
131
+ commands=[command.__class__.__name__ for command in commands],
129
132
  )
130
133
  raise ValueError(
131
134
  "Free form answer commands must be at start of the predicted command list."
@@ -134,8 +137,9 @@ def validate_state_of_commands(commands: List[Command]) -> None:
134
137
  # check that there is at max only one correctslots command
135
138
  if sum(isinstance(c, CorrectSlotsCommand) for c in commands) > 1:
136
139
  structlogger.error(
137
- "command_processor.validate_state_of_commands.multiple_correct_slots_commands",
138
- commands=commands,
140
+ "command_processor.validate_state_of_commands."
141
+ "multiple_correct_slots_commands",
142
+ commands=[command.__class__.__name__ for command in commands],
139
143
  )
140
144
  raise ValueError("There can only be one correct slots command.")
141
145
 
@@ -218,15 +222,13 @@ def execute_commands(
218
222
 
219
223
  events: List[Event] = flow_hash_events
220
224
 
221
- # commands need to be reversed to make sure they end up in the right order
222
- # on the stack. e.g. if there multiple start flow commands, the first one
223
- # should be on top of the stack. this is achieved by reversing the list
224
- # and then pushing the commands onto the stack in the reversed order.
225
- reversed_commands = list(reversed(commands))
225
+ # reorder commands: in case there is no active flow, we want to make sure to
226
+ # run the start flow commands first.
227
+ final_commands = reorder_commands(commands, tracker)
226
228
 
227
229
  validate_state_of_commands(commands)
228
230
 
229
- for command in reversed_commands:
231
+ for command in final_commands:
230
232
  new_events = command.run_command_on_tracker(
231
233
  tracker, all_flows, original_tracker
232
234
  )
@@ -354,19 +356,14 @@ def clean_up_commands(
354
356
  """
355
357
  domain = domain if domain else Domain.empty()
356
358
 
357
- slots_so_far, active_flow = filled_slots_for_active_flow(tracker, all_flows)
358
-
359
- # update the slots so far with the slots that were set in the tracker
360
- slots_so_far.update(
361
- {event.key for event in tracker.events if isinstance(event, SlotSet)}
362
- )
359
+ _, active_flow = filled_slots_for_active_flow(tracker, all_flows)
363
360
 
364
361
  clean_commands: List[Command] = []
365
362
 
366
363
  for command in commands:
367
364
  if isinstance(command, SetSlotCommand):
368
365
  clean_commands = clean_up_slot_command(
369
- clean_commands, command, tracker, all_flows, slots_so_far
366
+ clean_commands, command, tracker, all_flows
370
367
  )
371
368
 
372
369
  elif isinstance(command, CancelFlowCommand) and contains_command(
@@ -422,7 +419,8 @@ def clean_up_commands(
422
419
  clean_commands = clean_up_clarify_command(clean_commands, commands, command)
423
420
  if command not in clean_commands:
424
421
  structlogger.debug(
425
- "command_processor.clean_up_commands.drop_clarify_given_other_commands",
422
+ "command_processor.clean_up_commands."
423
+ "drop_clarify_given_other_commands",
426
424
  command=command,
427
425
  )
428
426
  else:
@@ -446,6 +444,25 @@ def clean_up_commands(
446
444
  return clean_commands
447
445
 
448
446
 
447
+ def _get_slots_eligible_for_correction(tracker: DialogueStateTracker) -> Set[str]:
448
+ """Get all slots that are eligible for correction.
449
+
450
+ # We consider all slots, which are not None, that were set in the tracker
451
+ # eligible for correction.
452
+ # In the correct_slot_command we will check if a slot should actually be
453
+ # corrected.
454
+ """
455
+ # get all slots that were set in the tracker
456
+ slots_so_far = set(
457
+ [event.key for event in tracker.events if isinstance(event, SlotSet)]
458
+ )
459
+
460
+ # filter out slots that are set to None (None = empty value)
461
+ slots_so_far = {slot for slot in slots_so_far if tracker.get_slot(slot) is not None}
462
+
463
+ return slots_so_far
464
+
465
+
449
466
  def ensure_max_number_of_command_type(
450
467
  commands: List[Command], command_type: Type[Command], n: int
451
468
  ) -> List[Command]:
@@ -505,7 +522,6 @@ def clean_up_slot_command(
505
522
  command: SetSlotCommand,
506
523
  tracker: DialogueStateTracker,
507
524
  all_flows: FlowsList,
508
- slots_so_far: Set[str],
509
525
  ) -> List[Command]:
510
526
  """Clean up a slot command.
511
527
 
@@ -518,16 +534,15 @@ def clean_up_slot_command(
518
534
  command: The command to clean up.
519
535
  tracker: The dialogue state tracker.
520
536
  all_flows: All flows.
521
- slots_so_far: The slots that have been filled so far.
522
537
 
523
538
  Returns:
524
539
  The cleaned up commands.
525
540
  """
526
541
  stack = tracker.stack
527
-
528
542
  resulting_commands = commands_so_far[:]
529
-
530
543
  slot = tracker.slots.get(command.name)
544
+
545
+ # if the slot is not in the domain, we cannot set it
531
546
  if slot is None:
532
547
  structlogger.debug(
533
548
  "command_processor.clean_up_slot_command.skip_command_slot_not_in_domain",
@@ -540,6 +555,7 @@ def clean_up_slot_command(
540
555
  )
541
556
  return resulting_commands
542
557
 
558
+ # check if the slot should be set by the command
543
559
  if not should_slot_be_set(slot, command):
544
560
  cannot_handle = CannotHandleCommand(
545
561
  reason="A command generator attempted to set a slot with a value extracted "
@@ -550,7 +566,13 @@ def clean_up_slot_command(
550
566
 
551
567
  return resulting_commands
552
568
 
553
- if command.name in slots_so_far and command.name != ROUTE_TO_CALM_SLOT:
569
+ # get all slots that were set in the tracker and are eligible for correction
570
+ slots_eligible_for_correction = _get_slots_eligible_for_correction(tracker)
571
+
572
+ if (
573
+ command.name in slots_eligible_for_correction
574
+ and command.name != ROUTE_TO_CALM_SLOT
575
+ ):
554
576
  current_collect_info = get_current_collect_step(stack, all_flows)
555
577
 
556
578
  if current_collect_info and current_collect_info.collect == command.name:
@@ -558,49 +580,71 @@ def clean_up_slot_command(
558
580
  resulting_commands.append(command)
559
581
  return resulting_commands
560
582
 
561
- if (slot := tracker.slots.get(command.name)) is not None and str(
562
- slot.value
563
- ) == str(command.value):
564
- # the slot is already set, we don't need to set it again
565
- structlogger.debug(
566
- "command_processor.clean_up_slot_command.skip_command_slot_already_set",
567
- command=command,
568
- )
583
+ if should_slot_be_corrected(command, tracker, stack, all_flows):
584
+ # if the slot was already set before, we need to convert it into
585
+ # a correction
586
+ return convert_set_slot_to_correction(command, resulting_commands)
587
+ else:
569
588
  return resulting_commands
570
589
 
571
- top = top_flow_frame(stack)
572
- if isinstance(top, CorrectionPatternFlowStackFrame):
573
- already_corrected_slots = top.corrected_slots
574
- else:
575
- already_corrected_slots = {}
590
+ resulting_commands.append(command)
591
+ return resulting_commands
576
592
 
577
- if command.name in already_corrected_slots and str(
578
- already_corrected_slots[command.name]
579
- ) == str(command.value):
580
- structlogger.debug(
581
- "command_processor.clean_up_slot_command"
582
- ".skip_command_slot_already_corrected",
583
- command=command,
584
- )
585
- return resulting_commands
586
593
 
594
+ def should_slot_be_corrected(
595
+ command: SetSlotCommand,
596
+ tracker: DialogueStateTracker,
597
+ stack: DialogueStack,
598
+ all_flows: FlowsList,
599
+ ) -> bool:
600
+ """Check if a slot should be corrected."""
601
+ if (slot := tracker.slots.get(command.name)) is not None and str(slot.value) == str(
602
+ command.value
603
+ ):
604
+ # the slot is already set to the same value, we don't need to set it again
587
605
  structlogger.debug(
588
- "command_processor.clean_up_slot_command.convert_command_to_correction",
606
+ "command_processor.clean_up_slot_command.skip_command_slot_already_set",
589
607
  command=command,
590
608
  )
609
+ return False
591
610
 
592
- # Group all corrections into one command
593
- corrected_slot = CorrectedSlot(command.name, command.value)
594
- for c in resulting_commands:
595
- if isinstance(c, CorrectSlotsCommand):
596
- c.corrected_slots.append(corrected_slot)
597
- break
598
- else:
599
- resulting_commands.append(
600
- CorrectSlotsCommand(corrected_slots=[corrected_slot])
601
- )
611
+ top = top_flow_frame(stack)
612
+ if isinstance(top, CorrectionPatternFlowStackFrame):
613
+ already_corrected_slots = top.corrected_slots
614
+ else:
615
+ already_corrected_slots = {}
616
+
617
+ if command.name in already_corrected_slots and str(
618
+ already_corrected_slots[command.name]
619
+ ) == str(command.value):
620
+ structlogger.debug(
621
+ "command_processor.clean_up_slot_command"
622
+ ".skip_command_slot_already_corrected",
623
+ command=command,
624
+ )
625
+ return False
626
+
627
+ return True
628
+
629
+
630
+ def convert_set_slot_to_correction(
631
+ command: SetSlotCommand,
632
+ resulting_commands: List[Command],
633
+ ) -> List[Command]:
634
+ """Convert a set slot command to a correction command."""
635
+ structlogger.debug(
636
+ "command_processor.convert_set_slot_to_correction",
637
+ command=command,
638
+ )
639
+
640
+ # Group all corrections into one command
641
+ corrected_slot = CorrectedSlot(command.name, command.value)
642
+ for c in resulting_commands:
643
+ if isinstance(c, CorrectSlotsCommand):
644
+ c.corrected_slots.append(corrected_slot)
645
+ break
602
646
  else:
603
- resulting_commands.append(command)
647
+ resulting_commands.append(CorrectSlotsCommand(corrected_slots=[corrected_slot]))
604
648
 
605
649
  return resulting_commands
606
650
 
@@ -659,8 +703,9 @@ def clean_up_chitchat_command(
659
703
  0, CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_CHITCHAT)
660
704
  )
661
705
  structlogger.warn(
662
- "command_processor.clean_up_chitchat_command.replace_chitchat_answer_with_cannot_handle",
663
- command=resulting_commands[0],
706
+ "command_processor.clean_up_chitchat_command."
707
+ "replace_chitchat_answer_with_cannot_handle",
708
+ command=resulting_commands[0], # no PII
664
709
  pattern_chitchat_uses_action_trigger_chitchat=has_action_trigger_chitchat,
665
710
  defined_intentless_policy_in_config=defines_intentless_policy,
666
711
  )
@@ -736,3 +781,49 @@ def filter_cannot_handle_command(
736
781
  for command in clean_commands
737
782
  if not isinstance(command, CannotHandleCommand)
738
783
  ]
784
+
785
+
786
+ def reorder_commands(
787
+ commands: List[Command], tracker: DialogueStateTracker
788
+ ) -> List[Command]:
789
+ """Reorder commands.
790
+
791
+ In case there is no active flow, we want to make sure to run the start flow
792
+ commands first.
793
+ """
794
+ reordered_commands = commands
795
+
796
+ top_flow_frame = top_user_flow_frame(tracker.stack)
797
+
798
+ if top_flow_frame is None:
799
+ # no active flow, we want to make sure to run the start flow commands first
800
+ start_flow_commands: List[Command] = [
801
+ command for command in commands if isinstance(command, StartFlowCommand)
802
+ ]
803
+
804
+ # if there are no start flow commands, we can return the commands as they are
805
+ if not start_flow_commands:
806
+ reordered_commands = commands
807
+
808
+ # if there is just one start flow command, we want to run it first
809
+ # as the order of commands is reserved later,
810
+ # we need to add it to the end of the list
811
+ elif len(start_flow_commands) == 1:
812
+ reordered_commands = [
813
+ command for command in commands if command not in start_flow_commands
814
+ ] + start_flow_commands
815
+
816
+ # if there are multiple start flow commands,
817
+ # we just make sure to move the first start flow command to the end of the list
818
+ # (due to the reverse execution order of commands) and keep the other commands
819
+ # as they are.
820
+ else:
821
+ reordered_commands = [
822
+ command for command in commands if command != start_flow_commands[-1]
823
+ ] + [start_flow_commands[-1]]
824
+
825
+ # commands need to be reversed to make sure they end up in the right order
826
+ # on the stack. e.g. if there multiple start flow commands, the first one
827
+ # should be on top of the stack. this is achieved by reversing the list
828
+ # and then pushing the commands onto the stack in the reversed order.
829
+ return list(reversed(reordered_commands))
@@ -206,14 +206,24 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
206
206
  All collect steps that are part of the current active flow,
207
207
  excluding the collect steps that have to be asked before filling.
208
208
  """
209
- active_frame = top_user_flow_frame(
209
+ active_primary_frame = top_user_flow_frame(dialogue_stack)
210
+ any_active_frame = top_user_flow_frame(
210
211
  dialogue_stack, ignore_call_and_link_frames=False
211
212
  )
212
- if active_frame is None:
213
+
214
+ active_flows = []
215
+ if any_active_frame:
216
+ active_flows.append(any_active_frame.flow(all_flows))
217
+
218
+ if active_primary_frame and active_primary_frame != any_active_frame:
219
+ active_flows.append(active_primary_frame.flow(all_flows))
220
+
221
+ if not active_flows:
213
222
  return set()
214
- active_flow = active_frame.flow(all_flows)
223
+
215
224
  return set(
216
225
  step.collect
226
+ for active_flow in active_flows
217
227
  for step in active_flow.get_collect_steps()
218
228
  if not step.ask_before_filling
219
229
  )
@@ -1,15 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ import os
4
5
  import shutil
5
6
  import sys
7
+ import tarfile
6
8
  import tempfile
7
9
  import uuid
8
10
  from contextlib import contextmanager
9
11
  from datetime import datetime
10
12
  from pathlib import Path
11
13
  from tarsafe import TarSafe
12
- from typing import Generator, Optional, Text, Tuple, Union
14
+ from typing import Callable, Generator, Optional, Text, Tuple, Union
13
15
 
14
16
  import rasa.utils.common
15
17
  import rasa.shared.utils.io
@@ -56,6 +58,35 @@ def windows_safe_temporary_directory(
56
58
  yield temporary_directory
57
59
 
58
60
 
61
+ def filter_normpath(member: tarfile.TarInfo, dest_path: str) -> tarfile.TarInfo:
62
+ """Normalize tar member paths for safe extraction"""
63
+ if member.name:
64
+ member.name = os.path.normpath(member.name)
65
+ return member
66
+
67
+
68
+ FilterFunction = Callable[[tarfile.TarInfo, str], Optional[tarfile.TarInfo]]
69
+
70
+
71
+ def create_combined_filter(existing_filter: Optional[FilterFunction]) -> FilterFunction:
72
+ """Create a filter that combines existing filter with path normalization"""
73
+
74
+ def combined_filter(
75
+ member: tarfile.TarInfo, dest_path: str
76
+ ) -> Optional[tarfile.TarInfo]:
77
+ """Apply existing filter first, then path normalization"""
78
+ if existing_filter is not None:
79
+ filtered_member = existing_filter(member, dest_path)
80
+ if filtered_member is None:
81
+ return None # Rejected by existing filter
82
+ member = filtered_member # Use the filtered result
83
+
84
+ # Apply our path normalization
85
+ return filter_normpath(member, dest_path)
86
+
87
+ return combined_filter
88
+
89
+
59
90
  class LocalModelStorage(ModelStorage):
60
91
  """Stores and provides output of `GraphComponents` on local disk."""
61
92
 
@@ -121,7 +152,19 @@ class LocalModelStorage(ModelStorage):
121
152
  # this restriction in environments where it's not possible
122
153
  # to override this behavior, mostly for internal policy reasons
123
154
  # reference: https://stackoverflow.com/a/49102229
124
- tar.extractall(f"\\\\?\\{temporary_directory}")
155
+ try:
156
+ # Use extraction filter to normalize paths for compatibility
157
+ # before trying the \\?\ prefix approach first
158
+ prev_filter = getattr(tar, "extraction_filter", None)
159
+ tar.extraction_filter = create_combined_filter(prev_filter)
160
+ tar.extractall(f"\\\\?\\{temporary_directory}")
161
+ except Exception:
162
+ # Fallback for Python versions with tarfile security fix
163
+ logger.warning(
164
+ "Failed to extract model archive with long path support. "
165
+ "Falling back to regular extraction."
166
+ )
167
+ tar.extractall(temporary_directory)
125
168
  else:
126
169
  tar.extractall(temporary_directory)
127
170
  LocalModelStorage._assert_not_rasa2_archive(temporary_directory)
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.11.18"
3
+ __version__ = "3.11.20"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rasa-pro
3
- Version: 3.11.18
3
+ Version: 3.11.20
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
  Keywords: nlp,machine-learning,machine-learning-library,bot,bots,botkit,rasa conversational-agents,conversational-ai,chatbot,chatbot-framework,bot-framework
6
6
  Author: Rasa Technologies GmbH
@@ -368,7 +368,7 @@ rasa/dialogue_understanding/commands/change_flow_command.py,sha256=0s3g-3InNZs2e
368
368
  rasa/dialogue_understanding/commands/chit_chat_answer_command.py,sha256=jl8em1Xw867VAj5EogeuOjWK93uoT71IhjHU076c2mg,1773
369
369
  rasa/dialogue_understanding/commands/clarify_command.py,sha256=OzkqVRZrQo20cveqUoQGZE96DdRLLPgfPxJhroubIQw,2822
370
370
  rasa/dialogue_understanding/commands/command.py,sha256=oUP7cZHz2ew6JIrauzfkOntomNvgJfpMBhsuYh7cHo4,2528
371
- rasa/dialogue_understanding/commands/correct_slots_command.py,sha256=93h5vaaZKCyPQuwrOArQdLXfwcVmCY9oPKcXXwHHFzQ,10039
371
+ rasa/dialogue_understanding/commands/correct_slots_command.py,sha256=BEPhDRxibXtmgayrV2L6APVVMKdlIogj0FDrH5--BGI,11543
372
372
  rasa/dialogue_understanding/commands/error_command.py,sha256=w4HMcwzEpLUirmFGXzY2Xu_ZVIdlYRONGOvjr1eod4Q,2428
373
373
  rasa/dialogue_understanding/commands/free_form_answer_command.py,sha256=uvQj4IZDgB1MCpoZ7rV8jMf98M_M5ANpja5b4foQSt8,215
374
374
  rasa/dialogue_understanding/commands/handle_code_change_command.py,sha256=pKaj8EsD4hw5Ity3bGMpwSb0ui3Fwi1S3XEFakUDP5Y,2184
@@ -420,7 +420,7 @@ rasa/dialogue_understanding/patterns/session_start.py,sha256=yglhIEkkquRf0YppZ4C
420
420
  rasa/dialogue_understanding/patterns/skip_question.py,sha256=rvZuVUxulikwUhP01MAIgkcHZ4Si7mzxNedH6QBPdX4,1214
421
421
  rasa/dialogue_understanding/patterns/user_silence.py,sha256=uwpCJRkRmeSvFDZQBZnEL4rumweF6mQ8ht_WqrTPVKU,1140
422
422
  rasa/dialogue_understanding/processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
423
- rasa/dialogue_understanding/processor/command_processor.py,sha256=E1MLR2pdghBoJ3TWpA-43I3Z3TDZiiyPecbzBcWwPXw,26272
423
+ rasa/dialogue_understanding/processor/command_processor.py,sha256=wW7s8a_D_KdOfLWeNOccGZLOggY07-LBfZuNDQQWna8,29496
424
424
  rasa/dialogue_understanding/processor/command_processor_component.py,sha256=rkErI_Uo7s3LsEojUSGSRbWGyGaX7GtGOYSJn0V-TI4,1650
425
425
  rasa/dialogue_understanding/stack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
426
426
  rasa/dialogue_understanding/stack/dialogue_stack.py,sha256=j8MnLCyv6cAZVpKRaUVM-Z5HqgWP-scrnaiQXzLNBwY,5243
@@ -430,7 +430,7 @@ rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py,sha256=rmG09a66
430
430
  rasa/dialogue_understanding/stack/frames/flow_stack_frame.py,sha256=HRlR5YCkoOlI1DWCkgl_ak3YjFQEbmgwvzC16elkK54,5578
431
431
  rasa/dialogue_understanding/stack/frames/pattern_frame.py,sha256=EVrYWv5dCP7XTvNV-HqtOOrseP-IkF0jD2_JacAvIYw,235
432
432
  rasa/dialogue_understanding/stack/frames/search_frame.py,sha256=rJ9og28k_udUIjP-2Z5xeb_2T5HvCzwDCnxVG9K7lws,728
433
- rasa/dialogue_understanding/stack/utils.py,sha256=PWA4b1EgRGVZx5uWWa1ZVM45WhJ5tr0C9Md5TA7pxpU,8019
433
+ rasa/dialogue_understanding/stack/utils.py,sha256=w1p4aHGCQr-fb0B1npwSSJFDuqTJ0LCCl2SZws6sJPM,8328
434
434
  rasa/e2e_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
435
435
  rasa/e2e_test/aggregate_test_stats_calculator.py,sha256=XMI7t5xEP7Mo-F8cCCZx2w5ckUKa5sDvyitl6bk6hc8,4924
436
436
  rasa/e2e_test/assertions.py,sha256=ofn2CbnW2wR3OZ3-PPmD_07YqlGQ_tWL1TSv95vxKy0,45428
@@ -467,7 +467,7 @@ rasa/engine/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
467
467
  rasa/engine/runner/dask.py,sha256=38_euDX21U0ccfOLMd-lPsKOlt5ctJJcQIVOG74LIH8,9476
468
468
  rasa/engine/runner/interface.py,sha256=4mbJSMbXPwnITDl5maYZjq8sUcbWw1ToGjYVQtnWCkc,1678
469
469
  rasa/engine/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
470
- rasa/engine/storage/local_model_storage.py,sha256=FrRFJJBC3Zy7w8YkMNtLHJUxbRp5foTz6jUQJUtQC-w,9531
470
+ rasa/engine/storage/local_model_storage.py,sha256=QkM8mWQ_KxshgAaU-kJIEamGDxw30c-lTS0pD5hT4pA,11306
471
471
  rasa/engine/storage/resource.py,sha256=1ecgZbDw7y6CLLFLdi5cYRfdk0yTmD7V1seWEzdtzpU,3931
472
472
  rasa/engine/storage/storage.py,sha256=kI2Me9X1-vCHTzsgnQDNSJJmnd1j7jB13aU1E3gXCXo,6739
473
473
  rasa/engine/training/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -782,9 +782,9 @@ rasa/utils/train_utils.py,sha256=f1NWpp5y6al0dzoQyyio4hc4Nf73DRoRSHDzEK6-C4E,212
782
782
  rasa/utils/url_tools.py,sha256=JQcHL2aLqLHu82k7_d9imUoETCm2bmlHaDpOJ-dKqBc,1218
783
783
  rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
784
784
  rasa/validator.py,sha256=O1wjCeV7ITJ0luvb3GCWy8x1fGgzWVbClEMlPnLBowQ,67265
785
- rasa/version.py,sha256=R2GTBnXJtjPMcBfO4VZ4K5Y8bnCDKXZNa733hyUb6uM,118
786
- rasa_pro-3.11.18.dist-info/METADATA,sha256=RX51RxspkqamCV9WP3okb88GIe2Olmq__auPJbFVW48,10725
787
- rasa_pro-3.11.18.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
788
- rasa_pro-3.11.18.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
789
- rasa_pro-3.11.18.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
790
- rasa_pro-3.11.18.dist-info/RECORD,,
785
+ rasa/version.py,sha256=tYGv-HfaYq4etFK-PNE5n3tj7BlDYTMovozA-UGTvYA,118
786
+ rasa_pro-3.11.20.dist-info/METADATA,sha256=XDs8Fw72qGdOFX8ZGF3a7b6B9PzPWdHJ2mTmPJIPAHM,10725
787
+ rasa_pro-3.11.20.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
788
+ rasa_pro-3.11.20.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
789
+ rasa_pro-3.11.20.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
790
+ rasa_pro-3.11.20.dist-info/RECORD,,