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,456 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import uuid
|
|
4
|
+
import jwt
|
|
5
|
+
from sanic import Sanic, Blueprint
|
|
6
|
+
from sanic.request import Request
|
|
7
|
+
from typing import (
|
|
8
|
+
Text,
|
|
9
|
+
List,
|
|
10
|
+
Dict,
|
|
11
|
+
Any,
|
|
12
|
+
Optional,
|
|
13
|
+
Callable,
|
|
14
|
+
Iterable,
|
|
15
|
+
Awaitable,
|
|
16
|
+
NoReturn,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from rasa.cli import utils as cli_utils
|
|
20
|
+
from rasa.shared.constants import DOCS_BASE_URL, DEFAULT_SENDER_ID
|
|
21
|
+
from rasa.core.constants import BEARER_TOKEN_PREFIX
|
|
22
|
+
from rasa.shared.exceptions import RasaException
|
|
23
|
+
from rasa.shared.core.trackers import (
|
|
24
|
+
DialogueStateTracker,
|
|
25
|
+
EventVerbosity,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
from urlparse import urljoin
|
|
31
|
+
except ImportError:
|
|
32
|
+
from urllib.parse import urljoin
|
|
33
|
+
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class UserMessage:
|
|
38
|
+
"""Represents an incoming message.
|
|
39
|
+
|
|
40
|
+
Includes the channel the responses should be sent to.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
text: Optional[Text] = None,
|
|
46
|
+
output_channel: Optional["OutputChannel"] = None,
|
|
47
|
+
sender_id: Optional[Text] = None,
|
|
48
|
+
parse_data: Optional[Dict[Text, Any]] = None,
|
|
49
|
+
input_channel: Optional[Text] = None,
|
|
50
|
+
message_id: Optional[Text] = None,
|
|
51
|
+
metadata: Optional[Dict] = None,
|
|
52
|
+
**kwargs: Any,
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Creates a ``UserMessage`` object.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
text: the message text content.
|
|
58
|
+
output_channel: the output channel which should be used to send
|
|
59
|
+
bot responses back to the user.
|
|
60
|
+
sender_id: the message owner ID.
|
|
61
|
+
parse_data: rasa data about the message.
|
|
62
|
+
input_channel: the name of the channel which received this message.
|
|
63
|
+
message_id: ID of the message.
|
|
64
|
+
metadata: additional metadata for this message.
|
|
65
|
+
**kwargs: additional arguments which will be included in the message.
|
|
66
|
+
"""
|
|
67
|
+
self.text = text.strip() if text else text
|
|
68
|
+
|
|
69
|
+
if message_id is not None:
|
|
70
|
+
self.message_id = str(message_id)
|
|
71
|
+
else:
|
|
72
|
+
self.message_id = uuid.uuid4().hex
|
|
73
|
+
|
|
74
|
+
if output_channel is not None:
|
|
75
|
+
self.output_channel = output_channel
|
|
76
|
+
else:
|
|
77
|
+
self.output_channel = CollectingOutputChannel()
|
|
78
|
+
|
|
79
|
+
if sender_id is not None:
|
|
80
|
+
self.sender_id = str(sender_id)
|
|
81
|
+
else:
|
|
82
|
+
self.sender_id = DEFAULT_SENDER_ID
|
|
83
|
+
|
|
84
|
+
self.input_channel = input_channel
|
|
85
|
+
|
|
86
|
+
self.parse_data = parse_data
|
|
87
|
+
self.metadata = metadata
|
|
88
|
+
self.headers = kwargs.get("headers", None)
|
|
89
|
+
|
|
90
|
+
def __repr__(self) -> Text:
|
|
91
|
+
"""Returns event as string for debugging."""
|
|
92
|
+
return f"UserMessage(text: {self.text}, sender_id: {self.sender_id})"
|
|
93
|
+
|
|
94
|
+
def __str__(self) -> Text:
|
|
95
|
+
"""Returns event as human-readable string."""
|
|
96
|
+
return f"{self.__class__.__name__}({self.text})"
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def register(
|
|
100
|
+
input_channels: List["InputChannel"], app: Sanic, route: Optional[Text]
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Registers input channel blueprints with Sanic."""
|
|
103
|
+
|
|
104
|
+
async def handler(message: UserMessage) -> None:
|
|
105
|
+
await app.ctx.agent.handle_message(message)
|
|
106
|
+
|
|
107
|
+
for channel in input_channels:
|
|
108
|
+
if route:
|
|
109
|
+
p = urljoin(route, channel.url_prefix())
|
|
110
|
+
else:
|
|
111
|
+
p = None
|
|
112
|
+
app.blueprint(channel.blueprint(handler), url_prefix=p)
|
|
113
|
+
|
|
114
|
+
app.ctx.input_channels = input_channels
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class InputChannel:
|
|
118
|
+
"""Input channel base class."""
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def name(cls) -> Text:
|
|
122
|
+
"""Every input channel needs a name to identify it."""
|
|
123
|
+
return cls.__name__
|
|
124
|
+
|
|
125
|
+
@classmethod
|
|
126
|
+
def from_credentials(cls, credentials: Optional[Dict[Text, Any]]) -> "InputChannel":
|
|
127
|
+
return cls()
|
|
128
|
+
|
|
129
|
+
def url_prefix(self) -> Text:
|
|
130
|
+
return self.name()
|
|
131
|
+
|
|
132
|
+
def blueprint(
|
|
133
|
+
self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
|
|
134
|
+
) -> Blueprint:
|
|
135
|
+
"""Defines a Sanic blueprint.
|
|
136
|
+
|
|
137
|
+
The blueprint will be attached to a running sanic server and handle
|
|
138
|
+
incoming routes it registered for.
|
|
139
|
+
"""
|
|
140
|
+
raise NotImplementedError("Component listener needs to provide blueprint.")
|
|
141
|
+
|
|
142
|
+
@classmethod
|
|
143
|
+
def raise_missing_credentials_exception(cls) -> NoReturn:
|
|
144
|
+
raise RasaException(
|
|
145
|
+
f"To use the {cls.name()} input channel, you need to "
|
|
146
|
+
f"pass a credentials file using '--credentials'. "
|
|
147
|
+
f"The argument should be a file path pointing to "
|
|
148
|
+
f"a yml file containing the {cls.name()} authentication "
|
|
149
|
+
f"information. Details in the docs: "
|
|
150
|
+
f"{DOCS_BASE_URL}/messaging-and-voice-channels/"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def get_output_channel(self) -> Optional["OutputChannel"]:
|
|
154
|
+
"""Create ``OutputChannel`` based on information provided by the input channel.
|
|
155
|
+
|
|
156
|
+
Implementing this function is not required. If this function returns a valid
|
|
157
|
+
``OutputChannel`` this can be used by Rasa to send bot responses to the user
|
|
158
|
+
without the user initiating an interaction.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
``OutputChannel`` instance or ``None`` in case creating an output channel
|
|
162
|
+
only based on the information present in the ``InputChannel`` is not
|
|
163
|
+
possible.
|
|
164
|
+
"""
|
|
165
|
+
pass
|
|
166
|
+
|
|
167
|
+
def get_metadata(self, request: Request) -> Optional[Dict[Text, Any]]:
|
|
168
|
+
"""Extracts additional information from the incoming request.
|
|
169
|
+
|
|
170
|
+
Implementing this function is not required. However, it can be used to extract
|
|
171
|
+
metadata from the request. The return value is passed on to the
|
|
172
|
+
``UserMessage`` object and stored in the conversation tracker.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
request: incoming request with the message of the user
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Metadata which was extracted from the request.
|
|
179
|
+
"""
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def decode_jwt(bearer_token: Text, jwt_key: Text, jwt_algorithm: Text) -> Dict:
|
|
184
|
+
"""Decodes a Bearer Token using the specific JWT key and algorithm.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
bearer_token: Encoded Bearer token
|
|
188
|
+
jwt_key: Public JWT key for decoding the Bearer token
|
|
189
|
+
jwt_algorithm: JWT algorithm used for decoding the Bearer token
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
`Dict` containing the decoded payload if successful or an exception
|
|
193
|
+
if unsuccessful
|
|
194
|
+
"""
|
|
195
|
+
authorization_header_value = bearer_token.replace(BEARER_TOKEN_PREFIX, "")
|
|
196
|
+
return jwt.decode(authorization_header_value, jwt_key, algorithms=jwt_algorithm)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def decode_bearer_token(
|
|
200
|
+
bearer_token: Text, jwt_key: Text, jwt_algorithm: Text
|
|
201
|
+
) -> Optional[Dict]:
|
|
202
|
+
"""Decodes a Bearer Token using the specific JWT key and algorithm.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
bearer_token: Encoded Bearer token
|
|
206
|
+
jwt_key: Public JWT key for decoding the Bearer token
|
|
207
|
+
jwt_algorithm: JWT algorithm used for decoding the Bearer token
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
`Dict` containing the decoded payload if successful or `None` if unsuccessful
|
|
211
|
+
"""
|
|
212
|
+
# noinspection PyBroadException
|
|
213
|
+
try:
|
|
214
|
+
return decode_jwt(bearer_token, jwt_key, jwt_algorithm)
|
|
215
|
+
except jwt.exceptions.InvalidSignatureError:
|
|
216
|
+
logger.error("JWT public key invalid.")
|
|
217
|
+
except Exception:
|
|
218
|
+
logger.exception("Failed to decode bearer token.")
|
|
219
|
+
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class OutputChannel:
|
|
224
|
+
"""Output channel base class.
|
|
225
|
+
|
|
226
|
+
Provides sane implementation of the send methods
|
|
227
|
+
for text only output channels.
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
def __init__(self) -> None:
|
|
231
|
+
self.tracker_state: Optional[Dict[str, Any]] = None
|
|
232
|
+
|
|
233
|
+
@classmethod
|
|
234
|
+
def name(cls) -> Text:
|
|
235
|
+
"""Every output channel needs a name to identify it."""
|
|
236
|
+
return cls.__name__
|
|
237
|
+
|
|
238
|
+
def attach_tracker_state(self, tracker: DialogueStateTracker) -> None:
|
|
239
|
+
"""Attaches the current tracker state to the output channel."""
|
|
240
|
+
self.tracker_state = tracker.current_state(EventVerbosity.AFTER_RESTART)
|
|
241
|
+
|
|
242
|
+
async def send_response(
|
|
243
|
+
self,
|
|
244
|
+
recipient_id: Text,
|
|
245
|
+
message: Dict[Text, Any],
|
|
246
|
+
) -> None:
|
|
247
|
+
"""Send a message to the client."""
|
|
248
|
+
if message.get("quick_replies"):
|
|
249
|
+
await self.send_quick_replies(
|
|
250
|
+
recipient_id,
|
|
251
|
+
message.pop("text"),
|
|
252
|
+
message.pop("quick_replies"),
|
|
253
|
+
**message,
|
|
254
|
+
)
|
|
255
|
+
elif message.get("buttons"):
|
|
256
|
+
await self.send_text_with_buttons(
|
|
257
|
+
recipient_id, message.pop("text"), message.pop("buttons"), **message
|
|
258
|
+
)
|
|
259
|
+
elif message.get("text"):
|
|
260
|
+
await self.send_text_message(recipient_id, message.pop("text"), **message)
|
|
261
|
+
|
|
262
|
+
if message.get("custom"):
|
|
263
|
+
await self.send_custom_json(recipient_id, message.pop("custom"), **message)
|
|
264
|
+
|
|
265
|
+
# if there is an image we handle it separately as an attachment
|
|
266
|
+
if message.get("image"):
|
|
267
|
+
await self.send_image_url(recipient_id, message.pop("image"), **message)
|
|
268
|
+
|
|
269
|
+
if message.get("attachment"):
|
|
270
|
+
await self.send_attachment(
|
|
271
|
+
recipient_id, message.pop("attachment"), **message
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
if message.get("elements"):
|
|
275
|
+
await self.send_elements(recipient_id, message.pop("elements"), **message)
|
|
276
|
+
|
|
277
|
+
async def send_text_message(
|
|
278
|
+
self,
|
|
279
|
+
recipient_id: Text,
|
|
280
|
+
text: Text,
|
|
281
|
+
**kwargs: Any,
|
|
282
|
+
) -> None:
|
|
283
|
+
"""Send a message through this channel."""
|
|
284
|
+
raise NotImplementedError(
|
|
285
|
+
"Output channel needs to implement a send message for simple texts."
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
async def send_image_url(
|
|
289
|
+
self, recipient_id: Text, image: Text, **kwargs: Any
|
|
290
|
+
) -> None:
|
|
291
|
+
"""Sends an image. Default will just post the url as a string."""
|
|
292
|
+
await self.send_text_message(recipient_id, f"Image: {image}")
|
|
293
|
+
|
|
294
|
+
async def send_attachment(
|
|
295
|
+
self, recipient_id: Text, attachment: Text, **kwargs: Any
|
|
296
|
+
) -> None:
|
|
297
|
+
"""Sends an attachment. Default will just post as a string."""
|
|
298
|
+
await self.send_text_message(recipient_id, f"Attachment: {attachment}")
|
|
299
|
+
|
|
300
|
+
async def send_text_with_buttons(
|
|
301
|
+
self,
|
|
302
|
+
recipient_id: Text,
|
|
303
|
+
text: Text,
|
|
304
|
+
buttons: List[Dict[Text, Any]],
|
|
305
|
+
**kwargs: Any,
|
|
306
|
+
) -> None:
|
|
307
|
+
"""Sends buttons to the output.
|
|
308
|
+
|
|
309
|
+
Default implementation will just post the buttons as a string.
|
|
310
|
+
"""
|
|
311
|
+
await self.send_text_message(recipient_id, text)
|
|
312
|
+
for idx, button in enumerate(buttons):
|
|
313
|
+
button_msg = cli_utils.button_to_string(button, idx)
|
|
314
|
+
await self.send_text_message(recipient_id, button_msg)
|
|
315
|
+
|
|
316
|
+
async def send_text_with_buttons_concise(
|
|
317
|
+
self,
|
|
318
|
+
recipient_id: str,
|
|
319
|
+
text: str,
|
|
320
|
+
buttons: List[Dict[str, Any]],
|
|
321
|
+
**kwargs: Any,
|
|
322
|
+
) -> None:
|
|
323
|
+
"""Sends buttons in a concise format, useful for voice channels."""
|
|
324
|
+
if text.strip()[-1] not in {".", "!", "?", ":"}:
|
|
325
|
+
text += "."
|
|
326
|
+
text += " "
|
|
327
|
+
for idx, button in enumerate(buttons):
|
|
328
|
+
text += button["title"]
|
|
329
|
+
if idx != len(buttons) - 1:
|
|
330
|
+
text += ", "
|
|
331
|
+
await self.send_text_message(recipient_id, text)
|
|
332
|
+
|
|
333
|
+
async def send_quick_replies(
|
|
334
|
+
self,
|
|
335
|
+
recipient_id: Text,
|
|
336
|
+
text: Text,
|
|
337
|
+
quick_replies: List[Dict[Text, Any]],
|
|
338
|
+
**kwargs: Any,
|
|
339
|
+
) -> None:
|
|
340
|
+
"""Sends quick replies to the output.
|
|
341
|
+
|
|
342
|
+
Default implementation will just send as buttons.
|
|
343
|
+
"""
|
|
344
|
+
await self.send_text_with_buttons(recipient_id, text, quick_replies)
|
|
345
|
+
|
|
346
|
+
async def send_elements(
|
|
347
|
+
self, recipient_id: Text, elements: Iterable[Dict[Text, Any]], **kwargs: Any
|
|
348
|
+
) -> None:
|
|
349
|
+
"""Sends elements to the output.
|
|
350
|
+
|
|
351
|
+
Default implementation will just post the elements as a string.
|
|
352
|
+
"""
|
|
353
|
+
for element in elements:
|
|
354
|
+
element_msg = "{title} : {subtitle}".format(
|
|
355
|
+
title=element.get("title", ""), subtitle=element.get("subtitle", "")
|
|
356
|
+
)
|
|
357
|
+
await self.send_text_with_buttons(
|
|
358
|
+
recipient_id, element_msg, element.get("buttons", [])
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
async def send_custom_json(
|
|
362
|
+
self, recipient_id: Text, json_message: Dict[Text, Any], **kwargs: Any
|
|
363
|
+
) -> None:
|
|
364
|
+
"""Sends json dict to the output channel.
|
|
365
|
+
|
|
366
|
+
Default implementation will just post the json contents as a string.
|
|
367
|
+
"""
|
|
368
|
+
await self.send_text_message(recipient_id, json.dumps(json_message))
|
|
369
|
+
|
|
370
|
+
async def hangup(self, recipient_id: Text, **kwargs: Any) -> None:
|
|
371
|
+
"""Indicate that the conversation should be ended."""
|
|
372
|
+
pass
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class CollectingOutputChannel(OutputChannel):
|
|
376
|
+
"""Output channel that collects send messages in a list.
|
|
377
|
+
|
|
378
|
+
(doesn't send them anywhere, just collects them).
|
|
379
|
+
"""
|
|
380
|
+
|
|
381
|
+
def __init__(self) -> None:
|
|
382
|
+
"""Initialise list to collect messages."""
|
|
383
|
+
self.messages: List[Dict[Text, Any]] = []
|
|
384
|
+
|
|
385
|
+
@classmethod
|
|
386
|
+
def name(cls) -> Text:
|
|
387
|
+
"""Name of the channel."""
|
|
388
|
+
return "collector"
|
|
389
|
+
|
|
390
|
+
@staticmethod
|
|
391
|
+
def _message(
|
|
392
|
+
recipient_id: Text,
|
|
393
|
+
text: Optional[Text] = None,
|
|
394
|
+
image: Optional[Text] = None,
|
|
395
|
+
buttons: Optional[List[Dict[Text, Any]]] = None,
|
|
396
|
+
attachment: Optional[Text] = None,
|
|
397
|
+
custom: Optional[Dict[Text, Any]] = None,
|
|
398
|
+
) -> Dict:
|
|
399
|
+
"""Create a message object that will be stored."""
|
|
400
|
+
obj = {
|
|
401
|
+
"recipient_id": recipient_id,
|
|
402
|
+
"text": text,
|
|
403
|
+
"image": image,
|
|
404
|
+
"buttons": buttons,
|
|
405
|
+
"attachment": attachment,
|
|
406
|
+
"custom": custom,
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
# filter out any values that are `None`
|
|
410
|
+
return {k: v for k, v in obj.items() if v is not None}
|
|
411
|
+
|
|
412
|
+
def latest_output(self) -> Optional[Dict[Text, Any]]:
|
|
413
|
+
if self.messages:
|
|
414
|
+
return self.messages[-1]
|
|
415
|
+
else:
|
|
416
|
+
return None
|
|
417
|
+
|
|
418
|
+
async def _persist_message(self, message: Dict[Text, Any]) -> None:
|
|
419
|
+
self.messages.append(message)
|
|
420
|
+
|
|
421
|
+
async def send_text_message(
|
|
422
|
+
self,
|
|
423
|
+
recipient_id: Text,
|
|
424
|
+
text: Text,
|
|
425
|
+
**kwargs: Any,
|
|
426
|
+
) -> None:
|
|
427
|
+
for message_part in text.strip().split("\n\n"):
|
|
428
|
+
await self._persist_message(self._message(recipient_id, text=message_part))
|
|
429
|
+
|
|
430
|
+
async def send_image_url(
|
|
431
|
+
self, recipient_id: Text, image: Text, **kwargs: Any
|
|
432
|
+
) -> None:
|
|
433
|
+
"""Sends an image. Default will just post the url as a string."""
|
|
434
|
+
await self._persist_message(self._message(recipient_id, image=image))
|
|
435
|
+
|
|
436
|
+
async def send_attachment(
|
|
437
|
+
self, recipient_id: Text, attachment: Text, **kwargs: Any
|
|
438
|
+
) -> None:
|
|
439
|
+
"""Sends an attachment. Default will just post as a string."""
|
|
440
|
+
await self._persist_message(self._message(recipient_id, attachment=attachment))
|
|
441
|
+
|
|
442
|
+
async def send_text_with_buttons(
|
|
443
|
+
self,
|
|
444
|
+
recipient_id: Text,
|
|
445
|
+
text: Text,
|
|
446
|
+
buttons: List[Dict[Text, Any]],
|
|
447
|
+
**kwargs: Any,
|
|
448
|
+
) -> None:
|
|
449
|
+
await self._persist_message(
|
|
450
|
+
self._message(recipient_id, text=text, buttons=buttons)
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
async def send_custom_json(
|
|
454
|
+
self, recipient_id: Text, json_message: Dict[Text, Any], **kwargs: Any
|
|
455
|
+
) -> None:
|
|
456
|
+
await self._persist_message(self._message(recipient_id, custom=json_message))
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# this builtin is needed so we can overwrite in test
|
|
2
|
+
import asyncio
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from typing import (
|
|
8
|
+
Any,
|
|
9
|
+
AsyncGenerator,
|
|
10
|
+
Dict,
|
|
11
|
+
List,
|
|
12
|
+
Optional,
|
|
13
|
+
Text,
|
|
14
|
+
overload,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
import aiohttp
|
|
18
|
+
import questionary
|
|
19
|
+
from aiohttp import ClientTimeout
|
|
20
|
+
from prompt_toolkit.styles import Style
|
|
21
|
+
|
|
22
|
+
import rasa.shared.utils.cli
|
|
23
|
+
import rasa.shared.utils.io
|
|
24
|
+
from rasa.cli import utils as cli_utils
|
|
25
|
+
from rasa.core import utils
|
|
26
|
+
from rasa.core.channels.rest import RestInput
|
|
27
|
+
from rasa.core.constants import DEFAULT_SERVER_URL, DEFAULT_STREAM_READING_TIMEOUT
|
|
28
|
+
from rasa.shared.constants import INTENT_MESSAGE_PREFIX
|
|
29
|
+
from rasa.shared.utils.io import DEFAULT_ENCODING
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
STREAM_READING_TIMEOUT_ENV = "RASA_SHELL_STREAM_READING_TIMEOUT_IN_SECONDS"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def print_buttons(
|
|
37
|
+
message: Dict[Text, Any],
|
|
38
|
+
is_latest_message: bool = False,
|
|
39
|
+
color: Text = rasa.shared.utils.io.bcolors.OKBLUE,
|
|
40
|
+
) -> Optional[questionary.Question]:
|
|
41
|
+
"""Create CLI buttons from message data."""
|
|
42
|
+
if is_latest_message:
|
|
43
|
+
choices = cli_utils.button_choices_from_message_data(
|
|
44
|
+
message, allow_free_text_input=True
|
|
45
|
+
)
|
|
46
|
+
question = questionary.select(
|
|
47
|
+
message.get("text"),
|
|
48
|
+
choices,
|
|
49
|
+
style=Style([("qmark", "#6d91d3"), ("", "#6d91d3"), ("answer", "#b373d6")]),
|
|
50
|
+
)
|
|
51
|
+
return question
|
|
52
|
+
else:
|
|
53
|
+
rasa.shared.utils.cli.print_color("Buttons:", color=color)
|
|
54
|
+
for idx, button in enumerate(message.get("buttons")):
|
|
55
|
+
rasa.shared.utils.cli.print_color(
|
|
56
|
+
cli_utils.button_to_string(button, idx), color=color
|
|
57
|
+
)
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _print_bot_output(
|
|
62
|
+
message: Dict[Text, Any],
|
|
63
|
+
is_latest_message: bool = False,
|
|
64
|
+
color: Text = rasa.shared.utils.io.bcolors.OKBLUE,
|
|
65
|
+
) -> Optional[questionary.Question]:
|
|
66
|
+
if "buttons" in message:
|
|
67
|
+
question = print_buttons(message, is_latest_message, color)
|
|
68
|
+
if question:
|
|
69
|
+
return question
|
|
70
|
+
|
|
71
|
+
if "text" in message:
|
|
72
|
+
rasa.shared.utils.cli.print_color(message["text"], color=color)
|
|
73
|
+
|
|
74
|
+
if "image" in message:
|
|
75
|
+
rasa.shared.utils.cli.print_color("Image: " + message["image"], color=color)
|
|
76
|
+
|
|
77
|
+
if "attachment" in message:
|
|
78
|
+
rasa.shared.utils.cli.print_color(
|
|
79
|
+
"Attachment: " + message["attachment"], color=color
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if "elements" in message:
|
|
83
|
+
rasa.shared.utils.cli.print_color("Elements:", color=color)
|
|
84
|
+
for idx, element in enumerate(message["elements"]):
|
|
85
|
+
rasa.shared.utils.cli.print_color(
|
|
86
|
+
cli_utils.element_to_string(element, idx), color=color
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if "quick_replies" in message:
|
|
90
|
+
rasa.shared.utils.cli.print_color("Quick Replies:", color=color)
|
|
91
|
+
for idx, element in enumerate(message["quick_replies"]):
|
|
92
|
+
rasa.shared.utils.cli.print_color(
|
|
93
|
+
cli_utils.button_to_string(element, idx), color=color
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
if "custom" in message:
|
|
97
|
+
rasa.shared.utils.cli.print_color("Custom json:", color=color)
|
|
98
|
+
rasa.shared.utils.cli.print_color(
|
|
99
|
+
rasa.shared.utils.io.json_to_string(message["custom"]), color=color
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@overload
|
|
106
|
+
async def _get_user_input(previous_response: None) -> Text: ...
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@overload
|
|
110
|
+
async def _get_user_input(previous_response: Dict[str, Any]) -> Optional[Text]: ...
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
async def _get_user_input(
|
|
114
|
+
previous_response: Optional[Dict[str, Any]],
|
|
115
|
+
) -> Optional[Text]:
|
|
116
|
+
button_response = None
|
|
117
|
+
if previous_response is not None:
|
|
118
|
+
button_response = _print_bot_output(previous_response, is_latest_message=True)
|
|
119
|
+
|
|
120
|
+
if button_response is not None:
|
|
121
|
+
response = await cli_utils.payload_from_button_question(button_response)
|
|
122
|
+
if response == cli_utils.FREE_TEXT_INPUT_PROMPT:
|
|
123
|
+
# Re-prompt user with a free text input
|
|
124
|
+
response = await _get_user_input(None)
|
|
125
|
+
else:
|
|
126
|
+
question = questionary.text(
|
|
127
|
+
"",
|
|
128
|
+
qmark="Your input ->",
|
|
129
|
+
style=Style([("qmark", "#b373d6"), ("", "#b373d6")]),
|
|
130
|
+
)
|
|
131
|
+
response = await question.ask_async()
|
|
132
|
+
return response.strip() if response is not None else None
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
async def send_message_receive_block(
|
|
136
|
+
server_url: Text, auth_token: Text, sender_id: Text, message: Text
|
|
137
|
+
) -> List[Dict[Text, Any]]:
|
|
138
|
+
"""Posts message and returns response."""
|
|
139
|
+
payload = {"sender": sender_id, "message": message}
|
|
140
|
+
|
|
141
|
+
url = f"{server_url}/webhooks/rest/webhook?token={auth_token}"
|
|
142
|
+
async with aiohttp.ClientSession() as session:
|
|
143
|
+
async with session.post(url, json=payload, raise_for_status=True) as resp:
|
|
144
|
+
return await resp.json()
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
async def _send_message_receive_stream(
|
|
148
|
+
server_url: Text,
|
|
149
|
+
auth_token: Text,
|
|
150
|
+
sender_id: Text,
|
|
151
|
+
message: Text,
|
|
152
|
+
request_timeout: Optional[int] = None,
|
|
153
|
+
) -> AsyncGenerator[Dict[Text, Any], None]:
|
|
154
|
+
payload = {"sender": sender_id, "message": message}
|
|
155
|
+
|
|
156
|
+
url = f"{server_url}/webhooks/rest/webhook?stream=true&token={auth_token}"
|
|
157
|
+
|
|
158
|
+
# Define timeout to not keep reading in case the server crashed in between
|
|
159
|
+
timeout = _get_stream_reading_timeout(request_timeout)
|
|
160
|
+
|
|
161
|
+
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
162
|
+
async with session.post(url, json=payload, raise_for_status=True) as resp:
|
|
163
|
+
async for line in resp.content:
|
|
164
|
+
if line:
|
|
165
|
+
yield json.loads(line.decode(DEFAULT_ENCODING))
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _get_stream_reading_timeout(request_timeout: Optional[int] = None) -> ClientTimeout:
|
|
169
|
+
"""Define the ClientTimeout with fallbacks.
|
|
170
|
+
|
|
171
|
+
First use the `request_timeout` function parameter if available, this comes from the
|
|
172
|
+
`--request-timeout` command line argument.
|
|
173
|
+
If that fails fallback `STREAM_READING_TIMEOUT_ENV`, a commandline argument.
|
|
174
|
+
Lastly fallback to `DEFAULT_STREAM_READING_TIMEOUT` from rasa.core.constants
|
|
175
|
+
"""
|
|
176
|
+
timeout_str = (
|
|
177
|
+
request_timeout
|
|
178
|
+
if request_timeout is not None
|
|
179
|
+
else os.environ.get(STREAM_READING_TIMEOUT_ENV, DEFAULT_STREAM_READING_TIMEOUT)
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
return ClientTimeout(int(timeout_str))
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
async def record_messages(
|
|
186
|
+
sender_id: Text,
|
|
187
|
+
server_url: Text = DEFAULT_SERVER_URL,
|
|
188
|
+
auth_token: Text = "",
|
|
189
|
+
max_message_limit: Optional[int] = None,
|
|
190
|
+
use_response_stream: bool = True,
|
|
191
|
+
request_timeout: Optional[int] = None,
|
|
192
|
+
) -> int:
|
|
193
|
+
"""Read messages from the command line and print bot responses."""
|
|
194
|
+
exit_text = INTENT_MESSAGE_PREFIX + "stop"
|
|
195
|
+
|
|
196
|
+
rasa.shared.utils.cli.print_success(
|
|
197
|
+
"Bot loaded. Type a message and press enter (use '{}' to exit): ".format(
|
|
198
|
+
exit_text
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
num_messages = 0
|
|
203
|
+
previous_response = None
|
|
204
|
+
await asyncio.sleep(0.5) # Wait for server to start
|
|
205
|
+
while not utils.is_limit_reached(num_messages, max_message_limit):
|
|
206
|
+
text = await _get_user_input(previous_response)
|
|
207
|
+
|
|
208
|
+
if text == exit_text or text is None:
|
|
209
|
+
break
|
|
210
|
+
|
|
211
|
+
if use_response_stream:
|
|
212
|
+
bot_responses_stream = _send_message_receive_stream(
|
|
213
|
+
server_url, auth_token, sender_id, text, request_timeout=request_timeout
|
|
214
|
+
)
|
|
215
|
+
previous_response = None
|
|
216
|
+
async for response in bot_responses_stream:
|
|
217
|
+
if previous_response is not None:
|
|
218
|
+
_print_bot_output(previous_response)
|
|
219
|
+
previous_response = response
|
|
220
|
+
else:
|
|
221
|
+
bot_responses = await send_message_receive_block(
|
|
222
|
+
server_url, auth_token, sender_id, text
|
|
223
|
+
)
|
|
224
|
+
previous_response = None
|
|
225
|
+
for response in bot_responses:
|
|
226
|
+
if previous_response is not None:
|
|
227
|
+
_print_bot_output(previous_response)
|
|
228
|
+
previous_response = response
|
|
229
|
+
|
|
230
|
+
num_messages += 1
|
|
231
|
+
await asyncio.sleep(0) # Yield event loop for others coroutines
|
|
232
|
+
return num_messages
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class CmdlineInput(RestInput):
|
|
236
|
+
@classmethod
|
|
237
|
+
def name(cls) -> Text:
|
|
238
|
+
return "cmdline"
|
|
239
|
+
|
|
240
|
+
def url_prefix(self) -> Text:
|
|
241
|
+
return RestInput.name()
|