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
rasa/builder/models.py
CHANGED
|
@@ -136,12 +136,14 @@ class JobStatusEvent(ServerSentEvent):
|
|
|
136
136
|
cls,
|
|
137
137
|
status: str,
|
|
138
138
|
message: Optional[str] = None,
|
|
139
|
+
payload: Optional[Dict[str, Any]] = None,
|
|
139
140
|
) -> "JobStatusEvent":
|
|
140
141
|
"""Factory for job-status events.
|
|
141
142
|
|
|
142
143
|
Args:
|
|
143
144
|
status: The job status (e.g. "training", "train_success").
|
|
144
145
|
message: Optional error message for error events.
|
|
146
|
+
payload: Optional additional payload data to include in the event.
|
|
145
147
|
|
|
146
148
|
Returns:
|
|
147
149
|
A JobStatusEvent instance with the appropriate event type and data.
|
|
@@ -150,11 +152,13 @@ class JobStatusEvent(ServerSentEvent):
|
|
|
150
152
|
ServerSentEventType.error if message else ServerSentEventType.progress
|
|
151
153
|
)
|
|
152
154
|
|
|
153
|
-
|
|
155
|
+
event_payload: Dict[str, Any] = {"status": status}
|
|
154
156
|
if message:
|
|
155
|
-
|
|
157
|
+
event_payload["message"] = message
|
|
158
|
+
if payload:
|
|
159
|
+
event_payload.update(payload)
|
|
156
160
|
|
|
157
|
-
return cls(event=event_type.value, data=
|
|
161
|
+
return cls(event=event_type.value, data=event_payload)
|
|
158
162
|
|
|
159
163
|
|
|
160
164
|
class ValidationResult(BaseModel):
|
|
@@ -193,6 +197,11 @@ class JobStatus(str, Enum):
|
|
|
193
197
|
validation_success = "validation_success"
|
|
194
198
|
validation_error = "validation_error"
|
|
195
199
|
|
|
200
|
+
copilot_analysis_start = "copilot_analysis_start"
|
|
201
|
+
copilot_analyzing = "copilot_analyzing"
|
|
202
|
+
copilot_analysis_success = "copilot_analysis_success"
|
|
203
|
+
copilot_analysis_error = "copilot_analysis_error"
|
|
204
|
+
|
|
196
205
|
|
|
197
206
|
class JobCreateResponse(BaseModel):
|
|
198
207
|
job_id: str = Field(...)
|
|
@@ -206,6 +215,7 @@ class TrainingInput(BaseModel):
|
|
|
206
215
|
|
|
207
216
|
importer: TrainingDataImporter = Field(..., description="Training data importer")
|
|
208
217
|
endpoints_file: Path = Field(..., description="Path to the endpoints file")
|
|
218
|
+
config_file: Path = Field(..., description="Path to the config file")
|
|
209
219
|
|
|
210
220
|
|
|
211
221
|
class AgentStatus(str, Enum):
|
|
@@ -192,11 +192,16 @@ class ProjectGenerator:
|
|
|
192
192
|
"""Get the endpoints file."""
|
|
193
193
|
return self.project_folder / "endpoints.yml"
|
|
194
194
|
|
|
195
|
+
def _get_config_file(self) -> Path:
|
|
196
|
+
"""Get the config file."""
|
|
197
|
+
return self.project_folder / "config.yml"
|
|
198
|
+
|
|
195
199
|
def get_training_input(self) -> TrainingInput:
|
|
196
200
|
"""Get the training input."""
|
|
197
201
|
return TrainingInput(
|
|
198
202
|
importer=self._create_importer(),
|
|
199
203
|
endpoints_file=self._get_endpoints_file(),
|
|
204
|
+
config_file=self._get_config_file(),
|
|
200
205
|
)
|
|
201
206
|
|
|
202
207
|
def _create_importer(self) -> TrainingDataImporter:
|
|
@@ -208,7 +213,7 @@ class ProjectGenerator:
|
|
|
208
213
|
domain_path = self.project_folder / "domain"
|
|
209
214
|
|
|
210
215
|
return TrainingDataImporter.load_from_config(
|
|
211
|
-
config_path=str(self.
|
|
216
|
+
config_path=str(self._get_config_file()),
|
|
212
217
|
domain_path=str(domain_path),
|
|
213
218
|
training_data_paths=[str(self.project_folder / "data")],
|
|
214
219
|
args={},
|
rasa/builder/service.py
CHANGED
|
@@ -17,6 +17,8 @@ from rasa.builder.config import (
|
|
|
17
17
|
COPILOT_HANDLER_ROLLING_BUFFER_SIZE,
|
|
18
18
|
GUARDRAILS_ENABLE_BLOCKING,
|
|
19
19
|
HELLO_RASA_PROJECT_ID,
|
|
20
|
+
LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
21
|
+
LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
20
22
|
)
|
|
21
23
|
from rasa.builder.copilot.constants import ROLE_USER, SIGNATURE_VERSION_V1
|
|
22
24
|
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
@@ -47,10 +49,6 @@ from rasa.builder.guardrails.constants import (
|
|
|
47
49
|
BlockScope,
|
|
48
50
|
)
|
|
49
51
|
from rasa.builder.guardrails.store import guardrails_store
|
|
50
|
-
from rasa.builder.guardrails.utils import (
|
|
51
|
-
check_assistant_chat_for_policy_violations,
|
|
52
|
-
check_copilot_chat_for_policy_violations,
|
|
53
|
-
)
|
|
54
52
|
from rasa.builder.job_manager import job_manager
|
|
55
53
|
from rasa.builder.jobs import (
|
|
56
54
|
run_prompt_to_bot_job,
|
|
@@ -534,7 +532,19 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
534
532
|
"**Error Events (can occur at any time):**\n"
|
|
535
533
|
"- `validation_error` - Bot configuration files are invalid\n"
|
|
536
534
|
"- `train_error` - Files updated but training failed\n"
|
|
535
|
+
"- `copilot_analysis_start` - Copilot analysis started (includes `copilot_job_id` "
|
|
536
|
+
"in payload)\n"
|
|
537
537
|
"- `error` - Unexpected error occurred\n\n"
|
|
538
|
+
"**Copilot Analysis Events:**\n"
|
|
539
|
+
"When training or validation fails, a separate copilot analysis job is "
|
|
540
|
+
"automatically started. The `copilot_analysis_start` event includes a "
|
|
541
|
+
"`copilot_job_id` in the payload.\nConnect to `/job-events/<copilot_job_id>` to "
|
|
542
|
+
"receive the following events:\n"
|
|
543
|
+
"- `copilot_analyzing` - Copilot is analyzing errors and providing suggestions. "
|
|
544
|
+
"Uses the same SSE event payload format as the `/copilot` endpoint with `content`, "
|
|
545
|
+
"`response_category`, and `completeness` fields.\n"
|
|
546
|
+
"- `copilot_analysis_success` - Copilot analysis completed with references.\n"
|
|
547
|
+
"- `copilot_analysis_error` - Copilot analysis failed\n\n"
|
|
538
548
|
"**Usage:**\n"
|
|
539
549
|
"1. Send POST request with Content-Type: application/json\n"
|
|
540
550
|
"2. The response will be a JSON object `{job_id: ...}`\n"
|
|
@@ -1044,7 +1054,8 @@ async def copilot(request: Request) -> None:
|
|
|
1044
1054
|
# Offload telemetry logging to a background task
|
|
1045
1055
|
request.app.add_task(
|
|
1046
1056
|
asyncio.to_thread(
|
|
1047
|
-
telemetry.log_user_turn,
|
|
1057
|
+
telemetry.log_user_turn,
|
|
1058
|
+
req.last_message.get_flattened_text_content(),
|
|
1048
1059
|
)
|
|
1049
1060
|
)
|
|
1050
1061
|
|
|
@@ -1081,11 +1092,15 @@ async def copilot(request: Request) -> None:
|
|
|
1081
1092
|
tracker_context = TrackerContext.from_tracker(
|
|
1082
1093
|
tracker, max_turns=COPILOT_ASSISTANT_TRACKER_MAX_TURNS
|
|
1083
1094
|
)
|
|
1084
|
-
if
|
|
1085
|
-
tracker_context
|
|
1095
|
+
if (
|
|
1096
|
+
tracker_context is not None
|
|
1097
|
+
and llm_service.guardrails_policy_checker is not None
|
|
1098
|
+
):
|
|
1099
|
+
tracker_context = await llm_service.guardrails_policy_checker.check_assistant_chat_for_policy_violations( # noqa: E501
|
|
1086
1100
|
tracker_context=tracker_context,
|
|
1087
1101
|
hello_rasa_user_id=user_id,
|
|
1088
1102
|
hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
|
|
1103
|
+
lakera_project_id=LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
1089
1104
|
)
|
|
1090
1105
|
|
|
1091
1106
|
# Copilot doesn't need to know about the docs and any file that is not a core
|
|
@@ -1103,13 +1118,14 @@ async def copilot(request: Request) -> None:
|
|
|
1103
1118
|
|
|
1104
1119
|
# 5. Run guardrail policy checks. If any policy violations are detected,
|
|
1105
1120
|
# send a response and end the stream.
|
|
1106
|
-
guardrail_response: Optional[
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1121
|
+
guardrail_response: Optional[GeneratedContent] = None
|
|
1122
|
+
if llm_service.guardrails_policy_checker is not None:
|
|
1123
|
+
guardrail_response = await llm_service.guardrails_policy_checker.check_copilot_chat_for_policy_violations( # noqa: E501
|
|
1124
|
+
context=context,
|
|
1125
|
+
hello_rasa_user_id=user_id,
|
|
1126
|
+
hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
|
|
1127
|
+
lakera_project_id=LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
1128
|
+
)
|
|
1113
1129
|
if guardrail_response is not None:
|
|
1114
1130
|
blocked_or_violation_message = (
|
|
1115
1131
|
await _handle_guardrail_violation_and_maybe_block(
|
|
@@ -1156,7 +1172,7 @@ async def copilot(request: Request) -> None:
|
|
|
1156
1172
|
system_message=generation_context.system_message,
|
|
1157
1173
|
chat_history=generation_context.chat_history,
|
|
1158
1174
|
last_user_message=(
|
|
1159
|
-
req.last_message.
|
|
1175
|
+
req.last_message.get_flattened_text_content()
|
|
1160
1176
|
if (req.last_message and req.last_message.role == ROLE_USER)
|
|
1161
1177
|
else None
|
|
1162
1178
|
),
|
rasa/builder/training_service.py
CHANGED
|
@@ -11,9 +11,10 @@ from rasa.builder.exceptions import AgentLoadError, TrainingError
|
|
|
11
11
|
from rasa.builder.models import TrainingInput
|
|
12
12
|
from rasa.core.agent import Agent, load_agent
|
|
13
13
|
from rasa.core.channels.studio_chat import StudioChatInput
|
|
14
|
-
from rasa.core.
|
|
14
|
+
from rasa.core.config.configuration import Configuration
|
|
15
15
|
from rasa.model import get_latest_model
|
|
16
16
|
from rasa.model_training import TrainingResult, train
|
|
17
|
+
from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH
|
|
17
18
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
18
19
|
|
|
19
20
|
structlogger = structlog.get_logger()
|
|
@@ -42,14 +43,13 @@ async def train_and_load_agent(input: TrainingInput) -> Agent:
|
|
|
42
43
|
AgentLoadError: If agent loading fails
|
|
43
44
|
"""
|
|
44
45
|
try:
|
|
45
|
-
# Setup endpoints for training validation
|
|
46
|
-
await _setup_endpoints(input.endpoints_file)
|
|
47
|
-
|
|
48
46
|
# Train the model
|
|
49
|
-
training_result = await _train_model(
|
|
47
|
+
training_result = await _train_model(
|
|
48
|
+
input.importer, input.endpoints_file, input.config_file
|
|
49
|
+
)
|
|
50
50
|
|
|
51
51
|
# Load the agent
|
|
52
|
-
agent_instance = await _load_agent(training_result.model)
|
|
52
|
+
agent_instance = await _load_agent(training_result.model, input.endpoints_file)
|
|
53
53
|
|
|
54
54
|
# Verify agent is ready
|
|
55
55
|
if not agent_instance.is_ready():
|
|
@@ -96,7 +96,9 @@ async def try_load_existing_agent(project_folder: str) -> Optional[Agent]:
|
|
|
96
96
|
)
|
|
97
97
|
|
|
98
98
|
# Get available endpoints for agent loading
|
|
99
|
-
available_endpoints =
|
|
99
|
+
available_endpoints = Configuration.initialise_endpoints(
|
|
100
|
+
endpoints_path=Path(project_folder) / DEFAULT_ENDPOINTS_PATH
|
|
101
|
+
).endpoints
|
|
100
102
|
|
|
101
103
|
# Load the agent
|
|
102
104
|
agent = await load_agent(
|
|
@@ -124,27 +126,17 @@ async def try_load_existing_agent(project_folder: str) -> Optional[Agent]:
|
|
|
124
126
|
return None
|
|
125
127
|
|
|
126
128
|
|
|
127
|
-
async def
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
# Reset and load endpoints
|
|
131
|
-
AvailableEndpoints.reset_instance()
|
|
132
|
-
read_endpoints_from_path(endpoints_file)
|
|
133
|
-
|
|
134
|
-
structlogger.debug("training.endpoints_setup", endpoints_file=endpoints_file)
|
|
135
|
-
|
|
136
|
-
except Exception as e:
|
|
137
|
-
raise TrainingError(f"Failed to setup endpoints: {e}")
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
async def _train_model(importer: TrainingDataImporter) -> TrainingResult:
|
|
129
|
+
async def _train_model(
|
|
130
|
+
importer: TrainingDataImporter, endpoints_file: Path, config_file: Path
|
|
131
|
+
) -> TrainingResult:
|
|
141
132
|
"""Train the Rasa model."""
|
|
142
133
|
try:
|
|
143
134
|
structlogger.info("training.started")
|
|
144
135
|
|
|
145
136
|
training_result = await train(
|
|
146
137
|
domain="",
|
|
147
|
-
config=
|
|
138
|
+
config=str(config_file),
|
|
139
|
+
endpoints=str(endpoints_file),
|
|
148
140
|
training_files=None,
|
|
149
141
|
file_importer=importer,
|
|
150
142
|
)
|
|
@@ -160,12 +152,14 @@ async def _train_model(importer: TrainingDataImporter) -> TrainingResult:
|
|
|
160
152
|
raise TrainingError(f"Model training failed: {e}")
|
|
161
153
|
|
|
162
154
|
|
|
163
|
-
async def _load_agent(model_path: str) -> Agent:
|
|
155
|
+
async def _load_agent(model_path: str, endpoints_file: Path) -> Agent:
|
|
164
156
|
"""Load the trained agent."""
|
|
165
157
|
try:
|
|
166
158
|
structlogger.info("training.loading_agent", model_path=model_path)
|
|
167
159
|
|
|
168
|
-
available_endpoints =
|
|
160
|
+
available_endpoints = Configuration.initialise_endpoints(
|
|
161
|
+
endpoints_path=endpoints_file
|
|
162
|
+
).endpoints
|
|
169
163
|
if available_endpoints is None:
|
|
170
164
|
raise AgentLoadError("No endpoints available for agent loading")
|
|
171
165
|
|
|
@@ -9,7 +9,7 @@ import structlog
|
|
|
9
9
|
from rasa.builder import config
|
|
10
10
|
from rasa.builder.exceptions import ValidationError
|
|
11
11
|
from rasa.builder.logging_utils import capture_validation_logs
|
|
12
|
-
from rasa.cli.
|
|
12
|
+
from rasa.cli.validation.bot_config import validate_files
|
|
13
13
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
14
14
|
|
|
15
15
|
structlogger = structlog.get_logger()
|
|
@@ -3,6 +3,7 @@ import logging
|
|
|
3
3
|
from enum import Enum
|
|
4
4
|
from typing import List, Optional, Text, Union
|
|
5
5
|
|
|
6
|
+
from rasa.core.constants import DEFAULT_SUB_AGENTS
|
|
6
7
|
from rasa.core.persistor import RemoteStorageType, StorageType, parse_remote_storage
|
|
7
8
|
from rasa.shared.constants import (
|
|
8
9
|
DEFAULT_CONFIG_PATH,
|
|
@@ -217,3 +218,14 @@ def add_skip_validation_flag(
|
|
|
217
218
|
action="append",
|
|
218
219
|
help="Skip YAML validation for selected parts of the training data.",
|
|
219
220
|
)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def add_sub_agents_param(
|
|
224
|
+
parser: Union[argparse.ArgumentParser, argparse._ActionsContainer],
|
|
225
|
+
) -> None:
|
|
226
|
+
parser.add_argument(
|
|
227
|
+
"--sub-agents",
|
|
228
|
+
type=str,
|
|
229
|
+
default=DEFAULT_SUB_AGENTS,
|
|
230
|
+
help="Directory that specifies sub-agents to use (default: %(default)s).",
|
|
231
|
+
)
|
rasa/cli/arguments/run.py
CHANGED
|
@@ -7,6 +7,7 @@ from rasa.cli.arguments.default_arguments import (
|
|
|
7
7
|
add_model_param,
|
|
8
8
|
add_remote_storage_param,
|
|
9
9
|
add_skip_validation_flag,
|
|
10
|
+
add_sub_agents_param,
|
|
10
11
|
)
|
|
11
12
|
from rasa.core import constants
|
|
12
13
|
from rasa.env import (
|
|
@@ -24,6 +25,7 @@ def set_run_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
24
25
|
add_server_arguments(parser)
|
|
25
26
|
add_inspect_argument(parser)
|
|
26
27
|
add_skip_validation_flag(parser)
|
|
28
|
+
add_sub_agents_param(parser)
|
|
27
29
|
|
|
28
30
|
|
|
29
31
|
def set_run_action_arguments(parser: argparse.ArgumentParser) -> None:
|
rasa/cli/arguments/train.py
CHANGED
|
@@ -10,6 +10,7 @@ from rasa.cli.arguments.default_arguments import (
|
|
|
10
10
|
add_remote_root_only_param,
|
|
11
11
|
add_remote_storage_param,
|
|
12
12
|
add_stories_param,
|
|
13
|
+
add_sub_agents_param,
|
|
13
14
|
)
|
|
14
15
|
from rasa.graph_components.providers.training_tracker_provider import (
|
|
15
16
|
TrainingTrackerProvider,
|
|
@@ -43,6 +44,7 @@ def set_train_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
43
44
|
)
|
|
44
45
|
add_remote_storage_param(parser)
|
|
45
46
|
add_remote_root_only_param(parser)
|
|
47
|
+
add_sub_agents_param(parser)
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
def set_train_core_arguments(parser: argparse.ArgumentParser) -> None:
|
rasa/cli/data.py
CHANGED
|
@@ -15,6 +15,8 @@ from rasa import telemetry
|
|
|
15
15
|
from rasa.cli import SubParsersAction
|
|
16
16
|
from rasa.cli.arguments import data as arguments
|
|
17
17
|
from rasa.cli.arguments import default_arguments
|
|
18
|
+
from rasa.cli.validation.bot_config import validate_files
|
|
19
|
+
from rasa.cli.validation.config_path_validation import get_validated_path
|
|
18
20
|
from rasa.e2e_test.e2e_config import create_llm_e2e_test_converter_config
|
|
19
21
|
from rasa.e2e_test.e2e_test_converter import E2ETestConverter
|
|
20
22
|
from rasa.e2e_test.utils.e2e_yaml_utils import E2ETestYAMLWriter
|
|
@@ -137,7 +139,7 @@ def _add_data_validate_parsers(
|
|
|
137
139
|
)
|
|
138
140
|
_append_story_structure_arguments(validate_parser)
|
|
139
141
|
validate_parser.set_defaults(
|
|
140
|
-
func=lambda args:
|
|
142
|
+
func=lambda args: validate_files(
|
|
141
143
|
args.fail_on_warnings, args.max_history, _build_training_data_importer(args)
|
|
142
144
|
)
|
|
143
145
|
)
|
|
@@ -153,7 +155,7 @@ def _add_data_validate_parsers(
|
|
|
153
155
|
_append_story_structure_arguments(story_structure_parser)
|
|
154
156
|
|
|
155
157
|
story_structure_parser.set_defaults(
|
|
156
|
-
func=lambda args:
|
|
158
|
+
func=lambda args: validate_files(
|
|
157
159
|
args.fail_on_warnings,
|
|
158
160
|
args.max_history,
|
|
159
161
|
_build_training_data_importer(args),
|
|
@@ -169,7 +171,7 @@ def _add_data_validate_parsers(
|
|
|
169
171
|
help="Checks for inconsistencies in the flows files.",
|
|
170
172
|
)
|
|
171
173
|
flows_structure_parser.set_defaults(
|
|
172
|
-
func=lambda args:
|
|
174
|
+
func=lambda args: validate_files(
|
|
173
175
|
args.fail_on_warnings,
|
|
174
176
|
args.max_history,
|
|
175
177
|
_build_training_data_importer(args),
|
|
@@ -185,7 +187,7 @@ def _add_data_validate_parsers(
|
|
|
185
187
|
help="Checks for inconsistencies of the flow and response translation.",
|
|
186
188
|
)
|
|
187
189
|
translations_structure_parser.set_defaults(
|
|
188
|
-
func=lambda args:
|
|
190
|
+
func=lambda args: validate_files(
|
|
189
191
|
args.fail_on_warnings,
|
|
190
192
|
args.max_history,
|
|
191
193
|
_build_training_data_importer(args),
|
|
@@ -196,12 +198,12 @@ def _add_data_validate_parsers(
|
|
|
196
198
|
|
|
197
199
|
|
|
198
200
|
def _build_training_data_importer(args: argparse.Namespace) -> "TrainingDataImporter":
|
|
199
|
-
config =
|
|
201
|
+
config = get_validated_path(
|
|
200
202
|
args.config, "config", DEFAULT_CONFIG_PATH, none_is_valid=True
|
|
201
203
|
)
|
|
202
204
|
|
|
203
205
|
# Exit the validation if the domain path is invalid
|
|
204
|
-
domain =
|
|
206
|
+
domain = get_validated_path(
|
|
205
207
|
args.domain, "domain", DEFAULT_DOMAIN_PATHS, none_is_valid=False
|
|
206
208
|
)
|
|
207
209
|
|
|
@@ -231,7 +233,7 @@ def split_nlu_data(args: argparse.Namespace) -> None:
|
|
|
231
233
|
Args:
|
|
232
234
|
args: Commandline arguments
|
|
233
235
|
"""
|
|
234
|
-
data_path =
|
|
236
|
+
data_path = get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
|
|
235
237
|
data_path = rasa.shared.data.get_nlu_directory(data_path)
|
|
236
238
|
|
|
237
239
|
nlu_data = rasa.shared.nlu.training_data.loading.load_data(data_path)
|
|
@@ -258,7 +260,7 @@ def split_stories_data(args: argparse.Namespace) -> None:
|
|
|
258
260
|
YAMLStoryReader,
|
|
259
261
|
)
|
|
260
262
|
|
|
261
|
-
data_path =
|
|
263
|
+
data_path = get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
|
|
262
264
|
data_files = rasa.shared.data.get_data_files(
|
|
263
265
|
data_path, YAMLStoryReader.is_stories_file
|
|
264
266
|
)
|
|
@@ -3,6 +3,7 @@ import asyncio
|
|
|
3
3
|
import datetime
|
|
4
4
|
import importlib
|
|
5
5
|
import sys
|
|
6
|
+
from pathlib import Path
|
|
6
7
|
from typing import Any, Dict, List, Optional, Type, cast
|
|
7
8
|
|
|
8
9
|
import structlog
|
|
@@ -14,9 +15,11 @@ from rasa.cli.arguments.default_arguments import (
|
|
|
14
15
|
add_endpoint_param,
|
|
15
16
|
add_model_param,
|
|
16
17
|
add_remote_storage_param,
|
|
18
|
+
add_sub_agents_param,
|
|
17
19
|
)
|
|
18
20
|
from rasa.core.agent import Agent
|
|
19
|
-
from rasa.core.available_endpoints import AvailableEndpoints
|
|
21
|
+
from rasa.core.config.available_endpoints import AvailableEndpoints
|
|
22
|
+
from rasa.core.config.configuration import Configuration
|
|
20
23
|
from rasa.core.exceptions import AgentNotReady
|
|
21
24
|
from rasa.core.processor import MessageProcessor
|
|
22
25
|
from rasa.dialogue_understanding.commands import Command
|
|
@@ -47,7 +50,6 @@ from rasa.dialogue_understanding_test.validation import (
|
|
|
47
50
|
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
48
51
|
from rasa.exceptions import RasaException
|
|
49
52
|
from rasa.shared.constants import (
|
|
50
|
-
DEFAULT_ENDPOINTS_PATH,
|
|
51
53
|
LLM_CONFIG_KEY,
|
|
52
54
|
ROUTE_TO_CALM_SLOT,
|
|
53
55
|
)
|
|
@@ -174,6 +176,8 @@ def add_du_test_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
174
176
|
),
|
|
175
177
|
)
|
|
176
178
|
|
|
179
|
+
add_sub_agents_param(du_arguments)
|
|
180
|
+
|
|
177
181
|
|
|
178
182
|
def ensure_calm_only_bot(agent: Agent) -> None:
|
|
179
183
|
if agent.domain is None or agent.processor is None:
|
|
@@ -218,6 +222,7 @@ def execute_dialogue_understanding_tests(args: argparse.Namespace) -> None:
|
|
|
218
222
|
model_path=args.model,
|
|
219
223
|
model_server=endpoints.model,
|
|
220
224
|
remote_storage=args.remote_storage,
|
|
225
|
+
sub_agents_path=args.sub_agents,
|
|
221
226
|
)
|
|
222
227
|
except AgentNotReady as error:
|
|
223
228
|
structlogger.error(
|
|
@@ -323,11 +328,9 @@ def get_valid_test_suite(
|
|
|
323
328
|
|
|
324
329
|
|
|
325
330
|
def set_up_available_endpoints(args: argparse.Namespace) -> AvailableEndpoints:
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
)
|
|
330
|
-
endpoints = AvailableEndpoints.get_instance(args.endpoints)
|
|
331
|
+
endpoints = Configuration.initialise_endpoints(
|
|
332
|
+
endpoints_path=Path(args.endpoints)
|
|
333
|
+
).endpoints
|
|
331
334
|
|
|
332
335
|
# Ignore all endpoints apart from action server, model, and nlu
|
|
333
336
|
# to ensure InMemoryTrackerStore is being used instead of production
|
rasa/cli/e2e_test.py
CHANGED
|
@@ -17,8 +17,9 @@ from rasa.cli.arguments.default_arguments import (
|
|
|
17
17
|
add_endpoint_param,
|
|
18
18
|
add_model_param,
|
|
19
19
|
add_remote_storage_param,
|
|
20
|
+
add_sub_agents_param,
|
|
20
21
|
)
|
|
21
|
-
from rasa.core.
|
|
22
|
+
from rasa.core.config.configuration import Configuration, EndpointsConfigPath
|
|
22
23
|
from rasa.core.exceptions import AgentNotReady
|
|
23
24
|
from rasa.e2e_test.aggregate_test_stats_calculator import (
|
|
24
25
|
AggregateTestStatsCalculator,
|
|
@@ -50,7 +51,7 @@ from rasa.e2e_test.utils.io import (
|
|
|
50
51
|
)
|
|
51
52
|
from rasa.e2e_test.utils.validation import validate_model_path
|
|
52
53
|
from rasa.exceptions import RasaException
|
|
53
|
-
from rasa.shared.constants import
|
|
54
|
+
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
54
55
|
from rasa.utils.endpoints import EndpointConfig
|
|
55
56
|
|
|
56
57
|
RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME = "RASA_PRO_BETA_FINE_TUNING_RECIPE"
|
|
@@ -147,6 +148,8 @@ def add_e2e_test_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
147
148
|
help="Directory where to save coverage report to.",
|
|
148
149
|
)
|
|
149
150
|
|
|
151
|
+
add_sub_agents_param(parser)
|
|
152
|
+
|
|
150
153
|
|
|
151
154
|
def execute_e2e_tests(args: argparse.Namespace) -> None:
|
|
152
155
|
"""Run the end-to-end tests.
|
|
@@ -154,10 +157,9 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
|
|
|
154
157
|
Args:
|
|
155
158
|
args: Commandline arguments.
|
|
156
159
|
"""
|
|
157
|
-
|
|
158
|
-
args.endpoints
|
|
159
|
-
)
|
|
160
|
-
endpoints = AvailableEndpoints.get_instance(args.endpoints)
|
|
160
|
+
endpoints = Configuration.initialise_endpoints(
|
|
161
|
+
endpoints_path=EndpointsConfigPath.validate(args.endpoints)
|
|
162
|
+
).endpoints
|
|
161
163
|
|
|
162
164
|
# Ignore all endpoints apart from action server, model, nlu and nlg
|
|
163
165
|
# to ensure InMemoryTrackerStore is being used instead of production
|
|
@@ -192,6 +194,7 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
|
|
|
192
194
|
model_server=endpoints.model,
|
|
193
195
|
endpoints=endpoints,
|
|
194
196
|
test_case_path=Path(test_case_path),
|
|
197
|
+
sub_agents_path=args.sub_agents,
|
|
195
198
|
)
|
|
196
199
|
except AgentNotReady as error:
|
|
197
200
|
structlogger.error(
|
rasa/cli/evaluate.py
CHANGED
|
@@ -6,7 +6,7 @@ import rasa.cli.arguments.evaluate as arguments
|
|
|
6
6
|
import rasa.shared.utils.cli
|
|
7
7
|
from rasa import telemetry
|
|
8
8
|
from rasa.cli import SubParsersAction
|
|
9
|
-
from rasa.core.
|
|
9
|
+
from rasa.core.config.configuration import Configuration
|
|
10
10
|
from rasa.core.evaluation.marker_base import Marker, OperatorMarker
|
|
11
11
|
from rasa.core.evaluation.marker_tracker_loader import MarkerTrackerLoader
|
|
12
12
|
from rasa.core.tracker_stores.tracker_store import TrackerStore
|
|
@@ -217,6 +217,8 @@ def _create_tracker_loader(
|
|
|
217
217
|
A MarkerTrackerLoader object configured with the specified strategy against
|
|
218
218
|
the configured tracker store.
|
|
219
219
|
"""
|
|
220
|
-
endpoints =
|
|
220
|
+
endpoints = Configuration.initialise_endpoints(
|
|
221
|
+
endpoints_path=Path(endpoint_config)
|
|
222
|
+
).endpoints
|
|
221
223
|
tracker_store = TrackerStore.create(endpoints.tracker_store, domain=domain)
|
|
222
224
|
return MarkerTrackerLoader(tracker_store, strategy, count, seed)
|
rasa/cli/export.py
CHANGED
|
@@ -11,13 +11,14 @@ from rasa import telemetry
|
|
|
11
11
|
from rasa.cli import SubParsersAction
|
|
12
12
|
from rasa.cli.arguments import export as arguments
|
|
13
13
|
from rasa.core.brokers.pika import PikaEventBroker
|
|
14
|
+
from rasa.core.config.configuration import Configuration
|
|
14
15
|
from rasa.exceptions import PublishingError
|
|
15
16
|
from rasa.shared.constants import DOCS_URL_EVENT_BROKERS, DOCS_URL_TRACKER_STORES
|
|
16
17
|
from rasa.shared.exceptions import RasaException
|
|
17
18
|
|
|
18
19
|
if typing.TYPE_CHECKING:
|
|
19
|
-
from rasa.core.available_endpoints import AvailableEndpoints
|
|
20
20
|
from rasa.core.brokers.broker import EventBroker
|
|
21
|
+
from rasa.core.config.available_endpoints import AvailableEndpoints
|
|
21
22
|
from rasa.core.exporter import Exporter
|
|
22
23
|
from rasa.core.tracker_stores.tracker_store import TrackerStore
|
|
23
24
|
|
|
@@ -179,7 +180,9 @@ def export_trackers(args: argparse.Namespace) -> None:
|
|
|
179
180
|
async def _export_trackers(args: argparse.Namespace) -> None:
|
|
180
181
|
_assert_max_timestamp_is_greater_than_min_timestamp(args)
|
|
181
182
|
|
|
182
|
-
endpoints =
|
|
183
|
+
endpoints = Configuration.initialise_endpoints(
|
|
184
|
+
endpoints_path=args.endpoints
|
|
185
|
+
).endpoints
|
|
183
186
|
tracker_store = _get_tracker_store(endpoints)
|
|
184
187
|
event_broker = await _get_event_broker(endpoints)
|
|
185
188
|
_prepare_event_broker(event_broker)
|
rasa/cli/inspect.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import webbrowser
|
|
3
3
|
from asyncio import AbstractEventLoop
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
from typing import List, Optional, Text
|
|
5
6
|
|
|
6
7
|
from sanic import Sanic
|
|
@@ -8,8 +9,9 @@ from sanic import Sanic
|
|
|
8
9
|
from rasa import telemetry
|
|
9
10
|
from rasa.cli import SubParsersAction
|
|
10
11
|
from rasa.cli.arguments import shell as arguments
|
|
12
|
+
from rasa.cli.arguments.default_arguments import add_sub_agents_param
|
|
11
13
|
from rasa.core import constants
|
|
12
|
-
from rasa.core.
|
|
14
|
+
from rasa.core.config.configuration import Configuration
|
|
13
15
|
from rasa.engine.storage.local_model_storage import LocalModelStorage
|
|
14
16
|
from rasa.exceptions import ModelNotFound
|
|
15
17
|
from rasa.model import get_local_model
|
|
@@ -44,6 +46,8 @@ def add_subparser(
|
|
|
44
46
|
"--voice", help="Enable voice", action="store_true", default=False
|
|
45
47
|
)
|
|
46
48
|
|
|
49
|
+
add_sub_agents_param(inspect_parser)
|
|
50
|
+
|
|
47
51
|
# it'd be confusing to expose those arguments to the user,
|
|
48
52
|
# so we remove them
|
|
49
53
|
remove_argument_from_parser(inspect_parser, "--credentials")
|
|
@@ -64,7 +68,7 @@ async def open_inspector_in_browser(
|
|
|
64
68
|
def inspect(args: argparse.Namespace) -> None:
|
|
65
69
|
"""Inspect the bot using the most recent model."""
|
|
66
70
|
import rasa.cli.run
|
|
67
|
-
from rasa.cli.
|
|
71
|
+
from rasa.cli.validation.config_path_validation import get_validated_path
|
|
68
72
|
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
69
73
|
|
|
70
74
|
async def after_start_hook_open_inspector(_: Sanic, __: AbstractEventLoop) -> None:
|
|
@@ -87,8 +91,8 @@ def inspect(args: argparse.Namespace) -> None:
|
|
|
87
91
|
# Load endpoints with proper endpoint file location
|
|
88
92
|
# This will initialise the endpoints singleton properly so that
|
|
89
93
|
# it can be used safely throughout the codebase with
|
|
90
|
-
# `
|
|
91
|
-
|
|
94
|
+
# `Configuration.get_instance().endpoints`
|
|
95
|
+
Configuration.initialise_endpoints(endpoints_path=Path(args.endpoints))
|
|
92
96
|
|
|
93
97
|
try:
|
|
94
98
|
model = get_local_model(model)
|
rasa/cli/interactive.py
CHANGED
|
@@ -11,6 +11,8 @@ import rasa.utils.common
|
|
|
11
11
|
from rasa import model
|
|
12
12
|
from rasa.cli import SubParsersAction
|
|
13
13
|
from rasa.cli.arguments import interactive as arguments
|
|
14
|
+
from rasa.cli.validation.config_path_validation import get_validated_path
|
|
15
|
+
from rasa.core.constants import DEFAULT_SUB_AGENTS
|
|
14
16
|
from rasa.engine.storage.local_model_storage import LocalModelStorage
|
|
15
17
|
from rasa.shared.constants import (
|
|
16
18
|
ASSISTANT_ID_DEFAULT_VALUE,
|
|
@@ -109,6 +111,7 @@ def _set_not_required_args(args: argparse.Namespace) -> None:
|
|
|
109
111
|
args.validation_max_history = None
|
|
110
112
|
args.remote_storage = None
|
|
111
113
|
args.keep_local_model_copy = False
|
|
114
|
+
args.sub_agents = DEFAULT_SUB_AGENTS # Default value for sub-agents
|
|
112
115
|
|
|
113
116
|
|
|
114
117
|
def perform_interactive_learning(
|
|
@@ -133,7 +136,7 @@ def perform_interactive_learning(
|
|
|
133
136
|
"Can not run interactive learning on an NLU-only model."
|
|
134
137
|
)
|
|
135
138
|
|
|
136
|
-
args.endpoints =
|
|
139
|
+
args.endpoints = get_validated_path(
|
|
137
140
|
args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
|
|
138
141
|
)
|
|
139
142
|
|
|
@@ -142,9 +145,7 @@ def perform_interactive_learning(
|
|
|
142
145
|
|
|
143
146
|
def get_provided_model(arg_model: Text) -> Optional[Union[Text, Path]]:
|
|
144
147
|
"""Checks model path input and selects model from it."""
|
|
145
|
-
model_path =
|
|
146
|
-
arg_model, "model", DEFAULT_MODELS_PATH
|
|
147
|
-
)
|
|
148
|
+
model_path = get_validated_path(arg_model, "model", DEFAULT_MODELS_PATH)
|
|
148
149
|
|
|
149
150
|
return (
|
|
150
151
|
model.get_latest_model(model_path) if os.path.isdir(model_path) else model_path
|