rasa-pro 3.14.0.dev7__py3-none-any.whl → 3.14.0.dev9__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/protocol/a2a/a2a_agent.py +385 -227
- rasa/agents/protocol/mcp/mcp_base_agent.py +30 -13
- rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
- rasa/agents/protocol/mcp/mcp_task_agent.py +32 -9
- rasa/agents/schemas/agent_output.py +1 -1
- rasa/agents/utils.py +90 -1
- 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/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/core/actions/action.py +0 -1
- rasa/core/available_agents.py +2 -0
- 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-cce7e0a8.js → arc-edef10dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-e2a49be7.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-3def7895.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-e66fe4df.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-eb874aaa.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-cf934643.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-8fdf9155.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-6106fb96.js → erDiagram-9861fffd-9813e81c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4c2bb040.js → flowDb-956e92f1-d8ba0870.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f0ff96af.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-a21707ec.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-c165acb1.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-b0564cf1.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-e557e67a.js → graph-790ef78b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-1ce60e9e.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-893569e2.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c29c864f.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-649a5eae.js → layout-837fd3aa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-0e5685ed.js → line-7e05afcb.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-eaa320bd.js → linear-162eb295.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-f35df9e6.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78339e96.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-9b5f2f14.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d05ddb3a.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-d9be5dfd.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0f1c4348.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-9ddf63b3.js → stateDiagram-587899a1-41529fd5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-bc2b81ed.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0a287936.js → styles-6aaf32cf-b5b53234.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-e3941990.js → styles-9a916d00-13d138e5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-ce4eca24.js → styles-c10674c1-94cbde3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d822b1a8.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e144c7a7.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-ab7f4e14.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 +16 -42
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueHistoryStack.tsx +1 -0
- 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/types.ts +32 -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 +14 -5
- 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/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/default_flows_for_patterns.yml +1 -1
- rasa/dialogue_understanding/processor/command_processor.py +35 -0
- 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 +14 -0
- 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/core/constants.py +1 -0
- 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/llm.py +2 -1
- rasa/shared/utils/mcp/server_connection.py +84 -23
- 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.dev9.dist-info/METADATA +199 -0
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev9.dist-info}/RECORD +466 -156
- rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-996fe816.js +0 -1353
- rasa_pro-3.14.0.dev7.dist-info/METADATA +0 -190
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev9.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev9.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev9.dist-info}/entry_points.txt +0 -0
rasa/model_training.py
CHANGED
|
@@ -201,6 +201,20 @@ async def train(
|
|
|
201
201
|
config, domain, training_files, core_additional_arguments
|
|
202
202
|
)
|
|
203
203
|
|
|
204
|
+
# Check TensorFlow availability and warn if not available
|
|
205
|
+
import importlib.util
|
|
206
|
+
|
|
207
|
+
if importlib.util.find_spec("tensorflow") is None:
|
|
208
|
+
structlogger.warning(
|
|
209
|
+
"model_training.train.tensorflow_not_available",
|
|
210
|
+
event_info=(
|
|
211
|
+
"TensorFlow is not installed. Components requiring TensorFlow "
|
|
212
|
+
"(DIETClassifier, TEDPolicy, UnexpecTEDIntentPolicy, ResponseSelector, "
|
|
213
|
+
"ConveRTFeaturizer, LanguageModelFeaturizer) "
|
|
214
|
+
"will not be available."
|
|
215
|
+
),
|
|
216
|
+
)
|
|
217
|
+
|
|
204
218
|
stories = file_importer.get_stories()
|
|
205
219
|
flows = file_importer.get_flows()
|
|
206
220
|
nlu_data = file_importer.get_nlu_data()
|
|
@@ -1070,12 +1070,14 @@ class DIETClassifier(GraphComponent, IntentClassifier, EntityExtractorMixin):
|
|
|
1070
1070
|
|
|
1071
1071
|
with self._model_storage.write_to(self._resource) as model_path:
|
|
1072
1072
|
file_name = self.__class__.__name__
|
|
1073
|
-
tf_model_file = model_path / f"{file_name}.
|
|
1073
|
+
tf_model_file = model_path / f"{file_name}.weights.h5"
|
|
1074
1074
|
|
|
1075
1075
|
rasa.shared.utils.io.create_directory_for_file(tf_model_file)
|
|
1076
1076
|
|
|
1077
1077
|
if self.component_config[CHECKPOINT_MODEL] and self.tmp_checkpoint_dir:
|
|
1078
|
-
self.model.load_weights(
|
|
1078
|
+
self.model.load_weights(
|
|
1079
|
+
self.tmp_checkpoint_dir / "checkpoint.weights.h5"
|
|
1080
|
+
)
|
|
1079
1081
|
# Save an empty file to flag that this model has been
|
|
1080
1082
|
# produced using checkpointing
|
|
1081
1083
|
checkpoint_marker = model_path / f"{file_name}.from_checkpoint.pkl"
|
|
@@ -1247,7 +1249,7 @@ class DIETClassifier(GraphComponent, IntentClassifier, EntityExtractorMixin):
|
|
|
1247
1249
|
finetune_mode: bool = False,
|
|
1248
1250
|
) -> "RasaModel":
|
|
1249
1251
|
file_name = cls.__name__
|
|
1250
|
-
tf_model_file = model_path / f"{file_name}.
|
|
1252
|
+
tf_model_file = model_path / f"{file_name}.weights.h5"
|
|
1251
1253
|
|
|
1252
1254
|
label_key = LABEL_KEY if config[INTENT_CLASSIFICATION] else None
|
|
1253
1255
|
label_sub_key = LABEL_SUB_KEY if config[INTENT_CLASSIFICATION] else None
|
|
@@ -1527,7 +1529,7 @@ class DIET(TransformerRasaModel):
|
|
|
1527
1529
|
# convert to bag-of-words by summing along the sequence dimension
|
|
1528
1530
|
x = tf.reduce_sum(x, axis=1)
|
|
1529
1531
|
|
|
1530
|
-
return self._tf_layers[f"ffnn.{name}"](x, self._training)
|
|
1532
|
+
return self._tf_layers[f"ffnn.{name}"](x, training=self._training)
|
|
1531
1533
|
|
|
1532
1534
|
def _create_all_labels(self) -> Tuple[tf.Tensor, tf.Tensor]:
|
|
1533
1535
|
all_label_ids = self.tf_label_data[LABEL_KEY][LABEL_SUB_KEY][0]
|
|
@@ -1536,9 +1538,23 @@ class DIET(TransformerRasaModel):
|
|
|
1536
1538
|
self.tf_label_data, LABEL
|
|
1537
1539
|
)
|
|
1538
1540
|
|
|
1541
|
+
# Check if SENTENCE features exist, if not use None
|
|
1542
|
+
# This is needed for compatibility with tensorFlow=2.19.1, which
|
|
1543
|
+
# has a transitive dependency on keras=3.11.3, which introduces
|
|
1544
|
+
# stricter data validation
|
|
1545
|
+
sentence_features = None
|
|
1546
|
+
if SENTENCE in self.tf_label_data[LABEL]:
|
|
1547
|
+
sentence_features = self.tf_label_data[LABEL][SENTENCE]
|
|
1548
|
+
|
|
1549
|
+
# Handle missing SEQUENCE features for Keras 3+ compatibility,
|
|
1550
|
+
# which introduces stricter data validation
|
|
1551
|
+
sequence_features = None
|
|
1552
|
+
if SEQUENCE in self.tf_label_data[LABEL]:
|
|
1553
|
+
sequence_features = self.tf_label_data[LABEL][SEQUENCE]
|
|
1554
|
+
|
|
1539
1555
|
x = self._create_bow(
|
|
1540
|
-
|
|
1541
|
-
|
|
1556
|
+
sequence_features,
|
|
1557
|
+
sentence_features,
|
|
1542
1558
|
sequence_feature_lengths,
|
|
1543
1559
|
self.label_name,
|
|
1544
1560
|
)
|
|
@@ -21,6 +21,21 @@ from rasa.utils.tensorflow.constants import RANKING_LENGTH
|
|
|
21
21
|
structlogger = structlog.get_logger()
|
|
22
22
|
|
|
23
23
|
|
|
24
|
+
def _check_skops_dependency() -> None:
|
|
25
|
+
"""Check if skops is available and raise error if not."""
|
|
26
|
+
import importlib.util
|
|
27
|
+
|
|
28
|
+
if importlib.util.find_spec("skops") is None:
|
|
29
|
+
from rasa.exceptions import MissingDependencyException
|
|
30
|
+
|
|
31
|
+
raise MissingDependencyException(
|
|
32
|
+
"The LogisticRegressionClassifier requires the 'skops' package "
|
|
33
|
+
"to save and load trained models. "
|
|
34
|
+
"To install it, run: `pip install rasa[skops]` or `pip install skops`. "
|
|
35
|
+
"If using poetry, run `poetry install --extras skops`. "
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
24
39
|
@DefaultV1Recipe.register(
|
|
25
40
|
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=True
|
|
26
41
|
)
|
|
@@ -151,6 +166,7 @@ class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
|
|
|
151
166
|
execution_context: ExecutionContext,
|
|
152
167
|
) -> "LogisticRegressionClassifier":
|
|
153
168
|
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
169
|
+
_check_skops_dependency()
|
|
154
170
|
return cls(config, execution_context.node_name, model_storage, resource)
|
|
155
171
|
|
|
156
172
|
def process(self, messages: List[Message]) -> List[Message]:
|
|
@@ -183,6 +199,7 @@ class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
|
|
|
183
199
|
|
|
184
200
|
def persist(self) -> None:
|
|
185
201
|
"""Persist this model into the passed directory."""
|
|
202
|
+
_check_skops_dependency()
|
|
186
203
|
import skops.io as sio
|
|
187
204
|
|
|
188
205
|
with self._model_storage.write_to(self._resource) as model_dir:
|
|
@@ -203,6 +220,7 @@ class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
|
|
|
203
220
|
**kwargs: Any,
|
|
204
221
|
) -> "LogisticRegressionClassifier":
|
|
205
222
|
"""Loads trained component (see parent class for full docstring)."""
|
|
223
|
+
_check_skops_dependency()
|
|
206
224
|
import skops.io as sio
|
|
207
225
|
|
|
208
226
|
try:
|
rasa/nlu/extractors/extractor.py
CHANGED
|
@@ -2,8 +2,7 @@ import abc
|
|
|
2
2
|
from typing import Any, Dict, List, NamedTuple, Optional, Text, Tuple
|
|
3
3
|
|
|
4
4
|
import rasa.shared.utils.io
|
|
5
|
-
|
|
6
|
-
# import rasa.utils.train_utils
|
|
5
|
+
import rasa.utils.train_utils
|
|
7
6
|
from rasa.nlu.constants import (
|
|
8
7
|
ENTITY_ATTRIBUTE_CONFIDENCE_GROUP,
|
|
9
8
|
ENTITY_ATTRIBUTE_CONFIDENCE_ROLE,
|
|
File without changes
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Factory for creating authentication strategy instances based on the strategy type."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, ClassVar, Dict, Optional, Type
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.shared.agents.auth.auth_strategy import (
|
|
8
|
+
AgentAuthStrategy,
|
|
9
|
+
APIKeyAuthStrategy,
|
|
10
|
+
BearerTokenAuthStrategy,
|
|
11
|
+
OAuth2AuthStrategy,
|
|
12
|
+
)
|
|
13
|
+
from rasa.shared.agents.auth.types import AgentAuthType
|
|
14
|
+
|
|
15
|
+
structlogger = structlog.get_logger()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AgentAuthFactory:
|
|
19
|
+
"""Factory for creating authentication strategy instances based on the
|
|
20
|
+
authentication strategy type.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
_auth_strategies: ClassVar[Dict[AgentAuthType, Type[AgentAuthStrategy]]] = {
|
|
24
|
+
AgentAuthType.API_KEY: APIKeyAuthStrategy,
|
|
25
|
+
AgentAuthType.OAUTH2: OAuth2AuthStrategy,
|
|
26
|
+
AgentAuthType.BEARER_TOKEN: BearerTokenAuthStrategy,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def create_client(
|
|
31
|
+
cls, auth_type: AgentAuthType, config: Optional[Dict[str, Any]] = None
|
|
32
|
+
) -> AgentAuthStrategy:
|
|
33
|
+
"""Create an authentication strategy instance based on the strategy type.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
auth_type: The type of the authentication strategy.
|
|
37
|
+
config: The configuration dictionary for the authentication.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
An instance of the authentication strategy.
|
|
41
|
+
"""
|
|
42
|
+
config = config or {}
|
|
43
|
+
|
|
44
|
+
# Get the strategy class for the specified type
|
|
45
|
+
auth_strategy_class = cls._get_auth_strategy_class(auth_type)
|
|
46
|
+
if auth_strategy_class is None:
|
|
47
|
+
raise ValueError(
|
|
48
|
+
f"Unsupported strategy type: {auth_type}. "
|
|
49
|
+
f"Supported types: {cls.get_supported_auth_strategy_types()}"
|
|
50
|
+
)
|
|
51
|
+
# Create instance based on strategy type
|
|
52
|
+
return auth_strategy_class.from_config(config)
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def get_supported_auth_strategy_types(cls) -> list[AgentAuthType]:
|
|
56
|
+
"""Get all supported authentication strategy types."""
|
|
57
|
+
return list(cls._auth_strategies.keys())
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def _get_auth_strategy_class(
|
|
61
|
+
cls, auth_type: AgentAuthType
|
|
62
|
+
) -> Type[AgentAuthStrategy]:
|
|
63
|
+
"""Get the class that implements the authentication strategy."""
|
|
64
|
+
if not cls.is_auth_strategy_supported(auth_type):
|
|
65
|
+
raise ValueError(
|
|
66
|
+
f"Unsupported authentication strategy type: {auth_type}. "
|
|
67
|
+
f"Supported types: {cls.get_supported_auth_strategy_types()}"
|
|
68
|
+
)
|
|
69
|
+
return cls._auth_strategies[auth_type]
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def is_auth_strategy_supported(cls, auth_type: AgentAuthType) -> bool:
|
|
73
|
+
"""Check if the authentication strategy type is supported."""
|
|
74
|
+
return auth_type in cls._auth_strategies
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""High-level authentication management with strategy abstraction."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.shared.agents.auth.agent_auth_factory import AgentAuthFactory
|
|
8
|
+
from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
|
|
9
|
+
from rasa.shared.agents.auth.constants import (
|
|
10
|
+
CONFIG_API_KEY_KEY,
|
|
11
|
+
CONFIG_OAUTH_KEY,
|
|
12
|
+
CONFIG_TOKEN_KEY,
|
|
13
|
+
)
|
|
14
|
+
from rasa.shared.agents.auth.types import AgentAuthType
|
|
15
|
+
from rasa.shared.exceptions import AgentAuthInitializationException
|
|
16
|
+
|
|
17
|
+
structlogger = structlog.get_logger()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AgentAuthManager:
|
|
21
|
+
"""High-level authentication management with strategy abstraction."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, auth_strategy: Optional[AgentAuthStrategy] = None):
|
|
24
|
+
"""Initialize a new authentication manager instance."""
|
|
25
|
+
self._auth_strategy: Optional[AgentAuthStrategy] = auth_strategy
|
|
26
|
+
|
|
27
|
+
def get_auth(self) -> AgentAuthStrategy:
|
|
28
|
+
"""Retrieve the authentication instance.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
The authentication instance.
|
|
32
|
+
|
|
33
|
+
Raises:
|
|
34
|
+
ValueError: If no authentication is connected.
|
|
35
|
+
"""
|
|
36
|
+
if self._auth_strategy is None:
|
|
37
|
+
raise ValueError("No authentication instance available")
|
|
38
|
+
return self._auth_strategy
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def detect_auth_type(config: Dict[str, Any]) -> AgentAuthType:
|
|
42
|
+
if CONFIG_API_KEY_KEY in config:
|
|
43
|
+
return AgentAuthType.API_KEY
|
|
44
|
+
if CONFIG_TOKEN_KEY in config:
|
|
45
|
+
return AgentAuthType.BEARER_TOKEN
|
|
46
|
+
if CONFIG_OAUTH_KEY in config:
|
|
47
|
+
return AgentAuthType.OAUTH2
|
|
48
|
+
raise ValueError(
|
|
49
|
+
"Invalid authentication type. Supported types: "
|
|
50
|
+
+ ", ".join([auth_type.value for auth_type in AgentAuthType])
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def load_auth(cls, config: Dict[str, Any]) -> "AgentAuthManager":
|
|
55
|
+
"""Connect to authentication using specified strategy type and persist
|
|
56
|
+
the auth instance to the manager in a ready-to-use state.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
config: The configuration dictionary for the authentication.
|
|
60
|
+
|
|
61
|
+
Raises:
|
|
62
|
+
AgentAuthInitializationException: If the authentication connection fails.
|
|
63
|
+
"""
|
|
64
|
+
config = config or {}
|
|
65
|
+
try:
|
|
66
|
+
auth_type = AgentAuthManager.detect_auth_type(config)
|
|
67
|
+
|
|
68
|
+
# Create the auth client
|
|
69
|
+
client = AgentAuthFactory.create_client(auth_type, config)
|
|
70
|
+
|
|
71
|
+
structlogger.debug(
|
|
72
|
+
"agent_auth_manager.load_auth.success",
|
|
73
|
+
auth_type=auth_type.value,
|
|
74
|
+
event_info=(
|
|
75
|
+
f"Loaded authentication client successfully for `{auth_type.value}`"
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
return cls(client)
|
|
79
|
+
except Exception as e:
|
|
80
|
+
event_info = "Failed to load authentication client"
|
|
81
|
+
structlogger.error(
|
|
82
|
+
"agent_auth_manager.load_auth.failed_to_load",
|
|
83
|
+
event_info=event_info,
|
|
84
|
+
config=config,
|
|
85
|
+
)
|
|
86
|
+
raise AgentAuthInitializationException(e)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Authentication strategy implementations."""
|
|
2
|
+
|
|
3
|
+
from rasa.shared.agents.auth.auth_strategy.agent_auth_strategy import AgentAuthStrategy
|
|
4
|
+
from rasa.shared.agents.auth.auth_strategy.api_key_auth_strategy import (
|
|
5
|
+
APIKeyAuthStrategy,
|
|
6
|
+
)
|
|
7
|
+
from rasa.shared.agents.auth.auth_strategy.bearer_token_auth_strategy import (
|
|
8
|
+
BearerTokenAuthStrategy,
|
|
9
|
+
)
|
|
10
|
+
from rasa.shared.agents.auth.auth_strategy.oauth2_auth_strategy import (
|
|
11
|
+
OAuth2AuthStrategy,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"AgentAuthStrategy",
|
|
16
|
+
"APIKeyAuthStrategy",
|
|
17
|
+
"OAuth2AuthStrategy",
|
|
18
|
+
"BearerTokenAuthStrategy",
|
|
19
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Any, AsyncGenerator, Dict
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from rasa.shared.agents.auth.types import AgentAuthType
|
|
7
|
+
from rasa.shared.utils.io import resolve_environment_variables
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AgentAuthStrategy(ABC, httpx.Auth):
|
|
11
|
+
"""Base class for authentication strategies."""
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
@abstractmethod
|
|
15
|
+
def from_config(cls, config: Dict[str, Any]) -> "AgentAuthStrategy":
|
|
16
|
+
"""Create an authentication strategy instance from a config dictionary."""
|
|
17
|
+
...
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def auth_type(self) -> AgentAuthType:
|
|
22
|
+
"""Return the type of the authentication strategy."""
|
|
23
|
+
...
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
async def get_headers(self) -> Dict[str, str]:
|
|
27
|
+
"""Get authentication headers for requests.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Dictionary containing authentication headers.
|
|
31
|
+
"""
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
async def async_auth_flow(
|
|
35
|
+
self, request: httpx.Request
|
|
36
|
+
) -> AsyncGenerator[httpx.Request, httpx.Response]:
|
|
37
|
+
"""Get authentication headers for requests.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Async generator of requests with authentication headers.
|
|
41
|
+
"""
|
|
42
|
+
# Get authentication headers.
|
|
43
|
+
auth_headers = await self.get_headers()
|
|
44
|
+
|
|
45
|
+
# Resolve environment variables in authentication headers.
|
|
46
|
+
resolved_auth_headers = resolve_environment_variables(auth_headers)
|
|
47
|
+
|
|
48
|
+
# Update request headers with resolved authentication headers.
|
|
49
|
+
request.headers.update(resolved_auth_headers)
|
|
50
|
+
|
|
51
|
+
# Yield request with resolved authentication headers.
|
|
52
|
+
yield request
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""API Key authentication strategy implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
|
|
6
|
+
from rasa.shared.agents.auth.constants import (
|
|
7
|
+
CONFIG_API_KEY_KEY,
|
|
8
|
+
CONFIG_HEADER_FORMAT_KEY,
|
|
9
|
+
CONFIG_HEADER_NAME_KEY,
|
|
10
|
+
)
|
|
11
|
+
from rasa.shared.agents.auth.types import AgentAuthType
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class APIKeyAuthStrategy(AgentAuthStrategy):
|
|
15
|
+
"""API Key authentication strategy implementation."""
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
api_key: str,
|
|
20
|
+
header_name: str = "Authorization",
|
|
21
|
+
header_format: str = "Bearer {key}",
|
|
22
|
+
):
|
|
23
|
+
self.api_key = api_key
|
|
24
|
+
self.header_name = header_name
|
|
25
|
+
self.header_format = header_format
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def from_config(cls, config: Dict[str, Any]) -> "APIKeyAuthStrategy":
|
|
29
|
+
api_key = config.get(CONFIG_API_KEY_KEY)
|
|
30
|
+
header_name = config.get(CONFIG_HEADER_NAME_KEY, "Authorization")
|
|
31
|
+
header_format = config.get(CONFIG_HEADER_FORMAT_KEY, "Bearer {key}")
|
|
32
|
+
if not api_key:
|
|
33
|
+
raise ValueError("API key is required for API KEY authentication")
|
|
34
|
+
return APIKeyAuthStrategy(api_key, header_name, header_format)
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def auth_type(self) -> AgentAuthType:
|
|
38
|
+
return AgentAuthType.API_KEY
|
|
39
|
+
|
|
40
|
+
async def get_headers(self) -> Dict[str, str]:
|
|
41
|
+
"""Return API key authentication headers."""
|
|
42
|
+
return {self.header_name: self.header_format.format(key=self.api_key)}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Bearer Token authentication strategy implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
|
|
6
|
+
from rasa.shared.agents.auth.constants import CONFIG_TOKEN_KEY
|
|
7
|
+
from rasa.shared.agents.auth.types import AgentAuthType
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BearerTokenAuthStrategy(AgentAuthStrategy):
|
|
11
|
+
"""Bearer Token authentication strategy implementation."""
|
|
12
|
+
|
|
13
|
+
def __init__(self, token: str):
|
|
14
|
+
self._token = token
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def from_config(cls, config: Dict[str, Any]) -> "BearerTokenAuthStrategy":
|
|
18
|
+
token = config.get(CONFIG_TOKEN_KEY)
|
|
19
|
+
if not token:
|
|
20
|
+
raise ValueError("Access token is required for Bearer Token authentication")
|
|
21
|
+
return BearerTokenAuthStrategy(token)
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def auth_type(self) -> AgentAuthType:
|
|
25
|
+
return AgentAuthType.BEARER_TOKEN
|
|
26
|
+
|
|
27
|
+
async def get_headers(self) -> Dict[str, str]:
|
|
28
|
+
return {"Authorization": f"Bearer {self._token}"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"""OAuth2 authentication strategy client credentials flow implementation."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import time
|
|
5
|
+
from typing import Any, AsyncGenerator, Dict, Optional
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
|
|
10
|
+
from rasa.shared.agents.auth.constants import (
|
|
11
|
+
CONFIG_CLIENT_ID_KEY,
|
|
12
|
+
CONFIG_CLIENT_SECRET_KEY,
|
|
13
|
+
CONFIG_SCOPE_KEY,
|
|
14
|
+
CONFIG_TIMEOUT_KEY,
|
|
15
|
+
CONFIG_TOKEN_URL_KEY,
|
|
16
|
+
)
|
|
17
|
+
from rasa.shared.agents.auth.types import AgentAuthType
|
|
18
|
+
from rasa.shared.utils.io import resolve_environment_variables
|
|
19
|
+
|
|
20
|
+
KEY_ACCESS_TOKEN = "access_token"
|
|
21
|
+
KEY_CLIENT_CREDENTIALS = "client_credentials"
|
|
22
|
+
KEY_EXPIRES_IN = "expires_in"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class OAuth2AuthStrategy(AgentAuthStrategy):
|
|
26
|
+
"""Client Credentials Flow authentication strategy."""
|
|
27
|
+
|
|
28
|
+
DEFAULT_ACCESS_TOKEN_TIMEOUT = 5
|
|
29
|
+
DEFAULT_ACCESS_TOKEN_EXPIRES_IN_SECONDS = 3600
|
|
30
|
+
DEFAULT_BUFFER_TIME_SECONDS = 10
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
token_url: str,
|
|
35
|
+
client_id: str,
|
|
36
|
+
client_secret: str,
|
|
37
|
+
scope: str,
|
|
38
|
+
timeout: Optional[int] = None,
|
|
39
|
+
):
|
|
40
|
+
self.token_url = token_url
|
|
41
|
+
self.client_id = client_id
|
|
42
|
+
self.client_secret = client_secret
|
|
43
|
+
self.scope = scope
|
|
44
|
+
self.timeout = timeout or self.DEFAULT_ACCESS_TOKEN_TIMEOUT
|
|
45
|
+
|
|
46
|
+
# Only client credentials flow is supported for server to server communication.
|
|
47
|
+
self._grant_type = KEY_CLIENT_CREDENTIALS
|
|
48
|
+
|
|
49
|
+
# Initialize defaults.
|
|
50
|
+
self._access_token: Optional[str] = None
|
|
51
|
+
self._expires_at: Optional[float] = None
|
|
52
|
+
|
|
53
|
+
# Initialize lock for concurrent access to the refresh the access token.
|
|
54
|
+
self._refresh_lock = asyncio.Lock()
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def from_config(cls, config: Dict[str, Any]) -> "OAuth2AuthStrategy":
|
|
58
|
+
"""Create OAuth2AuthStrategy from configuration dictionary."""
|
|
59
|
+
token_url = config.get(CONFIG_TOKEN_URL_KEY)
|
|
60
|
+
client_id = config.get(CONFIG_CLIENT_ID_KEY)
|
|
61
|
+
client_secret = config.get(CONFIG_CLIENT_SECRET_KEY)
|
|
62
|
+
scope = config.get(CONFIG_SCOPE_KEY)
|
|
63
|
+
timeout = config.get(CONFIG_TIMEOUT_KEY) or cls.DEFAULT_ACCESS_TOKEN_TIMEOUT
|
|
64
|
+
|
|
65
|
+
if not token_url:
|
|
66
|
+
raise ValueError("Token URL is required for OAuth2 authentication")
|
|
67
|
+
if not client_id:
|
|
68
|
+
raise ValueError("Client ID is required for OAuth2 authentication")
|
|
69
|
+
if not client_secret:
|
|
70
|
+
raise ValueError("Client secret is required for OAuth2 authentication")
|
|
71
|
+
if not scope:
|
|
72
|
+
raise ValueError("Scope is required for OAuth2 authentication")
|
|
73
|
+
|
|
74
|
+
return cls(
|
|
75
|
+
token_url=token_url,
|
|
76
|
+
client_id=client_id,
|
|
77
|
+
client_secret=client_secret,
|
|
78
|
+
scope=scope,
|
|
79
|
+
timeout=timeout,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def auth_type(self) -> AgentAuthType:
|
|
84
|
+
return AgentAuthType.OAUTH2
|
|
85
|
+
|
|
86
|
+
async def get_headers(self) -> Dict[str, str]:
|
|
87
|
+
"""Return OAuth2 authentication headers."""
|
|
88
|
+
# Acquire lock to prevent concurrent access to the refresh the access token.
|
|
89
|
+
async with self._refresh_lock:
|
|
90
|
+
# Refresh if missing or expired
|
|
91
|
+
if not self._access_token or self._is_expired():
|
|
92
|
+
await self._refresh_access_token()
|
|
93
|
+
if not self._access_token:
|
|
94
|
+
raise ValueError("Failed to obtain access token")
|
|
95
|
+
return {"Authorization": f"Bearer {self._access_token}"}
|
|
96
|
+
|
|
97
|
+
def _is_expired(self) -> bool:
|
|
98
|
+
"""Check if access token is expired."""
|
|
99
|
+
# Adding a buffer time to the expiration time to avoid race conditions.
|
|
100
|
+
return (
|
|
101
|
+
not self._expires_at
|
|
102
|
+
or self._expires_at <= time.time() + self.DEFAULT_BUFFER_TIME_SECONDS
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async def _refresh_access_token(self) -> None:
|
|
106
|
+
"""Fetch a new access token using client credentials flow."""
|
|
107
|
+
# Prepare data and headers
|
|
108
|
+
headers = {"Content-Type": "application/x-www-form-urlencoded"}
|
|
109
|
+
data = {
|
|
110
|
+
"grant_type": self._grant_type,
|
|
111
|
+
"client_id": self.client_id,
|
|
112
|
+
"client_secret": self.client_secret,
|
|
113
|
+
"scope": self.scope,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# Resolve environment variables in data.
|
|
117
|
+
resolved_data = resolve_environment_variables(data)
|
|
118
|
+
|
|
119
|
+
# Fetch access token
|
|
120
|
+
try:
|
|
121
|
+
async with httpx.AsyncClient(timeout=self.timeout) as client:
|
|
122
|
+
resp = await client.post(
|
|
123
|
+
self.token_url, data=resolved_data, headers=headers
|
|
124
|
+
)
|
|
125
|
+
resp.raise_for_status()
|
|
126
|
+
token_data = resp.json()
|
|
127
|
+
except httpx.HTTPStatusError as e:
|
|
128
|
+
raise ValueError(
|
|
129
|
+
f"OAuth2 token request failed with status {e.response.status_code}: "
|
|
130
|
+
f"{e.response.text}"
|
|
131
|
+
) from e
|
|
132
|
+
except httpx.RequestError as e:
|
|
133
|
+
raise ValueError(f"OAuth2 token request failed: {e}") from e
|
|
134
|
+
except Exception as e:
|
|
135
|
+
raise ValueError(
|
|
136
|
+
f"Unexpected error during OAuth2 token request: {e}"
|
|
137
|
+
) from e
|
|
138
|
+
|
|
139
|
+
# Validate token data
|
|
140
|
+
if KEY_ACCESS_TOKEN not in token_data:
|
|
141
|
+
raise ValueError(f"No {KEY_ACCESS_TOKEN} in OAuth2 response")
|
|
142
|
+
|
|
143
|
+
# Set access token and expires at
|
|
144
|
+
self._access_token = token_data[KEY_ACCESS_TOKEN]
|
|
145
|
+
self._expires_at = time.time() + token_data.get(
|
|
146
|
+
KEY_EXPIRES_IN, self.DEFAULT_ACCESS_TOKEN_EXPIRES_IN_SECONDS
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
async def async_auth_flow(
|
|
150
|
+
self, request: httpx.Request
|
|
151
|
+
) -> AsyncGenerator[httpx.Request, httpx.Response]:
|
|
152
|
+
"""Inject Authorization header into outgoing requests.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Async generator of requests with Authorization header.
|
|
156
|
+
"""
|
|
157
|
+
auth_headers = await self.get_headers()
|
|
158
|
+
request.headers.update(auth_headers)
|
|
159
|
+
yield request
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
CONFIG_API_KEY_KEY = "api_key"
|
|
2
|
+
CONFIG_TOKEN_KEY = "token"
|
|
3
|
+
CONFIG_OAUTH_KEY = "oauth"
|
|
4
|
+
CONFIG_HEADER_NAME_KEY = "header_name"
|
|
5
|
+
CONFIG_HEADER_FORMAT_KEY = "header_format"
|
|
6
|
+
CONFIG_CLIENT_ID_KEY = "client_id"
|
|
7
|
+
CONFIG_CLIENT_SECRET_KEY = "client_secret"
|
|
8
|
+
CONFIG_TOKEN_URL_KEY = "token_url"
|
|
9
|
+
CONFIG_SCOPE_KEY = "scope"
|
|
10
|
+
CONFIG_GRANT_TYPE_KEY = "grant_type"
|
|
11
|
+
CONFIG_TIMEOUT_KEY = "timeout"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Fundamental types for authentication protocols."""
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AgentAuthType(Enum):
|
|
7
|
+
"""An Enum class that represents the supported authentication protocol types."""
|
|
8
|
+
|
|
9
|
+
API_KEY = "api_key"
|
|
10
|
+
OAUTH2 = "oauth2"
|
|
11
|
+
BEARER_TOKEN = "bearer_token"
|
rasa/shared/core/constants.py
CHANGED
|
@@ -61,6 +61,7 @@ ACTION_CANCEL_INTERRUPTED_FLOWS = "action_cancel_interrupted_flows"
|
|
|
61
61
|
|
|
62
62
|
ACTION_METADATA_EXECUTION_SUCCESS = "execution_success"
|
|
63
63
|
ACTION_METADATA_EXECUTION_ERROR_MESSAGE = "execution_error_message"
|
|
64
|
+
ACTION_METADATA_EXECUTION_TIME = "execution_times"
|
|
64
65
|
|
|
65
66
|
ACTION_METADATA_MESSAGE_KEY = "message"
|
|
66
67
|
ACTION_METADATA_TEXT_KEY = "text"
|