rasa-pro 3.11.2__py3-none-any.whl → 3.11.3a1.dev1__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 (35) hide show
  1. rasa/cli/studio/actions.py +48 -0
  2. rasa/cli/studio/studio.py +2 -0
  3. rasa/core/actions/direct_custom_actions_executor.py +31 -2
  4. rasa/core/channels/development_inspector.py +3 -0
  5. rasa/core/channels/socketio.py +5 -0
  6. rasa/dialogue_understanding/generator/command_generator.py +126 -5
  7. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +28 -1
  8. rasa/dialogue_understanding/generator/nlu_command_adapter.py +3 -0
  9. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +9 -1
  10. rasa/dialogue_understanding/utils.py +14 -0
  11. rasa/dialogue_understanding_test/__init__.py +0 -0
  12. rasa/dialogue_understanding_test/constants.py +15 -0
  13. rasa/dialogue_understanding_test/du_test_case.py +118 -0
  14. rasa/dialogue_understanding_test/du_test_result.py +11 -0
  15. rasa/e2e_test/e2e_test_case.py +2 -1
  16. rasa/e2e_test/utils/io.py +1 -1
  17. rasa/e2e_test/utils/validation.py +100 -2
  18. rasa/engine/recipes/default_recipe.py +63 -49
  19. rasa/engine/recipes/graph_recipe.py +8 -7
  20. rasa/model_manager/runner_service.py +1 -0
  21. rasa/model_manager/socket_bridge.py +29 -7
  22. rasa/model_training.py +2 -1
  23. rasa/shared/constants.py +17 -5
  24. rasa/shared/nlu/constants.py +4 -0
  25. rasa/studio/actions.py +147 -0
  26. rasa/studio/upload.py +19 -5
  27. rasa/telemetry.py +40 -33
  28. rasa/tracing/instrumentation/attribute_extractors.py +10 -9
  29. rasa/validator.py +32 -29
  30. rasa/version.py +1 -1
  31. {rasa_pro-3.11.2.dist-info → rasa_pro-3.11.3a1.dev1.dist-info}/METADATA +4 -4
  32. {rasa_pro-3.11.2.dist-info → rasa_pro-3.11.3a1.dev1.dist-info}/RECORD +35 -28
  33. {rasa_pro-3.11.2.dist-info → rasa_pro-3.11.3a1.dev1.dist-info}/NOTICE +0 -0
  34. {rasa_pro-3.11.2.dist-info → rasa_pro-3.11.3a1.dev1.dist-info}/WHEEL +0 -0
  35. {rasa_pro-3.11.2.dist-info → rasa_pro-3.11.3a1.dev1.dist-info}/entry_points.txt +0 -0
rasa/studio/actions.py ADDED
@@ -0,0 +1,147 @@
1
+ import argparse
2
+ import asyncio
3
+ import json
4
+ from typing import Any, Dict, Optional, Tuple
5
+ from urllib.parse import urlparse, urlunparse
6
+
7
+ import socketio
8
+ import structlog
9
+
10
+ import rasa.cli.utils
11
+ import rasa.shared.utils.cli
12
+ from rasa.studio.auth import KeycloakToken, KeycloakTokenReader
13
+ from rasa.studio.config import StudioConfig
14
+ from rasa_sdk.executor import ActionExecutor, ActionMissingDomainException
15
+
16
+ from rasa.studio.upload import is_auth_working
17
+
18
+ structlogger = structlog.get_logger()
19
+
20
+
21
+ def handle_actions(args: argparse.Namespace) -> None:
22
+ assistant_name = args.assistant_name[0]
23
+ studio_config = StudioConfig.read_config()
24
+ endpoint = studio_config.studio_url
25
+ verify = not studio_config.disable_verify
26
+
27
+ if not endpoint:
28
+ rasa.shared.utils.cli.print_error_and_exit(
29
+ "No GraphQL endpoint found in config. Please run `rasa studio config`."
30
+ )
31
+
32
+ executor = load_executor(args.actions)
33
+
34
+ parsed_url = urlparse(endpoint)
35
+ websocket_url = urlunparse((parsed_url.scheme, parsed_url.netloc, "", "", "", ""))
36
+
37
+ if not is_auth_working(endpoint, verify):
38
+ rasa.shared.utils.cli.print_error_and_exit(
39
+ "Authentication is invalid or expired. Please run `rasa studio login`."
40
+ )
41
+ return
42
+
43
+ asyncio.run(open_webhook(websocket_url, assistant_name, executor))
44
+
45
+
46
+ def auth_header(token: KeycloakToken) -> Dict[str, Any]:
47
+ return {"Authorization": f"{token.token_type} {token.access_token}"}
48
+
49
+
50
+ def parse_webhook(plaintext: str) -> Dict[str, Any]:
51
+ request = json.loads(plaintext)
52
+ structlogger.debug("reverse.proxy.webhook.parse", request=request)
53
+ return request
54
+
55
+
56
+ async def open_webhook(
57
+ endpoint: str, assistant_name: str, executor: ActionExecutor
58
+ ) -> Tuple[str, bool]:
59
+ """Makes a request to the studio endpoint to upload data.
60
+
61
+ Args:
62
+ endpoint: The studio endpoint
63
+ assistant_name: The name of the assistant
64
+ executor: The action executor
65
+ """
66
+ token = KeycloakTokenReader().get_token()
67
+
68
+ sio = socketio.AsyncClient(reconnection=True)
69
+ headers = auth_header(token)
70
+
71
+ @sio.on("message")
72
+ async def handle_action_call(data: Optional[Dict[str, Any]]):
73
+ structlogger.debug("reverse.proxy.webhook.handle_action_call")
74
+ if not data:
75
+ structlogger.error(
76
+ "reverse.proxy.webhook.handle_action_call.invalid_request", data=data
77
+ )
78
+ status = 400
79
+ response = {"error": "Invalid request, missing body."}
80
+ else:
81
+ status, response = await trigger_action(data, executor, auto_reload=True)
82
+ return {"response": response, "status": status}
83
+
84
+ @sio.on("disconnect")
85
+ async def disconnect():
86
+ structlogger.info(
87
+ "reverse.proxy.webhook.handle_disconnect",
88
+ event_info=(
89
+ "Disconnected from the server, this "
90
+ "can happen if the server is either unavailable "
91
+ "or if the authentication token has expired."
92
+ ),
93
+ )
94
+
95
+ await sio.connect(
96
+ endpoint + "?assistantName=" + assistant_name,
97
+ socketio_path="/api/v1/websocket-actions",
98
+ headers=headers,
99
+ )
100
+
101
+ rasa.shared.utils.cli.print_success("Started action server, waiting for requests")
102
+ await sio.wait()
103
+
104
+
105
+ def load_executor(action_package_name: str) -> ActionExecutor:
106
+ executor = ActionExecutor()
107
+ executor.register_package(action_package_name)
108
+ return executor
109
+
110
+
111
+ async def trigger_action(
112
+ action_call: Dict[str, Any], executor: ActionExecutor, auto_reload: bool = False
113
+ ) -> Tuple[int, Dict[str, Any]]:
114
+ from rasa_sdk import utils
115
+ from rasa_sdk.interfaces import ActionExecutionRejection, ActionNotFoundException
116
+
117
+ utils.check_version_compatibility(action_call.get("version"))
118
+
119
+ if auto_reload:
120
+ executor.reload()
121
+ try:
122
+ result = await executor.run(action_call)
123
+ return 200, result.model_dump() if result else None
124
+ except ActionExecutionRejection as e:
125
+ structlogger.debug(
126
+ "reverse.proxy.webhook.trigger_action.rejection",
127
+ error=e.message,
128
+ action_name=e.action_name,
129
+ )
130
+ body = {"error": e.message, "action_name": e.action_name}
131
+ return 404, body
132
+ except ActionMissingDomainException as e:
133
+ structlogger.debug(
134
+ "reverse.proxy.webhook.trigger_action.missing_domain",
135
+ error=e.message,
136
+ action_name=e.action_name,
137
+ )
138
+ body = {"error": e.message, "action_name": e.action_name}
139
+ return 449, body
140
+ except ActionNotFoundException as e:
141
+ structlogger.error(
142
+ "reverse.proxy.webhook.trigger_action.not_found",
143
+ error=e.message,
144
+ action_name=e.action_name,
145
+ )
146
+ body = {"error": e.message, "action_name": e.action_name}
147
+ return 404, body
rasa/studio/upload.py CHANGED
@@ -2,7 +2,7 @@ import argparse
2
2
  import base64
3
3
  import re
4
4
  import sys
5
- from typing import Dict, Iterable, List, Set, Text, Tuple, Union, Any
5
+ from typing import Any, Dict, Iterable, List, Set, Text, Tuple, Union
6
6
 
7
7
  import questionary
8
8
  import requests
@@ -13,13 +13,19 @@ import rasa.cli.utils
13
13
  import rasa.shared.utils.cli
14
14
  import rasa.shared.utils.io
15
15
  from rasa.shared.constants import (
16
- DEFAULT_DOMAIN_PATHS,
16
+ CONFIG_LANGUAGE_KEY,
17
+ CONFIG_LLM_KEY,
18
+ CONFIG_MODEL_NAME_KEY,
19
+ CONFIG_PIPELINE_KEY,
20
+ CONFIG_POLICIES_KEY,
21
+ CONFIG_RECIPE_KEY,
17
22
  DEFAULT_CONFIG_PATH,
23
+ DEFAULT_DOMAIN_PATHS,
18
24
  )
19
25
  from rasa.shared.core.domain import Domain
20
26
  from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader, YamlFlowsWriter
21
27
  from rasa.shared.exceptions import RasaException
22
- from rasa.shared.importers.importer import TrainingDataImporter, FlowSyncImporter
28
+ from rasa.shared.importers.importer import FlowSyncImporter, TrainingDataImporter
23
29
  from rasa.shared.nlu.training_data.formats.rasa_yaml import (
24
30
  RasaYAMLReader,
25
31
  RasaYAMLWriter,
@@ -131,13 +137,11 @@ def handle_upload(args: argparse.Namespace) -> None:
131
137
  rasa.shared.utils.cli.print_error_and_exit(
132
138
  "No GraphQL endpoint found in config. Please run `rasa studio config`."
133
139
  )
134
- return
135
140
 
136
141
  if not is_auth_working(endpoint, verify):
137
142
  rasa.shared.utils.cli.print_error_and_exit(
138
143
  "Authentication is invalid or expired. Please run `rasa studio login`."
139
144
  )
140
- return
141
145
 
142
146
  structlogger.info("rasa.studio.upload.loading_data", event_info="Loading data...")
143
147
 
@@ -160,6 +164,16 @@ def handle_upload(args: argparse.Namespace) -> None:
160
164
  upload_nlu_assistant(args, endpoint, verify=verify)
161
165
 
162
166
 
167
+ config_keys = [
168
+ CONFIG_RECIPE_KEY,
169
+ CONFIG_POLICIES_KEY,
170
+ CONFIG_PIPELINE_KEY,
171
+ CONFIG_LANGUAGE_KEY,
172
+ CONFIG_LLM_KEY,
173
+ CONFIG_MODEL_NAME_KEY,
174
+ ]
175
+
176
+
163
177
  def extract_values(data: Dict, keys: List[Text]) -> Dict:
164
178
  """Extracts values for given keys from a dictionary."""
165
179
  return {key: data.get(key) for key in keys if data.get(key)}
rasa/telemetry.py CHANGED
@@ -32,34 +32,41 @@ from rasa.constants import (
32
32
  CONFIG_TELEMETRY_ENABLED,
33
33
  CONFIG_TELEMETRY_ID,
34
34
  )
35
+ from rasa.engine.storage.local_model_storage import LocalModelStorage
35
36
  from rasa.shared.constants import (
36
- PROMPT_CONFIG_KEY,
37
- PROMPT_TEMPLATE_CONFIG_KEY,
38
- LLM_API_HEALTH_CHECK_ENV_VAR,
37
+ CONFIG_LANGUAGE_KEY,
38
+ CONFIG_PIPELINE_KEY,
39
+ CONFIG_POLICIES_KEY,
40
+ CONFIG_PREDICT_SCHEMA,
41
+ CONFIG_RECIPE_KEY,
42
+ CONFIG_TRAIN_SCHEMA,
43
+ DOCS_URL_TELEMETRY,
39
44
  LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
45
+ LLM_API_HEALTH_CHECK_ENV_VAR,
40
46
  MODEL_GROUP_CONFIG_KEY,
47
+ PROMPT_CONFIG_KEY,
48
+ PROMPT_TEMPLATE_CONFIG_KEY,
49
+ UTTER_ASK_PREFIX,
41
50
  )
42
- from rasa.engine.storage.local_model_storage import LocalModelStorage
43
- from rasa.shared.constants import DOCS_URL_TELEMETRY, UTTER_ASK_PREFIX
44
51
  from rasa.shared.core.flows import Flow
45
52
  from rasa.shared.core.flows.steps import (
53
+ CallFlowStep,
46
54
  CollectInformationFlowStep,
47
- SetSlotsFlowStep,
48
55
  LinkFlowStep,
49
- CallFlowStep,
56
+ SetSlotsFlowStep,
50
57
  )
51
58
  from rasa.shared.exceptions import RasaException
52
59
  from rasa.utils import common as rasa_utils
53
60
 
54
61
  if typing.TYPE_CHECKING:
62
+ from rasa.core.agent import Agent
55
63
  from rasa.core.brokers.broker import EventBroker
56
- from rasa.core.tracker_store import TrackerStore
57
64
  from rasa.core.channels.channel import InputChannel
58
- from rasa.core.agent import Agent
59
- from rasa.shared.nlu.training_data.training_data import TrainingData
60
- from rasa.shared.importers.importer import TrainingDataImporter
65
+ from rasa.core.tracker_store import TrackerStore
61
66
  from rasa.core.utils import AvailableEndpoints
62
- from rasa.e2e_test.e2e_test_case import TestCase, Fixture, Metadata
67
+ from rasa.e2e_test.e2e_test_case import Fixture, Metadata, TestCase
68
+ from rasa.shared.importers.importer import TrainingDataImporter
69
+ from rasa.shared.nlu.training_data.training_data import TrainingData
63
70
 
64
71
  logger = logging.getLogger(__name__)
65
72
 
@@ -352,6 +359,7 @@ def _fetch_write_key(tool: Text, environment_variable: Text) -> Optional[Text]:
352
359
  write key, if a key was present.
353
360
  """
354
361
  import importlib_resources
362
+
355
363
  from rasa import __name__ as name
356
364
 
357
365
  if os.environ.get(environment_variable):
@@ -602,7 +610,7 @@ def _default_context_fields() -> Dict[Text, Any]:
602
610
  Return:
603
611
  A new context containing information about the runtime environment.
604
612
  """
605
- from rasa.utils.licensing import property_of_active_license, get_license_hash
613
+ from rasa.utils.licensing import get_license_hash, property_of_active_license
606
614
 
607
615
  global TELEMETRY_CONTEXT
608
616
 
@@ -962,13 +970,13 @@ def track_model_training(
962
970
  training_id = uuid.uuid4().hex
963
971
 
964
972
  tracking_data = {
965
- "language": config.get("language"),
973
+ "language": config.get(CONFIG_LANGUAGE_KEY),
966
974
  "training_id": training_id,
967
975
  "type": model_type,
968
- "pipeline": config.get("pipeline"),
969
- "policies": config.get("policies"),
970
- "train_schema": config.get("train_schema"),
971
- "predict_schema": config.get("predict_schema"),
976
+ "pipeline": config.get(CONFIG_PIPELINE_KEY),
977
+ "policies": config.get(CONFIG_POLICIES_KEY),
978
+ "train_schema": config.get(CONFIG_TRAIN_SCHEMA),
979
+ "predict_schema": config.get(CONFIG_PREDICT_SCHEMA),
972
980
  "model_groups": rasa.core.utils.AvailableEndpoints.get_instance().model_groups,
973
981
  "api_health_check_enabled": (
974
982
  os.getenv(
@@ -995,7 +1003,7 @@ def track_model_training(
995
1003
  "num_synonyms": len(nlu_data.entity_synonyms),
996
1004
  "num_regexes": len(nlu_data.regex_features),
997
1005
  "is_finetuning": is_finetuning,
998
- "recipe": config.get("recipe"),
1006
+ "recipe": config.get(CONFIG_RECIPE_KEY),
999
1007
  }
1000
1008
 
1001
1009
  flow_statistics = _collect_flow_statistics(flows.underlying_flows)
@@ -1096,28 +1104,28 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1096
1104
  Includes the model name, whether a custom prompt is used, whether flow
1097
1105
  retrieval is enabled, and flow retrieval embedding model.
1098
1106
  """
1099
- from rasa.shared.constants import (
1100
- EMBEDDINGS_CONFIG_KEY,
1101
- MODEL_CONFIG_KEY,
1102
- MODEL_NAME_CONFIG_KEY,
1103
- )
1104
1107
  from rasa.dialogue_understanding.generator import (
1105
1108
  LLMCommandGenerator,
1106
- SingleStepLLMCommandGenerator,
1107
1109
  MultiStepLLMCommandGenerator,
1108
- )
1109
- from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_generator import ( # noqa: E501
1110
- HANDLE_FLOWS_KEY,
1111
- FILL_SLOTS_KEY,
1110
+ SingleStepLLMCommandGenerator,
1112
1111
  )
1113
1112
  from rasa.dialogue_understanding.generator.constants import (
1114
- LLM_CONFIG_KEY,
1115
1113
  DEFAULT_LLM_CONFIG,
1116
1114
  FLOW_RETRIEVAL_KEY,
1115
+ LLM_CONFIG_KEY,
1117
1116
  )
1118
1117
  from rasa.dialogue_understanding.generator.flow_retrieval import (
1119
1118
  DEFAULT_EMBEDDINGS_CONFIG,
1120
1119
  )
1120
+ from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_generator import ( # noqa: E501
1121
+ FILL_SLOTS_KEY,
1122
+ HANDLE_FLOWS_KEY,
1123
+ )
1124
+ from rasa.shared.constants import (
1125
+ EMBEDDINGS_CONFIG_KEY,
1126
+ MODEL_CONFIG_KEY,
1127
+ MODEL_NAME_CONFIG_KEY,
1128
+ )
1121
1129
 
1122
1130
  def find_command_generator_component(pipeline: List) -> Optional[Dict]:
1123
1131
  """Finds the LLMCommandGenerator component in the pipeline."""
@@ -1204,7 +1212,7 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1204
1212
  FLOW_RETRIEVAL_EMBEDDING_MODEL_GROUP_ID: None,
1205
1213
  }
1206
1214
 
1207
- pipeline = config.get("pipeline", [])
1215
+ pipeline = config.get(CONFIG_PIPELINE_KEY, [])
1208
1216
  if not isinstance(pipeline, list):
1209
1217
  return command_generator_config
1210
1218
 
@@ -1386,8 +1394,7 @@ def track_inspect_started(model_type: Text) -> None:
1386
1394
  """Track when a user starts a bot using rasa inspect.
1387
1395
 
1388
1396
  Args:
1389
- channel: Channel name `socketio` (used for chat assistants)
1390
- or `browser_audio` (used for voice).
1397
+ model_type: Type of the model, core / nlu or rasa.
1391
1398
  """
1392
1399
  _track(TELEMETRY_INSPECT_STARTED_EVENT, {"type": model_type})
1393
1400
 
@@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
5
5
 
6
6
  import tiktoken
7
7
  from numpy import ndarray
8
- from rasa.dialogue_understanding.generator.constants import FLOW_RETRIEVAL_KEY
9
8
  from rasa_sdk.grpc_py import action_webhook_pb2
10
9
 
11
10
  from rasa.core.actions.action import DirectCustomActionExecutor
@@ -19,24 +18,27 @@ from rasa.core.nlg.contextual_response_rephraser import ContextualResponseRephra
19
18
  from rasa.core.processor import MessageProcessor
20
19
  from rasa.core.tracker_store import TrackerStore
21
20
  from rasa.dialogue_understanding.commands import Command
22
- from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
23
21
  from rasa.dialogue_understanding.generator import LLMBasedCommandGenerator
22
+ from rasa.dialogue_understanding.generator.constants import FLOW_RETRIEVAL_KEY
23
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
24
24
  from rasa.engine.graph import ExecutionContext, GraphModelConfiguration, GraphNode
25
25
  from rasa.engine.training.graph_trainer import GraphTrainer
26
26
  from rasa.shared.constants import (
27
+ CONFIG_RECIPE_KEY,
28
+ DEPLOYMENT_CONFIG_KEY,
27
29
  EMBEDDINGS_CONFIG_KEY,
30
+ LLM_CONFIG_KEY,
28
31
  MODEL_CONFIG_KEY,
32
+ MODEL_GROUP_ID_CONFIG_KEY,
29
33
  PROVIDER_CONFIG_KEY,
30
34
  TIMEOUT_CONFIG_KEY,
31
- DEPLOYMENT_CONFIG_KEY,
32
- MODEL_GROUP_ID_CONFIG_KEY,
33
- LLM_CONFIG_KEY,
34
35
  )
35
36
  from rasa.shared.core.constants import REQUESTED_SLOT
36
37
  from rasa.shared.core.domain import Domain
37
38
  from rasa.shared.core.events import DialogueStackUpdated, Event
38
39
  from rasa.shared.core.flows import Flow, FlowsList, FlowStep
39
40
  from rasa.shared.core.trackers import DialogueStateTracker
41
+ from rasa.shared.core.training_data.structures import StoryGraph
40
42
  from rasa.shared.importers.importer import TrainingDataImporter
41
43
  from rasa.shared.nlu.constants import INTENT_NAME_KEY, SET_SLOT_COMMAND
42
44
  from rasa.shared.utils.llm import (
@@ -46,7 +48,6 @@ from rasa.tracing.constants import (
46
48
  PROMPT_TOKEN_LENGTH_ATTRIBUTE_NAME,
47
49
  REQUEST_BODY_SIZE_IN_BYTES_ATTRIBUTE_NAME,
48
50
  )
49
- from rasa.shared.core.training_data.structures import StoryGraph
50
51
 
51
52
  if TYPE_CHECKING:
52
53
  from langchain.llms.base import BaseLLM
@@ -255,7 +256,7 @@ def extract_attrs_for_graph_trainer(
255
256
  return {
256
257
  "training_type": model_configuration.training_type.model_type,
257
258
  "language": model_configuration.language,
258
- "recipe_name": importer.get_config().get("recipe"),
259
+ "recipe_name": importer.get_config().get(CONFIG_RECIPE_KEY),
259
260
  "output_filename": output_filename.name,
260
261
  "is_finetuning": is_finetuning,
261
262
  }
@@ -644,8 +645,8 @@ def extract_attrs_for_intentless_policy_generate_llm_answer(
644
645
  self: "IntentlessPolicy", llm: "BaseLLM", prompt: str
645
646
  ) -> Dict[str, Any]:
646
647
  from rasa.core.policies.intentless_policy import (
647
- DEFAULT_LLM_CONFIG,
648
648
  DEFAULT_EMBEDDINGS_CONFIG,
649
+ DEFAULT_LLM_CONFIG,
649
650
  )
650
651
 
651
652
  attributes = extract_llm_config(
@@ -661,8 +662,8 @@ def extract_attrs_for_enterprise_search_generate_llm_answer(
661
662
  self: "EnterpriseSearchPolicy", llm: "BaseLLM", prompt: str
662
663
  ) -> Dict[str, Any]:
663
664
  from rasa.core.policies.enterprise_search_policy import (
664
- DEFAULT_LLM_CONFIG,
665
665
  DEFAULT_EMBEDDINGS_CONFIG,
666
+ DEFAULT_LLM_CONFIG,
666
667
  )
667
668
 
668
669
  attributes = extract_llm_config(
rasa/validator.py CHANGED
@@ -3,54 +3,60 @@ import re
3
3
  import string
4
4
  import sys
5
5
  from collections import defaultdict
6
- from typing import Set, Text, Optional, Dict, Any, List, Tuple
6
+ from typing import Any, Dict, List, Optional, Set, Text, Tuple
7
7
 
8
8
  import structlog
9
9
  from jinja2 import Template
10
10
  from pypred import Predicate
11
- from pypred.ast import Literal, CompareOperator, NegateOperator
11
+ from pypred.ast import CompareOperator, Literal, NegateOperator
12
12
 
13
13
  import rasa.core.training.story_conflict
14
+ import rasa.shared.nlu.constants
15
+ import rasa.shared.utils.cli
16
+ import rasa.shared.utils.io
14
17
  from rasa.core.channels import UserMessage
15
18
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
16
- from rasa.shared.core.command_payload_reader import (
17
- CommandPayloadReader,
18
- MAX_NUMBER_OF_SLOTS,
19
- )
20
- from rasa.shared.core.flows.flow_step_links import IfFlowStepLink
21
- from rasa.shared.core.flows.steps.set_slots import SetSlotsFlowStep
22
- from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
23
- from rasa.shared.core.flows.steps.action import ActionFlowStep
24
- from rasa.shared.core.flows.steps.link import LinkFlowStep
25
- from rasa.shared.core.flows import FlowsList
26
- from rasa.shared.core.flows.utils import (
27
- warn_deprecated_collect_step_config,
28
- get_duplicate_slot_persistence_config_error_message,
29
- get_invalid_slot_persistence_config_error_message,
30
- )
31
- import rasa.shared.nlu.constants
32
19
  from rasa.shared.constants import (
33
20
  ASSISTANT_ID_DEFAULT_VALUE,
34
21
  ASSISTANT_ID_KEY,
35
22
  CONFIG_MANDATORY_KEYS,
23
+ CONFIG_PIPELINE_KEY,
24
+ DOCS_URL_ACTIONS,
36
25
  DOCS_URL_DOMAIN,
37
26
  DOCS_URL_DOMAINS,
38
27
  DOCS_URL_FORMS,
39
28
  DOCS_URL_RESPONSES,
40
- UTTER_PREFIX,
41
- DOCS_URL_ACTIONS,
42
29
  REQUIRED_SLOTS_KEY,
30
+ UTTER_PREFIX,
43
31
  )
44
32
  from rasa.shared.core import constants
45
- from rasa.shared.core.constants import MAPPING_CONDITIONS, ACTIVE_LOOP
46
- from rasa.shared.core.events import ActionExecuted, ActiveLoop
47
- from rasa.shared.core.events import UserUttered
33
+ from rasa.shared.core.command_payload_reader import (
34
+ MAX_NUMBER_OF_SLOTS,
35
+ CommandPayloadReader,
36
+ )
37
+ from rasa.shared.core.constants import (
38
+ ACTIVE_LOOP,
39
+ MAPPING_CONDITIONS,
40
+ MAPPING_TYPE,
41
+ SlotMappingType,
42
+ )
48
43
  from rasa.shared.core.domain import (
49
- Domain,
50
44
  RESPONSE_KEYS_TO_INTERPOLATE,
45
+ Domain,
46
+ )
47
+ from rasa.shared.core.events import ActionExecuted, ActiveLoop, UserUttered
48
+ from rasa.shared.core.flows import FlowsList
49
+ from rasa.shared.core.flows.flow_step_links import IfFlowStepLink
50
+ from rasa.shared.core.flows.steps.action import ActionFlowStep
51
+ from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
52
+ from rasa.shared.core.flows.steps.link import LinkFlowStep
53
+ from rasa.shared.core.flows.steps.set_slots import SetSlotsFlowStep
54
+ from rasa.shared.core.flows.utils import (
55
+ get_duplicate_slot_persistence_config_error_message,
56
+ get_invalid_slot_persistence_config_error_message,
57
+ warn_deprecated_collect_step_config,
51
58
  )
52
59
  from rasa.shared.core.generator import TrainingDataGenerator
53
- from rasa.shared.core.constants import SlotMappingType, MAPPING_TYPE
54
60
  from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, ListSlot, Slot
55
61
  from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
56
62
  YAMLStoryReader,
@@ -62,9 +68,6 @@ from rasa.shared.nlu.constants import COMMANDS
62
68
  from rasa.shared.nlu.training_data.message import Message
63
69
  from rasa.shared.nlu.training_data.training_data import TrainingData
64
70
 
65
- import rasa.shared.utils.cli
66
- import rasa.shared.utils.io
67
-
68
71
  logger = logging.getLogger(__name__)
69
72
  structlogger = structlog.get_logger()
70
73
 
@@ -1502,7 +1505,7 @@ class Validator:
1502
1505
  contains_nlu_command_adapter = any(
1503
1506
  [
1504
1507
  component.get("name") == "NLUCommandAdapter"
1505
- for component in self.config.get("pipeline", [])
1508
+ for component in self.config.get(CONFIG_PIPELINE_KEY, [])
1506
1509
  ]
1507
1510
  )
1508
1511
 
rasa/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # this file will automatically be changed,
2
2
  # do not add anything but the version number here!
3
- __version__ = "3.11.2"
3
+ __version__ = "3.11.3a1.dev1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-pro
3
- Version: 3.11.2
3
+ Version: 3.11.3a1.dev1
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
  Home-page: https://rasa.com
6
6
  Keywords: nlp,machine-learning,machine-learning-library,bot,bots,botkit,rasa conversational-agents,conversational-ai,chatbot,chatbot-framework,bot-framework
@@ -105,10 +105,10 @@ Requires-Dist: questionary (>=1.10.0,<2.1.0)
105
105
  Requires-Dist: randomname (>=0.2.1,<0.3.0)
106
106
  Requires-Dist: rasa-sdk (==3.11.0)
107
107
  Requires-Dist: redis (>=4.6.0,<6.0)
108
- Requires-Dist: regex (>=2022.10.31,<2022.11)
109
- Requires-Dist: requests (>=2.31.0,<2.32.0)
108
+ Requires-Dist: regex (>=2024.7.24,<2024.8.0)
109
+ Requires-Dist: requests (>=2.32.3,<2.33.0)
110
110
  Requires-Dist: rich (>=13.4.2,<14.0.0)
111
- Requires-Dist: rocketchat_API (>=1.30.0,<1.31.0)
111
+ Requires-Dist: rocketchat_API (>=1.32.0,<1.33.0)
112
112
  Requires-Dist: ruamel.yaml (>=0.17.21,<0.17.22)
113
113
  Requires-Dist: safetensors (>=0.4.5,<0.5.0)
114
114
  Requires-Dist: sanic (>=22.12,<22.13)