rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +163 -0
- rasa/agents/constants.py +40 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +70 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/a2a_agent.py +662 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +685 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +290 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +484 -0
- rasa/agents/schemas/__init__.py +12 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +67 -0
- rasa/agents/schemas/agent_tool_schema.py +134 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +15 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +17 -0
- rasa/agents/utils.py +77 -0
- rasa/agents/validation.py +484 -0
- rasa/api.py +14 -6
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/dialogue_understanding_test.py +4 -0
- rasa/cli/e2e_test.py +4 -0
- rasa/cli/inspect.py +3 -0
- rasa/cli/interactive.py +2 -0
- rasa/cli/llm_fine_tuning.py +5 -0
- rasa/cli/project_templates/tutorial/config.yml +1 -2
- rasa/cli/run.py +4 -0
- rasa/cli/scaffold.py +2 -46
- rasa/cli/shell.py +3 -0
- rasa/cli/train.py +2 -0
- rasa/cli/utils.py +85 -1
- rasa/constants.py +6 -0
- rasa/core/actions/action.py +52 -10
- rasa/core/agent.py +19 -1
- rasa/core/available_agents.py +220 -0
- rasa/core/available_endpoints.py +30 -0
- rasa/core/channels/channel.py +3 -4
- rasa/core/channels/development_inspector.py +4 -4
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-cce7e0a8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-e2a49be7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-3def7895.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-e66fe4df.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-eb874aaa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-cf934643.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-8fdf9155.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-6106fb96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-4c2bb040.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-f0ff96af.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-a21707ec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-c165acb1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-b0564cf1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-e557e67a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-1ce60e9e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-996fe816.js +1353 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-893569e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c29c864f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-649a5eae.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0e5685ed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-eaa320bd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-f35df9e6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-78339e96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-9b5f2f14.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-d05ddb3a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-d9be5dfd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-0f1c4348.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-9ddf63b3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-bc2b81ed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-0a287936.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-e3941990.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-ce4eca24.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d822b1a8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e144c7a7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-ab7f4e14.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +2 -2
- rasa/core/channels/inspector/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +37 -12
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +3 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
- 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/socketio.py +51 -212
- rasa/core/channels/studio_chat.py +29 -49
- rasa/core/channels/voice_stream/genesys.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +3 -5
- rasa/core/constants.py +4 -0
- rasa/core/policies/enterprise_search_policy.py +11 -6
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/flow_executor.py +519 -73
- rasa/core/policies/flows/mcp_tool_executor.py +277 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/unexpected_intent_policy.py +1 -0
- rasa/core/processor.py +18 -15
- rasa/core/run.py +11 -14
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +16 -16
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +21 -1
- 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 +11 -0
- rasa/dialogue_understanding/commands/clarify_command.py +10 -0
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
- 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/flow_retrieval.py +9 -10
- 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 +61 -0
- rasa/{cli/project_templates/telco/prompts/command-generator.jinja2 → dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2} +7 -3
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
- 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 +31 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +123 -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 +7 -2
- rasa/e2e_test/e2e_test_runner.py +12 -2
- rasa/engine/caching.py +2 -2
- rasa/engine/recipes/default_components.py +10 -18
- rasa/engine/storage/local_model_storage.py +2 -45
- rasa/graph_components/validators/default_recipe_validator.py +134 -134
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +14 -20
- rasa/model_manager/trainer_service.py +9 -12
- rasa/model_manager/utils.py +29 -1
- rasa/model_manager/warm_rasa_process.py +1 -1
- rasa/model_training.py +8 -6
- rasa/nlu/extractors/extractor.py +2 -1
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_manager.py +11 -2
- rasa/server.py +14 -2
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +8 -0
- rasa/shared/core/constants.py +11 -1
- rasa/shared/core/domain.py +11 -58
- rasa/shared/core/events.py +327 -0
- rasa/shared/core/flows/flow_step.py +1 -7
- rasa/shared/core/flows/flows_list.py +15 -5
- rasa/shared/core/flows/flows_yaml_schema.json +112 -186
- rasa/shared/core/flows/steps/call.py +53 -5
- rasa/shared/core/flows/validation.py +177 -7
- rasa/shared/core/flows/yaml_flows_io.py +9 -17
- rasa/shared/core/slots.py +2 -6
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/exceptions.py +4 -0
- rasa/shared/importers/importer.py +0 -6
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +10 -80
- rasa/shared/providers/_utils.py +44 -60
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
- rasa/shared/providers/llm/_base_litellm_client.py +39 -7
- rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
- 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/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +28 -5
- rasa/shared/utils/mcp/server_connection.py +186 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/upload.py +47 -16
- rasa/telemetry.py +23 -97
- rasa/tracing/instrumentation/instrumentation.py +14 -10
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/utils/common.py +79 -0
- rasa/utils/io.py +9 -27
- rasa/utils/json_utils.py +1 -6
- rasa/utils/log_utils.py +2 -6
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/tensorflow/rasa_layers.py +1 -1
- rasa/utils/train_utils.py +15 -15
- rasa/validator.py +19 -21
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/METADATA +14 -17
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/RECORD +214 -442
- rasa/builder/README.md +0 -120
- rasa/builder/auth.py +0 -176
- rasa/builder/config.py +0 -115
- rasa/builder/copilot/constants.py +0 -25
- rasa/builder/copilot/copilot.py +0 -372
- rasa/builder/copilot/copilot_response_handler.py +0 -487
- rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
- rasa/builder/copilot/exceptions.py +0 -20
- rasa/builder/copilot/models.py +0 -431
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
- rasa/builder/copilot/telemetry.py +0 -195
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
- rasa/builder/document_retrieval/constants.py +0 -15
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
- rasa/builder/document_retrieval/models.py +0 -62
- rasa/builder/download.py +0 -140
- rasa/builder/exceptions.py +0 -55
- rasa/builder/guardrails/__init__.py +0 -1
- rasa/builder/guardrails/constants.py +0 -3
- rasa/builder/guardrails/exceptions.py +0 -4
- rasa/builder/guardrails/lakera.py +0 -206
- rasa/builder/guardrails/models.py +0 -199
- rasa/builder/guardrails/utils.py +0 -305
- rasa/builder/job_manager.py +0 -87
- rasa/builder/jobs.py +0 -234
- rasa/builder/llm_service.py +0 -246
- rasa/builder/logging_utils.py +0 -209
- rasa/builder/main.py +0 -174
- rasa/builder/models.py +0 -197
- rasa/builder/project_generator.py +0 -450
- rasa/builder/project_info.py +0 -72
- rasa/builder/scrape_rasa_docs.py +0 -97
- rasa/builder/service.py +0 -1142
- rasa/builder/shared/tracker_context.py +0 -212
- rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
- rasa/builder/training_service.py +0 -132
- rasa/builder/validation_service.py +0 -93
- rasa/cli/project_templates/basic/actions/action_api.py +0 -15
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
- rasa/cli/project_templates/basic/config.yml +0 -23
- rasa/cli/project_templates/basic/credentials.yml +0 -34
- rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
- rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
- rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
- rasa/cli/project_templates/basic/data/general/help.yml +0 -6
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
- rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
- rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
- rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
- rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
- rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
- rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
- rasa/cli/project_templates/basic/docs/template.txt +0 -7
- rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
- rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
- rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
- rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
- rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
- rasa/cli/project_templates/basic/endpoints.yml +0 -73
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
- rasa/cli/project_templates/finance/actions/__init__.py +0 -46
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
- rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
- rasa/cli/project_templates/finance/actions/database.py +0 -277
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
- rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
- rasa/cli/project_templates/finance/config.yml +0 -21
- rasa/cli/project_templates/finance/credentials.yml +0 -32
- rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
- rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
- rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
- rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
- rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
- rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
- rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
- rasa/cli/project_templates/finance/csvs/users.csv +0 -4
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
- rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
- rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
- rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
- rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
- rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
- rasa/cli/project_templates/finance/data/general/help.yml +0 -9
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
- rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
- rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
- rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
- rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
- rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
- rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
- rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
- rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
- rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
- rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
- rasa/cli/project_templates/finance/endpoints.yml +0 -63
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
- rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
- rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
- rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
- rasa/cli/project_templates/telco/config.yml +0 -25
- rasa/cli/project_templates/telco/credentials.yml +0 -33
- rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
- rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
- rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
- rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
- rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
- rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
- rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
- rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
- rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
- rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
- rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
- rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
- rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
- rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
- rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
- rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
- rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
- rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
- rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
- rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
- rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
- rasa/cli/project_templates/telco/endpoints.yml +0 -60
- rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
- rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
- rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
- rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
- rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
- rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
- rasa/core/channels/constants.py +0 -3
- rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
- rasa/utils/openapi.py +0 -144
- /rasa/{builder → agents}/__init__.py +0 -0
- /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
- /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
- /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
- /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
- /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
- /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/entry_points.txt +0 -0
|
@@ -8,6 +8,9 @@ from rasa.dialogue_understanding.commands.chit_chat_answer_command import (
|
|
|
8
8
|
)
|
|
9
9
|
from rasa.dialogue_understanding.commands.clarify_command import ClarifyCommand
|
|
10
10
|
from rasa.dialogue_understanding.commands.command import Command
|
|
11
|
+
from rasa.dialogue_understanding.commands.continue_agent_command import (
|
|
12
|
+
ContinueAgentCommand,
|
|
13
|
+
)
|
|
11
14
|
from rasa.dialogue_understanding.commands.correct_slots_command import (
|
|
12
15
|
CorrectedSlot,
|
|
13
16
|
CorrectSlotsCommand,
|
|
@@ -29,6 +32,9 @@ from rasa.dialogue_understanding.commands.noop_command import NoopCommand
|
|
|
29
32
|
from rasa.dialogue_understanding.commands.repeat_bot_messages_command import (
|
|
30
33
|
RepeatBotMessagesCommand,
|
|
31
34
|
)
|
|
35
|
+
from rasa.dialogue_understanding.commands.restart_agent_command import (
|
|
36
|
+
RestartAgentCommand,
|
|
37
|
+
)
|
|
32
38
|
from rasa.dialogue_understanding.commands.restart_command import RestartCommand
|
|
33
39
|
from rasa.dialogue_understanding.commands.session_end_command import SessionEndCommand
|
|
34
40
|
from rasa.dialogue_understanding.commands.session_start_command import (
|
|
@@ -62,4 +68,6 @@ __all__ = [
|
|
|
62
68
|
"SessionEndCommand",
|
|
63
69
|
"RepeatBotMessagesCommand",
|
|
64
70
|
"RestartCommand",
|
|
71
|
+
"ContinueAgentCommand",
|
|
72
|
+
"RestartAgentCommand",
|
|
65
73
|
]
|
|
@@ -6,6 +6,9 @@ from typing import Any, Dict, List
|
|
|
6
6
|
|
|
7
7
|
import structlog
|
|
8
8
|
|
|
9
|
+
from rasa.core.policies.flows.flow_executor import (
|
|
10
|
+
remove_agent_stack_frame,
|
|
11
|
+
)
|
|
9
12
|
from rasa.dialogue_understanding.commands.command import Command
|
|
10
13
|
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
11
14
|
CommandSyntaxManager,
|
|
@@ -18,7 +21,7 @@ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
|
18
21
|
UserFlowStackFrame,
|
|
19
22
|
)
|
|
20
23
|
from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
|
|
21
|
-
from rasa.shared.core.events import Event, FlowCancelled
|
|
24
|
+
from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled
|
|
22
25
|
from rasa.shared.core.flows import FlowsList
|
|
23
26
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
24
27
|
|
|
@@ -48,8 +51,7 @@ class CancelFlowCommand(Command):
|
|
|
48
51
|
"""Selects the frames that were canceled.
|
|
49
52
|
|
|
50
53
|
Args:
|
|
51
|
-
|
|
52
|
-
current_flow: The current flow.
|
|
54
|
+
stack: The dialogue stack.
|
|
53
55
|
|
|
54
56
|
Returns:
|
|
55
57
|
The frames that were canceled.
|
|
@@ -71,8 +73,7 @@ class CancelFlowCommand(Command):
|
|
|
71
73
|
# we should never get here as we should always find the user flow
|
|
72
74
|
# that was canceled.
|
|
73
75
|
raise ValueError(
|
|
74
|
-
f"Could not find a user flow frame to cancel. "
|
|
75
|
-
f"Current stack: {stack}."
|
|
76
|
+
f"Could not find a user flow frame to cancel. Current stack: {stack}."
|
|
76
77
|
)
|
|
77
78
|
|
|
78
79
|
def run_command_on_tracker(
|
|
@@ -106,6 +107,19 @@ class CancelFlowCommand(Command):
|
|
|
106
107
|
)
|
|
107
108
|
return []
|
|
108
109
|
|
|
110
|
+
if agent_frame := original_tracker.stack.find_active_agent_stack_frame_for_flow(
|
|
111
|
+
current_flow.id
|
|
112
|
+
):
|
|
113
|
+
structlogger.debug(
|
|
114
|
+
"cancel_command.remove_agent_stack_frame",
|
|
115
|
+
command=self,
|
|
116
|
+
frame=agent_frame,
|
|
117
|
+
)
|
|
118
|
+
remove_agent_stack_frame(stack, agent_frame.agent_id)
|
|
119
|
+
applied_events.append(
|
|
120
|
+
AgentCancelled(agent_id=agent_frame.agent_id, flow_id=current_flow.id)
|
|
121
|
+
)
|
|
122
|
+
|
|
109
123
|
# we pass in the original dialogue stack (before any of the currently
|
|
110
124
|
# predicted commands were applied) to make sure we don't cancel any
|
|
111
125
|
# frames that were added by the currently predicted commands.
|
|
@@ -12,6 +12,10 @@ from rasa.dialogue_understanding.commands.free_form_answer_command import (
|
|
|
12
12
|
FreeFormAnswerCommand,
|
|
13
13
|
)
|
|
14
14
|
from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
|
|
15
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
16
|
+
AgentStackFrame,
|
|
17
|
+
AgentState,
|
|
18
|
+
)
|
|
15
19
|
from rasa.shared.core.events import Event
|
|
16
20
|
from rasa.shared.core.flows import FlowsList
|
|
17
21
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -52,6 +56,13 @@ class ChitChatAnswerCommand(FreeFormAnswerCommand):
|
|
|
52
56
|
The events to apply to the tracker.
|
|
53
57
|
"""
|
|
54
58
|
stack = tracker.stack
|
|
59
|
+
|
|
60
|
+
# if the top stack frame is an agent stack frame, we need to
|
|
61
|
+
# update the state to INTERRUPTED
|
|
62
|
+
if top_stack_frame := stack.top():
|
|
63
|
+
if isinstance(top_stack_frame, AgentStackFrame):
|
|
64
|
+
top_stack_frame.state = AgentState.INTERRUPTED
|
|
65
|
+
|
|
55
66
|
stack.push(ChitchatPatternFlowStackFrame())
|
|
56
67
|
return tracker.create_stack_updated_events(stack)
|
|
57
68
|
|
|
@@ -13,6 +13,10 @@ from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
|
13
13
|
)
|
|
14
14
|
from rasa.dialogue_understanding.commands.utils import extract_cleaned_options
|
|
15
15
|
from rasa.dialogue_understanding.patterns.clarify import ClarifyPatternFlowStackFrame
|
|
16
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
17
|
+
AgentStackFrame,
|
|
18
|
+
AgentState,
|
|
19
|
+
)
|
|
16
20
|
from rasa.shared.core.events import Event
|
|
17
21
|
from rasa.shared.core.flows import FlowsList
|
|
18
22
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -85,6 +89,12 @@ class ClarifyCommand(Command):
|
|
|
85
89
|
if flow is not None
|
|
86
90
|
]
|
|
87
91
|
|
|
92
|
+
# if the top stack frame is an agent stack frame, we need to
|
|
93
|
+
# update the state to INTERRUPTED
|
|
94
|
+
if top_stack_frame := stack.top():
|
|
95
|
+
if isinstance(top_stack_frame, AgentStackFrame):
|
|
96
|
+
top_stack_frame.state = AgentState.INTERRUPTED
|
|
97
|
+
|
|
88
98
|
stack.push(ClarifyPatternFlowStackFrame(names=names))
|
|
89
99
|
return tracker.create_stack_updated_events(stack)
|
|
90
100
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any, Dict, List
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
|
|
9
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
10
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
11
|
+
CommandSyntaxManager,
|
|
12
|
+
CommandSyntaxVersion,
|
|
13
|
+
)
|
|
14
|
+
from rasa.shared.core.events import Event
|
|
15
|
+
from rasa.shared.core.flows import FlowsList
|
|
16
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
17
|
+
|
|
18
|
+
structlogger = structlog.get_logger()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class ContinueAgentCommand(Command):
|
|
23
|
+
"""A command to continue the currently active agent's execution."""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def command(cls) -> str:
|
|
27
|
+
"""Returns the command type."""
|
|
28
|
+
return "continue agent"
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def from_dict(cls, data: Dict[str, Any]) -> ContinueAgentCommand:
|
|
32
|
+
"""Converts the dictionary to a command.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
The converted dictionary.
|
|
36
|
+
"""
|
|
37
|
+
return ContinueAgentCommand()
|
|
38
|
+
|
|
39
|
+
def run_command_on_tracker(
|
|
40
|
+
self,
|
|
41
|
+
tracker: DialogueStateTracker,
|
|
42
|
+
all_flows: FlowsList,
|
|
43
|
+
original_tracker: DialogueStateTracker,
|
|
44
|
+
) -> List[Event]:
|
|
45
|
+
"""Runs the command on the tracker.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
tracker: The tracker to run the command on.
|
|
49
|
+
all_flows: All flows in the assistant.
|
|
50
|
+
original_tracker: The tracker before any command was executed.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
The events to apply to the tracker.
|
|
54
|
+
"""
|
|
55
|
+
# do nothing
|
|
56
|
+
return []
|
|
57
|
+
|
|
58
|
+
def __hash__(self) -> int:
|
|
59
|
+
return hash(self.command())
|
|
60
|
+
|
|
61
|
+
def __eq__(self, other: object) -> bool:
|
|
62
|
+
return isinstance(other, ContinueAgentCommand)
|
|
63
|
+
|
|
64
|
+
def to_dsl(self) -> str:
|
|
65
|
+
"""Converts the command to a DSL string."""
|
|
66
|
+
mapper = {
|
|
67
|
+
CommandSyntaxVersion.v1: "ContinueAgent()",
|
|
68
|
+
CommandSyntaxVersion.v2: "continue agent",
|
|
69
|
+
CommandSyntaxVersion.v3: "continue agent",
|
|
70
|
+
}
|
|
71
|
+
return mapper.get(
|
|
72
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
73
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> ContinueAgentCommand:
|
|
78
|
+
"""Converts a DSL string to a command."""
|
|
79
|
+
return ContinueAgentCommand()
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
def regex_pattern() -> str:
|
|
83
|
+
mapper = {
|
|
84
|
+
CommandSyntaxVersion.v1: r"ContinueAgent\(\)",
|
|
85
|
+
CommandSyntaxVersion.v2: r"""^[\s\W\d]*continue agent['"`]*$""",
|
|
86
|
+
CommandSyntaxVersion.v3: r"""^[\s\W\d]*continue agent['"`]*$""",
|
|
87
|
+
}
|
|
88
|
+
return mapper.get(
|
|
89
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
90
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
91
|
+
)
|
|
@@ -12,6 +12,10 @@ from rasa.dialogue_understanding.commands.free_form_answer_command import (
|
|
|
12
12
|
FreeFormAnswerCommand,
|
|
13
13
|
)
|
|
14
14
|
from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
|
|
15
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
16
|
+
AgentStackFrame,
|
|
17
|
+
AgentState,
|
|
18
|
+
)
|
|
15
19
|
from rasa.shared.core.events import Event
|
|
16
20
|
from rasa.shared.core.flows import FlowsList
|
|
17
21
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -52,6 +56,13 @@ class KnowledgeAnswerCommand(FreeFormAnswerCommand):
|
|
|
52
56
|
The events to apply to the tracker.
|
|
53
57
|
"""
|
|
54
58
|
stack = tracker.stack
|
|
59
|
+
|
|
60
|
+
# if the top stack frame is an agent stack frame, we need to
|
|
61
|
+
# update the state to INTERRUPTED
|
|
62
|
+
if top_stack_frame := stack.top():
|
|
63
|
+
if isinstance(top_stack_frame, AgentStackFrame):
|
|
64
|
+
top_stack_frame.state = AgentState.INTERRUPTED
|
|
65
|
+
|
|
55
66
|
stack.push(SearchPatternFlowStackFrame())
|
|
56
67
|
return tracker.create_stack_updated_events(stack)
|
|
57
68
|
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
|
|
7
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
8
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
9
|
+
CommandSyntaxManager,
|
|
10
|
+
CommandSyntaxVersion,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
13
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
14
|
+
AgentStackFrame,
|
|
15
|
+
AgentState,
|
|
16
|
+
)
|
|
17
|
+
from rasa.shared.core.events import AgentStarted, Event
|
|
18
|
+
from rasa.shared.core.flows import FlowsList
|
|
19
|
+
from rasa.shared.core.flows.steps import CallFlowStep
|
|
20
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class RestartAgentCommand(Command):
|
|
25
|
+
"""A command to restart an agentic loop within a flow."""
|
|
26
|
+
|
|
27
|
+
agent_id: str
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def command(cls) -> str:
|
|
31
|
+
"""Returns the command type."""
|
|
32
|
+
return "restart agent"
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def from_dict(cls, data: Dict[str, Any]) -> RestartAgentCommand:
|
|
36
|
+
"""Converts the dictionary to a command.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
The converted dictionary.
|
|
40
|
+
"""
|
|
41
|
+
try:
|
|
42
|
+
return RestartAgentCommand(agent_id=data["agent_id"])
|
|
43
|
+
except KeyError as e:
|
|
44
|
+
raise ValueError(
|
|
45
|
+
f"Missing parameter '{e}' while parsing RestartAgentCommand."
|
|
46
|
+
) from e
|
|
47
|
+
|
|
48
|
+
def run_command_on_tracker(
|
|
49
|
+
self,
|
|
50
|
+
tracker: DialogueStateTracker,
|
|
51
|
+
all_flows: FlowsList,
|
|
52
|
+
original_tracker: DialogueStateTracker,
|
|
53
|
+
) -> List[Event]:
|
|
54
|
+
"""Runs the command on the tracker.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
tracker: The tracker to run the command on.
|
|
58
|
+
all_flows: All flows in the assistant.
|
|
59
|
+
original_tracker: The tracker before any command was executed.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
The events to apply to the tracker.
|
|
63
|
+
"""
|
|
64
|
+
stack = tracker.stack
|
|
65
|
+
|
|
66
|
+
# get the agent flow
|
|
67
|
+
agent_flow_id = self._get_agent_flow(original_tracker)
|
|
68
|
+
|
|
69
|
+
# create a new agent stack frame to restart the agent
|
|
70
|
+
restart_agent_frame = self.create_restart_agent_stack_frame(
|
|
71
|
+
all_flows, agent_flow_id
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# if the stack contains an agent stack frame with status
|
|
75
|
+
# "waiting for input" update the status to "interrupted"
|
|
76
|
+
self.update_agent_stack_frames_on_stack(stack)
|
|
77
|
+
|
|
78
|
+
# push the stack frame on the top of the stack
|
|
79
|
+
stack.push(restart_agent_frame)
|
|
80
|
+
return tracker.create_stack_updated_events(stack)
|
|
81
|
+
|
|
82
|
+
def __hash__(self) -> int:
|
|
83
|
+
return hash(self.command())
|
|
84
|
+
|
|
85
|
+
def __eq__(self, other: object) -> bool:
|
|
86
|
+
return isinstance(other, RestartAgentCommand)
|
|
87
|
+
|
|
88
|
+
def to_dsl(self) -> str:
|
|
89
|
+
"""Converts the command to a DSL string."""
|
|
90
|
+
mapper = {
|
|
91
|
+
CommandSyntaxVersion.v1: f"RestartAgent({self.agent_id})",
|
|
92
|
+
CommandSyntaxVersion.v2: f"restart agent {self.agent_id}",
|
|
93
|
+
CommandSyntaxVersion.v3: f"restart agent {self.agent_id}",
|
|
94
|
+
}
|
|
95
|
+
return mapper.get(
|
|
96
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
97
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
@classmethod
|
|
101
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> RestartAgentCommand:
|
|
102
|
+
"""Converts a DSL string to a command."""
|
|
103
|
+
return RestartAgentCommand(agent_id=str(match.group(1).strip()))
|
|
104
|
+
|
|
105
|
+
@staticmethod
|
|
106
|
+
def regex_pattern() -> str:
|
|
107
|
+
mapper = {
|
|
108
|
+
CommandSyntaxVersion.v1: r"RestartAgent\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)",
|
|
109
|
+
CommandSyntaxVersion.v2: (
|
|
110
|
+
r"""^[\s\W\d]*restart agent ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
|
|
111
|
+
),
|
|
112
|
+
CommandSyntaxVersion.v3: (
|
|
113
|
+
r"""^[\s\W\d]*restart agent ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
|
|
114
|
+
),
|
|
115
|
+
}
|
|
116
|
+
return mapper.get(
|
|
117
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
118
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def create_restart_agent_stack_frame(
|
|
122
|
+
self, all_flows: FlowsList, agent_flow_id: str
|
|
123
|
+
) -> AgentStackFrame:
|
|
124
|
+
# get the agent flow
|
|
125
|
+
agent_flow = all_flows.flow_by_id(agent_flow_id)
|
|
126
|
+
if not agent_flow:
|
|
127
|
+
raise ValueError(f"Agent flow {agent_flow_id} not found")
|
|
128
|
+
|
|
129
|
+
# find the call flow step for the agent
|
|
130
|
+
# set the state to "waiting for input" so that the agent can process
|
|
131
|
+
# the latest user message
|
|
132
|
+
for step in agent_flow.steps:
|
|
133
|
+
if isinstance(step, CallFlowStep) and step.call == self.agent_id:
|
|
134
|
+
return AgentStackFrame(
|
|
135
|
+
frame_id=f"restart_agent_{self.agent_id}",
|
|
136
|
+
flow_id=agent_flow_id,
|
|
137
|
+
step_id=step.id,
|
|
138
|
+
agent_id=self.agent_id,
|
|
139
|
+
state=AgentState.WAITING_FOR_INPUT,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
raise ValueError(f"Call step in agent flow {agent_flow_id} not found")
|
|
143
|
+
|
|
144
|
+
def update_agent_stack_frames_on_stack(self, stack: DialogueStack) -> None:
|
|
145
|
+
for frame in stack.frames:
|
|
146
|
+
if (
|
|
147
|
+
isinstance(frame, AgentStackFrame)
|
|
148
|
+
and frame.state == AgentState.WAITING_FOR_INPUT
|
|
149
|
+
):
|
|
150
|
+
frame.state = AgentState.INTERRUPTED
|
|
151
|
+
|
|
152
|
+
def _get_agent_flow(self, tracker: DialogueStateTracker) -> Optional[str]:
|
|
153
|
+
# find events associated with the agent
|
|
154
|
+
agent_started_events = [
|
|
155
|
+
event
|
|
156
|
+
for event in tracker.events
|
|
157
|
+
if type(event) == AgentStarted and event.agent_id == self.agent_id
|
|
158
|
+
]
|
|
159
|
+
# take the last one if the agent was started multiple times
|
|
160
|
+
if agent_started_events:
|
|
161
|
+
return agent_started_events[-1].flow_id
|
|
162
|
+
return None
|
|
@@ -11,15 +11,25 @@ from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
|
11
11
|
CommandSyntaxManager,
|
|
12
12
|
CommandSyntaxVersion,
|
|
13
13
|
)
|
|
14
|
+
from rasa.dialogue_understanding.commands.utils import (
|
|
15
|
+
remove_pattern_continue_interrupted_frames,
|
|
16
|
+
resume_flow,
|
|
17
|
+
)
|
|
14
18
|
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
19
|
+
AgentState,
|
|
15
20
|
FlowStackFrameType,
|
|
16
21
|
UserFlowStackFrame,
|
|
17
22
|
)
|
|
18
23
|
from rasa.dialogue_understanding.stack.utils import (
|
|
24
|
+
is_continue_interrupted_flow_active,
|
|
19
25
|
top_user_flow_frame,
|
|
20
26
|
user_flows_on_the_stack,
|
|
21
27
|
)
|
|
22
|
-
from rasa.shared.core.events import
|
|
28
|
+
from rasa.shared.core.events import (
|
|
29
|
+
AgentInterrupted,
|
|
30
|
+
Event,
|
|
31
|
+
FlowInterrupted,
|
|
32
|
+
)
|
|
23
33
|
from rasa.shared.core.flows import FlowsList
|
|
24
34
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
25
35
|
|
|
@@ -71,12 +81,7 @@ class StartFlowCommand(Command):
|
|
|
71
81
|
original_stack = original_tracker.stack
|
|
72
82
|
applied_events: List[Event] = []
|
|
73
83
|
|
|
74
|
-
if self.flow in
|
|
75
|
-
structlogger.debug(
|
|
76
|
-
"start_flow_command.skip_command.already_started_flow", command=self
|
|
77
|
-
)
|
|
78
|
-
return []
|
|
79
|
-
elif self.flow not in all_flows.flow_ids:
|
|
84
|
+
if self.flow not in all_flows.flow_ids:
|
|
80
85
|
structlogger.debug(
|
|
81
86
|
"start_flow_command.skip_command.start_invalid_flow_id", command=self
|
|
82
87
|
)
|
|
@@ -87,9 +92,47 @@ class StartFlowCommand(Command):
|
|
|
87
92
|
original_user_frame.flow(all_flows) if original_user_frame else None
|
|
88
93
|
)
|
|
89
94
|
|
|
95
|
+
# if the original top flow is the same as the flow to start, the flow is
|
|
96
|
+
# already active, do nothing
|
|
97
|
+
if original_top_flow is not None and original_top_flow.id == self.flow:
|
|
98
|
+
# in case continue_interrupted is not active, skip the already active start
|
|
99
|
+
# flow command
|
|
100
|
+
if not is_continue_interrupted_flow_active(stack):
|
|
101
|
+
return []
|
|
102
|
+
|
|
103
|
+
# if the continue interrupted flow is active, and the command generator
|
|
104
|
+
# predicted a start flow command for the flow which is on top of the stack,
|
|
105
|
+
# we just need to remove the pattern_continue_interrupted frame(s) from the
|
|
106
|
+
# stack
|
|
107
|
+
stack = remove_pattern_continue_interrupted_frames(stack)
|
|
108
|
+
return applied_events + tracker.create_stack_updated_events(stack)
|
|
109
|
+
|
|
110
|
+
# if the flow is already on the stack, resume it
|
|
111
|
+
if (
|
|
112
|
+
self.flow in user_flows_on_the_stack(stack)
|
|
113
|
+
and original_user_frame is not None
|
|
114
|
+
):
|
|
115
|
+
# if pattern_continue_interrupted is active, we need to remove it
|
|
116
|
+
# from the stack before resuming the flow
|
|
117
|
+
stack = remove_pattern_continue_interrupted_frames(stack)
|
|
118
|
+
applied_events.extend(resume_flow(self.flow, tracker, stack))
|
|
119
|
+
# the current active flow is interrupted
|
|
120
|
+
applied_events.append(
|
|
121
|
+
FlowInterrupted(
|
|
122
|
+
original_user_frame.flow_id, original_user_frame.step_id
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
return applied_events
|
|
126
|
+
|
|
90
127
|
frame_type = FlowStackFrameType.REGULAR
|
|
91
128
|
|
|
129
|
+
# remove the pattern_continue_interrupted frames from the stack
|
|
130
|
+
# if it is currently active but the user digressed from the pattern
|
|
131
|
+
stack = remove_pattern_continue_interrupted_frames(stack)
|
|
132
|
+
|
|
92
133
|
if original_top_flow:
|
|
134
|
+
# if the original top flow is not the same as the flow to start,
|
|
135
|
+
# interrupt the current active flow
|
|
93
136
|
frame_type = FlowStackFrameType.INTERRUPT
|
|
94
137
|
|
|
95
138
|
if original_user_frame is not None:
|
|
@@ -99,6 +142,24 @@ class StartFlowCommand(Command):
|
|
|
99
142
|
)
|
|
100
143
|
)
|
|
101
144
|
|
|
145
|
+
# If there is an active agent frame, interrupt it
|
|
146
|
+
active_agent_stack_frame = stack.find_active_agent_frame()
|
|
147
|
+
if active_agent_stack_frame:
|
|
148
|
+
structlogger.debug(
|
|
149
|
+
"start_flow_command.interrupt_agent",
|
|
150
|
+
command=self,
|
|
151
|
+
agent_id=active_agent_stack_frame.agent_id,
|
|
152
|
+
frame_id=active_agent_stack_frame.frame_id,
|
|
153
|
+
flow_id=active_agent_stack_frame.flow_id,
|
|
154
|
+
)
|
|
155
|
+
active_agent_stack_frame.state = AgentState.INTERRUPTED
|
|
156
|
+
applied_events.append(
|
|
157
|
+
AgentInterrupted(
|
|
158
|
+
active_agent_stack_frame.agent_id,
|
|
159
|
+
active_agent_stack_frame.flow_id,
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
|
|
102
163
|
structlogger.debug("start_flow_command.start_flow", command=self)
|
|
103
164
|
stack.push(UserFlowStackFrame(flow_id=self.flow, frame_type=frame_type))
|
|
104
165
|
return applied_events + tracker.create_stack_updated_events(stack)
|
|
@@ -5,8 +5,23 @@ import structlog
|
|
|
5
5
|
from rasa.dialogue_understanding.patterns.validate_slot import (
|
|
6
6
|
ValidateSlotPatternFlowStackFrame,
|
|
7
7
|
)
|
|
8
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
9
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
10
|
+
DialogueStackFrame,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
13
|
+
AgentStackFrame,
|
|
14
|
+
FlowStackFrameType,
|
|
15
|
+
UserFlowStackFrame,
|
|
16
|
+
)
|
|
17
|
+
from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
|
|
8
18
|
from rasa.shared.constants import ACTION_ASK_PREFIX, UTTER_ASK_PREFIX
|
|
9
|
-
from rasa.shared.core.events import
|
|
19
|
+
from rasa.shared.core.events import (
|
|
20
|
+
AgentResumed,
|
|
21
|
+
Event,
|
|
22
|
+
FlowResumed,
|
|
23
|
+
SlotSet,
|
|
24
|
+
)
|
|
10
25
|
from rasa.shared.core.flows import FlowsList
|
|
11
26
|
from rasa.shared.core.slots import Slot
|
|
12
27
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -103,7 +118,8 @@ def create_validate_frames_from_slot_set_events(
|
|
|
103
118
|
Args:
|
|
104
119
|
tracker: The dialogue state tracker.
|
|
105
120
|
events: List of events to process.
|
|
106
|
-
|
|
121
|
+
validate_frames: List to collect validation frames.
|
|
122
|
+
should_break: whether to break after the first non-SlotSet event.
|
|
107
123
|
if True, break out of the event loop as soon as the first non-SlotSet
|
|
108
124
|
event is encountered.
|
|
109
125
|
if False, continue processing the events until the end.
|
|
@@ -150,3 +166,109 @@ def find_default_flows_collecting_slot(
|
|
|
150
166
|
for step in flow.get_collect_steps()
|
|
151
167
|
)
|
|
152
168
|
]
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def resume_flow(
|
|
172
|
+
flow_to_resume: str,
|
|
173
|
+
tracker: DialogueStateTracker,
|
|
174
|
+
stack: DialogueStack,
|
|
175
|
+
) -> List[Event]:
|
|
176
|
+
"""Resumes a flow by reordering frames."""
|
|
177
|
+
applied_events: List[Event] = []
|
|
178
|
+
|
|
179
|
+
# Resume existing flow by reordering frames
|
|
180
|
+
frames_to_resume, user_frame_to_resume = collect_frames_to_resume(
|
|
181
|
+
stack, flow_to_resume
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# if the flow is not on the stack, do nothing
|
|
185
|
+
# this should not happen, but just in case
|
|
186
|
+
if user_frame_to_resume is None:
|
|
187
|
+
structlogger.error(
|
|
188
|
+
"resume_flow.no_user_frame_to_resume",
|
|
189
|
+
flow_to_resume=flow_to_resume,
|
|
190
|
+
)
|
|
191
|
+
return []
|
|
192
|
+
|
|
193
|
+
# move the frames to the top of the stack, e.g. reorder the frames
|
|
194
|
+
# on the stack
|
|
195
|
+
stack.move_frames_to_top(frames_to_resume)
|
|
196
|
+
|
|
197
|
+
# create agent resumed events if the agent frame is now on top of the stack
|
|
198
|
+
agent_stack_frame = next(
|
|
199
|
+
(frame for frame in frames_to_resume if isinstance(frame, AgentStackFrame)),
|
|
200
|
+
None,
|
|
201
|
+
)
|
|
202
|
+
if agent_stack_frame:
|
|
203
|
+
agent_id = agent_stack_frame.agent_id
|
|
204
|
+
applied_events.append(AgentResumed(agent_id, agent_stack_frame.flow_id))
|
|
205
|
+
|
|
206
|
+
# Create flow interruption and resumption events
|
|
207
|
+
applied_events.extend(
|
|
208
|
+
[
|
|
209
|
+
# the flow, which was on the stack, is resumed
|
|
210
|
+
FlowResumed(user_frame_to_resume.flow_id, user_frame_to_resume.step_id),
|
|
211
|
+
]
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
return applied_events + tracker.create_stack_updated_events(stack)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def collect_frames_to_resume(
|
|
218
|
+
stack: DialogueStack,
|
|
219
|
+
target_flow_id: str, # pyright: ignore[reportUndefinedVariable]
|
|
220
|
+
) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
|
|
221
|
+
"""Collect frames that need to be resumed for the target flow.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
stack: The stack to collect frames from.
|
|
225
|
+
target_flow_id: The ID of the flow to resume.
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
A tuple containing (frames_to_resume, frame_to_resume).
|
|
229
|
+
"""
|
|
230
|
+
frames_to_resume: List[DialogueStackFrame] = []
|
|
231
|
+
frame_found = False
|
|
232
|
+
frame_to_resume = None
|
|
233
|
+
|
|
234
|
+
for frame in stack.frames:
|
|
235
|
+
if isinstance(frame, UserFlowStackFrame) and (
|
|
236
|
+
frame.frame_type == FlowStackFrameType.REGULAR
|
|
237
|
+
or frame.frame_type == FlowStackFrameType.INTERRUPT
|
|
238
|
+
):
|
|
239
|
+
if frame.flow_id == target_flow_id:
|
|
240
|
+
frames_to_resume.append(frame)
|
|
241
|
+
frame_to_resume = frame
|
|
242
|
+
frame_found = True
|
|
243
|
+
continue
|
|
244
|
+
elif frame_found:
|
|
245
|
+
break
|
|
246
|
+
|
|
247
|
+
if frame_found:
|
|
248
|
+
frames_to_resume.append(frame)
|
|
249
|
+
|
|
250
|
+
return list(frames_to_resume), frame_to_resume
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def remove_pattern_continue_interrupted_frames(stack: DialogueStack) -> DialogueStack:
|
|
254
|
+
"""Remove pattern_continue_interrupted frames from the stack."""
|
|
255
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
256
|
+
is_continue_interrupted_flow_active,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
if not is_continue_interrupted_flow_active(stack):
|
|
260
|
+
return stack
|
|
261
|
+
|
|
262
|
+
# remove pattern_continue_interrupted from the stack
|
|
263
|
+
top_frame = stack.top()
|
|
264
|
+
while isinstance(top_frame, PatternFlowStackFrame):
|
|
265
|
+
# If the top frame is a pattern frame, we need to remove it
|
|
266
|
+
# before continuing with the active user flow frame.
|
|
267
|
+
# This prevents the pattern frame
|
|
268
|
+
# from being left on the stack when the flow is started
|
|
269
|
+
# which would prevent pattern_completed to be triggered
|
|
270
|
+
# once the user flow is completed.
|
|
271
|
+
stack.pop()
|
|
272
|
+
top_frame = stack.top()
|
|
273
|
+
|
|
274
|
+
return stack
|
|
@@ -9,9 +9,11 @@ from rasa.dialogue_understanding.commands import (
|
|
|
9
9
|
ChitChatAnswerCommand,
|
|
10
10
|
ClarifyCommand,
|
|
11
11
|
Command,
|
|
12
|
+
ContinueAgentCommand,
|
|
12
13
|
HumanHandoffCommand,
|
|
13
14
|
KnowledgeAnswerCommand,
|
|
14
15
|
RepeatBotMessagesCommand,
|
|
16
|
+
RestartAgentCommand,
|
|
15
17
|
SetSlotCommand,
|
|
16
18
|
SkipQuestionCommand,
|
|
17
19
|
StartFlowCommand,
|
|
@@ -34,6 +36,8 @@ DEFAULT_COMMANDS = [
|
|
|
34
36
|
HumanHandoffCommand,
|
|
35
37
|
ClarifyCommand,
|
|
36
38
|
RepeatBotMessagesCommand,
|
|
39
|
+
ContinueAgentCommand,
|
|
40
|
+
RestartAgentCommand,
|
|
37
41
|
]
|
|
38
42
|
|
|
39
43
|
|