rasa-pro 3.14.0.dev20250922__py3-none-any.whl → 3.14.0rc1__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/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +211 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +879 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +206 -0
- rasa/agents/validation.py +485 -0
- rasa/api.py +24 -9
- rasa/builder/config.py +6 -2
- rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
- rasa/builder/guardrails/constants.py +3 -0
- rasa/builder/guardrails/models.py +45 -10
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/utils.py +42 -276
- rasa/builder/llm_service.py +32 -5
- rasa/builder/models.py +1 -0
- rasa/builder/project_generator.py +6 -1
- rasa/builder/service.py +16 -13
- rasa/builder/training_service.py +18 -24
- rasa/builder/validation_service.py +1 -1
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +10 -8
- rasa/cli/dialogue_understanding_test.py +10 -7
- rasa/cli/e2e_test.py +9 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +8 -4
- rasa/cli/interactive.py +5 -4
- rasa/cli/llm_fine_tuning.py +11 -6
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +12 -10
- rasa/cli/scaffold.py +4 -4
- rasa/cli/shell.py +9 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +41 -28
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +223 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +51 -10
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +19 -2
- rasa/core/available_agents.py +229 -0
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/development_inspector.py +3 -3
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-35222594.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-a0efbfd3.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-0584c0f2.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-39f40dbe.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-1ad755f3.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-b0f4f0fe.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-9039bff9.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-65c9b127.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4f08b38e.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-e95c362a.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-703c3015.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-699328ea.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-04cf4b05.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-ee94449e.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-940162b4.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-c79c2866.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-84489d30.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-a9aa9858.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-eb73cf26.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-b3399f9a.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-b095bf1a.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-07644b66.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-573a3f9c.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d457e1e1.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-9d26e1a2.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-3a9cde10.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-4f3e8cec.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-e617e5bf.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-eab30d2f.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-09994be2.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-b7110364.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-3ebc92ad.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-7d13d2f2.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-488385e1.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +29 -4
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +7 -4
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +21 -0
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/studio_chat.py +6 -6
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_stream/genesys.py +1 -1
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +5 -1
- rasa/core/channels/voice_stream/voice_channel.py +3 -0
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
- rasa/core/config/configuration.py +260 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +4 -0
- rasa/core/policies/enterprise_search_policy.py +5 -3
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +632 -0
- rasa/core/policies/flows/flow_executor.py +136 -75
- rasa/core/policies/flows/mcp_tool_executor.py +298 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +68 -44
- rasa/core/run.py +37 -8
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
- rasa/dialogue_understanding/commands/utils.py +124 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/validation.py +19 -6
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
- rasa/shared/agents/auth/constants.py +12 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +8 -0
- rasa/shared/core/constants.py +16 -1
- rasa/shared/core/domain.py +0 -7
- rasa/shared/core/events.py +327 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +49 -5
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +3 -2
- rasa/shared/core/slots.py +2 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/exceptions.py +16 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +9 -3
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +39 -16
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +247 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +3 -6
- rasa/telemetry.py +69 -5
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/log_utils.py +96 -5
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +5 -5
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +46 -41
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +285 -226
- rasa/builder/scrape_rasa_docs.py +0 -97
- rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-c941dcb3.js +0 -1336
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
rasa/shared/core/events.py
CHANGED
|
@@ -2648,6 +2648,333 @@ class FlowCancelled(SkipEventInMDStoryMixin):
|
|
|
2648
2648
|
raise ValueError(f"Failed to parse flow_cancelled event. {e}")
|
|
2649
2649
|
|
|
2650
2650
|
|
|
2651
|
+
class AgentCompleted(SkipEventInMDStoryMixin):
|
|
2652
|
+
"""Mark the completion of an agent."""
|
|
2653
|
+
|
|
2654
|
+
type_name = "agent_completed"
|
|
2655
|
+
|
|
2656
|
+
def __init__(
|
|
2657
|
+
self,
|
|
2658
|
+
agent_id: str,
|
|
2659
|
+
flow_id: str,
|
|
2660
|
+
status: Optional[str] = None,
|
|
2661
|
+
timestamp: Optional[float] = None,
|
|
2662
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
2663
|
+
) -> None:
|
|
2664
|
+
self.agent_id = agent_id
|
|
2665
|
+
self.flow_id = flow_id
|
|
2666
|
+
self.status = status
|
|
2667
|
+
super().__init__(timestamp, metadata)
|
|
2668
|
+
|
|
2669
|
+
def __repr__(self) -> Text:
|
|
2670
|
+
"""Returns event as string for debugging."""
|
|
2671
|
+
return (
|
|
2672
|
+
f"AgentCompleted(agent: {self.agent_id}, flow: {self.flow_id}, "
|
|
2673
|
+
f"status: {self.status})"
|
|
2674
|
+
)
|
|
2675
|
+
|
|
2676
|
+
def __str__(self) -> str:
|
|
2677
|
+
"""Returns event as human-readable string."""
|
|
2678
|
+
return (
|
|
2679
|
+
f"{self.__class__.__name__}({self.agent_id}, {self.flow_id}, {self.status})"
|
|
2680
|
+
)
|
|
2681
|
+
|
|
2682
|
+
def __hash__(self) -> int:
|
|
2683
|
+
"""Returns unique hash for event."""
|
|
2684
|
+
return hash((self.agent_id, self.flow_id, self.status))
|
|
2685
|
+
|
|
2686
|
+
def __eq__(self, other: Any) -> bool:
|
|
2687
|
+
"""Compares object with other object."""
|
|
2688
|
+
if not isinstance(other, AgentCompleted):
|
|
2689
|
+
return NotImplemented
|
|
2690
|
+
return (self.agent_id, self.flow_id, self.status) == (
|
|
2691
|
+
other.agent_id,
|
|
2692
|
+
other.flow_id,
|
|
2693
|
+
other.status,
|
|
2694
|
+
)
|
|
2695
|
+
|
|
2696
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
2697
|
+
"""Returns serialized event."""
|
|
2698
|
+
serialized = super().as_dict()
|
|
2699
|
+
serialized.update(
|
|
2700
|
+
{"agent_id": self.agent_id, "flow_id": self.flow_id, "status": self.status}
|
|
2701
|
+
)
|
|
2702
|
+
return serialized
|
|
2703
|
+
|
|
2704
|
+
@classmethod
|
|
2705
|
+
def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentCompleted":
|
|
2706
|
+
if "agent_id" not in parameters:
|
|
2707
|
+
raise ValueError(
|
|
2708
|
+
"Failed to parse agent_completed event: agent_id is required"
|
|
2709
|
+
)
|
|
2710
|
+
if "flow_id" not in parameters:
|
|
2711
|
+
raise ValueError(
|
|
2712
|
+
"Failed to parse agent_completed event: flow_id is required"
|
|
2713
|
+
)
|
|
2714
|
+
|
|
2715
|
+
return AgentCompleted(
|
|
2716
|
+
parameters["agent_id"],
|
|
2717
|
+
parameters["flow_id"],
|
|
2718
|
+
parameters.get("status"),
|
|
2719
|
+
parameters.get("timestamp"),
|
|
2720
|
+
parameters.get("metadata"),
|
|
2721
|
+
)
|
|
2722
|
+
|
|
2723
|
+
|
|
2724
|
+
class AgentStarted(SkipEventInMDStoryMixin):
|
|
2725
|
+
"""Mark the start of an agent."""
|
|
2726
|
+
|
|
2727
|
+
type_name = "agent_started"
|
|
2728
|
+
|
|
2729
|
+
def __init__(
|
|
2730
|
+
self,
|
|
2731
|
+
agent_id: str,
|
|
2732
|
+
flow_id: str,
|
|
2733
|
+
timestamp: Optional[float] = None,
|
|
2734
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
2735
|
+
context_id: Optional[str] = None,
|
|
2736
|
+
) -> None:
|
|
2737
|
+
self.agent_id = agent_id
|
|
2738
|
+
self.flow_id = flow_id
|
|
2739
|
+
self.context_id = context_id
|
|
2740
|
+
super().__init__(timestamp, metadata)
|
|
2741
|
+
|
|
2742
|
+
def __repr__(self) -> str:
|
|
2743
|
+
"""Returns event as string for debugging."""
|
|
2744
|
+
if self.context_id:
|
|
2745
|
+
return (
|
|
2746
|
+
f"AgentStarted(agent: {self.agent_id}, flow: {self.flow_id}, "
|
|
2747
|
+
f"context_id: {self.context_id})"
|
|
2748
|
+
)
|
|
2749
|
+
else:
|
|
2750
|
+
return f"AgentStarted(agent: {self.agent_id}, flow: {self.flow_id})"
|
|
2751
|
+
|
|
2752
|
+
def __str__(self) -> str:
|
|
2753
|
+
"""Returns event as human-readable string."""
|
|
2754
|
+
return f"{self.__class__.__name__}({self.agent_id}, {self.flow_id})"
|
|
2755
|
+
|
|
2756
|
+
def __hash__(self) -> int:
|
|
2757
|
+
"""Returns unique hash for event."""
|
|
2758
|
+
return hash((self.agent_id, self.flow_id))
|
|
2759
|
+
|
|
2760
|
+
def __eq__(self, other: Any) -> bool:
|
|
2761
|
+
"""Compares object with other object."""
|
|
2762
|
+
if not isinstance(other, AgentStarted):
|
|
2763
|
+
return NotImplemented
|
|
2764
|
+
return (self.agent_id, self.flow_id) == (other.agent_id, other.flow_id)
|
|
2765
|
+
|
|
2766
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
2767
|
+
"""Returns serialized event."""
|
|
2768
|
+
serialized = super().as_dict()
|
|
2769
|
+
serialized.update({"agent_id": self.agent_id, "flow_id": self.flow_id})
|
|
2770
|
+
return serialized
|
|
2771
|
+
|
|
2772
|
+
@classmethod
|
|
2773
|
+
def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentStarted":
|
|
2774
|
+
if "agent_id" not in parameters:
|
|
2775
|
+
raise ValueError(
|
|
2776
|
+
"Failed to parse agent_started event: agent_id is required"
|
|
2777
|
+
)
|
|
2778
|
+
if "flow_id" not in parameters:
|
|
2779
|
+
raise ValueError("Failed to parse agent_started event: flow_id is required")
|
|
2780
|
+
|
|
2781
|
+
return AgentStarted(
|
|
2782
|
+
parameters["agent_id"],
|
|
2783
|
+
parameters["flow_id"],
|
|
2784
|
+
parameters.get("timestamp"),
|
|
2785
|
+
parameters.get("metadata"),
|
|
2786
|
+
)
|
|
2787
|
+
|
|
2788
|
+
|
|
2789
|
+
class AgentInterrupted(SkipEventInMDStoryMixin):
|
|
2790
|
+
"""Mark the interruption of an agent."""
|
|
2791
|
+
|
|
2792
|
+
type_name = "agent_interrupted"
|
|
2793
|
+
|
|
2794
|
+
def __init__(
|
|
2795
|
+
self,
|
|
2796
|
+
agent_id: str,
|
|
2797
|
+
flow_id: str,
|
|
2798
|
+
timestamp: Optional[float] = None,
|
|
2799
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
2800
|
+
) -> None:
|
|
2801
|
+
self.agent_id = agent_id
|
|
2802
|
+
self.flow_id = flow_id
|
|
2803
|
+
super().__init__(timestamp, metadata)
|
|
2804
|
+
|
|
2805
|
+
def __repr__(self) -> str:
|
|
2806
|
+
"""Returns event as string for debugging."""
|
|
2807
|
+
return f"AgentInterrupted(agent: {self.agent_id}, flow: {self.flow_id})"
|
|
2808
|
+
|
|
2809
|
+
def __str__(self) -> str:
|
|
2810
|
+
"""Returns event as human-readable string."""
|
|
2811
|
+
return f"{self.__class__.__name__}({self.agent_id}, {self.flow_id})"
|
|
2812
|
+
|
|
2813
|
+
def __hash__(self) -> int:
|
|
2814
|
+
"""Returns unique hash for event."""
|
|
2815
|
+
return hash((self.agent_id, self.flow_id))
|
|
2816
|
+
|
|
2817
|
+
def __eq__(self, other: Any) -> bool:
|
|
2818
|
+
"""Compares object with other object."""
|
|
2819
|
+
if not isinstance(other, AgentInterrupted):
|
|
2820
|
+
return NotImplemented
|
|
2821
|
+
return (self.agent_id, self.flow_id) == (other.agent_id, other.flow_id)
|
|
2822
|
+
|
|
2823
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
2824
|
+
"""Returns serialized event."""
|
|
2825
|
+
serialized = super().as_dict()
|
|
2826
|
+
serialized.update({"agent_id": self.agent_id, "flow_id": self.flow_id})
|
|
2827
|
+
return serialized
|
|
2828
|
+
|
|
2829
|
+
@classmethod
|
|
2830
|
+
def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentInterrupted":
|
|
2831
|
+
if "agent_id" not in parameters:
|
|
2832
|
+
raise ValueError(
|
|
2833
|
+
"Failed to parse agent_interrupted event: agent_id is required"
|
|
2834
|
+
)
|
|
2835
|
+
if "flow_id" not in parameters:
|
|
2836
|
+
raise ValueError(
|
|
2837
|
+
"Failed to parse agent_interrupted event: flow_id is required"
|
|
2838
|
+
)
|
|
2839
|
+
|
|
2840
|
+
return AgentInterrupted(
|
|
2841
|
+
parameters["agent_id"],
|
|
2842
|
+
parameters["flow_id"],
|
|
2843
|
+
parameters.get("timestamp"),
|
|
2844
|
+
parameters.get("metadata"),
|
|
2845
|
+
)
|
|
2846
|
+
|
|
2847
|
+
|
|
2848
|
+
class AgentCancelled(SkipEventInMDStoryMixin):
|
|
2849
|
+
"""Mark the cancellation of an agent."""
|
|
2850
|
+
|
|
2851
|
+
type_name = "agent_cancelled"
|
|
2852
|
+
|
|
2853
|
+
def __init__(
|
|
2854
|
+
self,
|
|
2855
|
+
agent_id: str,
|
|
2856
|
+
flow_id: str,
|
|
2857
|
+
reason: Optional[str] = None,
|
|
2858
|
+
timestamp: Optional[float] = None,
|
|
2859
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
2860
|
+
) -> None:
|
|
2861
|
+
self.agent_id = agent_id
|
|
2862
|
+
self.flow_id = flow_id
|
|
2863
|
+
self.reason = reason
|
|
2864
|
+
super().__init__(timestamp, metadata)
|
|
2865
|
+
|
|
2866
|
+
def __repr__(self) -> str:
|
|
2867
|
+
"""Returns event as string for debugging."""
|
|
2868
|
+
return (
|
|
2869
|
+
f"AgentCancelled(agent: {self.agent_id}, flow: {self.flow_id}, "
|
|
2870
|
+
f"reason: {self.reason})"
|
|
2871
|
+
)
|
|
2872
|
+
|
|
2873
|
+
def __str__(self) -> str:
|
|
2874
|
+
"""Returns event as human-readable string."""
|
|
2875
|
+
return (
|
|
2876
|
+
f"{self.__class__.__name__}({self.agent_id}, {self.flow_id}, {self.reason})"
|
|
2877
|
+
)
|
|
2878
|
+
|
|
2879
|
+
def __hash__(self) -> int:
|
|
2880
|
+
"""Returns unique hash for event."""
|
|
2881
|
+
return hash((self.agent_id, self.flow_id, self.reason))
|
|
2882
|
+
|
|
2883
|
+
def __eq__(self, other: Any) -> bool:
|
|
2884
|
+
"""Compares object with other object."""
|
|
2885
|
+
if not isinstance(other, AgentCancelled):
|
|
2886
|
+
return NotImplemented
|
|
2887
|
+
return (self.agent_id, self.flow_id, self.reason) == (
|
|
2888
|
+
other.agent_id,
|
|
2889
|
+
other.flow_id,
|
|
2890
|
+
other.reason,
|
|
2891
|
+
)
|
|
2892
|
+
|
|
2893
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
2894
|
+
"""Returns serialized event."""
|
|
2895
|
+
serialized = super().as_dict()
|
|
2896
|
+
serialized.update(
|
|
2897
|
+
{"agent_id": self.agent_id, "flow_id": self.flow_id, "reason": self.reason}
|
|
2898
|
+
)
|
|
2899
|
+
return serialized
|
|
2900
|
+
|
|
2901
|
+
@classmethod
|
|
2902
|
+
def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentCancelled":
|
|
2903
|
+
if "agent_id" not in parameters:
|
|
2904
|
+
raise ValueError(
|
|
2905
|
+
"Failed to parse agent_cancelled event: agent_id is required"
|
|
2906
|
+
)
|
|
2907
|
+
if "flow_id" not in parameters:
|
|
2908
|
+
raise ValueError(
|
|
2909
|
+
"Failed to parse agent_cancelled event: flow_id is required"
|
|
2910
|
+
)
|
|
2911
|
+
|
|
2912
|
+
return AgentCancelled(
|
|
2913
|
+
parameters["agent_id"],
|
|
2914
|
+
parameters["flow_id"],
|
|
2915
|
+
parameters.get("reason"),
|
|
2916
|
+
parameters.get("timestamp"),
|
|
2917
|
+
parameters.get("metadata"),
|
|
2918
|
+
)
|
|
2919
|
+
|
|
2920
|
+
|
|
2921
|
+
class AgentResumed(SkipEventInMDStoryMixin):
|
|
2922
|
+
"""Mark the resumption of an agent."""
|
|
2923
|
+
|
|
2924
|
+
type_name = "agent_resumed"
|
|
2925
|
+
|
|
2926
|
+
def __init__(
|
|
2927
|
+
self,
|
|
2928
|
+
agent_id: str,
|
|
2929
|
+
flow_id: str,
|
|
2930
|
+
timestamp: Optional[float] = None,
|
|
2931
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
2932
|
+
) -> None:
|
|
2933
|
+
self.agent_id = agent_id
|
|
2934
|
+
self.flow_id = flow_id
|
|
2935
|
+
super().__init__(timestamp, metadata)
|
|
2936
|
+
|
|
2937
|
+
def __repr__(self) -> str:
|
|
2938
|
+
"""Returns event as string for debugging."""
|
|
2939
|
+
return f"AgentResumed(agent: {self.agent_id}, flow: {self.flow_id})"
|
|
2940
|
+
|
|
2941
|
+
def __str__(self) -> str:
|
|
2942
|
+
"""Returns event as human-readable string."""
|
|
2943
|
+
return f"{self.__class__.__name__}({self.agent_id}, {self.flow_id})"
|
|
2944
|
+
|
|
2945
|
+
def __hash__(self) -> int:
|
|
2946
|
+
"""Returns unique hash for event."""
|
|
2947
|
+
return hash((self.agent_id, self.flow_id))
|
|
2948
|
+
|
|
2949
|
+
def __eq__(self, other: Any) -> bool:
|
|
2950
|
+
"""Compares object with other object."""
|
|
2951
|
+
if not isinstance(other, AgentResumed):
|
|
2952
|
+
return NotImplemented
|
|
2953
|
+
return (self.agent_id, self.flow_id) == (other.agent_id, other.flow_id)
|
|
2954
|
+
|
|
2955
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
2956
|
+
"""Returns serialized event."""
|
|
2957
|
+
serialized = super().as_dict()
|
|
2958
|
+
serialized.update({"agent_id": self.agent_id, "flow_id": self.flow_id})
|
|
2959
|
+
return serialized
|
|
2960
|
+
|
|
2961
|
+
@classmethod
|
|
2962
|
+
def _from_parameters(cls, parameters: Dict[str, Any]) -> "AgentResumed":
|
|
2963
|
+
if "agent_id" not in parameters:
|
|
2964
|
+
raise ValueError(
|
|
2965
|
+
"Failed to parse agent_resumed event: agent_id is required"
|
|
2966
|
+
)
|
|
2967
|
+
if "flow_id" not in parameters:
|
|
2968
|
+
raise ValueError("Failed to parse agent_resumed event: flow_id is required")
|
|
2969
|
+
|
|
2970
|
+
return AgentResumed(
|
|
2971
|
+
parameters["agent_id"],
|
|
2972
|
+
parameters["flow_id"],
|
|
2973
|
+
parameters.get("timestamp"),
|
|
2974
|
+
parameters.get("metadata"),
|
|
2975
|
+
)
|
|
2976
|
+
|
|
2977
|
+
|
|
2651
2978
|
class SessionEnded(AlwaysEqualEventMixin):
|
|
2652
2979
|
"""Mark the end of a conversation session."""
|
|
2653
2980
|
|
|
@@ -11,3 +11,8 @@ KEY_RUN_PATTERN_COMPLETED = "run_pattern_completed"
|
|
|
11
11
|
KEY_TRANSLATION = "translation"
|
|
12
12
|
KEY_CALLED_FLOW = "called_flow"
|
|
13
13
|
KEY_LINKED_FLOW = "linked_flow"
|
|
14
|
+
|
|
15
|
+
# MCP mapping field names
|
|
16
|
+
KEY_MAPPING_INPUT = "input"
|
|
17
|
+
KEY_MAPPING_OUTPUT = "output"
|
|
18
|
+
KEY_MAPPING_SLOT = "slot"
|
|
@@ -2,17 +2,21 @@ 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
|
|
9
9
|
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,
|
|
14
|
+
validate_exit_if_exclusivity,
|
|
13
15
|
validate_flow,
|
|
14
16
|
validate_link_in_call_restriction,
|
|
15
17
|
validate_linked_flows_exists,
|
|
18
|
+
validate_mcp_mapping_slots,
|
|
19
|
+
validate_mcp_server_references,
|
|
16
20
|
validate_nlu_trigger,
|
|
17
21
|
validate_patterns_are_not_called_or_linked,
|
|
18
22
|
validate_patterns_are_not_calling_or_linking_other_flows,
|
|
@@ -20,6 +24,9 @@ from rasa.shared.core.flows.validation import (
|
|
|
20
24
|
)
|
|
21
25
|
from rasa.shared.core.slots import Slot
|
|
22
26
|
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from rasa.shared.core.domain import Domain
|
|
29
|
+
|
|
23
30
|
|
|
24
31
|
@dataclass
|
|
25
32
|
class FlowsList:
|
|
@@ -160,17 +167,26 @@ class FlowsList:
|
|
|
160
167
|
else:
|
|
161
168
|
return None
|
|
162
169
|
|
|
163
|
-
def validate(self) -> None:
|
|
164
|
-
"""Validate the flows.
|
|
170
|
+
def validate(self, domain: Optional["Domain"] = None) -> None:
|
|
171
|
+
"""Validate the flows.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
domain: Optional domain containing slot definitions. If provided,
|
|
175
|
+
exit_if conditions will be validated against defined slots.
|
|
176
|
+
"""
|
|
165
177
|
for flow in self.underlying_flows:
|
|
166
178
|
validate_flow(flow)
|
|
167
179
|
validate_nlu_trigger(self.underlying_flows)
|
|
168
180
|
validate_link_in_call_restriction(self)
|
|
169
|
-
|
|
181
|
+
validate_call_steps(self)
|
|
182
|
+
validate_mcp_server_references(self)
|
|
183
|
+
validate_mcp_mapping_slots(self, domain)
|
|
170
184
|
validate_linked_flows_exists(self)
|
|
171
185
|
validate_patterns_are_not_called_or_linked(self)
|
|
172
186
|
validate_patterns_are_not_calling_or_linking_other_flows(self)
|
|
173
187
|
validate_step_ids_are_unique(self)
|
|
188
|
+
validate_exit_if_conditions(self, domain)
|
|
189
|
+
validate_exit_if_exclusivity(self)
|
|
174
190
|
|
|
175
191
|
@property
|
|
176
192
|
def user_flow_ids(self) -> Set[str]:
|