rasa-pro 3.10.7.dev5__py3-none-any.whl → 3.10.9__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.

Files changed (79) hide show
  1. README.md +37 -1
  2. rasa/api.py +2 -8
  3. rasa/cli/arguments/default_arguments.py +2 -23
  4. rasa/cli/arguments/run.py +0 -2
  5. rasa/cli/e2e_test.py +8 -10
  6. rasa/cli/inspect.py +2 -5
  7. rasa/cli/run.py +0 -7
  8. rasa/cli/studio/studio.py +21 -1
  9. rasa/cli/train.py +4 -9
  10. rasa/cli/utils.py +3 -3
  11. rasa/core/agent.py +2 -2
  12. rasa/core/brokers/kafka.py +1 -3
  13. rasa/core/brokers/pika.py +1 -3
  14. rasa/core/channels/socketio.py +1 -5
  15. rasa/core/channels/voice_aware/utils.py +5 -6
  16. rasa/core/nlg/contextual_response_rephraser.py +2 -11
  17. rasa/core/policies/enterprise_search_policy.py +2 -11
  18. rasa/core/policies/intentless_policy.py +2 -9
  19. rasa/core/processor.py +57 -8
  20. rasa/core/run.py +1 -2
  21. rasa/core/secrets_manager/constants.py +0 -4
  22. rasa/core/secrets_manager/factory.py +0 -8
  23. rasa/core/secrets_manager/vault.py +1 -11
  24. rasa/core/utils.py +19 -30
  25. rasa/dialogue_understanding/coexistence/llm_based_router.py +2 -9
  26. rasa/dialogue_understanding/commands/__init__.py +2 -0
  27. rasa/dialogue_understanding/commands/restart_command.py +58 -0
  28. rasa/dialogue_understanding/commands/set_slot_command.py +5 -1
  29. rasa/dialogue_understanding/commands/utils.py +3 -1
  30. rasa/dialogue_understanding/generator/llm_based_command_generator.py +2 -11
  31. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  32. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +15 -15
  33. rasa/dialogue_understanding/patterns/restart.py +37 -0
  34. rasa/e2e_test/e2e_test_runner.py +1 -1
  35. rasa/e2e_test/utils/io.py +3 -1
  36. rasa/engine/graph.py +1 -0
  37. rasa/engine/recipes/config_files/default_config.yml +3 -0
  38. rasa/engine/recipes/default_recipe.py +1 -0
  39. rasa/engine/recipes/graph_recipe.py +1 -0
  40. rasa/engine/storage/local_model_storage.py +1 -0
  41. rasa/engine/storage/storage.py +5 -1
  42. rasa/model_training.py +6 -11
  43. rasa/{core → nlu}/persistor.py +1 -1
  44. rasa/server.py +1 -1
  45. rasa/shared/constants.py +3 -2
  46. rasa/shared/core/domain.py +47 -101
  47. rasa/shared/core/flows/flows_list.py +6 -19
  48. rasa/shared/core/flows/validation.py +0 -25
  49. rasa/shared/core/flows/yaml_flows_io.py +24 -3
  50. rasa/shared/importers/importer.py +32 -32
  51. rasa/shared/importers/multi_project.py +11 -23
  52. rasa/shared/importers/rasa.py +2 -7
  53. rasa/shared/importers/remote_importer.py +2 -2
  54. rasa/shared/importers/utils.py +1 -3
  55. rasa/shared/nlu/training_data/training_data.py +19 -18
  56. rasa/shared/providers/_configs/azure_openai_client_config.py +5 -3
  57. rasa/shared/providers/llm/_base_litellm_client.py +26 -10
  58. rasa/shared/providers/llm/self_hosted_llm_client.py +15 -3
  59. rasa/shared/utils/common.py +22 -3
  60. rasa/shared/utils/llm.py +5 -29
  61. rasa/shared/utils/schemas/model_config.yml +10 -0
  62. rasa/studio/auth.py +4 -0
  63. rasa/tracing/instrumentation/attribute_extractors.py +1 -1
  64. rasa/validator.py +5 -2
  65. rasa/version.py +1 -1
  66. {rasa_pro-3.10.7.dev5.dist-info → rasa_pro-3.10.9.dist-info}/METADATA +43 -7
  67. {rasa_pro-3.10.7.dev5.dist-info → rasa_pro-3.10.9.dist-info}/RECORD +70 -77
  68. rasa/keys +0 -1
  69. rasa/model_manager/__init__.py +0 -0
  70. rasa/model_manager/config.py +0 -12
  71. rasa/model_manager/model_api.py +0 -467
  72. rasa/model_manager/runner_service.py +0 -185
  73. rasa/model_manager/socket_bridge.py +0 -44
  74. rasa/model_manager/trainer_service.py +0 -240
  75. rasa/model_manager/utils.py +0 -27
  76. rasa/model_service.py +0 -66
  77. {rasa_pro-3.10.7.dev5.dist-info → rasa_pro-3.10.9.dist-info}/NOTICE +0 -0
  78. {rasa_pro-3.10.7.dev5.dist-info → rasa_pro-3.10.9.dist-info}/WHEEL +0 -0
  79. {rasa_pro-3.10.7.dev5.dist-info → rasa_pro-3.10.9.dist-info}/entry_points.txt +0 -0
rasa/core/run.py CHANGED
@@ -32,8 +32,8 @@ from rasa.core import agent, channels, constants
32
32
  from rasa.core.agent import Agent
33
33
  from rasa.core.channels import console
34
34
  from rasa.core.channels.channel import InputChannel
35
- from rasa.core.persistor import StorageType
36
35
  from rasa.core.utils import AvailableEndpoints
36
+ from rasa.nlu.persistor import StorageType
37
37
  from rasa.plugin import plugin_manager
38
38
  from rasa.shared.exceptions import RasaException
39
39
  from rasa.shared.utils.yaml import read_config_file
@@ -311,7 +311,6 @@ async def load_agent_on_start(
311
311
  endpoints=endpoints,
312
312
  loop=loop,
313
313
  )
314
-
315
314
  logger.info("Rasa server is up and running.")
316
315
  return app.ctx.agent
317
316
 
@@ -23,7 +23,6 @@ VAULT_TRANSIT_MOUNT_POINT_ENV_NAME = "VAULT_TRANSIT_MOUNT_POINT"
23
23
  VAULT_NAMESPACE_ENV_NAME = "VAULT_NAMESPACE"
24
24
  VAULT_DEFAULT_RASA_SECRETS_PATH = "rasa-secrets"
25
25
  VAULT_SECRET_MANAGER_NAME = "vault"
26
- VAULT_MOUNT_POINT_ENV_NAME = "VAULT_MOUNT_POINT"
27
26
 
28
27
 
29
28
  VAULT_ENDPOINT_URL_LABEL = "url"
@@ -31,6 +30,3 @@ VAULT_ENDPOINT_TOKEN_LABEL = "token"
31
30
  VAULT_ENDPOINT_SECRETS_PATH_LABEL = "secrets_path"
32
31
  VAULT_ENDPOINT_TRANSIT_MOUNT_POINT_LABEL = "transit_mount_point"
33
32
  VAULT_ENDPOINT_NAMESPACE_LABEL = "namespace"
34
- VAULT_ENDPOINT_MOUNT_POINT_LABEL = "mount_point"
35
-
36
- VAULT_MOUNT_POINT_DEFAULT_VALUE = "secret"
@@ -7,11 +7,9 @@ from rasa.utils.endpoints import EndpointConfig, read_endpoint_config
7
7
  from rasa.core.secrets_manager.constants import (
8
8
  SECRET_MANAGER_ENV_NAME,
9
9
  VAULT_DEFAULT_RASA_SECRETS_PATH,
10
- VAULT_ENDPOINT_MOUNT_POINT_LABEL,
11
10
  VAULT_ENDPOINT_NAMESPACE_LABEL,
12
11
  VAULT_ENDPOINT_SECRETS_PATH_LABEL,
13
12
  VAULT_ENDPOINT_TRANSIT_MOUNT_POINT_LABEL,
14
- VAULT_MOUNT_POINT_ENV_NAME,
15
13
  VAULT_NAMESPACE_ENV_NAME,
16
14
  VAULT_RASA_SECRETS_PATH_ENV_NAME,
17
15
  VAULT_SECRET_MANAGER_NAME,
@@ -50,7 +48,6 @@ def create(config: SecretManagerConfig) -> Optional[SecretsManager]:
50
48
  transit_mount_point=vault_config.transit_mount_point,
51
49
  secrets_path=vault_config.secrets_path,
52
50
  namespace=vault_config.namespace,
53
- mount_point=vault_config.mount_point,
54
51
  )
55
52
 
56
53
  return secret_manager
@@ -82,7 +79,6 @@ def read_vault_endpoint_config(
82
79
  )
83
80
  secrets_path = endpoint_config.kwargs.get(VAULT_ENDPOINT_SECRETS_PATH_LABEL)
84
81
  namespace = endpoint_config.kwargs.get(VAULT_ENDPOINT_NAMESPACE_LABEL)
85
- mount_point = endpoint_config.kwargs.get(VAULT_ENDPOINT_MOUNT_POINT_LABEL)
86
82
 
87
83
  return VaultSecretManagerNonStrictConfig(
88
84
  url=url,
@@ -90,7 +86,6 @@ def read_vault_endpoint_config(
90
86
  transit_mount_point=transit_mount_point,
91
87
  secrets_path=secrets_path or VAULT_DEFAULT_RASA_SECRETS_PATH,
92
88
  namespace=namespace,
93
- mount_point=mount_point,
94
89
  )
95
90
 
96
91
  return None
@@ -107,7 +102,6 @@ def read_vault_env_vars() -> VaultSecretManagerNonStrictConfig:
107
102
  transit_mount_point = os.getenv(VAULT_TRANSIT_MOUNT_POINT_ENV_NAME)
108
103
  secrets_path = os.getenv(VAULT_RASA_SECRETS_PATH_ENV_NAME)
109
104
  namespace = os.getenv(VAULT_NAMESPACE_ENV_NAME)
110
- mount_point = os.getenv(VAULT_MOUNT_POINT_ENV_NAME)
111
105
 
112
106
  return VaultSecretManagerNonStrictConfig(
113
107
  url=url,
@@ -115,7 +109,6 @@ def read_vault_env_vars() -> VaultSecretManagerNonStrictConfig:
115
109
  transit_mount_point=transit_mount_point,
116
110
  secrets_path=secrets_path,
117
111
  namespace=namespace,
118
- mount_point=mount_point,
119
112
  )
120
113
 
121
114
 
@@ -156,7 +149,6 @@ def read_vault_config(
156
149
  f"{VAULT_RASA_SECRETS_PATH_ENV_NAME} = {env_config.secrets_path}, "
157
150
  f"{VAULT_TRANSIT_MOUNT_POINT_ENV_NAME} = {env_config.transit_mount_point}. "
158
151
  f"{VAULT_NAMESPACE_ENV_NAME} = {env_config.namespace}. "
159
- f"{VAULT_MOUNT_POINT_ENV_NAME} = {env_config.mount_point}. "
160
152
  )
161
153
 
162
154
 
@@ -15,7 +15,6 @@ from rasa.utils.endpoints import EndpointConfig
15
15
  from rasa.core.secrets_manager.constants import (
16
16
  TRACKER_STORE_ENDPOINT_TYPE,
17
17
  TRANSIT_KEY_FOR_ENCRYPTION_LABEL,
18
- VAULT_MOUNT_POINT_DEFAULT_VALUE,
19
18
  VAULT_SECRET_MANAGER_NAME,
20
19
  )
21
20
  from rasa.core.secrets_manager.endpoints import (
@@ -182,7 +181,6 @@ class VaultSecretsManager(SecretsManager):
182
181
  secrets_path: Text,
183
182
  transit_mount_point: Optional[Text] = None,
184
183
  namespace: Optional[Text] = None,
185
- mount_point: Optional[Text] = None,
186
184
  ):
187
185
  """Initialise the VaultSecretsManager.
188
186
 
@@ -192,13 +190,11 @@ class VaultSecretsManager(SecretsManager):
192
190
  secrets_path: The path to the secrets in the vault server.
193
191
  transit_mount_point: The mount point of the transit engine.
194
192
  namespace: The namespace in which secrets reside in.
195
- mount_point: The mount point of the kv engine.
196
193
  """
197
194
  self.host = host
198
195
  self.transit_mount_point = transit_mount_point
199
196
  self.token = token
200
197
  self.secrets_path = secrets_path
201
- self.mount_point = mount_point or VAULT_MOUNT_POINT_DEFAULT_VALUE
202
198
  self.namespace = namespace
203
199
 
204
200
  # Create client
@@ -240,7 +236,7 @@ class VaultSecretsManager(SecretsManager):
240
236
  """
241
237
  logger.info(f"Loading secrets from vault server at {self.host}.")
242
238
  read_response = self.client.secrets.kv.read_secret_version(
243
- mount_point=self.mount_point, path=self.secrets_path
239
+ mount_point="secret", path=self.secrets_path
244
240
  )
245
241
 
246
242
  secrets = read_response["data"]["data"]
@@ -459,7 +455,6 @@ class VaultSecretManagerConfig(SecretManagerConfig):
459
455
  secrets_path: Text,
460
456
  transit_mount_point: Text = "transit",
461
457
  namespace: Optional[Text] = None,
462
- mount_point: Optional[Text] = None,
463
458
  ) -> None:
464
459
  """Initialise the VaultSecretManagerConfig.
465
460
 
@@ -476,7 +471,6 @@ class VaultSecretManagerConfig(SecretManagerConfig):
476
471
  self.secrets_path = secrets_path
477
472
  self.transit_mount_point = transit_mount_point
478
473
  self.namespace = namespace
479
- self.mount_point = mount_point
480
474
 
481
475
 
482
476
  @dataclass
@@ -492,7 +486,6 @@ class VaultSecretManagerNonStrictConfig:
492
486
  secrets_path: Optional[Text]
493
487
  transit_mount_point: Optional[Text]
494
488
  namespace: Optional[Text] = None
495
- mount_point: Optional[Text] = None
496
489
 
497
490
  def is_empty(self) -> bool:
498
491
  """Check if all the values are empty."""
@@ -502,7 +495,6 @@ class VaultSecretManagerNonStrictConfig:
502
495
  and (self.secrets_path is None or self.secrets_path == "")
503
496
  and (self.transit_mount_point is None or self.transit_mount_point == "")
504
497
  and (self.namespace is None or self.namespace == "")
505
- and (self.mount_point is None or self.mount_point == "")
506
498
  )
507
499
 
508
500
  def is_valid(self) -> bool:
@@ -524,7 +516,6 @@ class VaultSecretManagerNonStrictConfig:
524
516
  and self.secrets_path != ""
525
517
  and self._is_optional_value_valid(self.transit_mount_point)
526
518
  and self._is_optional_value_valid(self.namespace)
527
- and self._is_optional_value_valid(self.mount_point)
528
519
  )
529
520
 
530
521
  @staticmethod
@@ -556,7 +547,6 @@ class VaultSecretManagerNonStrictConfig:
556
547
  secrets_path=self.secrets_path or other.secrets_path,
557
548
  transit_mount_point=self.transit_mount_point or other.transit_mount_point,
558
549
  namespace=self.namespace or other.namespace,
559
- mount_point=self.mount_point or other.mount_point,
560
550
  )
561
551
 
562
552
 
rasa/core/utils.py CHANGED
@@ -1,4 +1,3 @@
1
- import structlog
2
1
  import logging
3
2
  import os
4
3
  from pathlib import Path
@@ -27,7 +26,7 @@ if TYPE_CHECKING:
27
26
  from rasa.core.nlg import NaturalLanguageGenerator
28
27
  from rasa.shared.core.domain import Domain
29
28
 
30
- structlogger = structlog.get_logger()
29
+ logger = logging.getLogger(__name__)
31
30
 
32
31
 
33
32
  def configure_file_logging(
@@ -125,17 +124,15 @@ def list_routes(app: Sanic) -> Dict[Text, Text]:
125
124
  for arg in route._params:
126
125
  options[arg] = f"[{arg}]"
127
126
 
128
- name = route.name.replace("rasa_server.", "")
129
- methods = ",".join(route.methods)
127
+ handlers = [(next(iter(route.methods)), route.name.replace("rasa_server.", ""))]
130
128
 
131
- full_endpoint = "/" + "/".join(endpoint)
132
- line = unquote(f"{full_endpoint:50s} {methods:30s} {name}")
133
- output[name] = line
129
+ for method, name in handlers:
130
+ full_endpoint = "/" + "/".join(endpoint)
131
+ line = unquote(f"{full_endpoint:50s} {method:30s} {name}")
132
+ output[name] = line
134
133
 
135
134
  url_table = "\n".join(output[url] for url in sorted(output))
136
- structlogger.debug(
137
- "server.routes", event_info=f"Available web server routes: \n{url_table}"
138
- )
135
+ logger.debug(f"Available web server routes: \n{url_table}")
139
136
 
140
137
  return output
141
138
 
@@ -266,22 +263,17 @@ def number_of_sanic_workers(lock_store: Union[EndpointConfig, LockStore, None])
266
263
  """
267
264
 
268
265
  def _log_and_get_default_number_of_workers() -> int:
269
- structlogger.debug(
270
- "server.worker.set_count",
271
- number_of_workers=DEFAULT_SANIC_WORKERS,
272
- event_info=f"Using the default number of Sanic workers "
273
- f"({DEFAULT_SANIC_WORKERS}).",
266
+ logger.debug(
267
+ f"Using the default number of Sanic workers ({DEFAULT_SANIC_WORKERS})."
274
268
  )
275
269
  return DEFAULT_SANIC_WORKERS
276
270
 
277
271
  try:
278
272
  env_value = int(os.environ.get(ENV_SANIC_WORKERS, DEFAULT_SANIC_WORKERS))
279
273
  except ValueError:
280
- structlogger.error(
281
- "server.worker.set_count.error",
282
- number_of_workers=os.environ[ENV_SANIC_WORKERS],
283
- event_info=f"Cannot convert environment variable `{ENV_SANIC_WORKERS}` "
284
- f"to int ('{os.environ[ENV_SANIC_WORKERS]}').",
274
+ logger.error(
275
+ f"Cannot convert environment variable `{ENV_SANIC_WORKERS}` "
276
+ f"to int ('{os.environ[ENV_SANIC_WORKERS]}')."
285
277
  )
286
278
  return _log_and_get_default_number_of_workers()
287
279
 
@@ -289,23 +281,20 @@ def number_of_sanic_workers(lock_store: Union[EndpointConfig, LockStore, None])
289
281
  return _log_and_get_default_number_of_workers()
290
282
 
291
283
  if env_value < 1:
292
- structlogger.debug(
293
- "server.worker.set_count.error_less_than_one",
294
- number_of_workers=env_value,
295
- event_info=f"Cannot set number of Sanic workers to the desired value "
296
- f"({env_value}). The number of workers must be at least 1.",
284
+ logger.debug(
285
+ f"Cannot set number of Sanic workers to the desired value "
286
+ f"({env_value}). The number of workers must be at least 1."
297
287
  )
298
288
  return _log_and_get_default_number_of_workers()
299
289
 
300
290
  if _lock_store_is_multi_worker_compatible(lock_store):
301
- structlogger.debug(f"Using {env_value} Sanic workers.")
291
+ logger.debug(f"Using {env_value} Sanic workers.")
302
292
  return env_value
303
293
 
304
- structlogger.debug(
305
- "server.worker.set_count.error_no_lock_store",
306
- event_info=f"Unable to assign desired number of Sanic workers ({env_value}) as "
294
+ logger.debug(
295
+ f"Unable to assign desired number of Sanic workers ({env_value}) as "
307
296
  f"no `RedisLockStore` or custom `LockStore` endpoint "
308
- f"configuration has been found.",
297
+ f"configuration has been found."
309
298
  )
310
299
  return _log_and_get_default_number_of_workers()
311
300
 
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import importlib
4
- import os
5
4
  from typing import Any, Dict, List, Optional
6
5
 
7
6
  import structlog
@@ -22,7 +21,6 @@ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
22
21
  from rasa.engine.storage.resource import Resource
23
22
  from rasa.engine.storage.storage import ModelStorage
24
23
  from rasa.shared.constants import (
25
- LLM_API_HEALTH_CHECK_ENV_VAR,
26
24
  ROUTE_TO_CALM_SLOT,
27
25
  PROMPT_CONFIG_KEY,
28
26
  PROVIDER_CONFIG_KEY,
@@ -38,7 +36,6 @@ from rasa.shared.nlu.training_data.training_data import TrainingData
38
36
  from rasa.shared.utils.llm import (
39
37
  DEFAULT_OPENAI_CHAT_MODEL_NAME,
40
38
  get_prompt_template,
41
- llm_api_health_check,
42
39
  llm_factory,
43
40
  try_instantiate_llm_client,
44
41
  )
@@ -133,16 +130,12 @@ class LLMBasedRouter(GraphComponent):
133
130
  def train(self, training_data: TrainingData) -> Resource:
134
131
  """Train the intent classifier on a data set."""
135
132
  # Validate llm configuration
136
- llm_client = try_instantiate_llm_client(
133
+ try_instantiate_llm_client(
137
134
  self.config.get(LLM_CONFIG_KEY),
138
135
  DEFAULT_LLM_CONFIG,
139
136
  "llm_based_router.train",
140
- LLMBasedRouter.__name__,
137
+ "LLMBasedRouter",
141
138
  )
142
- if os.getenv(LLM_API_HEALTH_CHECK_ENV_VAR, "true").lower() == "true":
143
- llm_api_health_check(
144
- llm_client, "llm_based_router.train", LLMBasedRouter.__name__
145
- )
146
139
 
147
140
  self.persist()
148
141
  return self._resource
@@ -9,6 +9,7 @@ from rasa.dialogue_understanding.commands.knowledge_answer_command import (
9
9
  from rasa.dialogue_understanding.commands.chit_chat_answer_command import (
10
10
  ChitChatAnswerCommand,
11
11
  )
12
+ from rasa.dialogue_understanding.commands.restart_command import RestartCommand
12
13
  from rasa.dialogue_understanding.commands.skip_question_command import (
13
14
  SkipQuestionCommand,
14
15
  )
@@ -50,4 +51,5 @@ __all__ = [
50
51
  "NoopCommand",
51
52
  "ChangeFlowCommand",
52
53
  "SessionStartCommand",
54
+ "RestartCommand",
53
55
  ]
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any, Dict, List
5
+
6
+ from rasa.dialogue_understanding.commands import Command
7
+ from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
8
+ from rasa.shared.core.events import Event
9
+ from rasa.shared.core.flows import FlowsList
10
+ from rasa.shared.core.trackers import DialogueStateTracker
11
+
12
+
13
+ @dataclass
14
+ class RestartCommand(Command):
15
+ """A command to restart a session."""
16
+
17
+ @classmethod
18
+ def command(cls) -> str:
19
+ """Returns the command type."""
20
+ return "restart"
21
+
22
+ @classmethod
23
+ def from_dict(cls, data: Dict[str, Any]) -> RestartCommand:
24
+ """Converts the dictionary to a command.
25
+
26
+ Returns:
27
+ The converted dictionary.
28
+ """
29
+ return RestartCommand()
30
+
31
+ def run_command_on_tracker(
32
+ self,
33
+ tracker: DialogueStateTracker,
34
+ all_flows: FlowsList,
35
+ original_tracker: DialogueStateTracker,
36
+ ) -> List[Event]:
37
+ """Runs the command on the tracker.
38
+
39
+ Args:
40
+ tracker: The tracker to run the command on.
41
+ all_flows: All flows in the assistant.
42
+ original_tracker: The tracker before any command was executed.
43
+
44
+ Returns:
45
+ The events to apply to the tracker.
46
+ """
47
+ stack = tracker.stack
48
+ stack.push(RestartPatternFlowStackFrame())
49
+ return tracker.create_stack_updated_events(stack)
50
+
51
+ def __hash__(self) -> int:
52
+ return hash(self.command())
53
+
54
+ def __eq__(self, other: object) -> bool:
55
+ if not isinstance(other, RestartCommand):
56
+ return False
57
+
58
+ return True
@@ -127,7 +127,11 @@ class SetSlotCommand(Command):
127
127
  if (
128
128
  self.name not in slots_of_active_flow
129
129
  and self.name != ROUTE_TO_CALM_SLOT
130
- and self.extractor == SetSlotExtractor.LLM.value
130
+ and self.extractor
131
+ in {
132
+ SetSlotExtractor.LLM.value,
133
+ SetSlotExtractor.COMMAND_PAYLOAD_READER.value,
134
+ }
131
135
  ):
132
136
  # Get the other predicted flows from the most recent message on the tracker.
133
137
  predicted_flows = get_flows_predicted_to_start_from_tracker(tracker)
@@ -9,6 +9,7 @@ from rasa.dialogue_understanding.commands import (
9
9
  KnowledgeAnswerCommand,
10
10
  SessionStartCommand,
11
11
  SkipQuestionCommand,
12
+ RestartCommand,
12
13
  )
13
14
  from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
14
15
  from rasa.dialogue_understanding.patterns.cannot_handle import (
@@ -18,6 +19,7 @@ from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowSta
18
19
  from rasa.dialogue_understanding.patterns.human_handoff import (
19
20
  HumanHandoffPatternFlowStackFrame,
20
21
  )
22
+ from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
21
23
  from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
22
24
  from rasa.dialogue_understanding.patterns.session_start import (
23
25
  SessionStartPatternFlowStackFrame,
@@ -26,7 +28,6 @@ from rasa.dialogue_understanding.patterns.skip_question import (
26
28
  SkipQuestionPatternFlowStackFrame,
27
29
  )
28
30
 
29
-
30
31
  triggerable_pattern_to_command_class: Dict[str, Type[Command]] = {
31
32
  SessionStartPatternFlowStackFrame.flow_id: SessionStartCommand,
32
33
  CancelPatternFlowStackFrame.flow_id: CancelFlowCommand,
@@ -35,4 +36,5 @@ triggerable_pattern_to_command_class: Dict[str, Type[Command]] = {
35
36
  SearchPatternFlowStackFrame.flow_id: KnowledgeAnswerCommand,
36
37
  SkipQuestionPatternFlowStackFrame.flow_id: SkipQuestionCommand,
37
38
  CannotHandlePatternFlowStackFrame.flow_id: CannotHandleCommand,
39
+ RestartPatternFlowStackFrame.flow_id: RestartCommand,
38
40
  }
@@ -2,7 +2,6 @@ from abc import ABC, abstractmethod
2
2
  from functools import lru_cache
3
3
  from typing import Dict, Any, List, Optional, Tuple, Union, Text
4
4
 
5
- import os
6
5
  import structlog
7
6
  from jinja2 import Template
8
7
 
@@ -23,7 +22,6 @@ from rasa.engine.graph import GraphComponent, ExecutionContext
23
22
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
24
23
  from rasa.engine.storage.resource import Resource
25
24
  from rasa.engine.storage.storage import ModelStorage
26
- from rasa.shared.constants import LLM_API_HEALTH_CHECK_ENV_VAR
27
25
  from rasa.shared.core.domain import Domain
28
26
  from rasa.shared.core.flows import FlowStep, Flow, FlowsList
29
27
  from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
@@ -35,7 +33,6 @@ from rasa.shared.nlu.training_data.message import Message
35
33
  from rasa.shared.nlu.training_data.training_data import TrainingData
36
34
  from rasa.shared.utils.llm import (
37
35
  allowed_values_for_slot,
38
- llm_api_health_check,
39
36
  llm_factory,
40
37
  try_instantiate_llm_client,
41
38
  )
@@ -172,18 +169,12 @@ class LLMBasedCommandGenerator(GraphComponent, CommandGenerator, ABC):
172
169
  store.
173
170
  """
174
171
  # Validate llm configuration
175
- llm_client = try_instantiate_llm_client(
172
+ try_instantiate_llm_client(
176
173
  self.config.get(LLM_CONFIG_KEY),
177
174
  DEFAULT_LLM_CONFIG,
178
175
  "llm_based_command_generator.train",
179
- LLMBasedCommandGenerator.__name__,
176
+ "LLMBasedCommandGenerator",
180
177
  )
181
- if os.getenv(LLM_API_HEALTH_CHECK_ENV_VAR, "true").lower() == "true":
182
- llm_api_health_check(
183
- llm_client,
184
- "llm_based_command_generator.train",
185
- LLMBasedCommandGenerator.__name__,
186
- )
187
178
 
188
179
  # flow retrieval is populated with only user-defined flows
189
180
  try:
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict, Optional, Text
1
+ from typing import Dict, Any, Optional, Text
2
2
 
3
3
  import structlog
4
4
  from deprecated import deprecated # type: ignore[import]
@@ -55,7 +55,7 @@ responses:
55
55
  template: jinja
56
56
 
57
57
  utter_free_chitchat_response:
58
- - text: placeholder_this_utterance_needs_the_rephraser
58
+ - text: "Sorry, I'm not able to answer that right now."
59
59
  metadata:
60
60
  rephrase: True
61
61
  rephrase_prompt: |
@@ -160,9 +160,9 @@ flows:
160
160
  action: action_run_slot_rejections
161
161
  - action: validate_{{context.collect}}
162
162
  next:
163
- - if: "slots.{{context.collect}} is not null"
164
- then: END
165
- - else: ask_collect
163
+ - if: "slots.{{context.collect}} is not null"
164
+ then: END
165
+ - else: ask_collect
166
166
  - id: ask_collect
167
167
  action: "{{context.utter}}"
168
168
  - action: "{{context.collect_action}}"
@@ -205,17 +205,17 @@ flows:
205
205
  steps:
206
206
  - noop: true
207
207
  next:
208
- - if: "'{{context.error_type}}' = 'rasa_internal_error_user_input_too_long'"
209
- then:
210
- - action: utter_user_input_too_long_error_rasa
211
- next: END
212
- - if: "'{{context.error_type}}' = 'rasa_internal_error_user_input_empty'"
213
- then:
214
- - action: utter_user_input_empty_error_rasa
215
- next: END
216
- - else:
217
- - action: utter_internal_error_rasa
218
- next: END
208
+ - if: "'{{context.error_type}}' = 'rasa_internal_error_user_input_too_long'"
209
+ then:
210
+ - action: utter_user_input_too_long_error_rasa
211
+ next: END
212
+ - if: "'{{context.error_type}}' = 'rasa_internal_error_user_input_empty'"
213
+ then:
214
+ - action: utter_user_input_empty_error_rasa
215
+ next: END
216
+ - else:
217
+ - action: utter_internal_error_rasa
218
+ next: END
219
219
 
220
220
 
221
221
  pattern_restart:
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any, Dict
5
+
6
+ from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
7
+ from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
8
+
9
+ FLOW_PATTERN_RESTART = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "restart"
10
+
11
+
12
+ @dataclass
13
+ class RestartPatternFlowStackFrame(PatternFlowStackFrame):
14
+ """A flow stack frame that can get added at the beginning of the conversation."""
15
+
16
+ flow_id: str = FLOW_PATTERN_RESTART
17
+ """The ID of the flow."""
18
+
19
+ @classmethod
20
+ def type(cls) -> str:
21
+ """Returns the type of the frame."""
22
+ return FLOW_PATTERN_RESTART
23
+
24
+ @staticmethod
25
+ def from_dict(data: Dict[str, Any]) -> RestartPatternFlowStackFrame:
26
+ """Creates a `DialogueStackFrame` from a dictionary.
27
+
28
+ Args:
29
+ data: The dictionary to create the `DialogueStackFrame` from.
30
+
31
+ Returns:
32
+ The created `DialogueStackFrame`.
33
+ """
34
+ return RestartPatternFlowStackFrame(
35
+ frame_id=data["frame_id"],
36
+ step_id=data["step_id"],
37
+ )
@@ -16,7 +16,6 @@ import rasa.shared.utils.io
16
16
  from rasa.core.channels import CollectingOutputChannel, UserMessage
17
17
  from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
18
18
  from rasa.core.exceptions import AgentNotReady
19
- from rasa.core.persistor import StorageType
20
19
  from rasa.core.utils import AvailableEndpoints
21
20
  from rasa.e2e_test.constants import TEST_CASE_NAME, TEST_FILE_NAME
22
21
  from rasa.e2e_test.e2e_config import create_llm_judge_config
@@ -35,6 +34,7 @@ from rasa.e2e_test.e2e_test_result import (
35
34
  TestResult,
36
35
  )
37
36
  from rasa.llm_fine_tuning.conversations import Conversation
37
+ from rasa.nlu.persistor import StorageType
38
38
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
39
39
  from rasa.shared.core.events import (
40
40
  ActionExecuted,
rasa/e2e_test/utils/io.py CHANGED
@@ -346,7 +346,7 @@ def read_test_cases(path: str) -> TestSuite:
346
346
  beta_flag_verified = False
347
347
 
348
348
  for test_file in test_files:
349
- test_file_content = parse_raw_yaml(Path(test_file).read_text())
349
+ test_file_content = parse_raw_yaml(Path(test_file).read_text(encoding="utf-8"))
350
350
 
351
351
  validate_yaml_data_using_schema_with_assertions(
352
352
  yaml_data=test_file_content, schema_content=e2e_test_schema
@@ -506,6 +506,8 @@ def transform_results_output_to_yaml(yaml_string: str) -> str:
506
506
  result.append(s)
507
507
  elif s.startswith("\n"):
508
508
  result.append(s.strip())
509
+ elif s.strip().startswith("#"):
510
+ continue
509
511
  else:
510
512
  result.append(s)
511
513
  return "".join(result)
rasa/engine/graph.py CHANGED
@@ -634,3 +634,4 @@ class GraphModelConfiguration:
634
634
  language: Optional[Text]
635
635
  core_target: Optional[Text]
636
636
  nlu_target: Optional[Text]
637
+ spaces: Optional[Dict[Text, Text]] = None
@@ -35,6 +35,9 @@ pipeline:
35
35
  policies:
36
36
  - name: MemoizationPolicy
37
37
  - name: RulePolicy
38
+ - name: UnexpecTEDIntentPolicy
39
+ max_history: 5
40
+ epochs: 100
38
41
  - name: TEDPolicy
39
42
  max_history: 5
40
43
  epochs: 100
@@ -233,6 +233,7 @@ class DefaultV1Recipe(Recipe):
233
233
  training_type=training_type,
234
234
  assistant_id=config.get(ASSISTANT_ID_KEY),
235
235
  language=config.get("language"),
236
+ spaces=config.get("spaces"),
236
237
  core_target=core_target,
237
238
  nlu_target=f"run_{RegexMessageHandler.__name__}",
238
239
  )
@@ -73,6 +73,7 @@ class GraphV1Recipe(Recipe):
73
73
  training_type=training_type,
74
74
  assistant_id=config.get(ASSISTANT_ID_KEY),
75
75
  language=config.get("language"),
76
+ spaces=config.get("spaces"),
76
77
  core_target=core_target,
77
78
  nlu_target=nlu_target,
78
79
  )
@@ -238,6 +238,7 @@ class LocalModelStorage(ModelStorage):
238
238
  predict_schema=model_configuration.predict_schema,
239
239
  training_type=model_configuration.training_type,
240
240
  project_fingerprint=rasa.model.project_fingerprint(),
241
+ spaces=model_configuration.spaces,
241
242
  language=model_configuration.language,
242
243
  core_target=model_configuration.core_target,
243
244
  nlu_target=model_configuration.nlu_target,