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,562 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import importlib
|
|
3
|
+
import json
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
|
+
from typing import Any, Dict, List, Optional, Union
|
|
6
|
+
|
|
7
|
+
import openai
|
|
8
|
+
import structlog
|
|
9
|
+
from jinja2 import Template
|
|
10
|
+
from typing_extensions import AsyncGenerator
|
|
11
|
+
|
|
12
|
+
from rasa.builder import config
|
|
13
|
+
from rasa.builder.config import COPILOT_DOCUMENTATION_SEARCH_QUERY_HISTORY_MESSAGES
|
|
14
|
+
from rasa.builder.copilot.constants import (
|
|
15
|
+
COPILOT_LAST_USER_MESSAGE_CONTEXT_PROMPT_FILE,
|
|
16
|
+
COPILOT_PROMPTS_DIR,
|
|
17
|
+
COPILOT_PROMPTS_FILE,
|
|
18
|
+
COPILOT_TRAINING_ERROR_HANDLER_PROMPT_FILE,
|
|
19
|
+
ROLE_COPILOT,
|
|
20
|
+
ROLE_COPILOT_INTERNAL,
|
|
21
|
+
ROLE_USER,
|
|
22
|
+
)
|
|
23
|
+
from rasa.builder.copilot.exceptions import CopilotStreamError
|
|
24
|
+
from rasa.builder.copilot.models import (
|
|
25
|
+
ChatMessage,
|
|
26
|
+
CopilotChatMessage,
|
|
27
|
+
CopilotContext,
|
|
28
|
+
CopilotGenerationContext,
|
|
29
|
+
CopilotSystemMessage,
|
|
30
|
+
EventContent,
|
|
31
|
+
FileContent,
|
|
32
|
+
InternalCopilotRequestChatMessage,
|
|
33
|
+
ResponseCategory,
|
|
34
|
+
UsageStatistics,
|
|
35
|
+
UserChatMessage,
|
|
36
|
+
)
|
|
37
|
+
from rasa.builder.document_retrieval.inkeep_document_retrieval import (
|
|
38
|
+
InKeepDocumentRetrieval,
|
|
39
|
+
)
|
|
40
|
+
from rasa.builder.document_retrieval.models import Document
|
|
41
|
+
from rasa.builder.exceptions import (
|
|
42
|
+
DocumentRetrievalError,
|
|
43
|
+
)
|
|
44
|
+
from rasa.builder.shared.tracker_context import TrackerContext
|
|
45
|
+
from rasa.shared.constants import PACKAGE_NAME
|
|
46
|
+
|
|
47
|
+
structlogger = structlog.get_logger()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class Copilot:
|
|
51
|
+
def __init__(self) -> None:
|
|
52
|
+
self._inkeep_document_retrieval = InKeepDocumentRetrieval()
|
|
53
|
+
|
|
54
|
+
# Load both prompt templates up-front
|
|
55
|
+
self._system_message_prompt_template = Template(
|
|
56
|
+
importlib.resources.read_text(
|
|
57
|
+
f"{PACKAGE_NAME}.{COPILOT_PROMPTS_DIR}",
|
|
58
|
+
COPILOT_PROMPTS_FILE,
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
self._last_user_message_context_prompt_template = Template(
|
|
62
|
+
importlib.resources.read_text(
|
|
63
|
+
f"{PACKAGE_NAME}.{COPILOT_PROMPTS_DIR}",
|
|
64
|
+
COPILOT_LAST_USER_MESSAGE_CONTEXT_PROMPT_FILE,
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
self._training_error_handler_prompt_template = Template(
|
|
68
|
+
importlib.resources.read_text(
|
|
69
|
+
f"{PACKAGE_NAME}.{COPILOT_PROMPTS_DIR}",
|
|
70
|
+
COPILOT_TRAINING_ERROR_HANDLER_PROMPT_FILE,
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# The final stream chunk includes usage statistics.
|
|
75
|
+
self.usage_statistics = UsageStatistics()
|
|
76
|
+
|
|
77
|
+
@asynccontextmanager
|
|
78
|
+
async def _get_client(self) -> AsyncGenerator[openai.AsyncOpenAI, None]:
|
|
79
|
+
"""Create a fresh OpenAI client, yield it, and always close it."""
|
|
80
|
+
client = openai.AsyncOpenAI(timeout=config.OPENAI_TIMEOUT)
|
|
81
|
+
try:
|
|
82
|
+
yield client
|
|
83
|
+
except Exception as e:
|
|
84
|
+
structlogger.error("copilot.llm_client_error", error=str(e))
|
|
85
|
+
raise
|
|
86
|
+
finally:
|
|
87
|
+
try:
|
|
88
|
+
await client.close()
|
|
89
|
+
except Exception as exc:
|
|
90
|
+
# Closing should not break request processing, but we log it
|
|
91
|
+
structlogger.warning(
|
|
92
|
+
"copilot.llm_client_close_error",
|
|
93
|
+
event_info="Failed to close OpenAI client cleanly.",
|
|
94
|
+
error=str(exc),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
async def search_rasa_documentation(
|
|
98
|
+
self,
|
|
99
|
+
context: CopilotContext,
|
|
100
|
+
) -> List[Document]:
|
|
101
|
+
"""Search Rasa documentation for relevant information.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
context: The context of the copilot.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
A list of Document objects. Empty list is returned if the search fails.
|
|
108
|
+
"""
|
|
109
|
+
try:
|
|
110
|
+
query = self._create_documentation_search_query(context)
|
|
111
|
+
return await self._inkeep_document_retrieval.retrieve_documents(query)
|
|
112
|
+
except DocumentRetrievalError as e:
|
|
113
|
+
structlogger.error(
|
|
114
|
+
"copilot.search_rasa_documentation.error",
|
|
115
|
+
event_info=(
|
|
116
|
+
f"Copilot: Searching Rasa documentation for query '{query}' "
|
|
117
|
+
f"failed with the following error: {e}. Returning empty list."
|
|
118
|
+
),
|
|
119
|
+
query=query,
|
|
120
|
+
error=str(e),
|
|
121
|
+
)
|
|
122
|
+
return []
|
|
123
|
+
|
|
124
|
+
async def generate_response(
|
|
125
|
+
self,
|
|
126
|
+
context: CopilotContext,
|
|
127
|
+
) -> tuple[AsyncGenerator[str, None], CopilotGenerationContext]:
|
|
128
|
+
"""Generate a response from the copilot.
|
|
129
|
+
|
|
130
|
+
This method performs document retrieval and response generation as a single
|
|
131
|
+
atomic operation. The returned documents are the supporting evidence used
|
|
132
|
+
to generate the response, ensuring consistency between the response content
|
|
133
|
+
and its sources.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
context: The context of the copilot.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
A tuple containing the async response stream and a
|
|
140
|
+
CopilotGenerationContext object with relevant documents, and all the
|
|
141
|
+
messages used to generate the response.
|
|
142
|
+
|
|
143
|
+
Raises:
|
|
144
|
+
CopilotStreamError: If the stream fails.
|
|
145
|
+
Exception: If an unexpected error occurs.
|
|
146
|
+
"""
|
|
147
|
+
relevant_documents = await self.search_rasa_documentation(context)
|
|
148
|
+
messages = await self._build_messages(context, relevant_documents)
|
|
149
|
+
tracker_event_attachments = self._extract_tracker_event_attachments(
|
|
150
|
+
context.copilot_chat_history[-1]
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
support_evidence = CopilotGenerationContext(
|
|
154
|
+
relevant_documents=relevant_documents,
|
|
155
|
+
system_message=messages[0],
|
|
156
|
+
chat_history=messages[1:-1],
|
|
157
|
+
last_user_message=messages[-1],
|
|
158
|
+
tracker_event_attachments=tracker_event_attachments,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
return (
|
|
162
|
+
self._stream_response(messages),
|
|
163
|
+
support_evidence,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
async def _stream_response(
|
|
167
|
+
self, messages: List[Dict[str, Any]]
|
|
168
|
+
) -> AsyncGenerator[str, None]:
|
|
169
|
+
"""Stream markdown chunks one by one."""
|
|
170
|
+
self.usage_statistics.reset()
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
async with self._get_client() as client:
|
|
174
|
+
stream = await client.chat.completions.create(
|
|
175
|
+
model=config.OPENAI_MODEL,
|
|
176
|
+
messages=messages, # type: ignore
|
|
177
|
+
temperature=config.OPENAI_TEMPERATURE,
|
|
178
|
+
stream=True,
|
|
179
|
+
stream_options={"include_usage": True},
|
|
180
|
+
)
|
|
181
|
+
async for chunk in stream:
|
|
182
|
+
# The final chunk, which contains the usage statistics,
|
|
183
|
+
# arrives with an empty `choices` list.
|
|
184
|
+
if not chunk.choices:
|
|
185
|
+
self.usage_statistics.update_from_stream_chunk(chunk)
|
|
186
|
+
# Nothing to yield – continue to the next chunk.
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
delta = chunk.choices[0].delta
|
|
190
|
+
if delta and delta.content:
|
|
191
|
+
yield delta.content
|
|
192
|
+
except openai.OpenAIError as e:
|
|
193
|
+
structlogger.exception("copilot.stream_response.api_error", error=str(e))
|
|
194
|
+
raise CopilotStreamError(
|
|
195
|
+
"Failed to stream response from OpenAI API."
|
|
196
|
+
) from e
|
|
197
|
+
except asyncio.TimeoutError as e:
|
|
198
|
+
structlogger.exception(
|
|
199
|
+
"copilot.stream_response.timeout_error", error=str(e)
|
|
200
|
+
)
|
|
201
|
+
raise CopilotStreamError("Request to OpenAI API timed out.") from e
|
|
202
|
+
except Exception as e:
|
|
203
|
+
structlogger.exception(
|
|
204
|
+
"copilot.stream_response.unexpected_error", error=str(e)
|
|
205
|
+
)
|
|
206
|
+
raise
|
|
207
|
+
|
|
208
|
+
async def _build_messages(
|
|
209
|
+
self,
|
|
210
|
+
context: CopilotContext,
|
|
211
|
+
relevant_documents: List[Document],
|
|
212
|
+
) -> List[Dict[str, Any]]:
|
|
213
|
+
"""Build the complete message list for the OpenAI API.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
context: The context of the copilot.
|
|
217
|
+
relevant_documents: The relevant documents to use in the context.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
A list of messages in OpenAI format.
|
|
221
|
+
"""
|
|
222
|
+
if not context.copilot_chat_history:
|
|
223
|
+
return []
|
|
224
|
+
|
|
225
|
+
past_messages = self._create_chat_history_messages(
|
|
226
|
+
context.copilot_chat_history[:-1]
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
latest_message = self._process_latest_message(
|
|
230
|
+
context.copilot_chat_history[-1], context, relevant_documents
|
|
231
|
+
)
|
|
232
|
+
system_message = self._create_system_message()
|
|
233
|
+
|
|
234
|
+
return [system_message, *past_messages, latest_message]
|
|
235
|
+
|
|
236
|
+
def _create_chat_history_messages(
|
|
237
|
+
self, chat_history: List[Union[UserChatMessage, CopilotChatMessage]]
|
|
238
|
+
) -> List[Dict[str, Any]]:
|
|
239
|
+
"""Filter and convert past messages to OpenAI format.
|
|
240
|
+
|
|
241
|
+
Excludes guardrails policy violations and non-user/copilot messages.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
chat_history: List of chat messages to filter and convert.
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
List of messages in OpenAI format
|
|
248
|
+
"""
|
|
249
|
+
filtered_messages = []
|
|
250
|
+
|
|
251
|
+
for message in chat_history:
|
|
252
|
+
if (
|
|
253
|
+
message.response_category
|
|
254
|
+
!= ResponseCategory.GUARDRAILS_POLICY_VIOLATION
|
|
255
|
+
and message.role in [ROLE_USER, ROLE_COPILOT]
|
|
256
|
+
):
|
|
257
|
+
filtered_messages.append(message)
|
|
258
|
+
|
|
259
|
+
return [message.build_openai_message() for message in filtered_messages]
|
|
260
|
+
|
|
261
|
+
def _process_latest_message(
|
|
262
|
+
self,
|
|
263
|
+
latest_message: Any,
|
|
264
|
+
context: CopilotContext,
|
|
265
|
+
relevant_documents: List[Document],
|
|
266
|
+
) -> Dict[str, Any]:
|
|
267
|
+
"""Process the latest message and convert it to OpenAI format.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
latest_message: The most recent message from the chat history.
|
|
271
|
+
context: The copilot context containing conversation state.
|
|
272
|
+
relevant_documents: List of relevant documents for context.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Message in OpenAI format.
|
|
276
|
+
|
|
277
|
+
Raises:
|
|
278
|
+
ValueError: If the message type is not supported.
|
|
279
|
+
"""
|
|
280
|
+
if isinstance(latest_message, UserChatMessage):
|
|
281
|
+
tracker_event_attachments = latest_message.get_content_blocks_by_type(
|
|
282
|
+
EventContent
|
|
283
|
+
)
|
|
284
|
+
rendered_prompt = self._render_last_user_message_context_prompt(
|
|
285
|
+
context, relevant_documents, tracker_event_attachments
|
|
286
|
+
)
|
|
287
|
+
return latest_message.build_openai_message(prompt=rendered_prompt)
|
|
288
|
+
|
|
289
|
+
elif isinstance(latest_message, InternalCopilotRequestChatMessage):
|
|
290
|
+
rendered_prompt = self._render_training_error_handler_prompt(
|
|
291
|
+
latest_message, relevant_documents
|
|
292
|
+
)
|
|
293
|
+
return latest_message.build_openai_message(prompt=rendered_prompt)
|
|
294
|
+
|
|
295
|
+
else:
|
|
296
|
+
raise ValueError(f"Unexpected message type: {type(latest_message)}")
|
|
297
|
+
|
|
298
|
+
def _create_system_message(self) -> Dict[str, Any]:
|
|
299
|
+
"""Create the system message for the conversation.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
System message in OpenAI format with rendered prompt template.
|
|
303
|
+
"""
|
|
304
|
+
rendered_prompt = self._system_message_prompt_template.render()
|
|
305
|
+
return CopilotSystemMessage().build_openai_message(prompt=rendered_prompt)
|
|
306
|
+
|
|
307
|
+
def _render_last_user_message_context_prompt(
|
|
308
|
+
self,
|
|
309
|
+
context: CopilotContext,
|
|
310
|
+
relevant_documents: List[Document],
|
|
311
|
+
tracker_event_attachments: List[EventContent],
|
|
312
|
+
) -> str:
|
|
313
|
+
# Format relevant documentation
|
|
314
|
+
documents = [doc.model_dump() for doc in relevant_documents]
|
|
315
|
+
# Format conversation history
|
|
316
|
+
conversation = self._format_conversation_history(context.tracker_context)
|
|
317
|
+
# Format current state
|
|
318
|
+
current_state = self._format_current_state(context.tracker_context)
|
|
319
|
+
# Format tracker events
|
|
320
|
+
attachments = self._format_tracker_event_attachments(tracker_event_attachments)
|
|
321
|
+
|
|
322
|
+
rendered_prompt = self._last_user_message_context_prompt_template.render(
|
|
323
|
+
current_conversation=conversation,
|
|
324
|
+
current_state=current_state,
|
|
325
|
+
assistant_logs=context.assistant_logs,
|
|
326
|
+
assistant_files=context.assistant_files,
|
|
327
|
+
documentation_results=documents,
|
|
328
|
+
attachments=attachments,
|
|
329
|
+
)
|
|
330
|
+
return rendered_prompt
|
|
331
|
+
|
|
332
|
+
def _render_training_error_handler_prompt(
|
|
333
|
+
self,
|
|
334
|
+
internal_request_message: InternalCopilotRequestChatMessage,
|
|
335
|
+
relevant_documents: List[Document],
|
|
336
|
+
) -> str:
|
|
337
|
+
"""Render the training error handler prompt with documentation and context.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
internal_request_message: Internal request message.
|
|
341
|
+
context: The copilot context.
|
|
342
|
+
relevant_documents: List of relevant documents for context.
|
|
343
|
+
|
|
344
|
+
Returns:
|
|
345
|
+
Rendered prompt string for training error analysis.
|
|
346
|
+
"""
|
|
347
|
+
modified_files_dicts: Dict[str, str] = {
|
|
348
|
+
file.file_path: file.file_content
|
|
349
|
+
for file in internal_request_message.get_content_blocks_by_type(FileContent)
|
|
350
|
+
}
|
|
351
|
+
rendered_prompt = self._training_error_handler_prompt_template.render(
|
|
352
|
+
logs=internal_request_message.get_flattened_log_content(),
|
|
353
|
+
modified_files=modified_files_dicts,
|
|
354
|
+
documentation_results=self._format_documents(relevant_documents),
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
return rendered_prompt
|
|
358
|
+
|
|
359
|
+
@staticmethod
|
|
360
|
+
def _create_documentation_search_query(context: CopilotContext) -> str:
|
|
361
|
+
"""Format chat messages between user and copilot for documentation search.
|
|
362
|
+
|
|
363
|
+
Filters out guardrails policy violations and only includes messages with
|
|
364
|
+
USER or COPILOT roles, then takes the last N relevant messages.
|
|
365
|
+
"""
|
|
366
|
+
role_to_prefix = {
|
|
367
|
+
ROLE_USER: "User",
|
|
368
|
+
ROLE_COPILOT: "Assistant",
|
|
369
|
+
ROLE_COPILOT_INTERNAL: "User",
|
|
370
|
+
}
|
|
371
|
+
allowed_message_types = (
|
|
372
|
+
UserChatMessage,
|
|
373
|
+
InternalCopilotRequestChatMessage,
|
|
374
|
+
CopilotChatMessage,
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
query_chat_history: List[str] = []
|
|
378
|
+
|
|
379
|
+
for message in reversed(context.copilot_chat_history):
|
|
380
|
+
if (
|
|
381
|
+
message.response_category
|
|
382
|
+
== ResponseCategory.GUARDRAILS_POLICY_VIOLATION
|
|
383
|
+
or not isinstance(message, allowed_message_types)
|
|
384
|
+
):
|
|
385
|
+
continue
|
|
386
|
+
|
|
387
|
+
if (
|
|
388
|
+
len(query_chat_history)
|
|
389
|
+
>= COPILOT_DOCUMENTATION_SEARCH_QUERY_HISTORY_MESSAGES
|
|
390
|
+
):
|
|
391
|
+
break
|
|
392
|
+
|
|
393
|
+
prefix = role_to_prefix[message.role]
|
|
394
|
+
text = (
|
|
395
|
+
Copilot._format_internal_message_for_query_chat_history(message)
|
|
396
|
+
if isinstance(message, InternalCopilotRequestChatMessage)
|
|
397
|
+
else Copilot._format_normal_message_for_query_chat_history(message)
|
|
398
|
+
)
|
|
399
|
+
query_chat_history.insert(0, f"{prefix}: {text}")
|
|
400
|
+
|
|
401
|
+
return "\n".join(query_chat_history)
|
|
402
|
+
|
|
403
|
+
@staticmethod
|
|
404
|
+
def _format_documents(results: List[Document]) -> Optional[str]:
|
|
405
|
+
"""Format documentation search results as JSON dump to be used in the prompt."""
|
|
406
|
+
# We want the special message that indicates no relevant documentation source
|
|
407
|
+
# found if there are no results.
|
|
408
|
+
if not results:
|
|
409
|
+
return None
|
|
410
|
+
|
|
411
|
+
formatted_results: Dict[str, Any] = {
|
|
412
|
+
"sources": [
|
|
413
|
+
{
|
|
414
|
+
# Start the reference from 1, not 0.
|
|
415
|
+
"idx": idx + 1,
|
|
416
|
+
"title": result.title,
|
|
417
|
+
"url": result.url,
|
|
418
|
+
"content": result.content,
|
|
419
|
+
}
|
|
420
|
+
for idx, result in enumerate(results)
|
|
421
|
+
]
|
|
422
|
+
}
|
|
423
|
+
return json.dumps(formatted_results, ensure_ascii=False, indent=2)
|
|
424
|
+
|
|
425
|
+
@staticmethod
|
|
426
|
+
def _format_conversation_history(tracker_context: Optional[TrackerContext]) -> str:
|
|
427
|
+
"""Format conversation history from TrackerContext using nested turn structure.
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
tracker_context: The TrackerContext containing conversation data.
|
|
431
|
+
|
|
432
|
+
Returns:
|
|
433
|
+
A JSON string with turns containing user_input, assistant_response,
|
|
434
|
+
and context.
|
|
435
|
+
|
|
436
|
+
Example:
|
|
437
|
+
```json
|
|
438
|
+
{
|
|
439
|
+
"conversation_history": [
|
|
440
|
+
{
|
|
441
|
+
"turn_id": 1,
|
|
442
|
+
"USER": {
|
|
443
|
+
"text": "I want to transfer money",
|
|
444
|
+
"predicted_commands": ["start flow", "set slot", ...]
|
|
445
|
+
},
|
|
446
|
+
"BOT": [
|
|
447
|
+
{"text": "How much would you like to transfer?"}
|
|
448
|
+
],
|
|
449
|
+
"other_tracker_events": [
|
|
450
|
+
{
|
|
451
|
+
"event": "action_executed",
|
|
452
|
+
"data": {"action_name": "action_ask_amount"}
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"event": "slot_set",
|
|
456
|
+
"data": {
|
|
457
|
+
"slot_name": "amount_of_money",
|
|
458
|
+
"slot_value": 100,
|
|
459
|
+
},
|
|
460
|
+
}
|
|
461
|
+
]
|
|
462
|
+
}
|
|
463
|
+
]
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
"""
|
|
467
|
+
conversation_history: Dict[str, Any] = {
|
|
468
|
+
"conversation_history": [],
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
if not tracker_context or not tracker_context.conversation_turns:
|
|
472
|
+
return json.dumps(conversation_history, ensure_ascii=False, indent=2)
|
|
473
|
+
|
|
474
|
+
conversation_turns: List[Dict[str, Any]] = []
|
|
475
|
+
user_prefix = "USER"
|
|
476
|
+
assistant_prefix = "BOT"
|
|
477
|
+
|
|
478
|
+
for turn_idx, turn in enumerate(tracker_context.conversation_turns, 1):
|
|
479
|
+
turn_data: Dict[str, Any] = {"turn_id": turn_idx}
|
|
480
|
+
|
|
481
|
+
# Add user if present
|
|
482
|
+
if turn.user_message:
|
|
483
|
+
turn_data[user_prefix] = {
|
|
484
|
+
"text": turn.user_message.text,
|
|
485
|
+
"predicted_commands": turn.user_message.predicted_commands,
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
# Add assistant messages if present
|
|
489
|
+
if turn.assistant_messages:
|
|
490
|
+
turn_data[assistant_prefix] = [
|
|
491
|
+
{"text": assistant_message.text}
|
|
492
|
+
for assistant_message in turn.assistant_messages
|
|
493
|
+
]
|
|
494
|
+
|
|
495
|
+
# Add other tracker events
|
|
496
|
+
if turn.context_events:
|
|
497
|
+
other_events = [event.model_dump() for event in turn.context_events]
|
|
498
|
+
turn_data["other_tracker_events"] = other_events
|
|
499
|
+
|
|
500
|
+
conversation_turns.append(turn_data)
|
|
501
|
+
|
|
502
|
+
conversation_history["conversation_history"] = conversation_turns
|
|
503
|
+
return json.dumps(conversation_history, ensure_ascii=False, indent=2)
|
|
504
|
+
|
|
505
|
+
@staticmethod
|
|
506
|
+
def _format_current_state(tracker_context: Optional[TrackerContext]) -> str:
|
|
507
|
+
"""Format current state from TrackerContext for LLM consumption.
|
|
508
|
+
|
|
509
|
+
Args:
|
|
510
|
+
tracker_context: The TrackerContext containing current state data.
|
|
511
|
+
|
|
512
|
+
Returns:
|
|
513
|
+
A JSON string containing the current state information.
|
|
514
|
+
"""
|
|
515
|
+
if not tracker_context or not tracker_context.current_state:
|
|
516
|
+
return json.dumps({}, ensure_ascii=False, indent=2)
|
|
517
|
+
current_state = tracker_context.current_state.model_dump()
|
|
518
|
+
return json.dumps(current_state, ensure_ascii=False, indent=2)
|
|
519
|
+
|
|
520
|
+
@staticmethod
|
|
521
|
+
def _format_normal_message_for_query_chat_history(
|
|
522
|
+
message: Union[UserChatMessage, CopilotChatMessage],
|
|
523
|
+
) -> str:
|
|
524
|
+
"""Format normal message for query chat history."""
|
|
525
|
+
return f"{message.get_flattened_text_content()}"
|
|
526
|
+
|
|
527
|
+
@staticmethod
|
|
528
|
+
def _format_internal_message_for_query_chat_history(
|
|
529
|
+
message: InternalCopilotRequestChatMessage,
|
|
530
|
+
) -> str:
|
|
531
|
+
"""Format internal copilot request message for query chat history."""
|
|
532
|
+
text_content = message.get_flattened_text_content()
|
|
533
|
+
log_content = message.get_flattened_log_content()
|
|
534
|
+
if text_content and log_content:
|
|
535
|
+
return f"{text_content}\nLogs: {log_content}"
|
|
536
|
+
elif text_content:
|
|
537
|
+
return text_content
|
|
538
|
+
elif log_content:
|
|
539
|
+
return f"Logs: {log_content}"
|
|
540
|
+
else:
|
|
541
|
+
return ""
|
|
542
|
+
|
|
543
|
+
@staticmethod
|
|
544
|
+
def _format_tracker_event_attachments(events: List[EventContent]) -> Optional[str]:
|
|
545
|
+
"""Format tracker events as JSON dump to be used in the prompt."""
|
|
546
|
+
# We don't want to display the attachment sectin in the last user message
|
|
547
|
+
# context prompt if there are no attachments.
|
|
548
|
+
if not events:
|
|
549
|
+
return None
|
|
550
|
+
# If there are attachments, return the formatted JSON dump.
|
|
551
|
+
return json.dumps(
|
|
552
|
+
[event_content.model_dump() for event_content in events],
|
|
553
|
+
ensure_ascii=False,
|
|
554
|
+
indent=2,
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
@staticmethod
|
|
558
|
+
def _extract_tracker_event_attachments(message: ChatMessage) -> List[EventContent]:
|
|
559
|
+
"""Extract the tracker event attachments from the message."""
|
|
560
|
+
if not isinstance(message, UserChatMessage):
|
|
561
|
+
return []
|
|
562
|
+
return message.get_content_blocks_by_type(EventContent)
|