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,25 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import asyncio
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text, cast
|
|
4
5
|
|
|
5
6
|
import structlog
|
|
6
7
|
from jinja2 import Template
|
|
7
8
|
from pypred import Predicate
|
|
8
|
-
from structlog.contextvars import
|
|
9
|
-
|
|
9
|
+
from structlog.contextvars import bound_contextvars
|
|
10
|
+
|
|
11
|
+
from rasa.agents.agent_manager import AgentManager
|
|
12
|
+
from rasa.agents.constants import (
|
|
13
|
+
A2A_AGENT_CONTEXT_ID_KEY,
|
|
14
|
+
AGENT_METADATA_AGENT_RESPONSE_KEY,
|
|
15
|
+
AGENT_METADATA_EXIT_IF_KEY,
|
|
16
|
+
AGENT_METADATA_TOOL_RESULTS_KEY,
|
|
17
|
+
MAX_AGENT_RETRY_DELAY_SECONDS,
|
|
10
18
|
)
|
|
11
|
-
|
|
19
|
+
from rasa.agents.core.types import AgentStatus, ProtocolType
|
|
20
|
+
from rasa.agents.schemas import AgentInput, AgentOutput
|
|
21
|
+
from rasa.agents.schemas.agent_input import AgentInputSlot
|
|
22
|
+
from rasa.core.available_agents import AvailableAgents
|
|
12
23
|
from rasa.core.available_endpoints import AvailableEndpoints
|
|
13
24
|
from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
|
|
14
25
|
from rasa.core.policies.flows.flow_exceptions import (
|
|
@@ -22,7 +33,8 @@ from rasa.core.policies.flows.flow_step_result import (
|
|
|
22
33
|
FlowStepResult,
|
|
23
34
|
PauseFlowReturnPrediction,
|
|
24
35
|
)
|
|
25
|
-
from rasa.
|
|
36
|
+
from rasa.core.policies.flows.mcp_tool_executor import call_mcp_tool
|
|
37
|
+
from rasa.core.utils import get_slot_names_from_exit_conditions
|
|
26
38
|
from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
|
|
27
39
|
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
28
40
|
FLOW_PATTERN_COLLECT_INFORMATION,
|
|
@@ -49,17 +61,30 @@ from rasa.dialogue_understanding.stack.frames import (
|
|
|
49
61
|
UserFlowStackFrame,
|
|
50
62
|
)
|
|
51
63
|
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
64
|
+
AgentStackFrame,
|
|
65
|
+
AgentState,
|
|
52
66
|
FlowStackFrameType,
|
|
53
67
|
)
|
|
54
68
|
from rasa.dialogue_understanding.stack.utils import (
|
|
55
|
-
|
|
69
|
+
user_frames_on_the_stack,
|
|
56
70
|
)
|
|
71
|
+
from rasa.dialogue_understanding.utils import assemble_options_string
|
|
72
|
+
from rasa.shared.agents.utils import get_protocol_type
|
|
57
73
|
from rasa.shared.constants import RASA_PATTERN_HUMAN_HANDOFF
|
|
58
74
|
from rasa.shared.core.constants import (
|
|
75
|
+
ACTION_AGENT_REQUEST_USER_INPUT_NAME,
|
|
59
76
|
ACTION_LISTEN_NAME,
|
|
77
|
+
ACTION_METADATA_MESSAGE_KEY,
|
|
78
|
+
ACTION_METADATA_TEXT_KEY,
|
|
79
|
+
ACTION_SEND_TEXT_NAME,
|
|
80
|
+
FLOW_HASHES_SLOT,
|
|
60
81
|
SILENCE_TIMEOUT_SLOT,
|
|
61
82
|
)
|
|
62
83
|
from rasa.shared.core.events import (
|
|
84
|
+
AgentCancelled,
|
|
85
|
+
AgentCompleted,
|
|
86
|
+
AgentResumed,
|
|
87
|
+
AgentStarted,
|
|
63
88
|
Event,
|
|
64
89
|
FlowCompleted,
|
|
65
90
|
FlowResumed,
|
|
@@ -67,11 +92,7 @@ from rasa.shared.core.events import (
|
|
|
67
92
|
SlotSet,
|
|
68
93
|
)
|
|
69
94
|
from rasa.shared.core.flows import FlowsList
|
|
70
|
-
from rasa.shared.core.flows.flow import
|
|
71
|
-
END_STEP,
|
|
72
|
-
Flow,
|
|
73
|
-
FlowStep,
|
|
74
|
-
)
|
|
95
|
+
from rasa.shared.core.flows.flow import END_STEP, Flow, FlowStep
|
|
75
96
|
from rasa.shared.core.flows.flow_step_links import (
|
|
76
97
|
ElseFlowStepLink,
|
|
77
98
|
IfFlowStepLink,
|
|
@@ -88,15 +109,19 @@ from rasa.shared.core.flows.steps import (
|
|
|
88
109
|
SetSlotsFlowStep,
|
|
89
110
|
)
|
|
90
111
|
from rasa.shared.core.flows.steps.constants import START_STEP
|
|
91
|
-
from rasa.shared.core.slots import Slot, SlotRejection
|
|
92
|
-
from rasa.shared.core.trackers import
|
|
93
|
-
|
|
94
|
-
)
|
|
112
|
+
from rasa.shared.core.slots import CategoricalSlot, Slot, SlotRejection
|
|
113
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
114
|
+
from rasa.shared.utils.llm import tracker_as_readable_transcript
|
|
95
115
|
|
|
96
116
|
structlogger = structlog.get_logger()
|
|
97
117
|
|
|
98
118
|
MAX_NUMBER_OF_STEPS = 250
|
|
99
119
|
|
|
120
|
+
MAX_AGENT_RETRIES = 3
|
|
121
|
+
|
|
122
|
+
# Slots that should not be forwarded to sub-agents via AgentInput
|
|
123
|
+
SLOTS_EXCLUDED_FOR_AGENT = [FLOW_HASHES_SLOT]
|
|
124
|
+
|
|
100
125
|
|
|
101
126
|
def render_template_variables(text: str, context: Dict[Text, Any]) -> str:
|
|
102
127
|
"""Replace context variables in a text."""
|
|
@@ -148,6 +173,13 @@ def select_next_step_id(
|
|
|
148
173
|
tracker: DialogueStateTracker,
|
|
149
174
|
) -> Optional[Text]:
|
|
150
175
|
"""Selects the next step id based on the current step."""
|
|
176
|
+
# if the current step is a call step to an agent, and we already have an
|
|
177
|
+
# AgentStackFrame on top of the stack, we need to return the current
|
|
178
|
+
# step id again in order to loop back to the agent.
|
|
179
|
+
agent_stack_frame = tracker.stack.top()
|
|
180
|
+
if agent_stack_frame and isinstance(agent_stack_frame, AgentStackFrame):
|
|
181
|
+
return current.id
|
|
182
|
+
|
|
151
183
|
next_step = current.next
|
|
152
184
|
if len(next_step.links) == 1 and isinstance(next_step.links[0], StaticFlowStepLink):
|
|
153
185
|
return next_step.links[0].target
|
|
@@ -234,38 +266,58 @@ def trigger_pattern_continue_interrupted(
|
|
|
234
266
|
stack: DialogueStack,
|
|
235
267
|
flows: FlowsList,
|
|
236
268
|
tracker: DialogueStateTracker,
|
|
237
|
-
) ->
|
|
269
|
+
) -> None:
|
|
238
270
|
"""Trigger the pattern to continue an interrupted flow if needed."""
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
# get previously started user flow that will be continued
|
|
242
|
-
interrupted_user_flow_frame = top_user_flow_frame(stack)
|
|
243
|
-
interrupted_user_flow_step = (
|
|
244
|
-
interrupted_user_flow_frame.step(flows) if interrupted_user_flow_frame else None
|
|
245
|
-
)
|
|
246
|
-
interrupted_user_flow = (
|
|
247
|
-
interrupted_user_flow_frame.flow(flows) if interrupted_user_flow_frame else None
|
|
248
|
-
)
|
|
249
|
-
|
|
271
|
+
# only trigger the pattern if the current frame is a user flow frame
|
|
272
|
+
# with a frame type of interrupt
|
|
250
273
|
if (
|
|
251
|
-
isinstance(current_frame, UserFlowStackFrame)
|
|
252
|
-
|
|
253
|
-
and interrupted_user_flow is not None
|
|
254
|
-
and current_frame.frame_type == FlowStackFrameType.INTERRUPT
|
|
255
|
-
and not is_step_end_of_flow(interrupted_user_flow_step)
|
|
274
|
+
not isinstance(current_frame, UserFlowStackFrame)
|
|
275
|
+
or current_frame.frame_type != FlowStackFrameType.INTERRUPT
|
|
256
276
|
):
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
# get all previously interrupted user flows
|
|
280
|
+
interrupted_user_flow_stack_frames = user_frames_on_the_stack(stack)
|
|
281
|
+
|
|
282
|
+
interrupted_user_flows_to_continue: List[UserFlowStackFrame] = []
|
|
283
|
+
# check if interrupted user flows can be continued
|
|
284
|
+
# i.e. the flow is not at the end of the flow
|
|
285
|
+
for frame in interrupted_user_flow_stack_frames:
|
|
286
|
+
interrupted_user_flow_step = frame.step(flows)
|
|
287
|
+
interrupted_user_flow = frame.flow(flows)
|
|
288
|
+
if (
|
|
289
|
+
interrupted_user_flow_step is not None
|
|
290
|
+
and interrupted_user_flow is not None
|
|
291
|
+
and not is_step_end_of_flow(interrupted_user_flow_step)
|
|
292
|
+
):
|
|
293
|
+
interrupted_user_flows_to_continue.append(frame)
|
|
294
|
+
|
|
295
|
+
# if there are no interrupted user flows to continue,
|
|
296
|
+
# we don't need to trigger the pattern
|
|
297
|
+
if len(interrupted_user_flows_to_continue) == 0:
|
|
298
|
+
return None
|
|
299
|
+
|
|
300
|
+
# get the flow names and ids of the interrupted flows
|
|
301
|
+
# and assemble the options string
|
|
302
|
+
flow_names: List[str] = []
|
|
303
|
+
flow_ids: List[str] = []
|
|
304
|
+
for frame in interrupted_user_flows_to_continue:
|
|
305
|
+
flow_names.append(
|
|
306
|
+
frame.flow(flows).readable_name(language=tracker.current_language)
|
|
263
307
|
)
|
|
264
|
-
|
|
265
|
-
|
|
308
|
+
flow_ids.append(frame.flow_id)
|
|
309
|
+
options_string = assemble_options_string(flow_names)
|
|
310
|
+
|
|
311
|
+
# trigger the pattern to continue the interrupted flows
|
|
312
|
+
stack.push(
|
|
313
|
+
ContinueInterruptedPatternFlowStackFrame(
|
|
314
|
+
interrupted_flow_names=flow_names,
|
|
315
|
+
interrupted_flow_ids=flow_ids,
|
|
316
|
+
interrupted_flow_options=options_string,
|
|
266
317
|
)
|
|
318
|
+
)
|
|
267
319
|
|
|
268
|
-
return
|
|
320
|
+
return None
|
|
269
321
|
|
|
270
322
|
|
|
271
323
|
def trigger_pattern_completed(
|
|
@@ -359,8 +411,11 @@ def reset_scoped_slots(
|
|
|
359
411
|
return events
|
|
360
412
|
|
|
361
413
|
|
|
362
|
-
def advance_flows(
|
|
363
|
-
tracker: DialogueStateTracker,
|
|
414
|
+
async def advance_flows(
|
|
415
|
+
tracker: DialogueStateTracker,
|
|
416
|
+
available_actions: List[str],
|
|
417
|
+
flows: FlowsList,
|
|
418
|
+
slots: List[Slot],
|
|
364
419
|
) -> FlowActionPrediction:
|
|
365
420
|
"""Advance the current flows until the next action.
|
|
366
421
|
|
|
@@ -368,6 +423,7 @@ def advance_flows(
|
|
|
368
423
|
tracker: The tracker to get the next action for.
|
|
369
424
|
available_actions: The actions that are available in the domain.
|
|
370
425
|
flows: All flows.
|
|
426
|
+
slots: The slots that are available in the domain.
|
|
371
427
|
|
|
372
428
|
Returns:
|
|
373
429
|
The predicted action and the events to run.
|
|
@@ -377,13 +433,16 @@ def advance_flows(
|
|
|
377
433
|
# if there are no flows, there is nothing to do
|
|
378
434
|
return FlowActionPrediction(None, 0.0)
|
|
379
435
|
|
|
380
|
-
return advance_flows_until_next_action(
|
|
436
|
+
return await advance_flows_until_next_action(
|
|
437
|
+
tracker, available_actions, flows, slots
|
|
438
|
+
)
|
|
381
439
|
|
|
382
440
|
|
|
383
|
-
def advance_flows_until_next_action(
|
|
441
|
+
async def advance_flows_until_next_action(
|
|
384
442
|
tracker: DialogueStateTracker,
|
|
385
443
|
available_actions: List[str],
|
|
386
444
|
flows: FlowsList,
|
|
445
|
+
slots: List[Slot],
|
|
387
446
|
) -> FlowActionPrediction:
|
|
388
447
|
"""Advance the flow and select the next action to execute.
|
|
389
448
|
|
|
@@ -441,7 +500,7 @@ def advance_flows_until_next_action(
|
|
|
441
500
|
|
|
442
501
|
with bound_contextvars(step_id=next_step.id):
|
|
443
502
|
step_stack = tracker.stack
|
|
444
|
-
step_result = run_step(
|
|
503
|
+
step_result = await run_step(
|
|
445
504
|
next_step,
|
|
446
505
|
current_flow,
|
|
447
506
|
step_stack,
|
|
@@ -449,6 +508,7 @@ def advance_flows_until_next_action(
|
|
|
449
508
|
available_actions,
|
|
450
509
|
flows,
|
|
451
510
|
previous_step_id,
|
|
511
|
+
slots,
|
|
452
512
|
)
|
|
453
513
|
new_events = step_result.events
|
|
454
514
|
if (
|
|
@@ -477,10 +537,9 @@ def advance_flows_until_next_action(
|
|
|
477
537
|
# make sure we really return all events that got created during the
|
|
478
538
|
# step execution of all steps (not only the last one)
|
|
479
539
|
prediction.events = gathered_events
|
|
480
|
-
prediction.metadata = {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
}
|
|
540
|
+
prediction.metadata = prediction.metadata or {}
|
|
541
|
+
prediction.metadata[ACTIVE_FLOW_METADATA_KEY] = tracker.active_flow
|
|
542
|
+
prediction.metadata[STEP_ID_METADATA_KEY] = tracker.current_step_id
|
|
484
543
|
return prediction
|
|
485
544
|
else:
|
|
486
545
|
structlogger.warning("flow.step.execution.no_action")
|
|
@@ -522,6 +581,8 @@ def validate_collect_step(
|
|
|
522
581
|
|
|
523
582
|
def cancel_flow_and_push_internal_error(stack: DialogueStack, flow_name: str) -> None:
|
|
524
583
|
"""Cancel the top user flow and push the internal error pattern."""
|
|
584
|
+
from rasa.dialogue_understanding.commands import CancelFlowCommand
|
|
585
|
+
|
|
525
586
|
top_frame = stack.top()
|
|
526
587
|
|
|
527
588
|
if isinstance(top_frame, BaseFlowStackFrame):
|
|
@@ -550,7 +611,7 @@ def attach_stack_metadata_to_events(
|
|
|
550
611
|
event.metadata[ACTIVE_FLOW_METADATA_KEY] = flow_id
|
|
551
612
|
|
|
552
613
|
|
|
553
|
-
def run_step(
|
|
614
|
+
async def run_step(
|
|
554
615
|
step: FlowStep,
|
|
555
616
|
flow: Flow,
|
|
556
617
|
stack: DialogueStack,
|
|
@@ -558,6 +619,7 @@ def run_step(
|
|
|
558
619
|
available_actions: List[str],
|
|
559
620
|
flows: FlowsList,
|
|
560
621
|
previous_step_id: str,
|
|
622
|
+
slots: List[Slot],
|
|
561
623
|
) -> FlowStepResult:
|
|
562
624
|
"""Run a single step of a flow.
|
|
563
625
|
|
|
@@ -576,6 +638,7 @@ def run_step(
|
|
|
576
638
|
available_actions: The actions that are available in the domain.
|
|
577
639
|
flows: All flows.
|
|
578
640
|
previous_step_id: The ID of the previous step.
|
|
641
|
+
slots: The slots that are available in the domain.
|
|
579
642
|
|
|
580
643
|
Returns:
|
|
581
644
|
A result of running the step describing where to transition to.
|
|
@@ -615,7 +678,7 @@ def run_step(
|
|
|
615
678
|
return _run_link_step(initial_events, stack, step)
|
|
616
679
|
|
|
617
680
|
elif isinstance(step, CallFlowStep):
|
|
618
|
-
return _run_call_step(initial_events, stack, step)
|
|
681
|
+
return await _run_call_step(initial_events, stack, step, tracker, slots)
|
|
619
682
|
|
|
620
683
|
elif isinstance(step, SetSlotsFlowStep):
|
|
621
684
|
return _run_set_slot_step(initial_events, step)
|
|
@@ -667,12 +730,10 @@ def _run_end_step(
|
|
|
667
730
|
structlogger.debug("flow.step.run.flow_end")
|
|
668
731
|
current_frame = stack.pop()
|
|
669
732
|
trigger_pattern_completed(current_frame, stack, flows)
|
|
670
|
-
|
|
671
|
-
current_frame, stack, flows, tracker
|
|
672
|
-
)
|
|
733
|
+
trigger_pattern_continue_interrupted(current_frame, stack, flows, tracker)
|
|
673
734
|
reset_events: List[Event] = reset_scoped_slots(current_frame, flow, tracker)
|
|
674
735
|
return ContinueFlowWithNextStep(
|
|
675
|
-
events=initial_events + reset_events
|
|
736
|
+
events=initial_events + reset_events, has_flow_ended=True
|
|
676
737
|
)
|
|
677
738
|
|
|
678
739
|
|
|
@@ -684,17 +745,26 @@ def _run_set_slot_step(
|
|
|
684
745
|
return ContinueFlowWithNextStep(events=initial_events + slot_events)
|
|
685
746
|
|
|
686
747
|
|
|
687
|
-
def _run_call_step(
|
|
688
|
-
initial_events: List[Event],
|
|
748
|
+
async def _run_call_step(
|
|
749
|
+
initial_events: List[Event],
|
|
750
|
+
stack: DialogueStack,
|
|
751
|
+
step: CallFlowStep,
|
|
752
|
+
tracker: DialogueStateTracker,
|
|
753
|
+
slots: List[Slot],
|
|
689
754
|
) -> FlowStepResult:
|
|
690
755
|
structlogger.debug("flow.step.run.call")
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
756
|
+
if step.is_calling_mcp_tool():
|
|
757
|
+
return await call_mcp_tool(initial_events, stack, step, tracker)
|
|
758
|
+
elif step.is_calling_agent():
|
|
759
|
+
return await run_agent(initial_events, stack, step, tracker, slots)
|
|
760
|
+
else:
|
|
761
|
+
stack.push(
|
|
762
|
+
UserFlowStackFrame(
|
|
763
|
+
flow_id=step.call,
|
|
764
|
+
frame_type=FlowStackFrameType.CALL,
|
|
765
|
+
),
|
|
766
|
+
)
|
|
767
|
+
return ContinueFlowWithNextStep(events=initial_events)
|
|
698
768
|
|
|
699
769
|
|
|
700
770
|
def _run_link_step(
|
|
@@ -740,14 +810,7 @@ def _run_action_step(
|
|
|
740
810
|
# do not log about non-existing validation actions of collect steps
|
|
741
811
|
utter_action_name = render_template_variables("{{context.utter}}", context)
|
|
742
812
|
if utter_action_name not in available_actions:
|
|
743
|
-
structlogger.warning(
|
|
744
|
-
"flow.step.run.action.unknown",
|
|
745
|
-
action=action_name,
|
|
746
|
-
event_info=(
|
|
747
|
-
f"The action '{action_name}' is not defined in the domain but "
|
|
748
|
-
f"getting triggered by the flow '{step.flow_id}'."
|
|
749
|
-
),
|
|
750
|
-
)
|
|
813
|
+
structlogger.warning("flow.step.run.action.unknown", action=action_name)
|
|
751
814
|
return ContinueFlowWithNextStep(events=initial_events)
|
|
752
815
|
|
|
753
816
|
|
|
@@ -839,3 +902,386 @@ def _append_global_silence_timeout_event(
|
|
|
839
902
|
AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout,
|
|
840
903
|
)
|
|
841
904
|
)
|
|
905
|
+
|
|
906
|
+
|
|
907
|
+
def _reset_slots_covered_by_exit_if(
|
|
908
|
+
exit_conditions: List[str], tracker: DialogueStateTracker
|
|
909
|
+
) -> None:
|
|
910
|
+
"""Reset the slots covered by the exit_if condition."""
|
|
911
|
+
reset_slot_names = get_slot_names_from_exit_conditions(exit_conditions)
|
|
912
|
+
for slot_name in reset_slot_names:
|
|
913
|
+
if tracker.slots.get(slot_name) is not None:
|
|
914
|
+
tracker.update(SlotSet(slot_name, None))
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
async def run_agent(
|
|
918
|
+
initial_events: List[Event],
|
|
919
|
+
stack: DialogueStack,
|
|
920
|
+
step: CallFlowStep,
|
|
921
|
+
tracker: DialogueStateTracker,
|
|
922
|
+
slots: List[Slot],
|
|
923
|
+
) -> FlowStepResult:
|
|
924
|
+
"""Run an agent call step."""
|
|
925
|
+
structlogger.debug(
|
|
926
|
+
"flow.step.run_agent", agent_id=step.call, step_id=step.id, flow_id=step.flow_id
|
|
927
|
+
)
|
|
928
|
+
|
|
929
|
+
final_events = initial_events
|
|
930
|
+
agent_stack_frame = tracker.stack.find_agent_stack_frame_by_agent(
|
|
931
|
+
agent_id=step.call
|
|
932
|
+
)
|
|
933
|
+
|
|
934
|
+
if (
|
|
935
|
+
agent_stack_frame
|
|
936
|
+
and agent_stack_frame == stack.top()
|
|
937
|
+
and agent_stack_frame.state == AgentState.INTERRUPTED
|
|
938
|
+
):
|
|
939
|
+
structlogger.debug(
|
|
940
|
+
"flow.step.run_agent.resume_interrupted_agent",
|
|
941
|
+
agent_id=step.call,
|
|
942
|
+
step_id=step.id,
|
|
943
|
+
flow_id=step.flow_id,
|
|
944
|
+
)
|
|
945
|
+
# The agent was previously interrupted when waiting for user input.
|
|
946
|
+
# Now we're back to the agent execution step and need to output the last message
|
|
947
|
+
# from the agent (user input request) again and wait for user input
|
|
948
|
+
cast(AgentStackFrame, stack.top()).state = AgentState.WAITING_FOR_INPUT
|
|
949
|
+
tracker.update_stack(stack)
|
|
950
|
+
utterance = (
|
|
951
|
+
agent_stack_frame.metadata.get(AGENT_METADATA_AGENT_RESPONSE_KEY, "")
|
|
952
|
+
if agent_stack_frame.metadata
|
|
953
|
+
else ""
|
|
954
|
+
)
|
|
955
|
+
final_events.append(AgentResumed(agent_id=step.call, flow_id=step.flow_id))
|
|
956
|
+
return PauseFlowReturnPrediction(
|
|
957
|
+
_create_agent_request_user_input_prediction(utterance, final_events)
|
|
958
|
+
)
|
|
959
|
+
|
|
960
|
+
agent_input_metadata = (
|
|
961
|
+
agent_stack_frame.metadata
|
|
962
|
+
if agent_stack_frame and agent_stack_frame.metadata
|
|
963
|
+
else {}
|
|
964
|
+
)
|
|
965
|
+
_update_agent_input_metadata_with_events(
|
|
966
|
+
agent_input_metadata, step.call, step.flow_id, tracker
|
|
967
|
+
)
|
|
968
|
+
if step.exit_if:
|
|
969
|
+
# TODO: this is a temporary fix to reset the slots covered by the exit_if
|
|
970
|
+
if (
|
|
971
|
+
agent_stack_frame
|
|
972
|
+
and agent_stack_frame.frame_id == f"restart_agent_{step.call}"
|
|
973
|
+
):
|
|
974
|
+
# when restarting an agent, we need to reset the slots covered by the
|
|
975
|
+
# exit_if condition so that the agent can run again.
|
|
976
|
+
_reset_slots_covered_by_exit_if(step.exit_if, tracker)
|
|
977
|
+
agent_input_metadata[AGENT_METADATA_EXIT_IF_KEY] = step.exit_if
|
|
978
|
+
agent_input = AgentInput(
|
|
979
|
+
id=step.call,
|
|
980
|
+
user_message=tracker.latest_message.text or ""
|
|
981
|
+
if tracker.latest_message
|
|
982
|
+
else "",
|
|
983
|
+
slots=_prepare_slots_for_agent(tracker.current_slot_values(), slots),
|
|
984
|
+
conversation_history=tracker_as_readable_transcript(tracker),
|
|
985
|
+
events=tracker.current_state().get("events") or [],
|
|
986
|
+
metadata=agent_input_metadata,
|
|
987
|
+
)
|
|
988
|
+
|
|
989
|
+
final_events.append(AgentStarted(step.call, step.flow_id))
|
|
990
|
+
|
|
991
|
+
protocol_type = get_protocol_type(step, AvailableAgents.get_agent_config(step.call))
|
|
992
|
+
# send the input to the agent and wait for a response
|
|
993
|
+
structlogger.debug(
|
|
994
|
+
"flow.step.run_agent.agent_input",
|
|
995
|
+
agent_name=step.call,
|
|
996
|
+
step_id=step.id,
|
|
997
|
+
flow_id=step.flow_id,
|
|
998
|
+
agent_input=agent_input,
|
|
999
|
+
)
|
|
1000
|
+
output: AgentOutput = await _call_agent_with_retry(
|
|
1001
|
+
agent_name=step.call,
|
|
1002
|
+
protocol_type=protocol_type,
|
|
1003
|
+
agent_input=agent_input,
|
|
1004
|
+
max_retries=MAX_AGENT_RETRIES,
|
|
1005
|
+
)
|
|
1006
|
+
structlogger.debug(
|
|
1007
|
+
"flow.step.run_agent.agent_response",
|
|
1008
|
+
agent_name=step.call,
|
|
1009
|
+
step_id=step.id,
|
|
1010
|
+
flow_id=step.flow_id,
|
|
1011
|
+
agent_response=output,
|
|
1012
|
+
)
|
|
1013
|
+
|
|
1014
|
+
# add the set slot events returned by the agent to the list of final events
|
|
1015
|
+
if output.events:
|
|
1016
|
+
final_events.extend(output.events)
|
|
1017
|
+
|
|
1018
|
+
if output.status == AgentStatus.INPUT_REQUIRED:
|
|
1019
|
+
output.metadata = output.metadata or {}
|
|
1020
|
+
output.metadata[AGENT_METADATA_AGENT_RESPONSE_KEY] = (
|
|
1021
|
+
output.response_message or ""
|
|
1022
|
+
)
|
|
1023
|
+
output.metadata[AGENT_METADATA_TOOL_RESULTS_KEY] = output.tool_results or []
|
|
1024
|
+
_update_agent_events(final_events, output.metadata)
|
|
1025
|
+
|
|
1026
|
+
top_stack_frame = stack.top()
|
|
1027
|
+
# update the agent stack frame if it is already on the stack
|
|
1028
|
+
# otherwise push a new one
|
|
1029
|
+
if isinstance(top_stack_frame, AgentStackFrame):
|
|
1030
|
+
top_stack_frame.state = AgentState.WAITING_FOR_INPUT
|
|
1031
|
+
top_stack_frame.metadata = output.metadata
|
|
1032
|
+
top_stack_frame.step_id = step.id
|
|
1033
|
+
top_stack_frame.agent_id = step.call
|
|
1034
|
+
top_stack_frame.flow_id = step.flow_id
|
|
1035
|
+
else:
|
|
1036
|
+
stack.push(
|
|
1037
|
+
AgentStackFrame(
|
|
1038
|
+
flow_id=step.flow_id,
|
|
1039
|
+
agent_id=step.call,
|
|
1040
|
+
state=AgentState.WAITING_FOR_INPUT,
|
|
1041
|
+
step_id=step.id,
|
|
1042
|
+
metadata=output.metadata,
|
|
1043
|
+
)
|
|
1044
|
+
)
|
|
1045
|
+
|
|
1046
|
+
action_prediction = _create_agent_request_user_input_prediction(
|
|
1047
|
+
output.response_message, final_events
|
|
1048
|
+
)
|
|
1049
|
+
return PauseFlowReturnPrediction(action_prediction)
|
|
1050
|
+
elif output.status == AgentStatus.COMPLETED:
|
|
1051
|
+
output.metadata = output.metadata or {}
|
|
1052
|
+
_update_agent_events(final_events, output.metadata)
|
|
1053
|
+
structlogger.debug(
|
|
1054
|
+
"flow.step.run_agent.completed",
|
|
1055
|
+
agent_name=step.call,
|
|
1056
|
+
step_id=step.id,
|
|
1057
|
+
flow_id=step.flow_id,
|
|
1058
|
+
)
|
|
1059
|
+
remove_agent_stack_frame(stack, step.call)
|
|
1060
|
+
agent_completed_event = AgentCompleted(agent_id=step.call, flow_id=step.flow_id)
|
|
1061
|
+
final_events.append(agent_completed_event)
|
|
1062
|
+
if output.response_message:
|
|
1063
|
+
# for open-ended agents we want to utter the last agent message
|
|
1064
|
+
|
|
1065
|
+
return PauseFlowReturnPrediction(
|
|
1066
|
+
_create_send_text_prediction(output.response_message, final_events)
|
|
1067
|
+
)
|
|
1068
|
+
else:
|
|
1069
|
+
return ContinueFlowWithNextStep(events=final_events)
|
|
1070
|
+
elif output.status == AgentStatus.FATAL_ERROR:
|
|
1071
|
+
output.metadata = output.metadata or {}
|
|
1072
|
+
_update_agent_events(final_events, output.metadata)
|
|
1073
|
+
# the agent failed, trigger pattern_internal_error
|
|
1074
|
+
structlogger.error(
|
|
1075
|
+
"flow.step.run_agent.fatal_error",
|
|
1076
|
+
agent_name=step.call,
|
|
1077
|
+
step_id=step.id,
|
|
1078
|
+
flow_id=step.flow_id,
|
|
1079
|
+
error_message=output.error_message,
|
|
1080
|
+
)
|
|
1081
|
+
remove_agent_stack_frame(stack, step.call)
|
|
1082
|
+
final_events.append(
|
|
1083
|
+
AgentCancelled(
|
|
1084
|
+
agent_id=step.call, flow_id=step.flow_id, reason=output.error_message
|
|
1085
|
+
)
|
|
1086
|
+
)
|
|
1087
|
+
stack.push(InternalErrorPatternFlowStackFrame())
|
|
1088
|
+
return ContinueFlowWithNextStep(events=final_events)
|
|
1089
|
+
else:
|
|
1090
|
+
output.metadata = output.metadata or {}
|
|
1091
|
+
_update_agent_events(final_events, output.metadata)
|
|
1092
|
+
structlogger.error(
|
|
1093
|
+
"flow.step.run_agent.unknown_status",
|
|
1094
|
+
agent_name=step.call,
|
|
1095
|
+
step_id=step.id,
|
|
1096
|
+
flow_id=step.flow_id,
|
|
1097
|
+
status=output.status,
|
|
1098
|
+
)
|
|
1099
|
+
remove_agent_stack_frame(stack, step.call)
|
|
1100
|
+
final_events.append(AgentCancelled(agent_id=step.call, flow_id=step.flow_id))
|
|
1101
|
+
stack.push(InternalErrorPatternFlowStackFrame())
|
|
1102
|
+
return ContinueFlowWithNextStep(events=final_events)
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
def remove_agent_stack_frame(stack: DialogueStack, agent_id: str) -> None:
|
|
1106
|
+
"""Finishes the agentic loop by popping the agent stack frame from the
|
|
1107
|
+
provided `stack`. The `tracker.stack` is NOT modified.
|
|
1108
|
+
"""
|
|
1109
|
+
agent_stack_frame = stack.find_agent_stack_frame_by_agent(agent_id)
|
|
1110
|
+
if not agent_stack_frame:
|
|
1111
|
+
return
|
|
1112
|
+
|
|
1113
|
+
while removed_frame := stack.pop():
|
|
1114
|
+
structlogger.debug(
|
|
1115
|
+
"flow_executor.remove_agent_stack_frame",
|
|
1116
|
+
removed_frame=removed_frame,
|
|
1117
|
+
)
|
|
1118
|
+
if removed_frame == agent_stack_frame:
|
|
1119
|
+
break
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
def _create_action_prediction(
|
|
1123
|
+
action_name: str, message: Optional[str], events: Optional[List[Event]]
|
|
1124
|
+
) -> FlowActionPrediction:
|
|
1125
|
+
"""Create a prediction for an action with a text message."""
|
|
1126
|
+
action_metadata = {
|
|
1127
|
+
ACTION_METADATA_MESSAGE_KEY: {
|
|
1128
|
+
ACTION_METADATA_TEXT_KEY: message,
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
return FlowActionPrediction(
|
|
1132
|
+
action_name,
|
|
1133
|
+
1.0,
|
|
1134
|
+
events=events if events else [],
|
|
1135
|
+
metadata=action_metadata,
|
|
1136
|
+
)
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
def _create_agent_request_user_input_prediction(
|
|
1140
|
+
message: Optional[str], events: Optional[List[Event]]
|
|
1141
|
+
) -> FlowActionPrediction:
|
|
1142
|
+
"""Create a prediction for requesting user input from the agent
|
|
1143
|
+
and waiting for it.
|
|
1144
|
+
"""
|
|
1145
|
+
return _create_action_prediction(
|
|
1146
|
+
ACTION_AGENT_REQUEST_USER_INPUT_NAME, message, events
|
|
1147
|
+
)
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
def _create_send_text_prediction(
|
|
1151
|
+
message: Optional[str], events: Optional[List[Event]]
|
|
1152
|
+
) -> FlowActionPrediction:
|
|
1153
|
+
"""Create a prediction for sending a text message to the user."""
|
|
1154
|
+
return _create_action_prediction(ACTION_SEND_TEXT_NAME, message, events)
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
async def _call_agent_with_retry(
|
|
1158
|
+
agent_name: str,
|
|
1159
|
+
protocol_type: ProtocolType,
|
|
1160
|
+
agent_input: AgentInput,
|
|
1161
|
+
max_retries: int,
|
|
1162
|
+
) -> AgentOutput:
|
|
1163
|
+
"""Call an agent with retries in case of recoverable errors."""
|
|
1164
|
+
for attempt in range(max_retries):
|
|
1165
|
+
if attempt > 0:
|
|
1166
|
+
structlogger.debug(
|
|
1167
|
+
"flow_executor.call_agent_with_retry.retrying",
|
|
1168
|
+
agent_name=agent_name,
|
|
1169
|
+
attempt=attempt + 1,
|
|
1170
|
+
num_retries=max_retries,
|
|
1171
|
+
)
|
|
1172
|
+
try:
|
|
1173
|
+
agent_response: AgentOutput = await AgentManager().run_agent(
|
|
1174
|
+
agent_name=agent_name, protocol_type=protocol_type, context=agent_input
|
|
1175
|
+
)
|
|
1176
|
+
except Exception as e:
|
|
1177
|
+
# We don't have a vaild agent response at this time to act based
|
|
1178
|
+
# on the agent status, so we return a fatal error.
|
|
1179
|
+
structlogger.error(
|
|
1180
|
+
"flow_executor.call_agent_with_retry.exception",
|
|
1181
|
+
agent_name=agent_name,
|
|
1182
|
+
error_message=str(e),
|
|
1183
|
+
)
|
|
1184
|
+
return AgentOutput(
|
|
1185
|
+
id=agent_name,
|
|
1186
|
+
status=AgentStatus.FATAL_ERROR,
|
|
1187
|
+
error_message=str(e),
|
|
1188
|
+
)
|
|
1189
|
+
|
|
1190
|
+
if agent_response.status != AgentStatus.RECOVERABLE_ERROR:
|
|
1191
|
+
return agent_response
|
|
1192
|
+
|
|
1193
|
+
structlogger.warning(
|
|
1194
|
+
"flow_executor.call_agent_with_retry.recoverable_error",
|
|
1195
|
+
agent_name=agent_name,
|
|
1196
|
+
attempt=attempt + 1,
|
|
1197
|
+
num_retries=max_retries,
|
|
1198
|
+
error_message=agent_response.error_message,
|
|
1199
|
+
)
|
|
1200
|
+
if attempt < max_retries - 1:
|
|
1201
|
+
# exponential backoff - wait longer with each retry
|
|
1202
|
+
# 1 second, 2 seconds, 4 seconds, etc.
|
|
1203
|
+
await asyncio.sleep(min(2**attempt, MAX_AGENT_RETRY_DELAY_SECONDS))
|
|
1204
|
+
|
|
1205
|
+
# we exhausted all retries, return fatal error
|
|
1206
|
+
structlogger.warning(
|
|
1207
|
+
"flow_executor.call_agent_with_retry.exhausted_retries",
|
|
1208
|
+
agent_name=agent_name,
|
|
1209
|
+
num_retries=max_retries,
|
|
1210
|
+
)
|
|
1211
|
+
return AgentOutput(
|
|
1212
|
+
id=agent_name,
|
|
1213
|
+
status=AgentStatus.FATAL_ERROR,
|
|
1214
|
+
error_message="Exhausted all retries for agent call.",
|
|
1215
|
+
)
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
def _prepare_slots_for_agent(
|
|
1219
|
+
slot_values: Dict[str, Any], slot_definitions: List[Slot]
|
|
1220
|
+
) -> List[AgentInputSlot]:
|
|
1221
|
+
"""Prepare the slots for the agent.
|
|
1222
|
+
|
|
1223
|
+
Filter out slots that should not be forwarded to agents.
|
|
1224
|
+
Add the slot type and allowed values to the slot dictionary.
|
|
1225
|
+
|
|
1226
|
+
Args:
|
|
1227
|
+
slot_values: The full slot dictionary from the tracker.
|
|
1228
|
+
slot_definitions: The slot definitions from the domain.
|
|
1229
|
+
|
|
1230
|
+
Returns:
|
|
1231
|
+
A list of slots containing the name, current value, type, and allowed values.
|
|
1232
|
+
"""
|
|
1233
|
+
|
|
1234
|
+
def _get_slot_definition(slot_name: str) -> Optional[Slot]:
|
|
1235
|
+
for slot in slot_definitions:
|
|
1236
|
+
if slot.name == slot_name:
|
|
1237
|
+
return slot
|
|
1238
|
+
return None
|
|
1239
|
+
|
|
1240
|
+
filtered_slots: List[AgentInputSlot] = []
|
|
1241
|
+
for key, value in slot_values.items():
|
|
1242
|
+
if key in SLOTS_EXCLUDED_FOR_AGENT:
|
|
1243
|
+
continue
|
|
1244
|
+
slot_definition = _get_slot_definition(key)
|
|
1245
|
+
if slot_definition:
|
|
1246
|
+
filtered_slots.append(
|
|
1247
|
+
AgentInputSlot(
|
|
1248
|
+
name=key,
|
|
1249
|
+
value=value,
|
|
1250
|
+
type=slot_definition.type_name if slot_definition else "any",
|
|
1251
|
+
allowed_values=slot_definition.values
|
|
1252
|
+
if isinstance(slot_definition, CategoricalSlot)
|
|
1253
|
+
else None,
|
|
1254
|
+
)
|
|
1255
|
+
)
|
|
1256
|
+
|
|
1257
|
+
return filtered_slots
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
def _update_agent_events(events: List[Event], metadata: Dict[str, Any]) -> None:
|
|
1261
|
+
"""Update the agent events based on the agent output metadata if needed."""
|
|
1262
|
+
if A2A_AGENT_CONTEXT_ID_KEY in metadata:
|
|
1263
|
+
# If the context ID is present, we need to store it in the AgentStarted
|
|
1264
|
+
# event, so that it can be re-used later in case the agent is restarted.
|
|
1265
|
+
for event in events:
|
|
1266
|
+
if isinstance(event, AgentStarted):
|
|
1267
|
+
event.context_id = metadata[A2A_AGENT_CONTEXT_ID_KEY]
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
def _update_agent_input_metadata_with_events(
|
|
1271
|
+
metadata: Dict[str, Any], agent_id: str, flow_id: str, tracker: DialogueStateTracker
|
|
1272
|
+
) -> None:
|
|
1273
|
+
"""Update the agent input metadata with the events."""
|
|
1274
|
+
agent_started_events = [
|
|
1275
|
+
event
|
|
1276
|
+
for event in tracker.events
|
|
1277
|
+
if type(event) == AgentStarted
|
|
1278
|
+
and event.agent_id == agent_id
|
|
1279
|
+
and event.flow_id == flow_id
|
|
1280
|
+
]
|
|
1281
|
+
if agent_started_events:
|
|
1282
|
+
# If we have context ID from the previous agent run, we want to
|
|
1283
|
+
# include it in the metadata so that the agent can continue the same
|
|
1284
|
+
# context.
|
|
1285
|
+
agent_started_event = agent_started_events[-1]
|
|
1286
|
+
if agent_started_event.context_id:
|
|
1287
|
+
metadata[A2A_AGENT_CONTEXT_ID_KEY] = agent_started_event.context_id
|