rasa-pro 3.14.0.dev20250901__py3-none-any.whl → 3.14.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +211 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +879 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +206 -0
- rasa/agents/validation.py +485 -0
- rasa/api.py +24 -9
- rasa/builder/config.py +7 -2
- rasa/builder/copilot/constants.py +3 -0
- rasa/builder/copilot/copilot.py +128 -54
- rasa/builder/copilot/models.py +39 -3
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +183 -188
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/telemetry.py +46 -20
- rasa/builder/document_retrieval/models.py +3 -3
- rasa/builder/download.py +1 -8
- rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
- rasa/builder/guardrails/constants.py +3 -0
- rasa/builder/guardrails/models.py +45 -10
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/utils.py +42 -276
- rasa/builder/jobs.py +33 -21
- rasa/builder/llm_service.py +32 -5
- rasa/builder/main.py +38 -62
- rasa/builder/models.py +8 -7
- rasa/builder/project_generator.py +149 -148
- rasa/builder/service.py +58 -40
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +84 -20
- rasa/builder/validation_service.py +1 -1
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +10 -8
- rasa/cli/dialogue_understanding_test.py +10 -7
- rasa/cli/e2e_test.py +9 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +8 -4
- rasa/cli/interactive.py +5 -4
- rasa/cli/llm_fine_tuning.py +11 -6
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +6 -4
- rasa/cli/project_templates/basic/data/data.md +5 -6
- rasa/cli/project_templates/basic/domain/domain.md +7 -5
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +1 -1
- rasa/cli/project_templates/basic/endpoints.yml +5 -1
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -46
- rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/{transfers/action_process_immediate_payment.py → cards/check_that_card_exists.py} +6 -3
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
- rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
- rasa/cli/project_templates/finance/config.yml +8 -0
- rasa/cli/project_templates/finance/credentials.yml +7 -6
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +3 -4
- rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
- rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
- rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +37 -58
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +1 -1
- rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
- rasa/cli/project_templates/finance/data/general/help.yml +2 -2
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +2 -2
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
- rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
- rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
- rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +29 -62
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +9 -5
- rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
- rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
- rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +33 -90
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
- rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -2
- rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -3
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +6 -6
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +10 -9
- rasa/cli/project_templates/finance/domain/general/welcome.yml +33 -2
- rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
- rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
- rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +203 -61
- rasa/cli/project_templates/finance/endpoints.yml +8 -4
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
- rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/config.yml +6 -4
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +1 -1
- rasa/cli/project_templates/telco/docs/docs.md +3 -0
- rasa/cli/project_templates/telco/domain/domain.md +13 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +3 -6
- rasa/cli/project_templates/telco/endpoints.yml +5 -1
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +1 -1
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +12 -10
- rasa/cli/scaffold.py +4 -4
- rasa/cli/shell.py +9 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +41 -28
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +223 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +51 -10
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +9 -2
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +19 -2
- rasa/core/available_agents.py +229 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +52 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/development_inspector.py +4 -24
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +34 -35
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +9 -1
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +20 -3
- 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 +53 -7
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/studio_chat.py +29 -47
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
- rasa/core/channels/voice_stream/asr/azure.py +6 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
- rasa/core/channels/voice_stream/audiocodes.py +3 -0
- rasa/core/channels/voice_stream/browser_audio.py +55 -3
- rasa/core/channels/voice_stream/genesys.py +3 -2
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +21 -1
- rasa/core/channels/voice_stream/voice_channel.py +64 -0
- rasa/core/concurrent_lock_store.py +66 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
- rasa/core/config/configuration.py +260 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +11 -0
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +226 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +90 -0
- rasa/core/lock_store.py +46 -10
- rasa/core/nlg/generator.py +1 -1
- rasa/core/policies/enterprise_search_policy.py +5 -3
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +632 -0
- rasa/core/policies/flows/flow_executor.py +137 -76
- rasa/core/policies/flows/mcp_tool_executor.py +298 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +100 -44
- rasa/core/redis_connection_factory.py +469 -0
- rasa/core/run.py +37 -8
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
- rasa/dialogue_understanding/commands/utils.py +124 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/storage/local_model_storage.py +41 -4
- rasa/engine/validation.py +19 -6
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/socket_bridge.py +1 -2
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
- rasa/shared/agents/auth/constants.py +12 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +8 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +0 -7
- rasa/shared/core/events.py +329 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +49 -5
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +3 -2
- rasa/shared/core/slots.py +2 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/exceptions.py +16 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +9 -3
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +39 -16
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +247 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +3 -6
- rasa/telemetry.py +69 -5
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/log_utils.py +96 -5
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/pypred.py +38 -0
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +17 -13
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +59 -51
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +452 -428
- rasa/builder/scrape_rasa_docs.py +0 -97
- 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/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_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/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/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
- 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/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/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/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
- 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/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/cli/project_templates/telco/domain/billing/{domain_undertand_bill.yml → understand_bill.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reboot_router.yml → reboot_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reset_router.yml → reset_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_run_speed_test.yml → run_speed_test.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_solve_internet_issue.yml → solve_internet_issue.yml} +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
rasa/builder/models.py
CHANGED
|
@@ -6,7 +6,7 @@ from pathlib import Path
|
|
|
6
6
|
from typing import Any, Dict, List, Literal, Optional
|
|
7
7
|
|
|
8
8
|
import structlog
|
|
9
|
-
from pydantic import BaseModel, Field,
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
10
10
|
|
|
11
11
|
from rasa.cli.scaffold import ProjectTemplateName
|
|
12
12
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
@@ -21,7 +21,8 @@ class PromptRequest(BaseModel):
|
|
|
21
21
|
..., min_length=1, max_length=10000, description="The skill description prompt"
|
|
22
22
|
)
|
|
23
23
|
|
|
24
|
-
@
|
|
24
|
+
@field_validator("prompt")
|
|
25
|
+
@classmethod
|
|
25
26
|
def validate_prompt(cls, v: str) -> str:
|
|
26
27
|
if not v.strip():
|
|
27
28
|
raise ValueError("Prompt cannot be empty or whitespace only")
|
|
@@ -38,7 +39,8 @@ class TemplateRequest(BaseModel):
|
|
|
38
39
|
),
|
|
39
40
|
)
|
|
40
41
|
|
|
41
|
-
@
|
|
42
|
+
@field_validator("template_name")
|
|
43
|
+
@classmethod
|
|
42
44
|
def validate_template_name(cls, v: Any) -> Any:
|
|
43
45
|
if v not in ProjectTemplateName:
|
|
44
46
|
raise ValueError(
|
|
@@ -54,10 +56,8 @@ class BotDataUpdateRequest(BaseModel):
|
|
|
54
56
|
flows_yml: Optional[str] = Field(None, alias="flows.yml")
|
|
55
57
|
config_yml: Optional[str] = Field(None, alias="config.yml")
|
|
56
58
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
allow_population_by_field_name = True
|
|
59
|
+
# Allow using either field names or aliases when creating the model
|
|
60
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
class BotData(BaseModel):
|
|
@@ -206,6 +206,7 @@ class TrainingInput(BaseModel):
|
|
|
206
206
|
|
|
207
207
|
importer: TrainingDataImporter = Field(..., description="Training data importer")
|
|
208
208
|
endpoints_file: Path = Field(..., description="Path to the endpoints file")
|
|
209
|
+
config_file: Path = Field(..., description="Path to the config file")
|
|
209
210
|
|
|
210
211
|
|
|
211
212
|
class AgentStatus(str, Enum):
|
|
@@ -3,30 +3,27 @@
|
|
|
3
3
|
import json
|
|
4
4
|
import os
|
|
5
5
|
import shutil
|
|
6
|
-
import tarfile
|
|
7
|
-
import tempfile
|
|
8
6
|
from pathlib import Path
|
|
9
7
|
from textwrap import dedent
|
|
10
8
|
from typing import Any, Dict, Generator, List, Optional
|
|
11
9
|
|
|
12
|
-
import aiofiles
|
|
13
|
-
import aiohttp
|
|
14
10
|
import structlog
|
|
15
11
|
|
|
16
|
-
import rasa.version
|
|
17
12
|
from rasa.builder import config
|
|
18
13
|
from rasa.builder.exceptions import ProjectGenerationError, ValidationError
|
|
19
14
|
from rasa.builder.llm_service import get_skill_generation_messages, llm_service
|
|
20
15
|
from rasa.builder.logging_utils import capture_exception_with_context
|
|
21
16
|
from rasa.builder.models import BotFiles
|
|
22
17
|
from rasa.builder.project_info import ProjectInfo, ensure_first_used, load_project_info
|
|
18
|
+
from rasa.builder.template_cache import copy_cache_for_template_if_available
|
|
23
19
|
from rasa.builder.training_service import TrainingInput
|
|
24
20
|
from rasa.builder.validation_service import validate_project
|
|
25
21
|
from rasa.cli.scaffold import ProjectTemplateName, create_initial_project
|
|
22
|
+
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
26
23
|
from rasa.shared.core.flows import yaml_flows_io
|
|
27
24
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
28
25
|
from rasa.shared.utils.yaml import dump_obj_as_yaml_to_string
|
|
29
|
-
from rasa.utils.io import subpath
|
|
26
|
+
from rasa.utils.io import InvalidPathException, subpath
|
|
30
27
|
|
|
31
28
|
structlogger = structlog.get_logger()
|
|
32
29
|
|
|
@@ -48,12 +45,25 @@ class ProjectGenerator:
|
|
|
48
45
|
"""Get the project info."""
|
|
49
46
|
return load_project_info(self.project_folder)
|
|
50
47
|
|
|
48
|
+
def is_empty(self) -> bool:
|
|
49
|
+
"""Check if the project folder is empty.
|
|
50
|
+
|
|
51
|
+
Excluding hidden paths.
|
|
52
|
+
"""
|
|
53
|
+
return not any(
|
|
54
|
+
file.is_file()
|
|
55
|
+
for file in self.project_folder.iterdir()
|
|
56
|
+
if not file.name.startswith(".")
|
|
57
|
+
)
|
|
58
|
+
|
|
51
59
|
async def init_from_template(self, template: ProjectTemplateName) -> None:
|
|
52
60
|
"""Create the initial project files."""
|
|
53
61
|
self.cleanup()
|
|
54
62
|
create_initial_project(self.project_folder.as_posix(), template)
|
|
55
|
-
|
|
56
|
-
#
|
|
63
|
+
# If a local cache for this template exists, copy it into the project.
|
|
64
|
+
# We no longer download here to avoid blocking project creation.
|
|
65
|
+
await copy_cache_for_template_if_available(template, self.project_folder)
|
|
66
|
+
# needs to happen after caching, as we download/copy .rasa and that would
|
|
57
67
|
# overwrite the project info file in .rasa
|
|
58
68
|
ensure_first_used(self.project_folder)
|
|
59
69
|
|
|
@@ -182,11 +192,16 @@ class ProjectGenerator:
|
|
|
182
192
|
"""Get the endpoints file."""
|
|
183
193
|
return self.project_folder / "endpoints.yml"
|
|
184
194
|
|
|
195
|
+
def _get_config_file(self) -> Path:
|
|
196
|
+
"""Get the config file."""
|
|
197
|
+
return self.project_folder / "config.yml"
|
|
198
|
+
|
|
185
199
|
def get_training_input(self) -> TrainingInput:
|
|
186
200
|
"""Get the training input."""
|
|
187
201
|
return TrainingInput(
|
|
188
202
|
importer=self._create_importer(),
|
|
189
203
|
endpoints_file=self._get_endpoints_file(),
|
|
204
|
+
config_file=self._get_config_file(),
|
|
190
205
|
)
|
|
191
206
|
|
|
192
207
|
def _create_importer(self) -> TrainingDataImporter:
|
|
@@ -198,7 +213,7 @@ class ProjectGenerator:
|
|
|
198
213
|
domain_path = self.project_folder / "domain"
|
|
199
214
|
|
|
200
215
|
return TrainingDataImporter.load_from_config(
|
|
201
|
-
config_path=str(self.
|
|
216
|
+
config_path=str(self._get_config_file()),
|
|
202
217
|
domain_path=str(domain_path),
|
|
203
218
|
training_data_paths=[str(self.project_folder / "data")],
|
|
204
219
|
args={},
|
|
@@ -225,25 +240,9 @@ class ProjectGenerator:
|
|
|
225
240
|
"""
|
|
226
241
|
bot_files: BotFiles = {}
|
|
227
242
|
|
|
228
|
-
for file in self.
|
|
229
|
-
# Skip directories
|
|
230
|
-
if not file.is_file():
|
|
231
|
-
continue
|
|
232
|
-
|
|
243
|
+
for file in self.bot_file_paths():
|
|
233
244
|
relative_path = file.relative_to(self.project_folder)
|
|
234
245
|
|
|
235
|
-
# Skip hidden files and directories (any path component starting with '.')
|
|
236
|
-
# as well as `__pycache__` folders
|
|
237
|
-
if any(part.startswith(".") for part in relative_path.parts):
|
|
238
|
-
continue
|
|
239
|
-
|
|
240
|
-
if "__pycache__" in relative_path.parts:
|
|
241
|
-
continue
|
|
242
|
-
|
|
243
|
-
# exclude the project_folder / models folder
|
|
244
|
-
if relative_path.parts[0] == "models":
|
|
245
|
-
continue
|
|
246
|
-
|
|
247
246
|
# Exclude the docs directory if specified
|
|
248
247
|
if exclude_docs_directory and relative_path.parts[0] == "docs":
|
|
249
248
|
continue
|
|
@@ -255,7 +254,6 @@ class ProjectGenerator:
|
|
|
255
254
|
]
|
|
256
255
|
if file.suffix.lstrip(".").lower() not in allowed_file_extensions:
|
|
257
256
|
continue
|
|
258
|
-
|
|
259
257
|
# Read file content and store with relative path as key
|
|
260
258
|
try:
|
|
261
259
|
bot_files[relative_path.as_posix()] = file.read_text(encoding="utf-8")
|
|
@@ -266,9 +264,40 @@ class ProjectGenerator:
|
|
|
266
264
|
file_path=file.as_posix(),
|
|
267
265
|
)
|
|
268
266
|
bot_files[relative_path.as_posix()] = None
|
|
269
|
-
|
|
270
267
|
return bot_files
|
|
271
268
|
|
|
269
|
+
def is_restricted_path(self, path: Path) -> bool:
|
|
270
|
+
"""Check if the path is restricted.
|
|
271
|
+
|
|
272
|
+
These paths are excluded from deletion and editing by the user.
|
|
273
|
+
"""
|
|
274
|
+
relative_path = path.relative_to(self.project_folder)
|
|
275
|
+
|
|
276
|
+
# Skip hidden files and directories (any path component starting with '.')
|
|
277
|
+
# as well as `__pycache__` folders
|
|
278
|
+
if any(part.startswith(".") for part in relative_path.parts):
|
|
279
|
+
return True
|
|
280
|
+
|
|
281
|
+
if "__pycache__" in relative_path.parts:
|
|
282
|
+
return True
|
|
283
|
+
|
|
284
|
+
# exclude the project_folder / models folder
|
|
285
|
+
if relative_path.parts[0] == DEFAULT_MODELS_PATH:
|
|
286
|
+
return True
|
|
287
|
+
|
|
288
|
+
return False
|
|
289
|
+
|
|
290
|
+
def bot_file_paths(
|
|
291
|
+
self,
|
|
292
|
+
) -> Generator[Path, None, None]:
|
|
293
|
+
"""Get the paths of all bot files."""
|
|
294
|
+
for file in self.project_folder.glob("**/*"):
|
|
295
|
+
# Skip directories
|
|
296
|
+
if not file.is_file() or self.is_restricted_path(file):
|
|
297
|
+
continue
|
|
298
|
+
|
|
299
|
+
yield file
|
|
300
|
+
|
|
272
301
|
def _get_bot_data_for_llm(self) -> Dict[str, Any]:
|
|
273
302
|
"""Get the current bot data for the LLM."""
|
|
274
303
|
file_importer = self._create_importer()
|
|
@@ -313,7 +342,7 @@ class ProjectGenerator:
|
|
|
313
342
|
def update_bot_files(self, files: Dict[str, Optional[str]]) -> None:
|
|
314
343
|
"""Update bot files with new content by writing to disk."""
|
|
315
344
|
for filename, content in files.items():
|
|
316
|
-
file_path = Path(subpath(self.project_folder, filename))
|
|
345
|
+
file_path = Path(subpath(str(self.project_folder), filename))
|
|
317
346
|
# Disallow updates inside .rasa project metadata directory
|
|
318
347
|
if any(
|
|
319
348
|
part.startswith(".")
|
|
@@ -324,6 +353,95 @@ class ProjectGenerator:
|
|
|
324
353
|
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
325
354
|
file_path.write_text(content, encoding="utf-8")
|
|
326
355
|
|
|
356
|
+
def ensure_all_files_are_writable(self, files: Dict[str, Optional[str]]) -> None:
|
|
357
|
+
"""Ensure all files are writable."""
|
|
358
|
+
for filename, content in files.items():
|
|
359
|
+
file_path = Path(subpath(str(self.project_folder), filename))
|
|
360
|
+
if self.is_restricted_path(file_path):
|
|
361
|
+
raise InvalidPathException(
|
|
362
|
+
f"This file or folder is restricted from editing: {file_path}"
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
def replace_all_bot_files(self, files: Dict[str, Optional[str]]) -> None:
|
|
366
|
+
"""Replace all bot files with new content, deleting files not in the request.
|
|
367
|
+
|
|
368
|
+
Files/folders starting with .rasa/ or models/ are excluded from deletion.
|
|
369
|
+
|
|
370
|
+
Args:
|
|
371
|
+
files: Dictionary mapping file names to their content
|
|
372
|
+
"""
|
|
373
|
+
self.ensure_all_files_are_writable(files)
|
|
374
|
+
# Collect all existing files - any files not in the new `files` dict will be
|
|
375
|
+
# deleted from this set
|
|
376
|
+
existing_files = set(path.as_posix() for path in self.bot_file_paths())
|
|
377
|
+
|
|
378
|
+
# Write all new files
|
|
379
|
+
for filename, content in files.items():
|
|
380
|
+
if content is None:
|
|
381
|
+
continue
|
|
382
|
+
|
|
383
|
+
file_path = Path(subpath(str(self.project_folder), filename))
|
|
384
|
+
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
385
|
+
|
|
386
|
+
try:
|
|
387
|
+
file_path.write_text(content, encoding="utf-8")
|
|
388
|
+
except Exception as e:
|
|
389
|
+
# Log write failure and avoid deleting an existing file by mistake
|
|
390
|
+
capture_exception_with_context(
|
|
391
|
+
e,
|
|
392
|
+
"project_generator.replace_all_bot_files.write_error",
|
|
393
|
+
extra={"file_path": file_path},
|
|
394
|
+
)
|
|
395
|
+
if file_path.as_posix() in existing_files:
|
|
396
|
+
# Keep the original file if it already existed
|
|
397
|
+
existing_files.discard(file_path.as_posix())
|
|
398
|
+
continue
|
|
399
|
+
|
|
400
|
+
# Remove from deletion set since this file is in the new set of files
|
|
401
|
+
existing_files.discard(file_path.as_posix())
|
|
402
|
+
|
|
403
|
+
# Delete files that weren't in the request
|
|
404
|
+
for file_to_delete in existing_files:
|
|
405
|
+
file_path = Path(file_to_delete)
|
|
406
|
+
try:
|
|
407
|
+
file_path.unlink()
|
|
408
|
+
except Exception as e:
|
|
409
|
+
capture_exception_with_context(
|
|
410
|
+
e,
|
|
411
|
+
"project_generator.replace_all_bot_files.delete_error",
|
|
412
|
+
extra={"file_path": file_path},
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
# Clean up empty directories (except excluded ones)
|
|
416
|
+
self._cleanup_empty_directories()
|
|
417
|
+
|
|
418
|
+
def _cleanup_empty_directories(self) -> None:
|
|
419
|
+
"""Remove empty directories from the project folder.
|
|
420
|
+
|
|
421
|
+
Excludes hidden files and directories, and models/ from cleanup.
|
|
422
|
+
"""
|
|
423
|
+
# Walk directories in reverse order (deepest first)
|
|
424
|
+
for dirpath, dirnames, filenames in os.walk(self.project_folder, topdown=False):
|
|
425
|
+
# Skip if this is the project root
|
|
426
|
+
if dirpath == str(self.project_folder):
|
|
427
|
+
continue
|
|
428
|
+
|
|
429
|
+
if self.is_restricted_path(Path(dirpath)):
|
|
430
|
+
continue
|
|
431
|
+
|
|
432
|
+
relative_path = Path(dirpath).relative_to(self.project_folder)
|
|
433
|
+
|
|
434
|
+
try:
|
|
435
|
+
# Only remove if directory is empty
|
|
436
|
+
if not os.listdir(dirpath):
|
|
437
|
+
os.rmdir(dirpath)
|
|
438
|
+
except Exception as e:
|
|
439
|
+
capture_exception_with_context(
|
|
440
|
+
e,
|
|
441
|
+
"project_generator.cleanup_empty_directories.error",
|
|
442
|
+
extra={"directory": relative_path.as_posix()},
|
|
443
|
+
)
|
|
444
|
+
|
|
327
445
|
def cleanup(self) -> None:
|
|
328
446
|
"""Cleanup the project folder."""
|
|
329
447
|
# remove all the files and folders in the project folder resulting
|
|
@@ -331,6 +449,8 @@ class ProjectGenerator:
|
|
|
331
449
|
for filename in os.listdir(self.project_folder):
|
|
332
450
|
file_path = os.path.join(self.project_folder, filename)
|
|
333
451
|
try:
|
|
452
|
+
if filename == "lost+found":
|
|
453
|
+
continue
|
|
334
454
|
if os.path.isfile(file_path) or os.path.islink(file_path):
|
|
335
455
|
os.unlink(file_path)
|
|
336
456
|
elif os.path.isdir(file_path):
|
|
@@ -341,122 +461,3 @@ class ProjectGenerator:
|
|
|
341
461
|
error=str(e),
|
|
342
462
|
file_path=file_path,
|
|
343
463
|
)
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
CACHE_BUCKET_URL = "https://trained-templates.s3.us-east-1.amazonaws.com"
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
def _safe_tar_members(
|
|
350
|
-
tar: tarfile.TarFile, destination_directory: Path
|
|
351
|
-
) -> Generator[tarfile.TarInfo, None, None]:
|
|
352
|
-
"""Yield safe members for extraction to prevent path traversal and links.
|
|
353
|
-
|
|
354
|
-
Args:
|
|
355
|
-
tar: Open tar file handle
|
|
356
|
-
destination_directory: Directory to which files will be extracted
|
|
357
|
-
|
|
358
|
-
Yields:
|
|
359
|
-
Members that are safe to extract within destination_directory
|
|
360
|
-
"""
|
|
361
|
-
base_path = destination_directory.resolve()
|
|
362
|
-
|
|
363
|
-
for member in tar.getmembers():
|
|
364
|
-
name = member.name
|
|
365
|
-
# Skip empty names and absolute paths
|
|
366
|
-
if not name or name.startswith("/") or name.startswith("\\"):
|
|
367
|
-
continue
|
|
368
|
-
|
|
369
|
-
# Disallow symlinks and hardlinks
|
|
370
|
-
if member.issym() or member.islnk():
|
|
371
|
-
continue
|
|
372
|
-
|
|
373
|
-
# Compute the final path and ensure it's within base_path
|
|
374
|
-
target_path = (base_path / name).resolve()
|
|
375
|
-
try:
|
|
376
|
-
target_path.relative_to(base_path)
|
|
377
|
-
except ValueError:
|
|
378
|
-
# Member would escape the destination directory
|
|
379
|
-
continue
|
|
380
|
-
|
|
381
|
-
yield member
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
async def download_cache_for_template(
|
|
385
|
-
template: ProjectTemplateName, project_folder: str
|
|
386
|
-
) -> None:
|
|
387
|
-
# get a temp path for the cache file download
|
|
388
|
-
temporary_cache_file = tempfile.NamedTemporaryFile(suffix=".tar.gz", delete=False)
|
|
389
|
-
|
|
390
|
-
try:
|
|
391
|
-
url = f"{CACHE_BUCKET_URL}/{rasa.version.__version__}-{template.value}.tar.gz"
|
|
392
|
-
async with aiohttp.ClientSession() as session:
|
|
393
|
-
async with session.get(url) as response:
|
|
394
|
-
response.raise_for_status()
|
|
395
|
-
async with aiofiles.open(temporary_cache_file.name, "wb") as f:
|
|
396
|
-
async for chunk in response.content.iter_chunked(1024 * 1024):
|
|
397
|
-
await f.write(chunk)
|
|
398
|
-
|
|
399
|
-
# extract the cache to the project folder using safe member filtering
|
|
400
|
-
with tarfile.open(temporary_cache_file.name, "r:gz") as tar:
|
|
401
|
-
destination = Path(project_folder)
|
|
402
|
-
destination.mkdir(parents=True, exist_ok=True)
|
|
403
|
-
tar.extractall(
|
|
404
|
-
path=destination,
|
|
405
|
-
members=_safe_tar_members(tar, destination),
|
|
406
|
-
)
|
|
407
|
-
|
|
408
|
-
structlogger.info(
|
|
409
|
-
"project_generator.download_cache_for_template.success",
|
|
410
|
-
template=template,
|
|
411
|
-
event_info=(
|
|
412
|
-
f"Downloaded cache for template, extracted to {project_folder}."
|
|
413
|
-
),
|
|
414
|
-
)
|
|
415
|
-
except aiohttp.ClientResponseError as e:
|
|
416
|
-
if e.status == 403:
|
|
417
|
-
structlogger.debug(
|
|
418
|
-
"project_generator.download_cache_for_template.no_cache_found",
|
|
419
|
-
template=template,
|
|
420
|
-
event_info=("No cache found for template, continuing without it."),
|
|
421
|
-
)
|
|
422
|
-
else:
|
|
423
|
-
structlogger.debug(
|
|
424
|
-
"project_generator.download_cache_for_template.response_error",
|
|
425
|
-
error=str(e),
|
|
426
|
-
status=e.status,
|
|
427
|
-
template=template,
|
|
428
|
-
event_info=(
|
|
429
|
-
"Failed to download cache for template, continuing without it."
|
|
430
|
-
),
|
|
431
|
-
)
|
|
432
|
-
capture_exception_with_context(
|
|
433
|
-
e,
|
|
434
|
-
"project_generator.download_cache_for_template.response_error",
|
|
435
|
-
tags={"template": template.value, "status": str(e.status)},
|
|
436
|
-
)
|
|
437
|
-
except Exception as exc:
|
|
438
|
-
structlogger.debug(
|
|
439
|
-
"project_generator.download_cache_for_template.unexpected_error",
|
|
440
|
-
error=str(exc),
|
|
441
|
-
template=template,
|
|
442
|
-
event_info=(
|
|
443
|
-
"Unexpected error when downloading cache for template, "
|
|
444
|
-
"continuing without it."
|
|
445
|
-
),
|
|
446
|
-
)
|
|
447
|
-
capture_exception_with_context(
|
|
448
|
-
exc,
|
|
449
|
-
"project_generator.download_cache_for_template.unexpected_error",
|
|
450
|
-
tags={"template": template.value},
|
|
451
|
-
)
|
|
452
|
-
finally:
|
|
453
|
-
# Clean up the temporary file
|
|
454
|
-
try:
|
|
455
|
-
Path(temporary_cache_file.name).unlink(missing_ok=True)
|
|
456
|
-
except Exception as exc:
|
|
457
|
-
structlogger.debug(
|
|
458
|
-
"project_generator.download_cache_for_template.cleanup_error",
|
|
459
|
-
error=str(exc),
|
|
460
|
-
template=template,
|
|
461
|
-
event_info=("Failed to cleanup cache for template, ignoring."),
|
|
462
|
-
)
|
rasa/builder/service.py
CHANGED
|
@@ -17,6 +17,8 @@ from rasa.builder.config import (
|
|
|
17
17
|
COPILOT_HANDLER_ROLLING_BUFFER_SIZE,
|
|
18
18
|
GUARDRAILS_ENABLE_BLOCKING,
|
|
19
19
|
HELLO_RASA_PROJECT_ID,
|
|
20
|
+
LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
21
|
+
LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
20
22
|
)
|
|
21
23
|
from rasa.builder.copilot.constants import ROLE_USER, SIGNATURE_VERSION_V1
|
|
22
24
|
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
@@ -47,15 +49,11 @@ from rasa.builder.guardrails.constants import (
|
|
|
47
49
|
BlockScope,
|
|
48
50
|
)
|
|
49
51
|
from rasa.builder.guardrails.store import guardrails_store
|
|
50
|
-
from rasa.builder.guardrails.utils import (
|
|
51
|
-
check_assistant_chat_for_policy_violations,
|
|
52
|
-
check_copilot_chat_for_policy_violations,
|
|
53
|
-
)
|
|
54
52
|
from rasa.builder.job_manager import job_manager
|
|
55
53
|
from rasa.builder.jobs import (
|
|
56
54
|
run_prompt_to_bot_job,
|
|
55
|
+
run_replace_all_files_job,
|
|
57
56
|
run_template_to_bot_job,
|
|
58
|
-
run_update_files_job,
|
|
59
57
|
)
|
|
60
58
|
from rasa.builder.llm_service import llm_service
|
|
61
59
|
from rasa.builder.logging_utils import (
|
|
@@ -512,26 +510,31 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
512
510
|
)
|
|
513
511
|
|
|
514
512
|
|
|
515
|
-
@bp.route("/files", methods=["
|
|
516
|
-
@openapi.summary("
|
|
513
|
+
@bp.route("/files", methods=["POST"])
|
|
514
|
+
@openapi.summary("Replace all bot files")
|
|
517
515
|
@openapi.description(
|
|
518
|
-
"
|
|
519
|
-
"
|
|
520
|
-
"
|
|
516
|
+
"Replaces all bot configuration files with the provided files, deletes any "
|
|
517
|
+
"files not included in the request (excluding .rasa/ and models/ directories), "
|
|
518
|
+
"and retrains the model. Returns immediately with a job ID. Connect to "
|
|
519
|
+
"`/job-events/<job_id>` for real-time SSE progress tracking."
|
|
521
520
|
"\n\n"
|
|
521
|
+
"**File Management:**\n"
|
|
522
|
+
"- All files in the request are written to the project folder\n"
|
|
523
|
+
"- Files not included in the request are deleted from the project\n"
|
|
524
|
+
"- Files/folders starting with `.rasa/` or `models/` are excluded from deletion\n\n"
|
|
522
525
|
"**SSE Event Flow:** (available via /job-events/<job_id>)\n"
|
|
523
526
|
"1. `received` - Request received by server\n"
|
|
524
527
|
"2. `validating` - Validating bot configuration files\n"
|
|
525
528
|
"3. `validation_success` - File validation completed successfully\n"
|
|
526
529
|
"4. `training` - Training the bot model with updated files\n"
|
|
527
530
|
"5. `train_success` - Model training completed\n"
|
|
528
|
-
"6. `done` - Bot files
|
|
531
|
+
"6. `done` - Bot files replacement completed\n\n"
|
|
529
532
|
"**Error Events (can occur at any time):**\n"
|
|
530
533
|
"- `validation_error` - Bot configuration files are invalid\n"
|
|
531
534
|
"- `train_error` - Files updated but training failed\n"
|
|
532
535
|
"- `error` - Unexpected error occurred\n\n"
|
|
533
536
|
"**Usage:**\n"
|
|
534
|
-
"1. Send
|
|
537
|
+
"1. Send POST request with Content-Type: application/json\n"
|
|
535
538
|
"2. The response will be a JSON object `{job_id: ...}`\n"
|
|
536
539
|
"3. Connect to `/job-events/<job_id>` for a server-sent event stream of progress."
|
|
537
540
|
)
|
|
@@ -539,9 +542,11 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
539
542
|
@openapi.body(
|
|
540
543
|
{"application/json": {str: Optional[str]}},
|
|
541
544
|
description=(
|
|
542
|
-
"A dictionary mapping file names to their
|
|
543
|
-
"
|
|
544
|
-
"Files
|
|
545
|
+
"A dictionary mapping file names to their complete content. "
|
|
546
|
+
"All files in the project will be replaced with these files. "
|
|
547
|
+
"Files not included in the request will be deleted from the project "
|
|
548
|
+
"(except for .rasa/ and models/ directories). "
|
|
549
|
+
"The file name should be the relative path from the project root."
|
|
545
550
|
),
|
|
546
551
|
required=True,
|
|
547
552
|
example={
|
|
@@ -558,6 +563,10 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
558
563
|
" - name: CountVectorsFeaturizer\n"
|
|
559
564
|
"policies:\n - name: MemoizationPolicy\n - name: RulePolicy"
|
|
560
565
|
),
|
|
566
|
+
"data/nlu.yml": (
|
|
567
|
+
"version: '3.1'\n"
|
|
568
|
+
"nlu:\n- intent: greet\n examples: |\n - hello\n - hi"
|
|
569
|
+
),
|
|
561
570
|
},
|
|
562
571
|
)
|
|
563
572
|
@openapi.response(
|
|
@@ -565,7 +574,7 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
565
574
|
{"application/json": model_to_schema(JobCreateResponse)},
|
|
566
575
|
description=(
|
|
567
576
|
"Job created. Poll or subscribe to /job-events/<job_id> "
|
|
568
|
-
"for progress and SSE updates."
|
|
577
|
+
"for progress and SSE updates on file replacement and training."
|
|
569
578
|
),
|
|
570
579
|
)
|
|
571
580
|
@openapi.response(
|
|
@@ -607,8 +616,8 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
607
616
|
schema=str,
|
|
608
617
|
)
|
|
609
618
|
@protected()
|
|
610
|
-
async def
|
|
611
|
-
"""
|
|
619
|
+
async def replace_all_bot_files(request: Request) -> HTTPResponse:
|
|
620
|
+
"""Replace all bot files with server-sent events for progress tracking."""
|
|
612
621
|
try:
|
|
613
622
|
bot_files = request.json
|
|
614
623
|
except Exception as exc:
|
|
@@ -621,17 +630,17 @@ async def update_bot_files(request: Request) -> HTTPResponse:
|
|
|
621
630
|
|
|
622
631
|
try:
|
|
623
632
|
job = job_manager.create_job()
|
|
624
|
-
request.app.add_task(
|
|
633
|
+
request.app.add_task(run_replace_all_files_job(request.app, job, bot_files))
|
|
625
634
|
return response.json(JobCreateResponse(job_id=job.id).model_dump(), status=200)
|
|
626
635
|
except Exception as exc:
|
|
627
636
|
capture_exception_with_context(
|
|
628
637
|
exc,
|
|
629
|
-
"bot_builder_service.
|
|
630
|
-
tags={"endpoint": "/api/files", "method": "
|
|
638
|
+
"bot_builder_service.replace_all_bot_files.unexpected_error",
|
|
639
|
+
tags={"endpoint": "/api/files", "method": "POST"},
|
|
631
640
|
)
|
|
632
641
|
return response.json(
|
|
633
642
|
ApiErrorResponse(
|
|
634
|
-
error="Failed to
|
|
643
|
+
error="Failed to replace bot files", details={"error": str(exc)}
|
|
635
644
|
).model_dump(),
|
|
636
645
|
status=HTTPStatus.INTERNAL_SERVER_ERROR,
|
|
637
646
|
)
|
|
@@ -1070,11 +1079,15 @@ async def copilot(request: Request) -> None:
|
|
|
1070
1079
|
tracker_context = TrackerContext.from_tracker(
|
|
1071
1080
|
tracker, max_turns=COPILOT_ASSISTANT_TRACKER_MAX_TURNS
|
|
1072
1081
|
)
|
|
1073
|
-
if
|
|
1074
|
-
tracker_context
|
|
1082
|
+
if (
|
|
1083
|
+
tracker_context is not None
|
|
1084
|
+
and llm_service.guardrails_policy_checker is not None
|
|
1085
|
+
):
|
|
1086
|
+
tracker_context = await llm_service.guardrails_policy_checker.check_assistant_chat_for_policy_violations( # noqa: E501
|
|
1075
1087
|
tracker_context=tracker_context,
|
|
1076
1088
|
hello_rasa_user_id=user_id,
|
|
1077
1089
|
hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
|
|
1090
|
+
lakera_project_id=LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
1078
1091
|
)
|
|
1079
1092
|
|
|
1080
1093
|
# Copilot doesn't need to know about the docs and any file that is not a core
|
|
@@ -1092,13 +1105,14 @@ async def copilot(request: Request) -> None:
|
|
|
1092
1105
|
|
|
1093
1106
|
# 5. Run guardrail policy checks. If any policy violations are detected,
|
|
1094
1107
|
# send a response and end the stream.
|
|
1095
|
-
guardrail_response: Optional[
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1108
|
+
guardrail_response: Optional[GeneratedContent] = None
|
|
1109
|
+
if llm_service.guardrails_policy_checker is not None:
|
|
1110
|
+
guardrail_response = await llm_service.guardrails_policy_checker.check_copilot_chat_for_policy_violations( # noqa: E501
|
|
1111
|
+
context=context,
|
|
1112
|
+
hello_rasa_user_id=user_id,
|
|
1113
|
+
hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
|
|
1114
|
+
lakera_project_id=LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
1115
|
+
)
|
|
1102
1116
|
if guardrail_response is not None:
|
|
1103
1117
|
blocked_or_violation_message = (
|
|
1104
1118
|
await _handle_guardrail_violation_and_maybe_block(
|
|
@@ -1122,11 +1136,9 @@ async def copilot(request: Request) -> None:
|
|
|
1122
1136
|
# copilot response handler
|
|
1123
1137
|
start_timestamp = time.perf_counter()
|
|
1124
1138
|
copilot_client = llm_service.instantiate_copilot()
|
|
1125
|
-
(
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
system_prompt,
|
|
1129
|
-
) = await copilot_client.generate_response(context)
|
|
1139
|
+
(original_stream, generation_context) = await copilot_client.generate_response(
|
|
1140
|
+
context
|
|
1141
|
+
)
|
|
1130
1142
|
|
|
1131
1143
|
copilot_response_handler = llm_service.instantiate_handler(
|
|
1132
1144
|
COPILOT_HANDLER_ROLLING_BUFFER_SIZE
|
|
@@ -1142,18 +1154,24 @@ async def copilot(request: Request) -> None:
|
|
|
1142
1154
|
asyncio.to_thread(
|
|
1143
1155
|
telemetry.log_copilot_from_handler,
|
|
1144
1156
|
handler=copilot_response_handler,
|
|
1145
|
-
used_documents=
|
|
1157
|
+
used_documents=generation_context.relevant_documents,
|
|
1146
1158
|
latency_ms=int((time.perf_counter() - start_timestamp) * 1000),
|
|
1147
|
-
|
|
1159
|
+
system_message=generation_context.system_message,
|
|
1160
|
+
chat_history=generation_context.chat_history,
|
|
1161
|
+
last_user_message=(
|
|
1162
|
+
req.last_message.get_text_content()
|
|
1163
|
+
if (req.last_message and req.last_message.role == ROLE_USER)
|
|
1164
|
+
else None
|
|
1165
|
+
),
|
|
1148
1166
|
**copilot_client.usage_statistics.model_dump(),
|
|
1149
1167
|
)
|
|
1150
1168
|
)
|
|
1151
1169
|
|
|
1152
1170
|
# 9. Once the stream is over, extract and send references
|
|
1153
1171
|
# if any documents were used
|
|
1154
|
-
if
|
|
1172
|
+
if generation_context.relevant_documents:
|
|
1155
1173
|
reference_section = copilot_response_handler.extract_references(
|
|
1156
|
-
|
|
1174
|
+
generation_context.relevant_documents
|
|
1157
1175
|
)
|
|
1158
1176
|
await sse.send(reference_section.to_sse_event().format())
|
|
1159
1177
|
|