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
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Guardrails client implementations."""
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import os
|
|
5
5
|
import time
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
6
7
|
from contextlib import asynccontextmanager
|
|
8
|
+
from functools import lru_cache
|
|
7
9
|
from typing import Any, AsyncGenerator, Dict, Optional
|
|
8
10
|
|
|
9
11
|
import aiohttp
|
|
@@ -17,6 +19,7 @@ from rasa.builder.guardrails.constants import (
|
|
|
17
19
|
)
|
|
18
20
|
from rasa.builder.guardrails.exceptions import GuardrailsError
|
|
19
21
|
from rasa.builder.guardrails.models import (
|
|
22
|
+
GuardrailRequest,
|
|
20
23
|
GuardrailResponse,
|
|
21
24
|
LakeraGuardrailRequest,
|
|
22
25
|
LakeraGuardrailResponse,
|
|
@@ -25,7 +28,52 @@ from rasa.builder.guardrails.models import (
|
|
|
25
28
|
structlogger = structlog.get_logger()
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
class
|
|
31
|
+
class GuardrailsClient(ABC):
|
|
32
|
+
"""Abstract base class for guardrails clients."""
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def guard_endpoint(self) -> str:
|
|
37
|
+
"""Get the guard endpoint for the guardrails API."""
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
async def send_request(self, request: GuardrailRequest) -> GuardrailResponse:
|
|
42
|
+
"""Send a request to the guardrails provider.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
request: The guardrail request to send to the provider.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
GuardrailResponse with the results of the check.
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
GuardrailsError: If the request fails for any reason.
|
|
52
|
+
"""
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
@lru_cache(maxsize=512)
|
|
56
|
+
def schedule_check(
|
|
57
|
+
self,
|
|
58
|
+
request: GuardrailRequest,
|
|
59
|
+
) -> "asyncio.Task[GuardrailResponse]":
|
|
60
|
+
"""Return a cached asyncio.Task that resolves to guardrail response.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
request: The guardrail request to send to the provider.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
An asyncio Task that resolves to a GuardrailResponse.
|
|
67
|
+
"""
|
|
68
|
+
structlogger.debug(
|
|
69
|
+
"guardrails.schedule_check.cache_miss",
|
|
70
|
+
request=request.model_dump(),
|
|
71
|
+
)
|
|
72
|
+
loop = asyncio.get_running_loop()
|
|
73
|
+
return loop.create_task(self.send_request(request))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class LakeraAIGuardrails(GuardrailsClient):
|
|
29
77
|
"""Guardrails provider using Lakera AI."""
|
|
30
78
|
|
|
31
79
|
def __init__(
|
|
@@ -36,8 +84,6 @@ class LakeraAIGuardrails:
|
|
|
36
84
|
"""Initialize Lakera guardrails provider.
|
|
37
85
|
|
|
38
86
|
Args:
|
|
39
|
-
severity_threshold: The minimum severity level for the guardrail to flag
|
|
40
|
-
the user request as unsafe.
|
|
41
87
|
api_key: Lakera AI API key.
|
|
42
88
|
base_url: Optional base URL for the API. If not provided, the default
|
|
43
89
|
Lakera API URL (https://api.lakera.ai/v2) will be used.
|
|
@@ -100,7 +146,7 @@ class LakeraAIGuardrails:
|
|
|
100
146
|
)
|
|
101
147
|
return {"Authorization": f"Bearer {self._api_key}"}
|
|
102
148
|
|
|
103
|
-
async def send_request(self, request:
|
|
149
|
+
async def send_request(self, request: GuardrailRequest) -> GuardrailResponse:
|
|
104
150
|
"""Send a request to the Lakera API.
|
|
105
151
|
|
|
106
152
|
Args:
|
|
@@ -113,6 +159,10 @@ class LakeraAIGuardrails:
|
|
|
113
159
|
GuardrailsError: If the request times out or returns a non-200 status code.
|
|
114
160
|
Exception: If the request fails for any other reason.
|
|
115
161
|
"""
|
|
162
|
+
if not isinstance(request, LakeraGuardrailRequest):
|
|
163
|
+
raise GuardrailsError(
|
|
164
|
+
"LakeraAIGuardrails only supports LakeraGuardrailRequest"
|
|
165
|
+
)
|
|
116
166
|
start_time = time.time()
|
|
117
167
|
try:
|
|
118
168
|
async with self._get_session() as session:
|
|
@@ -4,6 +4,9 @@ LAKERA_API_KEY_ENV_VAR = "LAKERA_API_KEY"
|
|
|
4
4
|
LAKERA_GUARD_ENDPOINT = "guard"
|
|
5
5
|
LAKERA_GUARD_RESULTS_ENDPOINT = "guard/results"
|
|
6
6
|
|
|
7
|
+
# Metadata keys for GuardrailRequestKey
|
|
8
|
+
LAKERA_PROJECT_ID_KEY = "lakera_project_id"
|
|
9
|
+
|
|
7
10
|
BLOCK_SCOPE_USER: Literal["user"] = "user"
|
|
8
11
|
BLOCK_SCOPE_PROJECT: Literal["project"] = "project"
|
|
9
12
|
BlockScope = Literal["user", "project"]
|
|
@@ -19,6 +19,29 @@ class GuardrailType(Enum):
|
|
|
19
19
|
OTHER = "other"
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
class GuardrailRequestKey(BaseModel):
|
|
23
|
+
user_text: str
|
|
24
|
+
hello_rasa_user_id: str = ""
|
|
25
|
+
hello_rasa_project_id: str = ""
|
|
26
|
+
# Generic metadata field for provider-specific configurations
|
|
27
|
+
metadata: Dict[str, str] = Field(default_factory=dict)
|
|
28
|
+
|
|
29
|
+
# hashable by value
|
|
30
|
+
model_config = ConfigDict(frozen=True)
|
|
31
|
+
|
|
32
|
+
def __hash__(self) -> int:
|
|
33
|
+
"""Custom hash implementation that handles the metadata dictionary."""
|
|
34
|
+
# Convert metadata dict to a sorted tuple of items for consistent hashing
|
|
35
|
+
metadata_tuple = tuple(sorted(self.metadata.items())) if self.metadata else ()
|
|
36
|
+
hash_tuple = (
|
|
37
|
+
self.user_text,
|
|
38
|
+
self.hello_rasa_user_id,
|
|
39
|
+
self.hello_rasa_project_id,
|
|
40
|
+
tuple(sorted(metadata_tuple)),
|
|
41
|
+
)
|
|
42
|
+
return hash(hash_tuple)
|
|
43
|
+
|
|
44
|
+
|
|
22
45
|
class GuardrailRequest(BaseModel, ABC):
|
|
23
46
|
"""Request for guardrails check."""
|
|
24
47
|
|
|
@@ -72,6 +95,9 @@ class LakeraGuardrailRequest(GuardrailRequest):
|
|
|
72
95
|
),
|
|
73
96
|
)
|
|
74
97
|
|
|
98
|
+
# Make the model hashable by value for use as cache keys in @lru_cache decorator.
|
|
99
|
+
model_config = ConfigDict(frozen=True)
|
|
100
|
+
|
|
75
101
|
def to_json_payload(self) -> Dict[str, Any]:
|
|
76
102
|
"""Convert the request to a JSON payload to be sent to the Lakera endpoint."""
|
|
77
103
|
metadata = self.metadata or {}
|
|
@@ -91,6 +117,25 @@ class LakeraGuardrailRequest(GuardrailRequest):
|
|
|
91
117
|
|
|
92
118
|
return json_payload
|
|
93
119
|
|
|
120
|
+
def __hash__(self) -> int:
|
|
121
|
+
"""Custom hash implementation that handles the messages list."""
|
|
122
|
+
# Convert messages list to a tuple for consistent hashing
|
|
123
|
+
if self.messages:
|
|
124
|
+
messages_tuple = tuple(tuple(msg.items()) for msg in self.messages)
|
|
125
|
+
else:
|
|
126
|
+
messages_tuple = ()
|
|
127
|
+
|
|
128
|
+
hash_tuple = (
|
|
129
|
+
self.hello_rasa_user_id,
|
|
130
|
+
self.hello_rasa_project_id,
|
|
131
|
+
self.lakera_project_id,
|
|
132
|
+
self.payload,
|
|
133
|
+
self.breakdown,
|
|
134
|
+
messages_tuple,
|
|
135
|
+
tuple(sorted(self.metadata.items())) if self.metadata else (),
|
|
136
|
+
)
|
|
137
|
+
return hash(hash_tuple)
|
|
138
|
+
|
|
94
139
|
|
|
95
140
|
class GuardrailDetection(BaseModel):
|
|
96
141
|
"""Represents a single guardrail detection."""
|
|
@@ -189,16 +234,6 @@ class LakeraGuardrailResponse(GuardrailResponse):
|
|
|
189
234
|
return response
|
|
190
235
|
|
|
191
236
|
|
|
192
|
-
class GuardrailRequestKey(BaseModel):
|
|
193
|
-
user_text: str
|
|
194
|
-
hello_rasa_user_id: str = ""
|
|
195
|
-
hello_rasa_project_id: str = ""
|
|
196
|
-
lakera_project_id: str
|
|
197
|
-
|
|
198
|
-
# hashable by value
|
|
199
|
-
model_config = ConfigDict(frozen=True)
|
|
200
|
-
|
|
201
|
-
|
|
202
237
|
class ScopeState(BaseModel):
|
|
203
238
|
blocked_until: Optional[float] = Field(
|
|
204
239
|
default=None,
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import copy
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple, cast
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.builder.copilot.constants import ROLE_COPILOT, ROLE_USER
|
|
8
|
+
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
9
|
+
from rasa.builder.copilot.models import (
|
|
10
|
+
CopilotChatMessage,
|
|
11
|
+
CopilotContext,
|
|
12
|
+
GeneratedContent,
|
|
13
|
+
ResponseCategory,
|
|
14
|
+
)
|
|
15
|
+
from rasa.builder.guardrails.clients import GuardrailsClient
|
|
16
|
+
from rasa.builder.guardrails.models import (
|
|
17
|
+
GuardrailRequestKey,
|
|
18
|
+
GuardrailResponse,
|
|
19
|
+
)
|
|
20
|
+
from rasa.builder.guardrails.utils import (
|
|
21
|
+
create_guardrail_request,
|
|
22
|
+
)
|
|
23
|
+
from rasa.builder.shared.tracker_context import (
|
|
24
|
+
AssistantConversationTurn,
|
|
25
|
+
TrackerContext,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
structlogger = structlog.get_logger()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class GuardrailsPolicyChecker:
|
|
36
|
+
def __init__(self, guardrail_client: GuardrailsClient):
|
|
37
|
+
self.guardrail_client = guardrail_client
|
|
38
|
+
|
|
39
|
+
async def check_assistant_chat_for_policy_violations(
|
|
40
|
+
self,
|
|
41
|
+
tracker_context: TrackerContext,
|
|
42
|
+
hello_rasa_user_id: Optional[str],
|
|
43
|
+
hello_rasa_project_id: Optional[str],
|
|
44
|
+
**kwargs: Any,
|
|
45
|
+
) -> TrackerContext:
|
|
46
|
+
"""Return a sanitised TrackerContext with unsafe turns removed.
|
|
47
|
+
|
|
48
|
+
Only user messages are moderated - assistant messages are assumed safe.
|
|
49
|
+
LRU cache is used, so each unique user text is checked once.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
tracker_context: The TrackerContext containing conversation turns.
|
|
53
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
54
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
55
|
+
**kwargs: Additional parameters for the guardrail request.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
TrackerContext with unsafe turns removed.
|
|
59
|
+
"""
|
|
60
|
+
# Collect (turn_index, user_text) for all turns with a user message
|
|
61
|
+
items = self._format_user_messages_to_assistant(
|
|
62
|
+
tracker_context.conversation_turns
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
flagged_turns = await self._check_user_messages_for_violations(
|
|
66
|
+
items,
|
|
67
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
68
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
69
|
+
log_prefix="assistant_guardrails",
|
|
70
|
+
**kwargs,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if not flagged_turns:
|
|
74
|
+
return tracker_context
|
|
75
|
+
|
|
76
|
+
structlogger.info(
|
|
77
|
+
"guardrails_policy_checker.assistant_guardrails.turns_flagged",
|
|
78
|
+
count=len(flagged_turns),
|
|
79
|
+
turn_indices=sorted(flagged_turns),
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Build a TrackerContext with safe turns
|
|
83
|
+
safe_turns: List[AssistantConversationTurn] = [
|
|
84
|
+
turn
|
|
85
|
+
for idx, turn in enumerate(tracker_context.conversation_turns)
|
|
86
|
+
if idx not in flagged_turns
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
new_tracker_context = copy.deepcopy(tracker_context)
|
|
90
|
+
new_tracker_context.conversation_turns = safe_turns
|
|
91
|
+
return new_tracker_context
|
|
92
|
+
|
|
93
|
+
async def check_copilot_chat_for_policy_violations(
|
|
94
|
+
self,
|
|
95
|
+
context: CopilotContext,
|
|
96
|
+
hello_rasa_user_id: Optional[str],
|
|
97
|
+
hello_rasa_project_id: Optional[str],
|
|
98
|
+
**kwargs: Any,
|
|
99
|
+
) -> Optional[GeneratedContent]:
|
|
100
|
+
"""Check the copilot chat history for guardrail policy violations.
|
|
101
|
+
|
|
102
|
+
Only user messages are moderated – assistant messages are assumed safe.
|
|
103
|
+
LRU cache is used, so each unique user text is checked once.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
context: The CopilotContext containing the copilot chat history.
|
|
107
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
108
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
109
|
+
**kwargs: Additional parameters for the guardrail request.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Returns a default violation response if the system flags any user message,
|
|
113
|
+
otherwise return None.
|
|
114
|
+
"""
|
|
115
|
+
# Collect (index, text) for user messages; skip ones already marked as
|
|
116
|
+
# violations
|
|
117
|
+
items = self._format_user_messages_to_copilot(context.copilot_chat_history)
|
|
118
|
+
|
|
119
|
+
flagged_user_indices = await self._check_user_messages_for_violations(
|
|
120
|
+
items,
|
|
121
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
122
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
123
|
+
log_prefix="copilot_guardrails",
|
|
124
|
+
**kwargs,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
self._annotate_flagged_user_messages(
|
|
128
|
+
context.copilot_chat_history, flagged_user_indices
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if not flagged_user_indices:
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
# Identify the latest user message index in the current request
|
|
135
|
+
last_user_idx: Optional[int] = None
|
|
136
|
+
for i in range(len(context.copilot_chat_history) - 1, -1, -1):
|
|
137
|
+
if getattr(context.copilot_chat_history[i], "role", None) == ROLE_USER:
|
|
138
|
+
last_user_idx = i
|
|
139
|
+
break
|
|
140
|
+
|
|
141
|
+
# Remove flagged user messages and their next copilot messages
|
|
142
|
+
indices_to_remove: Set[int] = set()
|
|
143
|
+
total = len(context.copilot_chat_history)
|
|
144
|
+
for uidx in flagged_user_indices:
|
|
145
|
+
indices_to_remove.add(uidx)
|
|
146
|
+
next_idx = uidx + 1
|
|
147
|
+
if (
|
|
148
|
+
next_idx < total
|
|
149
|
+
and getattr(context.copilot_chat_history[next_idx], "role", None)
|
|
150
|
+
== ROLE_COPILOT
|
|
151
|
+
):
|
|
152
|
+
indices_to_remove.add(next_idx)
|
|
153
|
+
|
|
154
|
+
# Apply sanitization
|
|
155
|
+
filtered_copilot_chat_history = [
|
|
156
|
+
msg
|
|
157
|
+
for i, msg in enumerate(context.copilot_chat_history)
|
|
158
|
+
if i not in indices_to_remove
|
|
159
|
+
]
|
|
160
|
+
if len(filtered_copilot_chat_history) != len(context.copilot_chat_history):
|
|
161
|
+
structlogger.info(
|
|
162
|
+
"guardrails_policy_checker"
|
|
163
|
+
".copilot_guardrails"
|
|
164
|
+
".copilot_chat_history_sanitized",
|
|
165
|
+
removed_indices=sorted(indices_to_remove),
|
|
166
|
+
removed_messages=(
|
|
167
|
+
len(context.copilot_chat_history)
|
|
168
|
+
- len(filtered_copilot_chat_history)
|
|
169
|
+
),
|
|
170
|
+
kept_messages=len(filtered_copilot_chat_history),
|
|
171
|
+
)
|
|
172
|
+
context.copilot_chat_history = filtered_copilot_chat_history
|
|
173
|
+
|
|
174
|
+
# Block only if the latest user message in this request was flagged
|
|
175
|
+
if last_user_idx is not None and last_user_idx in flagged_user_indices:
|
|
176
|
+
return CopilotResponseHandler.respond_to_guardrail_policy_violations()
|
|
177
|
+
|
|
178
|
+
# Otherwise proceed (following messages are respected)
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
async def _check_user_messages_for_violations(
|
|
182
|
+
self,
|
|
183
|
+
items: List[Tuple[int, str]],
|
|
184
|
+
hello_rasa_user_id: Optional[str],
|
|
185
|
+
hello_rasa_project_id: Optional[str],
|
|
186
|
+
log_prefix: str,
|
|
187
|
+
**kwargs: Any,
|
|
188
|
+
) -> Set[int]:
|
|
189
|
+
"""Run guardrail checks for provided (index, user_text) pairs.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
items: List of tuples containing (index, user_text) to check.
|
|
193
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
194
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
195
|
+
log_prefix: Prefix for logging messages.
|
|
196
|
+
**kwargs: Additional parameters for the guardrail request.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
A set of indices that were flagged by the guardrails.
|
|
200
|
+
"""
|
|
201
|
+
if not items:
|
|
202
|
+
return set()
|
|
203
|
+
|
|
204
|
+
# 1) Group indices by logical request key (hashable by value)
|
|
205
|
+
indices_by_key: Dict[GuardrailRequestKey, List[int]] = {}
|
|
206
|
+
for idx, text in items:
|
|
207
|
+
key = GuardrailRequestKey(
|
|
208
|
+
user_text=text,
|
|
209
|
+
hello_rasa_user_id=hello_rasa_user_id or "",
|
|
210
|
+
hello_rasa_project_id=hello_rasa_project_id or "",
|
|
211
|
+
# The client-specific request parameters go in the metadata
|
|
212
|
+
# so that they can be used to create the request
|
|
213
|
+
metadata=kwargs,
|
|
214
|
+
)
|
|
215
|
+
if not key.user_text:
|
|
216
|
+
continue
|
|
217
|
+
indices_by_key.setdefault(key, []).append(idx)
|
|
218
|
+
|
|
219
|
+
if not indices_by_key:
|
|
220
|
+
return set()
|
|
221
|
+
|
|
222
|
+
# 2) Create one task per logical key
|
|
223
|
+
tasks_by_key: Dict[GuardrailRequestKey, asyncio.Task[GuardrailResponse]] = {}
|
|
224
|
+
for key in indices_by_key:
|
|
225
|
+
request = create_guardrail_request(
|
|
226
|
+
client_type=type(self.guardrail_client),
|
|
227
|
+
user_text=key.user_text,
|
|
228
|
+
hello_rasa_user_id=key.hello_rasa_user_id,
|
|
229
|
+
hello_rasa_project_id=key.hello_rasa_project_id,
|
|
230
|
+
**kwargs,
|
|
231
|
+
)
|
|
232
|
+
tasks_by_key[key] = self.guardrail_client.schedule_check(request)
|
|
233
|
+
|
|
234
|
+
# 3) Await unique tasks once
|
|
235
|
+
keys = list(tasks_by_key.keys())
|
|
236
|
+
tasks = [tasks_by_key[k] for k in keys]
|
|
237
|
+
responses = await asyncio.gather(*tasks, return_exceptions=True)
|
|
238
|
+
|
|
239
|
+
# 4) Map results back to all corresponding indices
|
|
240
|
+
flagged: Set[int] = set()
|
|
241
|
+
for key, response in zip(keys, responses):
|
|
242
|
+
if isinstance(response, Exception):
|
|
243
|
+
structlogger.warning(
|
|
244
|
+
f"{log_prefix}.request_failed", error=str(response)
|
|
245
|
+
)
|
|
246
|
+
continue
|
|
247
|
+
# At this point, response is guaranteed to be GuardrailResponse
|
|
248
|
+
# Use typing.cast to explicitly cast the type
|
|
249
|
+
guardrail_response = cast(GuardrailResponse, response)
|
|
250
|
+
if guardrail_response.flagged:
|
|
251
|
+
flagged.update(indices_by_key.get(key, []))
|
|
252
|
+
|
|
253
|
+
return flagged
|
|
254
|
+
|
|
255
|
+
def _annotate_flagged_user_messages(
|
|
256
|
+
self,
|
|
257
|
+
copilot_chat_history: List[CopilotChatMessage],
|
|
258
|
+
flagged_user_indices: Set[int],
|
|
259
|
+
) -> None:
|
|
260
|
+
"""Mark flagged user messages in-place on the original copilot chat history.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
copilot_chat_history: The copilot chat history containing messages.
|
|
264
|
+
flagged_user_indices: Set of indices of user messages that were flagged.
|
|
265
|
+
"""
|
|
266
|
+
if not flagged_user_indices:
|
|
267
|
+
return
|
|
268
|
+
|
|
269
|
+
total = len(copilot_chat_history)
|
|
270
|
+
for uidx in flagged_user_indices:
|
|
271
|
+
if 0 <= uidx < total and copilot_chat_history[uidx].role == ROLE_USER:
|
|
272
|
+
copilot_chat_history[
|
|
273
|
+
uidx
|
|
274
|
+
].response_category = ResponseCategory.GUARDRAILS_POLICY_VIOLATION
|
|
275
|
+
|
|
276
|
+
def _format_user_messages_to_assistant(
|
|
277
|
+
self, conversation_turns: List[AssistantConversationTurn]
|
|
278
|
+
) -> List[Tuple[int, str]]:
|
|
279
|
+
"""Collect (turn_index, user_text) tuples for all turns with user messages.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
conversation_turns: The list of conversation turns.
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
List of tuples containing (turn_index, user_text) for valid user messages.
|
|
286
|
+
"""
|
|
287
|
+
items: List[Tuple[int, str]] = []
|
|
288
|
+
for idx, turn in enumerate(conversation_turns):
|
|
289
|
+
user_message = turn.user_message
|
|
290
|
+
if not user_message:
|
|
291
|
+
continue
|
|
292
|
+
|
|
293
|
+
text = (user_message.text or "").strip()
|
|
294
|
+
if not text:
|
|
295
|
+
continue
|
|
296
|
+
|
|
297
|
+
items.append((idx, text))
|
|
298
|
+
|
|
299
|
+
return items
|
|
300
|
+
|
|
301
|
+
def _format_user_messages_to_copilot(
|
|
302
|
+
self, copilot_chat_history: List[CopilotChatMessage]
|
|
303
|
+
) -> List[Tuple[int, str]]:
|
|
304
|
+
"""Collect (index, user_text) tuples for all messages with user messages.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
copilot_chat_history: The list of messages.
|
|
308
|
+
"""
|
|
309
|
+
items: List[Tuple[int, str]] = []
|
|
310
|
+
for idx, message in enumerate(copilot_chat_history):
|
|
311
|
+
if (
|
|
312
|
+
message.response_category
|
|
313
|
+
== ResponseCategory.GUARDRAILS_POLICY_VIOLATION
|
|
314
|
+
):
|
|
315
|
+
continue
|
|
316
|
+
if message.role != ROLE_USER:
|
|
317
|
+
continue
|
|
318
|
+
formatted_message = message.to_openai_format()
|
|
319
|
+
text = (formatted_message.get("content") or "").strip()
|
|
320
|
+
if not text:
|
|
321
|
+
continue
|
|
322
|
+
items.append((idx, text))
|
|
323
|
+
|
|
324
|
+
return items
|