rasa-pro 3.13.12__py3-none-any.whl → 3.14.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +213 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +889 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +778 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +228 -0
- rasa/agents/validation.py +538 -0
- rasa/api.py +23 -9
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +96 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +38 -0
- rasa/builder/copilot/copilot.py +562 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +81 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +690 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +787 -0
- rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +91 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +234 -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 +41 -0
- rasa/builder/copilot/templated_messages/copilot_welcome_messages.yml +56 -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/clients.py +256 -0
- rasa/builder/guardrails/constants.py +12 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/models.py +266 -0
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +94 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +609 -0
- rasa/builder/llm_service.py +273 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +234 -0
- rasa/builder/models.py +229 -0
- rasa/builder/project_generator.py +463 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/service.py +1367 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +188 -0
- rasa/builder/validation_service.py +101 -0
- rasa/cli/arguments/data.py +9 -0
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +78 -10
- rasa/cli/dialogue_understanding_test.py +11 -7
- rasa/cli/e2e_test.py +10 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +9 -4
- rasa/cli/interactive.py +8 -4
- rasa/cli/llm_fine_tuning.py +12 -6
- 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 +8 -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 +11 -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/basic/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/help.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/human_handoff.yml +41 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/patterns.yml +32 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/show_faqs.yml +8 -0
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/defaults.py +1 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- 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/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -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 +29 -0
- rasa/cli/project_templates/finance/credentials.yml +33 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
- 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 +45 -0
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +6 -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_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/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 +34 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
- 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 +44 -0
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
- rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
- 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 +221 -0
- rasa/cli/project_templates/finance/endpoints.yml +67 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/transfers/transfer_money.yml +56 -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 +8 -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 +13 -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 +74 -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/with_stub/network/solve_internet_not_slow.yml +33 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_slow.yml +47 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/patterns.yml +23 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +8 -10
- rasa/cli/scaffold.py +50 -6
- rasa/cli/shell.py +10 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +44 -30
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +232 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +53 -13
- rasa/core/actions/action_exceptions.py +1 -1
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +22 -2
- rasa/core/available_agents.py +239 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +56 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +29 -16
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +56 -12
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +55 -1
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +82 -32
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_ready/twilio_voice.py +1 -1
- 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 +11 -6
- rasa/core/channels/voice_stream/browser_audio.py +91 -4
- rasa/core/channels/voice_stream/call_state.py +13 -2
- rasa/core/channels/voice_stream/genesys.py +19 -15
- rasa/core/channels/voice_stream/jambonz.py +22 -12
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
- rasa/core/channels/voice_stream/util.py +11 -1
- rasa/core/channels/voice_stream/voice_channel.py +170 -32
- rasa/core/concurrent_lock_store.py +83 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
- rasa/core/config/configuration.py +295 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +17 -0
- rasa/core/exceptions.py +1 -1
- rasa/core/featurizers/tracker_featurizers.py +3 -2
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
- rasa/core/lock_store.py +50 -10
- rasa/core/nlg/contextual_response_rephraser.py +5 -0
- rasa/core/nlg/generator.py +1 -1
- rasa/core/persistor.py +7 -7
- rasa/core/policies/enterprise_search_policy.py +9 -10
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +720 -0
- rasa/core/policies/flows/flow_exceptions.py +5 -2
- rasa/core/policies/flows/flow_executor.py +146 -77
- rasa/core/policies/flows/mcp_tool_executor.py +304 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/rule_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +100 -44
- rasa/core/redis_connection_factory.py +474 -0
- rasa/core/run.py +49 -10
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +36 -14
- rasa/core/tracker_stores/sql_tracker_store.py +59 -1
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
- rasa/dialogue_understanding/commands/utils.py +135 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/validation.py +25 -8
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +2 -2
- rasa/model_manager/socket_bridge.py +21 -17
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_config.py +1 -1
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
- rasa/shared/agents/auth/constants.py +13 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/auth/utils.py +85 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +11 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +62 -22
- rasa/shared/core/events.py +329 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +57 -6
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +19 -10
- rasa/shared/core/slots.py +6 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
- rasa/shared/exceptions.py +39 -2
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +86 -4
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +26 -1
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +92 -19
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +250 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/download.py +3 -0
- rasa/studio/prompts.py +1 -0
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +19 -52
- rasa/telemetry.py +166 -28
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +121 -7
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/plotting.py +1 -1
- rasa/utils/pypred.py +45 -0
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +149 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dist-info/METADATA +212 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +581 -269
- rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
- rasa_pro-3.13.12.dist-info/METADATA +0 -192
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import time
|
|
3
|
+
import uuid
|
|
4
|
+
from typing import AsyncGenerator, ClassVar, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field, PrivateAttr
|
|
7
|
+
|
|
8
|
+
from rasa.builder.models import JobStatusEvent, ServerSentEventType
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class JobInfo(BaseModel):
|
|
12
|
+
"""Information about a job being processed by the worker."""
|
|
13
|
+
|
|
14
|
+
id: str
|
|
15
|
+
status: str = ""
|
|
16
|
+
error: Optional[str] = None
|
|
17
|
+
created_at: float = Field(default_factory=time.time)
|
|
18
|
+
|
|
19
|
+
_history: List[JobStatusEvent] = PrivateAttr(default_factory=list)
|
|
20
|
+
_queue: asyncio.Queue = PrivateAttr(default_factory=asyncio.Queue)
|
|
21
|
+
|
|
22
|
+
class Config:
|
|
23
|
+
arbitrary_types_allowed = True
|
|
24
|
+
|
|
25
|
+
async def put(self, event: JobStatusEvent) -> None:
|
|
26
|
+
"""Put an event onto the job's queue.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
event: The JobStatusEvent to put onto the queue.
|
|
30
|
+
"""
|
|
31
|
+
await self._queue.put(event)
|
|
32
|
+
|
|
33
|
+
async def event_stream(self) -> AsyncGenerator[JobStatusEvent, None]:
|
|
34
|
+
"""Yield events as they are put on the queue by the worker task.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
An async generator that yields JobStatusEvent objects.
|
|
38
|
+
"""
|
|
39
|
+
# 1) Replay history and stop if EOF recorded
|
|
40
|
+
for sse in self._history:
|
|
41
|
+
if (
|
|
42
|
+
isinstance(sse, JobStatusEvent)
|
|
43
|
+
and sse.event == ServerSentEventType._EOF.value
|
|
44
|
+
):
|
|
45
|
+
return
|
|
46
|
+
yield sse
|
|
47
|
+
|
|
48
|
+
# 2) Stream live events and stop on EOF
|
|
49
|
+
while True:
|
|
50
|
+
sse = await self._queue.get()
|
|
51
|
+
self._history.append(sse)
|
|
52
|
+
if (
|
|
53
|
+
isinstance(sse, JobStatusEvent)
|
|
54
|
+
and sse.event == ServerSentEventType._EOF.value
|
|
55
|
+
):
|
|
56
|
+
return
|
|
57
|
+
yield sse
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class JobManager:
|
|
61
|
+
"""Very small in-memory job registry (single-process only)."""
|
|
62
|
+
|
|
63
|
+
_jobs: ClassVar[Dict[str, JobInfo]] = {}
|
|
64
|
+
|
|
65
|
+
def create_job(self) -> JobInfo:
|
|
66
|
+
job_id = uuid.uuid4().hex
|
|
67
|
+
job = JobInfo(id=job_id)
|
|
68
|
+
self._jobs[job_id] = job
|
|
69
|
+
return job
|
|
70
|
+
|
|
71
|
+
def get_job(self, job_id: str) -> Optional[JobInfo]:
|
|
72
|
+
return self._jobs.get(job_id)
|
|
73
|
+
|
|
74
|
+
@staticmethod
|
|
75
|
+
def mark_done(job: JobInfo, *, error: Optional[str] = None) -> None:
|
|
76
|
+
"""Mark a job as done.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
job: The JobInfo instance to mark as done.
|
|
80
|
+
error: Optional error message if the job failed.
|
|
81
|
+
"""
|
|
82
|
+
job.error = error
|
|
83
|
+
eof = JobStatusEvent.eof()
|
|
84
|
+
job._queue.put_nowait(eof)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
job_manager = JobManager()
|
rasa/builder/jobs.py
ADDED
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from sanic import Sanic
|
|
5
|
+
|
|
6
|
+
from rasa.builder import config
|
|
7
|
+
from rasa.builder.copilot.constants import (
|
|
8
|
+
PROMPT_TO_BOT_KEY,
|
|
9
|
+
)
|
|
10
|
+
from rasa.builder.copilot.copilot_templated_message_provider import (
|
|
11
|
+
load_copilot_handler_default_responses,
|
|
12
|
+
load_copilot_welcome_messages,
|
|
13
|
+
)
|
|
14
|
+
from rasa.builder.copilot.models import (
|
|
15
|
+
CopilotContext,
|
|
16
|
+
FileContent,
|
|
17
|
+
InternalCopilotRequestChatMessage,
|
|
18
|
+
LogContent,
|
|
19
|
+
ResponseCategory,
|
|
20
|
+
TrainingErrorLog,
|
|
21
|
+
)
|
|
22
|
+
from rasa.builder.exceptions import (
|
|
23
|
+
LLMGenerationError,
|
|
24
|
+
ProjectGenerationError,
|
|
25
|
+
TrainingError,
|
|
26
|
+
ValidationError,
|
|
27
|
+
)
|
|
28
|
+
from rasa.builder.job_manager import JobInfo, job_manager
|
|
29
|
+
from rasa.builder.llm_service import llm_service
|
|
30
|
+
from rasa.builder.models import (
|
|
31
|
+
JobStatus,
|
|
32
|
+
JobStatusEvent,
|
|
33
|
+
)
|
|
34
|
+
from rasa.builder.project_generator import ProjectGenerator
|
|
35
|
+
from rasa.builder.training_service import (
|
|
36
|
+
train_and_load_agent,
|
|
37
|
+
try_load_existing_agent,
|
|
38
|
+
update_agent,
|
|
39
|
+
)
|
|
40
|
+
from rasa.builder.validation_service import validate_project
|
|
41
|
+
from rasa.cli.scaffold import ProjectTemplateName
|
|
42
|
+
|
|
43
|
+
structlogger = structlog.get_logger()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def push_job_status_event(
|
|
47
|
+
job: JobInfo,
|
|
48
|
+
status: JobStatus,
|
|
49
|
+
message: Optional[str] = None,
|
|
50
|
+
payload: Optional[Dict[str, Any]] = None,
|
|
51
|
+
) -> None:
|
|
52
|
+
event = JobStatusEvent.from_status(
|
|
53
|
+
status=status.value, message=message, payload=payload
|
|
54
|
+
)
|
|
55
|
+
job.status = status.value
|
|
56
|
+
await job.put(event)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def run_prompt_to_bot_job(
|
|
60
|
+
app: Any,
|
|
61
|
+
job: JobInfo,
|
|
62
|
+
prompt: str,
|
|
63
|
+
) -> None:
|
|
64
|
+
"""Run the prompt-to-bot job in the background.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
app: The Sanic application instance.
|
|
68
|
+
job: The job information instance.
|
|
69
|
+
prompt: The natural language prompt for bot generation.
|
|
70
|
+
"""
|
|
71
|
+
project_generator: ProjectGenerator = app.ctx.project_generator
|
|
72
|
+
|
|
73
|
+
await push_job_status_event(job, JobStatus.received)
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
# 1. Generating
|
|
77
|
+
await push_job_status_event(job, JobStatus.generating)
|
|
78
|
+
bot_files = await project_generator.generate_project_with_retries(
|
|
79
|
+
prompt,
|
|
80
|
+
template=ProjectTemplateName.BASIC,
|
|
81
|
+
)
|
|
82
|
+
await push_job_status_event(job, JobStatus.generation_success)
|
|
83
|
+
|
|
84
|
+
# 2. Training
|
|
85
|
+
await push_job_status_event(job, JobStatus.training)
|
|
86
|
+
agent = await train_and_load_agent(project_generator.get_training_input())
|
|
87
|
+
update_agent(agent, app)
|
|
88
|
+
await push_job_status_event(job, JobStatus.train_success)
|
|
89
|
+
|
|
90
|
+
# 3. Create copilot welcome message job
|
|
91
|
+
copilot_welcome_job = job_manager.create_job()
|
|
92
|
+
app.add_task(run_copilot_welcome_message_job(app, copilot_welcome_job))
|
|
93
|
+
|
|
94
|
+
structlogger.info(
|
|
95
|
+
"bot_builder_service.prompt_to_bot.success",
|
|
96
|
+
files_generated=list(bot_files.keys()),
|
|
97
|
+
copilot_welcome_job_id=copilot_welcome_job.id,
|
|
98
|
+
)
|
|
99
|
+
await push_job_status_event(
|
|
100
|
+
job=job,
|
|
101
|
+
status=JobStatus.done,
|
|
102
|
+
payload={"copilot_welcome_job_id": copilot_welcome_job.id},
|
|
103
|
+
)
|
|
104
|
+
job_manager.mark_done(job)
|
|
105
|
+
|
|
106
|
+
except TrainingError as exc:
|
|
107
|
+
structlogger.debug(
|
|
108
|
+
"prompt_to_bot_job.training_error", job_id=job.id, error=str(exc)
|
|
109
|
+
)
|
|
110
|
+
await push_job_status_event(job, JobStatus.train_error, message=str(exc))
|
|
111
|
+
job_manager.mark_done(job, error=str(exc))
|
|
112
|
+
|
|
113
|
+
except ValidationError as exc:
|
|
114
|
+
# Log levels to include in the error message
|
|
115
|
+
log_levels = ["error"]
|
|
116
|
+
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
117
|
+
log_levels.append("warning")
|
|
118
|
+
|
|
119
|
+
structlogger.debug(
|
|
120
|
+
"prompt_to_bot_job.validation_error",
|
|
121
|
+
job_id=job.id,
|
|
122
|
+
error=str(exc),
|
|
123
|
+
all_validation_logs=exc.validation_logs,
|
|
124
|
+
included_log_levels=log_levels,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
error_message = exc.get_error_message_with_logs(log_levels=log_levels)
|
|
128
|
+
await push_job_status_event(
|
|
129
|
+
job, JobStatus.validation_error, message=error_message
|
|
130
|
+
)
|
|
131
|
+
job_manager.mark_done(job, error=error_message)
|
|
132
|
+
|
|
133
|
+
except (ProjectGenerationError, LLMGenerationError) as exc:
|
|
134
|
+
structlogger.debug(
|
|
135
|
+
"prompt_to_bot_job.generation_error", job_id=job.id, error=str(exc)
|
|
136
|
+
)
|
|
137
|
+
await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
|
|
138
|
+
job_manager.mark_done(job, error=str(exc))
|
|
139
|
+
|
|
140
|
+
except Exception as exc:
|
|
141
|
+
# Capture full traceback
|
|
142
|
+
structlogger.exception(
|
|
143
|
+
"prompt_to_bot_job.unexpected_error", job_id=job.id, error=str(exc)
|
|
144
|
+
)
|
|
145
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
146
|
+
job_manager.mark_done(job, error=str(exc))
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
async def run_template_to_bot_job(
|
|
150
|
+
app: "Sanic",
|
|
151
|
+
job: JobInfo,
|
|
152
|
+
template_name: ProjectTemplateName,
|
|
153
|
+
) -> None:
|
|
154
|
+
"""Run the template-to-bot job in the background.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
app: The Sanic application instance.
|
|
158
|
+
job: The job information instance.
|
|
159
|
+
template_name: The name of the template to use for bot generation.
|
|
160
|
+
"""
|
|
161
|
+
project_generator: ProjectGenerator = app.ctx.project_generator
|
|
162
|
+
|
|
163
|
+
await push_job_status_event(job, JobStatus.received)
|
|
164
|
+
|
|
165
|
+
try:
|
|
166
|
+
# 1) Generating
|
|
167
|
+
await push_job_status_event(job, JobStatus.generating)
|
|
168
|
+
await project_generator.init_from_template(template_name)
|
|
169
|
+
bot_files = project_generator.get_bot_files()
|
|
170
|
+
await push_job_status_event(job, JobStatus.generation_success)
|
|
171
|
+
|
|
172
|
+
# 2) Training
|
|
173
|
+
await push_job_status_event(job, JobStatus.training)
|
|
174
|
+
agent = await try_load_existing_agent(project_generator.project_folder)
|
|
175
|
+
if agent is None:
|
|
176
|
+
agent = await train_and_load_agent(project_generator.get_training_input())
|
|
177
|
+
else:
|
|
178
|
+
structlogger.info(
|
|
179
|
+
"bot_builder_service.template_to_bot.agent_loaded_from_cache",
|
|
180
|
+
)
|
|
181
|
+
update_agent(agent, app)
|
|
182
|
+
await push_job_status_event(job, JobStatus.train_success)
|
|
183
|
+
|
|
184
|
+
# 3) Create copilot welcome message job
|
|
185
|
+
copilot_welcome_job = job_manager.create_job()
|
|
186
|
+
app.add_task(
|
|
187
|
+
run_copilot_welcome_message_job(app, copilot_welcome_job, template_name)
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
# 4) Done - include welcome job ID in payload
|
|
191
|
+
structlogger.info(
|
|
192
|
+
"bot_builder_service.template_to_bot.success",
|
|
193
|
+
files_generated=list(bot_files.keys()),
|
|
194
|
+
copilot_welcome_job_id=copilot_welcome_job.id,
|
|
195
|
+
)
|
|
196
|
+
await push_job_status_event(
|
|
197
|
+
job=job,
|
|
198
|
+
status=JobStatus.done,
|
|
199
|
+
payload={"copilot_welcome_job_id": copilot_welcome_job.id},
|
|
200
|
+
)
|
|
201
|
+
job_manager.mark_done(job)
|
|
202
|
+
|
|
203
|
+
except TrainingError as exc:
|
|
204
|
+
structlogger.debug(
|
|
205
|
+
"template_to_bot_job.training_error",
|
|
206
|
+
job_id=job.id,
|
|
207
|
+
error=str(exc),
|
|
208
|
+
)
|
|
209
|
+
await push_job_status_event(job, JobStatus.train_error, message=str(exc))
|
|
210
|
+
job_manager.mark_done(job, error=str(exc))
|
|
211
|
+
|
|
212
|
+
except ValidationError as exc:
|
|
213
|
+
# Log levels to include in the error message
|
|
214
|
+
log_levels = ["error"]
|
|
215
|
+
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
216
|
+
log_levels.append("warning")
|
|
217
|
+
|
|
218
|
+
structlogger.debug(
|
|
219
|
+
"template_to_bot_job.validation_error",
|
|
220
|
+
job_id=job.id,
|
|
221
|
+
error=str(exc),
|
|
222
|
+
all_validation_logs=exc.validation_logs,
|
|
223
|
+
included_log_levels=log_levels,
|
|
224
|
+
)
|
|
225
|
+
error_message = exc.get_error_message_with_logs(log_levels=log_levels)
|
|
226
|
+
await push_job_status_event(
|
|
227
|
+
job, JobStatus.validation_error, message=error_message
|
|
228
|
+
)
|
|
229
|
+
job_manager.mark_done(job, error=error_message)
|
|
230
|
+
|
|
231
|
+
except ProjectGenerationError as exc:
|
|
232
|
+
structlogger.debug(
|
|
233
|
+
"template_to_bot_job.generation_error",
|
|
234
|
+
job_id=job.id,
|
|
235
|
+
error=str(exc),
|
|
236
|
+
)
|
|
237
|
+
await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
|
|
238
|
+
job_manager.mark_done(job, error=str(exc))
|
|
239
|
+
|
|
240
|
+
except Exception as exc:
|
|
241
|
+
# Capture full traceback
|
|
242
|
+
structlogger.exception(
|
|
243
|
+
"template_to_bot_job.unexpected_error",
|
|
244
|
+
job_id=job.id,
|
|
245
|
+
error=str(exc),
|
|
246
|
+
)
|
|
247
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
248
|
+
job_manager.mark_done(job, error=str(exc))
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
async def run_replace_all_files_job(
|
|
252
|
+
app: "Sanic",
|
|
253
|
+
job: JobInfo,
|
|
254
|
+
bot_files: Dict[str, Any],
|
|
255
|
+
) -> None:
|
|
256
|
+
"""Run the replace-all-files job in the background.
|
|
257
|
+
|
|
258
|
+
This replaces all bot files with the provided files and deletes any files
|
|
259
|
+
not included in the request (excluding .rasa/ and models/ directories).
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
app: The Sanic application instance.
|
|
263
|
+
job: The job information instance.
|
|
264
|
+
bot_files: Dictionary of file names to content for replacement.
|
|
265
|
+
"""
|
|
266
|
+
project_generator = app.ctx.project_generator
|
|
267
|
+
await push_job_status_event(job, JobStatus.received)
|
|
268
|
+
|
|
269
|
+
try:
|
|
270
|
+
project_generator.replace_all_bot_files(bot_files)
|
|
271
|
+
|
|
272
|
+
# Validating
|
|
273
|
+
await push_job_status_event(job, JobStatus.validating)
|
|
274
|
+
training_input = project_generator.get_training_input()
|
|
275
|
+
validation_error = await validate_project(training_input.importer)
|
|
276
|
+
if validation_error:
|
|
277
|
+
raise ValidationError(validation_error)
|
|
278
|
+
await push_job_status_event(job, JobStatus.validation_success)
|
|
279
|
+
|
|
280
|
+
# Training
|
|
281
|
+
await push_job_status_event(job, JobStatus.training)
|
|
282
|
+
agent = await train_and_load_agent(training_input)
|
|
283
|
+
update_agent(agent, app)
|
|
284
|
+
await push_job_status_event(job, JobStatus.train_success)
|
|
285
|
+
|
|
286
|
+
# Send final done event with copilot training success response job ID
|
|
287
|
+
copilot_training_success_job = job_manager.create_job()
|
|
288
|
+
app.add_task(
|
|
289
|
+
run_copilot_training_success_job(app, copilot_training_success_job)
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
await push_job_status_event(
|
|
293
|
+
job=job,
|
|
294
|
+
status=JobStatus.done,
|
|
295
|
+
payload={
|
|
296
|
+
"copilot_training_success_job_id": copilot_training_success_job.id
|
|
297
|
+
},
|
|
298
|
+
)
|
|
299
|
+
job_manager.mark_done(job)
|
|
300
|
+
|
|
301
|
+
except ValidationError as exc:
|
|
302
|
+
log_levels = ["error"]
|
|
303
|
+
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
304
|
+
log_levels.append("warning")
|
|
305
|
+
structlogger.debug(
|
|
306
|
+
"replace_all_files_job.validation_error",
|
|
307
|
+
job_id=job.id,
|
|
308
|
+
error=str(exc),
|
|
309
|
+
validation_logs=exc.validation_logs,
|
|
310
|
+
included_log_levels=log_levels,
|
|
311
|
+
)
|
|
312
|
+
error_message = exc.get_error_message_with_logs(log_levels=log_levels)
|
|
313
|
+
# Push error event and start copilot analysis job
|
|
314
|
+
await push_error_and_start_copilot_analysis(
|
|
315
|
+
app,
|
|
316
|
+
job,
|
|
317
|
+
JobStatus.validation_error,
|
|
318
|
+
error_message,
|
|
319
|
+
bot_files,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
# After error mark job as done
|
|
323
|
+
job_manager.mark_done(job, error=error_message)
|
|
324
|
+
|
|
325
|
+
except TrainingError as exc:
|
|
326
|
+
error_message = str(exc)
|
|
327
|
+
structlogger.debug(
|
|
328
|
+
"replace_all_files_job.train_error",
|
|
329
|
+
job_id=job.id,
|
|
330
|
+
error=error_message,
|
|
331
|
+
)
|
|
332
|
+
# Push error event and start copilot analysis job
|
|
333
|
+
await push_error_and_start_copilot_analysis(
|
|
334
|
+
app,
|
|
335
|
+
job,
|
|
336
|
+
JobStatus.train_error,
|
|
337
|
+
error_message,
|
|
338
|
+
bot_files,
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
# After error mark job as done
|
|
342
|
+
job_manager.mark_done(job, error=error_message)
|
|
343
|
+
|
|
344
|
+
except Exception as exc:
|
|
345
|
+
# Capture full traceback for anything truly unexpected
|
|
346
|
+
error_message = str(exc)
|
|
347
|
+
structlogger.exception(
|
|
348
|
+
"replace_all_files_job.unexpected_error",
|
|
349
|
+
job_id=job.id,
|
|
350
|
+
error=error_message,
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
# Push error event and start copilot analysis job
|
|
354
|
+
await push_error_and_start_copilot_analysis(
|
|
355
|
+
app,
|
|
356
|
+
job,
|
|
357
|
+
JobStatus.error,
|
|
358
|
+
error_message,
|
|
359
|
+
bot_files,
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
# After error mark job as done
|
|
363
|
+
job_manager.mark_done(job, error=str(exc))
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
async def push_error_and_start_copilot_analysis(
|
|
367
|
+
app: "Sanic",
|
|
368
|
+
original_job: JobInfo,
|
|
369
|
+
original_job_status: JobStatus,
|
|
370
|
+
error_message: str,
|
|
371
|
+
bot_files: Dict[str, Any],
|
|
372
|
+
) -> None:
|
|
373
|
+
"""Start a copilot analysis job and notify the client.
|
|
374
|
+
|
|
375
|
+
Creates a copilot analysis job and sends the new job ID to the client. The new
|
|
376
|
+
job runs in the background.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
app: The Sanic application instance
|
|
380
|
+
original_job: The original job that failed
|
|
381
|
+
original_job_status: The status of the job that failed
|
|
382
|
+
error_message: The error message to analyze
|
|
383
|
+
bot_files: The bot files to include in analysis
|
|
384
|
+
"""
|
|
385
|
+
# Create a copilot analysis job. Send the new job ID to the client and
|
|
386
|
+
# run the Copilot Analysis job in the background.
|
|
387
|
+
message = "Failed to train the assistant. Starting copilot analysis."
|
|
388
|
+
|
|
389
|
+
copilot_job = job_manager.create_job()
|
|
390
|
+
# Push the error status event for the original job
|
|
391
|
+
await push_job_status_event(
|
|
392
|
+
original_job,
|
|
393
|
+
original_job_status,
|
|
394
|
+
message=message,
|
|
395
|
+
payload={"copilot_job_id": copilot_job.id},
|
|
396
|
+
)
|
|
397
|
+
# Run the copilot analysis job in the background
|
|
398
|
+
app.add_task(
|
|
399
|
+
run_copilot_training_error_analysis_job(
|
|
400
|
+
app, copilot_job, error_message, bot_files
|
|
401
|
+
)
|
|
402
|
+
)
|
|
403
|
+
structlogger.debug(
|
|
404
|
+
f"update_files_job.{original_job_status.value}.copilot_analysis_start",
|
|
405
|
+
event_info=message,
|
|
406
|
+
job_id=original_job.id,
|
|
407
|
+
error=error_message,
|
|
408
|
+
copilot_job_id=copilot_job.id,
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
async def run_copilot_training_error_analysis_job(
|
|
413
|
+
app: "Sanic",
|
|
414
|
+
job: JobInfo,
|
|
415
|
+
training_error_message: str,
|
|
416
|
+
bot_files: Dict[str, Any],
|
|
417
|
+
) -> None:
|
|
418
|
+
"""Run copilot training error analysis job."""
|
|
419
|
+
await push_job_status_event(job, JobStatus.received)
|
|
420
|
+
|
|
421
|
+
try:
|
|
422
|
+
# Create message content blocks with log content and available files
|
|
423
|
+
log_content_block = LogContent(
|
|
424
|
+
type="log", content=training_error_message, context="training_error"
|
|
425
|
+
)
|
|
426
|
+
file_content_blocks = [
|
|
427
|
+
FileContent(type="file", file_path=file_path, file_content=file_content)
|
|
428
|
+
for file_path, file_content in bot_files.items()
|
|
429
|
+
]
|
|
430
|
+
context = CopilotContext(
|
|
431
|
+
tracker_context=None, # No conversation context needed
|
|
432
|
+
copilot_chat_history=[
|
|
433
|
+
InternalCopilotRequestChatMessage(
|
|
434
|
+
role="internal_copilot_request",
|
|
435
|
+
content=[log_content_block, *file_content_blocks],
|
|
436
|
+
response_category=ResponseCategory.TRAINING_ERROR_LOG_ANALYSIS,
|
|
437
|
+
)
|
|
438
|
+
],
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
# Generate copilot response
|
|
442
|
+
copilot_client = llm_service.instantiate_copilot()
|
|
443
|
+
(
|
|
444
|
+
original_stream,
|
|
445
|
+
generation_context,
|
|
446
|
+
) = await copilot_client.generate_response(context)
|
|
447
|
+
|
|
448
|
+
copilot_response_handler = llm_service.instantiate_handler(
|
|
449
|
+
config.COPILOT_HANDLER_ROLLING_BUFFER_SIZE
|
|
450
|
+
)
|
|
451
|
+
intercepted_stream = copilot_response_handler.handle_response(original_stream)
|
|
452
|
+
|
|
453
|
+
# Stream the copilot response as job events
|
|
454
|
+
async for token in intercepted_stream:
|
|
455
|
+
# Send each token as a job event using the same format as /copilot endpoint
|
|
456
|
+
await push_job_status_event(
|
|
457
|
+
job, JobStatus.copilot_analyzing, payload=token.sse_data
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
# Send references (if any) as part of copilot_analyzing stream
|
|
461
|
+
if generation_context.relevant_documents:
|
|
462
|
+
reference_section = copilot_response_handler.extract_references(
|
|
463
|
+
generation_context.relevant_documents
|
|
464
|
+
)
|
|
465
|
+
await push_job_status_event(
|
|
466
|
+
job, JobStatus.copilot_analyzing, payload=reference_section.sse_data
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
# Send original error log as part of copilot_analyzing stream
|
|
470
|
+
training_error_log = TrainingErrorLog(logs=[log_content_block])
|
|
471
|
+
await push_job_status_event(
|
|
472
|
+
job, JobStatus.copilot_analyzing, payload=training_error_log.sse_data
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
# Send success status
|
|
476
|
+
await push_job_status_event(job, JobStatus.copilot_analysis_success)
|
|
477
|
+
|
|
478
|
+
await push_job_status_event(job, JobStatus.done)
|
|
479
|
+
job_manager.mark_done(job)
|
|
480
|
+
|
|
481
|
+
except Exception as exc:
|
|
482
|
+
structlogger.exception(
|
|
483
|
+
"copilot_training_error_analysis_job.error",
|
|
484
|
+
job_id=job.id,
|
|
485
|
+
error=str(exc),
|
|
486
|
+
)
|
|
487
|
+
await push_job_status_event(
|
|
488
|
+
job, JobStatus.copilot_analysis_error, message=str(exc)
|
|
489
|
+
)
|
|
490
|
+
job_manager.mark_done(job, error=str(exc))
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
async def run_copilot_welcome_message_job(
|
|
494
|
+
app: "Sanic",
|
|
495
|
+
job: JobInfo,
|
|
496
|
+
template_name: Optional[ProjectTemplateName] = None,
|
|
497
|
+
) -> None:
|
|
498
|
+
"""Run the welcome message job in the background.
|
|
499
|
+
|
|
500
|
+
This job sends a welcome message to the user after successful bot creation.
|
|
501
|
+
For template-based bots, it sends a predefined message.
|
|
502
|
+
For prompt-based bots, it can be extended to stream generated messages.
|
|
503
|
+
|
|
504
|
+
Args:
|
|
505
|
+
app: The Sanic application instance.
|
|
506
|
+
job: The job information instance.
|
|
507
|
+
template_name: The template name for template-based bots, None for prompt-based.
|
|
508
|
+
"""
|
|
509
|
+
try:
|
|
510
|
+
# Load welcome messages from YAML
|
|
511
|
+
welcome_messages = load_copilot_welcome_messages()
|
|
512
|
+
|
|
513
|
+
# Get the appropriate welcome message
|
|
514
|
+
if template_name:
|
|
515
|
+
welcome_message = welcome_messages.get(
|
|
516
|
+
template_name.value,
|
|
517
|
+
welcome_messages.get(PROMPT_TO_BOT_KEY),
|
|
518
|
+
)
|
|
519
|
+
else:
|
|
520
|
+
welcome_message = welcome_messages.get(PROMPT_TO_BOT_KEY)
|
|
521
|
+
|
|
522
|
+
# Send the welcome message as a single event
|
|
523
|
+
await push_job_status_event(
|
|
524
|
+
job,
|
|
525
|
+
JobStatus.copilot_welcome_message,
|
|
526
|
+
payload={
|
|
527
|
+
"content": welcome_message,
|
|
528
|
+
"response_category": "copilot",
|
|
529
|
+
"completeness": "complete",
|
|
530
|
+
},
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
# Mark job as done
|
|
534
|
+
await push_job_status_event(job, JobStatus.done)
|
|
535
|
+
job_manager.mark_done(job)
|
|
536
|
+
|
|
537
|
+
structlogger.info(
|
|
538
|
+
"copilot_welcome_message_job.success",
|
|
539
|
+
job_id=job.id,
|
|
540
|
+
template=template_name.value if template_name else PROMPT_TO_BOT_KEY,
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
except Exception as exc:
|
|
544
|
+
structlogger.exception(
|
|
545
|
+
"welcome_message_job.error",
|
|
546
|
+
job_id=job.id,
|
|
547
|
+
error=str(exc),
|
|
548
|
+
)
|
|
549
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
550
|
+
job_manager.mark_done(job, error=str(exc))
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
async def run_copilot_training_success_job(
|
|
554
|
+
app: "Sanic",
|
|
555
|
+
job: JobInfo,
|
|
556
|
+
) -> None:
|
|
557
|
+
"""Run the training success job in the background.
|
|
558
|
+
|
|
559
|
+
This job sends a training success message to the user after successful bot training.
|
|
560
|
+
|
|
561
|
+
Args:
|
|
562
|
+
app: The Sanic application instance.
|
|
563
|
+
job: The job information instance.
|
|
564
|
+
"""
|
|
565
|
+
try:
|
|
566
|
+
# Load copilot default messages from YAML
|
|
567
|
+
internal_messages = load_copilot_handler_default_responses()
|
|
568
|
+
|
|
569
|
+
# Get the appropriate training success message
|
|
570
|
+
training_success_message = internal_messages.get("training_success_response")
|
|
571
|
+
|
|
572
|
+
# Send the training success message
|
|
573
|
+
await push_job_status_event(
|
|
574
|
+
job,
|
|
575
|
+
JobStatus.train_success_message,
|
|
576
|
+
payload={
|
|
577
|
+
"content": training_success_message,
|
|
578
|
+
"response_category": "copilot",
|
|
579
|
+
"completeness": "complete",
|
|
580
|
+
},
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
# Send the training success category
|
|
584
|
+
await push_job_status_event(
|
|
585
|
+
job,
|
|
586
|
+
JobStatus.train_success_message,
|
|
587
|
+
payload={
|
|
588
|
+
"response_category": "copilot_training_success",
|
|
589
|
+
"completeness": "complete",
|
|
590
|
+
},
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
# Mark job as done
|
|
594
|
+
await push_job_status_event(job, JobStatus.done)
|
|
595
|
+
job_manager.mark_done(job)
|
|
596
|
+
|
|
597
|
+
structlogger.info(
|
|
598
|
+
"copilot_training_success_job.success",
|
|
599
|
+
job_id=job.id,
|
|
600
|
+
)
|
|
601
|
+
|
|
602
|
+
except Exception as exc:
|
|
603
|
+
structlogger.exception(
|
|
604
|
+
"copilot_training_success_job.error",
|
|
605
|
+
job_id=job.id,
|
|
606
|
+
error=str(exc),
|
|
607
|
+
)
|
|
608
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
609
|
+
job_manager.mark_done(job, error=str(exc))
|