rasa-pro 3.14.0.dev4__py3-none-any.whl → 3.14.0.dev6__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/agents/agent_manager.py +6 -5
- rasa/agents/protocol/mcp/mcp_base_agent.py +8 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +14 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +15 -0
- rasa/agents/schemas/agent_tool_result.py +21 -5
- rasa/core/agent.py +3 -1
- rasa/core/policies/flows/flow_executor.py +17 -3
- rasa/shared/core/flows/flows_list.py +13 -3
- rasa/shared/core/flows/validation.py +131 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +9 -3
- rasa/shared/providers/llm/llm_response.py +18 -1
- rasa/shared/utils/mcp/server_connection.py +9 -0
- rasa/tracing/instrumentation/instrumentation.py +3 -1
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev6.dist-info}/METADATA +1 -1
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev6.dist-info}/RECORD +20 -20
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev6.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev6.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev6.dist-info}/entry_points.txt +0 -0
rasa/agents/agent_manager.py
CHANGED
|
@@ -8,6 +8,7 @@ from rasa.agents.core.types import AgentIdentifier, ProtocolType
|
|
|
8
8
|
from rasa.agents.schemas import AgentInput, AgentOutput
|
|
9
9
|
from rasa.core.available_agents import AgentConfig
|
|
10
10
|
from rasa.shared.agents.utils import make_agent_identifier
|
|
11
|
+
from rasa.shared.exceptions import AgentInitializationException
|
|
11
12
|
from rasa.utils.singleton import Singleton
|
|
12
13
|
|
|
13
14
|
structlogger = structlog.get_logger()
|
|
@@ -41,7 +42,7 @@ class AgentManager(metaclass=Singleton):
|
|
|
41
42
|
ValueError: If the agent is not connected.
|
|
42
43
|
"""
|
|
43
44
|
if agent_identifier not in self.agents:
|
|
44
|
-
raise ValueError(f"Agent {agent_identifier} not
|
|
45
|
+
raise ValueError(f"Agent {agent_identifier} is not available")
|
|
45
46
|
del self.agents[agent_identifier]
|
|
46
47
|
|
|
47
48
|
def get_agent(self, agent_name: str, protocol_type: ProtocolType) -> AgentProtocol:
|
|
@@ -59,7 +60,7 @@ class AgentManager(metaclass=Singleton):
|
|
|
59
60
|
"""
|
|
60
61
|
agent_identifier = make_agent_identifier(agent_name, protocol_type)
|
|
61
62
|
if agent_identifier not in self.agents:
|
|
62
|
-
raise ValueError(f"Agent {agent_identifier} not
|
|
63
|
+
raise ValueError(f"Agent {agent_identifier} is not available")
|
|
63
64
|
return self.agents[agent_identifier]
|
|
64
65
|
|
|
65
66
|
async def connect_agent(
|
|
@@ -100,7 +101,7 @@ class AgentManager(metaclass=Singleton):
|
|
|
100
101
|
agent_id=str(agent_identifier),
|
|
101
102
|
event_info=event_info,
|
|
102
103
|
)
|
|
103
|
-
raise
|
|
104
|
+
raise AgentInitializationException(e)
|
|
104
105
|
|
|
105
106
|
async def run_agent(
|
|
106
107
|
self, agent_name: str, protocol_type: ProtocolType, context: AgentInput
|
|
@@ -138,12 +139,12 @@ class AgentManager(metaclass=Singleton):
|
|
|
138
139
|
protocol_type: The protocol type of the agent.
|
|
139
140
|
|
|
140
141
|
Raises:
|
|
141
|
-
ValueError: If the agent is not
|
|
142
|
+
ValueError: If the agent is not available.
|
|
142
143
|
ConnectionError: If the agent disconnection fails.
|
|
143
144
|
"""
|
|
144
145
|
agent_identifier = make_agent_identifier(agent_name, protocol_type)
|
|
145
146
|
if agent_identifier not in self.agents:
|
|
146
|
-
raise ValueError(f"Agent {agent_identifier} not
|
|
147
|
+
raise ValueError(f"Agent {agent_identifier} is not available")
|
|
147
148
|
try:
|
|
148
149
|
await self.get_agent(agent_name, protocol_type).disconnect()
|
|
149
150
|
self._remove_agent(agent_identifier)
|
|
@@ -45,6 +45,7 @@ from rasa.shared.constants import (
|
|
|
45
45
|
TIMEOUT_CONFIG_KEY,
|
|
46
46
|
)
|
|
47
47
|
from rasa.shared.core.events import BotUttered, UserUttered
|
|
48
|
+
from rasa.shared.exceptions import AgentInitializationException
|
|
48
49
|
from rasa.shared.providers.llm.llm_response import LLMResponse, LLMToolCall
|
|
49
50
|
from rasa.shared.utils.constants import LOG_COMPONENT_SOURCE_METHOD_INIT
|
|
50
51
|
from rasa.shared.utils.llm import (
|
|
@@ -261,12 +262,19 @@ class MCPBaseAgent(AgentProtocol):
|
|
|
261
262
|
"mcp_agent.connect.failed_after_retries",
|
|
262
263
|
event_info="All connection attempts failed.",
|
|
263
264
|
)
|
|
265
|
+
raise AgentInitializationException(
|
|
266
|
+
f"Failed to connect to MCP servers after {self._max_retries} "
|
|
267
|
+
f"attempts. Agent `{self._name}` failed to initialize."
|
|
268
|
+
) from ce
|
|
264
269
|
except Exception as e:
|
|
265
270
|
structlogger.error(
|
|
266
271
|
"mcp_agent.connect.unexpected_exception",
|
|
267
272
|
event_info="Unexpected error during agent initialization.",
|
|
268
273
|
error=str(e),
|
|
274
|
+
agent_name=self._name,
|
|
275
|
+
agent_id=str(make_agent_identifier(self._name, self.protocol_type)),
|
|
269
276
|
)
|
|
277
|
+
raise AgentInitializationException(e) from e
|
|
270
278
|
|
|
271
279
|
async def connect_to_server(self, server_config: AgentMCPServerConfig) -> None:
|
|
272
280
|
server_name = server_config.name
|
|
@@ -228,6 +228,17 @@ class MCPOpenAgent(MCPBaseAgent):
|
|
|
228
228
|
tool_call.tool_args,
|
|
229
229
|
)
|
|
230
230
|
|
|
231
|
+
structlogger.debug(
|
|
232
|
+
"mcp_open_agent.send_message.tool_output",
|
|
233
|
+
tool_output=tool_output,
|
|
234
|
+
agent_name=self._name,
|
|
235
|
+
agent_id=str(
|
|
236
|
+
make_agent_identifier(
|
|
237
|
+
self._name, self.protocol_type
|
|
238
|
+
)
|
|
239
|
+
),
|
|
240
|
+
)
|
|
241
|
+
|
|
231
242
|
# If the tool call failed, generate an agent error output.
|
|
232
243
|
if tool_output.is_error or tool_output.result is None:
|
|
233
244
|
return self._generate_agent_error_output(
|
|
@@ -247,6 +258,9 @@ class MCPOpenAgent(MCPBaseAgent):
|
|
|
247
258
|
)
|
|
248
259
|
|
|
249
260
|
except Exception as e:
|
|
261
|
+
# TODO: To log the ProviderClientAPIException separately, so that
|
|
262
|
+
# malformed tool responses automatically trigger a retry, and are
|
|
263
|
+
# not cached.
|
|
250
264
|
structlogger.error(
|
|
251
265
|
"mcp_open_agent.send_message.error_in_agent_loop",
|
|
252
266
|
event_info=f"Failed to send message: {e}",
|
|
@@ -395,6 +395,18 @@ class MCPTaskAgent(MCPBaseAgent):
|
|
|
395
395
|
tool_call.tool_args,
|
|
396
396
|
)
|
|
397
397
|
|
|
398
|
+
structlogger.debug(
|
|
399
|
+
"mcp_task_agent.send_message.tool_output",
|
|
400
|
+
tool_output=tool_output,
|
|
401
|
+
tool_name=tool_call.tool_name,
|
|
402
|
+
agent_name=self._name,
|
|
403
|
+
agent_id=str(
|
|
404
|
+
make_agent_identifier(
|
|
405
|
+
self._name, self.protocol_type
|
|
406
|
+
)
|
|
407
|
+
),
|
|
408
|
+
)
|
|
409
|
+
|
|
398
410
|
# If the tool call failed, generate an agent error output.
|
|
399
411
|
if tool_output.is_error or tool_output.result is None:
|
|
400
412
|
return self._generate_agent_error_output(
|
|
@@ -440,6 +452,9 @@ class MCPTaskAgent(MCPBaseAgent):
|
|
|
440
452
|
)
|
|
441
453
|
|
|
442
454
|
except Exception as e:
|
|
455
|
+
# TODO: To log the ProviderClientAPIException separately, so that
|
|
456
|
+
# malformed tool responses automatically trigger a retry, and are
|
|
457
|
+
# not cached.
|
|
443
458
|
structlogger.error(
|
|
444
459
|
"mcp_task_agent.send_message.error_in_agent_loop",
|
|
445
460
|
event_info=f"Failed to send message: {e}",
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import json
|
|
2
1
|
from typing import Optional
|
|
3
2
|
|
|
4
3
|
from mcp.types import CallToolResult
|
|
@@ -11,6 +10,19 @@ class AgentToolResult(BaseModel):
|
|
|
11
10
|
is_error: bool = False
|
|
12
11
|
error_message: Optional[str] = None
|
|
13
12
|
|
|
13
|
+
def __str__(self) -> str:
|
|
14
|
+
"""Provide a clean string representation for logging."""
|
|
15
|
+
if self.is_error:
|
|
16
|
+
return (
|
|
17
|
+
f"AgentToolResult(tool_name='{self.tool_name}', "
|
|
18
|
+
f"error='{self.error_message}')"
|
|
19
|
+
)
|
|
20
|
+
return f"AgentToolResult(tool_name='{self.tool_name}', result={self.result})"
|
|
21
|
+
|
|
22
|
+
def __repr__(self) -> str:
|
|
23
|
+
"""Provide a detailed representation for debugging."""
|
|
24
|
+
return self.__str__()
|
|
25
|
+
|
|
14
26
|
@classmethod
|
|
15
27
|
def from_mcp_tool_result(
|
|
16
28
|
cls, tool_name: str, tool_result: CallToolResult
|
|
@@ -25,9 +37,15 @@ class AgentToolResult(BaseModel):
|
|
|
25
37
|
|
|
26
38
|
# try to use structured content if available
|
|
27
39
|
if tool_result.structuredContent:
|
|
40
|
+
if "result" in tool_result.structuredContent:
|
|
41
|
+
return cls(
|
|
42
|
+
tool_name=tool_name,
|
|
43
|
+
result=str(tool_result.structuredContent["result"]),
|
|
44
|
+
is_error=tool_result.isError,
|
|
45
|
+
)
|
|
28
46
|
return cls(
|
|
29
47
|
tool_name=tool_name,
|
|
30
|
-
result=
|
|
48
|
+
result=str(tool_result.structuredContent),
|
|
31
49
|
is_error=tool_result.isError,
|
|
32
50
|
)
|
|
33
51
|
# fallback to content if structured content is not available
|
|
@@ -36,9 +54,7 @@ class AgentToolResult(BaseModel):
|
|
|
36
54
|
# in the tool schema (if present)
|
|
37
55
|
return cls(
|
|
38
56
|
tool_name=tool_name,
|
|
39
|
-
result=
|
|
40
|
-
[content.model_dump() for content in tool_result.content]
|
|
41
|
-
),
|
|
57
|
+
result=str([content.model_dump() for content in tool_result.content]),
|
|
42
58
|
is_error=tool_result.isError,
|
|
43
59
|
)
|
|
44
60
|
# if no content is available, return None
|
rasa/core/agent.py
CHANGED
|
@@ -36,7 +36,7 @@ from rasa.privacy.privacy_manager import BackgroundPrivacyManager
|
|
|
36
36
|
from rasa.shared.constants import DEFAULT_SENDER_ID
|
|
37
37
|
from rasa.shared.core.domain import Domain
|
|
38
38
|
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
39
|
-
from rasa.shared.exceptions import RasaException
|
|
39
|
+
from rasa.shared.exceptions import AgentInitializationException, RasaException
|
|
40
40
|
from rasa.telemetry import track_privacy_enabled
|
|
41
41
|
from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
|
|
42
42
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -297,6 +297,8 @@ async def load_agent(
|
|
|
297
297
|
|
|
298
298
|
return agent
|
|
299
299
|
|
|
300
|
+
except AgentInitializationException as e:
|
|
301
|
+
raise e
|
|
300
302
|
except Exception as e:
|
|
301
303
|
logger.error(f"Could not load model due to {e}.", exc_info=True)
|
|
302
304
|
return agent
|
|
@@ -1148,10 +1148,24 @@ async def _call_agent_with_retry(
|
|
|
1148
1148
|
attempt=attempt + 1,
|
|
1149
1149
|
num_retries=max_retries,
|
|
1150
1150
|
)
|
|
1151
|
+
try:
|
|
1152
|
+
agent_response: AgentOutput = await AgentManager().run_agent(
|
|
1153
|
+
agent_name=agent_name, protocol_type=protocol_type, context=agent_input
|
|
1154
|
+
)
|
|
1155
|
+
except Exception as e:
|
|
1156
|
+
# We don't have a vaild agent response at this time to act based
|
|
1157
|
+
# on the agent status, so we return a fatal error.
|
|
1158
|
+
structlogger.error(
|
|
1159
|
+
"flow_executor.call_agent_with_retry.exception",
|
|
1160
|
+
agent_name=agent_name,
|
|
1161
|
+
error_message=str(e),
|
|
1162
|
+
)
|
|
1163
|
+
return AgentOutput(
|
|
1164
|
+
id=agent_name,
|
|
1165
|
+
status=AgentStatus.FATAL_ERROR,
|
|
1166
|
+
error_message=str(e),
|
|
1167
|
+
)
|
|
1151
1168
|
|
|
1152
|
-
agent_response: AgentOutput = await AgentManager().run_agent(
|
|
1153
|
-
agent_name=agent_name, protocol_type=protocol_type, context=agent_input
|
|
1154
|
-
)
|
|
1155
1169
|
if agent_response.status != AgentStatus.RECOVERABLE_ERROR:
|
|
1156
1170
|
return agent_response
|
|
1157
1171
|
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Any, Dict, Generator, List, Optional, Set, Text, Union
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Set, Text, Union
|
|
6
6
|
|
|
7
7
|
import rasa.shared.utils.io
|
|
8
8
|
from rasa.shared.core.flows import Flow
|
|
@@ -10,6 +10,7 @@ from rasa.shared.core.flows.flow_path import FlowPathsList
|
|
|
10
10
|
from rasa.shared.core.flows.validation import (
|
|
11
11
|
DuplicatedFlowIdException,
|
|
12
12
|
validate_call_steps,
|
|
13
|
+
validate_exit_if_conditions,
|
|
13
14
|
validate_flow,
|
|
14
15
|
validate_link_in_call_restriction,
|
|
15
16
|
validate_linked_flows_exists,
|
|
@@ -20,6 +21,9 @@ from rasa.shared.core.flows.validation import (
|
|
|
20
21
|
)
|
|
21
22
|
from rasa.shared.core.slots import Slot
|
|
22
23
|
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from rasa.shared.core.domain import Domain
|
|
26
|
+
|
|
23
27
|
|
|
24
28
|
@dataclass
|
|
25
29
|
class FlowsList:
|
|
@@ -160,8 +164,13 @@ class FlowsList:
|
|
|
160
164
|
else:
|
|
161
165
|
return None
|
|
162
166
|
|
|
163
|
-
def validate(self) -> None:
|
|
164
|
-
"""Validate the flows.
|
|
167
|
+
def validate(self, domain: Optional["Domain"] = None) -> None:
|
|
168
|
+
"""Validate the flows.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
domain: Optional domain containing slot definitions. If provided,
|
|
172
|
+
exit_if conditions will be validated against defined slots.
|
|
173
|
+
"""
|
|
165
174
|
for flow in self.underlying_flows:
|
|
166
175
|
validate_flow(flow)
|
|
167
176
|
validate_nlu_trigger(self.underlying_flows)
|
|
@@ -171,6 +180,7 @@ class FlowsList:
|
|
|
171
180
|
validate_patterns_are_not_called_or_linked(self)
|
|
172
181
|
validate_patterns_are_not_calling_or_linking_other_flows(self)
|
|
173
182
|
validate_step_ids_are_unique(self)
|
|
183
|
+
validate_exit_if_conditions(self, domain)
|
|
174
184
|
|
|
175
185
|
@property
|
|
176
186
|
def user_flow_ids(self) -> Set[str]:
|
|
@@ -6,6 +6,8 @@ from collections import defaultdict
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from typing import List, Optional, Set, Text
|
|
8
8
|
|
|
9
|
+
from jinja2 import Template
|
|
10
|
+
|
|
9
11
|
from rasa.shared.constants import (
|
|
10
12
|
RASA_DEFAULT_FLOW_PATTERN_PREFIX,
|
|
11
13
|
RASA_PATTERN_CHITCHAT,
|
|
@@ -35,6 +37,7 @@ from rasa.shared.core.flows.utils import (
|
|
|
35
37
|
from rasa.shared.exceptions import RasaException
|
|
36
38
|
|
|
37
39
|
if typing.TYPE_CHECKING:
|
|
40
|
+
from rasa.shared.core.domain import Domain
|
|
38
41
|
from rasa.shared.core.flows.flows_list import FlowsList
|
|
39
42
|
|
|
40
43
|
FLOW_ID_REGEX = r"""^[a-zA-Z0-9_][a-zA-Z0-9_-]*?$"""
|
|
@@ -107,6 +110,26 @@ class DuplicatedStepIdException(RasaException):
|
|
|
107
110
|
)
|
|
108
111
|
|
|
109
112
|
|
|
113
|
+
class InvalidExitIfConditionException(RasaException):
|
|
114
|
+
"""Raised when an exit_if condition is invalid."""
|
|
115
|
+
|
|
116
|
+
def __init__(self, step_id: str, flow_id: str, condition: str, reason: str) -> None:
|
|
117
|
+
"""Initializes the exception."""
|
|
118
|
+
self.step_id = step_id
|
|
119
|
+
self.flow_id = flow_id
|
|
120
|
+
self.condition = condition
|
|
121
|
+
self.reason = reason
|
|
122
|
+
|
|
123
|
+
def __str__(self) -> str:
|
|
124
|
+
"""Return a string representation of the exception."""
|
|
125
|
+
return (
|
|
126
|
+
f"Invalid exit_if condition '{self.condition}' in step '{self.step_id}' "
|
|
127
|
+
f"of flow '{self.flow_id}': {self.reason}. "
|
|
128
|
+
f"Please ensure that exit_if conditions contain at least one slot "
|
|
129
|
+
f"reference and use only defined slots with valid predicates."
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
110
133
|
class DuplicatedFlowIdException(RasaException):
|
|
111
134
|
"""Raised when a flow is using the same id as another flow."""
|
|
112
135
|
|
|
@@ -612,6 +635,64 @@ def validate_call_steps(flows: "FlowsList") -> None:
|
|
|
612
635
|
)
|
|
613
636
|
|
|
614
637
|
|
|
638
|
+
def validate_exit_if_conditions(
|
|
639
|
+
flows: "FlowsList", domain: Optional["Domain"] = None
|
|
640
|
+
) -> None:
|
|
641
|
+
"""Validates that exit_if conditions are valid.
|
|
642
|
+
|
|
643
|
+
This function validates:
|
|
644
|
+
- Each condition contains at least one slot reference
|
|
645
|
+
- Only defined slots are used within the conditions
|
|
646
|
+
- The predicates are valid
|
|
647
|
+
|
|
648
|
+
Args:
|
|
649
|
+
flows: The flows to validate.
|
|
650
|
+
domain: The domain with slot definitions. If None, slot validation is skipped.
|
|
651
|
+
|
|
652
|
+
Raises:
|
|
653
|
+
InvalidExitIfConditionException: If any exit_if condition is invalid.
|
|
654
|
+
"""
|
|
655
|
+
for flow in flows.underlying_flows:
|
|
656
|
+
for step in flow.steps:
|
|
657
|
+
if not isinstance(step, CallFlowStep) or not step.exit_if:
|
|
658
|
+
continue
|
|
659
|
+
|
|
660
|
+
for condition in step.exit_if:
|
|
661
|
+
if not isinstance(condition, str):
|
|
662
|
+
raise InvalidExitIfConditionException(
|
|
663
|
+
step.id, flow.id, str(condition), "Condition must be a string"
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
# Check if condition contains at least one slot reference
|
|
667
|
+
slot_references = re.findall(r"\bslots\.\w+", condition)
|
|
668
|
+
if not slot_references:
|
|
669
|
+
raise InvalidExitIfConditionException(
|
|
670
|
+
step.id,
|
|
671
|
+
flow.id,
|
|
672
|
+
condition,
|
|
673
|
+
"Condition must contain at least one slot reference "
|
|
674
|
+
"(e.g., 'slots.slot_name')",
|
|
675
|
+
)
|
|
676
|
+
|
|
677
|
+
# Validate slot names if domain is provided
|
|
678
|
+
if domain:
|
|
679
|
+
domain_slots = {slot.name: slot for slot in domain.slots}
|
|
680
|
+
for slot_ref in slot_references:
|
|
681
|
+
slot_name = slot_ref.split(".")[1]
|
|
682
|
+
if slot_name not in domain_slots:
|
|
683
|
+
raise InvalidExitIfConditionException(
|
|
684
|
+
step.id,
|
|
685
|
+
flow.id,
|
|
686
|
+
condition,
|
|
687
|
+
f"Slot '{slot_name}' is not defined in the domain",
|
|
688
|
+
)
|
|
689
|
+
|
|
690
|
+
# Validate predicate syntax using pypred
|
|
691
|
+
_validate_predicate_syntax_with_pypred(
|
|
692
|
+
step.id, flow.id, condition
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
|
|
615
696
|
def validate_linked_flows_exists(flows: "FlowsList") -> None:
|
|
616
697
|
"""Validates that all linked flows exist."""
|
|
617
698
|
for flow in flows.underlying_flows:
|
|
@@ -790,3 +871,53 @@ def validate_slot_persistence_configuration(flow: Flow) -> None:
|
|
|
790
871
|
result = _is_persist_slots_valid(persist_slots, flow_slots)
|
|
791
872
|
if not result.is_valid:
|
|
792
873
|
raise InvalidPersistSlotsException(flow_id, result.invalid_slots)
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
def _validate_predicate_syntax_with_pypred(
|
|
877
|
+
step_id: str, flow_id: str, condition: str
|
|
878
|
+
) -> None:
|
|
879
|
+
"""Validates predicate syntax using pypred.
|
|
880
|
+
|
|
881
|
+
This function validates that the exit_if condition has valid predicate syntax.
|
|
882
|
+
Pypred catches syntax errors like double operators, invalid expressions, etc.
|
|
883
|
+
|
|
884
|
+
Args:
|
|
885
|
+
step_id: The ID of the step containing the condition.
|
|
886
|
+
flow_id: The ID of the flow containing the step.
|
|
887
|
+
condition: The exit_if condition string.
|
|
888
|
+
|
|
889
|
+
Raises:
|
|
890
|
+
InvalidExitIfConditionException: If pypred detects syntax errors.
|
|
891
|
+
"""
|
|
892
|
+
try:
|
|
893
|
+
from pypred import Predicate
|
|
894
|
+
|
|
895
|
+
# Create a simple test context for syntax validation.
|
|
896
|
+
# This context works with all slot types since it's only used for:
|
|
897
|
+
# 1. Template rendering: Basic structure for Jinja2 template rendering
|
|
898
|
+
# 2. Syntax validation: Pypred validates predicate syntax
|
|
899
|
+
# without actual slot values
|
|
900
|
+
test_context = {"slots": {"test_slot": "test_value"}}
|
|
901
|
+
rendered_template = Template(condition).render(test_context)
|
|
902
|
+
|
|
903
|
+
# Let pypred validate the predicate syntax
|
|
904
|
+
predicate = Predicate(rendered_template)
|
|
905
|
+
if not predicate.is_valid():
|
|
906
|
+
raise InvalidExitIfConditionException(
|
|
907
|
+
step_id,
|
|
908
|
+
flow_id,
|
|
909
|
+
condition,
|
|
910
|
+
"Invalid predicate syntax",
|
|
911
|
+
)
|
|
912
|
+
|
|
913
|
+
except ImportError:
|
|
914
|
+
# pypred not available, skip validation
|
|
915
|
+
pass
|
|
916
|
+
except Exception as e:
|
|
917
|
+
# Re-raise pypred errors as predicate syntax errors
|
|
918
|
+
raise InvalidExitIfConditionException(
|
|
919
|
+
step_id,
|
|
920
|
+
flow_id,
|
|
921
|
+
condition,
|
|
922
|
+
f"Invalid predicate syntax: {e}",
|
|
923
|
+
)
|
rasa/shared/importers/rasa.py
CHANGED
|
@@ -74,7 +74,7 @@ class RasaFileImporter(TrainingDataImporter):
|
|
|
74
74
|
@cached_method
|
|
75
75
|
def get_flows(self) -> FlowsList:
|
|
76
76
|
"""Retrieves training stories / rules (see parent class for full docstring)."""
|
|
77
|
-
return utils.flows_from_paths(self._flow_files)
|
|
77
|
+
return utils.flows_from_paths(self._flow_files, self.get_domain())
|
|
78
78
|
|
|
79
79
|
@cached_method
|
|
80
80
|
def get_conversation_tests(self) -> StoryGraph:
|
rasa/shared/importers/utils.py
CHANGED
|
@@ -23,8 +23,14 @@ def story_graph_from_paths(
|
|
|
23
23
|
return StoryGraph(story_steps)
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def flows_from_paths(files: List[Text]) -> FlowsList:
|
|
27
|
-
"""Returns the flows from paths.
|
|
26
|
+
def flows_from_paths(files: List[Text], domain: Optional[Domain] = None) -> FlowsList:
|
|
27
|
+
"""Returns the flows from paths.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
files: List of flow file paths to load.
|
|
31
|
+
domain: Optional domain for validation. If provided, exit_if conditions
|
|
32
|
+
will be validated against defined slots.
|
|
33
|
+
"""
|
|
28
34
|
from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader
|
|
29
35
|
|
|
30
36
|
flows = FlowsList(underlying_flows=[])
|
|
@@ -32,5 +38,5 @@ def flows_from_paths(files: List[Text]) -> FlowsList:
|
|
|
32
38
|
flows = flows.merge(
|
|
33
39
|
YAMLFlowsReader.read_from_file(file), ignore_duplicates=False
|
|
34
40
|
)
|
|
35
|
-
flows.validate()
|
|
41
|
+
flows.validate(domain)
|
|
36
42
|
return flows
|
|
@@ -9,6 +9,7 @@ from litellm.utils import ChatCompletionMessageToolCall
|
|
|
9
9
|
from pydantic import BaseModel
|
|
10
10
|
|
|
11
11
|
from rasa.shared.constants import KEY_TOOL_CALLS
|
|
12
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
12
13
|
|
|
13
14
|
structlogger = structlog.get_logger()
|
|
14
15
|
|
|
@@ -66,10 +67,26 @@ class LLMToolCall(BaseModel):
|
|
|
66
67
|
@classmethod
|
|
67
68
|
def from_litellm(cls, data: ChatCompletionMessageToolCall) -> "LLMToolCall":
|
|
68
69
|
"""Creates an LLMToolResponse from a dictionary."""
|
|
70
|
+
try:
|
|
71
|
+
tool_args = json.loads(data.function.arguments)
|
|
72
|
+
except json.JSONDecodeError as e:
|
|
73
|
+
structlogger.error(
|
|
74
|
+
"llm_response.litellm_tool_call.invalid_arguments",
|
|
75
|
+
tool_name=data.function.name,
|
|
76
|
+
tool_call=data.function.arguments,
|
|
77
|
+
)
|
|
78
|
+
raise ProviderClientAPIException(
|
|
79
|
+
original_exception=e,
|
|
80
|
+
message=(
|
|
81
|
+
f"Invalid arguments for tool call `{data.function.name}`: "
|
|
82
|
+
f"`{data.function.arguments}`"
|
|
83
|
+
),
|
|
84
|
+
)
|
|
85
|
+
|
|
69
86
|
return cls(
|
|
70
87
|
id=data.id,
|
|
71
88
|
tool_name=data.function.name,
|
|
72
|
-
tool_args=
|
|
89
|
+
tool_args=tool_args,
|
|
73
90
|
type=data.type,
|
|
74
91
|
)
|
|
75
92
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""MCP server connection utilities."""
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import warnings
|
|
4
5
|
from contextlib import AsyncExitStack
|
|
5
6
|
from typing import Any, Dict, Optional
|
|
6
7
|
|
|
@@ -11,6 +12,14 @@ from mcp.client.streamable_http import streamablehttp_client
|
|
|
11
12
|
structlogger = structlog.get_logger()
|
|
12
13
|
|
|
13
14
|
|
|
15
|
+
# Suppress RuntimeWarning about unawaited coroutines when MCP server is not reachable.
|
|
16
|
+
warnings.filterwarnings(
|
|
17
|
+
"ignore",
|
|
18
|
+
message=".*BaseEventLoop.create_server.*was never awaited.*",
|
|
19
|
+
category=RuntimeWarning,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
14
23
|
class MCPServerConnection:
|
|
15
24
|
"""
|
|
16
25
|
Manages connection to an MCP server.
|
|
@@ -53,6 +53,7 @@ from rasa.engine.graph import GraphNode
|
|
|
53
53
|
from rasa.engine.training.graph_trainer import GraphTrainer
|
|
54
54
|
from rasa.shared.core.domain import Domain
|
|
55
55
|
from rasa.shared.core.flows import FlowsList
|
|
56
|
+
from rasa.shared.core.slots import Slot
|
|
56
57
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
57
58
|
from rasa.shared.nlu.constants import SET_SLOT_COMMAND
|
|
58
59
|
from rasa.shared.nlu.training_data.message import Message
|
|
@@ -1092,10 +1093,11 @@ def _instrument_advance_flows_until_next_action(
|
|
|
1092
1093
|
tracker: DialogueStateTracker,
|
|
1093
1094
|
available_actions: List[str],
|
|
1094
1095
|
flows: FlowsList,
|
|
1096
|
+
slots: List[Slot],
|
|
1095
1097
|
) -> FlowActionPrediction:
|
|
1096
1098
|
with tracer.start_as_current_span(f"{module_name}.{fn.__name__}") as span:
|
|
1097
1099
|
prediction: FlowActionPrediction = await fn(
|
|
1098
|
-
tracker, available_actions, flows
|
|
1100
|
+
tracker, available_actions, flows, slots
|
|
1099
1101
|
)
|
|
1100
1102
|
|
|
1101
1103
|
span.set_attributes(
|
rasa/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: rasa-pro
|
|
3
|
-
Version: 3.14.0.
|
|
3
|
+
Version: 3.14.0.dev6
|
|
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
|
|
@@ -2,7 +2,7 @@ rasa/__init__.py,sha256=YXG8RzVxiSJ__v-AewtV453YoCbmzWlHsU_4S0O2XpE,206
|
|
|
2
2
|
rasa/__main__.py,sha256=TVYPpDdKKnTxC9RRaPxAaoDosH8-UDMBPfd-UP7YBGg,6645
|
|
3
3
|
rasa/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
rasa/agents/agent_factory.py,sha256=7v7mdMrTnG5KEg6gCmwPtlT637I6xight90h--syh_c,4675
|
|
5
|
-
rasa/agents/agent_manager.py,sha256=
|
|
5
|
+
rasa/agents/agent_manager.py,sha256=_D5XCdfSSw79dzey7aAGe52a_cCTDvZIcm1EQROml1E,6043
|
|
6
6
|
rasa/agents/constants.py,sha256=nCq8hWCInKqdCO_I_8_Xai_-VMGcjCJ43QmJAXrAlAg,1145
|
|
7
7
|
rasa/agents/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
rasa/agents/core/agent_protocol.py,sha256=BQD9cfE2RDHo1Lte6nvV3e2M_BO_6B8N6elykQBW74s,3388
|
|
@@ -12,13 +12,13 @@ rasa/agents/protocol/__init__.py,sha256=rDR_QdaWuHvkHTKF1MmgzjIk7T8m__KJIK9wtjQn
|
|
|
12
12
|
rasa/agents/protocol/a2a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
rasa/agents/protocol/a2a/a2a_agent.py,sha256=oOaoCHX1EPs8P3cIDMmw9w-hUWljExlPG0UgFGC_cWs,25251
|
|
14
14
|
rasa/agents/protocol/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
rasa/agents/protocol/mcp/mcp_base_agent.py,sha256=
|
|
16
|
-
rasa/agents/protocol/mcp/mcp_open_agent.py,sha256=
|
|
17
|
-
rasa/agents/protocol/mcp/mcp_task_agent.py,sha256=
|
|
15
|
+
rasa/agents/protocol/mcp/mcp_base_agent.py,sha256=DacP9ocPiBqaQpU8HoeFKOUUkScCJhVouoAZEBtaLkU,26565
|
|
16
|
+
rasa/agents/protocol/mcp/mcp_open_agent.py,sha256=zwSRrhfL2hNpU0Kn6BOdDZutMG16RnUOI6cDsJcS7mU,11520
|
|
17
|
+
rasa/agents/protocol/mcp/mcp_task_agent.py,sha256=zPRMW8Q-VxRlq5IW_fJ9VzaElghP2nAKMSn1WK7CFJQ,19794
|
|
18
18
|
rasa/agents/schemas/__init__.py,sha256=6iNKhFCh3UTFTfIeYJpRyMKvENucXpBZ7IiqNGOaM_Q,384
|
|
19
19
|
rasa/agents/schemas/agent_input.py,sha256=11LK0cMnuU29gwZD-zs0BOepnVfxxeWuY0Ax4nb6LPE,970
|
|
20
20
|
rasa/agents/schemas/agent_output.py,sha256=Gc5W-d9ZGBY3JmTNVLiMCtw09my482HM-kWPSy34Evs,784
|
|
21
|
-
rasa/agents/schemas/agent_tool_result.py,sha256=
|
|
21
|
+
rasa/agents/schemas/agent_tool_result.py,sha256=Kc66JPvvGOuRP4UESkXSzLPwGb7yErNNGOqD2ZHZhhw,2376
|
|
22
22
|
rasa/agents/schemas/agent_tool_schema.py,sha256=V79xiei2Dkkuy_ivBKkoA7R3Z_bR7VbfvULguFP7JAk,4586
|
|
23
23
|
rasa/agents/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
24
|
rasa/agents/templates/mcp_open_agent_prompt_template.jinja2,sha256=2sW5_oO1xqMdeLTd93ONLclN4CmNexu9py0nHg3gj5w,1139
|
|
@@ -121,7 +121,7 @@ rasa/core/actions/grpc_custom_action_executor.py,sha256=EDxdSIDA4H4Mu-QZk-pPGV2N
|
|
|
121
121
|
rasa/core/actions/http_custom_action_executor.py,sha256=oC5OM-p11wHOXXVl7vrTUjhwI6JZh5qCaQpWtl0I0WE,5434
|
|
122
122
|
rasa/core/actions/loops.py,sha256=3-kt_Sn_Y05PLYoYMsnuIn9e5mxYp31DJIx2omqy0dU,3531
|
|
123
123
|
rasa/core/actions/two_stage_fallback.py,sha256=k8PkD25fvH3kThG9lpC6oLMK7o15kV4yEbv2E2nyans,6065
|
|
124
|
-
rasa/core/agent.py,sha256=
|
|
124
|
+
rasa/core/agent.py,sha256=9355XYsXPeOZhIpuwJQdFaFtq0N69otseeXUnI7CcZ0,22543
|
|
125
125
|
rasa/core/available_agents.py,sha256=hCQP37Zx8N6TnElOepfl_GRVyZ6SppSFSo-SWsiif8g,7278
|
|
126
126
|
rasa/core/available_endpoints.py,sha256=CEIMQL--BNlns_j8lZLhcf8yBnnOUzk3o5PMA3WIsTs,6583
|
|
127
127
|
rasa/core/brokers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -354,7 +354,7 @@ rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_te
|
|
|
354
354
|
rasa/core/policies/flow_policy.py,sha256=Ulh3pjc1Yi4oJ4oLdmMgv9_SxcqO39m2AohhZaOEJgM,7510
|
|
355
355
|
rasa/core/policies/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
356
356
|
rasa/core/policies/flows/flow_exceptions.py,sha256=_FQuN-cerQDM1pivce9bz4zylh5UYkljvYS1gjDukHI,1527
|
|
357
|
-
rasa/core/policies/flows/flow_executor.py,sha256=
|
|
357
|
+
rasa/core/policies/flows/flow_executor.py,sha256=Pm7iF8OBc2qnWUzNibETjRaKt1ZeioXA0PSDD68-Now,45006
|
|
358
358
|
rasa/core/policies/flows/flow_step_result.py,sha256=agjPrD6lahGSe2ViO5peBeoMdI9ngVGRSgtytgxmJmg,1360
|
|
359
359
|
rasa/core/policies/flows/mcp_tool_executor.py,sha256=EUyJ5puyYnClGMAeP2zebQ4dQYjH8DHFMJAVo-ZuRow,9384
|
|
360
360
|
rasa/core/policies/intentless_policy.py,sha256=14jQ3D6yXxzYXhlmr1ffO7RKgW5DFUJOgP906L_tKCE,38048
|
|
@@ -689,7 +689,7 @@ rasa/shared/core/flows/flow_path.py,sha256=xstwahZBU5cfMY46mREA4NoOGlKLBRAqeP_mJ
|
|
|
689
689
|
rasa/shared/core/flows/flow_step.py,sha256=b1O2b5sJJP9lyPzcAStNJITYcPQWlyIlsu2qXmTxVSQ,4989
|
|
690
690
|
rasa/shared/core/flows/flow_step_links.py,sha256=UNlE8xuhi-8R3CL2HPLEp0sAaKP_Obhv5yHSRNsiP8Q,11054
|
|
691
691
|
rasa/shared/core/flows/flow_step_sequence.py,sha256=yFtG_1ihI7hUK8I1izawMWVPPct4uh1iW2U0BVeCzUk,2537
|
|
692
|
-
rasa/shared/core/flows/flows_list.py,sha256=
|
|
692
|
+
rasa/shared/core/flows/flows_list.py,sha256=7OmezvxhttjDCY5enp9BTjd0Mtsf4BEVdwCT0YeAVdI,9777
|
|
693
693
|
rasa/shared/core/flows/flows_yaml_schema.json,sha256=CYqn3utfKxt2JbsuMmrLX6_m0NMyANidb2u2b8D-S1c,11631
|
|
694
694
|
rasa/shared/core/flows/nlu_trigger.py,sha256=ujLXFo5WjIwtwRVEdxZkaE2fbd4KEmayeFPAd1mF26I,4352
|
|
695
695
|
rasa/shared/core/flows/steps/__init__.py,sha256=jvJp02o9_Wx-rZeQ3SYiLVMpO6ulS1yKuiiKg0ld_nE,655
|
|
@@ -705,7 +705,7 @@ rasa/shared/core/flows/steps/no_operation.py,sha256=ofcJmmqKHpjHDp23ZgAMVs60blwf
|
|
|
705
705
|
rasa/shared/core/flows/steps/set_slots.py,sha256=NnPyHxY5gBiJ83qTbxRmgKh8BIMdi9U1TT71EfV35eE,1710
|
|
706
706
|
rasa/shared/core/flows/steps/start.py,sha256=AJpKIm0S3GZYLEs3ybXW0Zrq03Pu9lvirNahiUy2I6k,1010
|
|
707
707
|
rasa/shared/core/flows/utils.py,sha256=wqPWuEgYcbGMTs6wuckX400Sq1_Jz8yKYd2t91p3e8U,2270
|
|
708
|
-
rasa/shared/core/flows/validation.py,sha256=
|
|
708
|
+
rasa/shared/core/flows/validation.py,sha256=w4TjoA-mafhsnCR-Yc0HziXu6ChqWGf3WgayrP35leQ,34941
|
|
709
709
|
rasa/shared/core/flows/yaml_flows_io.py,sha256=MMJQxkgF9ipvTwOc8Yw-Xk7sa2OenHLuaEMsmhrCRSo,18282
|
|
710
710
|
rasa/shared/core/generator.py,sha256=UAuBPu5UjUhL9djVK-PvrWZcNhRACOEgnRsTleV7eeY,35686
|
|
711
711
|
rasa/shared/core/policies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -732,9 +732,9 @@ rasa/shared/exceptions.py,sha256=xEPrjOCvm1Cqbg0ubW-OuIP7TGyfaJHLGk13mv6exug,538
|
|
|
732
732
|
rasa/shared/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
733
733
|
rasa/shared/importers/importer.py,sha256=rNVDul5txtnAiZ-sYf8Yp8RW-eGn3t-1_PLrPU_Eyug,29597
|
|
734
734
|
rasa/shared/importers/multi_project.py,sha256=73fzUGDFpzHt9Nhy3EmPZg5mHj1EApmFiLoxitOX-EQ,8137
|
|
735
|
-
rasa/shared/importers/rasa.py,sha256=
|
|
735
|
+
rasa/shared/importers/rasa.py,sha256=yNj4xSZUZnJpAArjI7AaCByVXT9iXcoKKxXM660fJ8E,4105
|
|
736
736
|
rasa/shared/importers/remote_importer.py,sha256=fKLQskaCVPpD5cCMQ9sR71cZZlSIP-SSv3J3o2kra2w,7696
|
|
737
|
-
rasa/shared/importers/utils.py,sha256=
|
|
737
|
+
rasa/shared/importers/utils.py,sha256=zplHfTzYMTs7K9QYnw9XcQogD5T5EvUATxEjoQV9zUQ,1528
|
|
738
738
|
rasa/shared/nlu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
739
739
|
rasa/shared/nlu/constants.py,sha256=EVMuFXWX_SspnB7FFi8gf-ZHDjdESxalNJI9h7sjG9g,1919
|
|
740
740
|
rasa/shared/nlu/interpreter.py,sha256=eCNJp61nQYTGVf4aJi8SCWb46jxZY6-C1M1LFxMyQTM,188
|
|
@@ -791,7 +791,7 @@ rasa/shared/providers/llm/azure_openai_llm_client.py,sha256=ui85vothxR2P_-eLc4nL
|
|
|
791
791
|
rasa/shared/providers/llm/default_litellm_llm_client.py,sha256=mPDehyLxt3Q9fPSyaMArkVAMkMTf5lfSzhgv--pMTt4,4083
|
|
792
792
|
rasa/shared/providers/llm/litellm_router_llm_client.py,sha256=BxSm9ytYPqD62Qygy23EilLDlbvUMgCN-ADCg6Vhuyw,8171
|
|
793
793
|
rasa/shared/providers/llm/llm_client.py,sha256=tzdzh7sYb64zrsfbJ_SYNgUfBp7TAn77IekgJzLFeLs,3443
|
|
794
|
-
rasa/shared/providers/llm/llm_response.py,sha256=
|
|
794
|
+
rasa/shared/providers/llm/llm_response.py,sha256=9ByU-dbE6FM7sXbcDeQLA9t3CftNEN2ppTHeO0-QMaY,5654
|
|
795
795
|
rasa/shared/providers/llm/openai_llm_client.py,sha256=rSdLj29Hl1Wm5G6Uwo77j4WqogK_3QIbTA7fyt63YAg,5013
|
|
796
796
|
rasa/shared/providers/llm/rasa_llm_client.py,sha256=44Tvtnkq4mxDIxtdrGUkwBWAvX1OLaswqmpAsyBH8e8,3504
|
|
797
797
|
rasa/shared/providers/llm/self_hosted_llm_client.py,sha256=yR7bWQX-fZjFapDgWh-idcqas1hSuRBwMNXSFfbmAqU,10486
|
|
@@ -811,7 +811,7 @@ rasa/shared/utils/health_check/llm_health_check_mixin.py,sha256=ANP5Q68TRX8p4wWk
|
|
|
811
811
|
rasa/shared/utils/io.py,sha256=AhuECoXGO367NvWRCBu99utEtTQnyxWVJyKOOpLePpg,15917
|
|
812
812
|
rasa/shared/utils/llm.py,sha256=gDo1WzgpvcXK-PzTDYOenEdJEJPjjFBw4aSdtElcmL4,41505
|
|
813
813
|
rasa/shared/utils/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
814
|
-
rasa/shared/utils/mcp/server_connection.py,sha256=
|
|
814
|
+
rasa/shared/utils/mcp/server_connection.py,sha256=ReeoGAylVRHLmq0OPri72c0kuVry12eFEAOQEY5NeZQ,6008
|
|
815
815
|
rasa/shared/utils/pykwalify_extensions.py,sha256=g3BUbL1gbV8_6oCvCkinqUfA7ybu5w9QlC4RpxQ0JhM,1487
|
|
816
816
|
rasa/shared/utils/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
817
817
|
rasa/shared/utils/schemas/config.yml,sha256=czxSADw9hOIZdhvFP8pVUQo810hs9_C8ZGfCPx17taM,27
|
|
@@ -843,7 +843,7 @@ rasa/tracing/config.py,sha256=Ev4U0Z_P-0JMxEtyjWFgyaoSluNlAm5tTm5wBr-7F0I,13083
|
|
|
843
843
|
rasa/tracing/constants.py,sha256=l7RUgan0BebsZxZifLDfj9_lWIqdStJ-3Ny-44wTLrM,3690
|
|
844
844
|
rasa/tracing/instrumentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
845
845
|
rasa/tracing/instrumentation/attribute_extractors.py,sha256=DchKWLfnzPHIoL5lcizDm48Unq5Muos7qhW29RFhhM0,31266
|
|
846
|
-
rasa/tracing/instrumentation/instrumentation.py,sha256
|
|
846
|
+
rasa/tracing/instrumentation/instrumentation.py,sha256=Hyt6XyzYw92BvjHU_o-lX-yQRwcuD6rRIC8xqYL5WOc,56062
|
|
847
847
|
rasa/tracing/instrumentation/intentless_policy_instrumentation.py,sha256=vpfF91-2wAtFd78bN-piVca7ctyVCw9Szt5KyemM0vw,4833
|
|
848
848
|
rasa/tracing/instrumentation/metrics.py,sha256=gnoATx-Rzb3wcMXNX_qzaGhar1zfogCV5vZhrGPth00,14708
|
|
849
849
|
rasa/tracing/metric_instrument_provider.py,sha256=FjdvAhKvJNKhvJPyFw1wWG6DWmlSybroaluvxlf1vN8,16069
|
|
@@ -883,9 +883,9 @@ rasa/utils/train_utils.py,sha256=kx9Oyd_GFpIewTnUIeqwVnPjBTADCvv3Xw1rCCJCmTs,212
|
|
|
883
883
|
rasa/utils/url_tools.py,sha256=dZ1HGkVdWTJB7zYEdwoDIrEuyX9HE5WsxKKFVsXBLE0,1218
|
|
884
884
|
rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
|
|
885
885
|
rasa/validator.py,sha256=57H4waNFuhFXdtKGAQNw5LzeybJvEQEH9_bwj-gvojE,83177
|
|
886
|
-
rasa/version.py,sha256=
|
|
887
|
-
rasa_pro-3.14.0.
|
|
888
|
-
rasa_pro-3.14.0.
|
|
889
|
-
rasa_pro-3.14.0.
|
|
890
|
-
rasa_pro-3.14.0.
|
|
891
|
-
rasa_pro-3.14.0.
|
|
886
|
+
rasa/version.py,sha256=lQrs3c5jvknsBQvF72bbtkrUaCEkwW0QzywnDOiMee0,122
|
|
887
|
+
rasa_pro-3.14.0.dev6.dist-info/METADATA,sha256=zIJtqj1_y_uTZlR44Fs5rYUMlK8gSA3z_W0HHQJu-Fg,10161
|
|
888
|
+
rasa_pro-3.14.0.dev6.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
|
|
889
|
+
rasa_pro-3.14.0.dev6.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
|
890
|
+
rasa_pro-3.14.0.dev6.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
|
|
891
|
+
rasa_pro-3.14.0.dev6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|