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,484 @@
|
|
|
1
|
+
"""Validation functions for agent configurations with reduced redundancies."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import urllib.parse
|
|
5
|
+
from collections import Counter
|
|
6
|
+
from typing import Any, Dict, List, NoReturn, Set
|
|
7
|
+
|
|
8
|
+
from pydantic import ValidationError as PydanticValidationError
|
|
9
|
+
from ruamel import yaml
|
|
10
|
+
|
|
11
|
+
from rasa.agents.exceptions import (
|
|
12
|
+
AgentNameFlowConflictException,
|
|
13
|
+
DuplicatedAgentNameException,
|
|
14
|
+
)
|
|
15
|
+
from rasa.core.available_agents import (
|
|
16
|
+
DEFAULT_AGENTS_CONFIG_FOLDER,
|
|
17
|
+
AgentConfig,
|
|
18
|
+
AgentConfiguration,
|
|
19
|
+
AgentConnections,
|
|
20
|
+
AgentInfo,
|
|
21
|
+
ProtocolConfig,
|
|
22
|
+
)
|
|
23
|
+
from rasa.core.available_endpoints import AvailableEndpoints
|
|
24
|
+
from rasa.exceptions import ValidationError
|
|
25
|
+
|
|
26
|
+
# Centralized allowed keys configuration to eliminate duplication
|
|
27
|
+
ALLOWED_KEYS = {
|
|
28
|
+
"agent": {"name", "protocol", "description"},
|
|
29
|
+
"configuration": {
|
|
30
|
+
"llm",
|
|
31
|
+
"prompt_template",
|
|
32
|
+
"module",
|
|
33
|
+
"timeout",
|
|
34
|
+
"max_retries",
|
|
35
|
+
"agent_card",
|
|
36
|
+
},
|
|
37
|
+
"connections": {"mcp_servers"},
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def validate_agent_names_unique(agents: List[AgentConfig]) -> None:
|
|
42
|
+
"""Validate that agent names are unique across all loaded agents.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
agents: List of agent configurations.
|
|
46
|
+
|
|
47
|
+
Raises:
|
|
48
|
+
DuplicatedAgentNameException: If agent names are not unique.
|
|
49
|
+
"""
|
|
50
|
+
agent_names = [agent_config.agent.name for agent_config in agents]
|
|
51
|
+
name_counts = Counter(agent_names)
|
|
52
|
+
|
|
53
|
+
duplicated_names = [name for name, count in name_counts.items() if count > 1]
|
|
54
|
+
|
|
55
|
+
if duplicated_names:
|
|
56
|
+
raise DuplicatedAgentNameException(duplicated_names)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def validate_agent_names_not_conflicting_with_flows(
|
|
60
|
+
agents: Dict[str, AgentConfig], flow_names: Set[str]
|
|
61
|
+
) -> None:
|
|
62
|
+
"""Validate that agent names do not conflict with flow names.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
agents: Dictionary of agent configurations.
|
|
66
|
+
flow_names: Set of flow names to check against.
|
|
67
|
+
|
|
68
|
+
Raises:
|
|
69
|
+
AgentNameFlowConflictException: If agent names conflict with flow names.
|
|
70
|
+
"""
|
|
71
|
+
conflicting_names = [
|
|
72
|
+
agent_name for agent_name in agents.keys() if agent_name in flow_names
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
if conflicting_names:
|
|
76
|
+
raise AgentNameFlowConflictException(conflicting_names)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _validate_mcp_config(agent_config: AgentConfig) -> None:
|
|
80
|
+
"""Validate MCP-specific configuration requirements."""
|
|
81
|
+
agent_name = agent_config.agent.name
|
|
82
|
+
|
|
83
|
+
# Check connections.mcp_servers exists
|
|
84
|
+
if agent_config.connections is None or agent_config.connections.mcp_servers is None:
|
|
85
|
+
raise ValidationError(
|
|
86
|
+
code="agent.validation.mcp.missing_connections",
|
|
87
|
+
event_info=f"For protocol 'MCP', agent '{agent_name}' must have "
|
|
88
|
+
"'connections.mcp_servers' configured.",
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Check mcp_servers list is not empty
|
|
92
|
+
if not agent_config.connections.mcp_servers:
|
|
93
|
+
raise ValidationError(
|
|
94
|
+
code="agent.validation.mcp.empty_servers_list",
|
|
95
|
+
event_info=f"For protocol 'MCP', agent '{agent_name}' must have "
|
|
96
|
+
"at least one MCP server configured in 'connections.mcp_servers'.",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Validate each MCP server configuration
|
|
100
|
+
for i, server in enumerate(agent_config.connections.mcp_servers):
|
|
101
|
+
if not server.name:
|
|
102
|
+
raise ValidationError(
|
|
103
|
+
code="agent.validation.mcp.server_missing_name",
|
|
104
|
+
event_info=f"For protocol 'MCP', agent '{agent_name}' MCP server "
|
|
105
|
+
f"at index {i} must have a 'name' field.",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _validate_a2a_config(agent_config: AgentConfig) -> None:
|
|
110
|
+
"""Validate A2A-specific configuration requirements."""
|
|
111
|
+
agent_name = agent_config.agent.name
|
|
112
|
+
|
|
113
|
+
# Check configuration.agent_card exists
|
|
114
|
+
if (
|
|
115
|
+
agent_config.configuration is None
|
|
116
|
+
or agent_config.configuration.agent_card is None
|
|
117
|
+
):
|
|
118
|
+
raise ValidationError(
|
|
119
|
+
code="agent.validation.a2a.missing_agent_card",
|
|
120
|
+
event_info=f"For protocol 'A2A', agent '{agent_name}' must have "
|
|
121
|
+
"'configuration.agent_card' specified.",
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Validate agent_card path or URL
|
|
125
|
+
agent_card = agent_config.configuration.agent_card
|
|
126
|
+
if not agent_card:
|
|
127
|
+
raise ValidationError(
|
|
128
|
+
code="agent.validation.a2a.empty_agent_card",
|
|
129
|
+
event_info=f"Agent '{agent_name}' has empty 'agent_card' value",
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Check if it's a URL
|
|
133
|
+
parsed_url = urllib.parse.urlparse(agent_card)
|
|
134
|
+
if parsed_url.scheme and parsed_url.netloc:
|
|
135
|
+
# It's a URL, validate format
|
|
136
|
+
if parsed_url.scheme not in ["http", "https"]:
|
|
137
|
+
raise ValidationError(
|
|
138
|
+
code="agent.validation.a2a.invalid_agent_card_url",
|
|
139
|
+
event_info=f"Agent '{agent_name}' has invalid URL scheme "
|
|
140
|
+
f"'{parsed_url.scheme}' for 'agent_card'",
|
|
141
|
+
)
|
|
142
|
+
else:
|
|
143
|
+
# It's a file path, check if it exists
|
|
144
|
+
if not os.path.exists(agent_card):
|
|
145
|
+
raise ValidationError(
|
|
146
|
+
code="agent.validation.a2a.agent_card_file_not_found",
|
|
147
|
+
event_info=f"Agent '{agent_name}' has 'agent_card' file that doesn't "
|
|
148
|
+
f"exist: {agent_card}",
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _validate_optional_keys(agent_config: AgentConfig) -> None:
|
|
153
|
+
"""Validate optional keys in agent configuration."""
|
|
154
|
+
agent_name = agent_config.agent.name
|
|
155
|
+
|
|
156
|
+
# Validate prompt_template if present
|
|
157
|
+
if agent_config.configuration and agent_config.configuration.prompt_template:
|
|
158
|
+
prompt_path = agent_config.configuration.prompt_template
|
|
159
|
+
if not os.path.exists(prompt_path):
|
|
160
|
+
raise ValidationError(
|
|
161
|
+
code="agent.validation.optional.prompt_template_not_found",
|
|
162
|
+
event_info=f"Agent '{agent_name}' has prompt template that "
|
|
163
|
+
f"does not exist: {prompt_path}",
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Validate module if present
|
|
167
|
+
if agent_config.configuration and agent_config.configuration.module:
|
|
168
|
+
import importlib
|
|
169
|
+
|
|
170
|
+
module_name = agent_config.configuration.module
|
|
171
|
+
try:
|
|
172
|
+
module_path, class_name = module_name.rsplit(".", 1)
|
|
173
|
+
getattr(importlib.import_module(module_path), class_name)
|
|
174
|
+
except (ImportError, AttributeError) as e:
|
|
175
|
+
raise ValidationError(
|
|
176
|
+
code="agent.validation.optional.module_not_found",
|
|
177
|
+
event_info=f"Agent '{agent_name}' has module '{module_name}' "
|
|
178
|
+
f"that could not be imported: {e}",
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _validate_llm_references(
|
|
183
|
+
llm_config: Dict[str, Any],
|
|
184
|
+
endpoints: "AvailableEndpoints",
|
|
185
|
+
agent_name: str,
|
|
186
|
+
) -> None:
|
|
187
|
+
"""Validate LLM configuration references against endpoints."""
|
|
188
|
+
if "model_group" in llm_config:
|
|
189
|
+
from rasa.engine.validation import (
|
|
190
|
+
_validate_component_model_client_config_has_references_to_endpoints,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
component_config = {"llm": llm_config}
|
|
194
|
+
_validate_component_model_client_config_has_references_to_endpoints(
|
|
195
|
+
component_config, "llm", component_name=agent_name
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _validate_mcp_server_references(
|
|
200
|
+
mcp_servers: list, endpoints: "AvailableEndpoints", agent_name: str
|
|
201
|
+
) -> None:
|
|
202
|
+
"""Validate MCP server references against endpoints."""
|
|
203
|
+
if not endpoints.mcp_servers:
|
|
204
|
+
raise ValidationError(
|
|
205
|
+
code="agent.validation.endpoints.no_mcp_servers",
|
|
206
|
+
event_info=(
|
|
207
|
+
f"Agent '{agent_name}' references MCP servers but no MCP "
|
|
208
|
+
"servers are defined in endpoints.yml."
|
|
209
|
+
),
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
available_mcp_server_names = [server.name for server in endpoints.mcp_servers]
|
|
213
|
+
|
|
214
|
+
for i, mcp_server in enumerate(mcp_servers):
|
|
215
|
+
server_name = mcp_server.name
|
|
216
|
+
if server_name not in available_mcp_server_names:
|
|
217
|
+
raise ValidationError(
|
|
218
|
+
code="agent.validation.endpoints.invalid_mcp_server",
|
|
219
|
+
event_info=(
|
|
220
|
+
f"MCP server '{server_name}' at index {i} for Agent "
|
|
221
|
+
f"'{agent_name}' does not exist in endpoints.yml. Available MCP "
|
|
222
|
+
f"servers: {', '.join(available_mcp_server_names)}"
|
|
223
|
+
),
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _handle_pydantic_validation_error(
|
|
228
|
+
error: PydanticValidationError, agent_name: str
|
|
229
|
+
) -> NoReturn:
|
|
230
|
+
"""Handle specific Pydantic validation errors that are actually possible.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
error: The Pydantic validation error to handle
|
|
234
|
+
agent_name: Name of the agent for error messages
|
|
235
|
+
"""
|
|
236
|
+
missing_fields = []
|
|
237
|
+
invalid_protocol = False
|
|
238
|
+
type_error = None
|
|
239
|
+
|
|
240
|
+
for pydantic_error in error.errors():
|
|
241
|
+
error_type = pydantic_error["type"]
|
|
242
|
+
field_path = ".".join(str(loc) for loc in pydantic_error["loc"])
|
|
243
|
+
|
|
244
|
+
if error_type == "missing":
|
|
245
|
+
for field in ["name", "protocol", "description"]:
|
|
246
|
+
if field in field_path:
|
|
247
|
+
missing_fields.append(field)
|
|
248
|
+
elif error_type == "enum" and "protocol" in field_path:
|
|
249
|
+
invalid_protocol = True
|
|
250
|
+
elif error_type in ["string_type", "int_parsing"]:
|
|
251
|
+
type_error = (field_path, pydantic_error["msg"])
|
|
252
|
+
|
|
253
|
+
# Handle missing required fields
|
|
254
|
+
if missing_fields:
|
|
255
|
+
raise ValidationError(
|
|
256
|
+
code="agent.validation.mandatory.fields_missing",
|
|
257
|
+
event_info=(
|
|
258
|
+
f"Agent '{agent_name}' is missing required fields "
|
|
259
|
+
f"in agent section: {', '.join(missing_fields)}"
|
|
260
|
+
),
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
# Handle invalid protocol
|
|
264
|
+
elif invalid_protocol:
|
|
265
|
+
raise ValidationError(
|
|
266
|
+
code="agent.validation.pydantic.invalid_protocol",
|
|
267
|
+
event_info=(
|
|
268
|
+
f"Agent '{agent_name}' has invalid protocol value. "
|
|
269
|
+
"Supported protocols: MCP, A2A"
|
|
270
|
+
),
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
# Handle type errors
|
|
274
|
+
elif type_error:
|
|
275
|
+
field, msg = type_error
|
|
276
|
+
raise ValidationError(
|
|
277
|
+
code="agent.validation.pydantic.type_error",
|
|
278
|
+
event_info=(
|
|
279
|
+
f"Agent '{agent_name}' has invalid type for field " f"'{field}': {msg}"
|
|
280
|
+
),
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Handle other Pydantic validation errors
|
|
284
|
+
else:
|
|
285
|
+
raise ValidationError(
|
|
286
|
+
code="agent.validation.pydantic.failed",
|
|
287
|
+
event_info=f"Agent '{agent_name}' validation failed: {error}",
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _validate_endpoint_references(agent_config: AgentConfig) -> None:
|
|
292
|
+
"""Validate that LLM and MCP server references in agent config are valid."""
|
|
293
|
+
agent_name = agent_config.agent.name
|
|
294
|
+
|
|
295
|
+
# Get available endpoints
|
|
296
|
+
endpoints = AvailableEndpoints.get_instance()
|
|
297
|
+
|
|
298
|
+
# Validate LLM configuration references
|
|
299
|
+
if agent_config.configuration and agent_config.configuration.llm:
|
|
300
|
+
_validate_llm_references(agent_config.configuration.llm, endpoints, agent_name)
|
|
301
|
+
|
|
302
|
+
# Validate MCP server references
|
|
303
|
+
if agent_config.connections and agent_config.connections.mcp_servers:
|
|
304
|
+
_validate_mcp_server_references(
|
|
305
|
+
agent_config.connections.mcp_servers, endpoints, agent_name
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def _validate_section_keys(
|
|
310
|
+
data: Dict[str, Any], section: str, allowed_keys: set
|
|
311
|
+
) -> None:
|
|
312
|
+
"""Generic function to validate keys in a specific section."""
|
|
313
|
+
if section not in data:
|
|
314
|
+
return
|
|
315
|
+
|
|
316
|
+
section_data = data[section]
|
|
317
|
+
if not isinstance(section_data, dict):
|
|
318
|
+
return
|
|
319
|
+
|
|
320
|
+
additional_keys = set(section_data.keys()) - allowed_keys
|
|
321
|
+
if additional_keys:
|
|
322
|
+
agent_name = data.get("agent", {}).get("name", "unknown")
|
|
323
|
+
raise ValidationError(
|
|
324
|
+
code=f"agent.validation.structure.additional_{section}_keys",
|
|
325
|
+
event_info=(
|
|
326
|
+
f"Agent '{agent_name}' contains additional keys in "
|
|
327
|
+
f"'{section}' section: {', '.join(sorted(additional_keys))}"
|
|
328
|
+
),
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _validate_mandatory_fields(data: Dict[str, Any], agent_name: str) -> None:
|
|
333
|
+
"""Validate that all mandatory fields are present in the agent section."""
|
|
334
|
+
if "agent" not in data:
|
|
335
|
+
raise ValidationError(
|
|
336
|
+
code="agent.validation.mandatory.agent_section_missing",
|
|
337
|
+
event_info=f"Agent '{agent_name}' is missing 'agent' section",
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
agent_data = data["agent"]
|
|
341
|
+
if not isinstance(agent_data, dict):
|
|
342
|
+
raise ValidationError(
|
|
343
|
+
code="agent.validation.mandatory.agent_section_invalid",
|
|
344
|
+
event_info=(
|
|
345
|
+
f"Agent '{agent_name}' has invalid 'agent' section - "
|
|
346
|
+
"must be a dictionary"
|
|
347
|
+
),
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
# Check for required fields
|
|
351
|
+
missing_fields = []
|
|
352
|
+
for field in ["name", "protocol", "description"]:
|
|
353
|
+
if field not in agent_data or not agent_data[field]:
|
|
354
|
+
missing_fields.append(field)
|
|
355
|
+
|
|
356
|
+
if missing_fields:
|
|
357
|
+
raise ValidationError(
|
|
358
|
+
code="agent.validation.mandatory.fields_missing",
|
|
359
|
+
event_info=(
|
|
360
|
+
f"Agent '{agent_name}' is missing required fields in agent section: "
|
|
361
|
+
f"{', '.join(missing_fields)}"
|
|
362
|
+
),
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def _validate_no_additional_keys_raw_data(data: Dict[str, Any]) -> None:
|
|
367
|
+
"""Validate that no additional, unexpected keys are present in the raw data."""
|
|
368
|
+
# Use the generic validation function for each section
|
|
369
|
+
_validate_section_keys(data, "agent", ALLOWED_KEYS["agent"])
|
|
370
|
+
_validate_section_keys(data, "configuration", ALLOWED_KEYS["configuration"])
|
|
371
|
+
_validate_section_keys(data, "connections", ALLOWED_KEYS["connections"])
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def _validate_folder_structure(agent_folder: str) -> None:
|
|
375
|
+
"""Validate agent folder structure."""
|
|
376
|
+
if not os.path.exists(agent_folder):
|
|
377
|
+
raise ValidationError(
|
|
378
|
+
code="agent.validation.folder.not_found",
|
|
379
|
+
event_info=f"Agent folder does not exist: {agent_folder}",
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
if not os.path.isdir(agent_folder):
|
|
383
|
+
raise ValidationError(
|
|
384
|
+
code="agent.validation.folder.not_directory",
|
|
385
|
+
event_info=f"Agent folder is not a directory: {agent_folder}",
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def _validate_config_file_exists(config_path: str, agent_name: str) -> None:
|
|
390
|
+
"""Validate config.yml file exists."""
|
|
391
|
+
if not os.path.isfile(config_path):
|
|
392
|
+
raise ValidationError(
|
|
393
|
+
code="agent.validation.folder.missing_config",
|
|
394
|
+
event_info=f"Agent '{agent_name}' is missing 'config.yml' file",
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def validate_agent_config(agent_config: AgentConfig) -> None:
|
|
399
|
+
"""Validate an agent configuration using all applicable validators."""
|
|
400
|
+
protocol = agent_config.agent.protocol
|
|
401
|
+
|
|
402
|
+
# Run protocol-specific validation
|
|
403
|
+
if protocol == ProtocolConfig.MCP:
|
|
404
|
+
_validate_mcp_config(agent_config)
|
|
405
|
+
elif protocol == ProtocolConfig.A2A:
|
|
406
|
+
_validate_a2a_config(agent_config)
|
|
407
|
+
|
|
408
|
+
# Run optional keys validation
|
|
409
|
+
_validate_optional_keys(agent_config)
|
|
410
|
+
|
|
411
|
+
# Run endpoint references validation
|
|
412
|
+
_validate_endpoint_references(agent_config)
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def validate_agent_folder(agent_folder: str = DEFAULT_AGENTS_CONFIG_FOLDER) -> None:
|
|
416
|
+
"""Validate all agent configurations in a folder."""
|
|
417
|
+
# Validate folder structure
|
|
418
|
+
_validate_folder_structure(agent_folder)
|
|
419
|
+
|
|
420
|
+
# Scan for agent folders
|
|
421
|
+
for agent_folder_name in os.listdir(agent_folder):
|
|
422
|
+
agent_path = os.path.join(agent_folder, agent_folder_name)
|
|
423
|
+
|
|
424
|
+
if not os.path.isdir(agent_path):
|
|
425
|
+
continue
|
|
426
|
+
|
|
427
|
+
config_path = os.path.join(agent_path, "config.yml")
|
|
428
|
+
|
|
429
|
+
# Validate config file exists
|
|
430
|
+
_validate_config_file_exists(config_path, agent_folder_name)
|
|
431
|
+
|
|
432
|
+
# Read and validate the config content
|
|
433
|
+
try:
|
|
434
|
+
# First read the raw YAML data to validate structure
|
|
435
|
+
with open(config_path, "r") as f:
|
|
436
|
+
data = yaml.safe_load(f)
|
|
437
|
+
|
|
438
|
+
# Validate no additional keys
|
|
439
|
+
_validate_no_additional_keys_raw_data(data)
|
|
440
|
+
|
|
441
|
+
# Validate mandatory fields before creating Pydantic models
|
|
442
|
+
_validate_mandatory_fields(data, agent_folder_name)
|
|
443
|
+
|
|
444
|
+
# Create the agent config using AvailableAgents
|
|
445
|
+
from rasa.core.available_agents import AvailableAgents
|
|
446
|
+
|
|
447
|
+
agent_config = AvailableAgents._read_agent_config(config_path)
|
|
448
|
+
|
|
449
|
+
# Validate the agent config (protocol-specific and endpoint references)
|
|
450
|
+
validate_agent_config(agent_config)
|
|
451
|
+
except PydanticValidationError as e:
|
|
452
|
+
_handle_pydantic_validation_error(e, agent_folder_name)
|
|
453
|
+
except Exception as e:
|
|
454
|
+
# Handle non-Pydantic exceptions
|
|
455
|
+
raise ValidationError(
|
|
456
|
+
code="agent.validation.folder.config_validation_failed",
|
|
457
|
+
event_info=f"Agent '{agent_folder_name}' validation failed: {e}",
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def validate_agent_config_data(data: Dict[str, Any]) -> "AgentConfig":
|
|
462
|
+
"""Validate agent configuration data."""
|
|
463
|
+
try:
|
|
464
|
+
# Validate no additional keys before creating Pydantic models
|
|
465
|
+
_validate_no_additional_keys_raw_data(data)
|
|
466
|
+
|
|
467
|
+
# Create the agent config (this will trigger Pydantic validation)
|
|
468
|
+
agent_config = AgentConfig(
|
|
469
|
+
agent=AgentInfo(**data.get("agent", {})),
|
|
470
|
+
configuration=AgentConfiguration(**data.get("configuration", {}))
|
|
471
|
+
if data.get("configuration")
|
|
472
|
+
else None,
|
|
473
|
+
connections=AgentConnections(**data.get("connections", {}))
|
|
474
|
+
if data.get("connections")
|
|
475
|
+
else None,
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
return agent_config
|
|
479
|
+
|
|
480
|
+
except PydanticValidationError as e:
|
|
481
|
+
_handle_pydantic_validation_error(e, "Agent configuration")
|
|
482
|
+
except Exception:
|
|
483
|
+
# Re-raise other exceptions
|
|
484
|
+
raise
|
rasa/api.py
CHANGED
|
@@ -71,22 +71,23 @@ def run(
|
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
def train(
|
|
74
|
-
domain:
|
|
75
|
-
config:
|
|
76
|
-
training_files: "Union[
|
|
77
|
-
output:
|
|
74
|
+
domain: str,
|
|
75
|
+
config: str,
|
|
76
|
+
training_files: "Union[str, List[str]]",
|
|
77
|
+
output: str = rasa.shared.constants.DEFAULT_MODELS_PATH,
|
|
78
78
|
dry_run: bool = False,
|
|
79
79
|
force_training: bool = False,
|
|
80
|
-
fixed_model_name: Optional[
|
|
80
|
+
fixed_model_name: Optional[str] = None,
|
|
81
81
|
persist_nlu_training_data: bool = False,
|
|
82
82
|
core_additional_arguments: Optional[Dict] = None,
|
|
83
83
|
nlu_additional_arguments: Optional[Dict] = None,
|
|
84
|
-
model_to_finetune: Optional[
|
|
84
|
+
model_to_finetune: Optional[str] = None,
|
|
85
85
|
finetuning_epoch_fraction: float = 1.0,
|
|
86
86
|
remote_storage: Optional[StorageType] = None,
|
|
87
87
|
file_importer: Optional["TrainingDataImporter"] = None,
|
|
88
88
|
keep_local_model_copy: bool = False,
|
|
89
89
|
remote_root_only: bool = False,
|
|
90
|
+
sub_agents: Optional[str] = None,
|
|
90
91
|
) -> "TrainingResult":
|
|
91
92
|
"""Runs Rasa Core and NLU training in `async` loop.
|
|
92
93
|
|
|
@@ -116,6 +117,7 @@ def train(
|
|
|
116
117
|
remote storage is configured.
|
|
117
118
|
remote_root_only: If `True`, the model will be stored in the root of the
|
|
118
119
|
remote model storage.
|
|
120
|
+
sub_agents: Path to sub-agents directory.
|
|
119
121
|
|
|
120
122
|
Returns:
|
|
121
123
|
An instance of `TrainingResult`.
|
|
@@ -140,6 +142,7 @@ def train(
|
|
|
140
142
|
file_importer=file_importer,
|
|
141
143
|
keep_local_model_copy=keep_local_model_copy,
|
|
142
144
|
remote_root_only=remote_root_only,
|
|
145
|
+
sub_agents=sub_agents,
|
|
143
146
|
)
|
|
144
147
|
)
|
|
145
148
|
|
rasa/builder/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Rasa Prompt-to-Bot Service
|
|
2
|
+
|
|
3
|
+
A production-ready service that generates Rasa chatbots from natural language descriptions using LLMs.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
The service follows functional programming principles with minimal use of classes:
|
|
8
|
+
|
|
9
|
+
### Core Modules
|
|
10
|
+
|
|
11
|
+
- **`config.py`** - Configuration management using module-level constants
|
|
12
|
+
- **`exceptions.py`** - Custom exception hierarchy for error handling
|
|
13
|
+
- **`models.py`** - Pydantic models for request/response validation
|
|
14
|
+
- **`llm_service.py`** - LLM interactions (minimal class for state management)
|
|
15
|
+
- **`validation_service.py`** - Project validation functions
|
|
16
|
+
- **`training_service.py`** - Model training functions
|
|
17
|
+
- **`project_generator.py`** - Project generation (class for bot files state)
|
|
18
|
+
- **`service.py`** - Main orchestrating service (class for app state)
|
|
19
|
+
- **`logging_utils.py`** - Thread-safe logging utilities
|
|
20
|
+
- **`llm_context.py`** - Conversation context formatting
|
|
21
|
+
- **`main.py`** - Application entry point
|
|
22
|
+
|
|
23
|
+
### Utility Scripts
|
|
24
|
+
|
|
25
|
+
- **`scrape_rasa_docs.py`** - Documentation scraping
|
|
26
|
+
- **`create_openai_vector_store.py`** - Documentation indexing
|
|
27
|
+
|
|
28
|
+
## Key Design Principles
|
|
29
|
+
|
|
30
|
+
1. **Functional First**: Use functions for stateless operations
|
|
31
|
+
2. **Minimal Classes**: Classes only when state management is needed
|
|
32
|
+
3. **Configuration**: Environment variables with sensible defaults
|
|
33
|
+
4. **Error Handling**: Structured exception hierarchy
|
|
34
|
+
5. **Type Safety**: Full type annotations and Pydantic validation
|
|
35
|
+
6. **Thread Safety**: Safe concurrent operations
|
|
36
|
+
7. **Resource Management**: Proper cleanup and lifecycle handling
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
39
|
+
|
|
40
|
+
### Running the Service
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
python rasa/builder/main.py
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Environment Configuration
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# OpenAI Settings
|
|
50
|
+
export OPENAI_MODEL="gpt-4.1-2025-04-14"
|
|
51
|
+
export OPENAI_TEMPERATURE="0.7"
|
|
52
|
+
export OPENAI_VECTOR_STORE_ID="vs_xxxxx"
|
|
53
|
+
export OPENAI_TIMEOUT="30"
|
|
54
|
+
|
|
55
|
+
# Server Settings
|
|
56
|
+
export SERVER_HOST="0.0.0.0"
|
|
57
|
+
export SERVER_PORT="5005"
|
|
58
|
+
export MAX_RETRIES="5"
|
|
59
|
+
export CORS_ORIGINS="http://localhost:3000,https://example.com"
|
|
60
|
+
|
|
61
|
+
# Validation Settings
|
|
62
|
+
export VALIDATION_FAIL_ON_WARNINGS="false"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### API Endpoints
|
|
66
|
+
|
|
67
|
+
- `POST /api/prompt-to-bot` - Generate bot from description
|
|
68
|
+
- `GET /api/bot-data` - Get current bot configuration
|
|
69
|
+
- `PUT /api/bot-data` - Update bot configuration (SSE)
|
|
70
|
+
- `POST /api/llm-builder` - LLM helper for bot development
|
|
71
|
+
- `GET /` - Health check
|
|
72
|
+
|
|
73
|
+
### Documentation Setup
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 1. Scrape Rasa documentation
|
|
77
|
+
python rasa/builder/scrape_rasa_docs.py
|
|
78
|
+
|
|
79
|
+
# 2. Create OpenAI vector store
|
|
80
|
+
python rasa/builder/create_openai_vector_store.py
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Benefits of Functional Approach
|
|
84
|
+
|
|
85
|
+
- **Simpler**: Easy to understand and reason about
|
|
86
|
+
- **Testable**: Functions are easier to unit test
|
|
87
|
+
- **Reusable**: Pure functions can be composed
|
|
88
|
+
- **Maintainable**: Clear separation of concerns
|
|
89
|
+
- **Performant**: No unnecessary object overhead
|
|
90
|
+
- **Debuggable**: Clear call stacks and data flow
|
|
91
|
+
|
|
92
|
+
## Error Handling
|
|
93
|
+
|
|
94
|
+
The service uses a structured exception hierarchy:
|
|
95
|
+
|
|
96
|
+
- `PromptToBotError` - Base exception
|
|
97
|
+
- `ValidationError` - Project validation failures
|
|
98
|
+
- `TrainingError` - Model training issues
|
|
99
|
+
- `LLMGenerationError` - LLM API problems
|
|
100
|
+
- `ProjectGenerationError` - Generation retry exhaustion
|
|
101
|
+
- `AgentLoadError` - Agent loading failures
|
|
102
|
+
|
|
103
|
+
## Logging
|
|
104
|
+
|
|
105
|
+
Structured logging with context using `structlog`:
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
structlogger.info("operation.success", key="value")
|
|
109
|
+
structlogger.error("operation.failed", error=str(e))
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## State Management
|
|
113
|
+
|
|
114
|
+
Only classes that truly need state:
|
|
115
|
+
|
|
116
|
+
1. **`LLMService`** - Caches schemas and manages OpenAI client
|
|
117
|
+
2. **`ProjectGenerator`** - Maintains current bot files
|
|
118
|
+
3. **`BotBuilderService`** - Manages Sanic app and agent state
|
|
119
|
+
|
|
120
|
+
Everything else uses pure functions for maximum simplicity and testability.
|
rasa/builder/__init__.py
ADDED
|
File without changes
|