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/guardrails/utils.py
CHANGED
|
@@ -1,31 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
from functools import lru_cache
|
|
3
|
-
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Type
|
|
4
2
|
|
|
5
3
|
import structlog
|
|
6
4
|
|
|
7
|
-
from rasa.builder.
|
|
8
|
-
ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
9
|
-
COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
10
|
-
)
|
|
11
|
-
from rasa.builder.copilot.constants import ROLE_COPILOT, ROLE_USER
|
|
12
|
-
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
13
|
-
from rasa.builder.copilot.models import (
|
|
14
|
-
CopilotChatMessage,
|
|
15
|
-
CopilotContext,
|
|
16
|
-
GeneratedContent,
|
|
17
|
-
ResponseCategory,
|
|
18
|
-
)
|
|
5
|
+
from rasa.builder.guardrails.clients import GuardrailsClient, LakeraAIGuardrails
|
|
19
6
|
from rasa.builder.guardrails.models import (
|
|
20
|
-
|
|
21
|
-
GuardrailResponse,
|
|
7
|
+
GuardrailRequest,
|
|
22
8
|
LakeraGuardrailRequest,
|
|
23
9
|
)
|
|
24
|
-
from rasa.
|
|
25
|
-
from rasa.builder.shared.tracker_context import (
|
|
26
|
-
AssistantConversationTurn,
|
|
27
|
-
TrackerContext,
|
|
28
|
-
)
|
|
10
|
+
from rasa.shared.constants import ROLE_USER
|
|
29
11
|
|
|
30
12
|
if TYPE_CHECKING:
|
|
31
13
|
from rasa.builder.guardrails.models import GuardrailType
|
|
@@ -64,265 +46,49 @@ def map_lakera_detector_type_to_guardrail_type(
|
|
|
64
46
|
return GuardrailType.OTHER
|
|
65
47
|
|
|
66
48
|
|
|
67
|
-
|
|
68
|
-
|
|
49
|
+
def create_guardrail_request(
|
|
50
|
+
client_type: Type[GuardrailsClient],
|
|
69
51
|
user_text: str,
|
|
70
52
|
hello_rasa_user_id: str,
|
|
71
53
|
hello_rasa_project_id: str,
|
|
72
|
-
|
|
73
|
-
) ->
|
|
74
|
-
"""
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
user_text:
|
|
78
|
-
hello_rasa_user_id:
|
|
79
|
-
hello_rasa_project_id:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
request = LakeraGuardrailRequest(
|
|
89
|
-
lakera_project_id=lakera_project_id,
|
|
90
|
-
hello_rasa_user_id=hello_rasa_user_id,
|
|
91
|
-
hello_rasa_project_id=hello_rasa_project_id,
|
|
92
|
-
messages=[{"role": ROLE_USER, "content": user_text}],
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
return loop.create_task(llm_service.guardrails.send_request(request))
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
async def _detect_flagged_user_indices(
|
|
99
|
-
items: List[Tuple[int, str]],
|
|
100
|
-
*,
|
|
101
|
-
hello_rasa_user_id: Optional[str],
|
|
102
|
-
hello_rasa_project_id: Optional[str],
|
|
103
|
-
lakera_project_id: str,
|
|
104
|
-
log_prefix: str,
|
|
105
|
-
) -> Set[int]:
|
|
106
|
-
"""Run guardrail checks for provided (index, user_text) pairs.
|
|
107
|
-
|
|
108
|
-
Args:
|
|
109
|
-
items: List of tuples containing (index, user_text) to check.
|
|
110
|
-
hello_rasa_user_id: The user ID for the conversation.
|
|
111
|
-
hello_rasa_project_id: The project ID for the conversation.
|
|
112
|
-
lakera_project_id: The Lakera project ID to use for this check.
|
|
113
|
-
log_prefix: Prefix for logging messages.
|
|
114
|
-
|
|
115
|
-
Returns:
|
|
116
|
-
A set of indices that were flagged by the guardrails.
|
|
117
|
-
"""
|
|
118
|
-
if not items:
|
|
119
|
-
return set()
|
|
120
|
-
|
|
121
|
-
# 1) Group indices by logical request key (hashable by value)
|
|
122
|
-
indices_by_key: Dict[GuardrailRequestKey, List[int]] = {}
|
|
123
|
-
for idx, text in items:
|
|
124
|
-
key = GuardrailRequestKey(
|
|
125
|
-
user_text=(text or "").strip(),
|
|
126
|
-
hello_rasa_user_id=hello_rasa_user_id or "",
|
|
127
|
-
hello_rasa_project_id=hello_rasa_project_id or "",
|
|
128
|
-
lakera_project_id=lakera_project_id,
|
|
54
|
+
**kwargs: Any,
|
|
55
|
+
) -> GuardrailRequest:
|
|
56
|
+
"""Create a guardrail request."""
|
|
57
|
+
|
|
58
|
+
def _create_lakera_guardrail_request(
|
|
59
|
+
user_text: str,
|
|
60
|
+
hello_rasa_user_id: str,
|
|
61
|
+
hello_rasa_project_id: str,
|
|
62
|
+
**kwargs: Any,
|
|
63
|
+
) -> LakeraGuardrailRequest:
|
|
64
|
+
"""Create a Lakera guardrail request."""
|
|
65
|
+
return LakeraGuardrailRequest(
|
|
66
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
67
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
68
|
+
messages=[{"role": ROLE_USER, "content": user_text}],
|
|
69
|
+
**kwargs,
|
|
129
70
|
)
|
|
130
|
-
if not key.user_text:
|
|
131
|
-
continue
|
|
132
|
-
indices_by_key.setdefault(key, []).append(idx)
|
|
133
71
|
|
|
134
|
-
|
|
135
|
-
|
|
72
|
+
map_client_to_request: Dict[
|
|
73
|
+
Type[GuardrailsClient], Callable[..., GuardrailRequest]
|
|
74
|
+
] = {
|
|
75
|
+
LakeraAIGuardrails: _create_lakera_guardrail_request,
|
|
76
|
+
}
|
|
136
77
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
hello_rasa_project_id=key.hello_rasa_project_id,
|
|
144
|
-
lakera_project_id=key.lakera_project_id,
|
|
78
|
+
if client_type in map_client_to_request:
|
|
79
|
+
return map_client_to_request[client_type](
|
|
80
|
+
user_text,
|
|
81
|
+
hello_rasa_user_id,
|
|
82
|
+
hello_rasa_project_id,
|
|
83
|
+
**kwargs,
|
|
145
84
|
)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
for key, response in zip(keys, responses):
|
|
155
|
-
if isinstance(response, Exception):
|
|
156
|
-
structlogger.warning(f"{log_prefix}.request_failed", error=str(response))
|
|
157
|
-
continue
|
|
158
|
-
if response.flagged:
|
|
159
|
-
flagged.update(indices_by_key.get(key, []))
|
|
160
|
-
|
|
161
|
-
return flagged
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
async def check_assistant_chat_for_policy_violations(
|
|
165
|
-
tracker_context: TrackerContext,
|
|
166
|
-
hello_rasa_user_id: Optional[str],
|
|
167
|
-
hello_rasa_project_id: Optional[str],
|
|
168
|
-
) -> TrackerContext:
|
|
169
|
-
"""Return a sanitised TrackerContext with unsafe turns removed.
|
|
170
|
-
|
|
171
|
-
Only user messages are moderated – assistant messages are assumed safe.
|
|
172
|
-
LRU cache is used, so each unique user text is checked once.
|
|
173
|
-
|
|
174
|
-
Args:
|
|
175
|
-
tracker_context: The TrackerContext containing conversation turns.
|
|
176
|
-
hello_rasa_user_id: The user ID for the conversation.
|
|
177
|
-
hello_rasa_project_id: The project ID for the conversation.
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
TrackerContext with unsafe turns removed.
|
|
181
|
-
"""
|
|
182
|
-
# Collect (turn_index, user_text) for all turns with a user message
|
|
183
|
-
items: List[Tuple[int, str]] = []
|
|
184
|
-
for idx, turn in enumerate(tracker_context.conversation_turns):
|
|
185
|
-
user_message = turn.user_message
|
|
186
|
-
if not user_message:
|
|
187
|
-
continue
|
|
188
|
-
|
|
189
|
-
text = (user_message.text or "").strip()
|
|
190
|
-
if not text:
|
|
191
|
-
continue
|
|
192
|
-
|
|
193
|
-
items.append((idx, text))
|
|
194
|
-
|
|
195
|
-
flagged_turns = await _detect_flagged_user_indices(
|
|
196
|
-
items,
|
|
197
|
-
hello_rasa_user_id=hello_rasa_user_id,
|
|
198
|
-
hello_rasa_project_id=hello_rasa_project_id,
|
|
199
|
-
lakera_project_id=ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
200
|
-
log_prefix="assistant_guardrails",
|
|
201
|
-
)
|
|
202
|
-
|
|
203
|
-
if not flagged_turns:
|
|
204
|
-
return tracker_context
|
|
205
|
-
|
|
206
|
-
structlogger.info(
|
|
207
|
-
"assistant_guardrails.turns_flagged",
|
|
208
|
-
count=len(flagged_turns),
|
|
209
|
-
turn_indices=sorted(flagged_turns),
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
# Build a filtered TrackerContext
|
|
213
|
-
safe_turns: List[AssistantConversationTurn] = [
|
|
214
|
-
turn
|
|
215
|
-
for idx, turn in enumerate(tracker_context.conversation_turns)
|
|
216
|
-
if idx not in flagged_turns
|
|
217
|
-
]
|
|
218
|
-
|
|
219
|
-
new_tracker_context = tracker_context.copy(deep=True)
|
|
220
|
-
new_tracker_context.conversation_turns = safe_turns
|
|
221
|
-
return new_tracker_context
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
def _annotate_flagged_user_messages(
|
|
225
|
-
history: List[CopilotChatMessage], flagged_user_indices: Set[int]
|
|
226
|
-
) -> None:
|
|
227
|
-
"""Mark flagged user messages in-place on the original history.
|
|
228
|
-
|
|
229
|
-
Args:
|
|
230
|
-
history: The copilot chat history containing messages.
|
|
231
|
-
flagged_user_indices: Set of indices of user messages that were flagged.
|
|
232
|
-
"""
|
|
233
|
-
if not flagged_user_indices:
|
|
234
|
-
return
|
|
235
|
-
|
|
236
|
-
total = len(history)
|
|
237
|
-
for uidx in flagged_user_indices:
|
|
238
|
-
if 0 <= uidx < total and history[uidx].role == ROLE_USER:
|
|
239
|
-
history[
|
|
240
|
-
uidx
|
|
241
|
-
].response_category = ResponseCategory.GUARDRAILS_POLICY_VIOLATION
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
async def check_copilot_chat_for_policy_violations(
|
|
245
|
-
context: CopilotContext,
|
|
246
|
-
hello_rasa_user_id: Optional[str],
|
|
247
|
-
hello_rasa_project_id: Optional[str],
|
|
248
|
-
) -> Optional[GeneratedContent]:
|
|
249
|
-
"""Check the copilot chat history for guardrail policy violations.
|
|
250
|
-
|
|
251
|
-
Only user messages are moderated – assistant messages are assumed safe.
|
|
252
|
-
LRU cache is used, so each unique user text is checked once.
|
|
253
|
-
|
|
254
|
-
Args:
|
|
255
|
-
context: The CopilotContext containing the copilot chat history.
|
|
256
|
-
hello_rasa_user_id: The user ID for the conversation.
|
|
257
|
-
hello_rasa_project_id: The project ID for the conversation.
|
|
258
|
-
|
|
259
|
-
Returns:
|
|
260
|
-
Returns a default violation response if the system flags any user message,
|
|
261
|
-
otherwise return None.
|
|
262
|
-
"""
|
|
263
|
-
history = context.copilot_chat_history
|
|
264
|
-
|
|
265
|
-
# Collect (index, text) for user messages; skip ones already marked as violations
|
|
266
|
-
items: List[Tuple[int, str]] = []
|
|
267
|
-
for idx, message in enumerate(history):
|
|
268
|
-
if message.response_category == ResponseCategory.GUARDRAILS_POLICY_VIOLATION:
|
|
269
|
-
continue
|
|
270
|
-
if message.role != ROLE_USER:
|
|
271
|
-
continue
|
|
272
|
-
formatted_message = message.to_openai_format()
|
|
273
|
-
text = (formatted_message.get("content") or "").strip()
|
|
274
|
-
if not text:
|
|
275
|
-
continue
|
|
276
|
-
items.append((idx, text))
|
|
277
|
-
|
|
278
|
-
flagged_user_indices = await _detect_flagged_user_indices(
|
|
279
|
-
items,
|
|
280
|
-
hello_rasa_user_id=hello_rasa_user_id,
|
|
281
|
-
hello_rasa_project_id=hello_rasa_project_id,
|
|
282
|
-
lakera_project_id=COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
283
|
-
log_prefix="copilot_guardrails",
|
|
284
|
-
)
|
|
285
|
-
|
|
286
|
-
_annotate_flagged_user_messages(history, flagged_user_indices)
|
|
287
|
-
|
|
288
|
-
if not flagged_user_indices:
|
|
289
|
-
return None
|
|
290
|
-
|
|
291
|
-
# Identify the latest user message index in the current request
|
|
292
|
-
last_user_idx: Optional[int] = None
|
|
293
|
-
for i in range(len(history) - 1, -1, -1):
|
|
294
|
-
if getattr(history[i], "role", None) == ROLE_USER:
|
|
295
|
-
last_user_idx = i
|
|
296
|
-
break
|
|
297
|
-
|
|
298
|
-
# Remove flagged user messages and their next copilot messages
|
|
299
|
-
indices_to_remove: Set[int] = set()
|
|
300
|
-
total = len(history)
|
|
301
|
-
for uidx in flagged_user_indices:
|
|
302
|
-
indices_to_remove.add(uidx)
|
|
303
|
-
next_idx = uidx + 1
|
|
304
|
-
if (
|
|
305
|
-
next_idx < total
|
|
306
|
-
and getattr(history[next_idx], "role", None) == ROLE_COPILOT
|
|
307
|
-
):
|
|
308
|
-
indices_to_remove.add(next_idx)
|
|
309
|
-
|
|
310
|
-
# Apply sanitization
|
|
311
|
-
filtered_history = [
|
|
312
|
-
msg for i, msg in enumerate(history) if i not in indices_to_remove
|
|
313
|
-
]
|
|
314
|
-
if len(filtered_history) != len(history):
|
|
315
|
-
structlogger.info(
|
|
316
|
-
"copilot_guardrails.history_sanitized",
|
|
317
|
-
removed_indices=sorted(indices_to_remove),
|
|
318
|
-
removed_messages=len(history) - len(filtered_history),
|
|
319
|
-
kept_messages=len(filtered_history),
|
|
85
|
+
else:
|
|
86
|
+
message = f"Unsupported guardrail client: {type(client_type)}"
|
|
87
|
+
structlogger.error(
|
|
88
|
+
"guardrails_policy_checker"
|
|
89
|
+
".create_guardrail_request"
|
|
90
|
+
".unsupported_guardrail_client",
|
|
91
|
+
message=message,
|
|
92
|
+
guardrail_client=client_type,
|
|
320
93
|
)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
# Block only if the latest user message in this request was flagged
|
|
324
|
-
if last_user_idx is not None and last_user_idx in flagged_user_indices:
|
|
325
|
-
return CopilotResponseHandler.respond_to_guardrail_policy_violations()
|
|
326
|
-
|
|
327
|
-
# Otherwise proceed (following messages are respected)
|
|
328
|
-
return None
|
|
94
|
+
raise ValueError(message)
|
rasa/builder/jobs.py
CHANGED
|
@@ -16,10 +16,13 @@ from rasa.builder.models import (
|
|
|
16
16
|
JobStatusEvent,
|
|
17
17
|
)
|
|
18
18
|
from rasa.builder.project_generator import ProjectGenerator
|
|
19
|
-
from rasa.builder.training_service import
|
|
19
|
+
from rasa.builder.training_service import (
|
|
20
|
+
train_and_load_agent,
|
|
21
|
+
try_load_existing_agent,
|
|
22
|
+
update_agent,
|
|
23
|
+
)
|
|
20
24
|
from rasa.builder.validation_service import validate_project
|
|
21
25
|
from rasa.cli.scaffold import ProjectTemplateName
|
|
22
|
-
from rasa.core.channels.studio_chat import StudioChatInput
|
|
23
26
|
|
|
24
27
|
structlogger = structlog.get_logger()
|
|
25
28
|
|
|
@@ -45,7 +48,6 @@ async def run_prompt_to_bot_job(
|
|
|
45
48
|
prompt: The natural language prompt for bot generation.
|
|
46
49
|
"""
|
|
47
50
|
project_generator: ProjectGenerator = app.ctx.project_generator
|
|
48
|
-
input_channel: StudioChatInput = app.ctx.input_channel
|
|
49
51
|
|
|
50
52
|
await push_job_status_event(job, JobStatus.received)
|
|
51
53
|
|
|
@@ -60,10 +62,8 @@ async def run_prompt_to_bot_job(
|
|
|
60
62
|
|
|
61
63
|
# 2. Training
|
|
62
64
|
await push_job_status_event(job, JobStatus.training)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
)
|
|
66
|
-
input_channel.agent = app.ctx.agent
|
|
65
|
+
agent = await train_and_load_agent(project_generator.get_training_input())
|
|
66
|
+
update_agent(agent, app)
|
|
67
67
|
await push_job_status_event(job, JobStatus.train_success)
|
|
68
68
|
|
|
69
69
|
structlogger.info(
|
|
@@ -128,8 +128,7 @@ async def run_template_to_bot_job(
|
|
|
128
128
|
job: The job information instance.
|
|
129
129
|
template_name: The name of the template to use for bot generation.
|
|
130
130
|
"""
|
|
131
|
-
project_generator = app.ctx.project_generator
|
|
132
|
-
input_channel = app.ctx.input_channel
|
|
131
|
+
project_generator: ProjectGenerator = app.ctx.project_generator
|
|
133
132
|
|
|
134
133
|
await push_job_status_event(job, JobStatus.received)
|
|
135
134
|
|
|
@@ -142,10 +141,14 @@ async def run_template_to_bot_job(
|
|
|
142
141
|
|
|
143
142
|
# 2) Training
|
|
144
143
|
await push_job_status_event(job, JobStatus.training)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
144
|
+
agent = await try_load_existing_agent(project_generator.project_folder)
|
|
145
|
+
if agent is None:
|
|
146
|
+
agent = await train_and_load_agent(project_generator.get_training_input())
|
|
147
|
+
else:
|
|
148
|
+
structlogger.info(
|
|
149
|
+
"bot_builder_service.template_to_bot.agent_loaded_from_cache",
|
|
150
|
+
)
|
|
151
|
+
update_agent(agent, app)
|
|
149
152
|
await push_job_status_event(job, JobStatus.train_success)
|
|
150
153
|
|
|
151
154
|
# 3) Done
|
|
@@ -204,17 +207,26 @@ async def run_template_to_bot_job(
|
|
|
204
207
|
job_manager.mark_done(job, error=str(exc))
|
|
205
208
|
|
|
206
209
|
|
|
207
|
-
async def
|
|
210
|
+
async def run_replace_all_files_job(
|
|
208
211
|
app: "Sanic",
|
|
209
212
|
job: JobInfo,
|
|
210
213
|
bot_files: dict,
|
|
211
214
|
) -> None:
|
|
215
|
+
"""Run the replace-all-files job in the background.
|
|
216
|
+
|
|
217
|
+
This replaces all bot files with the provided files and deletes any files
|
|
218
|
+
not included in the request (excluding .rasa/ and models/ directories).
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
app: The Sanic application instance.
|
|
222
|
+
job: The job information instance.
|
|
223
|
+
bot_files: Dictionary of file names to content for replacement.
|
|
224
|
+
"""
|
|
212
225
|
project_generator = app.ctx.project_generator
|
|
213
|
-
input_channel = app.ctx.input_channel
|
|
214
226
|
await push_job_status_event(job, JobStatus.received)
|
|
215
227
|
|
|
216
228
|
try:
|
|
217
|
-
project_generator.
|
|
229
|
+
project_generator.replace_all_bot_files(bot_files)
|
|
218
230
|
|
|
219
231
|
# 1. Validating
|
|
220
232
|
await push_job_status_event(job, JobStatus.validating)
|
|
@@ -226,8 +238,8 @@ async def run_update_files_job(
|
|
|
226
238
|
|
|
227
239
|
# 2. Training
|
|
228
240
|
await push_job_status_event(job, JobStatus.training)
|
|
229
|
-
|
|
230
|
-
|
|
241
|
+
agent = await train_and_load_agent(training_input)
|
|
242
|
+
update_agent(agent, app)
|
|
231
243
|
await push_job_status_event(job, JobStatus.train_success)
|
|
232
244
|
|
|
233
245
|
await push_job_status_event(job, JobStatus.done)
|
|
@@ -238,7 +250,7 @@ async def run_update_files_job(
|
|
|
238
250
|
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
239
251
|
log_levels.append("warning")
|
|
240
252
|
structlogger.debug(
|
|
241
|
-
"
|
|
253
|
+
"replace_all_files_job.validation_error",
|
|
242
254
|
job_id=job.id,
|
|
243
255
|
error=str(exc),
|
|
244
256
|
validation_logs=exc.validation_logs,
|
|
@@ -252,7 +264,7 @@ async def run_update_files_job(
|
|
|
252
264
|
|
|
253
265
|
except TrainingError as exc:
|
|
254
266
|
structlogger.debug(
|
|
255
|
-
"
|
|
267
|
+
"replace_all_files_job.train_error",
|
|
256
268
|
job_id=job.id,
|
|
257
269
|
error=str(exc),
|
|
258
270
|
)
|
|
@@ -262,7 +274,7 @@ async def run_update_files_job(
|
|
|
262
274
|
except Exception as exc:
|
|
263
275
|
# Capture full traceback for anything truly unexpected
|
|
264
276
|
structlogger.exception(
|
|
265
|
-
"
|
|
277
|
+
"replace_all_files_job.unexpected_error",
|
|
266
278
|
job_id=job.id,
|
|
267
279
|
error=str(exc),
|
|
268
280
|
)
|
rasa/builder/llm_service.py
CHANGED
|
@@ -19,7 +19,11 @@ from rasa.builder.copilot.copilot_templated_message_provider import (
|
|
|
19
19
|
load_copilot_internal_message_templates,
|
|
20
20
|
)
|
|
21
21
|
from rasa.builder.exceptions import LLMGenerationError
|
|
22
|
-
from rasa.builder.guardrails.
|
|
22
|
+
from rasa.builder.guardrails.clients import (
|
|
23
|
+
GuardrailsClient,
|
|
24
|
+
LakeraAIGuardrails,
|
|
25
|
+
)
|
|
26
|
+
from rasa.builder.guardrails.policy_checker import GuardrailsPolicyChecker
|
|
23
27
|
from rasa.constants import PACKAGE_NAME
|
|
24
28
|
from rasa.shared.constants import DOMAIN_SCHEMA_FILE, RESPONSES_SCHEMA_FILE
|
|
25
29
|
from rasa.shared.core.flows.yaml_flows_io import FLOWS_SCHEMA_FILE
|
|
@@ -37,7 +41,8 @@ class LLMService:
|
|
|
37
41
|
self._domain_schema: Optional[Dict[str, Any]] = None
|
|
38
42
|
self._flows_schema: Optional[Dict[str, Any]] = None
|
|
39
43
|
self._copilot: Optional[Copilot] = None
|
|
40
|
-
self._guardrails: Optional[
|
|
44
|
+
self._guardrails: Optional[GuardrailsClient] = None
|
|
45
|
+
self._guardrails_policy_checker: Optional[GuardrailsPolicyChecker] = None
|
|
41
46
|
self._copilot_response_handler: Optional[CopilotResponseHandler] = None
|
|
42
47
|
self._copilot_internal_message_templates: Optional[Dict[str, str]] = None
|
|
43
48
|
|
|
@@ -77,11 +82,14 @@ class LLMService:
|
|
|
77
82
|
raise
|
|
78
83
|
|
|
79
84
|
@property
|
|
80
|
-
def guardrails(self) ->
|
|
85
|
+
def guardrails(self) -> Optional[GuardrailsClient]:
|
|
81
86
|
"""Get or lazy create guardrails instance."""
|
|
82
|
-
if
|
|
83
|
-
|
|
87
|
+
if not config.ENABLE_GUARDRAILS:
|
|
88
|
+
return None
|
|
89
|
+
# TODO: Replace with Open Source guardrails implementation once it's ready
|
|
84
90
|
try:
|
|
91
|
+
if self._guardrails is None:
|
|
92
|
+
self._guardrails = LakeraAIGuardrails()
|
|
85
93
|
return self._guardrails
|
|
86
94
|
except Exception as e:
|
|
87
95
|
structlogger.error(
|
|
@@ -91,6 +99,25 @@ class LLMService:
|
|
|
91
99
|
)
|
|
92
100
|
raise
|
|
93
101
|
|
|
102
|
+
@property
|
|
103
|
+
def guardrails_policy_checker(self) -> Optional[GuardrailsPolicyChecker]:
|
|
104
|
+
"""Get or lazy create guardrails policy checker instance."""
|
|
105
|
+
try:
|
|
106
|
+
if self._guardrails_policy_checker is None and self.guardrails is not None:
|
|
107
|
+
self._guardrails_policy_checker = GuardrailsPolicyChecker(
|
|
108
|
+
self.guardrails
|
|
109
|
+
)
|
|
110
|
+
return self._guardrails_policy_checker
|
|
111
|
+
except Exception as e:
|
|
112
|
+
structlogger.error(
|
|
113
|
+
"llm_service.guardrails_policy_checker.error",
|
|
114
|
+
event_info=(
|
|
115
|
+
"LLM Service: Error getting guardrails policy checker instance."
|
|
116
|
+
),
|
|
117
|
+
error=str(e),
|
|
118
|
+
)
|
|
119
|
+
raise
|
|
120
|
+
|
|
94
121
|
@property
|
|
95
122
|
def copilot_internal_message_templates(self) -> Dict[str, str]:
|
|
96
123
|
"""Get or lazy load copilot internal message templates."""
|
rasa/builder/main.py
CHANGED
|
@@ -22,10 +22,9 @@ from rasa.builder.logging_utils import (
|
|
|
22
22
|
log_request_start,
|
|
23
23
|
)
|
|
24
24
|
from rasa.builder.service import bp, setup_project_generator
|
|
25
|
-
from rasa.
|
|
26
|
-
from rasa.core.available_endpoints import AvailableEndpoints
|
|
25
|
+
from rasa.builder.training_service import try_load_existing_agent, update_agent
|
|
27
26
|
from rasa.core.channels.studio_chat import StudioChatInput
|
|
28
|
-
from rasa.
|
|
27
|
+
from rasa.model_manager.warm_rasa_process import warmup
|
|
29
28
|
from rasa.server import configure_cors
|
|
30
29
|
from rasa.utils.common import configure_logging_and_warnings
|
|
31
30
|
from rasa.utils.log_utils import configure_structlog
|
|
@@ -60,63 +59,6 @@ def setup_input_channel() -> StudioChatInput:
|
|
|
60
59
|
return StudioChatInput.from_credentials(credentials=studio_chat_credentials)
|
|
61
60
|
|
|
62
61
|
|
|
63
|
-
async def try_load_existing_agent(project_folder: str) -> Optional[Agent]:
|
|
64
|
-
"""Try to load an existing agent from the project's models directory.
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
project_folder: Path to the project folder
|
|
68
|
-
|
|
69
|
-
Returns:
|
|
70
|
-
Loaded Agent instance if successful, None otherwise
|
|
71
|
-
"""
|
|
72
|
-
models_dir = os.path.join(project_folder, "models")
|
|
73
|
-
|
|
74
|
-
if not os.path.exists(models_dir) or not os.path.isdir(models_dir):
|
|
75
|
-
structlogger.debug("No models directory found", models_dir=models_dir)
|
|
76
|
-
return None
|
|
77
|
-
|
|
78
|
-
try:
|
|
79
|
-
# Find the latest model in the models directory
|
|
80
|
-
latest_model_path = get_latest_model(models_dir)
|
|
81
|
-
if not latest_model_path:
|
|
82
|
-
structlogger.debug(
|
|
83
|
-
"No models found in models directory", models_dir=models_dir
|
|
84
|
-
)
|
|
85
|
-
return None
|
|
86
|
-
|
|
87
|
-
structlogger.info(
|
|
88
|
-
"Found existing model, attempting to load", model_path=latest_model_path
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
# Get available endpoints for agent loading
|
|
92
|
-
available_endpoints = AvailableEndpoints.get_instance()
|
|
93
|
-
|
|
94
|
-
# Load the agent
|
|
95
|
-
agent = await load_agent(
|
|
96
|
-
model_path=latest_model_path, endpoints=available_endpoints
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
if agent and agent.is_ready():
|
|
100
|
-
structlogger.info(
|
|
101
|
-
"Successfully loaded existing agent", model_path=latest_model_path
|
|
102
|
-
)
|
|
103
|
-
return agent
|
|
104
|
-
else:
|
|
105
|
-
structlogger.warning(
|
|
106
|
-
"Agent loaded but not ready", model_path=latest_model_path
|
|
107
|
-
)
|
|
108
|
-
return None
|
|
109
|
-
|
|
110
|
-
except Exception as e:
|
|
111
|
-
structlogger.warning(
|
|
112
|
-
"Failed to load existing agent",
|
|
113
|
-
models_dir=models_dir,
|
|
114
|
-
error=str(e),
|
|
115
|
-
exc_info=True,
|
|
116
|
-
)
|
|
117
|
-
return None
|
|
118
|
-
|
|
119
|
-
|
|
120
62
|
def setup_middleware(app: Sanic) -> None:
|
|
121
63
|
"""Setup middleware for request/response processing."""
|
|
122
64
|
|
|
@@ -157,7 +99,6 @@ def create_app(project_folder: str) -> Sanic:
|
|
|
157
99
|
use_authentication=app.config.USE_AUTHENTICATION,
|
|
158
100
|
rasa_version=rasa.__version__,
|
|
159
101
|
)
|
|
160
|
-
app.ctx.agent = None
|
|
161
102
|
|
|
162
103
|
# Set up project generator and store in app context
|
|
163
104
|
app.ctx.project_generator = setup_project_generator(project_folder)
|
|
@@ -165,6 +106,8 @@ def create_app(project_folder: str) -> Sanic:
|
|
|
165
106
|
# Set up input channel and store in app context
|
|
166
107
|
app.ctx.input_channel = setup_input_channel()
|
|
167
108
|
|
|
109
|
+
update_agent(None, app)
|
|
110
|
+
|
|
168
111
|
# Register the blueprint
|
|
169
112
|
app.blueprint(bp)
|
|
170
113
|
|
|
@@ -196,7 +139,7 @@ def create_app(project_folder: str) -> Sanic:
|
|
|
196
139
|
try:
|
|
197
140
|
existing_agent = await try_load_existing_agent(project_folder)
|
|
198
141
|
if existing_agent:
|
|
199
|
-
app
|
|
142
|
+
update_agent(existing_agent, app)
|
|
200
143
|
structlogger.info("Agent loaded on server startup")
|
|
201
144
|
else:
|
|
202
145
|
structlogger.info(
|
|
@@ -208,6 +151,33 @@ def create_app(project_folder: str) -> Sanic:
|
|
|
208
151
|
return app
|
|
209
152
|
|
|
210
153
|
|
|
154
|
+
def _apply_llm_overrides_from_builder_env() -> None:
|
|
155
|
+
# Prefer a dedicated builder key, fall back to license if you proxy with it
|
|
156
|
+
if not config.HELLO_LLM_PROXY_BASE_URL:
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
structlogger.debug(
|
|
160
|
+
"builder.main.using_llm_proxy", base_url=config.HELLO_LLM_PROXY_BASE_URL
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
if not config.RASA_PRO_LICENSE:
|
|
164
|
+
structlogger.error(
|
|
165
|
+
"copilot.proxy_missing_license",
|
|
166
|
+
event_info=(
|
|
167
|
+
"HELLO_LLM_PROXY_BASE_URL is set but RASA_PRO_LICENSE is missing."
|
|
168
|
+
),
|
|
169
|
+
)
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
if not os.getenv("OPENAI_API_BASE") and not os.getenv("OPENAI_API_KEY"):
|
|
173
|
+
base_url = config.HELLO_LLM_PROXY_BASE_URL.rstrip("/")
|
|
174
|
+
# needed for litellm client
|
|
175
|
+
os.environ["OPENAI_API_BASE"] = base_url
|
|
176
|
+
# needed for openai async client
|
|
177
|
+
os.environ["OPENAI_BASE_URL"] = base_url
|
|
178
|
+
os.environ["OPENAI_API_KEY"] = config.RASA_PRO_LICENSE
|
|
179
|
+
|
|
180
|
+
|
|
211
181
|
def main(project_folder: Optional[str] = None) -> None:
|
|
212
182
|
"""Main entry point."""
|
|
213
183
|
try:
|
|
@@ -218,6 +188,12 @@ def main(project_folder: Optional[str] = None) -> None:
|
|
|
218
188
|
rasa.telemetry.initialize_telemetry()
|
|
219
189
|
rasa.telemetry.initialize_error_reporting(private_mode=False)
|
|
220
190
|
|
|
191
|
+
_apply_llm_overrides_from_builder_env()
|
|
192
|
+
|
|
193
|
+
if config.HELLO_RASA_PROJECT_ID:
|
|
194
|
+
# ensures long import times for modules are ahead of time
|
|
195
|
+
warmup()
|
|
196
|
+
|
|
221
197
|
# working directory needs to be the project folder, e.g.
|
|
222
198
|
# for relative paths (./docs) in a projects config to work
|
|
223
199
|
if not project_folder:
|