rasa-pro 3.14.0.dev20250922__py3-none-any.whl → 3.14.0rc2__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/copilot/constants.py +4 -1
- rasa/builder/copilot/copilot.py +155 -79
- rasa/builder/copilot/models.py +304 -108
- rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
- 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/jobs.py +182 -12
- rasa/builder/llm_service.py +32 -5
- rasa/builder/models.py +13 -3
- rasa/builder/project_generator.py +6 -1
- rasa/builder/service.py +31 -15
- 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/finance/domain/general/help.yml +0 -0
- 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/brokers/kafka.py +5 -1
- 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/concurrent_lock_store.py +38 -21
- 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 +10 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +69 -4
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +2 -1
- rasa/core/lock_store.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/redis_connection_factory.py +7 -2
- rasa/core/run.py +37 -8
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +4 -0
- rasa/core/tracker_stores/sql_tracker_store.py +3 -1
- 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.0rc2.dist-info}/METADATA +47 -41
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/RECORD +299 -238
- 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.0rc2.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc2.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import time
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import List, Optional, Text, Union
|
|
5
|
+
|
|
6
|
+
import randomname
|
|
7
|
+
import structlog
|
|
8
|
+
|
|
9
|
+
from rasa.exceptions import ModelNotFound, ValidationError
|
|
10
|
+
from rasa.shared.constants import (
|
|
11
|
+
ASSISTANT_ID_DEFAULT_VALUE,
|
|
12
|
+
ASSISTANT_ID_KEY,
|
|
13
|
+
DEFAULT_CONFIG_PATH,
|
|
14
|
+
)
|
|
15
|
+
from rasa.shared.utils.common import display_research_study_prompt
|
|
16
|
+
from rasa.shared.utils.yaml import read_config_file
|
|
17
|
+
from rasa.utils.io import write_yaml
|
|
18
|
+
|
|
19
|
+
structlogger = structlog.get_logger()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
FREE_TEXT_INPUT_PROMPT = "Type out your own message..."
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_validated_path(
|
|
26
|
+
current: Optional[Union[Path, Text]],
|
|
27
|
+
parameter: Text,
|
|
28
|
+
default: Optional[Union[Path, Text, List[Text], List[Path]]] = None,
|
|
29
|
+
none_is_valid: bool = False,
|
|
30
|
+
) -> Optional[Union[Path, Text]]:
|
|
31
|
+
"""Checks whether a file path or its default value is valid and returns it.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
current: The parsed value.
|
|
35
|
+
parameter: The name of the parameter.
|
|
36
|
+
default: one or multiple default values of the parameter.
|
|
37
|
+
none_is_valid: `True` if `None` is valid value for the path,
|
|
38
|
+
else `False``
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
The current value if valid,
|
|
42
|
+
otherwise one of the default values of the argument if valid,
|
|
43
|
+
otherwise `None` if allowed,
|
|
44
|
+
otherwise raises an error and exits.
|
|
45
|
+
"""
|
|
46
|
+
if current and os.path.exists(current):
|
|
47
|
+
return current
|
|
48
|
+
|
|
49
|
+
if parameter == "model":
|
|
50
|
+
raise ModelNotFound(
|
|
51
|
+
f"The provided model path '{current}' could not be found. "
|
|
52
|
+
"Provide an existing model path."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
default_options: Union[List[str], List[Path]] = []
|
|
56
|
+
# try to find a valid option among the defaults
|
|
57
|
+
if isinstance(default, str) or isinstance(default, Path):
|
|
58
|
+
default_options = [str(default)]
|
|
59
|
+
elif isinstance(default, list):
|
|
60
|
+
default_options = default
|
|
61
|
+
|
|
62
|
+
valid_options = (option for option in default_options if os.path.exists(option))
|
|
63
|
+
chosen_option = next(valid_options, None)
|
|
64
|
+
|
|
65
|
+
# warn and log if user-chosen parameter wasn't found and thus overwritten
|
|
66
|
+
if chosen_option:
|
|
67
|
+
shared_info = f"Using default location '{chosen_option}' instead."
|
|
68
|
+
if current is None:
|
|
69
|
+
structlogger.debug(
|
|
70
|
+
"cli.get_validated_path.parameter_not_set",
|
|
71
|
+
parameter=parameter,
|
|
72
|
+
event_info=(f"Parameter '{parameter}' was not set. {shared_info}"),
|
|
73
|
+
)
|
|
74
|
+
elif current not in default_options:
|
|
75
|
+
structlogger.warn(
|
|
76
|
+
"cli.get_validated_path.path_does_not_exists",
|
|
77
|
+
path=current,
|
|
78
|
+
event_info=(
|
|
79
|
+
f"The path '{current}' does not seem to exist. {shared_info}"
|
|
80
|
+
),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if chosen_option is None and not none_is_valid:
|
|
84
|
+
_cancel_cause_not_found(current, parameter, default)
|
|
85
|
+
|
|
86
|
+
return chosen_option
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def validate_assistant_id_in_config(config_file: Union["Path", Text]) -> None:
|
|
90
|
+
"""Verifies that the assistant_id key exists and has a unique value in config.
|
|
91
|
+
|
|
92
|
+
Issues a warning if the key does not exist or has the default value and replaces it
|
|
93
|
+
with a pseudo-random string value.
|
|
94
|
+
"""
|
|
95
|
+
config_data = read_config_file(config_file, reader_type=["safe", "rt"])
|
|
96
|
+
assistant_id = config_data.get(ASSISTANT_ID_KEY)
|
|
97
|
+
|
|
98
|
+
if assistant_id is None or assistant_id == ASSISTANT_ID_DEFAULT_VALUE:
|
|
99
|
+
structlogger.warn(
|
|
100
|
+
"cli.validate_assistant_id_in_config.missing_unique_assistant_id_key",
|
|
101
|
+
config=config_file,
|
|
102
|
+
missing_key=ASSISTANT_ID_KEY,
|
|
103
|
+
event_info=(
|
|
104
|
+
f"The config file '{config_file!s}' is "
|
|
105
|
+
f"missing a unique value for the "
|
|
106
|
+
f"'{ASSISTANT_ID_KEY}' mandatory key. "
|
|
107
|
+
f"Proceeding with generating a random "
|
|
108
|
+
f"value and overwriting the '{ASSISTANT_ID_KEY}'"
|
|
109
|
+
f" in the config file."
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# add random value for assistant id, overwrite config file
|
|
114
|
+
time_format = "%Y%m%d-%H%M%S"
|
|
115
|
+
config_data[ASSISTANT_ID_KEY] = (
|
|
116
|
+
f"{time.strftime(time_format)}-{randomname.get_name()}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
write_yaml(data=config_data, target=config_file, should_preserve_key_order=True)
|
|
120
|
+
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def validate_config_path(
|
|
125
|
+
config: Optional[Union[Text, "Path"]],
|
|
126
|
+
default_config: Text = DEFAULT_CONFIG_PATH,
|
|
127
|
+
) -> Text:
|
|
128
|
+
"""Verifies that the config path exists.
|
|
129
|
+
|
|
130
|
+
Exit if the config file does not exist.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
config: Path to the config file.
|
|
134
|
+
default_config: default config to use if the file at `config` doesn't exist.
|
|
135
|
+
|
|
136
|
+
Returns: The path to the config file.
|
|
137
|
+
"""
|
|
138
|
+
config = get_validated_path(config, "config", default_config)
|
|
139
|
+
|
|
140
|
+
if not config or not os.path.exists(config):
|
|
141
|
+
display_research_study_prompt()
|
|
142
|
+
raise ValidationError(
|
|
143
|
+
code="cli.validate_config_path.does_not_exists",
|
|
144
|
+
config=config,
|
|
145
|
+
event_info=(
|
|
146
|
+
f"The config file '{config}' does not exist. "
|
|
147
|
+
f"Use '--config' to specify a valid config file."
|
|
148
|
+
),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
return str(config)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def validate_mandatory_config_keys(
|
|
155
|
+
config: Union[Text, "Path"],
|
|
156
|
+
mandatory_keys: List[Text],
|
|
157
|
+
) -> Text:
|
|
158
|
+
"""Get a config from a config file and check if it is valid.
|
|
159
|
+
|
|
160
|
+
Exit if the config isn't valid.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
config: Path to the config file.
|
|
164
|
+
mandatory_keys: The keys that have to be specified in the config file.
|
|
165
|
+
|
|
166
|
+
Returns: The path to the config file if the config is valid.
|
|
167
|
+
"""
|
|
168
|
+
missing_keys = set(_missing_config_keys(config, mandatory_keys))
|
|
169
|
+
if missing_keys:
|
|
170
|
+
display_research_study_prompt()
|
|
171
|
+
raise ValidationError(
|
|
172
|
+
code="cli.validate_mandatory_config_keys.missing_keys",
|
|
173
|
+
config=config,
|
|
174
|
+
missing_keys=missing_keys,
|
|
175
|
+
event_info=(
|
|
176
|
+
"The config file '{}' is missing mandatory parameters: "
|
|
177
|
+
"'{}'. Add missing parameters to config file and try again.".format(
|
|
178
|
+
config, "', '".join(missing_keys)
|
|
179
|
+
)
|
|
180
|
+
),
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
return str(config)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def get_validated_config(
|
|
187
|
+
config: Optional[Union[Text, "Path"]],
|
|
188
|
+
mandatory_keys: List[Text],
|
|
189
|
+
default_config: Text = DEFAULT_CONFIG_PATH,
|
|
190
|
+
) -> Text:
|
|
191
|
+
"""Validates config and returns path to validated config file."""
|
|
192
|
+
config = validate_config_path(config, default_config)
|
|
193
|
+
validate_assistant_id_in_config(config)
|
|
194
|
+
|
|
195
|
+
config = validate_mandatory_config_keys(config, mandatory_keys)
|
|
196
|
+
|
|
197
|
+
return config
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _missing_config_keys(
|
|
201
|
+
path: Union["Path", Text], mandatory_keys: List[Text]
|
|
202
|
+
) -> List[Text]:
|
|
203
|
+
"""Checks whether the config file at `path` contains the `mandatory_keys`.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
path: The path to the config file.
|
|
207
|
+
mandatory_keys: A list of mandatory config keys.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
The list of missing config keys.
|
|
211
|
+
"""
|
|
212
|
+
if not os.path.exists(path):
|
|
213
|
+
return mandatory_keys
|
|
214
|
+
|
|
215
|
+
config_data = read_config_file(path)
|
|
216
|
+
|
|
217
|
+
return [k for k in mandatory_keys if k not in config_data or config_data[k] is None]
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _cancel_cause_not_found(
|
|
221
|
+
current: Optional[Union["Path", Text]],
|
|
222
|
+
parameter: Text,
|
|
223
|
+
default: Optional[Union["Path", Text, List[Text]]],
|
|
224
|
+
) -> None:
|
|
225
|
+
"""Exits with an error because the given path was not valid.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
current: The path given by the user.
|
|
229
|
+
parameter: The name of the parameter.
|
|
230
|
+
default: The default value of the parameter.
|
|
231
|
+
|
|
232
|
+
"""
|
|
233
|
+
default_clause = ""
|
|
234
|
+
if default and isinstance(default, str):
|
|
235
|
+
default_clause = f"use the default location ('{default}') or"
|
|
236
|
+
elif default and isinstance(default, list):
|
|
237
|
+
default_clause = f"use one of the default locations ({', '.join(default)}) or"
|
|
238
|
+
|
|
239
|
+
structlogger.error(
|
|
240
|
+
"cli.path_does_not_exist",
|
|
241
|
+
path=current,
|
|
242
|
+
event_info=(
|
|
243
|
+
f"The path '{current}' does not exist. "
|
|
244
|
+
f"Please make sure to {default_clause} specify it "
|
|
245
|
+
f"with '--{parameter}'."
|
|
246
|
+
),
|
|
247
|
+
)
|
|
248
|
+
display_research_study_prompt()
|
|
249
|
+
raise ValidationError(
|
|
250
|
+
code="cli.path_does_not_exist",
|
|
251
|
+
path=current,
|
|
252
|
+
event_info=(
|
|
253
|
+
f"The path '{current}' does not exist. "
|
|
254
|
+
f"Please make sure to {default_clause} specify it "
|
|
255
|
+
f"with '--{parameter}'."
|
|
256
|
+
),
|
|
257
|
+
)
|
rasa/cli/x.py
CHANGED
|
@@ -15,7 +15,9 @@ import rasa.utils.common
|
|
|
15
15
|
import rasa.utils.io
|
|
16
16
|
from rasa.cli import SubParsersAction
|
|
17
17
|
from rasa.cli.arguments import x as arguments
|
|
18
|
-
from rasa.
|
|
18
|
+
from rasa.cli.validation.config_path_validation import get_validated_path
|
|
19
|
+
from rasa.core.config.available_endpoints import AvailableEndpoints
|
|
20
|
+
from rasa.core.config.configuration import Configuration
|
|
19
21
|
from rasa.shared.constants import (
|
|
20
22
|
DEFAULT_CREDENTIALS_PATH,
|
|
21
23
|
DEFAULT_ENDPOINTS_PATH,
|
|
@@ -90,7 +92,7 @@ def _prepare_credentials_for_rasa_x(
|
|
|
90
92
|
) -> Text:
|
|
91
93
|
if credentials_path:
|
|
92
94
|
credentials_path = str(
|
|
93
|
-
|
|
95
|
+
get_validated_path(
|
|
94
96
|
credentials_path, "credentials", DEFAULT_CREDENTIALS_PATH, True
|
|
95
97
|
)
|
|
96
98
|
)
|
|
@@ -179,7 +181,9 @@ def run_in_enterprise_connection_mode(args: argparse.Namespace) -> None:
|
|
|
179
181
|
print_success("Starting a Rasa server in Rasa Enterprise connection mode... 🚀")
|
|
180
182
|
|
|
181
183
|
credentials_path, endpoints_path = _get_credentials_and_endpoints_paths(args)
|
|
182
|
-
endpoints =
|
|
184
|
+
endpoints = Configuration.initialise_endpoints(
|
|
185
|
+
endpoints_path=Path(endpoints_path)
|
|
186
|
+
).endpoints
|
|
183
187
|
|
|
184
188
|
_rasa_service(args, endpoints, None, credentials_path)
|
|
185
189
|
|
|
@@ -195,7 +199,7 @@ def _get_credentials_and_endpoints_paths(
|
|
|
195
199
|
_pull_runtime_config_from_server(config_endpoint)
|
|
196
200
|
)
|
|
197
201
|
else:
|
|
198
|
-
endpoints_config_path =
|
|
202
|
+
endpoints_config_path = get_validated_path(
|
|
199
203
|
args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
|
|
200
204
|
)
|
|
201
205
|
credentials_path = None
|
rasa/constants.py
CHANGED
|
@@ -18,12 +18,18 @@ CONFIG_TELEMETRY_ID = "rasa_user_id"
|
|
|
18
18
|
CONFIG_TELEMETRY_ENABLED = "enabled"
|
|
19
19
|
CONFIG_TELEMETRY_DATE = "date"
|
|
20
20
|
|
|
21
|
-
MINIMUM_COMPATIBLE_VERSION = "3.
|
|
21
|
+
MINIMUM_COMPATIBLE_VERSION = "3.14.0.dev10"
|
|
22
22
|
|
|
23
23
|
GLOBAL_USER_CONFIG_PATH = os.path.expanduser("~/.config/rasa/global.yml")
|
|
24
24
|
|
|
25
|
+
# Logging level for external libraries (default: ERROR to reduce noise)
|
|
25
26
|
DEFAULT_LOG_LEVEL_LIBRARIES = "ERROR"
|
|
26
27
|
ENV_LOG_LEVEL_LIBRARIES = "LOG_LEVEL_LIBRARIES"
|
|
28
|
+
|
|
29
|
+
# MCP (Model Context Protocol) logging configuration
|
|
30
|
+
ENV_LOG_LEVEL_MCP = "LOG_LEVEL_MCP"
|
|
31
|
+
ENV_MCP_LOGGING_ENABLED = "MCP_LOGGING_ENABLED"
|
|
32
|
+
|
|
27
33
|
ENV_LOG_LEVEL_MATPLOTLIB = "LOG_LEVEL_MATPLOTLIB"
|
|
28
34
|
ENV_LOG_LEVEL_RABBITMQ = "LOG_LEVEL_RABBITMQ"
|
|
29
35
|
ENV_LOG_LEVEL_KAFKA = "LOG_LEVEL_KAFKA"
|
rasa/core/actions/action.py
CHANGED
|
@@ -47,6 +47,7 @@ from rasa.shared.constants import (
|
|
|
47
47
|
UTTER_PREFIX,
|
|
48
48
|
)
|
|
49
49
|
from rasa.shared.core.constants import (
|
|
50
|
+
ACTION_AGENT_REQUEST_USER_INPUT_NAME,
|
|
50
51
|
ACTION_BACK_NAME,
|
|
51
52
|
ACTION_DEACTIVATE_LOOP_NAME,
|
|
52
53
|
ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
|
|
@@ -56,6 +57,8 @@ from rasa.shared.core.constants import (
|
|
|
56
57
|
ACTION_LISTEN_NAME,
|
|
57
58
|
ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
|
|
58
59
|
ACTION_METADATA_EXECUTION_SUCCESS,
|
|
60
|
+
ACTION_METADATA_MESSAGE_KEY,
|
|
61
|
+
ACTION_METADATA_TEXT_KEY,
|
|
59
62
|
ACTION_RESET_ROUTING,
|
|
60
63
|
ACTION_RESTART_NAME,
|
|
61
64
|
ACTION_REVERT_FALLBACK_EVENTS_NAME,
|
|
@@ -88,7 +91,12 @@ from rasa.shared.core.slot_mappings import (
|
|
|
88
91
|
)
|
|
89
92
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
90
93
|
from rasa.shared.exceptions import RasaException
|
|
91
|
-
from rasa.shared.nlu.constants import
|
|
94
|
+
from rasa.shared.nlu.constants import (
|
|
95
|
+
INTENT,
|
|
96
|
+
INTENT_NAME_KEY,
|
|
97
|
+
INTENT_RANKING_KEY,
|
|
98
|
+
PREDICTED_CONFIDENCE_KEY,
|
|
99
|
+
)
|
|
92
100
|
from rasa.shared.utils.io import raise_warning
|
|
93
101
|
from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
|
|
94
102
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -113,6 +121,10 @@ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["A
|
|
|
113
121
|
from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
|
|
114
122
|
from rasa.dialogue_understanding.patterns.cancel import ActionCancelFlow
|
|
115
123
|
from rasa.dialogue_understanding.patterns.clarify import ActionClarifyFlows
|
|
124
|
+
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
125
|
+
ActionCancelInterruptedFlows,
|
|
126
|
+
ActionContinueInterruptedFlow,
|
|
127
|
+
)
|
|
116
128
|
from rasa.dialogue_understanding.patterns.correction import ActionCorrectFlowSlot
|
|
117
129
|
|
|
118
130
|
return [
|
|
@@ -127,6 +139,7 @@ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["A
|
|
|
127
139
|
TwoStageFallbackAction(action_endpoint),
|
|
128
140
|
ActionUnlikelyIntent(),
|
|
129
141
|
ActionSendText(),
|
|
142
|
+
ActionAgentRequestUserInfo(),
|
|
130
143
|
ActionBack(),
|
|
131
144
|
ActionExtractSlots(action_endpoint),
|
|
132
145
|
ActionCancelFlow(),
|
|
@@ -139,6 +152,8 @@ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["A
|
|
|
139
152
|
ActionResetRouting(),
|
|
140
153
|
ActionHangup(),
|
|
141
154
|
ActionRepeatBotMessages(),
|
|
155
|
+
ActionContinueInterruptedFlow(),
|
|
156
|
+
ActionCancelInterruptedFlows(),
|
|
142
157
|
]
|
|
143
158
|
|
|
144
159
|
|
|
@@ -873,8 +888,8 @@ class RemoteAction(Action):
|
|
|
873
888
|
) -> List[BotUttered]:
|
|
874
889
|
"""Use the responses generated by the action endpoint and utter them."""
|
|
875
890
|
bot_messages = []
|
|
876
|
-
domain: Domain = kwargs.get("domain", None)
|
|
877
|
-
action_name: str = kwargs.get("action_name", None)
|
|
891
|
+
domain: Optional[Domain] = kwargs.get("domain", None)
|
|
892
|
+
action_name: Optional[str] = kwargs.get("action_name", None)
|
|
878
893
|
for response in responses:
|
|
879
894
|
generated_response = response.pop("response", None)
|
|
880
895
|
if generated_response is not None:
|
|
@@ -1014,13 +1029,13 @@ def _revert_affirmation_events(tracker: "DialogueStateTracker") -> List[Event]:
|
|
|
1014
1029
|
revert_events += _revert_rephrasing_events()
|
|
1015
1030
|
|
|
1016
1031
|
last_user_event = tracker.get_last_event_for(UserUttered)
|
|
1017
|
-
if not last_user_event:
|
|
1018
|
-
raise TypeError("Cannot find last event to revert to.")
|
|
1032
|
+
if not last_user_event or not isinstance(last_user_event, UserUttered):
|
|
1033
|
+
raise TypeError("Cannot find last user uttered event to revert to.")
|
|
1019
1034
|
|
|
1020
1035
|
last_user_event = copy.deepcopy(last_user_event)
|
|
1021
1036
|
# FIXME: better type annotation for `parse_data` would require
|
|
1022
1037
|
# a larger refactoring (e.g. switch to dataclass)
|
|
1023
|
-
last_user_event.parse_data[
|
|
1038
|
+
last_user_event.parse_data[INTENT][PREDICTED_CONFIDENCE_KEY] = 1.0 # type: ignore[literal-required]
|
|
1024
1039
|
|
|
1025
1040
|
return revert_events + [last_user_event]
|
|
1026
1041
|
|
|
@@ -1037,8 +1052,8 @@ def _revert_single_affirmation_events() -> List[Event]:
|
|
|
1037
1052
|
|
|
1038
1053
|
def _revert_successful_rephrasing(tracker: "DialogueStateTracker") -> List[Event]:
|
|
1039
1054
|
last_user_event = tracker.get_last_event_for(UserUttered)
|
|
1040
|
-
if not last_user_event:
|
|
1041
|
-
raise TypeError("Cannot find last event to revert to.")
|
|
1055
|
+
if not last_user_event or not isinstance(last_user_event, UserUttered):
|
|
1056
|
+
raise TypeError("Cannot find last user uttered event to revert to.")
|
|
1042
1057
|
|
|
1043
1058
|
last_user_event = copy.deepcopy(last_user_event)
|
|
1044
1059
|
return _revert_rephrasing_events() + [last_user_event]
|
|
@@ -1138,9 +1153,9 @@ class ActionSendText(Action):
|
|
|
1138
1153
|
metadata: Optional[Dict[Text, Any]] = None,
|
|
1139
1154
|
) -> List[Event]:
|
|
1140
1155
|
"""Runs action. Please see parent class for the full docstring."""
|
|
1141
|
-
fallback = {
|
|
1156
|
+
fallback = {ACTION_METADATA_TEXT_KEY: ""}
|
|
1142
1157
|
metadata_copy = copy.deepcopy(metadata) if metadata else {}
|
|
1143
|
-
message = metadata_copy.get(
|
|
1158
|
+
message = metadata_copy.get(ACTION_METADATA_MESSAGE_KEY, fallback)
|
|
1144
1159
|
|
|
1145
1160
|
should_send_text = metadata_copy.get("should_send_text", True)
|
|
1146
1161
|
if should_send_text:
|
|
@@ -1148,6 +1163,32 @@ class ActionSendText(Action):
|
|
|
1148
1163
|
return []
|
|
1149
1164
|
|
|
1150
1165
|
|
|
1166
|
+
class ActionAgentRequestUserInfo(Action):
|
|
1167
|
+
"""Sends a text message to the output channel that requests some user information.
|
|
1168
|
+
|
|
1169
|
+
The difference to `ActionSendText` is that this action will pause the main advancing
|
|
1170
|
+
flow loop until the user responds to the request
|
|
1171
|
+
(`should_predict_another_action` will return False for this action).
|
|
1172
|
+
"""
|
|
1173
|
+
|
|
1174
|
+
def name(self) -> Text:
|
|
1175
|
+
return ACTION_AGENT_REQUEST_USER_INPUT_NAME
|
|
1176
|
+
|
|
1177
|
+
async def run(
|
|
1178
|
+
self,
|
|
1179
|
+
output_channel: "OutputChannel",
|
|
1180
|
+
nlg: "NaturalLanguageGenerator",
|
|
1181
|
+
tracker: "DialogueStateTracker",
|
|
1182
|
+
domain: "Domain",
|
|
1183
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
1184
|
+
) -> List[Event]:
|
|
1185
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
1186
|
+
fallback = {ACTION_METADATA_TEXT_KEY: ""}
|
|
1187
|
+
metadata_copy = copy.deepcopy(metadata) if metadata else {}
|
|
1188
|
+
message = metadata_copy.get(ACTION_METADATA_MESSAGE_KEY, fallback)
|
|
1189
|
+
return [create_bot_utterance(message)]
|
|
1190
|
+
|
|
1191
|
+
|
|
1151
1192
|
class ActionExtractSlots(Action):
|
|
1152
1193
|
"""Default action that runs after each user turn.
|
|
1153
1194
|
|
|
@@ -152,7 +152,7 @@ class GRPCCustomActionExecutor(CustomActionExecutor):
|
|
|
152
152
|
structlogger.error(
|
|
153
153
|
"rasa.core.actions.grpc_custom_action_executor.domain_not_found",
|
|
154
154
|
event_info=(
|
|
155
|
-
f"Failed to execute custom action '{self.
|
|
155
|
+
f"Failed to execute custom action '{self.action_name}'. "
|
|
156
156
|
f"Could not find domain. {resource_not_found_error.message}"
|
|
157
157
|
),
|
|
158
158
|
)
|
rasa/core/agent.py
CHANGED
|
@@ -12,9 +12,11 @@ import aiohttp
|
|
|
12
12
|
from aiohttp import ClientError
|
|
13
13
|
|
|
14
14
|
import rasa.shared.utils.io
|
|
15
|
+
from rasa.agents.utils import initialize_agents
|
|
15
16
|
from rasa.core import jobs
|
|
16
|
-
from rasa.core.
|
|
17
|
+
from rasa.core.available_agents import AvailableAgents
|
|
17
18
|
from rasa.core.channels.channel import OutputChannel, UserMessage
|
|
19
|
+
from rasa.core.config.available_endpoints import AvailableEndpoints
|
|
18
20
|
from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
|
|
19
21
|
from rasa.core.exceptions import AgentNotReady
|
|
20
22
|
from rasa.core.http_interpreter import RasaNLUHttpInterpreter
|
|
@@ -34,7 +36,7 @@ from rasa.privacy.privacy_manager import BackgroundPrivacyManager
|
|
|
34
36
|
from rasa.shared.constants import DEFAULT_SENDER_ID
|
|
35
37
|
from rasa.shared.core.domain import Domain
|
|
36
38
|
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
37
|
-
from rasa.shared.exceptions import RasaException
|
|
39
|
+
from rasa.shared.exceptions import AgentInitializationException, RasaException
|
|
38
40
|
from rasa.telemetry import track_privacy_enabled
|
|
39
41
|
from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
|
|
40
42
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -202,6 +204,7 @@ async def load_agent(
|
|
|
202
204
|
model_server: Optional[EndpointConfig] = None,
|
|
203
205
|
remote_storage: Optional[StorageType] = None,
|
|
204
206
|
endpoints: Optional[AvailableEndpoints] = None,
|
|
207
|
+
sub_agents: Optional[AvailableAgents] = None,
|
|
205
208
|
loop: Optional[AbstractEventLoop] = None,
|
|
206
209
|
) -> Agent:
|
|
207
210
|
"""Loads agent from server, remote storage or disk.
|
|
@@ -211,6 +214,7 @@ async def load_agent(
|
|
|
211
214
|
model_server: Configuration for a potential server which serves the model.
|
|
212
215
|
remote_storage: Remote storage to use for loading the model.
|
|
213
216
|
endpoints: Endpoint configuration.
|
|
217
|
+
sub_agents: Sub-agents configuration.
|
|
214
218
|
loop: Optional async loop to pass to broker creation.
|
|
215
219
|
|
|
216
220
|
Returns:
|
|
@@ -281,8 +285,19 @@ async def load_agent(
|
|
|
281
285
|
"No valid configuration given to load agent. "
|
|
282
286
|
"Agent loaded with no model!"
|
|
283
287
|
)
|
|
288
|
+
|
|
289
|
+
if agent.processor and sub_agents:
|
|
290
|
+
flows = await agent.processor.get_flows()
|
|
291
|
+
# CLI commands that accept --sub-agents
|
|
292
|
+
# all route through this entry point.
|
|
293
|
+
# With all required data available,
|
|
294
|
+
# this is the best spot to initialize the subagents.
|
|
295
|
+
await initialize_agents(flows, sub_agents)
|
|
296
|
+
|
|
284
297
|
return agent
|
|
285
298
|
|
|
299
|
+
except AgentInitializationException as e:
|
|
300
|
+
raise e
|
|
286
301
|
except Exception as e:
|
|
287
302
|
logger.error(f"Could not load model due to {e}.", exc_info=True)
|
|
288
303
|
return agent
|
|
@@ -322,6 +337,7 @@ class Agent:
|
|
|
322
337
|
remote_storage: Optional[StorageType] = None,
|
|
323
338
|
http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
|
|
324
339
|
endpoints: Optional[AvailableEndpoints] = None,
|
|
340
|
+
sub_agents: Optional[AvailableAgents] = None,
|
|
325
341
|
privacy_manager: Optional[BackgroundPrivacyManager] = None,
|
|
326
342
|
):
|
|
327
343
|
"""Initializes an `Agent`."""
|
|
@@ -334,6 +350,7 @@ class Agent:
|
|
|
334
350
|
self.action_endpoint = action_endpoint
|
|
335
351
|
self.http_interpreter = http_interpreter
|
|
336
352
|
self.endpoints = endpoints
|
|
353
|
+
self.sub_agents = sub_agents
|
|
337
354
|
|
|
338
355
|
self._set_fingerprint(fingerprint)
|
|
339
356
|
self.model_server = model_server
|