rasa-pro 3.10.19__py3-none-any.whl → 3.10.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.
- rasa/cli/run.py +10 -6
- rasa/cli/utils.py +7 -0
- rasa/core/channels/channel.py +104 -10
- rasa/core/channels/twilio_voice.py +57 -6
- rasa/e2e_test/utils/validation.py +3 -3
- rasa/version.py +1 -1
- {rasa_pro-3.10.19.dist-info → rasa_pro-3.10.20.dist-info}/METADATA +3 -3
- {rasa_pro-3.10.19.dist-info → rasa_pro-3.10.20.dist-info}/RECORD +11 -11
- {rasa_pro-3.10.19.dist-info → rasa_pro-3.10.20.dist-info}/NOTICE +0 -0
- {rasa_pro-3.10.19.dist-info → rasa_pro-3.10.20.dist-info}/WHEEL +0 -0
- {rasa_pro-3.10.19.dist-info → rasa_pro-3.10.20.dist-info}/entry_points.txt +0 -0
rasa/cli/run.py
CHANGED
|
@@ -62,12 +62,16 @@ def run_actions(args: argparse.Namespace) -> None:
|
|
|
62
62
|
|
|
63
63
|
def _validate_model_path(model_path: Text, parameter: Text, default: Text) -> Text:
|
|
64
64
|
if model_path is not None and not os.path.exists(model_path):
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
raise ModelNotFound(
|
|
66
|
+
f"The provided model path '{model_path}' could not be found. "
|
|
67
|
+
"Provide an existing model path."
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
if model_path is None:
|
|
71
|
+
logger.debug(
|
|
72
|
+
f"Parameter '{parameter}' not set. "
|
|
73
|
+
"Using default location '{default}' instead."
|
|
74
|
+
)
|
|
71
75
|
os.makedirs(default, exist_ok=True)
|
|
72
76
|
model_path = default
|
|
73
77
|
|
rasa/cli/utils.py
CHANGED
|
@@ -14,6 +14,7 @@ import structlog
|
|
|
14
14
|
import rasa.shared.utils.cli
|
|
15
15
|
import rasa.shared.utils.io
|
|
16
16
|
from rasa import telemetry
|
|
17
|
+
from rasa.exceptions import ModelNotFound
|
|
17
18
|
from rasa.shared.constants import (
|
|
18
19
|
ASSISTANT_ID_DEFAULT_VALUE,
|
|
19
20
|
ASSISTANT_ID_KEY,
|
|
@@ -76,6 +77,12 @@ def get_validated_path(
|
|
|
76
77
|
if current and os.path.exists(current):
|
|
77
78
|
return current
|
|
78
79
|
|
|
80
|
+
if parameter == "model":
|
|
81
|
+
raise ModelNotFound(
|
|
82
|
+
f"The provided model path '{current}' could not be found. "
|
|
83
|
+
"Provide an existing model path."
|
|
84
|
+
)
|
|
85
|
+
|
|
79
86
|
# try to find a valid option among the defaults
|
|
80
87
|
if isinstance(default, str) or isinstance(default, Path):
|
|
81
88
|
default_options = [str(default)]
|
rasa/core/channels/channel.py
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hmac
|
|
1
4
|
import json
|
|
2
5
|
import logging
|
|
3
6
|
import uuid
|
|
4
|
-
import
|
|
5
|
-
from
|
|
6
|
-
from sanic.request import Request
|
|
7
|
+
from base64 import b64encode
|
|
8
|
+
from functools import wraps
|
|
7
9
|
from typing import (
|
|
8
|
-
Text,
|
|
9
|
-
List,
|
|
10
|
-
Dict,
|
|
11
10
|
Any,
|
|
12
|
-
|
|
11
|
+
Awaitable,
|
|
13
12
|
Callable,
|
|
13
|
+
Dict,
|
|
14
14
|
Iterable,
|
|
15
|
-
|
|
15
|
+
List,
|
|
16
16
|
NoReturn,
|
|
17
|
+
Optional,
|
|
18
|
+
Text,
|
|
17
19
|
)
|
|
18
20
|
|
|
21
|
+
import jwt
|
|
22
|
+
from sanic import Blueprint, Sanic
|
|
23
|
+
from sanic.exceptions import Unauthorized
|
|
24
|
+
from sanic.request import Request
|
|
25
|
+
|
|
19
26
|
from rasa.cli import utils as cli_utils
|
|
20
|
-
from rasa.shared.constants import DOCS_BASE_URL, DEFAULT_SENDER_ID
|
|
21
27
|
from rasa.core.constants import BEARER_TOKEN_PREFIX
|
|
22
|
-
from rasa.shared.
|
|
28
|
+
from rasa.shared.constants import DEFAULT_SENDER_ID, DOCS_BASE_URL
|
|
23
29
|
from rasa.shared.core.trackers import (
|
|
24
30
|
DialogueStateTracker,
|
|
25
31
|
EventVerbosity,
|
|
26
32
|
)
|
|
33
|
+
from rasa.shared.exceptions import RasaException
|
|
27
34
|
|
|
28
35
|
try:
|
|
29
36
|
from urlparse import urljoin
|
|
@@ -417,3 +424,90 @@ class CollectingOutputChannel(OutputChannel):
|
|
|
417
424
|
self, recipient_id: Text, json_message: Dict[Text, Any], **kwargs: Any
|
|
418
425
|
) -> None:
|
|
419
426
|
await self._persist_message(self._message(recipient_id, custom=json_message))
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
BASIC_AUTH_SCHEME = "Basic"
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
def create_auth_requested_response_provider(
|
|
433
|
+
realm: str,
|
|
434
|
+
) -> Callable[[Request, Any, Any], ResponseWithAuthRequested]:
|
|
435
|
+
def _provider(
|
|
436
|
+
request: Request, *args: Any, **kwargs: Any
|
|
437
|
+
) -> ResponseWithAuthRequested:
|
|
438
|
+
return ResponseWithAuthRequested(scheme=BASIC_AUTH_SCHEME, realm=realm)
|
|
439
|
+
|
|
440
|
+
return _provider
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
class ResponseWithAuthRequested(Unauthorized):
|
|
444
|
+
"""Custom exception to request authentication."""
|
|
445
|
+
|
|
446
|
+
def __init__(self, scheme: str, realm: str) -> None:
|
|
447
|
+
super().__init__(
|
|
448
|
+
message="Authentication requested.", scheme=scheme, realm=realm
|
|
449
|
+
) # type: ignore[no-untyped-call]
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def requires_basic_auth(
|
|
453
|
+
username: Optional[Text],
|
|
454
|
+
password: Optional[Text],
|
|
455
|
+
auth_request_provider: Optional[Callable[[Request, Any, Any], Unauthorized]] = None,
|
|
456
|
+
) -> Callable:
|
|
457
|
+
"""Decorator to require basic auth for a route.
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
username: The username to check against.
|
|
461
|
+
password: The password to check against.
|
|
462
|
+
auth_request_provider: Optional function to provide a custom
|
|
463
|
+
response when authentication is requested. This function should
|
|
464
|
+
return an instance of `Unauthorized` with the necessary
|
|
465
|
+
authentication headers.
|
|
466
|
+
Returns:
|
|
467
|
+
A decorator that checks for basic authentication.
|
|
468
|
+
|
|
469
|
+
Raises:
|
|
470
|
+
Unauthorized: If the authentication fails or if authentication is
|
|
471
|
+
requested without necessary credentials (headers).
|
|
472
|
+
"""
|
|
473
|
+
|
|
474
|
+
def decorator(func: Callable) -> Callable:
|
|
475
|
+
@wraps(func)
|
|
476
|
+
async def wrapper(request: Request, *args: Any, **kwargs: Any) -> Any:
|
|
477
|
+
if not username or not password:
|
|
478
|
+
return await func(request, *args, **kwargs)
|
|
479
|
+
|
|
480
|
+
auth_header = request.headers.get("Authorization")
|
|
481
|
+
|
|
482
|
+
# Some systems will first send a request without an authorization header
|
|
483
|
+
# to check if the endpoint is available. In this case, we need to
|
|
484
|
+
# return am Unauthorized response with the necessary authorization header
|
|
485
|
+
# to indicate that the endpoint requires authorization.
|
|
486
|
+
if not auth_header and auth_request_provider:
|
|
487
|
+
# if the request does not contain an authorization header,
|
|
488
|
+
# we raise an exception to request authorization
|
|
489
|
+
|
|
490
|
+
exception = auth_request_provider(request, *args, **kwargs)
|
|
491
|
+
logger.debug(
|
|
492
|
+
f"Responding with {exception.status_code} and "
|
|
493
|
+
f"necessary auth headers {exception.headers}"
|
|
494
|
+
)
|
|
495
|
+
raise exception
|
|
496
|
+
|
|
497
|
+
if not auth_header or not auth_header.startswith("Basic "):
|
|
498
|
+
logger.error("Missing or invalid authorization header.")
|
|
499
|
+
raise Unauthorized("Missing or invalid authorization header.") # type: ignore[no-untyped-call]
|
|
500
|
+
|
|
501
|
+
encoded = b64encode(f"{username}:{password}".encode()).decode()
|
|
502
|
+
username_password_digest: str = auth_header[len(BASIC_AUTH_SCHEME) :]
|
|
503
|
+
username_password_digest = username_password_digest.strip()
|
|
504
|
+
|
|
505
|
+
if not hmac.compare_digest(username_password_digest, encoded):
|
|
506
|
+
logger.error("Invalid username or password.")
|
|
507
|
+
raise Unauthorized("Invalid username or password.") # type: ignore[no-untyped-call]
|
|
508
|
+
|
|
509
|
+
return await func(request, *args, **kwargs)
|
|
510
|
+
|
|
511
|
+
return wrapper
|
|
512
|
+
|
|
513
|
+
return decorator
|
|
@@ -1,18 +1,27 @@
|
|
|
1
|
+
from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
1
4
|
from sanic import Blueprint, response
|
|
2
5
|
from sanic.request import Request
|
|
3
6
|
from sanic.response import HTTPResponse
|
|
4
|
-
from twilio.twiml.voice_response import
|
|
5
|
-
from typing import Text, Callable, Awaitable, List, Any, Dict, Optional
|
|
7
|
+
from twilio.twiml.voice_response import Gather, VoiceResponse
|
|
6
8
|
|
|
7
|
-
import rasa.utils.io
|
|
8
9
|
import rasa.shared.utils.io
|
|
9
|
-
|
|
10
|
-
from rasa.shared.exceptions import InvalidConfigException
|
|
10
|
+
import rasa.utils.io
|
|
11
11
|
from rasa.core.channels.channel import (
|
|
12
|
-
InputChannel,
|
|
13
12
|
CollectingOutputChannel,
|
|
13
|
+
InputChannel,
|
|
14
14
|
UserMessage,
|
|
15
|
+
create_auth_requested_response_provider,
|
|
16
|
+
requires_basic_auth,
|
|
15
17
|
)
|
|
18
|
+
from rasa.shared.core.events import BotUttered
|
|
19
|
+
from rasa.shared.exceptions import InvalidConfigException, RasaException
|
|
20
|
+
|
|
21
|
+
logger = structlog.get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
TWILIO_VOICE_PATH = "webhooks/twilio_voice/webhook"
|
|
16
25
|
|
|
17
26
|
|
|
18
27
|
class TwilioVoiceInput(InputChannel):
|
|
@@ -104,6 +113,14 @@ class TwilioVoiceInput(InputChannel):
|
|
|
104
113
|
"""Load custom configurations."""
|
|
105
114
|
credentials = credentials or {}
|
|
106
115
|
|
|
116
|
+
username = credentials.get("username")
|
|
117
|
+
password = credentials.get("password")
|
|
118
|
+
if (username is None) != (password is None):
|
|
119
|
+
raise RasaException(
|
|
120
|
+
"In TwilioVoice channel, either both username and password "
|
|
121
|
+
"or neither should be provided. "
|
|
122
|
+
)
|
|
123
|
+
|
|
107
124
|
return cls(
|
|
108
125
|
credentials.get("initial_prompt", "hello"),
|
|
109
126
|
credentials.get(
|
|
@@ -114,6 +131,8 @@ class TwilioVoiceInput(InputChannel):
|
|
|
114
131
|
credentials.get("speech_timeout", "5"),
|
|
115
132
|
credentials.get("speech_model", "default"),
|
|
116
133
|
credentials.get("enhanced", "false"),
|
|
134
|
+
username=username,
|
|
135
|
+
password=password,
|
|
117
136
|
)
|
|
118
137
|
|
|
119
138
|
def __init__(
|
|
@@ -124,6 +143,8 @@ class TwilioVoiceInput(InputChannel):
|
|
|
124
143
|
speech_timeout: Text = "5",
|
|
125
144
|
speech_model: Text = "default",
|
|
126
145
|
enhanced: Text = "false",
|
|
146
|
+
username: Optional[Text] = None,
|
|
147
|
+
password: Optional[Text] = None,
|
|
127
148
|
) -> None:
|
|
128
149
|
"""Creates a connection to Twilio voice.
|
|
129
150
|
|
|
@@ -141,6 +162,8 @@ class TwilioVoiceInput(InputChannel):
|
|
|
141
162
|
self.speech_timeout = speech_timeout
|
|
142
163
|
self.speech_model = speech_model
|
|
143
164
|
self.enhanced = enhanced
|
|
165
|
+
self.username = username
|
|
166
|
+
self.password = password
|
|
144
167
|
|
|
145
168
|
self._validate_configuration()
|
|
146
169
|
|
|
@@ -149,6 +172,9 @@ class TwilioVoiceInput(InputChannel):
|
|
|
149
172
|
if self.assistant_voice not in self.SUPPORTED_VOICES:
|
|
150
173
|
self._raise_invalid_voice_exception()
|
|
151
174
|
|
|
175
|
+
if (self.username is None) != (self.password is None):
|
|
176
|
+
self._raise_invalid_credentials_exception()
|
|
177
|
+
|
|
152
178
|
try:
|
|
153
179
|
int(self.speech_timeout)
|
|
154
180
|
except ValueError:
|
|
@@ -234,6 +260,13 @@ class TwilioVoiceInput(InputChannel):
|
|
|
234
260
|
return response.json({"status": "ok"})
|
|
235
261
|
|
|
236
262
|
@twilio_voice_webhook.route("/webhook", methods=["POST"])
|
|
263
|
+
@requires_basic_auth(
|
|
264
|
+
username=self.username,
|
|
265
|
+
password=self.password,
|
|
266
|
+
auth_request_provider=create_auth_requested_response_provider(
|
|
267
|
+
TWILIO_VOICE_PATH
|
|
268
|
+
),
|
|
269
|
+
)
|
|
237
270
|
async def receive(request: Request) -> HTTPResponse:
|
|
238
271
|
sender_id = request.form.get("From")
|
|
239
272
|
text = request.form.get("SpeechResult")
|
|
@@ -277,6 +310,11 @@ class TwilioVoiceInput(InputChannel):
|
|
|
277
310
|
twilio_response = self._build_twilio_voice_response(
|
|
278
311
|
[{"text": last_response_text}]
|
|
279
312
|
)
|
|
313
|
+
|
|
314
|
+
logger.debug(
|
|
315
|
+
"twilio_voice.webhook.twilio_response",
|
|
316
|
+
twilio_response=str(twilio_response),
|
|
317
|
+
)
|
|
280
318
|
return response.text(str(twilio_response), content_type="text/xml")
|
|
281
319
|
|
|
282
320
|
return twilio_voice_webhook
|
|
@@ -295,6 +333,13 @@ class TwilioVoiceInput(InputChannel):
|
|
|
295
333
|
enhanced=self.enhanced,
|
|
296
334
|
)
|
|
297
335
|
|
|
336
|
+
if not messages:
|
|
337
|
+
# In case bot has a greet message disabled
|
|
338
|
+
# or if the bot is not configured to send an initial message
|
|
339
|
+
# we need to send a voice response with speech settings
|
|
340
|
+
voice_response.append(gather)
|
|
341
|
+
return voice_response
|
|
342
|
+
|
|
298
343
|
# Add pauses between messages.
|
|
299
344
|
# Add a listener to the last message to listen for user response.
|
|
300
345
|
for i, message in enumerate(messages):
|
|
@@ -308,6 +353,12 @@ class TwilioVoiceInput(InputChannel):
|
|
|
308
353
|
|
|
309
354
|
return voice_response
|
|
310
355
|
|
|
356
|
+
def _raise_invalid_credentials_exception(self) -> None:
|
|
357
|
+
raise InvalidConfigException(
|
|
358
|
+
"In TwilioVoice channel, either both username and password "
|
|
359
|
+
"or neither should be provided. "
|
|
360
|
+
)
|
|
361
|
+
|
|
311
362
|
|
|
312
363
|
class TwilioVoiceCollectingOutputChannel(CollectingOutputChannel):
|
|
313
364
|
"""Output channel that collects send messages in a list.
|
|
@@ -6,6 +6,7 @@ import structlog
|
|
|
6
6
|
|
|
7
7
|
import rasa.shared.utils.io
|
|
8
8
|
from rasa.e2e_test.constants import SCHEMA_FILE_PATH
|
|
9
|
+
from rasa.exceptions import ModelNotFound
|
|
9
10
|
from rasa.shared.utils.yaml import read_schema_file
|
|
10
11
|
|
|
11
12
|
if TYPE_CHECKING:
|
|
@@ -54,10 +55,9 @@ def validate_model_path(model_path: Optional[str], parameter: str, default: str)
|
|
|
54
55
|
return model_path
|
|
55
56
|
|
|
56
57
|
if model_path and not Path(model_path).exists():
|
|
57
|
-
|
|
58
|
+
raise ModelNotFound(
|
|
58
59
|
f"The provided model path '{model_path}' could not be found. "
|
|
59
|
-
|
|
60
|
-
UserWarning,
|
|
60
|
+
"Provide an existing model path."
|
|
61
61
|
)
|
|
62
62
|
|
|
63
63
|
elif model_path is None:
|
rasa/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: rasa-pro
|
|
3
|
-
Version: 3.10.
|
|
3
|
+
Version: 3.10.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
|
|
@@ -60,13 +60,13 @@ Requires-Dist: jsonschema (>=4.22)
|
|
|
60
60
|
Requires-Dist: keras (==2.14.0)
|
|
61
61
|
Requires-Dist: langchain (>=0.2.17,<0.3.0)
|
|
62
62
|
Requires-Dist: langchain-community (>=0.2.19,<0.3.0)
|
|
63
|
-
Requires-Dist: litellm (>=1.
|
|
63
|
+
Requires-Dist: litellm (>=1.64.1,<1.65.0)
|
|
64
64
|
Requires-Dist: matplotlib (>=3.7,<3.8)
|
|
65
65
|
Requires-Dist: mattermostwrapper (>=2.2,<2.3)
|
|
66
66
|
Requires-Dist: mlflow (>=2.15.1,<3.0.0) ; extra == "mlflow"
|
|
67
67
|
Requires-Dist: networkx (>=3.1,<3.2)
|
|
68
68
|
Requires-Dist: numpy (>=1.23.5,<1.25.0) ; python_version >= "3.9" and python_version < "3.11"
|
|
69
|
-
Requires-Dist: openai (>=1.
|
|
69
|
+
Requires-Dist: openai (>=1.68.2,<1.69.0)
|
|
70
70
|
Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
|
|
71
71
|
Requires-Dist: opentelemetry-api (>=1.16.0,<1.17.0)
|
|
72
72
|
Requires-Dist: opentelemetry-exporter-jaeger (>=1.16.0,<1.17.0)
|
|
@@ -74,7 +74,7 @@ rasa/cli/project_templates/tutorial/data/flows.yml,sha256=9C23uQYm_JVguQJ7u51U4k
|
|
|
74
74
|
rasa/cli/project_templates/tutorial/data/patterns.yml,sha256=rIO8yjg6QU_l35pjQKFaqsOLpaWDMv4q1FS5O7VCV1Q,304
|
|
75
75
|
rasa/cli/project_templates/tutorial/domain.yml,sha256=DFnifO_0cD6PYKMsF011FoIDN_spaWbnuR7mhsF7dNk,402
|
|
76
76
|
rasa/cli/project_templates/tutorial/endpoints.yml,sha256=Mmjm5KDuyL_46dIe0issP8MKNzESYWU0JyYPWPVlWFw,1479
|
|
77
|
-
rasa/cli/run.py,sha256=
|
|
77
|
+
rasa/cli/run.py,sha256=tIizWzSwEt0fc7w1EpUcJtvLnIiYwzr-dr9l3kyhJ0c,4354
|
|
78
78
|
rasa/cli/scaffold.py,sha256=Eqv44T7b5cOd2FKLU1tSrAVPKwMfoiUIjc43PtaxJGg,7988
|
|
79
79
|
rasa/cli/shell.py,sha256=wymYOj6jdUON0y7pe-rpRqarWDGaDquU7PRp8knxqHk,4264
|
|
80
80
|
rasa/cli/studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -85,7 +85,7 @@ rasa/cli/studio/upload.py,sha256=kdHqrVGsEbbqH5fz_HusWwJEycB31SHaPlXer8lXAE0,206
|
|
|
85
85
|
rasa/cli/telemetry.py,sha256=ZywhlOpp0l2Yz9oEcOGA2ej3SEkSTisKPpBhn_fS7tc,3538
|
|
86
86
|
rasa/cli/test.py,sha256=Ub7Cm9rFQ_tkB310jPYzVwU0Di88Z7IE0nLi1o-aYbA,8901
|
|
87
87
|
rasa/cli/train.py,sha256=_fQi7Sx15LGDyJDV20FJJ2oDZoPGHBfV8xf2t5Kzkpk,10298
|
|
88
|
-
rasa/cli/utils.py,sha256=
|
|
88
|
+
rasa/cli/utils.py,sha256=r1zxiGSPzSkvyrxzB1PxLiDIoADqwWXykONs7e9xpy8,15891
|
|
89
89
|
rasa/cli/visualize.py,sha256=YmRAATAfxHpgE8_PknGyM-oIujwICNzVftTzz6iLNNc,1256
|
|
90
90
|
rasa/cli/x.py,sha256=qJtNheYwdxxwZl-M2KcEbCk8lzWVGMfI6em-5-Xj05w,6825
|
|
91
91
|
rasa/constants.py,sha256=XZYjc2dDN2q3ixchLfRRNGAqxD2uL5-z_ZYoqJwLgxM,1309
|
|
@@ -119,7 +119,7 @@ rasa/core/channels/__init__.py,sha256=zXFLOIIbArflZ4bwo6Dnaj-_IY-BAEPnsRcpnxJyeF
|
|
|
119
119
|
rasa/core/channels/audiocodes.py,sha256=v3Sl6lTS6Ig6EyIQSpvj5pQAh3PXE1Y2l0pL7HfgF7s,17543
|
|
120
120
|
rasa/core/channels/botframework.py,sha256=xyc_n7DJ3uglqvkr0IrQ3xxPWgvaqSOLHWx9BUS0enE,11668
|
|
121
121
|
rasa/core/channels/callback.py,sha256=4LpjtJgQMAAXHwZrcVlVEUdpDTRqTe6n7XtwCusa75U,2750
|
|
122
|
-
rasa/core/channels/channel.py,sha256=
|
|
122
|
+
rasa/core/channels/channel.py,sha256=MRfoQXFQ3eGDA-6EEnGj3ii8PIj-DNb7rfUJKDn2v8g,17736
|
|
123
123
|
rasa/core/channels/console.py,sha256=fYhkSY8a_pn09ssjTczsKTALinABogpFJzzWTnL7MP8,8076
|
|
124
124
|
rasa/core/channels/development_inspector.py,sha256=oh2zrIEyQOl-HTKfwZmnMvJ6RZkhbqQrLeEEW0FX14k,2982
|
|
125
125
|
rasa/core/channels/facebook.py,sha256=ub8DCnTPe3_EyYtdYE49mo2Y-UNpURj6Qx9590oadeM,15816
|
|
@@ -259,7 +259,7 @@ rasa/core/channels/slack.py,sha256=3b8OZQ_gih5XBwhQ1q4BbBUC1SCAPaO9AoJEn2NaoQE,2
|
|
|
259
259
|
rasa/core/channels/socketio.py,sha256=k0b6aWE8gqhXBaLN7Sa5qaxqrWEFqf95ZeN-fX9bhPA,10675
|
|
260
260
|
rasa/core/channels/telegram.py,sha256=XvzU7KAgjmRcu2vUJ-5L2eYAAuYBqtcYlhq1Jo6kLns,10649
|
|
261
261
|
rasa/core/channels/twilio.py,sha256=c63uFLVKaK4Fj8MAn9BSQtxiV_Ezq4POezHo8zWIoiw,5938
|
|
262
|
-
rasa/core/channels/twilio_voice.py,sha256=
|
|
262
|
+
rasa/core/channels/twilio_voice.py,sha256=YOvm2jNaHGGPlhNZqf_9T9IHu7Ibp0FfuqGS0voTRL0,15007
|
|
263
263
|
rasa/core/channels/vier_cvg.py,sha256=PfvSluQqgJbP0JzZPFUvum3z7H55JPPeobcD-z5zCkw,13544
|
|
264
264
|
rasa/core/channels/voice_aware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
265
265
|
rasa/core/channels/voice_aware/jambonz.py,sha256=aMXK2bGXioupVUUKZpkeYiAprilvVc2xEDBytRIcdMs,3481
|
|
@@ -422,7 +422,7 @@ rasa/e2e_test/stub_custom_action.py,sha256=teq8c5I6IuUsFX4lPdeBLY3j0SLSMCC95KmKx
|
|
|
422
422
|
rasa/e2e_test/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
423
423
|
rasa/e2e_test/utils/e2e_yaml_utils.py,sha256=XvP14DGHMfsNXyI7uTV-GTAdqv-r5FNmpFmvEIn93OM,1601
|
|
424
424
|
rasa/e2e_test/utils/io.py,sha256=HVsFb8uVPTlu7PcQdFmMNUFf0rRrD5Wiys0oMZqu2nA,19016
|
|
425
|
-
rasa/e2e_test/utils/validation.py,sha256=
|
|
425
|
+
rasa/e2e_test/utils/validation.py,sha256=k4zlwAMX6O45fyHFKqBXsBpeThpEVrQoj9B357AXJ7U,2336
|
|
426
426
|
rasa/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
427
427
|
rasa/engine/caching.py,sha256=Uu-0yn_eQGysmW7nsub-tb3gD8QNz6TNssNd-GIthuI,16451
|
|
428
428
|
rasa/engine/constants.py,sha256=w7hyRd2gU8JJyECqGG1meIS3volOCD3lYpVuzDLGz-s,623
|
|
@@ -727,9 +727,9 @@ rasa/utils/train_utils.py,sha256=f1NWpp5y6al0dzoQyyio4hc4Nf73DRoRSHDzEK6-C4E,212
|
|
|
727
727
|
rasa/utils/url_tools.py,sha256=JQcHL2aLqLHu82k7_d9imUoETCm2bmlHaDpOJ-dKqBc,1218
|
|
728
728
|
rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
|
|
729
729
|
rasa/validator.py,sha256=gGsuHZivo9MDGA8WCkvYEK5Payi2lpLpOi_PLGwg1Qk,63202
|
|
730
|
-
rasa/version.py,sha256=
|
|
731
|
-
rasa_pro-3.10.
|
|
732
|
-
rasa_pro-3.10.
|
|
733
|
-
rasa_pro-3.10.
|
|
734
|
-
rasa_pro-3.10.
|
|
735
|
-
rasa_pro-3.10.
|
|
730
|
+
rasa/version.py,sha256=3j2EOjZiqsty-50ZSw_uFUgdOT_Pkwi_bOhyuPMfbA4,118
|
|
731
|
+
rasa_pro-3.10.20.dist-info/METADATA,sha256=Hcsj2UTAbGpXeT34PtyH07P8yH_iMKg8BZPB3H1wiYY,10856
|
|
732
|
+
rasa_pro-3.10.20.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
|
|
733
|
+
rasa_pro-3.10.20.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
|
734
|
+
rasa_pro-3.10.20.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
|
|
735
|
+
rasa_pro-3.10.20.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|