rasa-pro 3.12.0.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.
- README.md +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +10 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +58 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +84 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +320 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +1451 -0
- rasa/env.py +14 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +96 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +858 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import copy
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from functools import cached_property
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Text, Optional, Dict, Any, List, Set, Union
|
|
8
|
+
|
|
9
|
+
import structlog
|
|
10
|
+
from pypred import Predicate
|
|
11
|
+
|
|
12
|
+
import rasa.shared.utils.io
|
|
13
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
14
|
+
from rasa.shared.core.flows.flow_path import PathNode, FlowPath, FlowPathsList
|
|
15
|
+
from rasa.shared.core.flows.flow_step import FlowStep
|
|
16
|
+
from rasa.shared.core.flows.flow_step_links import (
|
|
17
|
+
FlowStepLink,
|
|
18
|
+
StaticFlowStepLink,
|
|
19
|
+
IfFlowStepLink,
|
|
20
|
+
ElseFlowStepLink,
|
|
21
|
+
)
|
|
22
|
+
from rasa.shared.core.flows.flow_step_sequence import FlowStepSequence
|
|
23
|
+
from rasa.shared.core.flows.nlu_trigger import NLUTriggers
|
|
24
|
+
from rasa.shared.core.flows.steps import (
|
|
25
|
+
CollectInformationFlowStep,
|
|
26
|
+
EndFlowStep,
|
|
27
|
+
StartFlowStep,
|
|
28
|
+
ActionFlowStep,
|
|
29
|
+
)
|
|
30
|
+
from rasa.shared.core.flows.steps.constants import (
|
|
31
|
+
CONTINUE_STEP_PREFIX,
|
|
32
|
+
START_STEP,
|
|
33
|
+
END_STEP,
|
|
34
|
+
)
|
|
35
|
+
from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
|
|
36
|
+
from rasa.shared.core.slots import Slot
|
|
37
|
+
|
|
38
|
+
structlogger = structlog.get_logger()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass
|
|
42
|
+
class Flow:
|
|
43
|
+
"""Represents the configuration of a flow."""
|
|
44
|
+
|
|
45
|
+
id: Text
|
|
46
|
+
"""The id of the flow."""
|
|
47
|
+
custom_name: Optional[Text] = None
|
|
48
|
+
"""The human-readable name of the flow."""
|
|
49
|
+
description: Optional[Text] = None
|
|
50
|
+
"""The description of the flow."""
|
|
51
|
+
guard_condition: Optional[Text] = None
|
|
52
|
+
"""The condition that needs to be fulfilled for the flow to be startable."""
|
|
53
|
+
step_sequence: FlowStepSequence = field(default_factory=FlowStepSequence.empty)
|
|
54
|
+
"""The steps of the flow."""
|
|
55
|
+
nlu_triggers: Optional[NLUTriggers] = None
|
|
56
|
+
"""The list of intents, e.g. nlu triggers, that start the flow."""
|
|
57
|
+
always_include_in_prompt: Optional[bool] = None
|
|
58
|
+
"""
|
|
59
|
+
A flag that checks whether the flow should always be included in the prompt or not.
|
|
60
|
+
"""
|
|
61
|
+
file_path: Optional[str] = None
|
|
62
|
+
"""The path to the file where the flow is stored."""
|
|
63
|
+
persisted_slots: List[str] = field(default_factory=list)
|
|
64
|
+
"""The list of slots that should be persisted after the flow ends."""
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def from_json(
|
|
68
|
+
flow_id: Text,
|
|
69
|
+
data: Dict[Text, Any],
|
|
70
|
+
file_path: Optional[Union[str, Path]] = None,
|
|
71
|
+
) -> Flow:
|
|
72
|
+
"""Create a Flow object from serialized data.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
flow_id: id of the flow
|
|
76
|
+
data: data for a Flow object in a serialized format.
|
|
77
|
+
file_path: the file path of the flow
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
A Flow object.
|
|
81
|
+
"""
|
|
82
|
+
step_sequence = FlowStepSequence.from_json(data.get("steps"))
|
|
83
|
+
nlu_triggers = NLUTriggers.from_json(data.get("nlu_trigger"))
|
|
84
|
+
|
|
85
|
+
if file_path and isinstance(file_path, Path):
|
|
86
|
+
file_path = str(file_path)
|
|
87
|
+
|
|
88
|
+
return Flow(
|
|
89
|
+
id=flow_id,
|
|
90
|
+
custom_name=data.get("name"),
|
|
91
|
+
description=data.get("description"),
|
|
92
|
+
always_include_in_prompt=data.get("always_include_in_prompt"),
|
|
93
|
+
# str or bool are permitted in the flow schema but internally we want a str
|
|
94
|
+
guard_condition=str(data["if"]) if "if" in data else None,
|
|
95
|
+
step_sequence=Flow.resolve_default_ids(step_sequence),
|
|
96
|
+
nlu_triggers=nlu_triggers,
|
|
97
|
+
# If we are reading the flows in after training the file_path is part of
|
|
98
|
+
# data. When the model is trained, take the provided file_path.
|
|
99
|
+
file_path=data.get("file_path") if "file_path" in data else file_path,
|
|
100
|
+
persisted_slots=data.get("persisted_slots", []),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
def get_full_name(self) -> str:
|
|
104
|
+
if self.file_path:
|
|
105
|
+
return f"{self.file_path}::{self.name}"
|
|
106
|
+
return self.name
|
|
107
|
+
|
|
108
|
+
@staticmethod
|
|
109
|
+
def create_default_name(flow_id: str) -> str:
|
|
110
|
+
"""Create a default flow name for when it is missing."""
|
|
111
|
+
return flow_id.replace("_", " ").replace("-", " ")
|
|
112
|
+
|
|
113
|
+
@staticmethod
|
|
114
|
+
def resolve_default_ids(step_sequence: FlowStepSequence) -> FlowStepSequence:
|
|
115
|
+
"""Resolves the default ids of all steps in the sequence.
|
|
116
|
+
|
|
117
|
+
If a step does not have an id, a default id is assigned to it based
|
|
118
|
+
on the type of the step and its position in the flow.
|
|
119
|
+
|
|
120
|
+
Similarly, if a step doesn't have an explicit next assigned we resolve
|
|
121
|
+
the default next step id.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
step_sequence: The step sequence to resolve the default ids for.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
The step sequence with the default ids resolved.
|
|
128
|
+
"""
|
|
129
|
+
# assign an index to all steps
|
|
130
|
+
for idx, step in enumerate(step_sequence.steps):
|
|
131
|
+
step.idx = idx
|
|
132
|
+
|
|
133
|
+
def resolve_default_next(steps: List[FlowStep], is_root_sequence: bool) -> None:
|
|
134
|
+
for i, step in enumerate(steps):
|
|
135
|
+
if step.next.no_link_available() and step.does_allow_for_next_step():
|
|
136
|
+
if i == len(steps) - 1:
|
|
137
|
+
if is_root_sequence:
|
|
138
|
+
# if this is the root sequence, we need to add an end step
|
|
139
|
+
# to the end of the sequence. other sequences, e.g.
|
|
140
|
+
# in branches need to explicitly add a next step.
|
|
141
|
+
step.next.links.append(StaticFlowStepLink(END_STEP))
|
|
142
|
+
else:
|
|
143
|
+
step.next.links.append(StaticFlowStepLink(steps[i + 1].id))
|
|
144
|
+
for link in step.next.links:
|
|
145
|
+
if sub_steps := link.child_steps():
|
|
146
|
+
resolve_default_next(sub_steps, is_root_sequence=False)
|
|
147
|
+
|
|
148
|
+
resolve_default_next(step_sequence.child_steps, is_root_sequence=True)
|
|
149
|
+
return step_sequence
|
|
150
|
+
|
|
151
|
+
def as_json(self) -> Dict[Text, Any]:
|
|
152
|
+
"""Serialize the Flow object.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
The Flow object as serialized data.
|
|
156
|
+
"""
|
|
157
|
+
data: Dict[Text, Any] = {
|
|
158
|
+
"id": self.id,
|
|
159
|
+
"steps": self.step_sequence.as_json(),
|
|
160
|
+
}
|
|
161
|
+
if self.custom_name is not None:
|
|
162
|
+
data["name"] = self.custom_name
|
|
163
|
+
if self.description is not None:
|
|
164
|
+
data["description"] = self.description
|
|
165
|
+
if self.guard_condition is not None:
|
|
166
|
+
data["if"] = self.guard_condition
|
|
167
|
+
if self.always_include_in_prompt is not None:
|
|
168
|
+
data["always_include_in_prompt"] = self.always_include_in_prompt
|
|
169
|
+
if self.nlu_triggers:
|
|
170
|
+
data["nlu_trigger"] = self.nlu_triggers.as_json()
|
|
171
|
+
if self.file_path:
|
|
172
|
+
data["file_path"] = self.file_path
|
|
173
|
+
if self.persisted_slots:
|
|
174
|
+
data["persisted_slots"] = self.persisted_slots
|
|
175
|
+
|
|
176
|
+
return data
|
|
177
|
+
|
|
178
|
+
def readable_name(self) -> str:
|
|
179
|
+
"""Returns the name of the flow or its id if no name is set."""
|
|
180
|
+
return self.name or self.id
|
|
181
|
+
|
|
182
|
+
def step_by_id(self, step_id: Optional[Text]) -> Optional[FlowStep]:
|
|
183
|
+
"""Returns the step with the given id."""
|
|
184
|
+
if not step_id:
|
|
185
|
+
return None
|
|
186
|
+
|
|
187
|
+
if step_id == START_STEP:
|
|
188
|
+
return StartFlowStep(self.first_step_in_flow().id)
|
|
189
|
+
|
|
190
|
+
if step_id == END_STEP:
|
|
191
|
+
return EndFlowStep()
|
|
192
|
+
|
|
193
|
+
if step_id.startswith(CONTINUE_STEP_PREFIX):
|
|
194
|
+
return ContinueFlowStep(step_id[len(CONTINUE_STEP_PREFIX) :])
|
|
195
|
+
|
|
196
|
+
for step in self.steps_with_calls_resolved:
|
|
197
|
+
if step.id == step_id:
|
|
198
|
+
return step
|
|
199
|
+
|
|
200
|
+
return None
|
|
201
|
+
|
|
202
|
+
def first_step_in_flow(self) -> FlowStep:
|
|
203
|
+
"""Returns the start step of this flow."""
|
|
204
|
+
if not (steps := self.steps):
|
|
205
|
+
raise RuntimeError(
|
|
206
|
+
f"Flow {self.id} is empty despite validation that this cannot happen."
|
|
207
|
+
)
|
|
208
|
+
return steps[0]
|
|
209
|
+
|
|
210
|
+
def get_trigger_intents(self) -> Set[str]:
|
|
211
|
+
"""Returns the trigger intents of the flow."""
|
|
212
|
+
results: Set[str] = set()
|
|
213
|
+
|
|
214
|
+
if not self.nlu_triggers:
|
|
215
|
+
return results
|
|
216
|
+
|
|
217
|
+
for condition in self.nlu_triggers.trigger_conditions:
|
|
218
|
+
results.add(condition.intent)
|
|
219
|
+
|
|
220
|
+
return results
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def is_rasa_default_flow(self) -> bool:
|
|
224
|
+
"""Test whether the flow is a rasa default flow."""
|
|
225
|
+
return self.id.startswith(RASA_DEFAULT_FLOW_PATTERN_PREFIX)
|
|
226
|
+
|
|
227
|
+
def get_collect_steps(self) -> List[CollectInformationFlowStep]:
|
|
228
|
+
"""Return all CollectInformationFlowSteps in the flow."""
|
|
229
|
+
collect_steps = []
|
|
230
|
+
for step in self.steps_with_calls_resolved:
|
|
231
|
+
if isinstance(step, CollectInformationFlowStep):
|
|
232
|
+
collect_steps.append(step)
|
|
233
|
+
return collect_steps
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def steps_with_calls_resolved(self) -> List[FlowStep]:
|
|
237
|
+
"""Return the steps of the flow including steps of called flows."""
|
|
238
|
+
return self.step_sequence.steps_with_calls_resolved
|
|
239
|
+
|
|
240
|
+
@property
|
|
241
|
+
def steps(self) -> List[FlowStep]:
|
|
242
|
+
"""Return the steps of the flow without steps of called flows."""
|
|
243
|
+
return self.step_sequence.steps
|
|
244
|
+
|
|
245
|
+
@cached_property
|
|
246
|
+
def fingerprint(self) -> str:
|
|
247
|
+
"""Create a fingerprint identifying this step sequence."""
|
|
248
|
+
return rasa.shared.utils.io.deep_container_fingerprint(self.as_json())
|
|
249
|
+
|
|
250
|
+
@property
|
|
251
|
+
def utterances(self) -> Set[str]:
|
|
252
|
+
"""Retrieve all utterances of this flow."""
|
|
253
|
+
return set().union(
|
|
254
|
+
*[step.utterances for step in self.step_sequence.steps_with_calls_resolved]
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def custom_actions(self) -> Set[str]:
|
|
259
|
+
"""Retrieve all custom actions of this flow."""
|
|
260
|
+
return {
|
|
261
|
+
step.custom_action
|
|
262
|
+
for step in self.step_sequence.steps_with_calls_resolved
|
|
263
|
+
if isinstance(step, ActionFlowStep) and step.custom_action is not None
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
@property
|
|
267
|
+
def name(self) -> str:
|
|
268
|
+
"""Create a default name if none is present."""
|
|
269
|
+
return self.custom_name or Flow.create_default_name(self.id)
|
|
270
|
+
|
|
271
|
+
def is_startable(
|
|
272
|
+
self,
|
|
273
|
+
context: Optional[Dict[Text, Any]] = None,
|
|
274
|
+
slots: Optional[Dict[Text, Slot]] = None,
|
|
275
|
+
) -> bool:
|
|
276
|
+
"""Return whether the start condition is satisfied.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
context: The context data to evaluate the starting conditions against.
|
|
280
|
+
slots: The slots to evaluate the starting conditions against.
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
Whether the start condition is satisfied.
|
|
284
|
+
"""
|
|
285
|
+
context = context or {}
|
|
286
|
+
slots = slots or {}
|
|
287
|
+
simplified_slots = {slot.name: slot.value for slot in slots.values()}
|
|
288
|
+
|
|
289
|
+
# If no starting condition exists, the flow is always startable.
|
|
290
|
+
if not self.guard_condition:
|
|
291
|
+
return True
|
|
292
|
+
|
|
293
|
+
# if a flow guard condition exists and the flow was started via a link,
|
|
294
|
+
# e.g. is currently active, the flow is startable
|
|
295
|
+
if context.get("flow_id") == self.id:
|
|
296
|
+
return True
|
|
297
|
+
|
|
298
|
+
try:
|
|
299
|
+
predicate = Predicate(self.guard_condition)
|
|
300
|
+
is_startable = predicate.evaluate(
|
|
301
|
+
{"context": context, "slots": simplified_slots}
|
|
302
|
+
)
|
|
303
|
+
structlogger.debug(
|
|
304
|
+
"command_generator.validate_flow_starting_conditions.result",
|
|
305
|
+
predicate=predicate.description(),
|
|
306
|
+
is_startable=is_startable,
|
|
307
|
+
flow_id=self.id,
|
|
308
|
+
)
|
|
309
|
+
return is_startable
|
|
310
|
+
# if there is any kind of exception when evaluating the predicate, the flow
|
|
311
|
+
# is not startable
|
|
312
|
+
except (TypeError, Exception) as e:
|
|
313
|
+
structlogger.error(
|
|
314
|
+
"command_generator.validate_flow_starting_conditions.error",
|
|
315
|
+
predicate=self.guard_condition,
|
|
316
|
+
context=context,
|
|
317
|
+
slots=slots,
|
|
318
|
+
error=str(e),
|
|
319
|
+
)
|
|
320
|
+
return False
|
|
321
|
+
|
|
322
|
+
def has_action_step(self, action: Text) -> bool:
|
|
323
|
+
"""Check whether the flow has an action step with the given action."""
|
|
324
|
+
for step in self.steps:
|
|
325
|
+
if isinstance(step, ActionFlowStep) and step.action == action:
|
|
326
|
+
return True
|
|
327
|
+
return False
|
|
328
|
+
|
|
329
|
+
def is_startable_only_via_link(self) -> bool:
|
|
330
|
+
"""Determines if the flow can be initiated exclusively through a link.
|
|
331
|
+
|
|
332
|
+
This condition is met when a guard condition exists and is
|
|
333
|
+
consistently evaluated to `False` (e.g. `if: False`).
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
A boolean indicating if the flow initiation is link-based only.
|
|
337
|
+
"""
|
|
338
|
+
if (
|
|
339
|
+
self.guard_condition is None
|
|
340
|
+
or self._contains_variables_in_guard_condition()
|
|
341
|
+
):
|
|
342
|
+
return False
|
|
343
|
+
|
|
344
|
+
try:
|
|
345
|
+
predicate = Predicate(self.guard_condition)
|
|
346
|
+
is_startable_via_link = not predicate.evaluate({})
|
|
347
|
+
structlogger.debug(
|
|
348
|
+
"flow.is_startable_only_via_link.result",
|
|
349
|
+
predicate=self.guard_condition,
|
|
350
|
+
is_startable_via_link=is_startable_via_link,
|
|
351
|
+
flow_id=self.id,
|
|
352
|
+
)
|
|
353
|
+
return is_startable_via_link
|
|
354
|
+
# if there is any kind of exception when evaluating the predicate, the flow
|
|
355
|
+
# is not startable by link or by any other means.
|
|
356
|
+
except (TypeError, Exception) as e:
|
|
357
|
+
structlogger.error(
|
|
358
|
+
"flow.is_startable_only_via_link.error",
|
|
359
|
+
predicate=self.guard_condition,
|
|
360
|
+
error=str(e),
|
|
361
|
+
flow_id=self.id,
|
|
362
|
+
)
|
|
363
|
+
return False
|
|
364
|
+
|
|
365
|
+
def _contains_variables_in_guard_condition(self) -> bool:
|
|
366
|
+
"""Determines if the guard condition contains dynamic literals.
|
|
367
|
+
|
|
368
|
+
I.e. literals that cannot be statically resolved, indicating a variable.
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
True if dynamic literals are present, False otherwise.
|
|
372
|
+
"""
|
|
373
|
+
from pypred import ast
|
|
374
|
+
from pypred.tiler import tile, SimplePattern
|
|
375
|
+
|
|
376
|
+
if not self.guard_condition:
|
|
377
|
+
return False
|
|
378
|
+
|
|
379
|
+
predicate = Predicate(self.guard_condition)
|
|
380
|
+
|
|
381
|
+
# find all literals in the AST tree
|
|
382
|
+
literals = []
|
|
383
|
+
tile(
|
|
384
|
+
ast=predicate.ast,
|
|
385
|
+
patterns=[SimplePattern("types:Literal")],
|
|
386
|
+
func=lambda _, literal: literals.append(literal),
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# check if there is a literal that cannot be statically resolved (variable)
|
|
390
|
+
for literal in literals:
|
|
391
|
+
if type(predicate.static_resolve(literal.value)) == ast.Undefined:
|
|
392
|
+
return True
|
|
393
|
+
|
|
394
|
+
return False
|
|
395
|
+
|
|
396
|
+
def extract_all_paths(self) -> FlowPathsList:
|
|
397
|
+
"""Extracts all possible flow paths.
|
|
398
|
+
|
|
399
|
+
Extracts all possible flow paths from a given flow structure by
|
|
400
|
+
recursively exploring each step.
|
|
401
|
+
This function initializes an empty list to collect paths, an empty path list,
|
|
402
|
+
and a set of visited step IDs to prevent revisiting steps.
|
|
403
|
+
It calls `go_over_steps` to recursively explore and fill the paths list.
|
|
404
|
+
"""
|
|
405
|
+
flow_paths_list = FlowPathsList(self.id, paths=[])
|
|
406
|
+
steps: List[FlowStep] = self.steps
|
|
407
|
+
current_path: FlowPath = FlowPath(flow=self.id, nodes=[])
|
|
408
|
+
step_ids_visited: Set[str] = set()
|
|
409
|
+
|
|
410
|
+
self._go_over_steps(steps, current_path, flow_paths_list, step_ids_visited)
|
|
411
|
+
|
|
412
|
+
if not flow_paths_list.is_path_part_of_list(current_path):
|
|
413
|
+
flow_paths_list.paths.append(copy.deepcopy(current_path))
|
|
414
|
+
|
|
415
|
+
structlogger.debug(
|
|
416
|
+
"shared.core.flows.flow.extract_all_paths",
|
|
417
|
+
comment="Extraction complete",
|
|
418
|
+
number_of_paths=len(flow_paths_list.paths),
|
|
419
|
+
flow_name=self.name,
|
|
420
|
+
)
|
|
421
|
+
return flow_paths_list
|
|
422
|
+
|
|
423
|
+
def _go_over_steps(
|
|
424
|
+
self,
|
|
425
|
+
steps_to_go: Union[str, List[FlowStep]],
|
|
426
|
+
current_path: FlowPath,
|
|
427
|
+
completed_paths: FlowPathsList,
|
|
428
|
+
step_ids_visited: Set[str],
|
|
429
|
+
) -> None:
|
|
430
|
+
"""Processes the flow steps recursively.
|
|
431
|
+
|
|
432
|
+
Either following direct step IDs or handling conditions, and adds complete
|
|
433
|
+
paths to the collected_paths.
|
|
434
|
+
|
|
435
|
+
Args:
|
|
436
|
+
steps_to_go: Either a direct step ID or a list of steps to process.
|
|
437
|
+
current_path: The current path being constructed.
|
|
438
|
+
completed_paths: The list where completed paths are added.
|
|
439
|
+
step_ids_visited: A set of step IDs that have been visited to avoid cycles.
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
None: This function modifies collected_paths in place by appending new paths
|
|
443
|
+
as they are found.
|
|
444
|
+
"""
|
|
445
|
+
# Case 1: If the steps_to_go is a custom_id string
|
|
446
|
+
# This happens when a "next" of, for example, a IfFlowStepLink is targeting
|
|
447
|
+
# a specific step by id
|
|
448
|
+
if isinstance(steps_to_go, str):
|
|
449
|
+
for i, step in enumerate(self.steps):
|
|
450
|
+
# We don't need to check for 'id' as a link can only happen to a
|
|
451
|
+
# custom id.
|
|
452
|
+
if step.custom_id == steps_to_go:
|
|
453
|
+
self._go_over_steps(
|
|
454
|
+
self.steps[i:], current_path, completed_paths, step_ids_visited
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
# Case 2: If steps_to_go is a list of steps
|
|
458
|
+
else:
|
|
459
|
+
for i, step in enumerate(steps_to_go):
|
|
460
|
+
# 1. Check if the step is relevant for testable_paths extraction.
|
|
461
|
+
# We only create new path nodes for ActionFlowStep and
|
|
462
|
+
# CollectInformationFlowStep because these are externally visible
|
|
463
|
+
# changes in the assistant's behaviour (trackable in the e2e tests).
|
|
464
|
+
# For other flow steps, we only follow their links.
|
|
465
|
+
# We decided to ignore calls to other flows in our coverage analysis.
|
|
466
|
+
if not isinstance(step, (CollectInformationFlowStep, ActionFlowStep)):
|
|
467
|
+
self._handle_links(
|
|
468
|
+
step.next.links,
|
|
469
|
+
current_path,
|
|
470
|
+
completed_paths,
|
|
471
|
+
step_ids_visited,
|
|
472
|
+
)
|
|
473
|
+
continue
|
|
474
|
+
|
|
475
|
+
# 2. Check if already visited this custom step id
|
|
476
|
+
# in order to keep track of loops
|
|
477
|
+
if step.custom_id is not None and step.custom_id in step_ids_visited:
|
|
478
|
+
if not completed_paths.is_path_part_of_list(current_path):
|
|
479
|
+
completed_paths.paths.append(copy.deepcopy(current_path))
|
|
480
|
+
return # Stop traversing this path if we've revisited a step
|
|
481
|
+
elif step.custom_id is not None:
|
|
482
|
+
step_ids_visited.add(step.custom_id)
|
|
483
|
+
|
|
484
|
+
# 3. Append step info to the path
|
|
485
|
+
current_path.nodes.append(
|
|
486
|
+
PathNode(
|
|
487
|
+
flow=current_path.flow,
|
|
488
|
+
step_id=step.id,
|
|
489
|
+
lines=step.metadata["line_numbers"],
|
|
490
|
+
)
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
# 4. Check if 'END' branch
|
|
494
|
+
if (
|
|
495
|
+
len(step.next.links) == 1
|
|
496
|
+
and isinstance(step.next.links[0], StaticFlowStepLink)
|
|
497
|
+
and step.next.links[0].target == END_STEP
|
|
498
|
+
):
|
|
499
|
+
if not completed_paths.is_path_part_of_list(current_path):
|
|
500
|
+
completed_paths.paths.append(copy.deepcopy(current_path))
|
|
501
|
+
return
|
|
502
|
+
else:
|
|
503
|
+
self._handle_links(
|
|
504
|
+
step.next.links,
|
|
505
|
+
current_path,
|
|
506
|
+
completed_paths,
|
|
507
|
+
step_ids_visited,
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
def _handle_links(
|
|
511
|
+
self,
|
|
512
|
+
links: List[FlowStepLink],
|
|
513
|
+
path: FlowPath,
|
|
514
|
+
collected_paths: FlowPathsList,
|
|
515
|
+
step_ids_visited: set,
|
|
516
|
+
) -> None:
|
|
517
|
+
"""Processes the next step in a flow.
|
|
518
|
+
|
|
519
|
+
Potentially recursively calling itself to handle conditional paths and
|
|
520
|
+
branching.
|
|
521
|
+
|
|
522
|
+
Args:
|
|
523
|
+
links: Links listed in the "next" attribute.
|
|
524
|
+
path: The current path taken in the flow.
|
|
525
|
+
collected_paths: A list of paths collected so far.
|
|
526
|
+
step_ids_visited: A set of step IDs that have already been visited
|
|
527
|
+
to avoid loops.
|
|
528
|
+
|
|
529
|
+
Returns:
|
|
530
|
+
None: Modifies collected_paths in place by appending new paths
|
|
531
|
+
as they are completed.
|
|
532
|
+
"""
|
|
533
|
+
steps = self.steps
|
|
534
|
+
|
|
535
|
+
for link in links:
|
|
536
|
+
# Direct step id reference
|
|
537
|
+
if isinstance(link, StaticFlowStepLink):
|
|
538
|
+
# Find this id in the flow steps and restart from there
|
|
539
|
+
for i, step in enumerate(steps):
|
|
540
|
+
if step.id == link.target_step_id:
|
|
541
|
+
self._go_over_steps(
|
|
542
|
+
steps[i:],
|
|
543
|
+
copy.deepcopy(path),
|
|
544
|
+
collected_paths,
|
|
545
|
+
copy.deepcopy(step_ids_visited),
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
# If conditions
|
|
549
|
+
elif isinstance(link, (IfFlowStepLink, ElseFlowStepLink)):
|
|
550
|
+
# Handling conditional paths
|
|
551
|
+
target_steps: Union[str, List[FlowStep]]
|
|
552
|
+
if isinstance(link.target_reference, FlowStepSequence):
|
|
553
|
+
target_steps = link.target_reference.child_steps
|
|
554
|
+
else:
|
|
555
|
+
target_steps = link.target_reference
|
|
556
|
+
|
|
557
|
+
self._go_over_steps(
|
|
558
|
+
target_steps,
|
|
559
|
+
copy.deepcopy(path),
|
|
560
|
+
collected_paths,
|
|
561
|
+
copy.deepcopy(step_ids_visited),
|
|
562
|
+
)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import List, Optional, Set
|
|
3
|
+
|
|
4
|
+
import structlog
|
|
5
|
+
|
|
6
|
+
NODE_KEY_SEPARATOR = " | "
|
|
7
|
+
|
|
8
|
+
structlogger = structlog.get_logger()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class PathNode:
|
|
13
|
+
"""Representation of a path step."""
|
|
14
|
+
|
|
15
|
+
step_id: str
|
|
16
|
+
"""Step ID"""
|
|
17
|
+
|
|
18
|
+
flow: str
|
|
19
|
+
"""Flow name"""
|
|
20
|
+
|
|
21
|
+
lines: Optional[str] = None
|
|
22
|
+
"""Line numbers range from the original flow .yaml file"""
|
|
23
|
+
|
|
24
|
+
def __eq__(self, other: object) -> bool:
|
|
25
|
+
if not isinstance(other, PathNode):
|
|
26
|
+
return False
|
|
27
|
+
|
|
28
|
+
return self.flow == other.flow and self.step_id == other.step_id
|
|
29
|
+
|
|
30
|
+
def __hash__(self) -> int:
|
|
31
|
+
return hash((self.flow, self.step_id))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class FlowPath:
|
|
36
|
+
"""Representation of a path through a flow.
|
|
37
|
+
|
|
38
|
+
Attributes:
|
|
39
|
+
flow (str): The name of the flow.
|
|
40
|
+
nodes (List[PathNode]): A list of nodes that constitute the path.
|
|
41
|
+
test_name (str): Name of the test from which it was extracted.
|
|
42
|
+
test_passing (bool): Test status: True if 'passed'.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
flow: str
|
|
46
|
+
nodes: List[PathNode] = field(default_factory=list)
|
|
47
|
+
|
|
48
|
+
def are_paths_matching(self, other_path: "FlowPath") -> bool:
|
|
49
|
+
"""Compares this FlowPath to another to determine if they are identical."""
|
|
50
|
+
if len(self.nodes) != len(other_path.nodes):
|
|
51
|
+
return False
|
|
52
|
+
return all(
|
|
53
|
+
node == other_node for node, other_node in zip(self.nodes, other_path.nodes)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class FlowPathsList:
|
|
59
|
+
"""Representing a list of all available paths through a flow.
|
|
60
|
+
|
|
61
|
+
Attributes:
|
|
62
|
+
flow (str): The name of the flow.
|
|
63
|
+
paths (List[FlowPath]): All paths of that flow.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
flow: str
|
|
67
|
+
paths: List[FlowPath] = field(default=list)
|
|
68
|
+
|
|
69
|
+
def get_unique_nodes(self) -> Set[PathNode]:
|
|
70
|
+
"""Returns the unique nodes of all flow paths."""
|
|
71
|
+
nodes = set()
|
|
72
|
+
|
|
73
|
+
for path in self.paths:
|
|
74
|
+
for node in path.nodes:
|
|
75
|
+
nodes.add(node)
|
|
76
|
+
|
|
77
|
+
return nodes
|
|
78
|
+
|
|
79
|
+
def get_number_of_unique_nodes(self) -> int:
|
|
80
|
+
return len(self.get_unique_nodes())
|
|
81
|
+
|
|
82
|
+
def is_path_part_of_list(self, flow_path: FlowPath) -> bool:
|
|
83
|
+
"""Checks if the FlowPath exists in a list of FlowPaths."""
|
|
84
|
+
return any(flow_path.are_paths_matching(path) for path in self.paths)
|