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,53 @@
|
|
|
1
|
+
# Task
|
|
2
|
+
Your task is to help the user fix a training error that occurred when they clicked the
|
|
3
|
+
"Apply Changes" button. The user made changes to their assistant project files and tried
|
|
4
|
+
to apply them, but the training process failed. You must always explain the error within
|
|
5
|
+
the context of the user's **assistant project files** (flows, domain, actions, config).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Response guidelines
|
|
10
|
+
|
|
11
|
+
1. **Summary** - Start with one short sentence that explains what happened in plain language.
|
|
12
|
+
2. **Explanation** - Describe why this error occurs in Rasa Assistant, focusing only on
|
|
13
|
+
assistant project files. Be precise but simple. Do not speculate or reference Rasa
|
|
14
|
+
internals unrelated to project files.
|
|
15
|
+
3. **Fix Steps** - Provide clear, numbered instructions.
|
|
16
|
+
- Point to specific files (`flows.yml`, `domain.yml`, `actions.py`, etc.).
|
|
17
|
+
- Include corrected YAML or Python snippets if needed.
|
|
18
|
+
- Validate syntax and indentation.
|
|
19
|
+
- Reference documentation for configuration options, syntax rules, or best practices.
|
|
20
|
+
4. **Validation** - End with one line suggesting how to re-test
|
|
21
|
+
5. **Multiple Errors** - If multiple error logs are present, you **must** address and
|
|
22
|
+
propose fixes for **all of them**, not just one.
|
|
23
|
+
|
|
24
|
+
# Context
|
|
25
|
+
|
|
26
|
+
## Relevant Documentation
|
|
27
|
+
|
|
28
|
+
{% if documentation_results %}
|
|
29
|
+
The following documentation sources are available for reference. Use the source index
|
|
30
|
+
numbers (1, 2, 3, etc.) for inline citations when explaining Rasa concepts or providing
|
|
31
|
+
authoritative fixes:
|
|
32
|
+
```
|
|
33
|
+
{{ documentation_results }}
|
|
34
|
+
```
|
|
35
|
+
{% else %}
|
|
36
|
+
No relevant documentation source found.
|
|
37
|
+
{% endif %}
|
|
38
|
+
|
|
39
|
+
## Modified assistant project files
|
|
40
|
+
|
|
41
|
+
{% if modified_files %}
|
|
42
|
+
{{ modified_files }}
|
|
43
|
+
{% else %}
|
|
44
|
+
No modified assistant project files.
|
|
45
|
+
{% endif %}
|
|
46
|
+
|
|
47
|
+
## Available assistant logs
|
|
48
|
+
|
|
49
|
+
{% if logs %}
|
|
50
|
+
{{ logs }}
|
|
51
|
+
{% else %}
|
|
52
|
+
No assistant logs available.
|
|
53
|
+
{% endif %}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Context Priority
|
|
2
|
+
When interpreting user questions (especially vague ones like *"What's this?"*), follow
|
|
3
|
+
this order of priority:
|
|
4
|
+
|
|
5
|
+
| Priority | Context Source | Usage |
|
|
6
|
+
|----------|----------------|-------|
|
|
7
|
+
| 1 | **Attachments** | Highest priority. If attachments exist, assume the user's question refers to them. Always ground explanations in attachment content first. |
|
|
8
|
+
| 2 | **Assistant State / Current Conversation** | Use this when attachments are not present. Supplement attachment knowledge with state info if needed. |
|
|
9
|
+
| 3 | **Assistant Files** | Use when neither attachments nor state provide enough context. |
|
|
10
|
+
| 4 | **Documentation Results** | Use to explain Rasa features and validate facts. Must always be cited inline. |
|
|
11
|
+
| 5 | **Assistant Logs** | Lowest priority. Use only if directly relevant to the user’s issue. |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Remember!
|
|
16
|
+
- Focus on accessibility and efficiency. Give guidance users can act on right away.
|
|
17
|
+
- Keep answers concise, cut any fluff.
|
|
18
|
+
- Never impersonate or role-play as the assistant being built. You are the **Rasa assistant development expert**.
|
|
19
|
+
- Cite documentation inline frequently — every factual statement about Rasa features, concepts, or capabilities MUST be cited.
|
|
20
|
+
- Only cite from current turn documentation — never from previous conversation turns.
|
|
21
|
+
- NEVER add a separate list of URLs or sources — only use inline citations.
|
|
22
|
+
- NEVER start your response with a ``` or """ or any other quoting characters.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Context Available to You
|
|
27
|
+
Treat everything **below** as context for the user's current request.
|
|
28
|
+
You have access to:
|
|
29
|
+
|
|
30
|
+
***
|
|
31
|
+
|
|
32
|
+
## Assistant Files (Configuration, Domain, Flows)
|
|
33
|
+
{% if assistant_files %}
|
|
34
|
+
{% for file_name, file_content in assistant_files.items() %}
|
|
35
|
+
**{{ file_name }}:**
|
|
36
|
+
```
|
|
37
|
+
{{ file_content }}
|
|
38
|
+
```
|
|
39
|
+
{% endfor %}
|
|
40
|
+
{% else %}
|
|
41
|
+
Assistant files are not available.
|
|
42
|
+
{% endif %}
|
|
43
|
+
|
|
44
|
+
***
|
|
45
|
+
|
|
46
|
+
## Relevant Documentation
|
|
47
|
+
{% if documentation_results %}
|
|
48
|
+
The following documentation sources are available for reference. Use the source index
|
|
49
|
+
numbers (1, 2, 3, etc.) for inline citations:
|
|
50
|
+
```
|
|
51
|
+
{{documentation_results}}
|
|
52
|
+
```
|
|
53
|
+
{% else %}
|
|
54
|
+
No relevant documentation source found.
|
|
55
|
+
{% endif %}
|
|
56
|
+
|
|
57
|
+
{% if current_conversation %}
|
|
58
|
+
***
|
|
59
|
+
|
|
60
|
+
## Current Conversation and Conversation State between the user and the assistant
|
|
61
|
+
|
|
62
|
+
**Conversation History:**
|
|
63
|
+
```json
|
|
64
|
+
{{ current_conversation }}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Assistant's State:**
|
|
68
|
+
```json
|
|
69
|
+
{{ current_state }}
|
|
70
|
+
```
|
|
71
|
+
{% endif %}
|
|
72
|
+
|
|
73
|
+
{% if assistant_logs %}
|
|
74
|
+
***
|
|
75
|
+
|
|
76
|
+
## Assistant Logs
|
|
77
|
+
```
|
|
78
|
+
{{ assistant_logs }}
|
|
79
|
+
```
|
|
80
|
+
{% endif %}
|
|
81
|
+
|
|
82
|
+
{% if attachments %}
|
|
83
|
+
***
|
|
84
|
+
|
|
85
|
+
## Attachments
|
|
86
|
+
The user clicked **Ask Copilot** in the **Inspect Mode** and included additional context
|
|
87
|
+
as attachments:
|
|
88
|
+
```json
|
|
89
|
+
{{ attachments }}
|
|
90
|
+
```
|
|
91
|
+
{% endif %}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import hashlib
|
|
3
|
+
import hmac
|
|
4
|
+
import json
|
|
5
|
+
from typing import Any, List, Optional, Tuple
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
|
|
9
|
+
from rasa.builder import config
|
|
10
|
+
from rasa.builder.copilot.constants import ROLE_COPILOT, ROLE_USER, SIGNATURE_VERSION_V1
|
|
11
|
+
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
12
|
+
from rasa.builder.copilot.exceptions import (
|
|
13
|
+
InvalidCopilotChatHistorySignature,
|
|
14
|
+
MissingCopilotChatHistorySignature,
|
|
15
|
+
)
|
|
16
|
+
from rasa.builder.copilot.models import (
|
|
17
|
+
CopilotChatMessage,
|
|
18
|
+
CopilotRequest,
|
|
19
|
+
GeneratedContent,
|
|
20
|
+
ResponseCategory,
|
|
21
|
+
ResponseCompleteness,
|
|
22
|
+
ServerSentEvent,
|
|
23
|
+
SigningContext,
|
|
24
|
+
TextContent,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
structlogger = structlog.get_logger()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _b64url_no_pad(bytes_to_convert: bytes) -> str:
|
|
31
|
+
"""Convert bytes to a base64 URL-safe string without padding.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
bytes_to_convert: Bytes to convert.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
str: Base64 URL-safe encoded string without padding.
|
|
38
|
+
"""
|
|
39
|
+
return base64.urlsafe_b64encode(bytes_to_convert).rstrip(b"=").decode("ascii")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _canonicalize_messages(messages: List[CopilotChatMessage]) -> bytes:
|
|
43
|
+
"""Canonicalize messages to a deterministic JSON format suitable for signing.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
messages: List of CopilotChatMessage objects to normalize.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
bytes: Canonicalized JSON string of messages.
|
|
50
|
+
"""
|
|
51
|
+
canonical: List[dict] = []
|
|
52
|
+
|
|
53
|
+
for message in messages:
|
|
54
|
+
# Preserve internal roles exactly as sent by the client (e.g. "user",
|
|
55
|
+
# "copilot", or any future internal roles) and keep structured content blocks.
|
|
56
|
+
message_dict = message.model_dump(
|
|
57
|
+
include={"role", "content"}, exclude_none=True
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
role = message_dict.get("role", "")
|
|
61
|
+
content = message_dict.get("content", [])
|
|
62
|
+
|
|
63
|
+
canonical.append({"role": role, "content": content})
|
|
64
|
+
|
|
65
|
+
# Dump to JSON with consistent formatting
|
|
66
|
+
return json.dumps(
|
|
67
|
+
canonical,
|
|
68
|
+
ensure_ascii=False,
|
|
69
|
+
separators=(",", ":"),
|
|
70
|
+
sort_keys=True,
|
|
71
|
+
).encode("utf-8")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def compute_history_signature(
|
|
75
|
+
messages: List[CopilotChatMessage],
|
|
76
|
+
session_id: str,
|
|
77
|
+
secret: str,
|
|
78
|
+
version: str = SIGNATURE_VERSION_V1,
|
|
79
|
+
) -> str:
|
|
80
|
+
"""Compute a signature for the chat history messages.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
messages: List of CopilotChatMessage objects representing the chat history.
|
|
84
|
+
session_id: Unique identifier for the session.
|
|
85
|
+
secret: Secret key used for signing.
|
|
86
|
+
version: Version of the signature format (default is SIGNATURE_VERSION_V1).
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
str: Base64 URL-safe encoded signature.
|
|
90
|
+
"""
|
|
91
|
+
canonical = _canonicalize_messages(messages)
|
|
92
|
+
mac_input = (
|
|
93
|
+
version.encode("utf-8")
|
|
94
|
+
+ b"\x00"
|
|
95
|
+
+ session_id.encode("utf-8")
|
|
96
|
+
+ b"\x00"
|
|
97
|
+
+ canonical
|
|
98
|
+
)
|
|
99
|
+
digest = hmac.new(
|
|
100
|
+
key=secret.encode("utf-8"), msg=mac_input, digestmod=hashlib.sha256
|
|
101
|
+
).digest()
|
|
102
|
+
signature = _b64url_no_pad(digest)
|
|
103
|
+
return signature
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def verify_history_signature(
|
|
107
|
+
history_signature: str,
|
|
108
|
+
messages: List[CopilotChatMessage],
|
|
109
|
+
session_id: str,
|
|
110
|
+
secret: str,
|
|
111
|
+
version: Optional[str],
|
|
112
|
+
) -> bool:
|
|
113
|
+
"""Verify the history signature against the provided messages and session ID.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
history_signature: Base64 URL-safe encoded signature to verify.
|
|
117
|
+
messages: List of CopilotChatMessage objects representing the chat history.
|
|
118
|
+
session_id: Unique identifier for the session.
|
|
119
|
+
secret: Secret key used for signing.
|
|
120
|
+
version: Version of the signature format (default is SIGNATURE_VERSION_V1).
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
bool: True if the signature is valid, False otherwise.
|
|
124
|
+
"""
|
|
125
|
+
version = version or SIGNATURE_VERSION_V1
|
|
126
|
+
expected_signature = compute_history_signature(
|
|
127
|
+
messages=messages, session_id=session_id, secret=secret, version=version
|
|
128
|
+
)
|
|
129
|
+
return hmac.compare_digest(expected_signature, history_signature)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _signing_context() -> Optional[SigningContext]:
|
|
133
|
+
"""Get the signing context for history signatures.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
SigningContext if a secret is present, otherwise None.
|
|
137
|
+
"""
|
|
138
|
+
if not (secret := config.COPILOT_HISTORY_SIGNING_SECRET):
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
return SigningContext(
|
|
142
|
+
secret=secret,
|
|
143
|
+
default_version=SIGNATURE_VERSION_V1,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
async def verify_signature(req: CopilotRequest) -> bool:
|
|
148
|
+
"""Verify the history signature for a request.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
req: Request object containing copilot chat history and session ID.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
True if verification passes.
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
InvalidCopilotChatHistorySignature: when the provided signature doesn't match.
|
|
158
|
+
MissingCopilotChatHistorySignature: when a required signature is missing.
|
|
159
|
+
"""
|
|
160
|
+
context = _signing_context()
|
|
161
|
+
|
|
162
|
+
# If no server-side secret, signature verification is not enforced
|
|
163
|
+
if context is None:
|
|
164
|
+
return True
|
|
165
|
+
|
|
166
|
+
# If the client didn't opt in by providing the signature version, skip verification
|
|
167
|
+
if not (signature_version := getattr(req, "signature_version", None)):
|
|
168
|
+
return True
|
|
169
|
+
|
|
170
|
+
# Allow missing signature on first user turn
|
|
171
|
+
user_message_count = sum(
|
|
172
|
+
1 for m in req.copilot_chat_history if getattr(m, "role", None) == ROLE_USER
|
|
173
|
+
)
|
|
174
|
+
allow_missing = user_message_count <= 1
|
|
175
|
+
version = signature_version or context.default_version
|
|
176
|
+
|
|
177
|
+
history_signature = getattr(req, "history_signature", None)
|
|
178
|
+
if history_signature and context.secret:
|
|
179
|
+
# We generate the signature against the conversation history,
|
|
180
|
+
# excluding the user message if it's the last one in the list
|
|
181
|
+
messages = req.copilot_chat_history
|
|
182
|
+
if user_message_count and req.copilot_chat_history[-1].role == ROLE_USER:
|
|
183
|
+
messages = req.copilot_chat_history[:-1]
|
|
184
|
+
|
|
185
|
+
is_valid = verify_history_signature(
|
|
186
|
+
history_signature=history_signature,
|
|
187
|
+
messages=messages,
|
|
188
|
+
session_id=req.session_id,
|
|
189
|
+
secret=context.secret,
|
|
190
|
+
version=version,
|
|
191
|
+
)
|
|
192
|
+
if not is_valid:
|
|
193
|
+
structlogger.error(
|
|
194
|
+
"copilot.signing.invalid_history_signature",
|
|
195
|
+
version=version,
|
|
196
|
+
session_id=req.session_id,
|
|
197
|
+
)
|
|
198
|
+
raise InvalidCopilotChatHistorySignature("invalid_history_signature")
|
|
199
|
+
return True
|
|
200
|
+
|
|
201
|
+
# Client opted in and this is not the first turn → signature is required
|
|
202
|
+
if not allow_missing:
|
|
203
|
+
structlogger.error(
|
|
204
|
+
"copilot.signing.missing_history_signature",
|
|
205
|
+
version=version,
|
|
206
|
+
session_id=req.session_id,
|
|
207
|
+
)
|
|
208
|
+
raise MissingCopilotChatHistorySignature("missing_history_signature")
|
|
209
|
+
|
|
210
|
+
# Soft mode for first turn without signature
|
|
211
|
+
return True
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
async def create_signature_envelope_for_text(
|
|
215
|
+
req: CopilotRequest,
|
|
216
|
+
text: str,
|
|
217
|
+
category: ResponseCategory,
|
|
218
|
+
) -> Optional[ServerSentEvent]:
|
|
219
|
+
"""Create a signature SSE envelope for the assistant message.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
req: Request object containing copilot chat history and session ID.
|
|
223
|
+
text: Text content of the assistant message.
|
|
224
|
+
category: Response category of the assistant message.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
Optional[ServerSentEvent]: SSE envelope with signature data or None if
|
|
228
|
+
signing is not applicable.
|
|
229
|
+
"""
|
|
230
|
+
context = _signing_context()
|
|
231
|
+
|
|
232
|
+
# If no server-side secret, signature verification is not enforced
|
|
233
|
+
if context is None:
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
if not getattr(req, "signature_version", None):
|
|
237
|
+
return None
|
|
238
|
+
|
|
239
|
+
assistant_message = CopilotChatMessage(
|
|
240
|
+
role=ROLE_COPILOT,
|
|
241
|
+
content=[TextContent(type="text", text=text)],
|
|
242
|
+
response_category=category,
|
|
243
|
+
)
|
|
244
|
+
next_history = [*req.copilot_chat_history, assistant_message]
|
|
245
|
+
version = getattr(req, "signature_version", None) or context.default_version
|
|
246
|
+
signature = compute_history_signature(
|
|
247
|
+
messages=next_history,
|
|
248
|
+
session_id=req.session_id,
|
|
249
|
+
secret=context.secret,
|
|
250
|
+
version=version,
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
return ServerSentEvent(
|
|
254
|
+
event="copilot_response",
|
|
255
|
+
data={
|
|
256
|
+
"response_category": "signature",
|
|
257
|
+
"completeness": ResponseCompleteness.COMPLETE.value,
|
|
258
|
+
"version": version,
|
|
259
|
+
"signature": signature,
|
|
260
|
+
"assistant_message": assistant_message.model_dump(),
|
|
261
|
+
},
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
async def create_signature_envelope_for_handler(
|
|
266
|
+
req: CopilotRequest, handler: CopilotResponseHandler
|
|
267
|
+
) -> Optional[ServerSentEvent]:
|
|
268
|
+
"""Create a signature SSE envelope from the accumulated handler output.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
req: Request object containing copilot chat history and session ID.
|
|
272
|
+
handler: The response handler containing generated responses.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Optional[ServerSentEvent]: SSE envelope with signature data or None if
|
|
276
|
+
signing is not applicable.
|
|
277
|
+
"""
|
|
278
|
+
text, category = extract_full_text_and_category(handler)
|
|
279
|
+
return await create_signature_envelope_for_text(req, text, category)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def extract_full_text_and_category(handler: Any) -> Tuple[str, ResponseCategory]:
|
|
283
|
+
"""Extract full text and response category from the handler's generated responses.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
handler: The response handler containing generated responses.
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
Tuple[str, ResponseCategory]: Concatenated text and the last response category.
|
|
290
|
+
"""
|
|
291
|
+
text_parts: List[str] = []
|
|
292
|
+
last_category: Optional[ResponseCategory] = None
|
|
293
|
+
|
|
294
|
+
for response in getattr(handler, "generated_responses", []) or []:
|
|
295
|
+
content = getattr(response, "content", None)
|
|
296
|
+
if isinstance(response, GeneratedContent) and content:
|
|
297
|
+
text_parts.append(content)
|
|
298
|
+
category = getattr(response, "response_category", None)
|
|
299
|
+
if category and category not in {
|
|
300
|
+
ResponseCategory.REFERENCE,
|
|
301
|
+
ResponseCategory.REFERENCE_ENTRY,
|
|
302
|
+
}:
|
|
303
|
+
last_category = category
|
|
304
|
+
|
|
305
|
+
return "".join(text_parts), (last_category or ResponseCategory.COPILOT)
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import datetime as dt
|
|
2
|
+
import os
|
|
3
|
+
import uuid
|
|
4
|
+
from typing import Any, Iterable, Optional, Sequence
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa import telemetry
|
|
9
|
+
from rasa.builder.copilot.constants import COPILOT_SEGMENT_WRITE_KEY_ENV_VAR
|
|
10
|
+
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
11
|
+
from rasa.builder.copilot.models import EventContent
|
|
12
|
+
from rasa.builder.document_retrieval.models import Document
|
|
13
|
+
from rasa.telemetry import (
|
|
14
|
+
SEGMENT_TRACK_ENDPOINT,
|
|
15
|
+
segment_request_payload,
|
|
16
|
+
send_segment_request,
|
|
17
|
+
with_default_context_fields,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
structlogger = structlog.get_logger()
|
|
21
|
+
|
|
22
|
+
COPILOT_USER_MESSAGE_EVENT = "copilot_user_message"
|
|
23
|
+
COPILOT_BOT_MESSAGE_EVENT = "copilot_bot_message"
|
|
24
|
+
|
|
25
|
+
COPILOT_SEGMENT_WRITE_KEY = os.getenv(COPILOT_SEGMENT_WRITE_KEY_ENV_VAR)
|
|
26
|
+
if _SEGMENT_ON := bool(COPILOT_SEGMENT_WRITE_KEY):
|
|
27
|
+
structlogger.info("builder.telemetry.enabled")
|
|
28
|
+
else:
|
|
29
|
+
structlogger.warning("builder.telemetry.disabled")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _track(event: str, user_id: str, properties: dict) -> None:
|
|
33
|
+
"""Track an event with Segment.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
event: The name of the event to track.
|
|
37
|
+
user_id: The ID of the user associated with the event.
|
|
38
|
+
properties: Additional properties to include with the event.
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
Exception: If tracking fails, an exception is logged.
|
|
42
|
+
"""
|
|
43
|
+
if not _SEGMENT_ON or not telemetry.is_telemetry_enabled():
|
|
44
|
+
structlogger.debug("builder.telemetry._track.disabled")
|
|
45
|
+
return
|
|
46
|
+
structlogger.debug("builder.telemetry._track.enabled")
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
payload = segment_request_payload(
|
|
50
|
+
user_id, event, properties, context=with_default_context_fields()
|
|
51
|
+
)
|
|
52
|
+
structlogger.debug("builder.telemetry._track.sending", payload=payload)
|
|
53
|
+
|
|
54
|
+
send_segment_request(SEGMENT_TRACK_ENDPOINT, payload, COPILOT_SEGMENT_WRITE_KEY)
|
|
55
|
+
except Exception as e: # skipcq:PYL-W0703
|
|
56
|
+
structlogger.warning("builder.telemetry.track_failed", error=str(e))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class CopilotTelemetry:
|
|
60
|
+
def __init__(
|
|
61
|
+
self,
|
|
62
|
+
*,
|
|
63
|
+
project_id: str,
|
|
64
|
+
user_id: str,
|
|
65
|
+
) -> None:
|
|
66
|
+
"""Initialize Telemetry instance."""
|
|
67
|
+
self._project_id = project_id
|
|
68
|
+
self._user_id = user_id
|
|
69
|
+
# TODO Load prompt version
|
|
70
|
+
self._prompt_version = "1"
|
|
71
|
+
|
|
72
|
+
def log_user_turn(self, text: str) -> None:
|
|
73
|
+
"""Track a user message in the conversation.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
text: The text of the user message.
|
|
77
|
+
"""
|
|
78
|
+
structlogger.debug("builder.telemetry.log_user_turn", text=text)
|
|
79
|
+
_track(
|
|
80
|
+
COPILOT_USER_MESSAGE_EVENT,
|
|
81
|
+
self._user_id,
|
|
82
|
+
{
|
|
83
|
+
"project_id": self._project_id,
|
|
84
|
+
"message_id": uuid.uuid4().hex,
|
|
85
|
+
"text": text,
|
|
86
|
+
"timestamp": dt.datetime.utcnow().isoformat(),
|
|
87
|
+
},
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def log_copilot_turn(
|
|
91
|
+
self,
|
|
92
|
+
*,
|
|
93
|
+
text: str,
|
|
94
|
+
source_urls: Sequence[str],
|
|
95
|
+
flags: Iterable[str],
|
|
96
|
+
latency_ms: int,
|
|
97
|
+
model: str,
|
|
98
|
+
input_tokens: Optional[int] = None,
|
|
99
|
+
output_tokens: Optional[int] = None,
|
|
100
|
+
total_tokens: Optional[int] = None,
|
|
101
|
+
system_message: Optional[dict[str, Any]] = None,
|
|
102
|
+
chat_history: Optional[list[dict[str, Any]]] = None,
|
|
103
|
+
last_user_message: Optional[str] = None,
|
|
104
|
+
tracker_event_attachments: Optional[list[dict[str, Any]]] = None,
|
|
105
|
+
) -> None:
|
|
106
|
+
"""Track a copilot message in the conversation.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
text: The text of the copilot message.
|
|
110
|
+
source_urls: URLs of the sources used to generate the response.
|
|
111
|
+
flags: Flags indicating special conditions or features.
|
|
112
|
+
latency_ms: End-to-end Copilot latency to produce this response.
|
|
113
|
+
model: The model used to generate the response.
|
|
114
|
+
input_tokens: Number of input tokens used (optional).
|
|
115
|
+
output_tokens: Number of output tokens generated (optional).
|
|
116
|
+
total_tokens: Total number of tokens used (input + output) (optional).
|
|
117
|
+
system_message: The system message used (optional).
|
|
118
|
+
chat_history: The chat history messages used (optional).
|
|
119
|
+
last_user_message: The last user message used (optional).
|
|
120
|
+
tracker_event_attachments: The tracker event attachments used (optional).
|
|
121
|
+
"""
|
|
122
|
+
structlogger.debug("builder.telemetry.log_copilot_turn", text=text)
|
|
123
|
+
|
|
124
|
+
# FIXME: Temporarily remove the system_message from telemetry payload.
|
|
125
|
+
# Reason: It often exceeds Segment payload size limits, causing the request
|
|
126
|
+
# to be rejected and the event to be absent in Segment. Instead, temporarily
|
|
127
|
+
# log the system_message so it's visible in Grafana.
|
|
128
|
+
telemetry_data = {
|
|
129
|
+
"project_id": self._project_id,
|
|
130
|
+
"message_id": uuid.uuid4().hex,
|
|
131
|
+
"text": text,
|
|
132
|
+
"prompt_version": self._prompt_version,
|
|
133
|
+
"source_urls": list(source_urls),
|
|
134
|
+
"flags": list(flags),
|
|
135
|
+
"latency_ms": latency_ms,
|
|
136
|
+
"model": model,
|
|
137
|
+
"input_tokens": input_tokens,
|
|
138
|
+
"output_tokens": output_tokens,
|
|
139
|
+
"total_tokens": total_tokens,
|
|
140
|
+
"chat_history": chat_history,
|
|
141
|
+
"last_user_message": last_user_message,
|
|
142
|
+
"tracker_event_attachments": tracker_event_attachments,
|
|
143
|
+
"timestamp": dt.datetime.utcnow().isoformat(),
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
# Log all telemetry data plus system_message for debugging
|
|
147
|
+
log_data = telemetry_data.copy()
|
|
148
|
+
if system_message:
|
|
149
|
+
log_data["system_message"] = system_message
|
|
150
|
+
|
|
151
|
+
structlogger.info("builder.telemetry.copilot_turn", **log_data)
|
|
152
|
+
|
|
153
|
+
_track(
|
|
154
|
+
COPILOT_BOT_MESSAGE_EVENT,
|
|
155
|
+
self._user_id,
|
|
156
|
+
telemetry_data,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
@staticmethod
|
|
160
|
+
def _extract_flags(handler: CopilotResponseHandler) -> list[str]:
|
|
161
|
+
"""Extract flags from the response handler.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
handler: The response handler containing generated responses.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
A list of flags indicating special conditions or features.
|
|
168
|
+
"""
|
|
169
|
+
flags = {r.response_category.value for r in handler.generated_responses}
|
|
170
|
+
return sorted(flags)
|
|
171
|
+
|
|
172
|
+
@staticmethod
|
|
173
|
+
def _full_text(handler: CopilotResponseHandler) -> str:
|
|
174
|
+
"""Extract full text from the response handler.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
handler: The response handler containing generated responses.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
The concatenated content of all generated responses.
|
|
181
|
+
"""
|
|
182
|
+
return "".join(
|
|
183
|
+
response.content
|
|
184
|
+
for response in handler.generated_responses
|
|
185
|
+
if getattr(response, "content", None)
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def log_copilot_from_handler(
|
|
189
|
+
self,
|
|
190
|
+
*,
|
|
191
|
+
handler: CopilotResponseHandler,
|
|
192
|
+
used_documents: list[Document],
|
|
193
|
+
latency_ms: int,
|
|
194
|
+
model: str,
|
|
195
|
+
prompt_tokens: int,
|
|
196
|
+
completion_tokens: int,
|
|
197
|
+
total_tokens: int,
|
|
198
|
+
system_message: dict[str, Any],
|
|
199
|
+
chat_history: list[dict[str, Any]],
|
|
200
|
+
last_user_message: Optional[str],
|
|
201
|
+
tracker_event_attachments: list[EventContent],
|
|
202
|
+
) -> None:
|
|
203
|
+
"""Log a copilot message from the response handler.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
handler: The response handler containing generated responses.
|
|
207
|
+
used_documents: List of documents used as supporting evidence.
|
|
208
|
+
latency_ms: End-to-end Copilot latency to produce this response.
|
|
209
|
+
model: The model used to generate the response.
|
|
210
|
+
prompt_tokens: Number of input tokens used.
|
|
211
|
+
completion_tokens: Number of output tokens generated.
|
|
212
|
+
total_tokens: Total number of tokens used (input + output).
|
|
213
|
+
system_message: The system message used.
|
|
214
|
+
chat_history: The chat history messages used.
|
|
215
|
+
last_user_message: The last user message used.
|
|
216
|
+
"""
|
|
217
|
+
structlogger.debug("builder.telemetry.log_copilot_from_handler")
|
|
218
|
+
text = self._full_text(handler)
|
|
219
|
+
self.log_copilot_turn(
|
|
220
|
+
text=text,
|
|
221
|
+
source_urls=[d.url for d in used_documents if d.url],
|
|
222
|
+
flags=self._extract_flags(handler),
|
|
223
|
+
latency_ms=latency_ms,
|
|
224
|
+
model=model,
|
|
225
|
+
input_tokens=prompt_tokens,
|
|
226
|
+
output_tokens=completion_tokens,
|
|
227
|
+
total_tokens=total_tokens,
|
|
228
|
+
system_message=system_message,
|
|
229
|
+
chat_history=chat_history,
|
|
230
|
+
last_user_message=last_user_message,
|
|
231
|
+
tracker_event_attachments=[
|
|
232
|
+
attachment.model_dump() for attachment in tracker_event_attachments
|
|
233
|
+
],
|
|
234
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Templates for role ROLE_RASA_INTERNAL
|
|
2
|
+
# Note: Only 'training_error_log_analysis' and 'e2e_testing_error_log_analysis' are
|
|
3
|
+
# valid response categories for rasa internal messages for now.
|
|
4
|
+
# Future contexts can be added here + in ResponseCategory enumeration.
|
|
5
|
+
|
|
6
|
+
templates:
|
|
7
|
+
# Templated utterance when training fails.
|
|
8
|
+
training_error_log_analysis: |
|
|
9
|
+
The assistant training failed. Your task is to analyze provided error logs
|
|
10
|
+
and help me fix the issue.
|
|
11
|
+
|
|
12
|
+
# Templated utterance when e2e testing fails.
|
|
13
|
+
e2e_testing_error_log_analysis: |
|
|
14
|
+
The e2e testing failed. Your task is to analyze provided error from the E2E
|
|
15
|
+
test logs and help me fix the issue. Help me understand if the issue is within
|
|
16
|
+
the the E2E test or the assistant.
|