rasa-pro 3.13.0rc3__py3-none-any.whl → 3.13.1__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/cli/inspect.py CHANGED
@@ -9,6 +9,7 @@ from rasa import telemetry
9
9
  from rasa.cli import SubParsersAction
10
10
  from rasa.cli.arguments import shell as arguments
11
11
  from rasa.core import constants
12
+ from rasa.core.available_endpoints import AvailableEndpoints
12
13
  from rasa.engine.storage.local_model_storage import LocalModelStorage
13
14
  from rasa.exceptions import ModelNotFound
14
15
  from rasa.model import get_local_model
@@ -83,6 +84,12 @@ def inspect(args: argparse.Namespace) -> None:
83
84
 
84
85
  model = get_validated_path(args.model, "model", DEFAULT_MODELS_PATH)
85
86
 
87
+ # Load endpoints with proper endpoint file location
88
+ # This will initialise the endpoints singleton properly so that
89
+ # it can be used safely throughout the codebase with
90
+ # `AvailableEndpoints.get_instance()`
91
+ AvailableEndpoints.get_instance(args.endpoints)
92
+
86
93
  try:
87
94
  model = get_local_model(model)
88
95
  except ModelNotFound:
rasa/cli/shell.py CHANGED
@@ -6,6 +6,7 @@ from typing import List
6
6
  from rasa import telemetry
7
7
  from rasa.cli import SubParsersAction
8
8
  from rasa.cli.arguments import shell as arguments
9
+ from rasa.core.available_endpoints import AvailableEndpoints
9
10
  from rasa.engine.storage.local_model_storage import LocalModelStorage
10
11
  from rasa.exceptions import ModelNotFound
11
12
  from rasa.model import get_local_model
@@ -105,7 +106,11 @@ def shell(args: argparse.Namespace) -> None:
105
106
  from rasa.shared.constants import DEFAULT_MODELS_PATH
106
107
 
107
108
  args.connector = "cmdline"
108
-
109
+ # Load endpoints with proper endpoint file location
110
+ # This will initialise the endpoints singleton properly so that
111
+ # it can be used safely throughout the codebase with
112
+ # `AvailableEndpoints.get_instance()`
113
+ AvailableEndpoints.get_instance(args.endpoints)
109
114
  model = get_validated_path(args.model, "model", DEFAULT_MODELS_PATH)
110
115
 
111
116
  try:
rasa/cli/train.py CHANGED
@@ -112,6 +112,10 @@ def run_training(args: argparse.Namespace, can_exit: bool = False) -> Optional[T
112
112
  )
113
113
  config = rasa.cli.utils.get_validated_config(args.config, CONFIG_MANDATORY_KEYS)
114
114
 
115
+ # Validates and loads endpoints with proper endpoint file location
116
+ # This will initialise the endpoints singleton properly so that
117
+ # it can be used safely throughout the codebase with
118
+ # `AvailableEndpoints.get_instance()`
115
119
  _check_nlg_endpoint_validity(args.endpoints)
116
120
 
117
121
  training_files = [
@@ -26,7 +26,7 @@ logger = structlog.get_logger(__name__)
26
26
 
27
27
  @dataclass
28
28
  class ASREngineConfig(MergeableConfig):
29
- pass
29
+ keep_alive_interval: int = 5 # seconds
30
30
 
31
31
 
32
32
  class ASREngine(Generic[T]):
@@ -93,3 +93,7 @@ class ASREngine(Generic[T]):
93
93
  def get_default_config() -> T:
94
94
  """Get the default config for this component."""
95
95
  raise NotImplementedError
96
+
97
+ async def send_keep_alive(self) -> None:
98
+ """Send a keep-alive message to the ASR system if supported."""
99
+ pass
@@ -145,3 +145,8 @@ class DeepgramASR(ASREngine[DeepgramASRConfig]):
145
145
  def concatenate_transcripts(t1: str, t2: str) -> str:
146
146
  """Concatenate two transcripts making sure there is a space between them."""
147
147
  return (t1.strip() + " " + t2.strip()).strip()
148
+
149
+ async def send_keep_alive(self) -> None:
150
+ """Send a keep-alive message to the Deepgram websocket connection."""
151
+ if self.asr_socket is not None:
152
+ await self.asr_socket.send(json.dumps({"type": "KeepAlive"}))
@@ -81,6 +81,12 @@ class AudiocodesVoiceOutputChannel(VoiceOutputChannel):
81
81
  logger.debug("Sending start marker", stream_id=self._get_stream_id())
82
82
  await self.voice_websocket.send(media_message)
83
83
 
84
+ # This should be set when the bot actually starts speaking
85
+ # however, Audiocodes does not have an event to indicate that.
86
+ # This is an approximation, as the bot will be sent the audio chunks next
87
+ # which are played to the user immediately.
88
+ call_state.is_bot_speaking = True # type: ignore[attr-defined]
89
+
84
90
  async def send_intermediate_marker(self, recipient_id: str) -> None:
85
91
  """Audiocodes doesn't need intermediate markers, so do nothing."""
86
92
  pass
@@ -170,21 +176,20 @@ class AudiocodesVoiceInputChannel(VoiceInputChannel):
170
176
  if data["type"] == "activities":
171
177
  activities = data["activities"]
172
178
  for activity in activities:
173
- logger.debug("audiocodes_stream.activity", data=activity)
174
179
  if activity["name"] == "start":
175
- # already handled in collect_call_parameters
180
+ # handled in collect_call_parameters
176
181
  pass
177
182
  elif activity["name"] == "dtmf":
178
- # TODO: handle DTMF input
183
+ logger.info("audiocodes_stream.dtmf_ignored", data=activity)
179
184
  pass
180
185
  elif activity["name"] == "playFinished":
181
186
  logger.debug("audiocodes_stream.playFinished", data=activity)
187
+ call_state.is_bot_speaking = False # type: ignore[attr-defined]
182
188
  if call_state.should_hangup:
183
189
  logger.info("audiocodes_stream.hangup")
184
190
  self._send_hangup(ws, data)
185
191
  # the conversation should continue until
186
192
  # we receive a end message from audiocodes
187
- pass
188
193
  else:
189
194
  logger.warning("audiocodes_stream.unknown_activity", data=activity)
190
195
  elif data["type"] == "userStream.start":
@@ -468,10 +468,17 @@ class VoiceInputChannel(InputChannel):
468
468
  call_parameters,
469
469
  )
470
470
 
471
+ async def asr_keep_alive_task() -> None:
472
+ interval = getattr(asr_engine.config, "keep_alive_interval", 5)
473
+ while True:
474
+ await asyncio.sleep(interval)
475
+ await asr_engine.send_keep_alive()
476
+
471
477
  tasks = [
472
478
  asyncio.create_task(consume_audio_bytes()),
473
479
  asyncio.create_task(receive_asr_events()),
474
480
  asyncio.create_task(handle_asr_events()),
481
+ asyncio.create_task(asr_keep_alive_task()),
475
482
  ]
476
483
  await asyncio.wait(
477
484
  tasks,
@@ -679,7 +679,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
679
679
  answer_relevant = not _ENTERPRISE_SEARCH_ANSWER_NOT_RELEVANT_PATTERN.search(
680
680
  llm_answer
681
681
  )
682
- structlogger.debug("")
682
+
683
683
  return _RelevancyCheckResponse(
684
684
  answer=llm_answer if answer_relevant else None,
685
685
  relevant=answer_relevant,
@@ -92,6 +92,29 @@ class AuthRetryTrackerStore(TrackerStore):
92
92
  )
93
93
  return None
94
94
 
95
+ async def retrieve_full_tracker(
96
+ self, sender_id: Text
97
+ ) -> Optional["DialogueStateTracker"]:
98
+ """Retries retrieving the full tracker if it fails."""
99
+ # add + 1 to retries because the retries are additional to the first attempt
100
+ for _ in range(self.retries + 1):
101
+ try:
102
+ return await self._tracker_store.retrieve_full_tracker(sender_id)
103
+ except Exception as e:
104
+ logger.warning(
105
+ f"Failed to retrieve full tracker for {sender_id}. Retrying...",
106
+ exc_info=e,
107
+ )
108
+ self._tracker_store = self.recreate_tracker_store(
109
+ self.domain, self.event_broker
110
+ )
111
+
112
+ logger.error(
113
+ f"Failed to retrieve full tracker for {sender_id} "
114
+ f"after {self.retries} retries."
115
+ )
116
+ return None
117
+
95
118
  async def save(self, tracker: "DialogueStateTracker") -> None:
96
119
  """Retries saving the tracker if it fails."""
97
120
  # add + 1 to retries because the retries are additional to the first attempt
@@ -120,6 +143,44 @@ class AuthRetryTrackerStore(TrackerStore):
120
143
  endpoint_config = EndpointResolver.update_config(self.endpoint_config)
121
144
  return create_tracker_store(endpoint_config, domain, event_broker)
122
145
 
123
- async def delete(self, sender_id: Text) -> None:
124
- """Delete tracker for the given sender_id."""
125
- await self._tracker_store.delete(sender_id)
146
+ async def delete(self, sender_id: str) -> None:
147
+ """Retries deleting the tracker for the given sender_id."""
148
+ # add + 1 to retries because the retries are additional to the first attempt
149
+ for _ in range(self.retries + 1):
150
+ try:
151
+ await self._tracker_store.delete(sender_id)
152
+ break
153
+ except Exception as e:
154
+ logger.warning(
155
+ f"Failed to delete tracker for {sender_id}. Retrying...",
156
+ exc_info=e,
157
+ )
158
+ self._tracker_store = self.recreate_tracker_store(
159
+ self.domain, self.event_broker
160
+ )
161
+ else:
162
+ logger.error(
163
+ f"Failed to delete tracker for {sender_id} "
164
+ f"after {self.retries} retries."
165
+ )
166
+
167
+ async def update(self, tracker: DialogueStateTracker) -> None:
168
+ """Retries replacing the tracker if it fails."""
169
+ # add + 1 to retries because the retries are additional to the first attempt
170
+ for _ in range(self.retries + 1):
171
+ try:
172
+ await self._tracker_store.update(tracker)
173
+ break
174
+ except Exception as e:
175
+ logger.warning(
176
+ f"Failed to replace tracker for {tracker.sender_id}. Retrying...",
177
+ exc_info=e,
178
+ )
179
+ self._tracker_store = self.recreate_tracker_store(
180
+ self.domain, self.event_broker
181
+ )
182
+ else:
183
+ logger.error(
184
+ f"Failed to replace tracker for {tracker.sender_id} "
185
+ f"after {self.retries} retries."
186
+ )
@@ -109,7 +109,35 @@ class DynamoTrackerStore(TrackerStore, SerializedTrackerAsDict):
109
109
  await self.stream_events(tracker)
110
110
  serialized = self.serialise_tracker(tracker)
111
111
 
112
- self.db.put_item(Item=serialized)
112
+ full_tracker = await self.retrieve_full_tracker(tracker.sender_id)
113
+ if full_tracker is None:
114
+ self.db.put_item(Item=serialized)
115
+ return None
116
+
117
+ # return the latest events since the last user message
118
+ new_tracker = DialogueStateTracker.from_dict(
119
+ serialized["sender_id"], events_as_dict=serialized["events"]
120
+ )
121
+ new_events = new_tracker.get_last_turn_events()
122
+ new_serialized_events = [event.as_dict() for event in new_events]
123
+
124
+ # we need to save the full tracker if it is a new tracker
125
+ # without events following a user message
126
+ if not new_serialized_events:
127
+ self.db.put_item(Item=serialized)
128
+ return None
129
+
130
+ # append new events to the existing tracker
131
+ self.db.update_item(
132
+ Key={"sender_id": tracker.sender_id},
133
+ UpdateExpression="SET events = list_append(if_not_exists(events, :empty_list), :events)", # noqa: E501
134
+ ExpressionAttributeValues={
135
+ ":events": new_serialized_events,
136
+ ":empty_list": [],
137
+ },
138
+ ReturnValues="UPDATED_NEW",
139
+ )
140
+ return None
113
141
 
114
142
  async def delete(self, sender_id: Text) -> None:
115
143
  """Delete tracker for the given sender_id."""
@@ -181,7 +209,7 @@ class DynamoTrackerStore(TrackerStore, SerializedTrackerAsDict):
181
209
  events = rasa.utils.json_utils.replace_decimals_with_floats(
182
210
  dialogue["events"]
183
211
  )
184
- events_with_floats += events
212
+ events_with_floats.extend(events)
185
213
 
186
214
  if self.domain is None:
187
215
  slots = []
@@ -216,3 +244,13 @@ class DynamoTrackerStore(TrackerStore, SerializedTrackerAsDict):
216
244
  sender_ids.extend([i["sender_id"] for i in response["Items"]])
217
245
 
218
246
  return sender_ids
247
+
248
+ async def update(self, tracker: DialogueStateTracker) -> None:
249
+ """Overwrites the tracker for the given sender_id."""
250
+ serialized = self.serialise_tracker(tracker)
251
+ self.db.put_item(Item=serialized)
252
+
253
+ structlogger.info(
254
+ "dynamo_tracker_store.replace.replaced_tracker",
255
+ sender_id=tracker.sender_id,
256
+ )
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import itertools
4
+ from datetime import datetime
4
5
  from typing import Any, Dict, Iterable, Iterator, List, Optional, Text
5
6
 
6
7
  import structlog
@@ -204,3 +205,19 @@ class MongoTrackerStore(TrackerStore, SerializedTrackerAsText):
204
205
  async def keys(self) -> Iterable[Text]:
205
206
  """Returns sender_ids of the Mongo Tracker Store."""
206
207
  return [c["sender_id"] for c in self.conversations.find()]
208
+
209
+ async def update(self, tracker: DialogueStateTracker) -> None:
210
+ """Overwrites the tracker for the given sender_id."""
211
+ self.conversations.replace_one(
212
+ {"sender_id": tracker.sender_id},
213
+ tracker.current_state(EventVerbosity.ALL),
214
+ upsert=True,
215
+ )
216
+
217
+ first_event_timestamp = str(datetime.fromtimestamp(tracker.events[0].timestamp))
218
+
219
+ structlogger.info(
220
+ "redis_tracker_store.update.updated_tracker",
221
+ sender_id=tracker.sender_id,
222
+ first_event_timestamp=first_event_timestamp,
223
+ )
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from datetime import datetime
3
4
  from typing import Any, Dict, Iterable, Optional, Text
4
5
 
5
6
  import structlog
@@ -227,3 +228,25 @@ class RedisTrackerStore(TrackerStore, SerializedTrackerAsText):
227
228
  merged.update(new_event)
228
229
 
229
230
  return merged
231
+
232
+ async def update(self, tracker: DialogueStateTracker) -> None:
233
+ """Overwrites the tracker for the given sender_id."""
234
+ serialised_tracker = self.serialise_tracker(tracker)
235
+
236
+ # if the sender_id starts with the key prefix, we remove it
237
+ # this is used to avoid storing the prefix twice
238
+ sender_id = tracker.sender_id
239
+ if sender_id.startswith(self.key_prefix):
240
+ sender_id = sender_id[len(self.key_prefix) :]
241
+
242
+ self.red.set(
243
+ self.key_prefix + sender_id, serialised_tracker, ex=self.record_exp
244
+ )
245
+
246
+ first_event_timestamp = str(datetime.fromtimestamp(tracker.events[0].timestamp))
247
+
248
+ structlogger.info(
249
+ "redis_tracker_store.update.updated_tracker",
250
+ sender_id=tracker.sender_id,
251
+ first_event_timestamp=first_event_timestamp,
252
+ )
@@ -4,6 +4,7 @@ import contextlib
4
4
  import itertools
5
5
  import json
6
6
  import os
7
+ from datetime import datetime
7
8
  from time import sleep
8
9
  from typing import (
9
10
  TYPE_CHECKING,
@@ -553,3 +554,29 @@ class SQLTrackerStore(TrackerStore, SerializedTrackerAsText):
553
554
  return itertools.islice(
554
555
  tracker.events, number_of_events_since_last_session, len(tracker.events)
555
556
  )
557
+
558
+ async def update(self, tracker_to_keep: DialogueStateTracker) -> None:
559
+ """Overwrite the tracker in the SQL tracker store."""
560
+ with self.session_scope() as session:
561
+ # Delete events whose timestamp are older
562
+ # than the first event of the tracker to keep.
563
+ statement = sa.delete(self.SQLEvent).where(
564
+ self.SQLEvent.sender_id == tracker_to_keep.sender_id,
565
+ self.SQLEvent.timestamp < tracker_to_keep.events[0].timestamp
566
+ if tracker_to_keep.events
567
+ else 0,
568
+ )
569
+
570
+ result = session.execute(statement)
571
+ session.commit()
572
+
573
+ first_event_timestamp = str(
574
+ datetime.fromtimestamp(tracker_to_keep.events[0].timestamp)
575
+ )
576
+
577
+ structlogger.info(
578
+ "sql_tracker_store.update.updated_tracker",
579
+ sender_id=tracker_to_keep.sender_id,
580
+ first_event_timestamp=first_event_timestamp,
581
+ event_info=f"{result.rowcount} rows removed from tracker.",
582
+ )
@@ -251,6 +251,14 @@ class TrackerStore:
251
251
  """
252
252
  raise NotImplementedError()
253
253
 
254
+ async def update(self, tracker: DialogueStateTracker) -> None:
255
+ """Replace an existing tracker with a new one.
256
+
257
+ Args:
258
+ tracker: The tracker to update.
259
+ """
260
+ raise NotImplementedError()
261
+
254
262
  async def retrieve_full_tracker(
255
263
  self, conversation_id: Text
256
264
  ) -> Optional[DialogueStateTracker]:
@@ -478,6 +486,14 @@ class InMemoryTrackerStore(TrackerStore, SerializedTrackerAsText):
478
486
 
479
487
  return multiple_tracker_sessions[-1]
480
488
 
489
+ async def update(self, tracker: DialogueStateTracker) -> None:
490
+ """Replace an existing tracker with a new one.
491
+
492
+ Args:
493
+ tracker: The tracker to update.
494
+ """
495
+ await self.save(tracker)
496
+
481
497
 
482
498
  def validate_port(port: Any) -> Optional[int]:
483
499
  """Ensure that port can be converted to integer.
@@ -583,7 +599,19 @@ class FailSafeTrackerStore(TrackerStore):
583
599
 
584
600
  async def delete(self, sender_id: Text) -> None:
585
601
  """Delete tracker for the given sender_id."""
586
- await self._tracker_store.delete(sender_id)
602
+ try:
603
+ await self._tracker_store.delete(sender_id)
604
+ except Exception as e:
605
+ self.on_tracker_store_error(e)
606
+ await self.fallback_tracker_store.delete(sender_id)
607
+
608
+ async def update(self, tracker: DialogueStateTracker) -> None:
609
+ """Replace an existing tracker with a new one."""
610
+ try:
611
+ await self._tracker_store.update(tracker)
612
+ except Exception as e:
613
+ self.on_tracker_store_error(e)
614
+ await self.fallback_tracker_store.update(tracker)
587
615
 
588
616
  async def retrieve_full_tracker(
589
617
  self, sender_id: Text
@@ -793,7 +821,13 @@ class AwaitableTrackerStore(TrackerStore):
793
821
 
794
822
  async def delete(self, sender_id: Text) -> None:
795
823
  """Delete tracker for the given sender_id."""
796
- await self._tracker_store.delete(sender_id)
824
+ result = self._tracker_store.delete(sender_id)
825
+ return await result if isawaitable(result) else result
826
+
827
+ async def update(self, tracker: DialogueStateTracker) -> None:
828
+ """Replace an existing tracker with a new one."""
829
+ result = self._tracker_store.update(tracker)
830
+ return await result if isawaitable(result) else result
797
831
 
798
832
  async def retrieve_full_tracker(
799
833
  self, conversation_id: Text
@@ -232,16 +232,6 @@ class CorrectSlotsCommand(Command):
232
232
  proposed_slots, all_flows, tracker
233
233
  )
234
234
 
235
- if not earliest_collect and not is_reset_only:
236
- # if we could not find any step in the flow, where the slots were
237
- # previously set, and we also don't want to reset the slots, do
238
- # not correct the slots.
239
- structlogger.debug(
240
- "correct_slots_command.skip_correction",
241
- is_reset_only=is_reset_only,
242
- )
243
- return None
244
-
245
235
  return CorrectionPatternFlowStackFrame(
246
236
  is_reset_only=is_reset_only,
247
237
  corrected_slots=proposed_slots,
@@ -249,7 +249,7 @@ flows:
249
249
  next: END
250
250
 
251
251
  pattern_repeat_bot_messages:
252
- description: Voice conversation repair pattern to repeat bot messages
252
+ description: Conversation repair flow for repeating previous messages
253
253
  name: pattern repeat bot messages
254
254
  steps:
255
255
  - action: action_repeat_bot_messages
@@ -398,7 +398,12 @@ def clean_up_commands(
398
398
  """
399
399
  domain = domain if domain else Domain.empty()
400
400
 
401
- slots_so_far, active_flow = filled_slots_for_active_flow(tracker, all_flows)
401
+ slots_so_far, _ = filled_slots_for_active_flow(tracker, all_flows)
402
+
403
+ # update the slots so far with the slots that were set in the tracker
404
+ slots_so_far.update(
405
+ {event.key for event in tracker.events if isinstance(event, SlotSet)}
406
+ )
402
407
 
403
408
  clean_commands: List[Command] = []
404
409
 
@@ -12,7 +12,7 @@ import structlog
12
12
  from apscheduler.schedulers.background import BackgroundScheduler
13
13
 
14
14
  import rasa.shared.core.trackers
15
- from rasa.core.tracker_stores.tracker_store import FailSafeTrackerStore, TrackerStore
15
+ from rasa.core.tracker_stores.tracker_store import TrackerStore
16
16
  from rasa.privacy.constants import (
17
17
  TEXT_KEY,
18
18
  USER_CHAT_INACTIVITY_IN_MINUTES_ENV_VAR_NAME,
@@ -25,7 +25,7 @@ from rasa.privacy.privacy_config import (
25
25
  )
26
26
  from rasa.privacy.privacy_filter import PrivacyFilter
27
27
  from rasa.shared.core.events import Event, SlotSet, UserUttered, split_events
28
- from rasa.shared.core.trackers import DialogueStateTracker
28
+ from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
29
29
 
30
30
  if TYPE_CHECKING:
31
31
  from asyncio import AbstractEventLoop
@@ -97,7 +97,7 @@ class BackgroundPrivacyManager:
97
97
  else TrackerStore.create(None)
98
98
  )
99
99
 
100
- self.tracker_store = FailSafeTrackerStore(tracker_store)
100
+ self.tracker_store = tracker_store
101
101
 
102
102
  self.event_brokers: List["EventBroker"] = []
103
103
  self.event_loop = event_loop
@@ -264,15 +264,16 @@ class BackgroundPrivacyManager:
264
264
  )
265
265
  return None
266
266
 
267
- latest_message = tracker.latest_message
268
-
269
- if latest_message is None or not latest_message.text:
267
+ latest_user_message = tracker.get_last_event_for(
268
+ UserUttered, event_verbosity=EventVerbosity.ALL
269
+ )
270
+ if latest_user_message is None or not latest_user_message.text:
270
271
  structlogger.debug(
271
272
  "rasa.privacy_manager.no_user_message.skipping_processing",
272
273
  )
273
274
  return None
274
275
 
275
- return latest_message
276
+ return latest_user_message
276
277
 
277
278
  @staticmethod
278
279
  def _has_session_been_anonymized(events: List[Event]) -> bool:
@@ -360,9 +361,13 @@ class BackgroundPrivacyManager:
360
361
  full_tracker
361
362
  )
362
363
 
363
- await self.tracker_store.delete(sender_id=key)
364
-
365
364
  if not events_to_be_retained:
365
+ await self.tracker_store.delete(sender_id=key)
366
+ structlogger.info(
367
+ "rasa.privacy_manager.tracker_session_deleted",
368
+ sender_id=full_tracker.sender_id,
369
+ triggered_by="deletion_cron_job",
370
+ )
366
371
  continue
367
372
 
368
373
  tracker = DialogueStateTracker.from_events(
@@ -370,12 +375,13 @@ class BackgroundPrivacyManager:
370
375
  evts=events_to_be_retained,
371
376
  slots=full_tracker.slots.values(),
372
377
  )
373
- await self.tracker_store.save(tracker)
378
+ await self.tracker_store.update(tracker)
374
379
 
375
380
  structlogger.info(
376
- "rasa.privacy_manager.save_tracker_after_deletion",
381
+ "rasa.privacy_manager.overwritten_tracker",
377
382
  sender_id=key,
378
- event_info="Saved tracker with events not scheduled "
383
+ event_info="Deleted eligible events and saved "
384
+ "tracker with events not scheduled "
379
385
  "for deletion yet.",
380
386
  )
381
387
 
@@ -527,10 +533,7 @@ class BackgroundPrivacyManager:
527
533
  last_event_timestamp=last_event_timestamp,
528
534
  triggered_by="anonymization_cron_job",
529
535
  )
530
- tracker = DialogueStateTracker.from_events(
531
- session.sender_id, session.events
532
- )
533
- events = self.process_events(tracker, process_all=True)
536
+ events = self.process_events(session, process_all=True)
534
537
  processed_events.extend(events)
535
538
  else:
536
539
  # If the session is not valid for anonymization,
@@ -1170,6 +1170,23 @@ class DialogueStateTracker:
1170
1170
  "Example: `language: en`."
1171
1171
  )
1172
1172
 
1173
+ def get_last_turn_events(self) -> List[Event]:
1174
+ """Get all events of the last conversation turn."""
1175
+ last_user_message = self.get_last_event_for(
1176
+ UserUttered, event_verbosity=EventVerbosity.ALL
1177
+ )
1178
+ if not last_user_message:
1179
+ return []
1180
+
1181
+ last_turn_events = []
1182
+ for event in reversed(self.events):
1183
+ if event.timestamp >= last_user_message.timestamp:
1184
+ last_turn_events.append(event)
1185
+ else:
1186
+ break
1187
+
1188
+ return list(reversed(last_turn_events))
1189
+
1173
1190
 
1174
1191
  class TrackerEventDiffEngine:
1175
1192
  """Computes event difference of two trackers."""
rasa/studio/upload.py CHANGED
@@ -171,6 +171,7 @@ def handle_upload(args: argparse.Namespace) -> None:
171
171
 
172
172
  config = read_yaml_file(args.config, expand_env_vars=False)
173
173
  assistant_name = args.assistant_name or _get_assistant_name(config)
174
+ args.assistant_name = assistant_name
174
175
  if not _handle_existing_assistant(
175
176
  assistant_name, studio_config.studio_url, verify, args
176
177
  ):
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.13.0rc3"
3
+ __version__ = "3.13.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rasa-pro
3
- Version: 3.13.0rc3
3
+ Version: 3.13.1
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
@@ -81,7 +81,7 @@ Requires-Dist: pep440-version-utils (>=1.1.0,<1.2.0)
81
81
  Requires-Dist: pluggy (>=1.2.0,<2.0.0)
82
82
  Requires-Dist: portalocker (>=2.7.0,<3.0.0)
83
83
  Requires-Dist: prompt-toolkit (>=3.0.28,<3.0.29)
84
- Requires-Dist: protobuf (>=4.23.3,<4.25.4)
84
+ Requires-Dist: protobuf (>=4.25.8,<4.26.0)
85
85
  Requires-Dist: psutil (>=5.9.5,<6.0.0)
86
86
  Requires-Dist: psycopg2-binary (>=2.9.10,<2.10.0)
87
87
  Requires-Dist: pydot (>=1.4,<1.5)
@@ -99,7 +99,7 @@ Requires-Dist: pyyaml (>=6.0)
99
99
  Requires-Dist: qdrant-client (>=1.9.1,<1.10.0)
100
100
  Requires-Dist: questionary (>=1.10.0,<2.1.0)
101
101
  Requires-Dist: randomname (>=0.2.1,<0.3.0)
102
- Requires-Dist: rasa-sdk (==3.13.0rc1)
102
+ Requires-Dist: rasa-sdk (==3.13.0)
103
103
  Requires-Dist: redis (>=4.6.0,<6.0)
104
104
  Requires-Dist: regex (>=2024.7.24,<2024.8.0)
105
105
  Requires-Dist: requests (>=2.32.3,<2.33.0)
@@ -115,7 +115,7 @@ Requires-Dist: scikit-learn (>=1.5.1,<1.6.0)
115
115
  Requires-Dist: scipy (>=1.13.1,<1.14.0)
116
116
  Requires-Dist: sentencepiece[sentencepiece] (>=0.1.99,<0.2.0) ; extra == "transformers" or extra == "full"
117
117
  Requires-Dist: sentry-sdk (>=2.8.0,<3)
118
- Requires-Dist: setuptools (>=70.0.0,<70.1.0)
118
+ Requires-Dist: setuptools (>=78.1.1,<78.2.0)
119
119
  Requires-Dist: sklearn-crfsuite (>=0.3.6,<0.4.0)
120
120
  Requires-Dist: skops (>=0.10.0,<0.11.0)
121
121
  Requires-Dist: slack-sdk (>=3.27.1,<3.28.0)
@@ -19,7 +19,7 @@ rasa/cli/dialogue_understanding_test.py,sha256=0ap9gDbZQ0S52KEDqcBeKaPamvw1KM0R0
19
19
  rasa/cli/e2e_test.py,sha256=0GmyZ6mRApIvU9aCr8d4vf6xNoQ_LOE7GS5OXwlBMTQ,8128
20
20
  rasa/cli/evaluate.py,sha256=QGIuAySKosuOJJ5I-ZfLrnQRHArJiB0ubdN6I1tF4hs,7975
21
21
  rasa/cli/export.py,sha256=lXz2fQbAjJ4bEKN9qjSYv44WrbLjXVb87b2Q5EtIALc,8329
22
- rasa/cli/inspect.py,sha256=94yDzwq-cMnVVOqVkbIaDmhbuFtOb6ghxxyJiRa8DxU,3381
22
+ rasa/cli/inspect.py,sha256=hui5u9eqwFtWdin430A99EnYywqaBZWqx7XVXEGqr6E,3718
23
23
  rasa/cli/interactive.py,sha256=_PwvTLF9Sozt0xzDo4W_zYs3SBCoDcxuGDDumD-JtUo,6012
24
24
  rasa/cli/license.py,sha256=oFZU5cQ6CD2DvBgnlss9DgJVHzkSpEVI6eNKlMHgAMM,3565
25
25
  rasa/cli/llm_fine_tuning.py,sha256=A2RbXSF7jjta1Ql-X251kOMMfU3FJqwPMzh-Xuy83bg,15043
@@ -61,7 +61,7 @@ rasa/cli/project_templates/tutorial/domain.yml,sha256=X16UwfoTNKSV2DYvEQZ-CfRczz
61
61
  rasa/cli/project_templates/tutorial/endpoints.yml,sha256=ZZfchpZLo5MObU5JVXPqBi8KrKe8gzsZskSDAjpfS9E,1788
62
62
  rasa/cli/run.py,sha256=QnmVCXORZambJzee1z3wMa3Ki8cPwSsImgQ2hbvbpuU,4632
63
63
  rasa/cli/scaffold.py,sha256=8cFXQN-iGViAXfST78f3JHmIxsVzcFfkVDisq0TsiSQ,8042
64
- rasa/cli/shell.py,sha256=YTXn3_iDWJySY187BEJTRDxPoG-mqRtl17jqwqQ6hX4,4332
64
+ rasa/cli/shell.py,sha256=B3HEDiqRlqKfW0ZEHd9A-uqU9vo2-2VTWtKfQoPn74k,4667
65
65
  rasa/cli/studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  rasa/cli/studio/download.py,sha256=5uLdnW60JQ1NkUcJfK_be2pKjVOtYzCCjNAQpfGkYnM,1163
67
67
  rasa/cli/studio/link.py,sha256=rrup2dUGef6yCC-3jTDiK-2pEspcBnl-61guhVJdmGU,1059
@@ -72,7 +72,7 @@ rasa/cli/studio/train.py,sha256=R5TuZztfeBwvv83Q3VpdaHtK1oo5zdt6ImbZqfvHQxc,1485
72
72
  rasa/cli/studio/upload.py,sha256=9j6-OC0uSa1decsjbIrHk952sIF_NZPnIYZHvWLOy-w,1695
73
73
  rasa/cli/telemetry.py,sha256=mNMMbcgnNPZzeF1k-khN-7lAQFnkFx75VBwtnPfPI6k,3538
74
74
  rasa/cli/test.py,sha256=JfzBh1_TAOnd346jVikSK94bTlUA-BLSAQ7XBRvL2TQ,8901
75
- rasa/cli/train.py,sha256=8BVp9yWzHjprlh-dtWsMm6ikwf15k5d8xVFk7HV2aBU,9382
75
+ rasa/cli/train.py,sha256=09M5nmU3TX7R-Q_2ynMhPnuUdIfPtvEepf6dWVP6f7o,9620
76
76
  rasa/cli/utils.py,sha256=-t0a_jMMVyDZS8nAkvqLqBn1cqCMWzwNwIj0KMvo2_w,16881
77
77
  rasa/cli/visualize.py,sha256=YmRAATAfxHpgE8_PknGyM-oIujwICNzVftTzz6iLNNc,1256
78
78
  rasa/cli/x.py,sha256=T10e6bVUx5BadZOt3JJ4T5EByiR5jJ2hv5ExXOnt9F8,6839
@@ -265,12 +265,12 @@ rasa/core/channels/voice_ready/twilio_voice.py,sha256=E9-tgqlGdJ7a_Jl9_rtvM5ubZz
265
265
  rasa/core/channels/voice_ready/utils.py,sha256=8sDUDWHOxgEuSwNDJUQ15SnRlfnuCjEOF0rsokLIGZ8,1736
266
266
  rasa/core/channels/voice_stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
267
267
  rasa/core/channels/voice_stream/asr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
268
- rasa/core/channels/voice_stream/asr/asr_engine.py,sha256=DpWEhkCHJPM1WDsBI5R3czqwvFiyaRMlgCubBNXO4U4,3237
268
+ rasa/core/channels/voice_stream/asr/asr_engine.py,sha256=34rgUqDtH9YvpAUZYPsS0GuS1pbYaz9ziEI5HyFXUSs,3403
269
269
  rasa/core/channels/voice_stream/asr/asr_event.py,sha256=skPwrkRrcsptmeWXu9q68i4B-ZbvambCFFLtQ0TIgMo,297
270
270
  rasa/core/channels/voice_stream/asr/azure.py,sha256=dUFxtNVVwGM2D1VyqQ5FWeSpKwUQekMXUxWZv6tPJ7w,6114
271
- rasa/core/channels/voice_stream/asr/deepgram.py,sha256=9cIqRuv9gWzOfEKxeDbhijGoT8EPUV7Oo493WXaHlBo,5682
271
+ rasa/core/channels/voice_stream/asr/deepgram.py,sha256=VeVMWg05uL_epGGOZbUHXeIIhoBf0bxiWMp6QwNFe0A,5920
272
272
  rasa/core/channels/voice_stream/audio_bytes.py,sha256=3V0QQplPD-kVfebaaeVcKgV7pwIJyjnTenujVD3y3sY,340
273
- rasa/core/channels/voice_stream/audiocodes.py,sha256=TbLC3iuupyA8d8xdxBHVCtljKidFT-ZzLH9LvMPsxEI,12349
273
+ rasa/core/channels/voice_stream/audiocodes.py,sha256=W8p5gzP43VROMlVwwx8vrGxS4zy_JL-MpORv-1fPik0,12707
274
274
  rasa/core/channels/voice_stream/browser_audio.py,sha256=KDUexINUh1gElQ_2ccpAWltlH-pdakm-x1L6bvKffUY,3931
275
275
  rasa/core/channels/voice_stream/call_state.py,sha256=fbwVbT0ddE7AjTYjx-Mq5jBMEGXanbug5wlBwstaews,899
276
276
  rasa/core/channels/voice_stream/genesys.py,sha256=-PL1y0b2dJClM-S000loaDUWbm8qwcFSYwYaNaPG_9c,17708
@@ -282,7 +282,7 @@ rasa/core/channels/voice_stream/tts/tts_cache.py,sha256=K4S2d8zWX2h2ylYALp7IdqFS
282
282
  rasa/core/channels/voice_stream/tts/tts_engine.py,sha256=JMCWGHxT8QiqKoBeI6F4RX_-Q9EEqG3vUtkgOUnlt-w,1812
283
283
  rasa/core/channels/voice_stream/twilio_media_streams.py,sha256=Tc30Z-gLB3v2PM0ibNpF2m0vTzbXP6h9B64HNwvciOE,8936
284
284
  rasa/core/channels/voice_stream/util.py,sha256=d0Tl0tGAnVj3SgGovsUMHx-QL44nrPI29OTYKYleH0U,1987
285
- rasa/core/channels/voice_stream/voice_channel.py,sha256=DJ2enLUQP3fgnC1rJ3kN4PPTpbvcsrC4q9x4LfMqseg,21115
285
+ rasa/core/channels/voice_stream/voice_channel.py,sha256=mcH5x-28X6kauPdb5XYe8WCyTAr2IjuraPM7KuOeMr0,21418
286
286
  rasa/core/channels/webexteams.py,sha256=z_o_jnc6B7hsHpd6XorImFkF43wB4yx_kiTPKAjPSuo,4805
287
287
  rasa/core/concurrent_lock_store.py,sha256=aAZDAYUVffCx2J8wbJ05vTE3Xd9bQ4Dx13RZmCy3ohw,8285
288
288
  rasa/core/constants.py,sha256=dEokmEf6XkOFA_xpuwjqwNtlZv-a5Tz5dLMRc7Vu4CU,4070
@@ -320,7 +320,7 @@ rasa/core/nlg/translate.py,sha256=PBMTbIgdkhx8rhzqv6h0u5r9jqdfiVIh7u0qb363sJA,18
320
320
  rasa/core/persistor.py,sha256=7LCZHAwCM-xrUI38aaJ5dkxJvLdJXWI1TEUKsBo4_EE,21295
321
321
  rasa/core/policies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
322
322
  rasa/core/policies/ensemble.py,sha256=XoHxU0jcb_io_LBOpjJffylzqtGEB7CH9ivhRyO8pDc,12960
323
- rasa/core/policies/enterprise_search_policy.py,sha256=QmphxTTLWKaKrVCwBYWuVhw4TraW1aCbugNrg2Qrbcg,46869
323
+ rasa/core/policies/enterprise_search_policy.py,sha256=MCY7fPtBo9IwKdl-k5gIurUUR2_oFWlZErZMhwBa1-k,46839
324
324
  rasa/core/policies/enterprise_search_policy_config.py,sha256=rTIGBrfGfe_lvsYQW1cU20tza07p_-oxFfjXhw7-phc,8644
325
325
  rasa/core/policies/enterprise_search_prompt_template.jinja2,sha256=dCS_seyBGxMQoMsOjjvPp0dd31OSzZCJSZeev1FJK5Q,1187
326
326
  rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2,sha256=va9rpP97dN3PKoJZOVfyuISt3cPBlb10Pqyz25RwO_Q,3294
@@ -347,12 +347,12 @@ rasa/core/secrets_manager/secret_manager.py,sha256=oYihfIMIMUKA8U_ZRA3blcErFlCoz
347
347
  rasa/core/secrets_manager/vault.py,sha256=02wlsrN3QoHSZkqygHaM_CWDtkpkJ25iD-ksEu3ejBw,20481
348
348
  rasa/core/test.py,sha256=VGlGvmrXRqHaPMaetvvN1fa65oZMryN5ot9L3otNH5E,49282
349
349
  rasa/core/tracker_stores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
350
- rasa/core/tracker_stores/auth_retry_tracker_store.py,sha256=eFW-uCRImTxouhHux4HVppQhbWNOaPzusbvaJ-U0N4Y,4826
351
- rasa/core/tracker_stores/dynamo_tracker_store.py,sha256=opTSmFfNYKe3pKY5PL2JAKCc9uIur3pc5f_8SVW6g98,7906
352
- rasa/core/tracker_stores/mongo_tracker_store.py,sha256=nuj-XkIC02dGv0l7Ie8801fHGrSN9SWlepenz3DZs78,7024
353
- rasa/core/tracker_stores/redis_tracker_store.py,sha256=cODH4DlUNij-GnKz6ns3nU2E-z_pXtsNA7LojmARZWg,7974
354
- rasa/core/tracker_stores/sql_tracker_store.py,sha256=WZuo5c4TcBwOc6GwWlyNCv3LHNetgWTih0zEdMEvgYY,19879
355
- rasa/core/tracker_stores/tracker_store.py,sha256=BrQFZXQGMncl-Ig3DDUrqpJfxshuy-pOmoVTVa1IMbw,28223
350
+ rasa/core/tracker_stores/auth_retry_tracker_store.py,sha256=eOwsLuQZhWu5Q4RZHJYffL3FhpKOglzJ0MNGffv2E60,7270
351
+ rasa/core/tracker_stores/dynamo_tracker_store.py,sha256=T4F1q3o9Fw2XVOOAmtz3tgM2FTKI4aaQfCZXmdjYjGE,9426
352
+ rasa/core/tracker_stores/mongo_tracker_store.py,sha256=v2ktPXxp7PWfoHPqOJKLkMzML_5E_Of0Ihna2Vcqfbg,7644
353
+ rasa/core/tracker_stores/redis_tracker_store.py,sha256=q38nCZoXW4G7xdZ6nOcOpanIB5XrzEM4rMdFnUHR3pE,8864
354
+ rasa/core/tracker_stores/sql_tracker_store.py,sha256=oJgAqDysP3KXJkPRCZ1s8HhlxOn-y9Apmo6OVO3lQmc,20960
355
+ rasa/core/tracker_stores/tracker_store.py,sha256=bJMsxzuhw90vGY2uGbbCogikoy4HucPy6SvYfcyFQJw,29472
356
356
  rasa/core/train.py,sha256=ESBhZ9vZySziZIG8fvshHO4AYApD0hywRFCmA9h1wFI,3521
357
357
  rasa/core/training/__init__.py,sha256=23DaZynwsxIaGYvZBSwQRxanaMWa-ihfON7f-NetK_g,3213
358
358
  rasa/core/training/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -376,7 +376,7 @@ rasa/dialogue_understanding/commands/chit_chat_answer_command.py,sha256=XXSFcU6x
376
376
  rasa/dialogue_understanding/commands/clarify_command.py,sha256=az0nHYoP66fdhBj4TcD1zKBcPYqtNk8KQKyW7BvEYZk,4506
377
377
  rasa/dialogue_understanding/commands/command.py,sha256=rhxHmllTMwvb4Uq-pDqmUdlKtu-87y8nqN5DRO-KDwE,2529
378
378
  rasa/dialogue_understanding/commands/command_syntax_manager.py,sha256=2qA2m9Z7SSjG4pFAdgKbkqJCICyanicu4wU5iw5Bs1g,1907
379
- rasa/dialogue_understanding/commands/correct_slots_command.py,sha256=DGmw_NMPxR1dNR4Nm-6lYn_XDMJmsVHCuxPAN-XPRFk,10779
379
+ rasa/dialogue_understanding/commands/correct_slots_command.py,sha256=307rHpR2mwJd7Pdmphjf7F7E6YX69y6WnkWQdUqFNdU,10360
380
380
  rasa/dialogue_understanding/commands/error_command.py,sha256=Twk2dOtR-oqE87wW5eh1tR_b24KpyWyK20f86bJpbH4,2433
381
381
  rasa/dialogue_understanding/commands/free_form_answer_command.py,sha256=XlQrHXrcOemzu1LHZiDhBAluiSlnUQ2V7ET5Z-aG7gc,224
382
382
  rasa/dialogue_understanding/commands/handle_code_change_command.py,sha256=Cp2e1iD0zacXmljJ8vDXHJu9Fp6BwB7cGx8NF748akw,2192
@@ -431,7 +431,7 @@ rasa/dialogue_understanding/patterns/collect_information.py,sha256=8YWvhFTt8CJML
431
431
  rasa/dialogue_understanding/patterns/completed.py,sha256=7qkyUj2d__2R3mpwWVmQpfwCCbJruBrjRZbmbDr3Zbo,1278
432
432
  rasa/dialogue_understanding/patterns/continue_interrupted.py,sha256=OSTbe5l0B0ECNIYWpYB0pdzIeaqM3m3UZskNNjL5vrw,1682
433
433
  rasa/dialogue_understanding/patterns/correction.py,sha256=7fQ02-JU1CGZiTjTi9YqmD1F4o-9Tv5WCAXnFgZlvtY,11380
434
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml,sha256=8zQQ1o9KQsT_wmNBUx4_iHZzYbzPHVLjFDorT60yvCs,11030
434
+ rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml,sha256=NwNXqrodwOTgDPYtu6L5n6epBLzXjnnRCzH_oBPLMnc,11030
435
435
  rasa/dialogue_understanding/patterns/domain_for_patterns.py,sha256=Zv_lCJn4nbkxeNYOPGsR0V8tmYAUsM_Ho_9to8hku-o,6493
436
436
  rasa/dialogue_understanding/patterns/human_handoff.py,sha256=1hkSdL6kui42rZc7zERZ9R7nLyvRHi_tHgNU7FyrhAQ,1132
437
437
  rasa/dialogue_understanding/patterns/internal_error.py,sha256=APCKVv16M6mSQ4upu4UwG0yIaaKTyr7uB2yV8ZtpMzo,1609
@@ -443,7 +443,7 @@ rasa/dialogue_understanding/patterns/skip_question.py,sha256=fJ1MC0WEEtS-BpnGJEf
443
443
  rasa/dialogue_understanding/patterns/user_silence.py,sha256=xP-QMnd-MsybH5z4g01hBv4OLOHcw6m3rc26LQfe2zo,1140
444
444
  rasa/dialogue_understanding/patterns/validate_slot.py,sha256=hqd5AEGT3M3HLNhMwuI9W9kZNCvgU6GyI-2xc2b4kz8,2085
445
445
  rasa/dialogue_understanding/processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
446
- rasa/dialogue_understanding/processor/command_processor.py,sha256=d9LRwNzV4Jqe_6DOvGITgElwqDZfz4JvvuUpPJ4ceZI,30296
446
+ rasa/dialogue_understanding/processor/command_processor.py,sha256=62iz_LBxw2HwkOPx-VWExZKOcGEeHfS_tbb203MxZBU,30470
447
447
  rasa/dialogue_understanding/processor/command_processor_component.py,sha256=rkErI_Uo7s3LsEojUSGSRbWGyGaX7GtGOYSJn0V-TI4,1650
448
448
  rasa/dialogue_understanding/stack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
449
449
  rasa/dialogue_understanding/stack/dialogue_stack.py,sha256=cYV6aQeh0EuOJHODDqK3biqXozYTX8baPgLwHhPxFqs,5244
@@ -637,7 +637,7 @@ rasa/privacy/event_broker_utils.py,sha256=K0ej9vRED5sJiG8YJq3_pynMRJEenCyKSjt6xO
637
637
  rasa/privacy/privacy_config.py,sha256=mctRStSliSUbbjHAl5ISTczJ2TgU7T5yjSfZvLmUtlI,9339
638
638
  rasa/privacy/privacy_config_schema.json,sha256=kQVJCrlKljJMkOCL3WDzquVS8V1-KE6_XMEyVSuUkJw,1835
639
639
  rasa/privacy/privacy_filter.py,sha256=s1LxnOeIoGh16vzTzxoM5vSDelk1P55Ay3bm0XRuINs,14988
640
- rasa/privacy/privacy_manager.py,sha256=6tK1cLfJDfk_XbFZZNq1a9ImhtDh1_l8RC2GWHWRMfw,22386
640
+ rasa/privacy/privacy_manager.py,sha256=IWbWIpJeX7EgHXPjYXPmq-5RaoJEnCFa5xKE7M2roTE,22593
641
641
  rasa/server.py,sha256=prH4FVO5kd7VKgSJnP_dt7PhXlW0vf8KWf62ccK8mlw,60505
642
642
  rasa/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
643
643
  rasa/shared/constants.py,sha256=pYMlsFE9kao5BUOXd-8cHWLV9jMfUop7Mfm57mBPcxc,12856
@@ -677,7 +677,7 @@ rasa/shared/core/policies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
677
677
  rasa/shared/core/policies/utils.py,sha256=rWE_-48Ovc__V7wOKCJ-2lTerVRtN3iRHV4ZvuU2b2g,3070
678
678
  rasa/shared/core/slot_mappings.py,sha256=afWxJsnAdHPzIxpHBBG1NbK4JBBWSsua3_xq87PKEZA,26663
679
679
  rasa/shared/core/slots.py,sha256=8ETIMYXWBRY_uOx9eUWm8vFiZaZpEVBjHzuwimaerJ8,29959
680
- rasa/shared/core/trackers.py,sha256=KRmahvRNa3M9q8MS-pv8wu8atzo__sh8uHhkSildSsA,45018
680
+ rasa/shared/core/trackers.py,sha256=LwePm-7-QySHHhCWzXkTnJgcLaqvyG0DwLhJ6EWG0NM,45583
681
681
  rasa/shared/core/training_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
682
682
  rasa/shared/core/training_data/loading.py,sha256=RCx1uTI9iDejFI_sWg3qPzhjln7-hu78f3EDAT6K0No,2894
683
683
  rasa/shared/core/training_data/story_reader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -798,7 +798,7 @@ rasa/studio/pull/pull.py,sha256=Qr-Ms4pXNS04hvdciZCfbeC1hag6v2puwhHwhcFpA8Q,7750
798
798
  rasa/studio/push.py,sha256=_EopU6RQnbQub33x0TVXOTWCYUfOQMDc6KdDNmltLMs,4279
799
799
  rasa/studio/results_logger.py,sha256=lwKROoQjzzJVnFoceLQ-z-5Hg35TfHo-8R4MDrMLYHY,5126
800
800
  rasa/studio/train.py,sha256=-UTPABXNWlnp3iIMKeslgprEtRQWcr8mF-Q7bacKxEw,4240
801
- rasa/studio/upload.py,sha256=sF_zXW4JCBoGMm9BrlAOIhutO1KjoqXMKmpEa9wwjIA,22607
801
+ rasa/studio/upload.py,sha256=Ssop8gTrBDj4JTrI35bdiKy7IWmUV_I3YXgXM-DIXSo,22648
802
802
  rasa/studio/utils.py,sha256=yiJtEv_CuI3uwVsWvKvcFH1ODZw37_aFNtCqaStwyP4,1109
803
803
  rasa/telemetry.py,sha256=2W1Tq1HMQm60o5oiy5DEGrIqSlpYMaJybY4DvCa6Gg8,69712
804
804
  rasa/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -846,9 +846,9 @@ rasa/utils/train_utils.py,sha256=ClJx-6x3-h3Vt6mskacgkcCUJTMXjFPe3zAcy_DfmaU,212
846
846
  rasa/utils/url_tools.py,sha256=dZ1HGkVdWTJB7zYEdwoDIrEuyX9HE5WsxKKFVsXBLE0,1218
847
847
  rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
848
848
  rasa/validator.py,sha256=JXi8bz3SsTB2c1tbDRY3r3TkcfSbhxacoxs-rVx6a9s,82937
849
- rasa/version.py,sha256=-KPJ9E-IAgMogu8pKWMj7VxcA8dbmX0UKuG-U9k-adc,120
850
- rasa_pro-3.13.0rc3.dist-info/METADATA,sha256=5yPX5oyvTOwfwvysDX16kfh7toEmYoM6KUZSJqJjckY,10556
851
- rasa_pro-3.13.0rc3.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
852
- rasa_pro-3.13.0rc3.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
853
- rasa_pro-3.13.0rc3.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
854
- rasa_pro-3.13.0rc3.dist-info/RECORD,,
849
+ rasa/version.py,sha256=iiXVaOtDUBvQbGdAbGWye0ZLm9Ie1orP7Jp3kgQO8rQ,117
850
+ rasa_pro-3.13.1.dist-info/METADATA,sha256=fneDi4y4nD2XzcjwKbULH6wIe5gBPhWNsWNJmx31vFI,10550
851
+ rasa_pro-3.13.1.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
852
+ rasa_pro-3.13.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
853
+ rasa_pro-3.13.1.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
854
+ rasa_pro-3.13.1.dist-info/RECORD,,