rasa-pro 3.14.0a15__py3-none-any.whl → 3.14.0a17__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/builder/config.py +1 -0
- rasa/builder/copilot/constants.py +3 -0
- rasa/builder/copilot/copilot.py +127 -31
- rasa/builder/copilot/models.py +34 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +183 -188
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/telemetry.py +46 -20
- rasa/builder/document_retrieval/models.py +3 -3
- rasa/builder/jobs.py +15 -5
- rasa/builder/main.py +14 -5
- rasa/builder/models.py +7 -7
- rasa/builder/project_generator.py +128 -23
- rasa/builder/service.py +42 -27
- rasa/builder/template_cache.py +183 -9
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +4 -4
- rasa/cli/project_templates/basic/data/data.md +5 -6
- rasa/cli/project_templates/basic/domain/domain.md +7 -5
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +1 -1
- rasa/cli/project_templates/basic/endpoints.yml +1 -1
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -46
- rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/{transfers/action_process_immediate_payment.py → cards/check_that_card_exists.py} +6 -3
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
- rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
- rasa/cli/project_templates/finance/config.yml +6 -0
- rasa/cli/project_templates/finance/credentials.yml +7 -6
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +3 -4
- rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
- rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
- rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +37 -58
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/agent_details.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
- rasa/cli/project_templates/finance/data/general/help.yml +2 -2
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +1 -1
- rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
- rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
- rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +29 -62
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/_system/patterns/pattern_session_start.yml +11 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +9 -5
- rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
- rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
- rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +33 -90
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +53 -0
- rasa/cli/project_templates/finance/domain/general/agent_details.yml +31 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -2
- rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -3
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +7 -3
- rasa/cli/project_templates/finance/domain/general/welcome.yml +5 -2
- rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
- rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
- rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +203 -61
- rasa/cli/project_templates/finance/endpoints.yml +4 -3
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/config.yml +4 -4
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +1 -1
- rasa/cli/project_templates/telco/docs/docs.md +3 -0
- rasa/cli/project_templates/telco/domain/domain.md +13 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +3 -6
- rasa/cli/project_templates/telco/endpoints.yml +1 -1
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +1 -1
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +52 -8
- rasa/core/channels/development_inspector.py +1 -21
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/dist/assets/{arc-c24d8d79.js → arc-35222594.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-1b6b9f26.js → blockDiagram-38ab4fdb-a0efbfd3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-da91d0f9.js → c4Diagram-3d4e48cf-0584c0f2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-6067f302.js → classDiagram-70f12bd4-39f40dbe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-705d024a.js → classDiagram-v2-f2320105-1ad755f3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-3751dffe.js → createText-2e5e7dd3-b0f4f0fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-7b25b4af.js → edges-e0da2a9e-9039bff9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-eb7deea8.js → erDiagram-9861fffd-65c9b127.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-67235ff6.js → flowDb-956e92f1-4f08b38e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-34c3a16a.js → flowDiagram-66a62f08-e95c362a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-f1a93631.js → flowchart-elk-definition-4a651766-703c3015.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-a68cbad1.js → ganttDiagram-c361ad54-699328ea.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-0b1e4a1d.js → gitGraphDiagram-72cf32ee-04cf4b05.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-f3c1d212.js → graph-ee94449e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-34cbca30.js → index-3862675e-940162b4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-051c5a6e.js → index-c941dcb3.js} +41 -40
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-e69960a1.js → infoDiagram-f8f76790-c79c2866.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8dd3296a.js → journeyDiagram-49397b02-84489d30.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-e93126bc.js → layout-a9aa9858.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-15eb1e26.js → line-eb73cf26.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-fec95d33.js → linear-b3399f9a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2557813e.js → mindmap-definition-fc14e90a-b095bf1a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-40d756b1.js → pieDiagram-8a3498a8-07644b66.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-a48cbdcd.js → quadrantDiagram-120e2f19-573a3f9c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dc778150.js → requirementDiagram-deff3bca-d457e1e1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-10026b94.js → sankeyDiagram-04a897e0-9d26e1a2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-3b2ed10a.js → sequenceDiagram-704730f1-3a9cde10.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-c5f3b3fb.js → stateDiagram-587899a1-4f3e8cec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-e503656b.js → stateDiagram-v2-d93cdb3a-e617e5bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-a683ce56.js → styles-6aaf32cf-eab30d2f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-02bcdcee.js → styles-9a916d00-09994be2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-8e90dbb9.js → styles-c10674c1-b7110364.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-7c23fc1e.js → svgDrawCommon-08f97a94-3ebc92ad.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-c42faec8.js → timeline-definition-85554ec2-7d13d2f2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5e3bb0ea.js → xychartDiagram-e933f94c-488385e1.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +0 -7
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +9 -1
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
- rasa/core/channels/inspector/src/types.ts +32 -7
- rasa/core/channels/studio_chat.py +21 -40
- 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 +61 -0
- 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 +141 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
- rasa/core/lock_store.py +41 -7
- rasa/core/processor.py +32 -0
- rasa/core/redis_connection_factory.py +411 -0
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/model_manager/socket_bridge.py +1 -2
- rasa/shared/core/constants.py +1 -0
- rasa/shared/core/events.py +2 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/version.py +1 -1
- {rasa_pro-3.14.0a15.dist-info → rasa_pro-3.14.0a17.dist-info}/METADATA +14 -14
- {rasa_pro-3.14.0a15.dist-info → rasa_pro-3.14.0a17.dist-info}/RECORD +200 -249
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
- rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
- rasa/cli/project_templates/finance/actions/database.py +0 -277
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
- rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
- rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
- rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
- rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
- rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
- rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
- rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
- rasa/cli/project_templates/finance/csvs/users.csv +0 -4
- rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
- rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
- rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
- rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
- rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
- rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
- rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
- rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
- rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
- rasa/core/channels/inspector/dist/assets/channel-d2444dfd.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-281a0990.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-aa4cca3b.js +0 -1
- /rasa/cli/project_templates/telco/domain/billing/{domain_undertand_bill.yml → understand_bill.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reboot_router.yml → reboot_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reset_router.yml → reset_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_run_speed_test.yml → run_speed_test.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_solve_internet_issue.yml → solve_internet_issue.yml} +0 -0
- {rasa_pro-3.14.0a15.dist-info → rasa_pro-3.14.0a17.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0a15.dist-info → rasa_pro-3.14.0a17.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0a15.dist-info → rasa_pro-3.14.0a17.dist-info}/entry_points.txt +0 -0
rasa/builder/main.py
CHANGED
|
@@ -22,9 +22,11 @@ from rasa.builder.logging_utils import (
|
|
|
22
22
|
log_request_start,
|
|
23
23
|
)
|
|
24
24
|
from rasa.builder.service import bp, setup_project_generator
|
|
25
|
+
from rasa.builder.template_cache import (
|
|
26
|
+
background_download_template_caches,
|
|
27
|
+
)
|
|
25
28
|
from rasa.builder.training_service import try_load_existing_agent, update_agent
|
|
26
29
|
from rasa.core.channels.studio_chat import StudioChatInput
|
|
27
|
-
from rasa.model_manager.warm_rasa_process import warmup
|
|
28
30
|
from rasa.server import configure_cors
|
|
29
31
|
from rasa.utils.common import configure_logging_and_warnings
|
|
30
32
|
from rasa.utils.log_utils import configure_structlog
|
|
@@ -148,6 +150,16 @@ def create_app(project_folder: str) -> Sanic:
|
|
|
148
150
|
except Exception as e:
|
|
149
151
|
structlogger.warning("Failed to load agent on server startup", error=str(e))
|
|
150
152
|
|
|
153
|
+
if config.HELLO_RASA_PROJECT_ID and app.ctx.project_generator.is_empty():
|
|
154
|
+
app.register_listener(background_download_template_caches, "after_server_start")
|
|
155
|
+
else:
|
|
156
|
+
structlogger.debug(
|
|
157
|
+
"builder.main.background_cache_download.disabled",
|
|
158
|
+
event_info=(
|
|
159
|
+
"No hello rasa project id set; skipping background cache download"
|
|
160
|
+
),
|
|
161
|
+
)
|
|
162
|
+
|
|
151
163
|
return app
|
|
152
164
|
|
|
153
165
|
|
|
@@ -188,12 +200,9 @@ def main(project_folder: Optional[str] = None) -> None:
|
|
|
188
200
|
rasa.telemetry.initialize_telemetry()
|
|
189
201
|
rasa.telemetry.initialize_error_reporting(private_mode=False)
|
|
190
202
|
|
|
203
|
+
# TODO: don't do this when running locally
|
|
191
204
|
_apply_llm_overrides_from_builder_env()
|
|
192
205
|
|
|
193
|
-
if config.HELLO_RASA_PROJECT_ID:
|
|
194
|
-
# ensures long import times for modules are ahead of time
|
|
195
|
-
warmup()
|
|
196
|
-
|
|
197
206
|
# working directory needs to be the project folder, e.g.
|
|
198
207
|
# for relative paths (./docs) in a projects config to work
|
|
199
208
|
if not project_folder:
|
rasa/builder/models.py
CHANGED
|
@@ -6,7 +6,7 @@ from pathlib import Path
|
|
|
6
6
|
from typing import Any, Dict, List, Literal, Optional
|
|
7
7
|
|
|
8
8
|
import structlog
|
|
9
|
-
from pydantic import BaseModel, Field,
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
10
10
|
|
|
11
11
|
from rasa.cli.scaffold import ProjectTemplateName
|
|
12
12
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
@@ -21,7 +21,8 @@ class PromptRequest(BaseModel):
|
|
|
21
21
|
..., min_length=1, max_length=10000, description="The skill description prompt"
|
|
22
22
|
)
|
|
23
23
|
|
|
24
|
-
@
|
|
24
|
+
@field_validator("prompt")
|
|
25
|
+
@classmethod
|
|
25
26
|
def validate_prompt(cls, v: str) -> str:
|
|
26
27
|
if not v.strip():
|
|
27
28
|
raise ValueError("Prompt cannot be empty or whitespace only")
|
|
@@ -38,7 +39,8 @@ class TemplateRequest(BaseModel):
|
|
|
38
39
|
),
|
|
39
40
|
)
|
|
40
41
|
|
|
41
|
-
@
|
|
42
|
+
@field_validator("template_name")
|
|
43
|
+
@classmethod
|
|
42
44
|
def validate_template_name(cls, v: Any) -> Any:
|
|
43
45
|
if v not in ProjectTemplateName:
|
|
44
46
|
raise ValueError(
|
|
@@ -54,10 +56,8 @@ class BotDataUpdateRequest(BaseModel):
|
|
|
54
56
|
flows_yml: Optional[str] = Field(None, alias="flows.yml")
|
|
55
57
|
config_yml: Optional[str] = Field(None, alias="config.yml")
|
|
56
58
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
allow_population_by_field_name = True
|
|
59
|
+
# Allow using either field names or aliases when creating the model
|
|
60
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
class BotData(BaseModel):
|
|
@@ -5,23 +5,25 @@ import os
|
|
|
5
5
|
import shutil
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from textwrap import dedent
|
|
8
|
-
from typing import Any, Dict, List, Optional
|
|
8
|
+
from typing import Any, Dict, Generator, List, Optional
|
|
9
9
|
|
|
10
10
|
import structlog
|
|
11
11
|
|
|
12
12
|
from rasa.builder import config
|
|
13
13
|
from rasa.builder.exceptions import ProjectGenerationError, ValidationError
|
|
14
14
|
from rasa.builder.llm_service import get_skill_generation_messages, llm_service
|
|
15
|
+
from rasa.builder.logging_utils import capture_exception_with_context
|
|
15
16
|
from rasa.builder.models import BotFiles
|
|
16
17
|
from rasa.builder.project_info import ProjectInfo, ensure_first_used, load_project_info
|
|
17
18
|
from rasa.builder.template_cache import copy_cache_for_template_if_available
|
|
18
19
|
from rasa.builder.training_service import TrainingInput
|
|
19
20
|
from rasa.builder.validation_service import validate_project
|
|
20
21
|
from rasa.cli.scaffold import ProjectTemplateName, create_initial_project
|
|
22
|
+
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
21
23
|
from rasa.shared.core.flows import yaml_flows_io
|
|
22
24
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
23
25
|
from rasa.shared.utils.yaml import dump_obj_as_yaml_to_string
|
|
24
|
-
from rasa.utils.io import subpath
|
|
26
|
+
from rasa.utils.io import InvalidPathException, subpath
|
|
25
27
|
|
|
26
28
|
structlogger = structlog.get_logger()
|
|
27
29
|
|
|
@@ -60,7 +62,7 @@ class ProjectGenerator:
|
|
|
60
62
|
create_initial_project(self.project_folder.as_posix(), template)
|
|
61
63
|
# If a local cache for this template exists, copy it into the project.
|
|
62
64
|
# We no longer download here to avoid blocking project creation.
|
|
63
|
-
|
|
65
|
+
copy_cache_for_template_if_available(template, self.project_folder)
|
|
64
66
|
# needs to happen after caching, as we download/copy .rasa and that would
|
|
65
67
|
# overwrite the project info file in .rasa
|
|
66
68
|
ensure_first_used(self.project_folder)
|
|
@@ -233,25 +235,9 @@ class ProjectGenerator:
|
|
|
233
235
|
"""
|
|
234
236
|
bot_files: BotFiles = {}
|
|
235
237
|
|
|
236
|
-
for file in self.
|
|
237
|
-
# Skip directories
|
|
238
|
-
if not file.is_file():
|
|
239
|
-
continue
|
|
240
|
-
|
|
238
|
+
for file in self.bot_file_paths():
|
|
241
239
|
relative_path = file.relative_to(self.project_folder)
|
|
242
240
|
|
|
243
|
-
# Skip hidden files and directories (any path component starting with '.')
|
|
244
|
-
# as well as `__pycache__` folders
|
|
245
|
-
if any(part.startswith(".") for part in relative_path.parts):
|
|
246
|
-
continue
|
|
247
|
-
|
|
248
|
-
if "__pycache__" in relative_path.parts:
|
|
249
|
-
continue
|
|
250
|
-
|
|
251
|
-
# exclude the project_folder / models folder
|
|
252
|
-
if relative_path.parts[0] == "models":
|
|
253
|
-
continue
|
|
254
|
-
|
|
255
241
|
# Exclude the docs directory if specified
|
|
256
242
|
if exclude_docs_directory and relative_path.parts[0] == "docs":
|
|
257
243
|
continue
|
|
@@ -263,7 +249,6 @@ class ProjectGenerator:
|
|
|
263
249
|
]
|
|
264
250
|
if file.suffix.lstrip(".").lower() not in allowed_file_extensions:
|
|
265
251
|
continue
|
|
266
|
-
|
|
267
252
|
# Read file content and store with relative path as key
|
|
268
253
|
try:
|
|
269
254
|
bot_files[relative_path.as_posix()] = file.read_text(encoding="utf-8")
|
|
@@ -274,9 +259,40 @@ class ProjectGenerator:
|
|
|
274
259
|
file_path=file.as_posix(),
|
|
275
260
|
)
|
|
276
261
|
bot_files[relative_path.as_posix()] = None
|
|
277
|
-
|
|
278
262
|
return bot_files
|
|
279
263
|
|
|
264
|
+
def is_restricted_path(self, path: Path) -> bool:
|
|
265
|
+
"""Check if the path is restricted.
|
|
266
|
+
|
|
267
|
+
These paths are excluded from deletion and editing by the user.
|
|
268
|
+
"""
|
|
269
|
+
relative_path = path.relative_to(self.project_folder)
|
|
270
|
+
|
|
271
|
+
# Skip hidden files and directories (any path component starting with '.')
|
|
272
|
+
# as well as `__pycache__` folders
|
|
273
|
+
if any(part.startswith(".") for part in relative_path.parts):
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
if "__pycache__" in relative_path.parts:
|
|
277
|
+
return True
|
|
278
|
+
|
|
279
|
+
# exclude the project_folder / models folder
|
|
280
|
+
if relative_path.parts[0] == DEFAULT_MODELS_PATH:
|
|
281
|
+
return True
|
|
282
|
+
|
|
283
|
+
return False
|
|
284
|
+
|
|
285
|
+
def bot_file_paths(
|
|
286
|
+
self,
|
|
287
|
+
) -> Generator[Path, None, None]:
|
|
288
|
+
"""Get the paths of all bot files."""
|
|
289
|
+
for file in self.project_folder.glob("**/*"):
|
|
290
|
+
# Skip directories
|
|
291
|
+
if not file.is_file() or self.is_restricted_path(file):
|
|
292
|
+
continue
|
|
293
|
+
|
|
294
|
+
yield file
|
|
295
|
+
|
|
280
296
|
def _get_bot_data_for_llm(self) -> Dict[str, Any]:
|
|
281
297
|
"""Get the current bot data for the LLM."""
|
|
282
298
|
file_importer = self._create_importer()
|
|
@@ -321,7 +337,7 @@ class ProjectGenerator:
|
|
|
321
337
|
def update_bot_files(self, files: Dict[str, Optional[str]]) -> None:
|
|
322
338
|
"""Update bot files with new content by writing to disk."""
|
|
323
339
|
for filename, content in files.items():
|
|
324
|
-
file_path = Path(subpath(self.project_folder, filename))
|
|
340
|
+
file_path = Path(subpath(str(self.project_folder), filename))
|
|
325
341
|
# Disallow updates inside .rasa project metadata directory
|
|
326
342
|
if any(
|
|
327
343
|
part.startswith(".")
|
|
@@ -332,6 +348,95 @@ class ProjectGenerator:
|
|
|
332
348
|
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
333
349
|
file_path.write_text(content, encoding="utf-8")
|
|
334
350
|
|
|
351
|
+
def ensure_all_files_are_writable(self, files: Dict[str, Optional[str]]) -> None:
|
|
352
|
+
"""Ensure all files are writable."""
|
|
353
|
+
for filename, content in files.items():
|
|
354
|
+
file_path = Path(subpath(str(self.project_folder), filename))
|
|
355
|
+
if self.is_restricted_path(file_path):
|
|
356
|
+
raise InvalidPathException(
|
|
357
|
+
f"This file or folder is restricted from editing: {file_path}"
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
def replace_all_bot_files(self, files: Dict[str, Optional[str]]) -> None:
|
|
361
|
+
"""Replace all bot files with new content, deleting files not in the request.
|
|
362
|
+
|
|
363
|
+
Files/folders starting with .rasa/ or models/ are excluded from deletion.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
files: Dictionary mapping file names to their content
|
|
367
|
+
"""
|
|
368
|
+
self.ensure_all_files_are_writable(files)
|
|
369
|
+
# Collect all existing files - any files not in the new `files` dict will be
|
|
370
|
+
# deleted from this set
|
|
371
|
+
existing_files = set(path.as_posix() for path in self.bot_file_paths())
|
|
372
|
+
|
|
373
|
+
# Write all new files
|
|
374
|
+
for filename, content in files.items():
|
|
375
|
+
if content is None:
|
|
376
|
+
continue
|
|
377
|
+
|
|
378
|
+
file_path = Path(subpath(str(self.project_folder), filename))
|
|
379
|
+
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
380
|
+
|
|
381
|
+
try:
|
|
382
|
+
file_path.write_text(content, encoding="utf-8")
|
|
383
|
+
except Exception as e:
|
|
384
|
+
# Log write failure and avoid deleting an existing file by mistake
|
|
385
|
+
capture_exception_with_context(
|
|
386
|
+
e,
|
|
387
|
+
"project_generator.replace_all_bot_files.write_error",
|
|
388
|
+
extra={"file_path": file_path},
|
|
389
|
+
)
|
|
390
|
+
if file_path.as_posix() in existing_files:
|
|
391
|
+
# Keep the original file if it already existed
|
|
392
|
+
existing_files.discard(file_path.as_posix())
|
|
393
|
+
continue
|
|
394
|
+
|
|
395
|
+
# Remove from deletion set since this file is in the new set of files
|
|
396
|
+
existing_files.discard(file_path.as_posix())
|
|
397
|
+
|
|
398
|
+
# Delete files that weren't in the request
|
|
399
|
+
for file_to_delete in existing_files:
|
|
400
|
+
file_path = Path(file_to_delete)
|
|
401
|
+
try:
|
|
402
|
+
file_path.unlink()
|
|
403
|
+
except Exception as e:
|
|
404
|
+
capture_exception_with_context(
|
|
405
|
+
e,
|
|
406
|
+
"project_generator.replace_all_bot_files.delete_error",
|
|
407
|
+
extra={"file_path": file_path},
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
# Clean up empty directories (except excluded ones)
|
|
411
|
+
self._cleanup_empty_directories()
|
|
412
|
+
|
|
413
|
+
def _cleanup_empty_directories(self) -> None:
|
|
414
|
+
"""Remove empty directories from the project folder.
|
|
415
|
+
|
|
416
|
+
Excludes hidden files and directories, and models/ from cleanup.
|
|
417
|
+
"""
|
|
418
|
+
# Walk directories in reverse order (deepest first)
|
|
419
|
+
for dirpath, dirnames, filenames in os.walk(self.project_folder, topdown=False):
|
|
420
|
+
# Skip if this is the project root
|
|
421
|
+
if dirpath == str(self.project_folder):
|
|
422
|
+
continue
|
|
423
|
+
|
|
424
|
+
if self.is_restricted_path(Path(dirpath)):
|
|
425
|
+
continue
|
|
426
|
+
|
|
427
|
+
relative_path = Path(dirpath).relative_to(self.project_folder)
|
|
428
|
+
|
|
429
|
+
try:
|
|
430
|
+
# Only remove if directory is empty
|
|
431
|
+
if not os.listdir(dirpath):
|
|
432
|
+
os.rmdir(dirpath)
|
|
433
|
+
except Exception as e:
|
|
434
|
+
capture_exception_with_context(
|
|
435
|
+
e,
|
|
436
|
+
"project_generator.cleanup_empty_directories.error",
|
|
437
|
+
extra={"directory": relative_path.as_posix()},
|
|
438
|
+
)
|
|
439
|
+
|
|
335
440
|
def cleanup(self) -> None:
|
|
336
441
|
"""Cleanup the project folder."""
|
|
337
442
|
# remove all the files and folders in the project folder resulting
|
rasa/builder/service.py
CHANGED
|
@@ -54,8 +54,8 @@ from rasa.builder.guardrails.utils import (
|
|
|
54
54
|
from rasa.builder.job_manager import job_manager
|
|
55
55
|
from rasa.builder.jobs import (
|
|
56
56
|
run_prompt_to_bot_job,
|
|
57
|
+
run_replace_all_files_job,
|
|
57
58
|
run_template_to_bot_job,
|
|
58
|
-
run_update_files_job,
|
|
59
59
|
)
|
|
60
60
|
from rasa.builder.llm_service import llm_service
|
|
61
61
|
from rasa.builder.logging_utils import (
|
|
@@ -512,26 +512,31 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
512
512
|
)
|
|
513
513
|
|
|
514
514
|
|
|
515
|
-
@bp.route("/files", methods=["
|
|
516
|
-
@openapi.summary("
|
|
515
|
+
@bp.route("/files", methods=["POST"])
|
|
516
|
+
@openapi.summary("Replace all bot files")
|
|
517
517
|
@openapi.description(
|
|
518
|
-
"
|
|
519
|
-
"
|
|
520
|
-
"
|
|
518
|
+
"Replaces all bot configuration files with the provided files, deletes any "
|
|
519
|
+
"files not included in the request (excluding .rasa/ and models/ directories), "
|
|
520
|
+
"and retrains the model. Returns immediately with a job ID. Connect to "
|
|
521
|
+
"`/job-events/<job_id>` for real-time SSE progress tracking."
|
|
521
522
|
"\n\n"
|
|
523
|
+
"**File Management:**\n"
|
|
524
|
+
"- All files in the request are written to the project folder\n"
|
|
525
|
+
"- Files not included in the request are deleted from the project\n"
|
|
526
|
+
"- Files/folders starting with `.rasa/` or `models/` are excluded from deletion\n\n"
|
|
522
527
|
"**SSE Event Flow:** (available via /job-events/<job_id>)\n"
|
|
523
528
|
"1. `received` - Request received by server\n"
|
|
524
529
|
"2. `validating` - Validating bot configuration files\n"
|
|
525
530
|
"3. `validation_success` - File validation completed successfully\n"
|
|
526
531
|
"4. `training` - Training the bot model with updated files\n"
|
|
527
532
|
"5. `train_success` - Model training completed\n"
|
|
528
|
-
"6. `done` - Bot files
|
|
533
|
+
"6. `done` - Bot files replacement completed\n\n"
|
|
529
534
|
"**Error Events (can occur at any time):**\n"
|
|
530
535
|
"- `validation_error` - Bot configuration files are invalid\n"
|
|
531
536
|
"- `train_error` - Files updated but training failed\n"
|
|
532
537
|
"- `error` - Unexpected error occurred\n\n"
|
|
533
538
|
"**Usage:**\n"
|
|
534
|
-
"1. Send
|
|
539
|
+
"1. Send POST request with Content-Type: application/json\n"
|
|
535
540
|
"2. The response will be a JSON object `{job_id: ...}`\n"
|
|
536
541
|
"3. Connect to `/job-events/<job_id>` for a server-sent event stream of progress."
|
|
537
542
|
)
|
|
@@ -539,9 +544,11 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
539
544
|
@openapi.body(
|
|
540
545
|
{"application/json": {str: Optional[str]}},
|
|
541
546
|
description=(
|
|
542
|
-
"A dictionary mapping file names to their
|
|
543
|
-
"
|
|
544
|
-
"Files
|
|
547
|
+
"A dictionary mapping file names to their complete content. "
|
|
548
|
+
"All files in the project will be replaced with these files. "
|
|
549
|
+
"Files not included in the request will be deleted from the project "
|
|
550
|
+
"(except for .rasa/ and models/ directories). "
|
|
551
|
+
"The file name should be the relative path from the project root."
|
|
545
552
|
),
|
|
546
553
|
required=True,
|
|
547
554
|
example={
|
|
@@ -558,6 +565,10 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
558
565
|
" - name: CountVectorsFeaturizer\n"
|
|
559
566
|
"policies:\n - name: MemoizationPolicy\n - name: RulePolicy"
|
|
560
567
|
),
|
|
568
|
+
"data/nlu.yml": (
|
|
569
|
+
"version: '3.1'\n"
|
|
570
|
+
"nlu:\n- intent: greet\n examples: |\n - hello\n - hi"
|
|
571
|
+
),
|
|
561
572
|
},
|
|
562
573
|
)
|
|
563
574
|
@openapi.response(
|
|
@@ -565,7 +576,7 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
565
576
|
{"application/json": model_to_schema(JobCreateResponse)},
|
|
566
577
|
description=(
|
|
567
578
|
"Job created. Poll or subscribe to /job-events/<job_id> "
|
|
568
|
-
"for progress and SSE updates."
|
|
579
|
+
"for progress and SSE updates on file replacement and training."
|
|
569
580
|
),
|
|
570
581
|
)
|
|
571
582
|
@openapi.response(
|
|
@@ -607,8 +618,8 @@ async def get_bot_files(request: Request) -> HTTPResponse:
|
|
|
607
618
|
schema=str,
|
|
608
619
|
)
|
|
609
620
|
@protected()
|
|
610
|
-
async def
|
|
611
|
-
"""
|
|
621
|
+
async def replace_all_bot_files(request: Request) -> HTTPResponse:
|
|
622
|
+
"""Replace all bot files with server-sent events for progress tracking."""
|
|
612
623
|
try:
|
|
613
624
|
bot_files = request.json
|
|
614
625
|
except Exception as exc:
|
|
@@ -621,17 +632,17 @@ async def update_bot_files(request: Request) -> HTTPResponse:
|
|
|
621
632
|
|
|
622
633
|
try:
|
|
623
634
|
job = job_manager.create_job()
|
|
624
|
-
request.app.add_task(
|
|
635
|
+
request.app.add_task(run_replace_all_files_job(request.app, job, bot_files))
|
|
625
636
|
return response.json(JobCreateResponse(job_id=job.id).model_dump(), status=200)
|
|
626
637
|
except Exception as exc:
|
|
627
638
|
capture_exception_with_context(
|
|
628
639
|
exc,
|
|
629
|
-
"bot_builder_service.
|
|
630
|
-
tags={"endpoint": "/api/files", "method": "
|
|
640
|
+
"bot_builder_service.replace_all_bot_files.unexpected_error",
|
|
641
|
+
tags={"endpoint": "/api/files", "method": "POST"},
|
|
631
642
|
)
|
|
632
643
|
return response.json(
|
|
633
644
|
ApiErrorResponse(
|
|
634
|
-
error="Failed to
|
|
645
|
+
error="Failed to replace bot files", details={"error": str(exc)}
|
|
635
646
|
).model_dump(),
|
|
636
647
|
status=HTTPStatus.INTERNAL_SERVER_ERROR,
|
|
637
648
|
)
|
|
@@ -1122,11 +1133,9 @@ async def copilot(request: Request) -> None:
|
|
|
1122
1133
|
# copilot response handler
|
|
1123
1134
|
start_timestamp = time.perf_counter()
|
|
1124
1135
|
copilot_client = llm_service.instantiate_copilot()
|
|
1125
|
-
(
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
system_prompt,
|
|
1129
|
-
) = await copilot_client.generate_response(context)
|
|
1136
|
+
(original_stream, generation_context) = await copilot_client.generate_response(
|
|
1137
|
+
context
|
|
1138
|
+
)
|
|
1130
1139
|
|
|
1131
1140
|
copilot_response_handler = llm_service.instantiate_handler(
|
|
1132
1141
|
COPILOT_HANDLER_ROLLING_BUFFER_SIZE
|
|
@@ -1142,18 +1151,24 @@ async def copilot(request: Request) -> None:
|
|
|
1142
1151
|
asyncio.to_thread(
|
|
1143
1152
|
telemetry.log_copilot_from_handler,
|
|
1144
1153
|
handler=copilot_response_handler,
|
|
1145
|
-
used_documents=
|
|
1154
|
+
used_documents=generation_context.relevant_documents,
|
|
1146
1155
|
latency_ms=int((time.perf_counter() - start_timestamp) * 1000),
|
|
1147
|
-
|
|
1156
|
+
system_message=generation_context.system_message,
|
|
1157
|
+
chat_history=generation_context.chat_history,
|
|
1158
|
+
last_user_message=(
|
|
1159
|
+
req.last_message.get_text_content()
|
|
1160
|
+
if (req.last_message and req.last_message.role == ROLE_USER)
|
|
1161
|
+
else None
|
|
1162
|
+
),
|
|
1148
1163
|
**copilot_client.usage_statistics.model_dump(),
|
|
1149
1164
|
)
|
|
1150
1165
|
)
|
|
1151
1166
|
|
|
1152
1167
|
# 9. Once the stream is over, extract and send references
|
|
1153
1168
|
# if any documents were used
|
|
1154
|
-
if
|
|
1169
|
+
if generation_context.relevant_documents:
|
|
1155
1170
|
reference_section = copilot_response_handler.extract_references(
|
|
1156
|
-
|
|
1171
|
+
generation_context.relevant_documents
|
|
1157
1172
|
)
|
|
1158
1173
|
await sse.send(reference_section.to_sse_event().format())
|
|
1159
1174
|
|