rasa-pro 3.14.0.dev6__py3-none-any.whl → 3.14.0.dev8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/agents/agent_manager.py +1 -1
- rasa/agents/constants.py +2 -2
- rasa/agents/exceptions.py +31 -1
- rasa/agents/protocol/a2a/a2a_agent.py +385 -227
- rasa/agents/protocol/mcp/mcp_base_agent.py +37 -19
- rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
- rasa/agents/protocol/mcp/mcp_task_agent.py +33 -10
- rasa/agents/schemas/agent_output.py +1 -1
- rasa/agents/utils.py +95 -1
- rasa/agents/validation.py +484 -0
- rasa/api.py +9 -6
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +92 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +31 -0
- rasa/builder/copilot/copilot.py +450 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +500 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +210 -0
- rasa/builder/copilot/templated_messages/__init__.py +0 -0
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
- rasa/builder/document_retrieval/__init__.py +0 -0
- rasa/builder/document_retrieval/constants.py +15 -0
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
- rasa/builder/document_retrieval/models.py +62 -0
- rasa/builder/download.py +140 -0
- rasa/builder/exceptions.py +91 -0
- rasa/builder/guardrails/__init__.py +1 -0
- rasa/builder/guardrails/constants.py +9 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/lakera.py +206 -0
- rasa/builder/guardrails/models.py +231 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +328 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +282 -0
- rasa/builder/llm_service.py +246 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +243 -0
- rasa/builder/models.py +216 -0
- rasa/builder/project_generator.py +458 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/service.py +1345 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +244 -0
- rasa/builder/training_service.py +194 -0
- rasa/builder/validation_service.py +97 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/interactive.py +2 -0
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/__init__ +0 -0
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +29 -0
- rasa/cli/project_templates/basic/credentials.yml +33 -0
- rasa/cli/project_templates/basic/data/data.md +9 -0
- rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
- rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
- rasa/cli/project_templates/basic/data/general/help.yml +6 -0
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/basic/docs/docs.md +5 -0
- rasa/cli/project_templates/basic/docs/template.txt +28 -0
- rasa/cli/project_templates/basic/domain/domain.md +8 -0
- rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
- rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
- rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
- rasa/cli/project_templates/basic/endpoints.yml +67 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- 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 +25 -0
- rasa/cli/project_templates/finance/actions/__init__.py +46 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
- rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
- rasa/cli/project_templates/finance/actions/database.py +277 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
- rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
- rasa/cli/project_templates/finance/config.yml +23 -0
- rasa/cli/project_templates/finance/credentials.yml +32 -0
- rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
- rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
- rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
- rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
- rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
- rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
- rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
- rasa/cli/project_templates/finance/csvs/users.csv +4 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
- rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
- rasa/cli/project_templates/finance/data/data.md +11 -0
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
- rasa/cli/project_templates/finance/data/general/help.yml +9 -0
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
- rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
- rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
- rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
- rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
- rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
- rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
- rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
- rasa/cli/project_templates/finance/domain/domain.md +10 -0
- rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
- rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
- rasa/cli/project_templates/finance/endpoints.yml +66 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
- rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
- rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
- rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
- rasa/cli/project_templates/telco/config.yml +29 -0
- rasa/cli/project_templates/telco/credentials.yml +33 -0
- rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
- rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
- rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
- rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
- rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
- rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
- rasa/cli/project_templates/telco/docs/docs.md +5 -0
- rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
- rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
- rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
- rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
- rasa/cli/project_templates/telco/domain/domain.md +14 -0
- rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
- rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
- rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
- rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
- rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
- rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
- rasa/cli/project_templates/telco/domain/shared.yml +129 -0
- rasa/cli/project_templates/telco/endpoints.yml +67 -0
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
- 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/config.yml +2 -1
- rasa/cli/scaffold.py +46 -2
- rasa/cli/train.py +2 -0
- rasa/cli/utils.py +85 -1
- rasa/core/actions/action.py +2 -7
- rasa/core/available_agents.py +49 -26
- rasa/core/available_endpoints.py +17 -2
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +2 -22
- rasa/core/channels/inspector/README.md +26 -14
- rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-edef10dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-df71a04c.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-1c669cad.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-9813e81c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-d8ba0870.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-e1dc03e5.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-790ef78b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-ecdce073.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-837fd3aa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-7e05afcb.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-162eb295.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-41529fd5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-b5b53234.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-13d138e5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-94cbde3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +2 -2
- rasa/core/channels/inspector/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +42 -44
- 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} +8 -8
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- 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/types.ts +49 -7
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +59 -57
- 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 +53 -3
- rasa/core/channels/voice_stream/genesys.py +2 -1
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
- rasa/core/channels/voice_stream/voice_channel.py +66 -3
- rasa/core/constants.py +6 -0
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
- rasa/core/policies/enterprise_search_policy.py +4 -7
- rasa/core/policies/flows/flow_executor.py +66 -36
- rasa/core/policies/ted_policy.py +7 -5
- rasa/core/processor.py +32 -0
- rasa/core/redis_connection_factory.py +411 -0
- rasa/core/run.py +13 -3
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +2 -81
- rasa/dialogue_understanding/commands/start_flow_command.py +18 -113
- rasa/dialogue_understanding/commands/utils.py +118 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +185 -114
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +18 -24
- rasa/dialogue_understanding/processor/command_processor.py +35 -0
- rasa/dialogue_understanding/stack/utils.py +43 -4
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/engine/graph.py +5 -1
- rasa/engine/recipes/default_components.py +78 -10
- rasa/engine/recipes/default_recipe.py +41 -1
- rasa/engine/storage/local_model_storage.py +83 -3
- rasa/graph_components/validators/default_recipe_validator.py +153 -135
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +20 -15
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +1 -1
- rasa/model_training.py +22 -6
- rasa/nlu/classifiers/diet_classifier.py +22 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
- rasa/nlu/extractors/extractor.py +1 -2
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +74 -0
- rasa/shared/agents/auth/agent_auth_manager.py +86 -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 +159 -0
- rasa/shared/agents/auth/constants.py +11 -0
- rasa/shared/agents/auth/types.py +11 -0
- rasa/shared/constants.py +3 -0
- rasa/shared/core/constants.py +6 -6
- rasa/shared/core/domain.py +58 -11
- rasa/shared/core/events.py +2 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +6 -0
- rasa/shared/core/flows/steps/call.py +15 -12
- rasa/shared/core/flows/validation.py +238 -44
- rasa/shared/core/flows/yaml_flows_io.py +15 -6
- rasa/shared/core/slots.py +4 -0
- rasa/shared/exceptions.py +12 -0
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/utils.py +77 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/_utils.py +60 -44
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
- rasa/shared/providers/llm/_base_litellm_client.py +2 -2
- rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
- rasa/shared/providers/llm/llm_response.py +4 -4
- rasa/shared/utils/common.py +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +2 -1
- rasa/shared/utils/mcp/server_connection.py +108 -27
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/studio/upload.py +16 -47
- rasa/telemetry.py +97 -23
- rasa/tracing/config.py +38 -12
- rasa/tracing/instrumentation/attribute_extractors.py +5 -1
- rasa/tracing/instrumentation/instrumentation.py +85 -8
- rasa/utils/common.py +1 -1
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +5 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/tensorflow/__init__.py +29 -0
- rasa/utils/tensorflow/callback.py +1 -1
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +11 -4
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +41 -6
- rasa/utils/tensorflow/rasa_layers.py +6 -4
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +68 -38
- rasa/validator.py +18 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +486 -173
- rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-3e293924.js +0 -1353
- rasa_pro-3.14.0.dev6.dist-info/METADATA +0 -190
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import re
|
|
3
|
+
from collections import deque
|
|
4
|
+
from typing import AsyncGenerator, Deque, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.builder.copilot.copilot_templated_message_provider import (
|
|
9
|
+
load_copilot_handler_default_responses,
|
|
10
|
+
)
|
|
11
|
+
from rasa.builder.copilot.exceptions import (
|
|
12
|
+
CopilotFinalBufferReached,
|
|
13
|
+
CopilotStreamEndedEarly,
|
|
14
|
+
)
|
|
15
|
+
from rasa.builder.copilot.models import (
|
|
16
|
+
CopilotOutput,
|
|
17
|
+
GeneratedContent,
|
|
18
|
+
ReferenceEntry,
|
|
19
|
+
ReferenceSection,
|
|
20
|
+
ResponseCategory,
|
|
21
|
+
ResponseCompleteness,
|
|
22
|
+
)
|
|
23
|
+
from rasa.builder.document_retrieval.models import Document
|
|
24
|
+
from rasa.builder.guardrails.constants import BLOCK_SCOPE_USER, BlockScope
|
|
25
|
+
|
|
26
|
+
structlogger = structlog.get_logger()
|
|
27
|
+
|
|
28
|
+
# Controlled prediction markers
|
|
29
|
+
ROLEPLAY_PREDICTION = "[ROLEPLAY_REQUEST_DETECTED]"
|
|
30
|
+
OUT_OF_SCOPE_PREDICTION = "[OUT_OF_SCOPE_REQUEST_DETECTED]"
|
|
31
|
+
ERROR_FALLBACK_PREDICTION = "[ERROR_FALLBACK]"
|
|
32
|
+
KNOWLEDGE_BASE_ACCESS_REQUESTED_PREDICTION = "[NO_KNOWLEDGE_BASE_ACCESS]"
|
|
33
|
+
|
|
34
|
+
# Load predefined for controlled predictions from YAML
|
|
35
|
+
_handler_responses = load_copilot_handler_default_responses()
|
|
36
|
+
|
|
37
|
+
# Prediction marker to response mapping
|
|
38
|
+
PREDICTION_RESPONSES = {
|
|
39
|
+
ROLEPLAY_PREDICTION: (
|
|
40
|
+
_handler_responses.get("roleplay_response", ""),
|
|
41
|
+
ResponseCategory.ROLEPLAY_DETECTION,
|
|
42
|
+
),
|
|
43
|
+
OUT_OF_SCOPE_PREDICTION: (
|
|
44
|
+
_handler_responses.get("out_of_scope_response", ""),
|
|
45
|
+
ResponseCategory.OUT_OF_SCOPE_DETECTION,
|
|
46
|
+
),
|
|
47
|
+
ERROR_FALLBACK_PREDICTION: (
|
|
48
|
+
_handler_responses.get("error_fallback_response", ""),
|
|
49
|
+
ResponseCategory.ERROR_FALLBACK,
|
|
50
|
+
),
|
|
51
|
+
KNOWLEDGE_BASE_ACCESS_REQUESTED_PREDICTION: (
|
|
52
|
+
_handler_responses.get("knowledge_base_access_requested_response", ""),
|
|
53
|
+
ResponseCategory.KNOWLEDGE_BASE_ACCESS_REQUESTED,
|
|
54
|
+
),
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# Other response constants
|
|
58
|
+
GUARDRAIL_POLICY_VIOLATION_RESPONSE = _handler_responses.get(
|
|
59
|
+
"guardrail_policy_violation_response", ""
|
|
60
|
+
)
|
|
61
|
+
COPILOT_REDACTED_MESSAGE = _handler_responses.get("copilot_redacted_message", "")
|
|
62
|
+
|
|
63
|
+
# Guardrails blocked responses
|
|
64
|
+
GUARDRAIL_BLOCKED_USER_RESPONSE = _handler_responses.get(
|
|
65
|
+
"guardrail_blocked_user_response", ""
|
|
66
|
+
)
|
|
67
|
+
GUARDRAIL_BLOCKED_PROJECT_RESPONSE = _handler_responses.get(
|
|
68
|
+
"guardrail_blocked_project_response", ""
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Common LLM response prefixes and suffixes before the actual content. These are removed
|
|
72
|
+
# from the content.
|
|
73
|
+
LLM_PREFIXES_TO_SUFFIX_REMOVE = {
|
|
74
|
+
"```": "```",
|
|
75
|
+
"```markdown": "```",
|
|
76
|
+
'"""': '"""',
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# Regex pattern to match inline citations in the generated markdown.
|
|
80
|
+
INLINE_CITATION_PATTERN = r"\[([^\]]+)\]\(([^)]+)\)"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class CopilotResponseHandler:
|
|
84
|
+
"""Handles the controlled responses from Copilot.
|
|
85
|
+
|
|
86
|
+
This handler manages two types of data:
|
|
87
|
+
- llm_stream_buffer: A list of tokens streamed from the LLM during processing.
|
|
88
|
+
- generated_responses: A list of cleaned responses.
|
|
89
|
+
|
|
90
|
+
Parameters:
|
|
91
|
+
rolling_buffer_size: Size of the rolling buffer for prefix/suffix handling.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(
|
|
95
|
+
self,
|
|
96
|
+
rolling_buffer_size: int = 20,
|
|
97
|
+
):
|
|
98
|
+
self._rolling_buffer_size = rolling_buffer_size
|
|
99
|
+
|
|
100
|
+
# Rolling buffer for handling special tokens and prefix/suffix removal.
|
|
101
|
+
self._rolling_buffer: Deque[str] = deque(maxlen=self._rolling_buffer_size)
|
|
102
|
+
|
|
103
|
+
# A list of tokens streamed from the LLM during processing. Tokens are added
|
|
104
|
+
# to the buffer when the rolling buffer is full.
|
|
105
|
+
self._llm_stream_buffer: List[str] = []
|
|
106
|
+
|
|
107
|
+
# A list of cleaned and generated responses.
|
|
108
|
+
self._generated_responses: List[GeneratedContent] = []
|
|
109
|
+
|
|
110
|
+
# Flag for checking if the stream has ended (raised by the async generator).
|
|
111
|
+
self._stream_ended: bool = False
|
|
112
|
+
# Flag for checking if the stream ended before the max expected special response
|
|
113
|
+
# tokens were reached.
|
|
114
|
+
self._stream_ended_early: bool = False
|
|
115
|
+
|
|
116
|
+
# Maximum number of tokens to check for special responses (e.g. roleplay,
|
|
117
|
+
# out-of-scope, etc.).
|
|
118
|
+
self._max_expected_special_response_tokens: int = 20
|
|
119
|
+
|
|
120
|
+
# Prefix/suffix tracking
|
|
121
|
+
self._stream_started_with_prefix: bool = False
|
|
122
|
+
self._prefix_found: Optional[str] = None
|
|
123
|
+
self._suffix_found: Optional[str] = None
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def llm_stream_buffer(self) -> List[str]:
|
|
127
|
+
return copy.deepcopy(self._llm_stream_buffer)
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def generated_responses(self) -> List[GeneratedContent]:
|
|
131
|
+
return copy.deepcopy(self._generated_responses)
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def llm_stream_buffer_content(self) -> str:
|
|
135
|
+
return "".join(self._llm_stream_buffer)
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def token_count(self) -> int:
|
|
139
|
+
return len(self._llm_stream_buffer)
|
|
140
|
+
|
|
141
|
+
def clear_buffers(self) -> None:
|
|
142
|
+
"""Clear all buffers and reset the handler."""
|
|
143
|
+
self._rolling_buffer.clear()
|
|
144
|
+
self._llm_stream_buffer.clear()
|
|
145
|
+
self._generated_responses.clear()
|
|
146
|
+
self._stream_started_with_prefix = False
|
|
147
|
+
self._prefix_found = None
|
|
148
|
+
self._suffix_found = None
|
|
149
|
+
self._stream_ended = False
|
|
150
|
+
|
|
151
|
+
async def _buffer_stream(
|
|
152
|
+
self, response_stream: AsyncGenerator[str, None]
|
|
153
|
+
) -> AsyncGenerator[str, None]:
|
|
154
|
+
"""Wrapper that performs rolling buffer handling and automatically saves chunks.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
response_stream: The original streaming response from the LLM.
|
|
158
|
+
|
|
159
|
+
Yields:
|
|
160
|
+
The same chunks from the original stream, but persisted in the buffer.
|
|
161
|
+
|
|
162
|
+
Raises:
|
|
163
|
+
StopAsyncIteration: If the stream has ended.
|
|
164
|
+
"""
|
|
165
|
+
try:
|
|
166
|
+
while True:
|
|
167
|
+
# Get the next chunk from LLM stream and add it to the rolling buffer
|
|
168
|
+
# and the LLM stream buffer.
|
|
169
|
+
chunk = await response_stream.__anext__()
|
|
170
|
+
self._rolling_buffer.append(chunk)
|
|
171
|
+
|
|
172
|
+
# Only yield when buffer is full to maintain the rolling buffer
|
|
173
|
+
# behavior
|
|
174
|
+
if len(self._rolling_buffer) == self._rolling_buffer_size:
|
|
175
|
+
# Yield the oldest element.
|
|
176
|
+
oldest_element = self._rolling_buffer.popleft()
|
|
177
|
+
self._llm_stream_buffer.append(oldest_element)
|
|
178
|
+
yield oldest_element
|
|
179
|
+
|
|
180
|
+
except StopAsyncIteration:
|
|
181
|
+
self._llm_stream_buffer.extend(self._rolling_buffer)
|
|
182
|
+
self._stream_ended = True
|
|
183
|
+
# Need to raise a new instance of StopAsyncIteration to avoid the
|
|
184
|
+
# RuntimeError: generator raised StopIteration
|
|
185
|
+
raise CopilotFinalBufferReached()
|
|
186
|
+
|
|
187
|
+
except Exception as e:
|
|
188
|
+
structlogger.exception(
|
|
189
|
+
"copilot_response_handler._buffer_stream.unexpected_error",
|
|
190
|
+
)
|
|
191
|
+
raise e
|
|
192
|
+
|
|
193
|
+
async def handle_response(
|
|
194
|
+
self, response_stream: AsyncGenerator[str, None]
|
|
195
|
+
) -> AsyncGenerator[CopilotOutput, None]:
|
|
196
|
+
"""Intercept a streaming response and handle special responses from the Copilot.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
response_stream: The original streaming response from the LLM.
|
|
200
|
+
|
|
201
|
+
Yields:
|
|
202
|
+
ResponseEvent objects representing either generated tokens, default
|
|
203
|
+
responses, or reference sections.
|
|
204
|
+
"""
|
|
205
|
+
# Clear the stream buffer and reference buffer at the start
|
|
206
|
+
self.clear_buffers()
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
# Exhaust the buffer early to check for controlled predictions and prefix
|
|
210
|
+
# detection.
|
|
211
|
+
await self._exhaust_buffer_for_early_detection(response_stream)
|
|
212
|
+
|
|
213
|
+
# Check for controlled predictions in the collected tokens
|
|
214
|
+
controlled_response = self._check_for_controlled_predictions(
|
|
215
|
+
self.llm_stream_buffer_content,
|
|
216
|
+
)
|
|
217
|
+
if controlled_response is not None:
|
|
218
|
+
self._generated_responses.append(controlled_response)
|
|
219
|
+
yield controlled_response
|
|
220
|
+
return
|
|
221
|
+
|
|
222
|
+
# At this point, no controlled predictions were found. Check if the stream
|
|
223
|
+
# started with a prefix and if present, remove it. Yield the clean content.
|
|
224
|
+
initial_content = self._remove_prefix(self.llm_stream_buffer_content)
|
|
225
|
+
if initial_content:
|
|
226
|
+
generated_content = GeneratedContent(
|
|
227
|
+
content=initial_content,
|
|
228
|
+
response_category=ResponseCategory.COPILOT,
|
|
229
|
+
response_completeness=ResponseCompleteness.TOKEN,
|
|
230
|
+
)
|
|
231
|
+
self._generated_responses.append(generated_content)
|
|
232
|
+
yield generated_content
|
|
233
|
+
|
|
234
|
+
# Continue streaming remaining chunks with rolling buffer handling
|
|
235
|
+
async for chunk in self._buffer_stream(response_stream):
|
|
236
|
+
generated_content = GeneratedContent(
|
|
237
|
+
content=chunk,
|
|
238
|
+
response_category=ResponseCategory.COPILOT,
|
|
239
|
+
response_completeness=ResponseCompleteness.TOKEN,
|
|
240
|
+
)
|
|
241
|
+
self._generated_responses.append(generated_content)
|
|
242
|
+
yield generated_content
|
|
243
|
+
|
|
244
|
+
# Stream ended early
|
|
245
|
+
except CopilotStreamEndedEarly:
|
|
246
|
+
# Check for controlled predictions in the collected tokens
|
|
247
|
+
controlled_response = self._check_for_controlled_predictions(
|
|
248
|
+
self.llm_stream_buffer_content,
|
|
249
|
+
)
|
|
250
|
+
if controlled_response is not None:
|
|
251
|
+
self._generated_responses.append(controlled_response)
|
|
252
|
+
yield controlled_response
|
|
253
|
+
return
|
|
254
|
+
|
|
255
|
+
# At this point, no controlled predictions were found. Clean the content
|
|
256
|
+
# from the prefix and suffix if present.
|
|
257
|
+
final_content = self._remove_prefix_and_suffix(
|
|
258
|
+
self.llm_stream_buffer_content,
|
|
259
|
+
)
|
|
260
|
+
if final_content:
|
|
261
|
+
generated_content = GeneratedContent(
|
|
262
|
+
content=final_content,
|
|
263
|
+
response_category=ResponseCategory.COPILOT,
|
|
264
|
+
response_completeness=ResponseCompleteness.COMPLETE,
|
|
265
|
+
)
|
|
266
|
+
self._generated_responses.append(generated_content)
|
|
267
|
+
yield generated_content
|
|
268
|
+
|
|
269
|
+
# Stream has ended, process the final rolling buffer. Remove the suffix if
|
|
270
|
+
# present.
|
|
271
|
+
except CopilotFinalBufferReached:
|
|
272
|
+
final_content = self._remove_suffix(self.llm_stream_buffer_content)
|
|
273
|
+
if final_content:
|
|
274
|
+
generated_content = GeneratedContent(
|
|
275
|
+
content=final_content,
|
|
276
|
+
response_category=ResponseCategory.COPILOT,
|
|
277
|
+
response_completeness=ResponseCompleteness.COMPLETE,
|
|
278
|
+
)
|
|
279
|
+
self._generated_responses.append(generated_content)
|
|
280
|
+
yield generated_content
|
|
281
|
+
|
|
282
|
+
# Unexpected error occurred.
|
|
283
|
+
except Exception as e:
|
|
284
|
+
structlogger.exception(
|
|
285
|
+
"copilot_response_handler.handle_response.unexpected_error",
|
|
286
|
+
)
|
|
287
|
+
raise e
|
|
288
|
+
|
|
289
|
+
async def _exhaust_buffer_for_early_detection(
|
|
290
|
+
self, response_stream: AsyncGenerator[str, None]
|
|
291
|
+
) -> None:
|
|
292
|
+
"""Exhaust the buffer for early detection.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
response_stream: The original streaming response from the LLM.
|
|
296
|
+
"""
|
|
297
|
+
try:
|
|
298
|
+
async for _ in self._buffer_stream(response_stream):
|
|
299
|
+
if self.token_count >= self._max_expected_special_response_tokens:
|
|
300
|
+
break
|
|
301
|
+
except CopilotFinalBufferReached:
|
|
302
|
+
# The stream ended before the max expected special response tokens
|
|
303
|
+
# were reached.
|
|
304
|
+
raise CopilotStreamEndedEarly()
|
|
305
|
+
|
|
306
|
+
def _check_for_controlled_predictions(
|
|
307
|
+
self, content: str
|
|
308
|
+
) -> Optional[CopilotOutput]:
|
|
309
|
+
"""Check for controlled predictions in the collected tokens.
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
Controlled response if found, None otherwise.
|
|
313
|
+
"""
|
|
314
|
+
# Check for controlled predictions and return appropriate responses
|
|
315
|
+
for prediction_marker, (response, category) in PREDICTION_RESPONSES.items():
|
|
316
|
+
if prediction_marker in content:
|
|
317
|
+
log_message = f"copilot_response_handler.{category.value}_detected"
|
|
318
|
+
structlogger.info(log_message)
|
|
319
|
+
return GeneratedContent(
|
|
320
|
+
response_category=category,
|
|
321
|
+
content=response,
|
|
322
|
+
response_completeness=ResponseCompleteness.COMPLETE,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
return None
|
|
326
|
+
|
|
327
|
+
def _remove_prefix(self, content: str) -> str:
|
|
328
|
+
"""Process the initial content from the buffer, handling prefix removal.
|
|
329
|
+
|
|
330
|
+
Returns:
|
|
331
|
+
Processed content with prefix removed if applicable.
|
|
332
|
+
"""
|
|
333
|
+
# Check if content starts with any of the known prefixes
|
|
334
|
+
for prefix in LLM_PREFIXES_TO_SUFFIX_REMOVE.keys():
|
|
335
|
+
if content.startswith(prefix):
|
|
336
|
+
self._stream_started_with_prefix = True
|
|
337
|
+
self._prefix_found = prefix
|
|
338
|
+
self._code_block_depth = 1
|
|
339
|
+
structlogger.debug(
|
|
340
|
+
"copilot_response_handler.handle_response.prefix_detected",
|
|
341
|
+
prefix=prefix,
|
|
342
|
+
content_length=len(content),
|
|
343
|
+
)
|
|
344
|
+
return content[len(prefix) :]
|
|
345
|
+
|
|
346
|
+
return content
|
|
347
|
+
|
|
348
|
+
def _remove_suffix(self, content: str) -> str:
|
|
349
|
+
"""Process the rolling buffer content, handling suffix removal.
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
Processed content with suffix removed if applicable.
|
|
353
|
+
"""
|
|
354
|
+
# Check if content ends with any of the known suffixes
|
|
355
|
+
for suffix in LLM_PREFIXES_TO_SUFFIX_REMOVE.values():
|
|
356
|
+
if content.endswith(suffix):
|
|
357
|
+
self._stream_ended_with_suffix = True
|
|
358
|
+
self._suffix_found = suffix
|
|
359
|
+
structlogger.debug(
|
|
360
|
+
"copilot_response_handler.handle_response.suffix_detected",
|
|
361
|
+
suffix=suffix,
|
|
362
|
+
content_length=len(content),
|
|
363
|
+
)
|
|
364
|
+
return content[: -len(suffix)]
|
|
365
|
+
|
|
366
|
+
return content
|
|
367
|
+
|
|
368
|
+
def _remove_prefix_and_suffix(self, content: str) -> str:
|
|
369
|
+
"""Remove the prefix and suffix from the content.
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
Processed content with prefix and suffix removed if applicable.
|
|
373
|
+
"""
|
|
374
|
+
content = self._remove_prefix(content)
|
|
375
|
+
content = self._remove_suffix(content)
|
|
376
|
+
return content
|
|
377
|
+
|
|
378
|
+
@staticmethod
|
|
379
|
+
def respond_to_guardrail_policy_violations() -> GeneratedContent:
|
|
380
|
+
"""Respond to guardrail policy violations.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
CopilotOutput object with the response.
|
|
384
|
+
"""
|
|
385
|
+
return GeneratedContent(
|
|
386
|
+
response_category=ResponseCategory.GUARDRAILS_POLICY_VIOLATION,
|
|
387
|
+
content=GUARDRAIL_POLICY_VIOLATION_RESPONSE,
|
|
388
|
+
response_completeness=ResponseCompleteness.COMPLETE,
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
@staticmethod
|
|
392
|
+
def respond_to_guardrail_blocked(scope: BlockScope) -> GeneratedContent:
|
|
393
|
+
"""Return a blocked response for user or project scope.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
scope: 'user' for user-level block, 'project' for project-level block.
|
|
397
|
+
|
|
398
|
+
Returns:
|
|
399
|
+
GeneratedContent with GUARDRAILS_BLOCKED category.
|
|
400
|
+
"""
|
|
401
|
+
content = (
|
|
402
|
+
GUARDRAIL_BLOCKED_USER_RESPONSE
|
|
403
|
+
if scope == BLOCK_SCOPE_USER
|
|
404
|
+
else GUARDRAIL_BLOCKED_PROJECT_RESPONSE
|
|
405
|
+
)
|
|
406
|
+
return GeneratedContent(
|
|
407
|
+
response_category=ResponseCategory.GUARDRAILS_BLOCKED,
|
|
408
|
+
content=content,
|
|
409
|
+
response_completeness=ResponseCompleteness.COMPLETE,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
@staticmethod
|
|
413
|
+
def get_copilot_redacted_message() -> str:
|
|
414
|
+
"""Get the redacted message for copilot responses.
|
|
415
|
+
|
|
416
|
+
Returns:
|
|
417
|
+
Redacted message for copilot responses.
|
|
418
|
+
"""
|
|
419
|
+
return COPILOT_REDACTED_MESSAGE
|
|
420
|
+
|
|
421
|
+
def extract_references(self, documents: List[Document]) -> ReferenceSection:
|
|
422
|
+
"""Extract references from the LLM stream buffer content.
|
|
423
|
+
|
|
424
|
+
This method performs regex matching to find markdown links in the format:
|
|
425
|
+
[text](url).
|
|
426
|
+
|
|
427
|
+
The matched links are validated against the provided documents, and a
|
|
428
|
+
ReferenceSection is returned with valid references.
|
|
429
|
+
|
|
430
|
+
Note:
|
|
431
|
+
This method can only be called after `handle_response` has been called,
|
|
432
|
+
as it relies on the LLM stream buffer content that gets populated
|
|
433
|
+
during the response handling process.
|
|
434
|
+
|
|
435
|
+
Args:
|
|
436
|
+
documents: List of Document objects to match URLs against
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
ReferenceSection containing reference entries ordered by reference text.
|
|
440
|
+
|
|
441
|
+
Raises:
|
|
442
|
+
RuntimeError: If called before `handle_response` has been called.
|
|
443
|
+
"""
|
|
444
|
+
if not self.llm_stream_buffer_content:
|
|
445
|
+
message = (
|
|
446
|
+
"`extract_references` can only be called after `handle_response` "
|
|
447
|
+
"has been called to populate the LLM stream buffer."
|
|
448
|
+
)
|
|
449
|
+
structlogger.error(
|
|
450
|
+
"copilot_response_handler.extract_references.buffer_not_populated",
|
|
451
|
+
event_info=message,
|
|
452
|
+
llm_stream_buffer_content=self.llm_stream_buffer_content,
|
|
453
|
+
)
|
|
454
|
+
raise RuntimeError(message)
|
|
455
|
+
|
|
456
|
+
# Find all matches in the buffered content
|
|
457
|
+
matches = re.findall(INLINE_CITATION_PATTERN, self.llm_stream_buffer_content)
|
|
458
|
+
|
|
459
|
+
# Create document lookup for O(1) access
|
|
460
|
+
document_urls_to_documents: Dict[str, Document] = {
|
|
461
|
+
document.url: document for document in documents if document.url
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
# Use regular dict to collect references, keyed by reference_text
|
|
465
|
+
used_references: Dict[str, ReferenceEntry] = {}
|
|
466
|
+
|
|
467
|
+
for reference_text, reference_url in matches:
|
|
468
|
+
# Validate reference text format
|
|
469
|
+
if not reference_text.isdigit():
|
|
470
|
+
structlogger.warning(
|
|
471
|
+
"copilot_response_handler"
|
|
472
|
+
".extract_references."
|
|
473
|
+
"invalid_reference_number",
|
|
474
|
+
event_info="Reference text is not in expected number format.",
|
|
475
|
+
reference_text=reference_text,
|
|
476
|
+
reference_url=reference_url,
|
|
477
|
+
)
|
|
478
|
+
continue
|
|
479
|
+
|
|
480
|
+
# Check if URL exists in documents
|
|
481
|
+
if reference_url not in document_urls_to_documents:
|
|
482
|
+
structlogger.warning(
|
|
483
|
+
"copilot_response_handler.extract_references.url_not_found",
|
|
484
|
+
event_info=(
|
|
485
|
+
"URL not found in provided documents. Omitted from reference "
|
|
486
|
+
"section.",
|
|
487
|
+
),
|
|
488
|
+
reference_url=reference_url,
|
|
489
|
+
available_urls=list(document_urls_to_documents.keys()),
|
|
490
|
+
)
|
|
491
|
+
continue
|
|
492
|
+
|
|
493
|
+
# Check for duplicate reference text
|
|
494
|
+
# (same reference number used multiple times)
|
|
495
|
+
if reference_text in used_references:
|
|
496
|
+
existing_entry = used_references[reference_text]
|
|
497
|
+
if existing_entry.url != reference_url:
|
|
498
|
+
structlogger.warning(
|
|
499
|
+
"copilot_response_handler.extract_references.duplicate_reference_text",
|
|
500
|
+
event_info=(
|
|
501
|
+
"Same reference text used for different URLs. "
|
|
502
|
+
"Keeping first occurrence."
|
|
503
|
+
),
|
|
504
|
+
reference_text=reference_text,
|
|
505
|
+
first_url=existing_entry.url,
|
|
506
|
+
second_url=reference_url,
|
|
507
|
+
)
|
|
508
|
+
# Skip this duplicate reference text
|
|
509
|
+
continue
|
|
510
|
+
|
|
511
|
+
# Create reference entry
|
|
512
|
+
document = document_urls_to_documents[reference_url]
|
|
513
|
+
used_references[reference_text] = ReferenceEntry(
|
|
514
|
+
index=int(reference_text),
|
|
515
|
+
title=document.title or f"Reference {reference_text}",
|
|
516
|
+
url=reference_url,
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
# Create and sort the reference section
|
|
520
|
+
reference_section = ReferenceSection(references=list(used_references.values()))
|
|
521
|
+
reference_section.sort_references()
|
|
522
|
+
return reference_section
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import importlib.resources
|
|
2
|
+
from typing import Dict
|
|
3
|
+
|
|
4
|
+
import structlog
|
|
5
|
+
import yaml # type: ignore
|
|
6
|
+
|
|
7
|
+
from rasa.builder.copilot.constants import (
|
|
8
|
+
COPILOT_HANDLER_RESPONSES_FILE,
|
|
9
|
+
COPILOT_MESSAGE_TEMPLATES_DIR,
|
|
10
|
+
RASA_INTERNAL_MESSAGES_TEMPLATES_FILE,
|
|
11
|
+
)
|
|
12
|
+
from rasa.shared.constants import PACKAGE_NAME
|
|
13
|
+
|
|
14
|
+
structlogger = structlog.get_logger()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def load_copilot_internal_message_templates() -> Dict[str, str]:
|
|
18
|
+
"""Load internal message templates from the YAML configuration file.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
Dictionary mapping template names to template text.
|
|
22
|
+
"""
|
|
23
|
+
try:
|
|
24
|
+
config = yaml.safe_load(
|
|
25
|
+
importlib.resources.read_text(
|
|
26
|
+
f"{PACKAGE_NAME}.{COPILOT_MESSAGE_TEMPLATES_DIR}",
|
|
27
|
+
RASA_INTERNAL_MESSAGES_TEMPLATES_FILE,
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
return config.get("templates", {})
|
|
31
|
+
except Exception as e:
|
|
32
|
+
structlogger.error(
|
|
33
|
+
"copilot_templated_message_provider.failed_to_load_templates",
|
|
34
|
+
error=e,
|
|
35
|
+
)
|
|
36
|
+
return dict()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def load_copilot_handler_default_responses() -> Dict[str, str]:
|
|
40
|
+
"""Load handler responses from the YAML configuration file.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Dictionary mapping response names to response text.
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
config = yaml.safe_load(
|
|
47
|
+
importlib.resources.read_text(
|
|
48
|
+
f"{PACKAGE_NAME}.{COPILOT_MESSAGE_TEMPLATES_DIR}",
|
|
49
|
+
COPILOT_HANDLER_RESPONSES_FILE,
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
return config.get("responses", {})
|
|
53
|
+
except Exception as e:
|
|
54
|
+
structlogger.error(
|
|
55
|
+
"copilot_response_handler.failed_to_load_responses",
|
|
56
|
+
error=e,
|
|
57
|
+
)
|
|
58
|
+
return dict()
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class CopilotFinalBufferReached(Exception):
|
|
2
|
+
"""Raised when the rolling buffer ends."""
|
|
3
|
+
|
|
4
|
+
pass
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CopilotStreamEndedEarly(Exception):
|
|
8
|
+
"""Raised when the stream ended early.
|
|
9
|
+
|
|
10
|
+
This happens when the stream ended before the max expected special response
|
|
11
|
+
tokens were reached.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CopilotStreamError(Exception):
|
|
18
|
+
"""Raised when the stream fails."""
|
|
19
|
+
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class InvalidCopilotChatHistorySignature(Exception):
|
|
24
|
+
"""Raised when the provided history signature does not match."""
|
|
25
|
+
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MissingCopilotChatHistorySignature(Exception):
|
|
30
|
+
"""Raised when a required history signature is missing."""
|
|
31
|
+
|
|
32
|
+
pass
|