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
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import operator
|
|
3
|
+
from functools import reduce
|
|
4
|
+
from typing import Any, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
from mcp.types import CallToolResult
|
|
8
|
+
|
|
9
|
+
from rasa.core.available_endpoints import AvailableEndpoints
|
|
10
|
+
from rasa.core.policies.flows.flow_step_result import (
|
|
11
|
+
ContinueFlowWithNextStep,
|
|
12
|
+
FlowStepResult,
|
|
13
|
+
)
|
|
14
|
+
from rasa.dialogue_understanding.patterns.internal_error import (
|
|
15
|
+
InternalErrorPatternFlowStackFrame,
|
|
16
|
+
)
|
|
17
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
18
|
+
from rasa.shared.core.events import Event, SlotSet
|
|
19
|
+
from rasa.shared.core.flows.steps import CallFlowStep
|
|
20
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
21
|
+
from rasa.shared.utils.mcp.server_connection import MCPServerConnection
|
|
22
|
+
from rasa.utils.common import ensure_jsonified_iterable
|
|
23
|
+
|
|
24
|
+
structlogger = structlog.get_logger()
|
|
25
|
+
|
|
26
|
+
CONFIG_RESULT_KEY = "result_key"
|
|
27
|
+
CONFIG_SLOT = "slot"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def call_mcp_tool(
|
|
31
|
+
initial_events: List[Event],
|
|
32
|
+
stack: DialogueStack,
|
|
33
|
+
step: CallFlowStep,
|
|
34
|
+
tracker: DialogueStateTracker,
|
|
35
|
+
) -> FlowStepResult:
|
|
36
|
+
"""Run an MCP tool call step."""
|
|
37
|
+
structlogger.debug(
|
|
38
|
+
"flow.step.call_mcp_tool",
|
|
39
|
+
tool_id=step.call,
|
|
40
|
+
mcp_server=step.mcp_server,
|
|
41
|
+
mapping=step.mapping,
|
|
42
|
+
step_id=step.id,
|
|
43
|
+
flow_id=step.flow_id,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
return await _execute_mcp_tool_call(initial_events, stack, step, tracker)
|
|
48
|
+
except Exception as e:
|
|
49
|
+
return _handle_mcp_tool_error(
|
|
50
|
+
stack,
|
|
51
|
+
initial_events,
|
|
52
|
+
error_message=f"Failed to execute MCP tool call: {e}.",
|
|
53
|
+
tool_name=step.call,
|
|
54
|
+
mcp_server=step.mcp_server,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
async def _execute_mcp_tool_call(
|
|
59
|
+
initial_events: List[Event],
|
|
60
|
+
stack: DialogueStack,
|
|
61
|
+
step: CallFlowStep,
|
|
62
|
+
tracker: DialogueStateTracker,
|
|
63
|
+
) -> FlowStepResult:
|
|
64
|
+
"""Execute the MCP tool call with proper error handling."""
|
|
65
|
+
mcp_server_connection = None
|
|
66
|
+
try:
|
|
67
|
+
# Connect to the MCP server
|
|
68
|
+
mcp_server_connection = await _connect_to_mcp_server(step.mcp_server)
|
|
69
|
+
|
|
70
|
+
if not mcp_server_connection:
|
|
71
|
+
return _handle_mcp_tool_error(
|
|
72
|
+
stack,
|
|
73
|
+
initial_events,
|
|
74
|
+
f"Cannot connect to MCP server '{step.mcp_server}'.",
|
|
75
|
+
tool_name=step.call,
|
|
76
|
+
mcp_server=step.mcp_server,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Validate tool availability
|
|
80
|
+
if not await _is_tool_available(mcp_server_connection, step.call):
|
|
81
|
+
return _handle_mcp_tool_error(
|
|
82
|
+
stack,
|
|
83
|
+
initial_events,
|
|
84
|
+
f"Tool '{step.call}' is not available on MCP server "
|
|
85
|
+
f"'{step.mcp_server}'.",
|
|
86
|
+
tool_name=step.call,
|
|
87
|
+
mcp_server=step.mcp_server,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# This should not happen, but we need to check for type checking to pass
|
|
91
|
+
if not step.mapping:
|
|
92
|
+
return _handle_mcp_tool_error(
|
|
93
|
+
stack,
|
|
94
|
+
initial_events,
|
|
95
|
+
f"No mapping found for tool '{step.call}'.",
|
|
96
|
+
tool_name=step.call,
|
|
97
|
+
mcp_server=step.mcp_server,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Prepare arguments for the tool call
|
|
101
|
+
arguments = _prepare_tool_arguments(step.mapping["input"], tracker)
|
|
102
|
+
|
|
103
|
+
# Call the tool with parameters
|
|
104
|
+
mcp_server = await mcp_server_connection.ensure_active_session()
|
|
105
|
+
result = await mcp_server.call_tool(step.call, arguments)
|
|
106
|
+
|
|
107
|
+
# Handle tool execution result
|
|
108
|
+
if result is None or result.isError:
|
|
109
|
+
return _handle_mcp_tool_error(
|
|
110
|
+
stack,
|
|
111
|
+
initial_events,
|
|
112
|
+
f"Tool '{step.call}' execution failed: {result.content}.",
|
|
113
|
+
tool_name=step.call,
|
|
114
|
+
mcp_server=step.mcp_server,
|
|
115
|
+
)
|
|
116
|
+
elif not result.content:
|
|
117
|
+
structlogger.warning(
|
|
118
|
+
"call_mcp_tool.empty_tool_result",
|
|
119
|
+
tool_name=step.call,
|
|
120
|
+
mcp_server=step.mcp_server,
|
|
121
|
+
)
|
|
122
|
+
else:
|
|
123
|
+
structlogger.debug(
|
|
124
|
+
"call_mcp_tool.tool_execution_success",
|
|
125
|
+
tool_name=step.call,
|
|
126
|
+
mcp_server=step.mcp_server,
|
|
127
|
+
result_content=result.content,
|
|
128
|
+
result_structured_content=result.structuredContent,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# Process successful result
|
|
132
|
+
if set_slot_event := _process_tool_result(result, step.mapping["output"]):
|
|
133
|
+
initial_events.extend(set_slot_event)
|
|
134
|
+
else:
|
|
135
|
+
return _handle_mcp_tool_error(
|
|
136
|
+
stack,
|
|
137
|
+
initial_events,
|
|
138
|
+
f"Failed to process tool result for '{step.call}'.",
|
|
139
|
+
tool_name=step.call,
|
|
140
|
+
mcp_server=step.mcp_server,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
return ContinueFlowWithNextStep(events=initial_events)
|
|
144
|
+
|
|
145
|
+
finally:
|
|
146
|
+
# Always clean up the connection to prevent resource leaks
|
|
147
|
+
if mcp_server_connection:
|
|
148
|
+
try:
|
|
149
|
+
await mcp_server_connection.close()
|
|
150
|
+
except Exception as e:
|
|
151
|
+
structlogger.warning(
|
|
152
|
+
"call_mcp_tool.connection_cleanup_failed",
|
|
153
|
+
tool_name=step.call,
|
|
154
|
+
mcp_server=step.mcp_server,
|
|
155
|
+
error=str(e),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
async def _is_tool_available(
|
|
160
|
+
mcp_server_connection: MCPServerConnection, tool_name: str
|
|
161
|
+
) -> bool:
|
|
162
|
+
"""Check if the specified tool is available on the MCP server."""
|
|
163
|
+
try:
|
|
164
|
+
# Get the active session from the connection
|
|
165
|
+
mcp_server = await mcp_server_connection.ensure_active_session()
|
|
166
|
+
available_tools = await mcp_server.list_tools()
|
|
167
|
+
tool_names = [tool.name for tool in available_tools.tools]
|
|
168
|
+
return tool_name in tool_names
|
|
169
|
+
except Exception as e:
|
|
170
|
+
structlogger.warning(
|
|
171
|
+
"call_mcp_tool.tool_availability_check_failed",
|
|
172
|
+
tool_name=tool_name,
|
|
173
|
+
error=str(e),
|
|
174
|
+
)
|
|
175
|
+
return False
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
async def _connect_to_mcp_server(
|
|
179
|
+
mcp_server_name: Optional[str],
|
|
180
|
+
) -> Optional[MCPServerConnection]:
|
|
181
|
+
"""Connect to the MCP server."""
|
|
182
|
+
if not mcp_server_name:
|
|
183
|
+
return None
|
|
184
|
+
|
|
185
|
+
# get the MCP server config from the available endpoints
|
|
186
|
+
endpoints = AvailableEndpoints.get_instance()
|
|
187
|
+
mcp_servers = endpoints.mcp_servers
|
|
188
|
+
if not mcp_servers:
|
|
189
|
+
return None
|
|
190
|
+
|
|
191
|
+
mcp_server_configs = [
|
|
192
|
+
mcp_server for mcp_server in mcp_servers if mcp_server.name == mcp_server_name
|
|
193
|
+
]
|
|
194
|
+
if not mcp_server_configs or len(mcp_server_configs) != 1:
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
mcp_server_config = mcp_server_configs[0]
|
|
198
|
+
mcp_server_connection = MCPServerConnection(
|
|
199
|
+
mcp_server_config.name, mcp_server_config.url, mcp_server_config.type
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Ensure the connection is established and return the connection object
|
|
203
|
+
await mcp_server_connection.ensure_active_session()
|
|
204
|
+
return mcp_server_connection
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _prepare_tool_arguments(
|
|
208
|
+
input_mapping: List[Dict[str, str]], tracker: DialogueStateTracker
|
|
209
|
+
) -> Dict[str, Any]:
|
|
210
|
+
"""Prepare arguments for the tool call from slot values."""
|
|
211
|
+
arguments = {}
|
|
212
|
+
for argument in input_mapping:
|
|
213
|
+
slot_value = tracker.get_slot(argument["slot"])
|
|
214
|
+
arguments[argument["param"]] = slot_value
|
|
215
|
+
return arguments
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _jsonify_slot_value(value: Any) -> str | int | float | bool | None:
|
|
219
|
+
"""Prepare value for SlotSet: iterables -> JSON string, primitives -> as-is"""
|
|
220
|
+
if isinstance(value, (list, dict)) and len(value):
|
|
221
|
+
return json.dumps(ensure_jsonified_iterable(value))
|
|
222
|
+
return value
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _process_tool_result(
|
|
226
|
+
result: CallToolResult,
|
|
227
|
+
output_mapping: List[Dict[str, str]],
|
|
228
|
+
) -> Optional[List[SlotSet]]:
|
|
229
|
+
"""Create a SetSlot event for the tool result."""
|
|
230
|
+
try:
|
|
231
|
+
_result_as_dict = {"result": result.model_dump()}
|
|
232
|
+
slots = []
|
|
233
|
+
for mapping in output_mapping:
|
|
234
|
+
try:
|
|
235
|
+
# Use reduce to navigate through nested keys in the result
|
|
236
|
+
slot_value = reduce(
|
|
237
|
+
operator.getitem,
|
|
238
|
+
mapping[CONFIG_RESULT_KEY].split("."),
|
|
239
|
+
_result_as_dict,
|
|
240
|
+
)
|
|
241
|
+
slots.append(
|
|
242
|
+
SlotSet(mapping[CONFIG_SLOT], _jsonify_slot_value(slot_value))
|
|
243
|
+
)
|
|
244
|
+
except (KeyError, TypeError):
|
|
245
|
+
structlogger.error(
|
|
246
|
+
"call_mcp_tool.result_key_not_found_in_tool_result",
|
|
247
|
+
slot=mapping[CONFIG_SLOT],
|
|
248
|
+
result_key=mapping[CONFIG_RESULT_KEY],
|
|
249
|
+
result=_result_as_dict,
|
|
250
|
+
)
|
|
251
|
+
return None
|
|
252
|
+
return slots
|
|
253
|
+
except Exception as e:
|
|
254
|
+
structlogger.error(
|
|
255
|
+
"call_mcp_tool.result_processing_failed",
|
|
256
|
+
error=str(e),
|
|
257
|
+
result=result,
|
|
258
|
+
)
|
|
259
|
+
return None
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _handle_mcp_tool_error(
|
|
263
|
+
stack: DialogueStack,
|
|
264
|
+
events: List[Event],
|
|
265
|
+
error_message: str,
|
|
266
|
+
tool_name: str,
|
|
267
|
+
mcp_server: Optional[str],
|
|
268
|
+
) -> FlowStepResult:
|
|
269
|
+
"""Handle MCP tool errors consistently."""
|
|
270
|
+
structlogger.error(
|
|
271
|
+
"call_mcp_tool.error",
|
|
272
|
+
error_message=error_message,
|
|
273
|
+
tool_name=tool_name,
|
|
274
|
+
mcp_server=mcp_server,
|
|
275
|
+
)
|
|
276
|
+
stack.push(InternalErrorPatternFlowStackFrame())
|
|
277
|
+
return ContinueFlowWithNextStep(events=events)
|
|
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple
|
|
|
5
5
|
|
|
6
6
|
import structlog
|
|
7
7
|
import tiktoken
|
|
8
|
-
from deprecated import deprecated # type: ignore[import]
|
|
8
|
+
from deprecated import deprecated # type: ignore[import-untyped]
|
|
9
9
|
from jinja2 import Template
|
|
10
10
|
from langchain.docstore.document import Document
|
|
11
11
|
from langchain.schema.embeddings import Embeddings
|
|
@@ -624,6 +624,7 @@ class UnexpecTEDIntentPolicy(TEDPolicy):
|
|
|
624
624
|
query_intent = (
|
|
625
625
|
last_user_uttered_event.intent_name
|
|
626
626
|
if last_user_uttered_event is not None
|
|
627
|
+
and isinstance(last_user_uttered_event, UserUttered)
|
|
627
628
|
else ""
|
|
628
629
|
)
|
|
629
630
|
is_unlikely_intent = self._check_unlikely_intent(
|
rasa/core/processor.py
CHANGED
|
@@ -69,6 +69,7 @@ from rasa.shared.constants import (
|
|
|
69
69
|
UTTER_PREFIX,
|
|
70
70
|
)
|
|
71
71
|
from rasa.shared.core.constants import (
|
|
72
|
+
ACTION_AGENT_REQUEST_USER_INPUT_NAME,
|
|
72
73
|
ACTION_CORRECT_FLOW_SLOT,
|
|
73
74
|
ACTION_EXTRACT_SLOTS,
|
|
74
75
|
ACTION_LISTEN_NAME,
|
|
@@ -729,7 +730,7 @@ class MessageProcessor:
|
|
|
729
730
|
if not self.domain or self.domain.is_empty():
|
|
730
731
|
return
|
|
731
732
|
|
|
732
|
-
intent = parse_data[
|
|
733
|
+
intent = parse_data[INTENT][INTENT_NAME_KEY]
|
|
733
734
|
if intent and intent not in self.domain.intents:
|
|
734
735
|
rasa.shared.utils.io.raise_warning(
|
|
735
736
|
f"Parsed an intent '{intent}' "
|
|
@@ -738,7 +739,7 @@ class MessageProcessor:
|
|
|
738
739
|
docs=DOCS_URL_DOMAINS,
|
|
739
740
|
)
|
|
740
741
|
|
|
741
|
-
entities = parse_data[
|
|
742
|
+
entities = parse_data[ENTITIES] or []
|
|
742
743
|
for element in entities:
|
|
743
744
|
entity = element["entity"]
|
|
744
745
|
if entity and entity not in self.domain.entities:
|
|
@@ -822,9 +823,9 @@ class MessageProcessor:
|
|
|
822
823
|
self._update_full_retrieval_intent(parse_data)
|
|
823
824
|
structlogger.debug(
|
|
824
825
|
"processor.message.parse",
|
|
825
|
-
parse_data_text=copy.deepcopy(parse_data[
|
|
826
|
-
parse_data_intent=parse_data[
|
|
827
|
-
parse_data_entities=copy.deepcopy(parse_data[
|
|
826
|
+
parse_data_text=copy.deepcopy(parse_data[TEXT]),
|
|
827
|
+
parse_data_intent=parse_data[INTENT],
|
|
828
|
+
parse_data_entities=copy.deepcopy(parse_data[ENTITIES]),
|
|
828
829
|
)
|
|
829
830
|
|
|
830
831
|
self._check_for_unseen_features(parse_data)
|
|
@@ -973,7 +974,7 @@ class MessageProcessor:
|
|
|
973
974
|
f"invalid intent: {parse_data[INTENT]['name']}. "
|
|
974
975
|
f"Returning CannotHandleCommand() as a fallback."
|
|
975
976
|
),
|
|
976
|
-
invalid_intent=parse_data[INTENT][
|
|
977
|
+
invalid_intent=parse_data[INTENT][INTENT_NAME_KEY],
|
|
977
978
|
)
|
|
978
979
|
commands.append(
|
|
979
980
|
CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_INVALID_INTENT)
|
|
@@ -983,7 +984,7 @@ class MessageProcessor:
|
|
|
983
984
|
|
|
984
985
|
def _contains_undefined_intent(self, message: Message) -> bool:
|
|
985
986
|
"""Checks if the message contains an undefined intent."""
|
|
986
|
-
intent_name = message.get(INTENT, {}).get(
|
|
987
|
+
intent_name = message.get(INTENT, {}).get(INTENT_NAME_KEY)
|
|
987
988
|
return intent_name is not None and intent_name not in self.domain.intents
|
|
988
989
|
|
|
989
990
|
async def _parse_message_with_graph(
|
|
@@ -1033,8 +1034,8 @@ class MessageProcessor:
|
|
|
1033
1034
|
tracker.update(
|
|
1034
1035
|
UserUttered(
|
|
1035
1036
|
message.text,
|
|
1036
|
-
parse_data[
|
|
1037
|
-
parse_data[
|
|
1037
|
+
parse_data[INTENT],
|
|
1038
|
+
parse_data[ENTITIES],
|
|
1038
1039
|
parse_data,
|
|
1039
1040
|
input_channel=message.input_channel,
|
|
1040
1041
|
message_id=message.message_id,
|
|
@@ -1043,7 +1044,7 @@ class MessageProcessor:
|
|
|
1043
1044
|
self.domain,
|
|
1044
1045
|
)
|
|
1045
1046
|
|
|
1046
|
-
if parse_data[
|
|
1047
|
+
if parse_data[ENTITIES]:
|
|
1047
1048
|
self._log_slots(tracker)
|
|
1048
1049
|
|
|
1049
1050
|
plugin_manager().hook.after_new_user_message(tracker=tracker)
|
|
@@ -1194,7 +1195,11 @@ class MessageProcessor:
|
|
|
1194
1195
|
`False` if `action_name` is `ACTION_LISTEN_NAME` or
|
|
1195
1196
|
`ACTION_SESSION_START_NAME`, otherwise `True`.
|
|
1196
1197
|
"""
|
|
1197
|
-
return action_name not in (
|
|
1198
|
+
return action_name not in (
|
|
1199
|
+
ACTION_LISTEN_NAME,
|
|
1200
|
+
ACTION_SESSION_START_NAME,
|
|
1201
|
+
ACTION_AGENT_REQUEST_USER_INPUT_NAME,
|
|
1202
|
+
)
|
|
1198
1203
|
|
|
1199
1204
|
async def execute_side_effects(
|
|
1200
1205
|
self,
|
|
@@ -1467,11 +1472,9 @@ class MessageProcessor:
|
|
|
1467
1472
|
# tracker has never expired if sessions are disabled
|
|
1468
1473
|
return False
|
|
1469
1474
|
|
|
1470
|
-
user_uttered_event
|
|
1471
|
-
UserUttered
|
|
1472
|
-
)
|
|
1475
|
+
user_uttered_event = tracker.get_last_event_for(UserUttered)
|
|
1473
1476
|
|
|
1474
|
-
if not user_uttered_event:
|
|
1477
|
+
if not user_uttered_event or not isinstance(user_uttered_event, UserUttered):
|
|
1475
1478
|
# there is no user event so far so the session should not be considered
|
|
1476
1479
|
# expired
|
|
1477
1480
|
return False
|
rasa/core/run.py
CHANGED
|
@@ -30,6 +30,7 @@ from rasa import server, telemetry
|
|
|
30
30
|
from rasa.constants import ENV_SANIC_BACKLOG
|
|
31
31
|
from rasa.core import agent, channels, constants
|
|
32
32
|
from rasa.core.agent import Agent
|
|
33
|
+
from rasa.core.available_agents import AvailableAgents
|
|
33
34
|
from rasa.core.available_endpoints import AvailableEndpoints
|
|
34
35
|
from rasa.core.channels import console
|
|
35
36
|
from rasa.core.channels.channel import InputChannel
|
|
@@ -42,20 +43,10 @@ from rasa.utils import licensing
|
|
|
42
43
|
logger = logging.getLogger() # get the root logger
|
|
43
44
|
|
|
44
45
|
|
|
45
|
-
def
|
|
46
|
+
def create_http_input_channels(
|
|
46
47
|
channel: Optional[Text], credentials_file: Optional[Text]
|
|
47
48
|
) -> List[InputChannel]:
|
|
48
|
-
"""Instantiate the chosen input channel.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
channel (optional): The name of the specific input channel to create.
|
|
52
|
-
credentials_file: Path to the credentials file containing channel credentials.
|
|
53
|
-
|
|
54
|
-
Returns:
|
|
55
|
-
A list of instantiated input channels. If a specific channel is provided,
|
|
56
|
-
it returns a list with that single channel. If no channel is specified,
|
|
57
|
-
it returns a list of all channels defined in the credentials file.
|
|
58
|
-
"""
|
|
49
|
+
"""Instantiate the chosen input channel."""
|
|
59
50
|
if credentials_file:
|
|
60
51
|
all_credentials = read_config_file(credentials_file)
|
|
61
52
|
else:
|
|
@@ -151,6 +142,7 @@ def configure_app(
|
|
|
151
142
|
route: Optional[Text] = "/webhooks/",
|
|
152
143
|
port: int = constants.DEFAULT_SERVER_PORT,
|
|
153
144
|
endpoints: Optional[AvailableEndpoints] = None,
|
|
145
|
+
sub_agents: Optional[AvailableAgents] = None,
|
|
154
146
|
log_file: Optional[Text] = None,
|
|
155
147
|
conversation_id: Optional[Text] = uuid.uuid4().hex,
|
|
156
148
|
use_syslog: bool = False,
|
|
@@ -179,6 +171,7 @@ def configure_app(
|
|
|
179
171
|
jwt_private_key=jwt_private_key,
|
|
180
172
|
jwt_method=jwt_method,
|
|
181
173
|
endpoints=endpoints,
|
|
174
|
+
sub_agents=sub_agents,
|
|
182
175
|
is_inspector_enabled=is_inspector_enabled,
|
|
183
176
|
)
|
|
184
177
|
)
|
|
@@ -243,6 +236,7 @@ def serve_application(
|
|
|
243
236
|
jwt_private_key: Optional[Text] = None,
|
|
244
237
|
jwt_method: Optional[Text] = None,
|
|
245
238
|
endpoints: Optional[AvailableEndpoints] = None,
|
|
239
|
+
sub_agents: Optional[AvailableAgents] = None,
|
|
246
240
|
remote_storage: Optional[StorageType] = None,
|
|
247
241
|
log_file: Optional[Text] = None,
|
|
248
242
|
ssl_certificate: Optional[Text] = None,
|
|
@@ -263,7 +257,7 @@ def serve_application(
|
|
|
263
257
|
if not channel and not credentials:
|
|
264
258
|
channel = "cmdline"
|
|
265
259
|
|
|
266
|
-
input_channels =
|
|
260
|
+
input_channels = create_http_input_channels(channel, credentials)
|
|
267
261
|
|
|
268
262
|
if inspect:
|
|
269
263
|
logger.info("Starting development inspector.")
|
|
@@ -283,6 +277,7 @@ def serve_application(
|
|
|
283
277
|
jwt_method,
|
|
284
278
|
port=port,
|
|
285
279
|
endpoints=endpoints,
|
|
280
|
+
sub_agents=sub_agents,
|
|
286
281
|
log_file=log_file,
|
|
287
282
|
conversation_id=conversation_id,
|
|
288
283
|
use_syslog=use_syslog,
|
|
@@ -302,7 +297,7 @@ def serve_application(
|
|
|
302
297
|
logger.info(f"Starting Rasa server on {protocol}://{interface}:{port}")
|
|
303
298
|
|
|
304
299
|
app.register_listener(
|
|
305
|
-
partial(load_agent_on_start, model_path, endpoints, remote_storage),
|
|
300
|
+
partial(load_agent_on_start, model_path, endpoints, remote_storage, sub_agents),
|
|
306
301
|
"before_server_start",
|
|
307
302
|
)
|
|
308
303
|
|
|
@@ -340,6 +335,7 @@ async def load_agent_on_start(
|
|
|
340
335
|
model_path: Text,
|
|
341
336
|
endpoints: AvailableEndpoints,
|
|
342
337
|
remote_storage: Optional[StorageType],
|
|
338
|
+
sub_agents: Optional[AvailableAgents],
|
|
343
339
|
app: Sanic,
|
|
344
340
|
loop: AbstractEventLoop,
|
|
345
341
|
) -> Agent:
|
|
@@ -352,6 +348,7 @@ async def load_agent_on_start(
|
|
|
352
348
|
model_path=model_path,
|
|
353
349
|
remote_storage=remote_storage,
|
|
354
350
|
endpoints=endpoints,
|
|
351
|
+
sub_agents=sub_agents,
|
|
355
352
|
loop=loop,
|
|
356
353
|
)
|
|
357
354
|
|
|
@@ -542,7 +542,7 @@ class FailSafeTrackerStore(TrackerStore):
|
|
|
542
542
|
return self._tracker_store.domain
|
|
543
543
|
|
|
544
544
|
@domain.setter
|
|
545
|
-
def domain(self, domain: Domain) -> None:
|
|
545
|
+
def domain(self, domain: Optional[Domain]) -> None:
|
|
546
546
|
self._tracker_store.domain = domain
|
|
547
547
|
|
|
548
548
|
if self._fallback_tracker_store:
|
|
@@ -805,9 +805,7 @@ class AwaitableTrackerStore(TrackerStore):
|
|
|
805
805
|
async def retrieve(self, sender_id: Text) -> Optional[DialogueStateTracker]:
|
|
806
806
|
"""Wrapper to call `retrieve` method of primary tracker store."""
|
|
807
807
|
result = self._tracker_store.retrieve(sender_id)
|
|
808
|
-
return (
|
|
809
|
-
await result if isawaitable(result) else result # type: ignore[return-value, misc]
|
|
810
|
-
)
|
|
808
|
+
return await result if isawaitable(result) else result
|
|
811
809
|
|
|
812
810
|
async def keys(self) -> Iterable[Text]:
|
|
813
811
|
"""Wrapper to call `keys` method of primary tracker store."""
|
|
@@ -834,6 +832,4 @@ class AwaitableTrackerStore(TrackerStore):
|
|
|
834
832
|
) -> Optional[DialogueStateTracker]:
|
|
835
833
|
"""Wrapper to call `retrieve_full_tracker` method of primary tracker store."""
|
|
836
834
|
result = self._tracker_store.retrieve_full_tracker(conversation_id)
|
|
837
|
-
return (
|
|
838
|
-
await result if isawaitable(result) else result # type: ignore[return-value, misc]
|
|
839
|
-
)
|
|
835
|
+
return await result if isawaitable(result) else result
|
rasa/core/train.py
CHANGED
|
@@ -46,7 +46,7 @@ async def train_comparison_models(
|
|
|
46
46
|
output=str(Path(output_path, f"run_{r +1}")),
|
|
47
47
|
fixed_model_name=config_name + PERCENTAGE_KEY + str(percentage),
|
|
48
48
|
additional_arguments={
|
|
49
|
-
**additional_arguments,
|
|
49
|
+
**(additional_arguments or {}),
|
|
50
50
|
"exclusion_percentage": percentage,
|
|
51
51
|
},
|
|
52
52
|
)
|
|
@@ -91,7 +91,7 @@ from rasa.shared.core.training_data.visualization import (
|
|
|
91
91
|
)
|
|
92
92
|
from rasa.shared.exceptions import InvalidConfigException
|
|
93
93
|
from rasa.shared.importers.rasa import TrainingDataImporter
|
|
94
|
-
from rasa.shared.nlu.constants import INTENT_NAME_KEY, TEXT
|
|
94
|
+
from rasa.shared.nlu.constants import ENTITIES, INTENT, INTENT_NAME_KEY, TEXT
|
|
95
95
|
|
|
96
96
|
# noinspection PyProtectedMember
|
|
97
97
|
from rasa.shared.nlu.training_data import loading
|
|
@@ -789,7 +789,7 @@ def _collect_messages(events: List[Dict[Text, Any]]) -> List[Message]:
|
|
|
789
789
|
data = event.get("parse_data", {})
|
|
790
790
|
rasa_nlu_training_data_utils.remove_untrainable_entities_from(data)
|
|
791
791
|
msg = Message.build(
|
|
792
|
-
data[
|
|
792
|
+
data[TEXT], data[INTENT][INTENT_NAME_KEY], data[ENTITIES]
|
|
793
793
|
)
|
|
794
794
|
messages.append(msg)
|
|
795
795
|
elif event.get("event") == UserUtteranceReverted.type_name and messages:
|
|
@@ -901,13 +901,13 @@ def _get_nlu_target_format(export_path: Text) -> Text:
|
|
|
901
901
|
|
|
902
902
|
def _entities_from_messages(messages: List[Message]) -> List[Text]:
|
|
903
903
|
"""Return all entities that occur in at least one of the messages."""
|
|
904
|
-
return list({e["entity"] for m in messages for e in m.data.get(
|
|
904
|
+
return list({e["entity"] for m in messages for e in m.data.get(ENTITIES, [])})
|
|
905
905
|
|
|
906
906
|
|
|
907
907
|
def _intents_from_messages(messages: List[Message]) -> Set[Text]:
|
|
908
908
|
"""Return all intents that occur in at least one of the messages."""
|
|
909
909
|
# set of distinct intents
|
|
910
|
-
distinct_intents = {m.data[
|
|
910
|
+
distinct_intents = {m.data[INTENT] for m in messages if INTENT in m.data}
|
|
911
911
|
|
|
912
912
|
return distinct_intents
|
|
913
913
|
|
|
@@ -1191,11 +1191,11 @@ def _as_md_message(parse_data: Dict[Text, Any]) -> Text:
|
|
|
1191
1191
|
"""Display the parse data of a message in markdown format."""
|
|
1192
1192
|
from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter
|
|
1193
1193
|
|
|
1194
|
-
if parse_data.get(
|
|
1195
|
-
return parse_data[
|
|
1194
|
+
if parse_data.get(TEXT, "").startswith(INTENT_MESSAGE_PREFIX):
|
|
1195
|
+
return parse_data[TEXT]
|
|
1196
1196
|
|
|
1197
|
-
if not parse_data.get(
|
|
1198
|
-
parse_data[
|
|
1197
|
+
if not parse_data.get(ENTITIES):
|
|
1198
|
+
parse_data[ENTITIES] = []
|
|
1199
1199
|
|
|
1200
1200
|
return TrainingDataWriter.generate_message(parse_data)
|
|
1201
1201
|
|
|
@@ -1207,7 +1207,7 @@ def _validate_user_regex(latest_message: Dict[Text, Any], intents: List[Text]) -
|
|
|
1207
1207
|
`/greet`. Return `True` if the intent is a known one.
|
|
1208
1208
|
"""
|
|
1209
1209
|
parse_data = latest_message.get("parse_data", {})
|
|
1210
|
-
intent = parse_data.get(
|
|
1210
|
+
intent = parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
|
|
1211
1211
|
|
|
1212
1212
|
if intent in intents:
|
|
1213
1213
|
return True
|
|
@@ -1224,8 +1224,8 @@ async def _validate_user_text(
|
|
|
1224
1224
|
"""
|
|
1225
1225
|
parse_data = latest_message.get("parse_data", {})
|
|
1226
1226
|
text = _as_md_message(parse_data)
|
|
1227
|
-
intent = parse_data.get(
|
|
1228
|
-
entities = parse_data.get(
|
|
1227
|
+
intent = parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
|
|
1228
|
+
entities = parse_data.get(ENTITIES, [])
|
|
1229
1229
|
if entities:
|
|
1230
1230
|
message = (
|
|
1231
1231
|
f"Is the intent '{intent}' correct for '{text}' and are "
|
|
@@ -1276,9 +1276,9 @@ async def _validate_nlu(
|
|
|
1276
1276
|
|
|
1277
1277
|
entities = await _correct_entities(latest_message, endpoint, conversation_id)
|
|
1278
1278
|
corrected_nlu = {
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1279
|
+
INTENT: corrected_intent,
|
|
1280
|
+
ENTITIES: entities,
|
|
1281
|
+
TEXT: latest_message.get("text"),
|
|
1282
1282
|
}
|
|
1283
1283
|
|
|
1284
1284
|
await _correct_wrong_nlu(corrected_nlu, events, endpoint, conversation_id)
|
|
@@ -1315,9 +1315,9 @@ def _merge_annotated_and_original_entities(
|
|
|
1315
1315
|
# overwrite entities which have already been
|
|
1316
1316
|
# annotated in the original annotation to preserve
|
|
1317
1317
|
# additional entity parser information
|
|
1318
|
-
entities = parse_annotated.get(
|
|
1318
|
+
entities = parse_annotated.get(ENTITIES, [])[:]
|
|
1319
1319
|
for i, entity in enumerate(entities):
|
|
1320
|
-
for original_entity in parse_original.get(
|
|
1320
|
+
for original_entity in parse_original.get(ENTITIES, []):
|
|
1321
1321
|
if _is_same_entity_annotation(entity, original_entity):
|
|
1322
1322
|
entities[i] = original_entity
|
|
1323
1323
|
break
|
|
@@ -14,7 +14,7 @@ from rasa.shared.core.constants import (
|
|
|
14
14
|
from rasa.shared.core.domain import Domain, State
|
|
15
15
|
from rasa.shared.core.events import ActionExecuted, Event
|
|
16
16
|
from rasa.shared.core.generator import TrackerWithCachedStates
|
|
17
|
-
from rasa.shared.nlu.constants import TEXT
|
|
17
|
+
from rasa.shared.nlu.constants import INTENT, TEXT
|
|
18
18
|
from rasa.shared.nlu.training_data.message import Message
|
|
19
19
|
|
|
20
20
|
logger = logging.getLogger(__name__)
|
|
@@ -362,12 +362,12 @@ def _get_previous_event(
|
|
|
362
362
|
previous_event_type = "bot utterance"
|
|
363
363
|
previous_event_name = state[PREVIOUS_ACTION]["action_text"]
|
|
364
364
|
elif USER in state.keys():
|
|
365
|
-
if
|
|
365
|
+
if INTENT in state[USER]:
|
|
366
366
|
previous_event_type = "intent"
|
|
367
|
-
previous_event_name = state[USER][
|
|
368
|
-
elif
|
|
367
|
+
previous_event_name = state[USER][INTENT]
|
|
368
|
+
elif TEXT in state[USER]:
|
|
369
369
|
previous_event_type = "user utterance"
|
|
370
|
-
previous_event_name = state[USER][
|
|
370
|
+
previous_event_name = state[USER][TEXT]
|
|
371
371
|
|
|
372
372
|
if not isinstance(previous_event_name, (str, type(None))):
|
|
373
373
|
# While the Substate type doesn't restrict the value of `action_text` /
|
rasa/core/utils.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
+
import re
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
from socket import SOCK_DGRAM, SOCK_STREAM
|
|
5
|
-
from typing import TYPE_CHECKING, Any, Dict, Optional, Set, Text, Tuple, Union
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Text, Tuple, Union
|
|
6
7
|
|
|
7
8
|
import numpy as np
|
|
8
9
|
import structlog
|
|
@@ -359,3 +360,22 @@ def should_force_slot_filling(
|
|
|
359
360
|
return True, slot_name
|
|
360
361
|
|
|
361
362
|
return False, None
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def get_slot_names_from_exit_conditions(exit_conditions: List[str]) -> List[str]:
|
|
366
|
+
"""Extract slot names from exit conditions.
|
|
367
|
+
|
|
368
|
+
Args:
|
|
369
|
+
exit_conditions: The exit conditions to extract slot names from.
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
A list of slot names.
|
|
373
|
+
"""
|
|
374
|
+
# Find all unique names matching "slots.<name>"
|
|
375
|
+
return list(
|
|
376
|
+
{
|
|
377
|
+
name
|
|
378
|
+
for condition in exit_conditions
|
|
379
|
+
for name in re.findall(r"\bslots\.(\w+)", condition)
|
|
380
|
+
}
|
|
381
|
+
)
|