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
|
@@ -1,14 +1,47 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Dict
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text, Tuple
|
|
5
5
|
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.core.actions.action import Action
|
|
9
|
+
from rasa.core.channels import OutputChannel
|
|
10
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
11
|
+
from rasa.dialogue_understanding.commands.utils import (
|
|
12
|
+
resume_flow,
|
|
13
|
+
)
|
|
14
|
+
from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
|
|
15
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
6
16
|
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
17
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
18
|
+
DialogueStackFrame,
|
|
19
|
+
)
|
|
20
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
21
|
+
AgentStackFrame,
|
|
22
|
+
FlowStackFrameType,
|
|
23
|
+
UserFlowStackFrame,
|
|
24
|
+
)
|
|
25
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
26
|
+
get_active_continue_interrupted_pattern_frame,
|
|
27
|
+
)
|
|
7
28
|
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
29
|
+
from rasa.shared.core.constants import (
|
|
30
|
+
ACTION_CANCEL_INTERRUPTED_FLOWS,
|
|
31
|
+
ACTION_CONTINUE_INTERRUPTED_FLOW,
|
|
32
|
+
)
|
|
33
|
+
from rasa.shared.core.domain import Domain
|
|
34
|
+
from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled, SlotSet
|
|
35
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
8
36
|
|
|
9
37
|
FLOW_PATTERN_CONTINUE_INTERRUPTED = (
|
|
10
38
|
RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
|
|
11
39
|
)
|
|
40
|
+
INTERRUPTED_FLOW_TO_CONTINUE_SLOT = "interrupted_flow_to_continue"
|
|
41
|
+
CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT = "continue_interrupted_flow_confirmation"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
structlogger = structlog.get_logger()
|
|
12
45
|
|
|
13
46
|
|
|
14
47
|
@dataclass
|
|
@@ -17,8 +50,14 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
|
17
50
|
|
|
18
51
|
flow_id: str = FLOW_PATTERN_CONTINUE_INTERRUPTED
|
|
19
52
|
"""The ID of the flow."""
|
|
20
|
-
|
|
21
|
-
"""The
|
|
53
|
+
interrupted_flow_names: List[str] = field(default_factory=list)
|
|
54
|
+
"""The names of the previous flows that were interrupted."""
|
|
55
|
+
interrupted_flow_ids: List[str] = field(default_factory=list)
|
|
56
|
+
"""The ids of the previous flows that were interrupted."""
|
|
57
|
+
interrupted_flow_options: str = ""
|
|
58
|
+
"""The options that the user can choose from as a string."""
|
|
59
|
+
multiple_flows_interrupted: bool = False
|
|
60
|
+
"""Whether the user has interrupted multiple flows."""
|
|
22
61
|
|
|
23
62
|
@classmethod
|
|
24
63
|
def type(cls) -> str:
|
|
@@ -38,7 +77,10 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
|
38
77
|
return ContinueInterruptedPatternFlowStackFrame(
|
|
39
78
|
frame_id=data["frame_id"],
|
|
40
79
|
step_id=data["step_id"],
|
|
41
|
-
|
|
80
|
+
interrupted_flow_names=data["interrupted_flow_names"],
|
|
81
|
+
interrupted_flow_ids=data["interrupted_flow_ids"],
|
|
82
|
+
interrupted_flow_options=data["interrupted_flow_options"],
|
|
83
|
+
multiple_flows_interrupted=len(data["interrupted_flow_names"]) > 1,
|
|
42
84
|
)
|
|
43
85
|
|
|
44
86
|
def __eq__(self, other: Any) -> bool:
|
|
@@ -47,5 +89,196 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
|
47
89
|
return (
|
|
48
90
|
self.flow_id == other.flow_id
|
|
49
91
|
and self.step_id == other.step_id
|
|
50
|
-
and self.
|
|
92
|
+
and self.interrupted_flow_names == other.interrupted_flow_names
|
|
93
|
+
and self.interrupted_flow_ids == other.interrupted_flow_ids
|
|
94
|
+
and self.interrupted_flow_options == other.interrupted_flow_options
|
|
51
95
|
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ActionContinueInterruptedFlow(Action):
|
|
99
|
+
def name(self) -> str:
|
|
100
|
+
return ACTION_CONTINUE_INTERRUPTED_FLOW
|
|
101
|
+
|
|
102
|
+
async def run(
|
|
103
|
+
self,
|
|
104
|
+
output_channel: OutputChannel,
|
|
105
|
+
nlg: NaturalLanguageGenerator,
|
|
106
|
+
tracker: DialogueStateTracker,
|
|
107
|
+
domain: Domain,
|
|
108
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
109
|
+
) -> List[Event]:
|
|
110
|
+
# get the pattern frame from the stack
|
|
111
|
+
pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
|
|
112
|
+
|
|
113
|
+
if pattern_frame is None:
|
|
114
|
+
structlogger.warning(
|
|
115
|
+
"action.continue_interrupted_flows.no_continue_interrupted_frame"
|
|
116
|
+
)
|
|
117
|
+
return []
|
|
118
|
+
|
|
119
|
+
interrupted_flow_ids = pattern_frame.interrupted_flow_ids
|
|
120
|
+
interrupted_flow_names = pattern_frame.interrupted_flow_names
|
|
121
|
+
multiple_flows_interrupted = pattern_frame.multiple_flows_interrupted
|
|
122
|
+
|
|
123
|
+
flow_to_continue = None
|
|
124
|
+
if not multiple_flows_interrupted:
|
|
125
|
+
# the user confirmed that they want to continue the flow
|
|
126
|
+
# as only one flow was interrupted, we can just continue the first one
|
|
127
|
+
flow_to_continue = interrupted_flow_ids[0]
|
|
128
|
+
else:
|
|
129
|
+
# the user mentioned the flow they want to continue
|
|
130
|
+
# check if the flow is in the list of interrupted flows
|
|
131
|
+
selected_flow = tracker.get_slot(INTERRUPTED_FLOW_TO_CONTINUE_SLOT)
|
|
132
|
+
if selected_flow in interrupted_flow_ids:
|
|
133
|
+
flow_to_continue = selected_flow
|
|
134
|
+
elif selected_flow in interrupted_flow_names:
|
|
135
|
+
# the user mentioned the flow by name
|
|
136
|
+
# find the flow id for the flow name
|
|
137
|
+
# the list of names and ids are in the same order
|
|
138
|
+
flow_to_continue = interrupted_flow_ids[
|
|
139
|
+
interrupted_flow_names.index(selected_flow)
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
# if the user did not select a valid flow,
|
|
143
|
+
# we need to ask them to select a valid flow
|
|
144
|
+
if flow_to_continue is None:
|
|
145
|
+
await output_channel.send_text_message(
|
|
146
|
+
tracker.sender_id,
|
|
147
|
+
"You haven't selected a valid task to resume. "
|
|
148
|
+
"Please specify the task you would like to continue. "
|
|
149
|
+
"The options are: {{context.interrupted_flow_options}}",
|
|
150
|
+
)
|
|
151
|
+
return []
|
|
152
|
+
|
|
153
|
+
# resume the flow the user selected
|
|
154
|
+
events = resume_flow(flow_to_continue, tracker, tracker.stack)
|
|
155
|
+
|
|
156
|
+
return events + [
|
|
157
|
+
SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
|
|
158
|
+
SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class ActionCancelInterruptedFlows(Action):
|
|
163
|
+
def name(self) -> str:
|
|
164
|
+
return ACTION_CANCEL_INTERRUPTED_FLOWS
|
|
165
|
+
|
|
166
|
+
async def run(
|
|
167
|
+
self,
|
|
168
|
+
output_channel: OutputChannel,
|
|
169
|
+
nlg: NaturalLanguageGenerator,
|
|
170
|
+
tracker: DialogueStateTracker,
|
|
171
|
+
domain: Domain,
|
|
172
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
173
|
+
) -> List[Event]:
|
|
174
|
+
# get the pattern frame from the stack
|
|
175
|
+
pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
|
|
176
|
+
|
|
177
|
+
if pattern_frame is None:
|
|
178
|
+
structlogger.warning(
|
|
179
|
+
"action.continue_interrupted_flows.no_continue_interrupted_frame"
|
|
180
|
+
)
|
|
181
|
+
return []
|
|
182
|
+
|
|
183
|
+
interrupted_flow_ids = pattern_frame.interrupted_flow_ids
|
|
184
|
+
|
|
185
|
+
event_list: List[Event] = []
|
|
186
|
+
|
|
187
|
+
# cancel all interrupted flows
|
|
188
|
+
for flow_id in interrupted_flow_ids:
|
|
189
|
+
event_list.extend(self.cancel_flow(tracker, tracker.stack, flow_id))
|
|
190
|
+
|
|
191
|
+
return event_list + [
|
|
192
|
+
SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
|
|
193
|
+
SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
|
|
194
|
+
]
|
|
195
|
+
|
|
196
|
+
def cancel_flow(
|
|
197
|
+
self,
|
|
198
|
+
tracker: DialogueStateTracker,
|
|
199
|
+
stack: DialogueStack,
|
|
200
|
+
flow_id: str,
|
|
201
|
+
) -> List[Event]:
|
|
202
|
+
"""Cancels a flow by flow id."""
|
|
203
|
+
applied_events: List[Event] = []
|
|
204
|
+
|
|
205
|
+
frames_to_cancel, user_frame_to_cancel = self._collect_frames_to_cancel(
|
|
206
|
+
stack, flow_id
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# if the flow is not on the stack, do nothing
|
|
210
|
+
if user_frame_to_cancel is None:
|
|
211
|
+
structlogger.error(
|
|
212
|
+
"cancel_flow.no_user_frame_to_cancel",
|
|
213
|
+
flow_id=flow_id,
|
|
214
|
+
)
|
|
215
|
+
return []
|
|
216
|
+
|
|
217
|
+
frames_ids_to_cancel = [frame.frame_id for frame in frames_to_cancel]
|
|
218
|
+
|
|
219
|
+
stack.push(
|
|
220
|
+
CancelPatternFlowStackFrame(
|
|
221
|
+
canceled_name=flow_id,
|
|
222
|
+
canceled_frames=frames_ids_to_cancel,
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# create flow cancelled event
|
|
227
|
+
applied_events.extend(
|
|
228
|
+
[
|
|
229
|
+
FlowCancelled(
|
|
230
|
+
user_frame_to_cancel.flow_id, user_frame_to_cancel.step_id
|
|
231
|
+
),
|
|
232
|
+
]
|
|
233
|
+
)
|
|
234
|
+
# create agent cancelled events for any agent frames that are on the stack
|
|
235
|
+
for frame in frames_to_cancel:
|
|
236
|
+
if isinstance(frame, AgentStackFrame):
|
|
237
|
+
applied_events.append(
|
|
238
|
+
AgentCancelled(
|
|
239
|
+
frame.agent_id, frame.flow_id, reason="Flow was cancelled"
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
update_stack_events = tracker.create_stack_updated_events(stack)
|
|
244
|
+
|
|
245
|
+
return applied_events + update_stack_events
|
|
246
|
+
|
|
247
|
+
def _collect_frames_to_cancel(
|
|
248
|
+
self, stack: DialogueStack, target_flow_id: str
|
|
249
|
+
) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
|
|
250
|
+
"""Collect frames that need to be cancelled.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
stack: The stack to collect frames from.
|
|
254
|
+
target_flow_id: The ID of the flow to cancel.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
A tuple containing (frames_to_cancel, frame_to_cancel).
|
|
258
|
+
"""
|
|
259
|
+
frames_to_cancel: List[DialogueStackFrame] = []
|
|
260
|
+
frame_found = False
|
|
261
|
+
frame_to_cancel = None
|
|
262
|
+
|
|
263
|
+
# collect all frames that belong to the target flow
|
|
264
|
+
# i.e. we want to cancel all frames that are on the stack and between
|
|
265
|
+
# the user flow frame that belongs to the target flow and the next user
|
|
266
|
+
# flow frame that belongs to a different flow
|
|
267
|
+
# this includes any pattern frames or agent frames as well
|
|
268
|
+
for frame in stack.frames:
|
|
269
|
+
if isinstance(frame, UserFlowStackFrame) and (
|
|
270
|
+
frame.frame_type == FlowStackFrameType.REGULAR
|
|
271
|
+
or frame.frame_type == FlowStackFrameType.INTERRUPT
|
|
272
|
+
):
|
|
273
|
+
if frame.flow_id == target_flow_id:
|
|
274
|
+
frames_to_cancel.append(frame)
|
|
275
|
+
frame_to_cancel = frame
|
|
276
|
+
frame_found = True
|
|
277
|
+
continue
|
|
278
|
+
elif frame_found:
|
|
279
|
+
break
|
|
280
|
+
|
|
281
|
+
if frame_found:
|
|
282
|
+
frames_to_cancel.append(frame)
|
|
283
|
+
|
|
284
|
+
return list(frames_to_cancel), frame_to_cancel
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
version: "3.1"
|
|
2
2
|
responses:
|
|
3
3
|
|
|
4
|
+
utter_ask_continue_interrupted_flow_confirmation:
|
|
5
|
+
- text: "Would you like to continue with {{context.interrupted_flow_options}}?"
|
|
6
|
+
metadata:
|
|
7
|
+
rephrase: True
|
|
8
|
+
template: jinja
|
|
9
|
+
|
|
10
|
+
utter_ask_interrupted_flow_to_continue:
|
|
11
|
+
- text: "Would you like to resume {{context.interrupted_flow_options}}?"
|
|
12
|
+
metadata:
|
|
13
|
+
rephrase: True
|
|
14
|
+
template: jinja
|
|
15
|
+
|
|
4
16
|
utter_ask_rephrase:
|
|
5
17
|
- text: I’m sorry I am unable to understand you, could you please rephrase?
|
|
6
18
|
|
|
@@ -53,12 +65,6 @@ responses:
|
|
|
53
65
|
rephrase: True
|
|
54
66
|
template: jinja
|
|
55
67
|
|
|
56
|
-
utter_flow_continue_interrupted:
|
|
57
|
-
- text: "Let's continue with {{ context.previous_flow_name }}."
|
|
58
|
-
metadata:
|
|
59
|
-
rephrase: True
|
|
60
|
-
template: jinja
|
|
61
|
-
|
|
62
68
|
utter_free_chitchat_response:
|
|
63
69
|
- text: "Sorry, I'm not able to answer that right now."
|
|
64
70
|
metadata:
|
|
@@ -81,7 +87,7 @@ responses:
|
|
|
81
87
|
rephrase: True
|
|
82
88
|
|
|
83
89
|
utter_inform_hangup:
|
|
84
|
-
- text:
|
|
90
|
+
- text: It seems you are not there anymore. I will hang up shortly.
|
|
85
91
|
metadata:
|
|
86
92
|
rephrase: True
|
|
87
93
|
|
|
@@ -124,6 +130,14 @@ slots:
|
|
|
124
130
|
type: float
|
|
125
131
|
initial_value: 0.0
|
|
126
132
|
max_value: 1000000
|
|
133
|
+
interrupted_flow_to_continue:
|
|
134
|
+
type: text
|
|
135
|
+
mappings:
|
|
136
|
+
- type: from_llm
|
|
137
|
+
continue_interrupted_flow_confirmation:
|
|
138
|
+
type: bool
|
|
139
|
+
mappings:
|
|
140
|
+
- type: from_llm
|
|
127
141
|
|
|
128
142
|
flows:
|
|
129
143
|
pattern_cancel_flow:
|
|
@@ -210,7 +224,31 @@ flows:
|
|
|
210
224
|
description: Conversation repair flow for managing when users switch between different flows
|
|
211
225
|
name: pattern continue interrupted
|
|
212
226
|
steps:
|
|
213
|
-
-
|
|
227
|
+
- noop: true
|
|
228
|
+
next:
|
|
229
|
+
- if: context.multiple_flows_interrupted
|
|
230
|
+
then:
|
|
231
|
+
- collect: interrupted_flow_to_continue
|
|
232
|
+
description: "Fill this slot with the name of the flow the user wants to continue. If the user does not want to continue any of the interrupted flows, fill this slot with 'none'."
|
|
233
|
+
next:
|
|
234
|
+
- if: slots.interrupted_flow_to_continue != "none"
|
|
235
|
+
then:
|
|
236
|
+
- action: action_continue_interrupted_flow
|
|
237
|
+
next: END
|
|
238
|
+
- else:
|
|
239
|
+
- action: action_cancel_interrupted_flows
|
|
240
|
+
next: END
|
|
241
|
+
- else:
|
|
242
|
+
- collect: continue_interrupted_flow_confirmation
|
|
243
|
+
description: "If the user wants to continue the interrupted flow, fill this slot with true. If the user does not want to continue the interrupted flow, fill this slot with false."
|
|
244
|
+
next:
|
|
245
|
+
- if: slots.continue_interrupted_flow_confirmation
|
|
246
|
+
then:
|
|
247
|
+
- action: action_continue_interrupted_flow
|
|
248
|
+
next: END
|
|
249
|
+
- else:
|
|
250
|
+
- action: action_cancel_interrupted_flows
|
|
251
|
+
next: END
|
|
214
252
|
|
|
215
253
|
pattern_correction:
|
|
216
254
|
description: Conversation repair flow for managing user input changes or error corrections
|
|
@@ -37,6 +37,7 @@ from rasa.dialogue_understanding.stack.frames import (
|
|
|
37
37
|
BaseFlowStackFrame,
|
|
38
38
|
)
|
|
39
39
|
from rasa.dialogue_understanding.stack.utils import (
|
|
40
|
+
is_continue_interrupted_flow_active,
|
|
40
41
|
top_flow_frame,
|
|
41
42
|
top_user_flow_frame,
|
|
42
43
|
)
|
|
@@ -428,22 +429,9 @@ def clean_up_commands(
|
|
|
428
429
|
)
|
|
429
430
|
|
|
430
431
|
elif isinstance(command, StartFlowCommand):
|
|
431
|
-
|
|
432
|
-
tracker
|
|
432
|
+
clean_commands = clean_up_start_flow_command(
|
|
433
|
+
clean_commands, tracker, command
|
|
433
434
|
)
|
|
434
|
-
top_flow_id = top_user_frame.flow_id if top_user_frame else ""
|
|
435
|
-
|
|
436
|
-
if top_flow_id == command.flow:
|
|
437
|
-
# drop a start flow command if the starting flow is equal
|
|
438
|
-
# to the currently active flow
|
|
439
|
-
structlogger.debug(
|
|
440
|
-
"command_processor.clean_up_commands."
|
|
441
|
-
"skip_command_flow_already_active",
|
|
442
|
-
command=command,
|
|
443
|
-
)
|
|
444
|
-
continue
|
|
445
|
-
|
|
446
|
-
clean_commands.append(command)
|
|
447
435
|
|
|
448
436
|
# handle chitchat command differently from other free-form answer commands
|
|
449
437
|
elif isinstance(command, ChitChatAnswerCommand):
|
|
@@ -529,6 +517,34 @@ def ensure_max_number_of_command_type(
|
|
|
529
517
|
return filtered
|
|
530
518
|
|
|
531
519
|
|
|
520
|
+
def clean_up_start_flow_command(
|
|
521
|
+
clean_commands: List[Command],
|
|
522
|
+
tracker: DialogueStateTracker,
|
|
523
|
+
command: StartFlowCommand,
|
|
524
|
+
) -> List[Command]:
|
|
525
|
+
"""Clean up a start flow command."""
|
|
526
|
+
continue_interrupted_flow_active = is_continue_interrupted_flow_active(
|
|
527
|
+
tracker.stack
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
top_user_frame = top_user_flow_frame(
|
|
531
|
+
tracker.stack, ignore_call_and_link_frames=False
|
|
532
|
+
)
|
|
533
|
+
top_flow_id = top_user_frame.flow_id if top_user_frame else ""
|
|
534
|
+
|
|
535
|
+
if top_flow_id == command.flow and not continue_interrupted_flow_active:
|
|
536
|
+
# drop a start flow command if the starting flow is equal
|
|
537
|
+
# to the currently active flow
|
|
538
|
+
structlogger.debug(
|
|
539
|
+
"command_processor.clean_up_commands." "skip_command_flow_already_active",
|
|
540
|
+
command=command,
|
|
541
|
+
)
|
|
542
|
+
return clean_commands
|
|
543
|
+
|
|
544
|
+
clean_commands.append(command)
|
|
545
|
+
return clean_commands
|
|
546
|
+
|
|
547
|
+
|
|
532
548
|
def clean_up_clarify_command(
|
|
533
549
|
commands_so_far: List[Command],
|
|
534
550
|
all_commands: List[Command],
|
|
@@ -8,6 +8,13 @@ from typing import Any, Callable, Dict, List, Optional
|
|
|
8
8
|
import jsonpatch
|
|
9
9
|
import structlog
|
|
10
10
|
|
|
11
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
12
|
+
AgentStackFrame,
|
|
13
|
+
AgentState,
|
|
14
|
+
FlowStackFrameType,
|
|
15
|
+
UserFlowStackFrame,
|
|
16
|
+
)
|
|
17
|
+
|
|
11
18
|
if typing.TYPE_CHECKING:
|
|
12
19
|
from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
|
|
13
20
|
|
|
@@ -91,6 +98,42 @@ class DialogueStack:
|
|
|
91
98
|
"""
|
|
92
99
|
return self.frames.pop()
|
|
93
100
|
|
|
101
|
+
def move_frames_to_top(self, frames_to_move: List["DialogueStackFrame"]) -> None:
|
|
102
|
+
"""Moves specified frames to top of stack while preserving their relative order.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
frames_to_move: The frames to move to the top of the stack.
|
|
106
|
+
"""
|
|
107
|
+
# Get frames that are not being moved
|
|
108
|
+
frames_to_keep = [frame for frame in self.frames if frame not in frames_to_move]
|
|
109
|
+
|
|
110
|
+
# Reorder: keep frames first, then moved frames
|
|
111
|
+
self.frames = frames_to_keep + frames_to_move
|
|
112
|
+
|
|
113
|
+
# set all frames to interrupt except for LINK and CALL
|
|
114
|
+
for frame in self.frames:
|
|
115
|
+
if (
|
|
116
|
+
isinstance(frame, UserFlowStackFrame)
|
|
117
|
+
and frame.frame_type == FlowStackFrameType.LINK
|
|
118
|
+
):
|
|
119
|
+
continue
|
|
120
|
+
if (
|
|
121
|
+
isinstance(frame, UserFlowStackFrame)
|
|
122
|
+
and frame.frame_type == FlowStackFrameType.CALL
|
|
123
|
+
):
|
|
124
|
+
continue
|
|
125
|
+
if (
|
|
126
|
+
isinstance(frame, UserFlowStackFrame)
|
|
127
|
+
and frame.frame_type == FlowStackFrameType.REGULAR
|
|
128
|
+
):
|
|
129
|
+
frame.frame_type = FlowStackFrameType.INTERRUPT
|
|
130
|
+
|
|
131
|
+
# set the first frame to regular
|
|
132
|
+
for frame in self.frames:
|
|
133
|
+
if isinstance(frame, UserFlowStackFrame):
|
|
134
|
+
frame.frame_type = FlowStackFrameType.REGULAR
|
|
135
|
+
return
|
|
136
|
+
|
|
94
137
|
def current_context(self) -> Dict[str, Any]:
|
|
95
138
|
"""Returns the context of the topmost frame.
|
|
96
139
|
|
|
@@ -109,7 +152,7 @@ class DialogueStack:
|
|
|
109
152
|
"""Returns the topmost frame from the stack.
|
|
110
153
|
|
|
111
154
|
Args:
|
|
112
|
-
|
|
155
|
+
ignore: The ID of the flow to ignore. Picks the top most
|
|
113
156
|
frame that has a different flow ID.
|
|
114
157
|
|
|
115
158
|
Returns:
|
|
@@ -136,7 +179,8 @@ class DialogueStack:
|
|
|
136
179
|
patch_dump: The patch to apply to the stack.
|
|
137
180
|
|
|
138
181
|
Returns:
|
|
139
|
-
|
|
182
|
+
The updated stack.
|
|
183
|
+
"""
|
|
140
184
|
patch = jsonpatch.JsonPatch.from_string(patch_dump)
|
|
141
185
|
dialogue_stack_dump = patch.apply(self.as_dict())
|
|
142
186
|
return DialogueStack.from_dict(dialogue_stack_dump)
|
|
@@ -177,3 +221,80 @@ class DialogueStack:
|
|
|
177
221
|
if patch:
|
|
178
222
|
return patch.to_string()
|
|
179
223
|
return None
|
|
224
|
+
|
|
225
|
+
def _find_agent_frame_by_predicate(
|
|
226
|
+
self, predicate: Callable[[AgentStackFrame], bool]
|
|
227
|
+
) -> List[AgentStackFrame]:
|
|
228
|
+
stack_frames: List[AgentStackFrame] = []
|
|
229
|
+
for stack_frame in reversed(self.frames):
|
|
230
|
+
if isinstance(stack_frame, AgentStackFrame) and predicate(stack_frame):
|
|
231
|
+
stack_frames.append(stack_frame)
|
|
232
|
+
return stack_frames
|
|
233
|
+
|
|
234
|
+
def find_active_agent_frame(self) -> Optional[AgentStackFrame]:
|
|
235
|
+
stack_frames = self._find_agent_frame_by_predicate(
|
|
236
|
+
lambda frame: frame.state == AgentState.WAITING_FOR_INPUT
|
|
237
|
+
)
|
|
238
|
+
if stack_frames:
|
|
239
|
+
return stack_frames[0]
|
|
240
|
+
return None
|
|
241
|
+
|
|
242
|
+
def find_agent_stack_frame_by_agent(
|
|
243
|
+
self, agent_id: str
|
|
244
|
+
) -> Optional[AgentStackFrame]:
|
|
245
|
+
"""Get the agent stack frame for a specific agent ID.
|
|
246
|
+
|
|
247
|
+
May also include the agent stack frame in the INTERRUPTED state.
|
|
248
|
+
"""
|
|
249
|
+
stack_frames = self._find_agent_frame_by_predicate(
|
|
250
|
+
lambda frame: frame.agent_id == agent_id
|
|
251
|
+
)
|
|
252
|
+
if stack_frames:
|
|
253
|
+
return stack_frames[0]
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
def find_active_agent_stack_frame_for_flow(
|
|
257
|
+
self, flow_id: str
|
|
258
|
+
) -> Optional[AgentStackFrame]:
|
|
259
|
+
"""Get the agent stack frame of a specific flow."""
|
|
260
|
+
stack_frames = self._find_agent_frame_by_predicate(
|
|
261
|
+
lambda frame: frame.flow_id == flow_id
|
|
262
|
+
)
|
|
263
|
+
for stack_frame in stack_frames:
|
|
264
|
+
if stack_frame.state == AgentState.WAITING_FOR_INPUT:
|
|
265
|
+
return stack_frame
|
|
266
|
+
return None
|
|
267
|
+
|
|
268
|
+
def get_active_agent_id(self) -> Optional[typing.Text]:
|
|
269
|
+
agent_frame = self.find_active_agent_frame()
|
|
270
|
+
if agent_frame:
|
|
271
|
+
return agent_frame.agent_id
|
|
272
|
+
return None
|
|
273
|
+
|
|
274
|
+
def agent_is_active(self) -> bool:
|
|
275
|
+
return self.find_active_agent_frame() is not None
|
|
276
|
+
|
|
277
|
+
def get_all_user_flow_frames(
|
|
278
|
+
self, ignore_call_and_link_frames: bool = True
|
|
279
|
+
) -> List[UserFlowStackFrame]:
|
|
280
|
+
"""Get all user flow frames from the dialogue stack.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
ignore_call_and_link_frames: Whether to ignore user frames of type `call`
|
|
284
|
+
and `link`. By default, these frames are ignored.
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
A list of all user flow frames in the dialogue stack.
|
|
288
|
+
"""
|
|
289
|
+
return [
|
|
290
|
+
frame
|
|
291
|
+
for frame in self.frames
|
|
292
|
+
if isinstance(frame, UserFlowStackFrame)
|
|
293
|
+
and (
|
|
294
|
+
not ignore_call_and_link_frames
|
|
295
|
+
or (
|
|
296
|
+
frame.frame_type != FlowStackFrameType.CALL
|
|
297
|
+
and frame.frame_type != FlowStackFrameType.LINK
|
|
298
|
+
)
|
|
299
|
+
)
|
|
300
|
+
]
|
|
@@ -94,6 +94,18 @@ class InvalidFlowStepIdException(Exception):
|
|
|
94
94
|
super().__init__(f"Invalid flow step ID '{step_id}' for flow '{flow_id}'.")
|
|
95
95
|
|
|
96
96
|
|
|
97
|
+
class InvalidAgentState(RasaException):
|
|
98
|
+
"""Raised if the agent state is invalid."""
|
|
99
|
+
|
|
100
|
+
def __init__(self, invalid_state: str) -> None:
|
|
101
|
+
"""Creates a `InvalidAgentState`.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
invalid_state: The invalid agent state.
|
|
105
|
+
"""
|
|
106
|
+
super().__init__(f"Invalid agent state '{invalid_state}'.")
|
|
107
|
+
|
|
108
|
+
|
|
97
109
|
@dataclass
|
|
98
110
|
class BaseFlowStackFrame(DialogueStackFrame):
|
|
99
111
|
flow_id: str = "" # needed to avoid "default arg before non-default" error
|
|
@@ -171,3 +183,48 @@ class UserFlowStackFrame(BaseFlowStackFrame):
|
|
|
171
183
|
step_id=data["step_id"],
|
|
172
184
|
frame_type=FlowStackFrameType.from_str(data.get("frame_type")),
|
|
173
185
|
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class AgentState(str, Enum):
|
|
189
|
+
INTERRUPTED = "interrupted"
|
|
190
|
+
WAITING_FOR_INPUT = "waiting_for_input"
|
|
191
|
+
|
|
192
|
+
@staticmethod
|
|
193
|
+
def from_str(state: Optional[str]) -> AgentState:
|
|
194
|
+
if state == AgentState.WAITING_FOR_INPUT.value:
|
|
195
|
+
return AgentState.WAITING_FOR_INPUT
|
|
196
|
+
elif state == AgentState.INTERRUPTED.value:
|
|
197
|
+
return AgentState.INTERRUPTED
|
|
198
|
+
else:
|
|
199
|
+
raise InvalidAgentState(state)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@dataclass
|
|
203
|
+
class AgentStackFrame(BaseFlowStackFrame):
|
|
204
|
+
agent_id: str = ""
|
|
205
|
+
state: AgentState = AgentState.WAITING_FOR_INPUT
|
|
206
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
207
|
+
|
|
208
|
+
@classmethod
|
|
209
|
+
def type(cls) -> str:
|
|
210
|
+
"""Returns the type of the frame."""
|
|
211
|
+
return "agent"
|
|
212
|
+
|
|
213
|
+
@staticmethod
|
|
214
|
+
def from_dict(data: Dict[str, Any]) -> AgentStackFrame:
|
|
215
|
+
"""Creates a `AgentStackFrame` from a dictionary.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
data: The dictionary to create the `AgentStackFrame` from.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
The created `AgentStackFrame`.
|
|
222
|
+
"""
|
|
223
|
+
return AgentStackFrame(
|
|
224
|
+
frame_id=data["frame_id"],
|
|
225
|
+
flow_id=data["flow_id"],
|
|
226
|
+
step_id=data["step_id"],
|
|
227
|
+
agent_id=data["agent_id"],
|
|
228
|
+
state=AgentState.from_str(data["state"]),
|
|
229
|
+
metadata=data.get("metadata"),
|
|
230
|
+
)
|