rasa-pro 3.11.4__py3-none-any.whl → 3.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +10 -13
- rasa/__main__.py +7 -7
- rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
- rasa/anonymization/anonymization_pipeline.py +3 -3
- rasa/anonymization/anonymization_rule_executor.py +17 -11
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/default_arguments.py +1 -1
- rasa/cli/arguments/evaluate.py +2 -1
- rasa/cli/arguments/interactive.py +1 -1
- rasa/cli/arguments/run.py +1 -1
- rasa/cli/arguments/test.py +7 -5
- rasa/cli/arguments/train.py +3 -3
- rasa/cli/arguments/visualize.py +2 -2
- rasa/cli/arguments/x.py +1 -0
- rasa/cli/data.py +20 -3
- rasa/cli/dialogue_understanding_test.py +386 -0
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/inspect.py +20 -1
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +51 -16
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/calm/config.yml +2 -2
- rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
- rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
- rasa/cli/project_templates/calm/domain/shared.yml +1 -4
- rasa/cli/project_templates/calm/endpoints.yml +2 -2
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +5 -6
- rasa/cli/studio/download.py +1 -2
- rasa/cli/studio/studio.py +2 -3
- rasa/cli/studio/train.py +0 -1
- rasa/cli/telemetry.py +2 -2
- rasa/cli/test.py +11 -11
- rasa/cli/train.py +3 -0
- rasa/cli/utils.py +25 -5
- rasa/constants.py +0 -1
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +137 -208
- rasa/core/actions/action_handle_digressions.py +164 -0
- rasa/core/actions/action_hangup.py +1 -1
- rasa/core/actions/action_repeat_bot_messages.py +2 -2
- rasa/core/actions/action_run_slot_rejections.py +18 -6
- rasa/core/actions/action_trigger_chitchat.py +1 -1
- rasa/core/actions/action_trigger_flow.py +5 -5
- rasa/core/actions/action_trigger_search.py +1 -1
- rasa/core/actions/custom_action_executor.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +1 -0
- rasa/core/actions/forms.py +22 -15
- rasa/core/actions/http_custom_action_executor.py +8 -1
- rasa/core/actions/loops.py +3 -3
- rasa/core/actions/two_stage_fallback.py +13 -13
- rasa/core/auth_retry_tracker_store.py +1 -2
- rasa/core/brokers/broker.py +2 -1
- rasa/core/brokers/file.py +1 -1
- rasa/core/brokers/kafka.py +8 -8
- rasa/core/brokers/pika.py +8 -9
- rasa/core/brokers/sql.py +4 -3
- rasa/core/channels/__init__.py +7 -0
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/callback.py +4 -4
- rasa/core/channels/channel.py +11 -11
- rasa/core/channels/console.py +0 -1
- rasa/core/channels/development_inspector.py +80 -24
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
- rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
- rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
- rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
- rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
- rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
- rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
- rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
- rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
- rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
- rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
- rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
- rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +11 -3
- rasa/core/channels/inspector/src/App.tsx +15 -2
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
- rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
- rasa/core/channels/inspector/yarn.lock +94 -99
- rasa/core/channels/mattermost.py +4 -4
- rasa/core/channels/rasa_chat.py +4 -4
- rasa/core/channels/rest.py +11 -12
- rasa/core/channels/rocketchat.py +4 -3
- rasa/core/channels/slack.py +6 -5
- rasa/core/channels/socketio.py +8 -28
- rasa/core/channels/studio_chat.py +212 -0
- rasa/core/channels/telegram.py +105 -55
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +51 -32
- rasa/core/channels/voice_ready/jambonz.py +5 -5
- rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
- rasa/core/channels/voice_ready/twilio_voice.py +9 -8
- rasa/core/channels/voice_ready/utils.py +2 -2
- rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
- rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
- rasa/core/channels/voice_stream/asr/azure.py +16 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
- rasa/core/channels/voice_stream/audiocodes.py +292 -0
- rasa/core/channels/voice_stream/browser_audio.py +14 -7
- rasa/core/channels/voice_stream/call_state.py +6 -2
- rasa/core/channels/voice_stream/genesys.py +320 -0
- rasa/core/channels/voice_stream/tts/azure.py +13 -5
- rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
- rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +100 -56
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/constants.py +2 -0
- rasa/core/evaluation/marker.py +7 -6
- rasa/core/evaluation/marker_base.py +15 -16
- rasa/core/evaluation/marker_stats.py +3 -4
- rasa/core/evaluation/marker_tracker_loader.py +5 -4
- rasa/core/exporter.py +4 -4
- rasa/core/featurizers/precomputation.py +8 -8
- rasa/core/featurizers/single_state_featurizer.py +7 -7
- rasa/core/featurizers/tracker_featurizers.py +13 -13
- rasa/core/http_interpreter.py +3 -4
- rasa/core/information_retrieval/__init__.py +1 -1
- rasa/core/information_retrieval/faiss.py +4 -4
- rasa/core/information_retrieval/information_retrieval.py +2 -2
- rasa/core/information_retrieval/milvus.py +3 -3
- rasa/core/information_retrieval/qdrant.py +3 -3
- rasa/core/jobs.py +1 -0
- rasa/core/lock.py +2 -3
- rasa/core/lock_store.py +3 -3
- rasa/core/migrate.py +12 -9
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +82 -14
- rasa/core/nlg/generator.py +85 -17
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +9 -7
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/nlg/translate.py +55 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +87 -21
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +85 -55
- rasa/core/policies/intentless_policy.py +6 -7
- rasa/core/policies/memoization.py +22 -20
- rasa/core/policies/policy.py +24 -22
- rasa/core/policies/rule_policy.py +37 -36
- rasa/core/policies/ted_policy.py +87 -85
- rasa/core/policies/unexpected_intent_policy.py +77 -75
- rasa/core/processor.py +167 -74
- rasa/core/run.py +5 -4
- rasa/core/secrets_manager/endpoints.py +2 -3
- rasa/core/secrets_manager/factory.py +2 -3
- rasa/core/secrets_manager/secret_manager.py +2 -3
- rasa/core/secrets_manager/vault.py +2 -2
- rasa/core/test.py +30 -30
- rasa/core/tracker_store.py +138 -49
- rasa/core/train.py +1 -1
- rasa/core/training/__init__.py +2 -2
- rasa/core/training/converters/responses_prefix_converter.py +1 -2
- rasa/core/training/interactive.py +13 -13
- rasa/core/training/story_conflict.py +4 -5
- rasa/core/training/training.py +3 -5
- rasa/core/utils.py +5 -5
- rasa/core/visualize.py +1 -1
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
- rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
- rasa/dialogue_understanding/commands/__init__.py +22 -22
- rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
- rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/clarify_command.py +46 -4
- rasa/dialogue_understanding/commands/command.py +3 -2
- rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
- rasa/dialogue_understanding/commands/error_command.py +1 -1
- rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
- rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
- rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/prompt_command.py +94 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
- rasa/dialogue_understanding/commands/restart_command.py +2 -5
- rasa/dialogue_understanding/commands/session_end_command.py +3 -5
- rasa/dialogue_understanding/commands/session_start_command.py +3 -5
- rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
- rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +126 -43
- rasa/dialogue_understanding/constants.py +2 -0
- rasa/dialogue_understanding/generator/__init__.py +2 -0
- rasa/dialogue_understanding/generator/command_generator.py +120 -79
- rasa/dialogue_understanding/generator/command_parser.py +245 -0
- rasa/dialogue_understanding/generator/constants.py +12 -4
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
- rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
- rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
- rasa/dialogue_understanding/generator/utils.py +76 -0
- rasa/dialogue_understanding/patterns/cancel.py +2 -1
- rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
- rasa/dialogue_understanding/patterns/chitchat.py +1 -1
- rasa/dialogue_understanding/patterns/clarify.py +2 -1
- rasa/dialogue_understanding/patterns/code_change.py +2 -0
- rasa/dialogue_understanding/patterns/collect_information.py +7 -4
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
- rasa/dialogue_understanding/patterns/correction.py +17 -3
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
- rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
- rasa/dialogue_understanding/patterns/internal_error.py +1 -0
- rasa/dialogue_understanding/patterns/search.py +1 -1
- rasa/dialogue_understanding/patterns/session_start.py +1 -1
- rasa/dialogue_understanding/patterns/skip_question.py +1 -0
- rasa/dialogue_understanding/patterns/user_silence.py +1 -1
- rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
- rasa/dialogue_understanding/processor/command_processor.py +193 -43
- rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
- rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
- rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
- rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
- rasa/dialogue_understanding/stack/utils.py +56 -10
- rasa/dialogue_understanding/utils.py +164 -0
- rasa/dialogue_understanding_test/README.md +429 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
- rasa/dialogue_understanding_test/constants.py +22 -0
- rasa/dialogue_understanding_test/du_test_case.py +448 -0
- rasa/dialogue_understanding_test/du_test_result.py +390 -0
- rasa/dialogue_understanding_test/du_test_runner.py +322 -0
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +443 -0
- rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
- rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
- rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
- rasa/dialogue_understanding_test/utils.py +70 -0
- rasa/dialogue_understanding_test/validation.py +77 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +202 -175
- rasa/e2e_test/assertions_schema.yml +6 -0
- rasa/e2e_test/constants.py +16 -1
- rasa/e2e_test/e2e_config.py +102 -41
- rasa/e2e_test/e2e_config_schema.yml +28 -10
- rasa/e2e_test/e2e_test_case.py +5 -5
- rasa/e2e_test/e2e_test_converter.py +2 -3
- rasa/e2e_test/e2e_test_coverage_report.py +6 -6
- rasa/e2e_test/e2e_test_result.py +1 -1
- rasa/e2e_test/e2e_test_runner.py +143 -38
- rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
- rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/generative_assertions.py +243 -0
- rasa/e2e_test/utils/io.py +123 -93
- rasa/e2e_test/utils/validation.py +101 -3
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +3 -2
- rasa/engine/language.py +182 -0
- rasa/engine/recipes/config_files/default_config.yml +4 -0
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/default_recipe.py +65 -49
- rasa/engine/recipes/graph_recipe.py +10 -7
- rasa/engine/recipes/recipe.py +2 -2
- rasa/engine/runner/dask.py +2 -2
- rasa/engine/runner/interface.py +1 -0
- rasa/engine/storage/local_model_storage.py +6 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +8 -3
- rasa/engine/training/components.py +2 -1
- rasa/engine/training/fingerprinting.py +4 -2
- rasa/engine/training/graph_trainer.py +4 -4
- rasa/engine/training/hooks.py +2 -2
- rasa/engine/validation.py +36 -33
- rasa/exceptions.py +3 -2
- rasa/graph_components/converters/nlu_message_converter.py +3 -3
- rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
- rasa/graph_components/providers/domain_provider.py +3 -2
- rasa/graph_components/providers/flows_provider.py +2 -3
- rasa/graph_components/providers/forms_provider.py +4 -4
- rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
- rasa/graph_components/providers/responses_provider.py +4 -4
- rasa/graph_components/providers/rule_only_provider.py +3 -2
- rasa/graph_components/providers/story_graph_provider.py +8 -8
- rasa/graph_components/providers/training_tracker_provider.py +3 -2
- rasa/graph_components/validators/default_recipe_validator.py +16 -16
- rasa/graph_components/validators/finetuning_validator.py +10 -8
- rasa/hooks.py +19 -14
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +5 -33
- rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
- rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/llm_fine_tuning/train_test_split_module.py +27 -27
- rasa/llm_fine_tuning/utils.py +7 -0
- rasa/markers/marker.py +2 -3
- rasa/markers/marker_base.py +1 -2
- rasa/markers/upload.py +2 -2
- rasa/markers/validate.py +2 -3
- rasa/model.py +3 -5
- rasa/model_manager/config.py +1 -1
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +13 -10
- rasa/model_manager/socket_bridge.py +15 -9
- rasa/model_manager/studio_jwt_auth.py +1 -0
- rasa/model_manager/trainer_service.py +9 -7
- rasa/model_manager/utils.py +1 -1
- rasa/model_manager/warm_rasa_process.py +14 -9
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/model_training.py +29 -29
- rasa/nlu/classifiers/diet_classifier.py +72 -73
- rasa/nlu/classifiers/fallback_classifier.py +9 -8
- rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
- rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
- rasa/nlu/classifiers/regex_message_handler.py +3 -2
- rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
- rasa/nlu/convert.py +2 -2
- rasa/nlu/emulators/dialogflow.py +3 -3
- rasa/nlu/emulators/luis.py +5 -5
- rasa/nlu/emulators/no_emulator.py +1 -0
- rasa/nlu/emulators/wit.py +4 -4
- rasa/nlu/extractors/crf_entity_extractor.py +11 -11
- rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
- rasa/nlu/extractors/entity_synonyms.py +10 -9
- rasa/nlu/extractors/extractor.py +16 -16
- rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
- rasa/nlu/extractors/regex_entity_extractor.py +11 -10
- rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
- rasa/nlu/featurizers/featurizer.py +5 -4
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
- rasa/nlu/model.py +0 -1
- rasa/nlu/selectors/response_selector.py +67 -68
- rasa/nlu/test.py +38 -38
- rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
- rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
- rasa/nlu/tokenizers/tokenizer.py +6 -7
- rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
- rasa/nlu/utils/bilou_utils.py +7 -7
- rasa/nlu/utils/hugging_face/registry.py +22 -22
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
- rasa/nlu/utils/mitie_utils.py +2 -1
- rasa/nlu/utils/pattern_utils.py +1 -1
- rasa/nlu/utils/spacy_utils.py +3 -3
- rasa/plugin.py +12 -1
- rasa/server.py +6 -3
- rasa/shared/constants.py +45 -18
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +34 -4
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/domain.py +19 -20
- rasa/shared/core/events.py +60 -39
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/constants.py +11 -0
- rasa/shared/core/flows/flow.py +107 -26
- rasa/shared/core/flows/flow_step.py +4 -3
- rasa/shared/core/flows/flow_step_links.py +1 -2
- rasa/shared/core/flows/flow_step_sequence.py +1 -1
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/flows_yaml_schema.json +69 -3
- rasa/shared/core/flows/nlu_trigger.py +1 -1
- rasa/shared/core/flows/steps/__init__.py +2 -2
- rasa/shared/core/flows/steps/action.py +1 -1
- rasa/shared/core/flows/steps/call.py +1 -1
- rasa/shared/core/flows/steps/collect.py +22 -40
- rasa/shared/core/flows/steps/internal.py +1 -1
- rasa/shared/core/flows/steps/link.py +1 -1
- rasa/shared/core/flows/steps/no_operation.py +2 -2
- rasa/shared/core/flows/steps/set_slots.py +1 -1
- rasa/shared/core/flows/utils.py +44 -4
- rasa/shared/core/flows/validation.py +4 -6
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +360 -121
- rasa/shared/core/slots.py +163 -6
- rasa/shared/core/trackers.py +108 -33
- rasa/shared/core/training_data/loading.py +1 -1
- rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
- rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
- rasa/shared/core/training_data/structures.py +11 -12
- rasa/shared/core/training_data/visualization.py +10 -10
- rasa/shared/data.py +6 -6
- rasa/shared/engine/caching.py +0 -1
- rasa/shared/exceptions.py +2 -2
- rasa/shared/importers/importer.py +58 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +9 -0
- rasa/shared/nlu/training_data/entities_parser.py +6 -6
- rasa/shared/nlu/training_data/features.py +3 -3
- rasa/shared/nlu/training_data/formats/__init__.py +1 -1
- rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
- rasa/shared/nlu/training_data/formats/luis.py +7 -8
- rasa/shared/nlu/training_data/formats/rasa.py +4 -5
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
- rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
- rasa/shared/nlu/training_data/formats/wit.py +3 -4
- rasa/shared/nlu/training_data/loading.py +4 -4
- rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
- rasa/shared/nlu/training_data/message.py +13 -14
- rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
- rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
- rasa/shared/nlu/training_data/training_data.py +12 -13
- rasa/shared/nlu/training_data/util.py +11 -10
- rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
- rasa/shared/providers/_configs/client_config.py +3 -1
- rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
- rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
- rasa/shared/providers/_configs/model_group_config.py +8 -5
- rasa/shared/providers/_configs/oauth_config.py +33 -0
- rasa/shared/providers/_configs/openai_client_config.py +14 -12
- rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
- rasa/shared/providers/_configs/utils.py +1 -0
- rasa/shared/providers/_ssl_verification_utils.py +5 -6
- rasa/shared/providers/_utils.py +5 -5
- rasa/shared/providers/constants.py +6 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
- rasa/shared/providers/llm/_base_litellm_client.py +43 -18
- rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
- rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
- rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
- rasa/shared/providers/llm/llm_client.py +24 -8
- rasa/shared/providers/llm/llm_response.py +61 -2
- rasa/shared/providers/llm/openai_llm_client.py +11 -5
- rasa/shared/providers/llm/rasa_llm_client.py +17 -14
- rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
- rasa/shared/providers/router/router_client.py +3 -1
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +15 -1
- rasa/shared/utils/constants.py +3 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
- rasa/shared/utils/health_check/health_check.py +3 -3
- rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
- rasa/shared/utils/io.py +1 -1
- rasa/shared/utils/llm.py +100 -18
- rasa/shared/utils/pykwalify_extensions.py +25 -1
- rasa/shared/utils/schemas/domain.yml +26 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +24 -20
- rasa/studio/auth.py +3 -3
- rasa/studio/config.py +1 -2
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download.py +1 -1
- rasa/studio/results_logger.py +3 -3
- rasa/studio/upload.py +21 -5
- rasa/telemetry.py +127 -48
- rasa/tracing/config.py +5 -3
- rasa/tracing/constants.py +12 -0
- rasa/tracing/instrumentation/attribute_extractors.py +92 -14
- rasa/tracing/instrumentation/instrumentation.py +61 -5
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +52 -11
- rasa/tracing/metric_instrument_provider.py +54 -14
- rasa/utils/common.py +12 -24
- rasa/utils/endpoints.py +1 -1
- rasa/utils/io.py +7 -7
- rasa/utils/licensing.py +3 -4
- rasa/utils/log_utils.py +7 -6
- rasa/utils/ml_utils.py +1 -0
- rasa/utils/plotting.py +3 -3
- rasa/utils/sanic_error_handler.py +1 -1
- rasa/utils/tensorflow/callback.py +2 -2
- rasa/utils/tensorflow/crf.py +2 -2
- rasa/utils/tensorflow/data_generator.py +5 -5
- rasa/utils/tensorflow/environment.py +3 -3
- rasa/utils/tensorflow/feature_array.py +2 -3
- rasa/utils/tensorflow/layers.py +18 -12
- rasa/utils/tensorflow/layers_utils.py +2 -1
- rasa/utils/tensorflow/metrics.py +2 -2
- rasa/utils/tensorflow/model_data.py +7 -7
- rasa/utils/tensorflow/model_data_utils.py +10 -9
- rasa/utils/tensorflow/models.py +31 -32
- rasa/utils/tensorflow/rasa_layers.py +20 -19
- rasa/utils/tensorflow/types.py +2 -1
- rasa/utils/train_utils.py +23 -21
- rasa/utils/url_tools.py +1 -1
- rasa/validator.py +594 -115
- rasa/version.py +1 -1
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
- rasa_pro-3.12.0.dist-info/RECORD +829 -0
- rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
- rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
- rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
- rasa_pro-3.11.4.dist-info/RECORD +0 -779
- /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
from typing import Dict,
|
|
1
|
+
from typing import Any, Dict, List, Type
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
|
|
5
5
|
from rasa.dialogue_understanding.commands import Command, SetSlotCommand
|
|
6
|
-
from rasa.dialogue_understanding.generator import
|
|
6
|
+
from rasa.dialogue_understanding.generator.llm_based_command_generator import (
|
|
7
|
+
LLMBasedCommandGenerator,
|
|
8
|
+
)
|
|
7
9
|
from rasa.llm_fine_tuning.conversations import Conversation, ConversationStep
|
|
8
10
|
from rasa.llm_fine_tuning.paraphrasing.rephrased_user_message import (
|
|
9
11
|
RephrasedUserMessage,
|
|
10
12
|
)
|
|
11
13
|
from rasa.shared.core.flows import FlowsList
|
|
12
14
|
from rasa.shared.exceptions import ProviderClientAPIException
|
|
13
|
-
from rasa.shared.utils.llm import
|
|
14
|
-
llm_factory,
|
|
15
|
-
)
|
|
15
|
+
from rasa.shared.utils.llm import llm_factory
|
|
16
16
|
|
|
17
17
|
structlogger = structlog.get_logger()
|
|
18
18
|
|
|
@@ -26,6 +26,7 @@ class RephraseValidator:
|
|
|
26
26
|
self,
|
|
27
27
|
rephrasings: List[RephrasedUserMessage],
|
|
28
28
|
conversation: Conversation,
|
|
29
|
+
llm_command_generator: Type[LLMBasedCommandGenerator],
|
|
29
30
|
) -> List[RephrasedUserMessage]:
|
|
30
31
|
"""Split rephrased user messages into passing and failing.
|
|
31
32
|
|
|
@@ -38,6 +39,7 @@ class RephraseValidator:
|
|
|
38
39
|
Args:
|
|
39
40
|
rephrasings: The rephrased user messages.
|
|
40
41
|
conversation: The conversation.
|
|
42
|
+
llm_command_generator: A LLM based command generator class.
|
|
41
43
|
|
|
42
44
|
Returns:
|
|
43
45
|
A list of rephrased user messages including the passing and failing
|
|
@@ -49,7 +51,9 @@ class RephraseValidator:
|
|
|
49
51
|
current_rephrasings = rephrasings[i]
|
|
50
52
|
|
|
51
53
|
for rephrase in current_rephrasings.rephrasings:
|
|
52
|
-
if await self._validate_rephrase_is_passing(
|
|
54
|
+
if await self._validate_rephrase_is_passing(
|
|
55
|
+
rephrase, step, llm_command_generator
|
|
56
|
+
):
|
|
53
57
|
current_rephrasings.passed_rephrasings.append(rephrase)
|
|
54
58
|
else:
|
|
55
59
|
current_rephrasings.failed_rephrasings.append(rephrase)
|
|
@@ -60,25 +64,26 @@ class RephraseValidator:
|
|
|
60
64
|
self,
|
|
61
65
|
rephrase: str,
|
|
62
66
|
step: ConversationStep,
|
|
67
|
+
llm_command_generator: Type[LLMBasedCommandGenerator],
|
|
63
68
|
) -> bool:
|
|
64
69
|
prompt = self._update_prompt(
|
|
65
70
|
rephrase, step.original_test_step.text, step.llm_prompt
|
|
66
71
|
)
|
|
67
72
|
|
|
68
|
-
action_list = await self._invoke_llm(
|
|
73
|
+
action_list = await self._invoke_llm(
|
|
74
|
+
prompt, llm_command_generator.get_default_llm_config()
|
|
75
|
+
)
|
|
69
76
|
|
|
70
77
|
commands_from_original_utterance = step.llm_commands
|
|
71
|
-
commands_from_rephrased_utterance = (
|
|
72
|
-
|
|
78
|
+
commands_from_rephrased_utterance = llm_command_generator.parse_commands( # type: ignore
|
|
79
|
+
action_list, None, self.flows
|
|
73
80
|
)
|
|
74
81
|
return self._check_commands_match(
|
|
75
82
|
commands_from_original_utterance, commands_from_rephrased_utterance
|
|
76
83
|
)
|
|
77
84
|
|
|
78
|
-
async def _invoke_llm(self, prompt: str) -> str:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
|
|
85
|
+
async def _invoke_llm(self, prompt: str, default_llm_config: Dict[str, Any]) -> str:
|
|
86
|
+
llm = llm_factory(self.llm_config, default_llm_config)
|
|
82
87
|
|
|
83
88
|
try:
|
|
84
89
|
llm_response = await llm.acompletion(prompt)
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import Any, Dict, List, Tuple, Type
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
from tqdm import tqdm
|
|
5
5
|
|
|
6
|
+
from rasa.dialogue_understanding.generator.llm_based_command_generator import (
|
|
7
|
+
LLMBasedCommandGenerator,
|
|
8
|
+
)
|
|
6
9
|
from rasa.llm_fine_tuning.conversations import Conversation
|
|
7
10
|
from rasa.llm_fine_tuning.paraphrasing.conversation_rephraser import (
|
|
8
11
|
ConversationRephraser,
|
|
@@ -25,6 +28,7 @@ async def create_paraphrased_conversations(
|
|
|
25
28
|
rephrase_config: Dict[str, Any],
|
|
26
29
|
num_rephrases: int,
|
|
27
30
|
flows: FlowsList,
|
|
31
|
+
llm_command_generator: Type[LLMBasedCommandGenerator],
|
|
28
32
|
llm_command_generator_config: Dict[str, Any],
|
|
29
33
|
storage_context: StorageContext,
|
|
30
34
|
) -> Tuple[List[Conversation], Dict[str, Any]]:
|
|
@@ -71,7 +75,7 @@ async def create_paraphrased_conversations(
|
|
|
71
75
|
rephrasings = _filter_rephrasings(rephrasings, conversations[i])
|
|
72
76
|
# check if the rephrasings are still producing the same commands
|
|
73
77
|
rephrasings = await validator.validate_rephrasings(
|
|
74
|
-
rephrasings, current_conversation
|
|
78
|
+
rephrasings, current_conversation, llm_command_generator
|
|
75
79
|
)
|
|
76
80
|
except ProviderClientAPIException as e:
|
|
77
81
|
structlogger.error(
|
rasa/llm_fine_tuning/storage.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
|
-
from abc import
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
4
|
from enum import Enum
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import List, Optional
|
|
6
|
+
from typing import TYPE_CHECKING, List, Optional
|
|
7
7
|
|
|
8
8
|
import rasa.shared.utils.io
|
|
9
9
|
import rasa.utils.io
|
|
@@ -11,9 +11,9 @@ from rasa.llm_fine_tuning.conversations import Conversation
|
|
|
11
11
|
from rasa.shared.utils.yaml import write_yaml
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
+
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
14
15
|
from rasa.llm_fine_tuning.llm_data_preparation_module import LLMDataExample
|
|
15
16
|
from rasa.llm_fine_tuning.train_test_split_module import DataExampleFormat
|
|
16
|
-
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class StorageType(Enum):
|
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
import random
|
|
2
2
|
from collections import defaultdict
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Dict, List, Protocol, Set, Tuple
|
|
4
|
+
from typing import Any, Dict, List, Protocol, Set, Tuple, Type
|
|
5
5
|
|
|
6
6
|
import structlog
|
|
7
7
|
|
|
8
|
+
from rasa.dialogue_understanding.commands.prompt_command import PromptCommand
|
|
8
9
|
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
9
10
|
from rasa.llm_fine_tuning.llm_data_preparation_module import LLMDataExample
|
|
10
11
|
from rasa.llm_fine_tuning.storage import StorageContext
|
|
12
|
+
from rasa.llm_fine_tuning.utils import commands_as_string
|
|
11
13
|
|
|
12
14
|
TRAIN_TEST_MODULE_STORAGE_LOCATION = "4_train_test_split"
|
|
13
15
|
|
|
14
|
-
SUPPORTED_COMMANDS = [
|
|
15
|
-
"SetSlot",
|
|
16
|
-
"StartFlow",
|
|
17
|
-
"CancelFlow",
|
|
18
|
-
"ChitChat",
|
|
19
|
-
"SkipQuestion",
|
|
20
|
-
"SearchAndReply",
|
|
21
|
-
"HumanHandoff",
|
|
22
|
-
"Clarify",
|
|
23
|
-
]
|
|
24
|
-
|
|
25
16
|
INSTRUCTION_DATA_FORMAT = "instruction"
|
|
26
17
|
CONVERSATIONAL_DATA_FORMAT = "conversational"
|
|
27
18
|
|
|
@@ -77,17 +68,19 @@ class ConversationalDataFormat(DataExampleFormat):
|
|
|
77
68
|
}
|
|
78
69
|
|
|
79
70
|
|
|
80
|
-
def _get_command_types_covered_by_llm_data_point(
|
|
71
|
+
def _get_command_types_covered_by_llm_data_point(
|
|
72
|
+
data_point: LLMDataExample,
|
|
73
|
+
) -> Set[Type[PromptCommand]]:
|
|
81
74
|
"""Get the command types covered by the LLM data point.
|
|
82
75
|
|
|
83
76
|
This function returns the set of command types from the output present in a
|
|
84
|
-
LLMDataExample object. Eg: The function returns {'
|
|
85
|
-
LLMDataExample.output is '
|
|
77
|
+
LLMDataExample object. Eg: The function returns {'SetSlotCommand',
|
|
78
|
+
'StartFlowCommand'} when the LLMDataExample.output is 'SetSlotCommand(slot, abc),
|
|
79
|
+
SetSlotCommand(slot, cde), StartFlowCommand(xyz)'.
|
|
86
80
|
"""
|
|
87
81
|
commands_covered = set()
|
|
88
|
-
for command in
|
|
89
|
-
|
|
90
|
-
commands_covered.add(command)
|
|
82
|
+
for command in data_point.output:
|
|
83
|
+
commands_covered.add(command.__class__)
|
|
91
84
|
return commands_covered
|
|
92
85
|
|
|
93
86
|
|
|
@@ -146,14 +139,18 @@ def _get_minimum_test_case_groups_to_cover_all_commands(
|
|
|
146
139
|
{
|
|
147
140
|
"test_case_name": "t1",
|
|
148
141
|
"data_examples": [],
|
|
149
|
-
"commands": {"
|
|
142
|
+
"commands": {"SetSlotCommand", "CancelFlowCommand"}
|
|
150
143
|
},
|
|
151
|
-
{
|
|
152
|
-
|
|
144
|
+
{
|
|
145
|
+
"test_case_name": "t2",
|
|
146
|
+
"data_examples": [],
|
|
147
|
+
"commands": {"CancelFlowCommand"}
|
|
148
|
+
},
|
|
149
|
+
{"test_case_name": "t3", "data_examples": [], "commands": {"StartFlowCommand"}},
|
|
153
150
|
{
|
|
154
151
|
"test_case_name": "t4",
|
|
155
152
|
"data_examples": [],
|
|
156
|
-
"commands": {"
|
|
153
|
+
"commands": {"SetSlotCommand", "StartFlowCommand"}
|
|
157
154
|
},
|
|
158
155
|
]
|
|
159
156
|
|
|
@@ -166,7 +163,7 @@ def _get_minimum_test_case_groups_to_cover_all_commands(
|
|
|
166
163
|
command for test_group in grouped_data for command in test_group[KEY_COMMANDS]
|
|
167
164
|
)
|
|
168
165
|
selected_test_cases = []
|
|
169
|
-
covered_commands: Set[
|
|
166
|
+
covered_commands: Set[Type[PromptCommand]] = set()
|
|
170
167
|
|
|
171
168
|
while covered_commands != all_commands:
|
|
172
169
|
# Find the test case group that covers the most number of uncovered commands
|
|
@@ -187,7 +184,7 @@ def _get_minimum_test_case_groups_to_cover_all_commands(
|
|
|
187
184
|
|
|
188
185
|
structlogger.info(
|
|
189
186
|
"llm_fine_tuning.train_test_split_module.command_coverage_in_train_dataset",
|
|
190
|
-
covered_commands=covered_commands,
|
|
187
|
+
covered_commands=[command.__name__ for command in covered_commands],
|
|
191
188
|
)
|
|
192
189
|
return selected_test_cases
|
|
193
190
|
|
|
@@ -205,7 +202,10 @@ def _get_finetuning_data_in_instruction_data_format(
|
|
|
205
202
|
data: List[Dict[str, Any]],
|
|
206
203
|
) -> List[DataExampleFormat]:
|
|
207
204
|
return [
|
|
208
|
-
InstructionDataFormat(
|
|
205
|
+
InstructionDataFormat(
|
|
206
|
+
llm_data_example.prompt,
|
|
207
|
+
commands_as_string(llm_data_example.output),
|
|
208
|
+
)
|
|
209
209
|
for test_group in data
|
|
210
210
|
for llm_data_example in test_group[KEY_DATA_EXAMPLES]
|
|
211
211
|
]
|
|
@@ -232,7 +232,7 @@ def _get_finetuning_data_in_conversational_data_format(
|
|
|
232
232
|
[
|
|
233
233
|
ConversationalMessageDataFormat("user", llm_data_example.prompt),
|
|
234
234
|
ConversationalMessageDataFormat(
|
|
235
|
-
"assistant", llm_data_example.output
|
|
235
|
+
"assistant", commands_as_string(llm_data_example.output)
|
|
236
236
|
),
|
|
237
237
|
]
|
|
238
238
|
)
|
|
@@ -271,7 +271,7 @@ def _check_and_log_missing_validation_dataset_command_coverage(
|
|
|
271
271
|
structlogger.warning(
|
|
272
272
|
"llm_fine_tuning.train_test_split_module.missing_commands_in_validation_dat"
|
|
273
273
|
"aset",
|
|
274
|
-
missing_commands=missing_commands,
|
|
274
|
+
missing_commands=[command.__name__ for command in missing_commands],
|
|
275
275
|
)
|
|
276
276
|
|
|
277
277
|
|
rasa/markers/marker.py
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from typing import List, Optional, Text
|
|
3
3
|
|
|
4
|
-
from rasa.shared.core.domain import Domain
|
|
5
|
-
from rasa.shared.core.events import ActionExecuted, Event, SlotSet, UserUttered
|
|
6
|
-
|
|
7
4
|
from rasa.markers.marker_base import (
|
|
8
5
|
ConditionMarker,
|
|
9
6
|
Marker,
|
|
10
7
|
MarkerRegistry,
|
|
11
8
|
OperatorMarker,
|
|
12
9
|
)
|
|
10
|
+
from rasa.shared.core.domain import Domain
|
|
11
|
+
from rasa.shared.core.events import ActionExecuted, Event, SlotSet, UserUttered
|
|
13
12
|
|
|
14
13
|
logger = logging.getLogger(__name__)
|
|
15
14
|
|
rasa/markers/marker_base.py
CHANGED
|
@@ -6,9 +6,9 @@ from abc import ABC, abstractmethod
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from typing import (
|
|
9
|
-
ClassVar,
|
|
10
9
|
TYPE_CHECKING,
|
|
11
10
|
Any,
|
|
11
|
+
ClassVar,
|
|
12
12
|
Dict,
|
|
13
13
|
Iterator,
|
|
14
14
|
List,
|
|
@@ -30,7 +30,6 @@ from rasa.shared.core.domain import Domain
|
|
|
30
30
|
from rasa.shared.core.events import ActionExecuted, Event, UserUttered
|
|
31
31
|
from rasa.shared.exceptions import InvalidConfigException, RasaException
|
|
32
32
|
from rasa.utils.io import WriteRow
|
|
33
|
-
|
|
34
33
|
from rasa.utils.yaml import (
|
|
35
34
|
collect_configs_from_yaml_files,
|
|
36
35
|
collect_yaml_files_from_path,
|
rasa/markers/upload.py
CHANGED
|
@@ -3,10 +3,10 @@ from pathlib import Path
|
|
|
3
3
|
from typing import Any, Dict, List, Text
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
|
-
from rasa.shared.core.domain import Domain
|
|
7
|
-
from rasa.shared.utils.cli import print_error_and_exit
|
|
8
6
|
|
|
9
7
|
from rasa.markers.validate import validate_marker_file
|
|
8
|
+
from rasa.shared.core.domain import Domain
|
|
9
|
+
from rasa.shared.utils.cli import print_error_and_exit
|
|
10
10
|
from rasa.utils.yaml import (
|
|
11
11
|
YAML_CONFIGS,
|
|
12
12
|
collect_configs_from_yaml_files,
|
rasa/markers/validate.py
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
|
-
from rasa.shared.core.domain import Domain
|
|
4
|
-
from rasa.shared.utils.cli import print_error_and_exit
|
|
5
|
-
|
|
6
3
|
from rasa.markers.marker import OrMarker
|
|
7
4
|
from rasa.markers.marker_base import Marker
|
|
5
|
+
from rasa.shared.core.domain import Domain
|
|
6
|
+
from rasa.shared.utils.cli import print_error_and_exit
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
def validate_marker_file(domain: Domain, markers_path: Path) -> None:
|
rasa/model.py
CHANGED
|
@@ -3,13 +3,11 @@ import hashlib
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from subprocess import
|
|
7
|
-
from typing import
|
|
8
|
-
|
|
9
|
-
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
6
|
+
from subprocess import DEVNULL, CalledProcessError, check_output
|
|
7
|
+
from typing import Optional, Text, Union
|
|
10
8
|
|
|
11
9
|
from rasa.exceptions import ModelNotFound
|
|
12
|
-
|
|
10
|
+
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
13
11
|
|
|
14
12
|
logger = logging.getLogger(__name__)
|
|
15
13
|
|
rasa/model_manager/config.py
CHANGED
rasa/model_manager/model_api.py
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
from functools import wraps
|
|
3
2
|
import os
|
|
3
|
+
from functools import wraps
|
|
4
4
|
from http import HTTPStatus
|
|
5
5
|
from typing import Any, Callable, Dict, Optional, Union
|
|
6
|
+
|
|
6
7
|
import dotenv
|
|
7
8
|
import psutil
|
|
9
|
+
import structlog
|
|
8
10
|
from sanic import Blueprint, Sanic, response
|
|
9
|
-
from sanic.response import json
|
|
10
11
|
from sanic.exceptions import NotFound
|
|
11
12
|
from sanic.request import Request
|
|
12
|
-
import
|
|
13
|
+
from sanic.response import json
|
|
13
14
|
from socketio import AsyncServer
|
|
14
15
|
|
|
16
|
+
from rasa.constants import MODEL_ARCHIVE_EXTENSION
|
|
15
17
|
from rasa.exceptions import ModelNotFound
|
|
16
18
|
from rasa.model_manager import config
|
|
17
19
|
from rasa.model_manager.config import SERVER_BASE_URL
|
|
18
|
-
from rasa.constants import MODEL_ARCHIVE_EXTENSION
|
|
19
20
|
from rasa.model_manager.runner_service import (
|
|
20
21
|
BotSession,
|
|
21
22
|
BotSessionStatus,
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import shutil
|
|
3
|
+
import subprocess
|
|
4
|
+
from enum import Enum
|
|
3
5
|
from typing import Dict, Optional
|
|
6
|
+
|
|
4
7
|
import aiohttp
|
|
5
8
|
import structlog
|
|
6
|
-
import subprocess
|
|
7
9
|
from pydantic import BaseModel, ConfigDict
|
|
8
|
-
from enum import Enum
|
|
9
10
|
|
|
11
|
+
from rasa.constants import MODEL_ARCHIVE_EXTENSION
|
|
10
12
|
from rasa.exceptions import ModelNotFound
|
|
13
|
+
from rasa.model_manager import config
|
|
11
14
|
from rasa.model_manager.utils import (
|
|
15
|
+
logs_path,
|
|
12
16
|
models_base_path,
|
|
13
17
|
subpath,
|
|
14
18
|
write_encoded_data_to_file,
|
|
15
19
|
)
|
|
16
|
-
from rasa.constants import MODEL_ARCHIVE_EXTENSION
|
|
17
|
-
|
|
18
|
-
from rasa.model_manager import config
|
|
19
|
-
from rasa.model_manager.utils import logs_path
|
|
20
20
|
from rasa.model_manager.warm_rasa_process import start_rasa_process
|
|
21
21
|
|
|
22
22
|
structlogger = structlog.get_logger()
|
|
@@ -258,10 +258,13 @@ def run_bot(
|
|
|
258
258
|
|
|
259
259
|
async def update_bot_status(bot: BotSession) -> None:
|
|
260
260
|
"""Update the status of a bot based on the process return code."""
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
261
|
+
try:
|
|
262
|
+
if bot.has_died_recently():
|
|
263
|
+
set_bot_status_to_stopped(bot)
|
|
264
|
+
elif await bot.completed_startup_recently():
|
|
265
|
+
set_bot_status_to_running(bot)
|
|
266
|
+
except Exception as e:
|
|
267
|
+
structlogger.error("model_runner.update_bot_status.error", error=str(e))
|
|
265
268
|
|
|
266
269
|
|
|
267
270
|
def terminate_bot(bot: BotSession) -> None:
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import json
|
|
1
2
|
from typing import Any, Dict, Optional
|
|
2
3
|
|
|
3
|
-
from socketio import AsyncServer
|
|
4
4
|
import structlog
|
|
5
|
+
from socketio import AsyncServer
|
|
5
6
|
from socketio.asyncio_client import AsyncClient
|
|
7
|
+
from socketio.exceptions import ConnectionRefusedError
|
|
6
8
|
|
|
7
9
|
from rasa.model_manager.runner_service import BotSession
|
|
8
10
|
from rasa.model_manager.studio_jwt_auth import (
|
|
@@ -28,7 +30,7 @@ async def socketio_websocket_traffic_wrapper(
|
|
|
28
30
|
|
|
29
31
|
if auth_token is None:
|
|
30
32
|
structlogger.error("model_runner.user_no_token", sid=sid)
|
|
31
|
-
|
|
33
|
+
raise ConnectionRefusedError("model_runner.user_no_token")
|
|
32
34
|
|
|
33
35
|
try:
|
|
34
36
|
authenticate_user_to_service(auth_token)
|
|
@@ -37,22 +39,22 @@ async def socketio_websocket_traffic_wrapper(
|
|
|
37
39
|
structlogger.error(
|
|
38
40
|
"model_runner.user_authentication_failed", sid=sid, error=str(error)
|
|
39
41
|
)
|
|
40
|
-
|
|
42
|
+
raise ConnectionRefusedError("model_runner.user_authentication_failed")
|
|
41
43
|
|
|
42
44
|
deployment_id = auth.get("deployment_id") if auth else None
|
|
43
45
|
|
|
44
46
|
if deployment_id is None:
|
|
45
47
|
structlogger.error("model_runner.bot_no_deployment_id", sid=sid)
|
|
46
|
-
|
|
48
|
+
raise ConnectionRefusedError("model_runner.bot_no_deployment_id")
|
|
47
49
|
|
|
48
50
|
bot = running_bots.get(deployment_id)
|
|
49
51
|
if bot is None:
|
|
50
52
|
structlogger.error("model_runner.bot_not_found", deployment_id=deployment_id)
|
|
51
|
-
|
|
53
|
+
raise ConnectionRefusedError("model_runner.bot_not_found")
|
|
52
54
|
|
|
53
55
|
if not bot.is_alive():
|
|
54
56
|
structlogger.error("model_runner.bot_not_alive", deployment_id=deployment_id)
|
|
55
|
-
|
|
57
|
+
raise ConnectionRefusedError("model_runner.bot_not_alive")
|
|
56
58
|
|
|
57
59
|
client = await create_bridge_client(sio, bot.internal_url, sid, deployment_id)
|
|
58
60
|
|
|
@@ -66,7 +68,7 @@ async def socketio_websocket_traffic_wrapper(
|
|
|
66
68
|
structlogger.error(
|
|
67
69
|
"model_runner.bot_connection_failed", deployment_id=deployment_id
|
|
68
70
|
)
|
|
69
|
-
|
|
71
|
+
raise ConnectionRefusedError("model_runner.bot_connection_failed")
|
|
70
72
|
|
|
71
73
|
|
|
72
74
|
def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession]) -> None:
|
|
@@ -92,7 +94,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
|
|
|
92
94
|
|
|
93
95
|
@sio.on("*")
|
|
94
96
|
async def handle_message(event: str, sid: str, data: Dict[str, Any]) -> None:
|
|
95
|
-
"""
|
|
97
|
+
"""Bridge messages between user and bot.
|
|
96
98
|
|
|
97
99
|
Both incoming user messages to the bot_url and
|
|
98
100
|
bot responses sent back to the client need to
|
|
@@ -111,7 +113,7 @@ async def create_bridge_client(
|
|
|
111
113
|
) -> AsyncClient:
|
|
112
114
|
"""Create a new socket bridge client.
|
|
113
115
|
|
|
114
|
-
Forwards messages
|
|
116
|
+
Forwards messages coming from the bot to the user.
|
|
115
117
|
"""
|
|
116
118
|
client = AsyncClient()
|
|
117
119
|
|
|
@@ -129,6 +131,10 @@ async def create_bridge_client(
|
|
|
129
131
|
structlogger.debug("model_runner.bot_message", deployment_id=deployment_id)
|
|
130
132
|
await sio.emit("bot_message", data, room=sid)
|
|
131
133
|
|
|
134
|
+
@client.event # type: ignore[misc]
|
|
135
|
+
async def tracker(data: Dict[str, Any]) -> None:
|
|
136
|
+
await sio.emit("tracker", json.loads(data), room=sid)
|
|
137
|
+
|
|
132
138
|
@client.event # type: ignore[misc]
|
|
133
139
|
async def disconnect() -> None:
|
|
134
140
|
structlogger.debug(
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Any, Dict, Optional
|
|
3
2
|
import shutil
|
|
4
|
-
import structlog
|
|
5
3
|
import subprocess
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Any, Dict, Optional
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
from pydantic import BaseModel, ConfigDict
|
|
9
|
+
|
|
6
10
|
from rasa.constants import MODEL_ARCHIVE_EXTENSION
|
|
11
|
+
from rasa.model_manager import config
|
|
7
12
|
from rasa.model_manager.utils import (
|
|
13
|
+
ensure_base_directory_exists,
|
|
14
|
+
logs_path,
|
|
8
15
|
models_base_path,
|
|
9
16
|
subpath,
|
|
10
17
|
write_encoded_data_to_file,
|
|
11
18
|
)
|
|
12
|
-
from pydantic import BaseModel, ConfigDict
|
|
13
|
-
from enum import Enum
|
|
14
|
-
|
|
15
|
-
from rasa.model_manager import config
|
|
16
19
|
from rasa.model_manager.warm_rasa_process import (
|
|
17
20
|
start_rasa_process,
|
|
18
21
|
)
|
|
19
22
|
from rasa.model_training import generate_random_model_name
|
|
20
|
-
from rasa.model_manager.utils import ensure_base_directory_exists, logs_path
|
|
21
23
|
|
|
22
24
|
structlogger = structlog.get_logger()
|
|
23
25
|
|
rasa/model_manager/utils.py
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import shlex
|
|
2
3
|
import subprocess
|
|
3
|
-
|
|
4
|
-
import
|
|
4
|
+
import uuid
|
|
5
|
+
from dataclasses import dataclass
|
|
5
6
|
from typing import List
|
|
7
|
+
|
|
6
8
|
import structlog
|
|
7
|
-
from dataclasses import dataclass
|
|
8
|
-
import uuid
|
|
9
9
|
|
|
10
|
+
from rasa.__main__ import main
|
|
11
|
+
from rasa.dialogue_understanding.constants import (
|
|
12
|
+
RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME,
|
|
13
|
+
)
|
|
10
14
|
from rasa.model_manager import config
|
|
11
15
|
from rasa.model_manager.utils import ensure_base_directory_exists, logs_path
|
|
12
16
|
|
|
@@ -42,7 +46,7 @@ def _create_warm_rasa_process() -> WarmRasaProcess:
|
|
|
42
46
|
]
|
|
43
47
|
|
|
44
48
|
envs = os.environ.copy()
|
|
45
|
-
envs[
|
|
49
|
+
envs[RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME] = "true"
|
|
46
50
|
|
|
47
51
|
log_id = uuid.uuid4().hex
|
|
48
52
|
log_path = logs_path(log_id)
|
|
@@ -146,14 +150,15 @@ def warmup() -> None:
|
|
|
146
150
|
directly start.
|
|
147
151
|
"""
|
|
148
152
|
try:
|
|
149
|
-
import presidio_analyzer # noqa: F401
|
|
150
|
-
import litellm # noqa: F401
|
|
151
153
|
import langchain # noqa: F401
|
|
152
|
-
import
|
|
154
|
+
import litellm # noqa: F401
|
|
153
155
|
import matplotlib # noqa: F401
|
|
154
|
-
import pandas # noqa: F401
|
|
155
156
|
import numpy # noqa: F401
|
|
157
|
+
import pandas # noqa: F401
|
|
158
|
+
import presidio_analyzer # noqa: F401
|
|
156
159
|
import spacy # noqa: F401
|
|
160
|
+
import tensorflow # noqa: F401
|
|
161
|
+
|
|
157
162
|
import rasa.validator # noqa: F401
|
|
158
163
|
except ImportError:
|
|
159
164
|
pass
|
rasa/model_service.py
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
from urllib.parse import urlparse
|
|
2
3
|
|
|
3
|
-
from sanic import Sanic
|
|
4
4
|
import structlog
|
|
5
|
+
from sanic import Sanic
|
|
5
6
|
|
|
6
7
|
from rasa.cli.scaffold import print_error_and_exit
|
|
7
8
|
from rasa.core.persistor import RemoteStorageType, get_persistor
|
|
8
9
|
from rasa.core.utils import list_routes
|
|
9
|
-
from rasa.model_manager import model_api
|
|
10
|
-
from rasa.model_manager import config
|
|
10
|
+
from rasa.model_manager import config, model_api
|
|
11
11
|
from rasa.model_manager.config import SERVER_BASE_URL, SERVER_PORT
|
|
12
12
|
from rasa.utils.common import configure_logging_and_warnings
|
|
13
|
-
import rasa.utils.licensing
|
|
14
|
-
from urllib.parse import urlparse
|
|
15
|
-
|
|
16
13
|
from rasa.utils.log_utils import configure_structlog
|
|
17
14
|
from rasa.utils.sanic_error_handler import register_custom_sanic_error_handler
|
|
18
15
|
|
|
@@ -64,6 +61,8 @@ def main() -> None:
|
|
|
64
61
|
The API server can receive requests to train models, run bots, and manage
|
|
65
62
|
the lifecycle of models and bots.
|
|
66
63
|
"""
|
|
64
|
+
import rasa.utils.licensing
|
|
65
|
+
|
|
67
66
|
log_level = logging.DEBUG
|
|
68
67
|
configure_logging_and_warnings(
|
|
69
68
|
log_level=log_level,
|