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

@@ -23,11 +23,9 @@ from rasa.core.constants import (
23
23
  KEY_IS_COEXISTENCE_ASSISTANT,
24
24
  UTTER_SOURCE_METADATA_KEY,
25
25
  )
26
- from rasa.core.nlg.translate import get_translated_buttons, get_translated_text
27
26
  from rasa.core.policies.policy import PolicyPrediction
28
27
  from rasa.core.utils import add_bot_utterance_metadata
29
28
  from rasa.e2e_test.constants import KEY_STUB_CUSTOM_ACTIONS
30
- from rasa.engine.language import Language
31
29
  from rasa.nlu.constants import (
32
30
  RESPONSE_SELECTOR_DEFAULT_INTENT,
33
31
  RESPONSE_SELECTOR_PREDICTION_KEY,
@@ -84,7 +82,6 @@ from rasa.shared.core.events import (
84
82
  UserUttered,
85
83
  )
86
84
  from rasa.shared.core.flows import FlowsList
87
- from rasa.shared.core.flows.constants import KEY_TRANSLATION
88
85
  from rasa.shared.core.slot_mappings import (
89
86
  SlotFillingManager,
90
87
  extract_slot_value,
@@ -251,36 +248,25 @@ def action_for_name_or_text(
251
248
  return RemoteAction(action_name_or_text, action_endpoint)
252
249
 
253
250
 
254
- def create_bot_utterance(
255
- message: Dict[Text, Any], language: Optional[Language] = None
256
- ) -> BotUttered:
257
- """Create BotUttered event from message with translation support."""
258
- message_copy = copy.deepcopy(message)
259
-
260
- text = get_translated_text(
261
- text=message_copy.pop(TEXT, None),
262
- translation=message_copy.pop(KEY_TRANSLATION, {}),
263
- language=language,
264
- )
265
-
266
- buttons = get_translated_buttons(
267
- buttons=message_copy.pop(BUTTONS, None), language=language
251
+ def create_bot_utterance(message: Dict[Text, Any]) -> BotUttered:
252
+ """Create BotUttered event from message."""
253
+ bot_message = BotUttered(
254
+ text=message.pop(TEXT, None),
255
+ data={
256
+ ELEMENTS: message.pop(ELEMENTS, None),
257
+ QUICK_REPLIES: message.pop(QUICK_REPLIES, None),
258
+ BUTTONS: message.pop(BUTTONS, None),
259
+ # for legacy / compatibility reasons we need to set the image
260
+ # to be the attachment if there is no other attachment (the
261
+ # `.get` is intentional - no `pop` as we still need the image`
262
+ # property to set it in the following line)
263
+ ATTACHMENT: message.pop(ATTACHMENT, None) or message.get(IMAGE, None),
264
+ IMAGE: message.pop(IMAGE, None),
265
+ CUSTOM: message.pop(CUSTOM, None),
266
+ },
267
+ metadata=message,
268
268
  )
269
-
270
- data = {
271
- ELEMENTS: message_copy.pop(ELEMENTS, None),
272
- QUICK_REPLIES: message_copy.pop(QUICK_REPLIES, None),
273
- BUTTONS: buttons,
274
- # for legacy / compatibility reasons we need to set the image
275
- # to be the attachment if there is no other attachment (the
276
- # `.get` is intentional - no `pop` as we still need the image`
277
- # property to set it in the following line)
278
- ATTACHMENT: message_copy.pop(ATTACHMENT, None) or message_copy.get(IMAGE, None),
279
- IMAGE: message_copy.pop(IMAGE, None),
280
- CUSTOM: message_copy.pop(CUSTOM, None),
281
- }
282
-
283
- return BotUttered(text=text, data=data, metadata=message_copy)
269
+ return bot_message
284
270
 
285
271
 
286
272
  class Action:
@@ -393,7 +379,7 @@ class ActionBotResponse(Action):
393
379
  message = add_bot_utterance_metadata(
394
380
  message, self.utter_action, nlg, domain, tracker
395
381
  )
396
- return [create_bot_utterance(message, tracker.current_language)]
382
+ return [create_bot_utterance(message)]
397
383
 
398
384
  def name(self) -> Text:
399
385
  """Returns action name."""
@@ -427,7 +413,7 @@ class ActionEndToEndResponse(Action):
427
413
  ) -> List[Event]:
428
414
  """Runs action (see parent class for full docstring)."""
429
415
  message = {"text": self.action_text}
430
- return [create_bot_utterance(message, tracker.current_language)]
416
+ return [create_bot_utterance(message)]
431
417
 
432
418
  def event_for_successful_execution(
433
419
  self,
@@ -893,7 +879,10 @@ class RemoteAction(Action):
893
879
  generated_response = response.pop("response", None)
894
880
  if generated_response is not None:
895
881
  draft = await nlg.generate(
896
- generated_response, tracker, output_channel.name(), **response
882
+ generated_response,
883
+ tracker,
884
+ output_channel.name(),
885
+ **response,
897
886
  )
898
887
  if not draft:
899
888
  continue
@@ -910,8 +899,8 @@ class RemoteAction(Action):
910
899
 
911
900
  # Avoid overwriting `draft` values with empty values
912
901
  response = {k: v for k, v in response.items() if v}
913
- response.update(draft)
914
- bot_messages.append(create_bot_utterance(response))
902
+ draft.update(response)
903
+ bot_messages.append(create_bot_utterance(draft))
915
904
 
916
905
  return bot_messages
917
906
 
@@ -1068,6 +1057,7 @@ def _revert_rephrasing_events() -> List[Event]:
1068
1057
  ]
1069
1058
 
1070
1059
 
1060
+ # TODO: this should be removed, e.g. it uses a hardcoded message and no translation
1071
1061
  class ActionDefaultAskAffirmation(Action):
1072
1062
  """Default implementation which asks the user to affirm his intent.
1073
1063
 
@@ -1119,7 +1109,7 @@ class ActionDefaultAskAffirmation(Action):
1119
1109
  "utter_action": self.name(),
1120
1110
  }
1121
1111
 
1122
- return [create_bot_utterance(message, tracker.current_language)]
1112
+ return [create_bot_utterance(message)]
1123
1113
 
1124
1114
 
1125
1115
  class ActionDefaultAskRephrase(ActionBotResponse):
@@ -1155,7 +1145,7 @@ class ActionSendText(Action):
1155
1145
 
1156
1146
  should_send_text = metadata_copy.get("should_send_text", True)
1157
1147
  if should_send_text:
1158
- return [create_bot_utterance(message, tracker.current_language)]
1148
+ return [create_bot_utterance(message)]
1159
1149
  return []
1160
1150
 
1161
1151
 
@@ -216,6 +216,6 @@ class ActionRunSlotRejections(Action):
216
216
  message = add_bot_utterance_metadata(
217
217
  message, utterance, nlg, domain, tracker
218
218
  )
219
- events.append(create_bot_utterance(message, tracker.current_language))
219
+ events.append(create_bot_utterance(message))
220
220
 
221
221
  return events
@@ -32,6 +32,7 @@ from rasa.core.channels.voice_stream.voice_channel import (
32
32
  VoiceInputChannel,
33
33
  VoiceOutputChannel,
34
34
  )
35
+ from rasa.core.exceptions import AgentNotReady
35
36
  from rasa.hooks import hookimpl
36
37
  from rasa.plugin import plugin_manager
37
38
  from rasa.shared.core.constants import ACTION_LISTEN_NAME
@@ -199,6 +200,13 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
199
200
  metadata_key=credentials.get("metadata_key", "metadata"),
200
201
  )
201
202
 
203
+ async def emit(self, event: str, data: Dict, room: str) -> None:
204
+ """Emits an event to the websocket."""
205
+ if not self.sio:
206
+ structlogger.error("studio_chat.emit.sio_not_initialized")
207
+ return
208
+ await self.sio.emit(event, data, room=room)
209
+
202
210
  def _register_tracker_update_hook(self) -> None:
203
211
  plugin_manager().register(StudioTrackerUpdatePlugin(self))
204
212
 
@@ -208,10 +216,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
208
216
 
209
217
  async def publish_tracker_update(self, sender_id: str, tracker_dump: Dict) -> None:
210
218
  """Publishes a tracker update notification to the websocket."""
211
- if not self.sio:
212
- structlogger.error("studio_chat.on_tracker_updated.sio_not_initialized")
213
- return
214
- await self.sio.emit("tracker", tracker_dump, room=sender_id)
219
+ await self.emit("tracker", tracker_dump, room=sender_id)
215
220
 
216
221
  async def on_message_proxy(
217
222
  self,
@@ -224,8 +229,15 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
224
229
  """
225
230
  await on_new_message(message)
226
231
 
227
- if not self.agent:
232
+ if not self.agent or not self.agent.is_ready():
228
233
  structlogger.error("studio_chat.on_message_proxy.agent_not_initialized")
234
+ await self.emit_error(
235
+ "The Rasa Pro model could not be loaded. "
236
+ "Please check the training and deployment logs "
237
+ "for more information.",
238
+ message.sender_id,
239
+ AgentNotReady("The Rasa Pro model could not be loaded."),
240
+ )
229
241
  return
230
242
 
231
243
  tracker = await self.agent.tracker_store.retrieve(message.sender_id)
@@ -235,6 +247,17 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
235
247
 
236
248
  await self.on_tracker_updated(tracker)
237
249
 
250
+ async def emit_error(self, message: str, room: str, e: Exception) -> None:
251
+ await self.emit(
252
+ "error",
253
+ {
254
+ "message": message,
255
+ "error": str(e),
256
+ "exception": str(type(e).__name__),
257
+ },
258
+ room=room,
259
+ )
260
+
238
261
  async def handle_tracker_update(self, sid: str, data: Dict) -> None:
239
262
  from rasa.shared.core.trackers import DialogueStateTracker
240
263
 
@@ -251,21 +274,41 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
251
274
  structlogger.error("studio_chat.sio.domain_not_initialized")
252
275
  return None
253
276
 
254
- async with self.agent.lock_store.lock(data["sender_id"]):
255
- tracker = DialogueStateTracker.from_dict(
256
- data["sender_id"], data["events"], domain.slots
257
- )
258
-
259
- # will override an existing tracker with the same id!
260
- await self.agent.tracker_store.save(tracker)
277
+ tracker: Optional[DialogueStateTracker] = None
261
278
 
262
- processor = self.agent.processor
263
- if processor and does_need_action_prediction(tracker):
264
- output_channel = self.get_output_channel()
279
+ async with self.agent.lock_store.lock(data["sender_id"]):
280
+ try:
281
+ tracker = DialogueStateTracker.from_dict(
282
+ data["sender_id"], data["events"], domain.slots
283
+ )
265
284
 
266
- await processor._run_prediction_loop(output_channel, tracker)
285
+ # will override an existing tracker with the same id!
267
286
  await self.agent.tracker_store.save(tracker)
268
287
 
288
+ processor = self.agent.processor
289
+ if processor and does_need_action_prediction(tracker):
290
+ output_channel = self.get_output_channel()
291
+
292
+ await processor._run_prediction_loop(output_channel, tracker)
293
+ await self.agent.tracker_store.save(tracker)
294
+ except Exception as e:
295
+ structlogger.error(
296
+ "studio_chat.sio.handle_tracker_update.error",
297
+ error=e,
298
+ sender_id=data["sender_id"],
299
+ )
300
+ await self.emit_error(
301
+ "An error occurred while updating the conversation.",
302
+ data["sender_id"],
303
+ e,
304
+ )
305
+
306
+ if not tracker:
307
+ # in case the tracker couldn't be updated, we retrieve the prior
308
+ # version and use that to populate the update
309
+ tracker = await self.agent.tracker_store.get_or_create_tracker(
310
+ data["sender_id"]
311
+ )
269
312
  await self.on_tracker_updated(tracker)
270
313
 
271
314
  def channel_bytes_to_rasa_audio_bytes(self, input_bytes: bytes) -> RasaAudioBytes:
@@ -275,7 +318,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
275
318
  async def collect_call_parameters(
276
319
  self, channel_websocket: "Websocket"
277
320
  ) -> Optional[CallParameters]:
278
- """Voice method to collect call parameters"""
321
+ """Voice method to collect call parameters."""
279
322
  session_id = channel_websocket.session_id
280
323
  return CallParameters(session_id, "local", "local", stream_id=session_id)
281
324
 
@@ -305,7 +348,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
305
348
  def create_output_channel(
306
349
  self, voice_websocket: "Websocket", tts_engine: TTSEngine
307
350
  ) -> VoiceOutputChannel:
308
- """Create a voice output channel"""
351
+ """Create a voice output channel."""
309
352
  return StudioVoiceOutputChannel(
310
353
  voice_websocket,
311
354
  tts_engine,
@@ -225,8 +225,10 @@ class ContextualResponseRephraser(
225
225
 
226
226
  @measure_llm_latency
227
227
  async def _generate_llm_response(self, prompt: str) -> Optional[LLMResponse]:
228
- """Use LLM to generate a response, returning an LLMResponse object
229
- containing both the generated text (choices) and metadata.
228
+ """Use LLM to generate a response.
229
+
230
+ Returns an LLMResponse object containing both the generated text
231
+ (choices) and metadata.
230
232
 
231
233
  Args:
232
234
  prompt: The prompt to send to the LLM.
@@ -412,12 +414,9 @@ class ContextualResponseRephraser(
412
414
  Returns:
413
415
  The generated response.
414
416
  """
415
- filled_slots = tracker.current_slot_values()
416
- stack_context = tracker.stack.current_context()
417
- templated_response = self.generate_from_slots(
417
+ templated_response = await super().generate(
418
418
  utter_action=utter_action,
419
- filled_slots=filled_slots,
420
- stack_context=stack_context,
419
+ tracker=tracker,
421
420
  output_channel=output_channel,
422
421
  **kwargs,
423
422
  )
@@ -6,6 +6,8 @@ from pypred import Predicate
6
6
 
7
7
  import rasa.shared.utils.common
8
8
  import rasa.shared.utils.io
9
+ from rasa.core.nlg.translate import has_translation
10
+ from rasa.engine.language import Language
9
11
  from rasa.shared.constants import CHANNEL, RESPONSE_CONDITION
10
12
  from rasa.shared.core.domain import Domain
11
13
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -131,11 +133,23 @@ class ResponseVariationFilter:
131
133
 
132
134
  return True
133
135
 
136
+ def _filter_by_language(
137
+ self, responses: List[Dict[Text, Any]], language: Optional[Language] = None
138
+ ) -> List[Dict[Text, Any]]:
139
+ if not language:
140
+ return responses
141
+
142
+ if filtered := [r for r in responses if has_translation(r, language)]:
143
+ return filtered
144
+ # if no translation is found, return the original response variations
145
+ return responses
146
+
134
147
  def responses_for_utter_action(
135
148
  self,
136
149
  utter_action: Text,
137
150
  output_channel: Text,
138
151
  filled_slots: Dict[Text, Any],
152
+ language: Optional[Language] = None,
139
153
  ) -> List[Dict[Text, Any]]:
140
154
  """Returns array of responses that fit the channel, action and condition."""
141
155
  # filter responses without a condition
@@ -176,16 +190,16 @@ class ResponseVariationFilter:
176
190
  )
177
191
 
178
192
  if conditional_channel:
179
- return conditional_channel
193
+ return self._filter_by_language(conditional_channel, language)
180
194
 
181
195
  if default_channel:
182
- return default_channel
196
+ return self._filter_by_language(default_channel, language)
183
197
 
184
198
  if conditional_no_channel:
185
- return conditional_no_channel
199
+ return self._filter_by_language(conditional_no_channel, language)
186
200
 
187
201
  if default_no_channel:
188
- return default_no_channel
202
+ return self._filter_by_language(default_no_channel, language)
189
203
 
190
204
  # if there is no response variation selected,
191
205
  # return the internal error response to prevent
@@ -198,7 +212,9 @@ class ResponseVariationFilter:
198
212
  f"a default variation and that all the conditions are valid. "
199
213
  f"Returning the internal error response.",
200
214
  )
201
- return self.responses.get("utter_internal_error_rasa", [])
215
+ return self._filter_by_language(
216
+ self.responses.get("utter_internal_error_rasa", []), language
217
+ )
202
218
 
203
219
  def get_response_variation_id(
204
220
  self,
rasa/core/nlg/response.py CHANGED
@@ -5,8 +5,11 @@ from typing import Any, Dict, List, Optional, Text
5
5
  from rasa.core.constants import DEFAULT_TEMPLATE_ENGINE, TEMPLATE_ENGINE_CONFIG_KEY
6
6
  from rasa.core.nlg import interpolator
7
7
  from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
8
- from rasa.shared.constants import RESPONSE_CONDITION
8
+ from rasa.core.nlg.translate import get_translated_buttons, get_translated_text
9
+ from rasa.engine.language import Language
10
+ from rasa.shared.constants import BUTTONS, RESPONSE_CONDITION, TEXT
9
11
  from rasa.shared.core.domain import RESPONSE_KEYS_TO_INTERPOLATE
12
+ from rasa.shared.core.flows.constants import KEY_TRANSLATION
10
13
  from rasa.shared.core.trackers import DialogueStateTracker
11
14
  from rasa.shared.nlu.constants import METADATA
12
15
 
@@ -30,7 +33,11 @@ class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
30
33
 
31
34
  # noinspection PyUnusedLocal
32
35
  def _random_response_for(
33
- self, utter_action: Text, output_channel: Text, filled_slots: Dict[Text, Any]
36
+ self,
37
+ utter_action: Text,
38
+ output_channel: Text,
39
+ filled_slots: Dict[Text, Any],
40
+ language: Optional[Language] = None,
34
41
  ) -> Optional[Dict[Text, Any]]:
35
42
  """Select random response for the utter action from available ones.
36
43
 
@@ -42,7 +49,7 @@ class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
42
49
  if utter_action in self.responses:
43
50
  response_filter = ResponseVariationFilter(self.responses)
44
51
  suitable_responses = response_filter.responses_for_utter_action(
45
- utter_action, output_channel, filled_slots
52
+ utter_action, output_channel, filled_slots, language
46
53
  )
47
54
 
48
55
  if suitable_responses:
@@ -75,9 +82,36 @@ class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
75
82
  """Generate a response for the requested utter action."""
76
83
  filled_slots = tracker.current_slot_values()
77
84
  stack_context = tracker.stack.current_context()
78
- return self.generate_from_slots(
79
- utter_action, filled_slots, stack_context, output_channel, **kwargs
85
+ response = self.generate_from_slots(
86
+ utter_action,
87
+ filled_slots,
88
+ stack_context,
89
+ output_channel,
90
+ tracker.current_language,
91
+ **kwargs,
80
92
  )
93
+ if response is not None:
94
+ return self.translate_response(response, tracker.current_language)
95
+ return None
96
+
97
+ def translate_response(
98
+ self, response: Dict[Text, Any], language: Optional[Language] = None
99
+ ) -> Dict[Text, Any]:
100
+ message_copy = copy.deepcopy(response)
101
+
102
+ text = get_translated_text(
103
+ text=message_copy.pop(TEXT, None),
104
+ translation=message_copy.pop(KEY_TRANSLATION, {}),
105
+ language=language,
106
+ )
107
+
108
+ buttons = get_translated_buttons(
109
+ buttons=message_copy.pop(BUTTONS, None), language=language
110
+ )
111
+ message_copy[TEXT] = text
112
+ if buttons:
113
+ message_copy[BUTTONS] = buttons
114
+ return message_copy
81
115
 
82
116
  def generate_from_slots(
83
117
  self,
@@ -85,12 +119,15 @@ class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
85
119
  filled_slots: Dict[Text, Any],
86
120
  stack_context: Dict[Text, Any],
87
121
  output_channel: Text,
122
+ language: Optional[Language] = None,
88
123
  **kwargs: Any,
89
124
  ) -> Optional[Dict[Text, Any]]:
90
125
  """Generate a response for the requested utter action."""
91
126
  # Fetching a random response for the passed utter action
92
127
  r = copy.deepcopy(
93
- self._random_response_for(utter_action, output_channel, filled_slots)
128
+ self._random_response_for(
129
+ utter_action, output_channel, filled_slots, language
130
+ )
94
131
  )
95
132
  # Filling the slots in the response with placeholders and returning the response
96
133
  if r is not None:
@@ -23,6 +23,14 @@ def get_translated_text(
23
23
  return translation.get(language_code, text)
24
24
 
25
25
 
26
+ def has_translation(
27
+ message: Dict[Text, Any], language: Optional[Language] = None
28
+ ) -> bool:
29
+ """Check if the message has a translation for the given language."""
30
+ language_code = language.code if language else None
31
+ return language_code in message.get(KEY_TRANSLATION, {})
32
+
33
+
26
34
  def get_translated_buttons(
27
35
  buttons: Optional[List[Dict[Text, Any]]], language: Optional[Language] = None
28
36
  ) -> Optional[List[Dict[Text, Any]]]:
@@ -5,12 +5,12 @@ mapping:
5
5
  sequence:
6
6
  - type: map
7
7
  mapping:
8
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
8
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
9
9
  type: "seq"
10
10
  sequence:
11
11
  - type: map
12
12
  mapping:
13
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
13
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
14
14
  type: any
15
15
 
16
16
  metadata:
@@ -129,7 +129,7 @@ mapping:
129
129
  type: "seq"
130
130
  sequence:
131
131
  - type: "str"
132
- pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
132
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_\-]*$
133
133
  metadata:
134
134
  type: "str"
135
135
  pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
@@ -5,12 +5,12 @@ mapping:
5
5
  sequence:
6
6
  - type: map
7
7
  mapping:
8
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
8
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
9
9
  type: "seq"
10
10
  sequence:
11
11
  - type: map
12
12
  mapping:
13
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
13
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
14
14
  type: any
15
15
 
16
16
  metadata:
@@ -129,7 +129,7 @@ mapping:
129
129
  type: "seq"
130
130
  sequence:
131
131
  - type: "str"
132
- pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
132
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_\-]*$
133
133
  metadata:
134
134
  type: "str"
135
135
  pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
@@ -571,7 +571,7 @@ def external_blueprint() -> Blueprint:
571
571
  """Create a blueprint for the model manager API."""
572
572
  from rasa.core.channels.socketio import SocketBlueprint
573
573
 
574
- sio = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
574
+ sio = AsyncServer(async_mode="sanic", cors_allowed_origins="*")
575
575
  bp = SocketBlueprint(sio, "", "model_api_external")
576
576
 
577
577
  create_bridge_server(sio, running_bots)
@@ -131,6 +131,13 @@ async def create_bridge_client(
131
131
  structlogger.debug("model_runner.bot_message", deployment_id=deployment_id)
132
132
  await sio.emit("bot_message", data, room=sid)
133
133
 
134
+ @client.event # type: ignore[misc]
135
+ async def error(data: Dict[str, Any]) -> None:
136
+ structlogger.debug(
137
+ "model_runner.bot_error", deployment_id=deployment_id, data=data
138
+ )
139
+ await sio.emit("error", data, room=sid)
140
+
134
141
  @client.event # type: ignore[misc]
135
142
  async def tracker(data: Dict[str, Any]) -> None:
136
143
  await sio.emit("tracker", json.loads(data), room=sid)
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.10"
3
+ __version__ = "3.13.11"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rasa-pro
3
- Version: 3.13.10
3
+ Version: 3.13.11
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
@@ -79,12 +79,12 @@ rasa/cli/x.py,sha256=T10e6bVUx5BadZOt3JJ4T5EByiR5jJ2hv5ExXOnt9F8,6839
79
79
  rasa/constants.py,sha256=ddT6MLksS96Jeav0waBMu3Z5yocBPgC695-IYE9EbXM,1389
80
80
  rasa/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  rasa/core/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- rasa/core/actions/action.py,sha256=6rNo2TziSPsF08bd39EnDD7vefic6JxQu5CK-lBt2iI,43232
82
+ rasa/core/actions/action.py,sha256=Sedj_SSKgMsPgtIENeGWSpTZ6WOwdgVpT4kwRe8usKk,42787
83
83
  rasa/core/actions/action_clean_stack.py,sha256=xUP-2ipPsPAnAiwP17c-ezmHPSrV4JSUZr-eSgPQwIs,2279
84
84
  rasa/core/actions/action_exceptions.py,sha256=hghzXYN6VeHC-O_O7WiPesCNV86ZTkHgG90ZnQcbai8,724
85
85
  rasa/core/actions/action_hangup.py,sha256=o5iklHG-F9IcRgWis5C6AumVXznxzAV3o9zdduhozEM,994
86
86
  rasa/core/actions/action_repeat_bot_messages.py,sha256=T7bJH0fsxFQgbkCZZ5dnPi8v18-2X9QZZLfAHmmn7WI,3466
87
- rasa/core/actions/action_run_slot_rejections.py,sha256=4Mx6_7IHRfr97MucyuPclsG7HXzvA9dVYgmovRK0ZMc,7239
87
+ rasa/core/actions/action_run_slot_rejections.py,sha256=RSSsPRf67kcybMdMUTd55vJt5TNTAN0OZxEqn3L1zhk,7213
88
88
  rasa/core/actions/action_trigger_chitchat.py,sha256=krOPqCXBihxOskqmm05A4mFEm4lj4ohvzuddy7rELVQ,1084
89
89
  rasa/core/actions/action_trigger_flow.py,sha256=IydYAGafTtoY6XSgCX124xJQhzudUg8JAICstqsV3VA,3487
90
90
  rasa/core/actions/action_trigger_search.py,sha256=QfYqnaGRCqRYJ4msYsLAbnVYW5ija_tqhCcKIN8aEfw,1064
@@ -253,7 +253,7 @@ rasa/core/channels/rest.py,sha256=LWBYBdVzOz5Vv5tZCkB1QA7LxXJFTeC87CQLAi_ZGeI,73
253
253
  rasa/core/channels/rocketchat.py,sha256=hajaH6549CjEYFM5jSapw1DQKBPKTXbn7cVSuZzknmI,5999
254
254
  rasa/core/channels/slack.py,sha256=jVsTTUu9wUjukPoIsAhbee9o0QFUMCNlQHbR8LTcMBc,24406
255
255
  rasa/core/channels/socketio.py,sha256=ZEavmx2on9AH73cuIFSGMKn1LHJhzcQVaqrFz7SH-CE,11348
256
- rasa/core/channels/studio_chat.py,sha256=02zPjN54hrOxfB9YCPzMPoSF30Kzml817l_hSFWr3bc,19204
256
+ rasa/core/channels/studio_chat.py,sha256=9UGWnOYITsahC3OV2ge8kJYrzXxLnF2TqY6VjTSqxyM,20888
257
257
  rasa/core/channels/telegram.py,sha256=TKVknsk3U9tYeY1a8bzlhqkltWmZfGSOvrcmwa9qozc,12499
258
258
  rasa/core/channels/twilio.py,sha256=2BTQpyx0b0yPpc0A2BHYfxLPgodrLGLs8nq6i3lVGAM,5906
259
259
  rasa/core/channels/vier_cvg.py,sha256=5O4yx0TDQIMppvlCxTOzmPB60CA-vqQXqWQ7upfrTO0,13496
@@ -311,12 +311,12 @@ rasa/core/lock_store.py,sha256=wP_0S5bBNI0cnRPVOcGNZgD8usdzw4udT4ncP6CKy14,15443
311
311
  rasa/core/migrate.py,sha256=h1dOpXxmVmZlbLVGy1yOU_Obp2KzRiOiL0iuEacA0Cg,14618
312
312
  rasa/core/nlg/__init__.py,sha256=jZuQAhOUcxO-KqqHGqICHSY3oDeXlUiGr2trQDYfG6o,240
313
313
  rasa/core/nlg/callback.py,sha256=lxBBZdjXHS54fn_pH_YUW8ApbFOBO-kYSY5bL4gR1p0,5218
314
- rasa/core/nlg/contextual_response_rephraser.py,sha256=MIoavmpIrILacaW_qRuWkc-WOflL6yCWuBNl3UCAolE,15202
315
- rasa/core/nlg/generator.py,sha256=P3JvT4qO3XHLDRb0DVstZ4MmLLA-d4LZt3BbD3S9yO8,10864
314
+ rasa/core/nlg/contextual_response_rephraser.py,sha256=3sawFeW2zh4N6byhmzUDba9-JUY7z_l8qO7gUJ0QCSg,15047
315
+ rasa/core/nlg/generator.py,sha256=VsaxPjKgErVABiQLa9ps7fc4qwubtdYoue96ZshBnl4,11616
316
316
  rasa/core/nlg/interpolator.py,sha256=vI2ZyeKHkHESPScCbefrcRrY6mrClI0LNwvZ1GvS5Tk,5138
317
- rasa/core/nlg/response.py,sha256=kfBSFnQni0lDZlGpZEVRjuQvil7G1JMjS4xIdd3AKhs,6045
317
+ rasa/core/nlg/response.py,sha256=SecKyoBQjEnZr4t-Gg5fkUpkozwGT2lzswIKgD63Dac,7248
318
318
  rasa/core/nlg/summarize.py,sha256=ZlWj7DyJSTF0SRBv73kMWS8wkPmsZgX8woZiJFkgP-c,3195
319
- rasa/core/nlg/translate.py,sha256=PBMTbIgdkhx8rhzqv6h0u5r9jqdfiVIh7u0qb363sJA,1822
319
+ rasa/core/nlg/translate.py,sha256=ZXRvysqXGdtHBJ7x3YkW6zfmnb9DuEGHCMTL41v-M8M,2112
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
@@ -464,7 +464,7 @@ rasa/dialogue_understanding_test/constants.py,sha256=G63FEzswDUOonTxoXQicEJwI6IC
464
464
  rasa/dialogue_understanding_test/du_test_case.py,sha256=4Z5Ei21OdqN2MEHEKz-NGzzv0zuPwUkOjzNjEWQhnVA,17038
465
465
  rasa/dialogue_understanding_test/du_test_result.py,sha256=y9U_w_5aV8bGppmUHWgbNZG-9-TQGOm2xO0w38e1eUo,19457
466
466
  rasa/dialogue_understanding_test/du_test_runner.py,sha256=WYxtuilwX8MKVHiczWAMBLAovicxDdpR5lNmd7cs2lc,11478
467
- rasa/dialogue_understanding_test/du_test_schema.yml,sha256=zgIhb6PE8LnoigVmv4NbU3cjSsr2SkGoO-5Xh4Et9KA,4767
467
+ rasa/dialogue_understanding_test/du_test_schema.yml,sha256=nxezEXfnoc-oVZXDqHRg-Yk4fkDF3t2VatRRMdSSE2o,4773
468
468
  rasa/dialogue_understanding_test/io.py,sha256=doMboRm9G6KaxmfsOYhsa2iz8zghh4bLMa3XTIV6DC0,16250
469
469
  rasa/dialogue_understanding_test/test_case_simulation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
470
470
  rasa/dialogue_understanding_test/test_case_simulation/exception.py,sha256=RJV8CfoGKmfpC3d28y7IBKfmcAZSm2Vs6p0GkiCHlcc,1034
@@ -484,7 +484,7 @@ rasa/e2e_test/e2e_test_converter_prompt.jinja2,sha256=EMy-aCd7jLARHmwAuZUGT5ABnN
484
484
  rasa/e2e_test/e2e_test_coverage_report.py,sha256=UGQ3np2p_gtnhl17K5y886STiX9xBn95GVuN9LGIpGY,11344
485
485
  rasa/e2e_test/e2e_test_result.py,sha256=qVurjFC4cAWIY7rOsc-A-4nIdcnnw98TaK86-bDwI7Y,1649
486
486
  rasa/e2e_test/e2e_test_runner.py,sha256=nNEKGopReHKYPSvhG4VRhc5wK53RsO9t3emHUqBDrcA,47979
487
- rasa/e2e_test/e2e_test_schema.yml,sha256=0deWjuKRHNo6e_LSCnUoiw9NLIYf6dj1-zFPl_AqLYA,5632
487
+ rasa/e2e_test/e2e_test_schema.yml,sha256=0WG0I3baTRc76lff3UjQ8vGRzMUoV6qcE8r9adOAlCU,5638
488
488
  rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2,sha256=6Ddszg4Y6sIvhH7C1jjEAArpzke48mfCOa2KUQYbNVA,2725
489
489
  rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2,sha256=jCgDbZvWn5fncr4zvB5UQSK1VJu9xDQtpY4B8GKtlmA,8226
490
490
  rasa/e2e_test/pykwalify_extensions.py,sha256=OGYKIKYJXd2S0NrWknoQuijyBQaE-oMLkfV_eMRkGSM,1331
@@ -562,9 +562,9 @@ rasa/markers/validate.py,sha256=dZvMTcDK_sji9OP8JY4kUcjeIScLF93C3CKTWK8DplI,708
562
562
  rasa/model.py,sha256=cAbQXvfZXBKHAj79Z0-mCy29hSSWp2KaroScgDeTfJw,3489
563
563
  rasa/model_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
564
564
  rasa/model_manager/config.py,sha256=8upZP4CokMBy0imiiPvINJuLW4JOQ326dPiJ041jJUI,1231
565
- rasa/model_manager/model_api.py,sha256=g8zeqHIaFFUyqyb9Y1lmSkCOlWAiLFvFM54EjwuOnZg,23854
565
+ rasa/model_manager/model_api.py,sha256=uY8gC4xSwb7OxnMU0hcT5fx6bGgoTURA3r6bhpxNJdk,23855
566
566
  rasa/model_manager/runner_service.py,sha256=CfvkmCqk-syCqTxb4u3N44WvzXuWFlpomR9SvgzIFKs,9514
567
- rasa/model_manager/socket_bridge.py,sha256=wvoWqNwEEIM9sJEtdC_2AzFkMpkAG0CZpf6MA0NZ-2E,5299
567
+ rasa/model_manager/socket_bridge.py,sha256=luU0EzzuM77jthUZUWobW2dMocz-TM_DGrfUSUTqozk,5554
568
568
  rasa/model_manager/studio_jwt_auth.py,sha256=uls2QiHUlUrR3fOzZssW4UaAMJMfnPMZeV1aDmZIT0E,2645
569
569
  rasa/model_manager/trainer_service.py,sha256=aw3tp2736fILT5bYunkERPcWR5TjjyhThBXIktJfhqU,10628
570
570
  rasa/model_manager/utils.py,sha256=rS0ST-rJMuZOna90r_Ioz7gOkZ8r8vm4XAhzI0iUZOA,2643
@@ -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=fhRlHQvuBkiup0FnNYmwRmqQwC3QpdCJt0TuvW4jMaI,83125
849
- rasa/version.py,sha256=WRK6GACO6AlXaiHTxVjAWo1wLqHGJ6Dzw1dGJLacmYU,118
850
- rasa_pro-3.13.10.dist-info/METADATA,sha256=Ti8gWcTC_Afu5BhHWzQ6KbPB8yI_7IGZUX6XRZXn8bM,10551
851
- rasa_pro-3.13.10.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
852
- rasa_pro-3.13.10.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
853
- rasa_pro-3.13.10.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
854
- rasa_pro-3.13.10.dist-info/RECORD,,
849
+ rasa/version.py,sha256=Jzj7EnZb3wsuxW8HdqrnCnuZtLvC2rhZaQzbe_WVA-Y,118
850
+ rasa_pro-3.13.11.dist-info/METADATA,sha256=Fott0Gi1RETKy7isFGu91-sV_THQlBxv3un2fd3Bxyg,10551
851
+ rasa_pro-3.13.11.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
852
+ rasa_pro-3.13.11.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
853
+ rasa_pro-3.13.11.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
854
+ rasa_pro-3.13.11.dist-info/RECORD,,