rasa-pro 3.12.18__py3-none-any.whl → 3.13.0a1.dev1__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 +3 -4
- rasa/api.py +1 -1
- rasa/builder/create_openai_vector_store.py +69 -0
- rasa/builder/llm-helper-schema.json +69 -0
- rasa/builder/prompt_to_bot.py +645 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/skill_to_bot_prompt.jinja +158 -0
- rasa/cli/dialogue_understanding_test.py +1 -1
- rasa/cli/e2e_test.py +1 -1
- rasa/cli/evaluate.py +2 -2
- rasa/cli/export.py +3 -3
- rasa/cli/llm_fine_tuning.py +1 -1
- rasa/cli/project_templates/default/config.yml +5 -32
- rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_cancels_during_a_correction.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_handle.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_name.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_lists_contacts.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact.yml +1 -1
- rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact_from_list.yml +1 -1
- rasa/cli/project_templates/default/endpoints.yml +18 -2
- rasa/cli/project_templates/defaults.py +133 -0
- rasa/cli/run.py +1 -1
- rasa/cli/scaffold.py +2 -3
- rasa/cli/studio/download.py +1 -1
- rasa/cli/studio/link.py +53 -0
- rasa/cli/studio/pull.py +78 -0
- rasa/cli/studio/push.py +78 -0
- rasa/cli/studio/studio.py +12 -0
- rasa/cli/studio/upload.py +5 -3
- rasa/cli/train.py +1 -1
- rasa/cli/utils.py +1 -1
- rasa/cli/x.py +1 -1
- rasa/constants.py +2 -0
- rasa/core/__init__.py +0 -16
- rasa/core/actions/action.py +43 -29
- rasa/core/actions/action_repeat_bot_messages.py +18 -22
- rasa/core/actions/action_run_slot_rejections.py +1 -2
- rasa/core/agent.py +18 -3
- rasa/core/available_endpoints.py +146 -0
- rasa/core/brokers/kafka.py +4 -0
- rasa/core/brokers/pika.py +5 -2
- rasa/core/brokers/sql.py +1 -1
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/channel.py +2 -2
- rasa/core/channels/development_inspector.py +1 -1
- rasa/core/channels/facebook.py +1 -4
- rasa/core/channels/hangouts.py +8 -5
- rasa/core/channels/inspector/.eslintrc.cjs +12 -6
- rasa/core/channels/inspector/.prettierrc +5 -0
- rasa/core/channels/inspector/README.md +11 -5
- rasa/core/channels/inspector/dist/assets/{arc-9f75cc3b.js → arc-02053cc1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7f34db23.js → blockDiagram-38ab4fdb-008b6289.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-948bab2c.js → c4Diagram-3d4e48cf-fb2597be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-078dada8.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-53b0dd0e.js → classDiagram-70f12bd4-7f847e00.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-fdf789e7.js → classDiagram-v2-f2320105-ba1d689b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-5b4516de.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-87c4ece5.js → createText-2e5e7dd3-dd8e67c4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-5a8b0749.js → edges-e0da2a9e-10784939.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-66da90e2.js → erDiagram-9861fffd-24947ae6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-10044f05.js → flowDb-956e92f1-a9ced505.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f338f66a.js → flowDiagram-66a62f08-afda9c7c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-f9613071.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b13140aa.js → flowchart-elk-definition-4a651766-6ef530b8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-f2b4a55a.js → ganttDiagram-c361ad54-0c7dd39a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-dedc298d.js → gitGraphDiagram-72cf32ee-b57239d6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-4ede11ff.js → graph-9ed57cec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-65549d37.js → index-3862675e-233090de.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3a23e736.js → index-72184470.js} +123 -123
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-65439671.js → infoDiagram-f8f76790-aa116649.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-56d03d98.js → journeyDiagram-49397b02-e51877cc.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-dd48f7f4.js → layout-3ca3798c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-1569ad2c.js → line-26ee10d3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-48bf4935.js → linear-aedded32.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-688504c1.js → mindmap-definition-fc14e90a-d8957261.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78b6d7e6.js → pieDiagram-8a3498a8-d771f885.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-048b84b3.js → quadrantDiagram-120e2f19-09fdf50c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dd67f107.js → requirementDiagram-deff3bca-9f0af02e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-8128436e.js → sankeyDiagram-04a897e0-84415b37.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-1a0d1461.js → sequenceDiagram-704730f1-8dec4055.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-46d388ed.js → stateDiagram-587899a1-c5431d07.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-ea42951a.js → stateDiagram-v2-d93cdb3a-274e77d9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-7427ed0c.js → styles-6aaf32cf-e364a1d7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-ff5e5a16.js → styles-9a916d00-0dae36f6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-7b3680cf.js → styles-c10674c1-c4641675.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f860f2ad.js → svgDrawCommon-08f97a94-831fe9a1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-2eebf0c8.js → timeline-definition-85554ec2-c3304b3a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5d7f4e96.js → xychartDiagram-e933f94c-da799369.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +3 -1
- rasa/core/channels/inspector/src/App.tsx +91 -90
- rasa/core/channels/inspector/src/components/Chat.tsx +45 -41
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +40 -40
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +57 -57
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +36 -27
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +4 -4
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +7 -7
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +28 -12
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +9 -9
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +5 -5
- rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +55 -60
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +5 -5
- rasa/core/channels/inspector/src/components/Slots.tsx +22 -22
- rasa/core/channels/inspector/src/components/Welcome.tsx +28 -31
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +245 -0
- rasa/core/channels/inspector/src/helpers/audio/microphone-processor.js +12 -0
- rasa/core/channels/inspector/src/helpers/audio/playback-processor.js +36 -0
- rasa/core/channels/inspector/src/helpers/conversation.ts +7 -7
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +181 -181
- rasa/core/channels/inspector/src/helpers/formatters.ts +111 -111
- rasa/core/channels/inspector/src/helpers/utils.ts +78 -61
- rasa/core/channels/inspector/src/main.tsx +8 -8
- rasa/core/channels/inspector/src/theme/Button/Button.ts +8 -8
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +7 -7
- rasa/core/channels/inspector/src/theme/Input/Input.ts +9 -9
- rasa/core/channels/inspector/src/theme/Link/Link.ts +6 -6
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +13 -13
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +10 -10
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +5 -5
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +7 -7
- rasa/core/channels/inspector/src/theme/base/colors.ts +64 -64
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +21 -18
- rasa/core/channels/inspector/src/theme/base/radii.ts +8 -8
- rasa/core/channels/inspector/src/theme/base/shadows.ts +5 -5
- rasa/core/channels/inspector/src/theme/base/sizes.ts +5 -5
- rasa/core/channels/inspector/src/theme/base/space.ts +12 -12
- rasa/core/channels/inspector/src/theme/base/styles.ts +5 -5
- rasa/core/channels/inspector/src/theme/base/typography.ts +12 -12
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +3 -3
- rasa/core/channels/inspector/src/theme/index.ts +38 -38
- rasa/core/channels/inspector/src/types.ts +56 -50
- rasa/core/channels/inspector/yarn.lock +5 -0
- rasa/core/channels/mattermost.py +1 -1
- rasa/core/channels/rasa_chat.py +2 -4
- rasa/core/channels/rest.py +5 -4
- rasa/core/channels/socketio.py +56 -41
- rasa/core/channels/studio_chat.py +337 -71
- rasa/core/channels/vier_cvg.py +1 -2
- rasa/core/channels/voice_ready/audiocodes.py +4 -11
- rasa/core/channels/voice_stream/audiocodes.py +8 -5
- rasa/core/channels/voice_stream/browser_audio.py +1 -1
- rasa/core/channels/voice_stream/genesys.py +2 -2
- rasa/core/channels/voice_stream/tts/__init__.py +8 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +10 -5
- rasa/core/channels/voice_stream/voice_channel.py +65 -23
- rasa/core/concurrent_lock_store.py +24 -10
- rasa/core/evaluation/marker_tracker_loader.py +1 -1
- rasa/core/exporter.py +1 -1
- rasa/core/http_interpreter.py +3 -7
- rasa/core/information_retrieval/faiss.py +18 -11
- rasa/core/information_retrieval/ingestion/__init__.py +0 -0
- rasa/core/information_retrieval/ingestion/faq_parser.py +158 -0
- rasa/core/jobs.py +2 -1
- rasa/core/lock_store.py +151 -60
- rasa/core/nlg/contextual_response_rephraser.py +17 -7
- rasa/core/nlg/generator.py +5 -22
- rasa/core/nlg/interpolator.py +2 -3
- rasa/core/nlg/response.py +6 -43
- rasa/core/nlg/summarize.py +1 -1
- rasa/core/nlg/translate.py +0 -8
- rasa/core/policies/enterprise_search_policy.py +262 -62
- rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_template.jinja2 +63 -0
- rasa/core/policies/flow_policy.py +1 -1
- rasa/core/policies/flows/flow_executor.py +96 -17
- rasa/core/policies/intentless_policy.py +56 -17
- rasa/core/processor.py +64 -49
- rasa/core/run.py +33 -11
- rasa/core/tracker_stores/__init__.py +0 -0
- rasa/core/{auth_retry_tracker_store.py → tracker_stores/auth_retry_tracker_store.py} +5 -1
- rasa/core/tracker_stores/dynamo_tracker_store.py +218 -0
- rasa/core/tracker_stores/mongo_tracker_store.py +206 -0
- rasa/core/tracker_stores/redis_tracker_store.py +219 -0
- rasa/core/tracker_stores/sql_tracker_store.py +555 -0
- rasa/core/tracker_stores/tracker_store.py +805 -0
- rasa/core/training/interactive.py +1 -1
- rasa/core/utils.py +24 -95
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -1
- rasa/dialogue_understanding/coexistence/llm_based_router.py +9 -6
- rasa/dialogue_understanding/commands/can_not_handle_command.py +2 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +5 -1
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +2 -0
- rasa/dialogue_understanding/commands/clarify_command.py +4 -0
- rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +1 -3
- rasa/dialogue_understanding/commands/human_handoff_command.py +2 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +2 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +2 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +4 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +2 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +4 -0
- rasa/dialogue_understanding/generator/__init__.py +7 -1
- rasa/dialogue_understanding/generator/command_generator.py +4 -2
- rasa/dialogue_understanding/generator/command_parser.py +2 -2
- rasa/dialogue_understanding/generator/command_parser_validator.py +63 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +1 -2
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +2 -2
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +78 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +26 -461
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +147 -0
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +477 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +11 -64
- rasa/dialogue_understanding/patterns/cancel.py +1 -2
- rasa/dialogue_understanding/patterns/clarify.py +1 -1
- rasa/dialogue_understanding/patterns/correction.py +2 -2
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +37 -25
- rasa/dialogue_understanding/patterns/domain_for_patterns.py +190 -0
- rasa/dialogue_understanding/processor/command_processor.py +6 -7
- rasa/dialogue_understanding/stack/utils.py +3 -1
- rasa/dialogue_understanding_test/command_metric_calculation.py +7 -40
- rasa/dialogue_understanding_test/command_metrics.py +38 -0
- rasa/dialogue_understanding_test/du_test_case.py +58 -25
- rasa/dialogue_understanding_test/du_test_result.py +228 -132
- rasa/dialogue_understanding_test/du_test_runner.py +11 -2
- rasa/dialogue_understanding_test/du_test_schema.yml +3 -3
- rasa/dialogue_understanding_test/io.py +35 -8
- rasa/e2e_test/e2e_test_runner.py +1 -1
- rasa/e2e_test/e2e_test_schema.yml +3 -3
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +2 -2
- rasa/engine/recipes/default_recipe.py +1 -1
- rasa/engine/validation.py +3 -2
- rasa/hooks.py +2 -30
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +1 -5
- rasa/model_manager/model_api.py +90 -2
- rasa/model_manager/socket_bridge.py +0 -7
- rasa/model_manager/trainer_service.py +15 -12
- rasa/plugin.py +2 -15
- rasa/privacy/__init__.py +0 -0
- rasa/privacy/constants.py +83 -0
- rasa/privacy/event_broker_utils.py +77 -0
- rasa/privacy/privacy_config.py +281 -0
- rasa/privacy/privacy_config_schema.json +86 -0
- rasa/privacy/privacy_filter.py +340 -0
- rasa/privacy/privacy_manager.py +576 -0
- rasa/server.py +23 -2
- rasa/shared/constants.py +14 -0
- rasa/shared/core/command_payload_reader.py +1 -5
- rasa/shared/core/constants.py +4 -3
- rasa/shared/core/domain.py +172 -11
- rasa/shared/core/events.py +100 -6
- rasa/shared/core/flows/flow.py +35 -8
- rasa/shared/core/flows/flow_step.py +26 -4
- rasa/shared/core/flows/flow_step_links.py +15 -0
- rasa/shared/core/flows/flow_step_sequence.py +6 -0
- rasa/shared/core/flows/flows_yaml_schema.json +3 -0
- rasa/shared/core/flows/nlu_trigger.py +13 -0
- rasa/shared/core/flows/steps/action.py +7 -4
- rasa/shared/core/flows/steps/call.py +11 -4
- rasa/shared/core/flows/steps/collect.py +71 -6
- rasa/shared/core/flows/steps/internal.py +6 -1
- rasa/shared/core/flows/steps/link.py +7 -4
- rasa/shared/core/flows/steps/no_operation.py +7 -4
- rasa/shared/core/flows/steps/set_slots.py +8 -4
- rasa/shared/core/flows/validation.py +16 -3
- rasa/shared/core/flows/yaml_flows_io.py +106 -5
- rasa/shared/core/slots.py +33 -1
- rasa/shared/core/trackers.py +4 -10
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +1 -4
- rasa/shared/importers/importer.py +14 -0
- rasa/shared/importers/static.py +63 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +2 -2
- rasa/shared/utils/common.py +43 -1
- rasa/shared/utils/llm.py +155 -3
- rasa/shared/utils/yaml.py +32 -0
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download/__init__.py +0 -0
- rasa/studio/download/domains.py +49 -0
- rasa/studio/download/download.py +416 -0
- rasa/studio/download/flows.py +351 -0
- rasa/studio/link.py +200 -0
- rasa/studio/pull.py +94 -0
- rasa/studio/push.py +131 -0
- rasa/studio/results_logger.py +6 -1
- rasa/studio/upload.py +185 -71
- rasa/telemetry.py +83 -26
- rasa/tracing/config.py +4 -5
- rasa/tracing/constants.py +19 -1
- rasa/tracing/instrumentation/attribute_extractors.py +47 -9
- rasa/tracing/instrumentation/instrumentation.py +54 -3
- rasa/tracing/instrumentation/metrics.py +98 -15
- rasa/tracing/metric_instrument_provider.py +75 -3
- rasa/utils/common.py +37 -27
- rasa/utils/endpoints.py +22 -1
- rasa/utils/licensing.py +2 -3
- rasa/utils/log_utils.py +1 -45
- rasa/validator.py +9 -11
- rasa/version.py +1 -1
- {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/METADATA +12 -13
- {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/RECORD +308 -283
- rasa/anonymization/__init__.py +0 -2
- rasa/anonymization/anonymisation_rule_yaml_reader.py +0 -91
- rasa/anonymization/anonymization_pipeline.py +0 -286
- rasa/anonymization/anonymization_rule_executor.py +0 -266
- rasa/anonymization/anonymization_rule_orchestrator.py +0 -119
- rasa/anonymization/schemas/config.yml +0 -47
- rasa/anonymization/utils.py +0 -118
- rasa/cli/project_templates/calm/config.yml +0 -10
- rasa/cli/project_templates/calm/credentials.yml +0 -33
- rasa/cli/project_templates/calm/endpoints.yml +0 -58
- rasa/cli/project_templates/default/actions/actions.py +0 -27
- rasa/cli/project_templates/default/data/nlu.yml +0 -91
- rasa/cli/project_templates/default/data/rules.yml +0 -13
- rasa/cli/project_templates/default/data/stories.yml +0 -30
- rasa/cli/project_templates/default/domain.yml +0 -34
- rasa/cli/project_templates/default/tests/test_stories.yml +0 -91
- rasa/core/channels/inspector/dist/assets/channel-dfa68278.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-edb7f119.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-65e7c670.js +0 -1
- rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -191
- rasa/core/tracker_store.py +0 -1792
- rasa/studio/download.py +0 -489
- /rasa/{cli/project_templates/calm/actions → builder}/__init__.py +0 -0
- /rasa/cli/project_templates/{calm → default}/actions/action_template.py +0 -0
- /rasa/cli/project_templates/{calm → default}/actions/add_contact.py +0 -0
- /rasa/cli/project_templates/{calm → default}/actions/db.py +0 -0
- /rasa/cli/project_templates/{calm → default}/actions/list_contacts.py +0 -0
- /rasa/cli/project_templates/{calm → default}/actions/remove_contact.py +0 -0
- /rasa/cli/project_templates/{calm → default}/data/flows/add_contact.yml +0 -0
- /rasa/cli/project_templates/{calm → default}/data/flows/list_contacts.yml +0 -0
- /rasa/cli/project_templates/{calm → default}/data/flows/remove_contact.yml +0 -0
- /rasa/cli/project_templates/{calm → default}/db/contacts.json +0 -0
- /rasa/cli/project_templates/{calm → default}/domain/add_contact.yml +0 -0
- /rasa/cli/project_templates/{calm → default}/domain/list_contacts.yml +0 -0
- /rasa/cli/project_templates/{calm → default}/domain/remove_contact.yml +0 -0
- /rasa/cli/project_templates/{calm → default}/domain/shared.yml +0 -0
- {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/WHEEL +0 -0
- {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/entry_points.txt +0 -0
|
@@ -150,12 +150,12 @@ class FlowPolicy(Policy):
|
|
|
150
150
|
except FlowCircuitBreakerTrippedException as e:
|
|
151
151
|
structlogger.error(
|
|
152
152
|
"flow.circuit_breaker",
|
|
153
|
-
dialogue_stack=e.dialogue_stack,
|
|
154
153
|
number_of_steps_taken=e.number_of_steps_taken,
|
|
155
154
|
event_info=(
|
|
156
155
|
"The flow circuit breaker tripped. "
|
|
157
156
|
"There appears to be an infinite loop in the flows."
|
|
158
157
|
),
|
|
158
|
+
error=str(e),
|
|
159
159
|
)
|
|
160
160
|
# end the current flow and start the internal error flow
|
|
161
161
|
updated_stack = tracker.stack
|
|
@@ -9,6 +9,7 @@ from structlog.contextvars import (
|
|
|
9
9
|
bound_contextvars,
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
+
from rasa.core.available_endpoints import AvailableEndpoints
|
|
12
13
|
from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
|
|
13
14
|
from rasa.core.policies.flows.flow_exceptions import (
|
|
14
15
|
FlowCircuitBreakerTrippedException,
|
|
@@ -24,6 +25,7 @@ from rasa.core.policies.flows.flow_step_result import (
|
|
|
24
25
|
from rasa.dialogue_understanding.commands import CancelFlowCommand
|
|
25
26
|
from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
|
|
26
27
|
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
28
|
+
FLOW_PATTERN_COLLECT_INFORMATION,
|
|
27
29
|
CollectInformationPatternFlowStackFrame,
|
|
28
30
|
)
|
|
29
31
|
from rasa.dialogue_understanding.patterns.completed import (
|
|
@@ -54,6 +56,7 @@ from rasa.dialogue_understanding.stack.utils import (
|
|
|
54
56
|
from rasa.shared.constants import RASA_PATTERN_HUMAN_HANDOFF
|
|
55
57
|
from rasa.shared.core.constants import (
|
|
56
58
|
ACTION_LISTEN_NAME,
|
|
59
|
+
SILENCE_TIMEOUT_SLOT,
|
|
57
60
|
)
|
|
58
61
|
from rasa.shared.core.events import (
|
|
59
62
|
Event,
|
|
@@ -123,7 +126,6 @@ def is_condition_satisfied(
|
|
|
123
126
|
structlogger.error(
|
|
124
127
|
"flow.predicate.error",
|
|
125
128
|
predicate=predicate,
|
|
126
|
-
document=document,
|
|
127
129
|
error=str(e),
|
|
128
130
|
)
|
|
129
131
|
return False
|
|
@@ -177,7 +179,7 @@ def select_next_step_id(
|
|
|
177
179
|
"flow.link.failed_to_select_branch",
|
|
178
180
|
current=current,
|
|
179
181
|
links=next_step.links,
|
|
180
|
-
|
|
182
|
+
sender_id=tracker.sender_id,
|
|
181
183
|
)
|
|
182
184
|
return None
|
|
183
185
|
|
|
@@ -191,7 +193,7 @@ def select_next_step_id(
|
|
|
191
193
|
structlogger.error(
|
|
192
194
|
"flow.step.failed_to_select_next_step",
|
|
193
195
|
step=current,
|
|
194
|
-
|
|
196
|
+
sender_id=tracker.sender_id,
|
|
195
197
|
)
|
|
196
198
|
return None
|
|
197
199
|
|
|
@@ -226,19 +228,6 @@ def events_from_set_slots_step(step: SetSlotsFlowStep) -> List[Event]:
|
|
|
226
228
|
return [SlotSet(slot["key"], slot["value"]) for slot in step.slots]
|
|
227
229
|
|
|
228
230
|
|
|
229
|
-
def events_for_collect_step_execution(
|
|
230
|
-
step: CollectInformationFlowStep, tracker: DialogueStateTracker
|
|
231
|
-
) -> List[Event]:
|
|
232
|
-
"""Create the events needed to prepare for the execution of a collect step."""
|
|
233
|
-
# reset the slots that always need to be explicitly collected
|
|
234
|
-
slot = tracker.slots.get(step.collect, None)
|
|
235
|
-
|
|
236
|
-
if slot and step.ask_before_filling:
|
|
237
|
-
return [SlotSet(step.collect, None)]
|
|
238
|
-
else:
|
|
239
|
-
return []
|
|
240
|
-
|
|
241
|
-
|
|
242
231
|
def trigger_pattern_continue_interrupted(
|
|
243
232
|
current_frame: DialogueStackFrame,
|
|
244
233
|
stack: DialogueStack,
|
|
@@ -600,6 +589,12 @@ def run_step(
|
|
|
600
589
|
# the START_STEP meta step
|
|
601
590
|
initial_events.append(FlowStarted(flow.id, metadata=stack.current_context()))
|
|
602
591
|
|
|
592
|
+
# FLow does not start with collect step or we are not in collect information pattern
|
|
593
|
+
if _first_step_is_not_collect(
|
|
594
|
+
step, previous_step_id
|
|
595
|
+
) and not _in_collect_information_pattern(flow):
|
|
596
|
+
_append_global_silence_timeout_event(initial_events, tracker)
|
|
597
|
+
|
|
603
598
|
if isinstance(step, CollectInformationFlowStep):
|
|
604
599
|
return _run_collect_information_step(
|
|
605
600
|
available_actions,
|
|
@@ -629,12 +624,32 @@ def run_step(
|
|
|
629
624
|
return ContinueFlowWithNextStep(events=initial_events)
|
|
630
625
|
|
|
631
626
|
elif isinstance(step, EndFlowStep):
|
|
627
|
+
# If pattern collect information flow is ending,
|
|
628
|
+
# we need to reset the silence timeout slot to its global value.
|
|
629
|
+
if flow.id == FLOW_PATTERN_COLLECT_INFORMATION:
|
|
630
|
+
_append_global_silence_timeout_event(initial_events, tracker)
|
|
631
|
+
|
|
632
632
|
return _run_end_step(flow, flows, initial_events, stack, tracker)
|
|
633
633
|
|
|
634
634
|
else:
|
|
635
635
|
raise FlowException(f"Unknown flow step type {type(step)}")
|
|
636
636
|
|
|
637
637
|
|
|
638
|
+
def _first_step_is_not_collect(
|
|
639
|
+
step: FlowStep,
|
|
640
|
+
previous_step_id: str,
|
|
641
|
+
) -> bool:
|
|
642
|
+
"""Check if the first step is not a collect information step."""
|
|
643
|
+
return (previous_step_id == START_STEP) and not isinstance(
|
|
644
|
+
step, CollectInformationFlowStep
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
def _in_collect_information_pattern(flow: Flow) -> bool:
|
|
649
|
+
"""Check if the current flow is a collect information pattern."""
|
|
650
|
+
return flow.id == FLOW_PATTERN_COLLECT_INFORMATION
|
|
651
|
+
|
|
652
|
+
|
|
638
653
|
def _run_end_step(
|
|
639
654
|
flow: Flow,
|
|
640
655
|
flows: FlowsList,
|
|
@@ -745,5 +760,69 @@ def _run_collect_information_step(
|
|
|
745
760
|
step.collect, stack, step.rejections, step.utter, step.collect_action
|
|
746
761
|
)
|
|
747
762
|
|
|
748
|
-
events: List[Event] =
|
|
763
|
+
events: List[Event] = _events_for_collect_step_execution(step, tracker)
|
|
749
764
|
return ContinueFlowWithNextStep(events=initial_events + events)
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
def _events_for_collect_step_execution(
|
|
768
|
+
step: CollectInformationFlowStep, tracker: DialogueStateTracker
|
|
769
|
+
) -> List[Event]:
|
|
770
|
+
"""Create the events needed to prepare for the execution of a collect step."""
|
|
771
|
+
# reset the slots that always need to be explicitly collected
|
|
772
|
+
|
|
773
|
+
events = _silence_timeout_events_for_collect_step(step, tracker)
|
|
774
|
+
|
|
775
|
+
slot = tracker.slots.get(step.collect, None)
|
|
776
|
+
if slot and step.ask_before_filling:
|
|
777
|
+
events.append(SlotSet(step.collect, None))
|
|
778
|
+
|
|
779
|
+
return events
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
def _silence_timeout_events_for_collect_step(
|
|
783
|
+
step: CollectInformationFlowStep, tracker: DialogueStateTracker
|
|
784
|
+
) -> List[Event]:
|
|
785
|
+
events: List[Event] = []
|
|
786
|
+
|
|
787
|
+
silence_timeout = (
|
|
788
|
+
AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout
|
|
789
|
+
)
|
|
790
|
+
|
|
791
|
+
if step.silence_timeout:
|
|
792
|
+
structlogger.debug(
|
|
793
|
+
"flow.step.run.adjusting_silence_timeout",
|
|
794
|
+
duration=step.silence_timeout,
|
|
795
|
+
collect=step.collect,
|
|
796
|
+
)
|
|
797
|
+
|
|
798
|
+
silence_timeout = step.silence_timeout
|
|
799
|
+
else:
|
|
800
|
+
structlogger.debug(
|
|
801
|
+
"flow.step.run.reset_silence_timeout_to_global",
|
|
802
|
+
duration=silence_timeout,
|
|
803
|
+
collect=step.collect,
|
|
804
|
+
)
|
|
805
|
+
|
|
806
|
+
current_silence_timeout = tracker.get_slot(SILENCE_TIMEOUT_SLOT)
|
|
807
|
+
|
|
808
|
+
if current_silence_timeout != silence_timeout:
|
|
809
|
+
events.append(SlotSet(SILENCE_TIMEOUT_SLOT, silence_timeout))
|
|
810
|
+
|
|
811
|
+
return events
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
def _append_global_silence_timeout_event(
|
|
815
|
+
events: List[Event], tracker: DialogueStateTracker
|
|
816
|
+
) -> None:
|
|
817
|
+
current_silence_timeout = tracker.get_slot(SILENCE_TIMEOUT_SLOT)
|
|
818
|
+
global_silence_timeout = (
|
|
819
|
+
AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout
|
|
820
|
+
)
|
|
821
|
+
|
|
822
|
+
if current_silence_timeout != global_silence_timeout:
|
|
823
|
+
events.append(
|
|
824
|
+
SlotSet(
|
|
825
|
+
SILENCE_TIMEOUT_SLOT,
|
|
826
|
+
AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout,
|
|
827
|
+
)
|
|
828
|
+
)
|
|
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple
|
|
|
5
5
|
|
|
6
6
|
import structlog
|
|
7
7
|
import tiktoken
|
|
8
|
+
from deprecated import deprecated # type: ignore[import]
|
|
8
9
|
from jinja2 import Template
|
|
9
10
|
from langchain.docstore.document import Document
|
|
10
11
|
from langchain.schema.embeddings import Embeddings
|
|
@@ -37,18 +38,14 @@ from rasa.shared.constants import (
|
|
|
37
38
|
MODEL_NAME_CONFIG_KEY,
|
|
38
39
|
OPENAI_PROVIDER,
|
|
39
40
|
PROMPT_CONFIG_KEY,
|
|
41
|
+
PROMPT_TEMPLATE_CONFIG_KEY,
|
|
40
42
|
PROVIDER_CONFIG_KEY,
|
|
41
43
|
TEMPERATURE_CONFIG_KEY,
|
|
42
44
|
TIMEOUT_CONFIG_KEY,
|
|
43
45
|
)
|
|
44
46
|
from rasa.shared.core.constants import ACTION_LISTEN_NAME
|
|
45
47
|
from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
|
|
46
|
-
from rasa.shared.core.events import
|
|
47
|
-
ActionExecuted,
|
|
48
|
-
BotUttered,
|
|
49
|
-
Event,
|
|
50
|
-
UserUttered,
|
|
51
|
-
)
|
|
48
|
+
from rasa.shared.core.events import ActionExecuted, BotUttered, Event, UserUttered
|
|
52
49
|
from rasa.shared.core.flows import FlowsList
|
|
53
50
|
from rasa.shared.core.generator import TrackerWithCachedStates
|
|
54
51
|
from rasa.shared.core.policies.utils import filter_responses_for_intentless_policy
|
|
@@ -60,18 +57,22 @@ from rasa.shared.providers.embedding._langchain_embedding_client_adapter import
|
|
|
60
57
|
_LangchainEmbeddingClientAdapter,
|
|
61
58
|
)
|
|
62
59
|
from rasa.shared.providers.llm.llm_client import LLMClient
|
|
63
|
-
from rasa.shared.utils.constants import
|
|
60
|
+
from rasa.shared.utils.constants import (
|
|
61
|
+
LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON,
|
|
62
|
+
LOG_COMPONENT_SOURCE_METHOD_INIT,
|
|
63
|
+
)
|
|
64
64
|
from rasa.shared.utils.health_check.embeddings_health_check_mixin import (
|
|
65
65
|
EmbeddingsHealthCheckMixin,
|
|
66
66
|
)
|
|
67
67
|
from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
|
|
68
|
-
from rasa.shared.utils.io import deep_container_fingerprint
|
|
68
|
+
from rasa.shared.utils.io import deep_container_fingerprint, raise_deprecation_warning
|
|
69
69
|
from rasa.shared.utils.llm import (
|
|
70
70
|
AI,
|
|
71
71
|
DEFAULT_OPENAI_CHAT_MODEL_NAME,
|
|
72
72
|
DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
|
|
73
73
|
DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
|
|
74
74
|
USER,
|
|
75
|
+
check_prompt_config_keys_and_warn_if_deprecated,
|
|
75
76
|
combine_custom_and_default_config,
|
|
76
77
|
embedder_factory,
|
|
77
78
|
get_prompt_template,
|
|
@@ -123,9 +124,12 @@ DEFAULT_EMBEDDINGS_CONFIG = {
|
|
|
123
124
|
MODEL_CONFIG_KEY: DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
|
|
124
125
|
}
|
|
125
126
|
|
|
126
|
-
|
|
127
|
+
DEFAULT_INTENTLESS_PROMPT_TEMPLATE_FILE_NAME = importlib.resources.open_text(
|
|
127
128
|
"rasa.core.policies", "intentless_prompt_template.jinja2"
|
|
128
129
|
).name
|
|
130
|
+
DEFAULT_INTENTLESS_PROMPT_TEMPLATE = importlib.resources.read_text(
|
|
131
|
+
"rasa.core.policies", "intentless_prompt_template.jinja2"
|
|
132
|
+
)
|
|
129
133
|
|
|
130
134
|
INTENTLESS_PROMPT_TEMPLATE_FILE_NAME = "intentless_policy_prompt.jinja2"
|
|
131
135
|
INTENTLESS_CONFIG_FILE_NAME = "config.json"
|
|
@@ -325,6 +329,9 @@ def conversation_as_prompt(conversation: Conversation) -> str:
|
|
|
325
329
|
@DefaultV1Recipe.register(
|
|
326
330
|
DefaultV1Recipe.ComponentType.POLICY_WITH_END_TO_END_SUPPORT, is_trainable=True
|
|
327
331
|
)
|
|
332
|
+
@deprecated(
|
|
333
|
+
reason=("The IntentlessPolicy is deprecated and will be removed in Rasa `4.0.0`.")
|
|
334
|
+
)
|
|
328
335
|
class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
|
|
329
336
|
"""Policy which uses a language model to generate the next action.
|
|
330
337
|
|
|
@@ -346,7 +353,7 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
|
|
|
346
353
|
# ensures that the policy will not override a deterministic policy
|
|
347
354
|
# which utilizes the nlu predictions confidence (e.g. Memoization).
|
|
348
355
|
NLU_ABSTENTION_THRESHOLD: 0.9,
|
|
349
|
-
|
|
356
|
+
PROMPT_TEMPLATE_CONFIG_KEY: None, # TODO: remove in Rasa 4.0.0
|
|
350
357
|
}
|
|
351
358
|
|
|
352
359
|
@staticmethod
|
|
@@ -378,6 +385,9 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
|
|
|
378
385
|
prompt_template: Optional[Text] = None,
|
|
379
386
|
) -> None:
|
|
380
387
|
"""Constructs a new Policy object."""
|
|
388
|
+
raise_deprecation_warning(
|
|
389
|
+
message=("Support for `IntentlessPolicy` will be removed in Rasa `4.0.0`.")
|
|
390
|
+
)
|
|
381
391
|
super().__init__(config, model_storage, resource, execution_context, featurizer)
|
|
382
392
|
|
|
383
393
|
# Resolve LLM config
|
|
@@ -400,11 +410,43 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
|
|
|
400
410
|
self.response_index = responses_docsearch
|
|
401
411
|
self.conversation_samples_index = samples_docsearch
|
|
402
412
|
self.embedder = self._create_plain_embedder(config)
|
|
403
|
-
|
|
404
|
-
|
|
413
|
+
|
|
414
|
+
# Warn if the prompt config key is used to set the prompt template
|
|
415
|
+
check_prompt_config_keys_and_warn_if_deprecated(config, "intentless_policy")
|
|
416
|
+
|
|
417
|
+
self.prompt_template = prompt_template or self._resolve_prompt_template(
|
|
418
|
+
config, LOG_COMPONENT_SOURCE_METHOD_INIT
|
|
405
419
|
)
|
|
406
420
|
self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
|
|
407
421
|
|
|
422
|
+
@classmethod
|
|
423
|
+
def _resolve_prompt_template(
|
|
424
|
+
cls: Any,
|
|
425
|
+
config: dict,
|
|
426
|
+
log_source_method: str,
|
|
427
|
+
) -> str:
|
|
428
|
+
"""Resolves the prompt template from the config.
|
|
429
|
+
|
|
430
|
+
Args:
|
|
431
|
+
config: The config to resolve the prompt template from.
|
|
432
|
+
log_source_method: The method from which the prompt template is resolved.
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
The resolved prompt template.
|
|
436
|
+
"""
|
|
437
|
+
# Prefer prompt template over prompt config key.
|
|
438
|
+
prompt_template_file = (
|
|
439
|
+
config.get(PROMPT_TEMPLATE_CONFIG_KEY)
|
|
440
|
+
or config.get(PROMPT_CONFIG_KEY)
|
|
441
|
+
or DEFAULT_INTENTLESS_PROMPT_TEMPLATE_FILE_NAME
|
|
442
|
+
)
|
|
443
|
+
return get_prompt_template(
|
|
444
|
+
prompt_template_file,
|
|
445
|
+
DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
|
|
446
|
+
log_source_component=IntentlessPolicy.__name__,
|
|
447
|
+
log_source_method=log_source_method,
|
|
448
|
+
)
|
|
449
|
+
|
|
408
450
|
@classmethod
|
|
409
451
|
def _create_plain_embedder(cls, config: Dict[Text, Any]) -> Embeddings:
|
|
410
452
|
"""Creates an embedder that uses the OpenAI API.
|
|
@@ -943,11 +985,8 @@ class IntentlessPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Policy):
|
|
|
943
985
|
@classmethod
|
|
944
986
|
def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
|
|
945
987
|
"""Add a fingerprint of intentless policy for the graph."""
|
|
946
|
-
prompt_template =
|
|
947
|
-
config
|
|
948
|
-
DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
|
|
949
|
-
log_source_component=IntentlessPolicy.__name__,
|
|
950
|
-
log_source_method=LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON,
|
|
988
|
+
prompt_template = cls._resolve_prompt_template(
|
|
989
|
+
config, LOG_COMPONENT_SOURCE_METHOD_FINGERPRINT_ADDON
|
|
951
990
|
)
|
|
952
991
|
|
|
953
992
|
llm_config = resolve_model_client_config(
|
rasa/core/processor.py
CHANGED
|
@@ -12,7 +12,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
|
|
|
12
12
|
import structlog
|
|
13
13
|
|
|
14
14
|
import rasa.core.actions.action
|
|
15
|
-
import rasa.core.tracker_store
|
|
15
|
+
import rasa.core.tracker_stores.tracker_store
|
|
16
16
|
import rasa.core.utils
|
|
17
17
|
import rasa.shared.core.trackers
|
|
18
18
|
import rasa.shared.utils.io
|
|
@@ -75,8 +75,8 @@ from rasa.shared.core.constants import (
|
|
|
75
75
|
ACTION_SESSION_START_NAME,
|
|
76
76
|
FOLLOWUP_ACTION,
|
|
77
77
|
SESSION_START_METADATA_SLOT,
|
|
78
|
+
SILENCE_TIMEOUT_SLOT,
|
|
78
79
|
SLOT_CONSECUTIVE_SILENCE_TIMEOUTS,
|
|
79
|
-
SLOT_SILENCE_TIMEOUT,
|
|
80
80
|
USER_INTENT_RESTART,
|
|
81
81
|
USER_INTENT_SILENCE_TIMEOUT,
|
|
82
82
|
SetSlotExtractor,
|
|
@@ -112,7 +112,8 @@ from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
|
|
|
112
112
|
from rasa.utils.endpoints import EndpointConfig
|
|
113
113
|
|
|
114
114
|
if TYPE_CHECKING:
|
|
115
|
-
from rasa.core.
|
|
115
|
+
from rasa.core.available_endpoints import AvailableEndpoints
|
|
116
|
+
from rasa.privacy.privacy_manager import BackgroundPrivacyManager
|
|
116
117
|
|
|
117
118
|
logger = logging.getLogger(__name__)
|
|
118
119
|
structlogger = structlog.get_logger()
|
|
@@ -129,7 +130,7 @@ class MessageProcessor:
|
|
|
129
130
|
def __init__(
|
|
130
131
|
self,
|
|
131
132
|
model_path: Union[Text, Path],
|
|
132
|
-
tracker_store: rasa.core.tracker_store.TrackerStore,
|
|
133
|
+
tracker_store: rasa.core.tracker_stores.tracker_store.TrackerStore,
|
|
133
134
|
lock_store: LockStore,
|
|
134
135
|
generator: NaturalLanguageGenerator,
|
|
135
136
|
action_endpoint: Optional[EndpointConfig] = None,
|
|
@@ -138,6 +139,7 @@ class MessageProcessor:
|
|
|
138
139
|
on_circuit_break: Optional[LambdaType] = None,
|
|
139
140
|
http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
|
|
140
141
|
endpoints: Optional["AvailableEndpoints"] = None,
|
|
142
|
+
privacy_manager: Optional["BackgroundPrivacyManager"] = None,
|
|
141
143
|
) -> None:
|
|
142
144
|
"""Initializes a `MessageProcessor`."""
|
|
143
145
|
self.nlg = generator
|
|
@@ -167,6 +169,9 @@ class MessageProcessor:
|
|
|
167
169
|
self.model_path = Path(model_path)
|
|
168
170
|
self.domain = self.model_metadata.domain
|
|
169
171
|
self.http_interpreter = http_interpreter
|
|
172
|
+
self.privacy_manager = privacy_manager
|
|
173
|
+
if self.privacy_manager is not None:
|
|
174
|
+
self.privacy_manager.validate_sensitive_slots_in_domain(self.domain)
|
|
170
175
|
|
|
171
176
|
@staticmethod
|
|
172
177
|
def _load_model(
|
|
@@ -216,15 +221,30 @@ class MessageProcessor:
|
|
|
216
221
|
|
|
217
222
|
await self._run_prediction_loop(message.output_channel, tracker)
|
|
218
223
|
|
|
219
|
-
await self.run_anonymization_pipeline(tracker)
|
|
220
|
-
|
|
221
224
|
await self.save_tracker(tracker)
|
|
222
225
|
|
|
226
|
+
self.trigger_anonymization(tracker)
|
|
227
|
+
|
|
223
228
|
if isinstance(message.output_channel, CollectingOutputChannel):
|
|
224
229
|
return message.output_channel.messages
|
|
225
230
|
|
|
226
231
|
return None
|
|
227
232
|
|
|
233
|
+
def trigger_anonymization(self, tracker: DialogueStateTracker) -> None:
|
|
234
|
+
if self.privacy_manager is None:
|
|
235
|
+
structlogger.debug(
|
|
236
|
+
"processor.trigger_anonymization.skipping.pii_management_not_enabled",
|
|
237
|
+
)
|
|
238
|
+
return None
|
|
239
|
+
|
|
240
|
+
structlogger.info(
|
|
241
|
+
"rasa.core.processor.trigger_anonymization",
|
|
242
|
+
sender_id=tracker.sender_id,
|
|
243
|
+
event_info="Triggering anonymization for publishing anonymized "
|
|
244
|
+
"events to the event broker.",
|
|
245
|
+
)
|
|
246
|
+
return self.privacy_manager.run(tracker)
|
|
247
|
+
|
|
228
248
|
async def run_action_extract_slots(
|
|
229
249
|
self,
|
|
230
250
|
output_channel: OutputChannel,
|
|
@@ -265,26 +285,6 @@ class MessageProcessor:
|
|
|
265
285
|
|
|
266
286
|
return tracker
|
|
267
287
|
|
|
268
|
-
async def run_anonymization_pipeline(self, tracker: DialogueStateTracker) -> None:
|
|
269
|
-
"""Run the anonymization pipeline on the new tracker events.
|
|
270
|
-
|
|
271
|
-
Args:
|
|
272
|
-
tracker: A tracker representing a conversation state.
|
|
273
|
-
"""
|
|
274
|
-
anonymization_pipeline = plugin_manager().hook.get_anonymization_pipeline()
|
|
275
|
-
if anonymization_pipeline is None:
|
|
276
|
-
return None
|
|
277
|
-
|
|
278
|
-
old_tracker = await self.tracker_store.retrieve(tracker.sender_id)
|
|
279
|
-
new_events = rasa.shared.core.trackers.TrackerEventDiffEngine.event_difference(
|
|
280
|
-
old_tracker, tracker
|
|
281
|
-
)
|
|
282
|
-
|
|
283
|
-
for event in new_events:
|
|
284
|
-
body = {"sender_id": tracker.sender_id}
|
|
285
|
-
body.update(event.as_dict())
|
|
286
|
-
anonymization_pipeline.run(body)
|
|
287
|
-
|
|
288
288
|
async def predict_next_for_sender_id(
|
|
289
289
|
self, sender_id: Text
|
|
290
290
|
) -> Optional[Dict[Text, Any]]:
|
|
@@ -822,28 +822,8 @@ class MessageProcessor:
|
|
|
822
822
|
)
|
|
823
823
|
|
|
824
824
|
self._check_for_unseen_features(parse_data)
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
|
|
828
|
-
!= USER_INTENT_SILENCE_TIMEOUT
|
|
829
|
-
and tracker
|
|
830
|
-
):
|
|
831
|
-
if (
|
|
832
|
-
SLOT_CONSECUTIVE_SILENCE_TIMEOUTS in tracker.slots
|
|
833
|
-
and tracker.slots[SLOT_CONSECUTIVE_SILENCE_TIMEOUTS].value != 0.0
|
|
834
|
-
):
|
|
835
|
-
tracker.update(SlotSet(SLOT_CONSECUTIVE_SILENCE_TIMEOUTS, 0.0))
|
|
836
|
-
if (
|
|
837
|
-
SLOT_SILENCE_TIMEOUT in tracker.slots
|
|
838
|
-
and tracker.slots[SLOT_SILENCE_TIMEOUT].value
|
|
839
|
-
!= tracker.slots[SLOT_SILENCE_TIMEOUT].initial_value
|
|
840
|
-
):
|
|
841
|
-
tracker.update(
|
|
842
|
-
SlotSet(
|
|
843
|
-
SLOT_SILENCE_TIMEOUT,
|
|
844
|
-
tracker.slots[SLOT_SILENCE_TIMEOUT].initial_value,
|
|
845
|
-
)
|
|
846
|
-
)
|
|
825
|
+
|
|
826
|
+
self._initialise_consecutive_silence_timeout_slots(parse_data, tracker)
|
|
847
827
|
|
|
848
828
|
return parse_data
|
|
849
829
|
|
|
@@ -1068,7 +1048,14 @@ class MessageProcessor:
|
|
|
1068
1048
|
|
|
1069
1049
|
@staticmethod
|
|
1070
1050
|
def _should_handle_message(tracker: DialogueStateTracker) -> bool:
|
|
1071
|
-
return not tracker.is_paused() or (
|
|
1051
|
+
return not tracker.is_paused() or MessageProcessor._last_user_intent_is_restart(
|
|
1052
|
+
tracker
|
|
1053
|
+
)
|
|
1054
|
+
|
|
1055
|
+
@staticmethod
|
|
1056
|
+
def _last_user_intent_is_restart(tracker: DialogueStateTracker) -> bool:
|
|
1057
|
+
"""Check if the last user intent is a restart intent."""
|
|
1058
|
+
return (
|
|
1072
1059
|
tracker.latest_message is not None
|
|
1073
1060
|
and tracker.latest_message.intent.get(INTENT_NAME_KEY)
|
|
1074
1061
|
== USER_INTENT_RESTART
|
|
@@ -1615,3 +1602,31 @@ class MessageProcessor:
|
|
|
1615
1602
|
)
|
|
1616
1603
|
|
|
1617
1604
|
return tracker, validate_frames
|
|
1605
|
+
|
|
1606
|
+
@staticmethod
|
|
1607
|
+
def _initialise_consecutive_silence_timeout_slots(
|
|
1608
|
+
parse_data: Dict[str, Any],
|
|
1609
|
+
tracker: DialogueStateTracker,
|
|
1610
|
+
) -> None:
|
|
1611
|
+
# resetting timeouts variables whenever something that is not a timeout occurs
|
|
1612
|
+
if (
|
|
1613
|
+
parse_data.get(INTENT, {}).get(INTENT_NAME_KEY)
|
|
1614
|
+
!= USER_INTENT_SILENCE_TIMEOUT
|
|
1615
|
+
and tracker
|
|
1616
|
+
):
|
|
1617
|
+
if (
|
|
1618
|
+
SLOT_CONSECUTIVE_SILENCE_TIMEOUTS in tracker.slots
|
|
1619
|
+
and tracker.slots[SLOT_CONSECUTIVE_SILENCE_TIMEOUTS].value != 0.0
|
|
1620
|
+
):
|
|
1621
|
+
tracker.update(SlotSet(SLOT_CONSECUTIVE_SILENCE_TIMEOUTS, 0.0))
|
|
1622
|
+
if (
|
|
1623
|
+
SILENCE_TIMEOUT_SLOT in tracker.slots
|
|
1624
|
+
and tracker.slots[SILENCE_TIMEOUT_SLOT].value
|
|
1625
|
+
!= tracker.slots[SILENCE_TIMEOUT_SLOT].initial_value
|
|
1626
|
+
):
|
|
1627
|
+
tracker.update(
|
|
1628
|
+
SlotSet(
|
|
1629
|
+
SILENCE_TIMEOUT_SLOT,
|
|
1630
|
+
tracker.slots[SILENCE_TIMEOUT_SLOT].initial_value,
|
|
1631
|
+
)
|
|
1632
|
+
)
|
rasa/core/run.py
CHANGED
|
@@ -30,12 +30,11 @@ from rasa import server, telemetry
|
|
|
30
30
|
from rasa.constants import ENV_SANIC_BACKLOG
|
|
31
31
|
from rasa.core import agent, channels, constants
|
|
32
32
|
from rasa.core.agent import Agent
|
|
33
|
+
from rasa.core.available_endpoints import AvailableEndpoints
|
|
33
34
|
from rasa.core.channels import console
|
|
34
35
|
from rasa.core.channels.channel import InputChannel
|
|
35
36
|
from rasa.core.channels.development_inspector import DevelopmentInspectProxy
|
|
36
37
|
from rasa.core.persistor import StorageType
|
|
37
|
-
from rasa.core.utils import AvailableEndpoints
|
|
38
|
-
from rasa.plugin import plugin_manager
|
|
39
38
|
from rasa.shared.exceptions import RasaException
|
|
40
39
|
from rasa.shared.utils.yaml import read_config_file
|
|
41
40
|
from rasa.utils import licensing
|
|
@@ -45,7 +44,7 @@ logger = logging.getLogger() # get the root logger
|
|
|
45
44
|
|
|
46
45
|
def create_http_input_channels(
|
|
47
46
|
channel: Optional[Text], credentials_file: Optional[Text]
|
|
48
|
-
) -> List[
|
|
47
|
+
) -> List[InputChannel]:
|
|
49
48
|
"""Instantiate the chosen input channel."""
|
|
50
49
|
if credentials_file:
|
|
51
50
|
all_credentials = read_config_file(credentials_file)
|
|
@@ -59,22 +58,45 @@ def create_http_input_channels(
|
|
|
59
58
|
"To connect to all given channels, omit the '--connector' "
|
|
60
59
|
"argument.".format(channel)
|
|
61
60
|
)
|
|
62
|
-
return [
|
|
61
|
+
return [
|
|
62
|
+
_create_single_channel(
|
|
63
|
+
channel,
|
|
64
|
+
all_credentials.get(channel),
|
|
65
|
+
)
|
|
66
|
+
]
|
|
63
67
|
else:
|
|
64
68
|
return [_create_single_channel(c, k) for c, k in all_credentials.items()]
|
|
65
69
|
|
|
66
70
|
|
|
67
|
-
def _create_single_channel(
|
|
71
|
+
def _create_single_channel(
|
|
72
|
+
channel: Text,
|
|
73
|
+
credentials: Optional[Dict[Text, Any]],
|
|
74
|
+
) -> Any:
|
|
75
|
+
"""Create a single input channel based on the channel name and credentials.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
channel: The name of the input channel to create.
|
|
79
|
+
credentials: The credentials for the input channel.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
An instance of the input channel class.
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
RasaException: If the channel class cannot be found or instantiated.
|
|
86
|
+
"""
|
|
68
87
|
from rasa.core.channels import BUILTIN_CHANNELS
|
|
69
88
|
|
|
70
89
|
if channel in BUILTIN_CHANNELS:
|
|
71
|
-
|
|
90
|
+
channel_class = BUILTIN_CHANNELS[channel]
|
|
91
|
+
|
|
92
|
+
return channel_class.from_credentials(credentials)
|
|
72
93
|
else:
|
|
73
94
|
# try to load channel based on class name
|
|
74
95
|
try:
|
|
75
96
|
input_channel_class = rasa.shared.utils.common.class_from_module_path(
|
|
76
97
|
channel
|
|
77
98
|
)
|
|
99
|
+
|
|
78
100
|
return input_channel_class.from_credentials(credentials)
|
|
79
101
|
except (AttributeError, ImportError):
|
|
80
102
|
raise RasaException(
|
|
@@ -108,7 +130,7 @@ def _is_apple_silicon_system() -> bool:
|
|
|
108
130
|
|
|
109
131
|
|
|
110
132
|
def configure_app(
|
|
111
|
-
input_channels: Optional[List[
|
|
133
|
+
input_channels: Optional[List[InputChannel]] = None,
|
|
112
134
|
cors: Optional[Union[Text, List[Text], None]] = None,
|
|
113
135
|
auth_token: Optional[Text] = None,
|
|
114
136
|
enable_api: bool = True,
|
|
@@ -190,10 +212,6 @@ def configure_app(
|
|
|
190
212
|
logger.info("Killing Sanic server now.")
|
|
191
213
|
running_app.stop() # kill the sanic server
|
|
192
214
|
|
|
193
|
-
@app.after_server_stop
|
|
194
|
-
async def after_server_stop(running_app: Sanic) -> None:
|
|
195
|
-
plugin_manager().hook.after_server_stop()
|
|
196
|
-
|
|
197
215
|
if server_listeners:
|
|
198
216
|
for listener, event in server_listeners:
|
|
199
217
|
app.register_listener(listener, event)
|
|
@@ -346,3 +364,7 @@ async def close_resources(app: Sanic, _: AbstractEventLoop) -> None:
|
|
|
346
364
|
event_broker = current_agent.tracker_store.event_broker
|
|
347
365
|
if event_broker:
|
|
348
366
|
await event_broker.close()
|
|
367
|
+
|
|
368
|
+
privacy_manager = current_agent.privacy_manager
|
|
369
|
+
if privacy_manager:
|
|
370
|
+
privacy_manager.stop()
|
|
File without changes
|
|
@@ -3,7 +3,7 @@ from typing import Iterable, Optional, Text
|
|
|
3
3
|
|
|
4
4
|
from rasa.core.brokers.broker import EventBroker
|
|
5
5
|
from rasa.core.secrets_manager.secret_manager import EndpointResolver
|
|
6
|
-
from rasa.core.tracker_store import TrackerStore, create_tracker_store
|
|
6
|
+
from rasa.core.tracker_stores.tracker_store import TrackerStore, create_tracker_store
|
|
7
7
|
from rasa.shared.core.domain import Domain
|
|
8
8
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
9
9
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -119,3 +119,7 @@ class AuthRetryTrackerStore(TrackerStore):
|
|
|
119
119
|
"""Recreate tracker store with updated credentials."""
|
|
120
120
|
endpoint_config = EndpointResolver.update_config(self.endpoint_config)
|
|
121
121
|
return create_tracker_store(endpoint_config, domain, event_broker)
|
|
122
|
+
|
|
123
|
+
async def delete(self, sender_id: Text) -> None:
|
|
124
|
+
"""Delete tracker for the given sender_id."""
|
|
125
|
+
await self._tracker_store.delete(sender_id)
|