rasa-pro 3.11.5__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 +135 -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/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +1 -0
- 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 +5 -0
- 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 +9 -9
- 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 +3 -2
- 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.5.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/channel-e265ea59.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
- rasa_pro-3.11.5.dist-info/RECORD +0 -785
- /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import asyncio
|
|
3
|
+
import datetime
|
|
4
|
+
import importlib
|
|
5
|
+
import sys
|
|
6
|
+
from typing import Any, Dict, List, Optional, Type, cast
|
|
7
|
+
|
|
8
|
+
import structlog
|
|
9
|
+
|
|
10
|
+
import rasa.cli.utils
|
|
11
|
+
import rasa.shared.utils.cli
|
|
12
|
+
from rasa.cli import SubParsersAction
|
|
13
|
+
from rasa.cli.arguments.default_arguments import (
|
|
14
|
+
add_endpoint_param,
|
|
15
|
+
add_model_param,
|
|
16
|
+
add_remote_storage_param,
|
|
17
|
+
)
|
|
18
|
+
from rasa.core.agent import Agent
|
|
19
|
+
from rasa.core.exceptions import AgentNotReady
|
|
20
|
+
from rasa.core.processor import MessageProcessor
|
|
21
|
+
from rasa.core.utils import AvailableEndpoints
|
|
22
|
+
from rasa.dialogue_understanding.commands import Command
|
|
23
|
+
from rasa.dialogue_understanding.generator import LLMBasedCommandGenerator
|
|
24
|
+
from rasa.dialogue_understanding.generator.command_parser import DEFAULT_COMMANDS
|
|
25
|
+
from rasa.dialogue_understanding_test.command_metric_calculation import (
|
|
26
|
+
calculate_command_metrics,
|
|
27
|
+
)
|
|
28
|
+
from rasa.dialogue_understanding_test.constants import (
|
|
29
|
+
DEFAULT_INPUT_TESTS_PATH,
|
|
30
|
+
KEY_STUB_CUSTOM_ACTIONS,
|
|
31
|
+
)
|
|
32
|
+
from rasa.dialogue_understanding_test.du_test_result import (
|
|
33
|
+
DialogueUnderstandingTestResult,
|
|
34
|
+
DialogueUnderstandingTestSuiteResult,
|
|
35
|
+
)
|
|
36
|
+
from rasa.dialogue_understanding_test.du_test_runner import (
|
|
37
|
+
DialogueUnderstandingTestRunner,
|
|
38
|
+
)
|
|
39
|
+
from rasa.dialogue_understanding_test.io import (
|
|
40
|
+
read_test_suite,
|
|
41
|
+
write_test_results_to_file,
|
|
42
|
+
)
|
|
43
|
+
from rasa.dialogue_understanding_test.validation import (
|
|
44
|
+
validate_cli_arguments,
|
|
45
|
+
validate_test_cases,
|
|
46
|
+
)
|
|
47
|
+
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
48
|
+
from rasa.exceptions import RasaException
|
|
49
|
+
from rasa.shared.constants import (
|
|
50
|
+
DEFAULT_ENDPOINTS_PATH,
|
|
51
|
+
LLM_CONFIG_KEY,
|
|
52
|
+
ROUTE_TO_CALM_SLOT,
|
|
53
|
+
)
|
|
54
|
+
from rasa.shared.core.domain import Domain
|
|
55
|
+
from rasa.shared.core.flows import FlowsList
|
|
56
|
+
from rasa.shared.utils.llm import (
|
|
57
|
+
combine_custom_and_default_config,
|
|
58
|
+
resolve_model_client_config,
|
|
59
|
+
)
|
|
60
|
+
from rasa.utils.beta import ensure_beta_feature_is_enabled
|
|
61
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
62
|
+
|
|
63
|
+
RASA_PRO_BETA_DIALOGUE_UNDERSTANDING_TEST_ENV_VAR_NAME = (
|
|
64
|
+
"RASA_PRO_BETA_DIALOGUE_UNDERSTANDING_TEST"
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
structlogger = structlog.get_logger()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def add_subparser(
|
|
71
|
+
subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
|
|
72
|
+
) -> None:
|
|
73
|
+
"""Add the dialogue understanding test subparser to `rasa test`.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
subparsers: subparser we are going to attach to
|
|
77
|
+
parents: Parent parsers, needed to ensure tree structure in argparse
|
|
78
|
+
"""
|
|
79
|
+
for subparser in subparsers.choices.values():
|
|
80
|
+
if subparser.prog == "rasa test":
|
|
81
|
+
du_test_subparser = create_du_test_subparser(parents)
|
|
82
|
+
|
|
83
|
+
for action in subparser._subparsers._actions:
|
|
84
|
+
if action.choices is not None:
|
|
85
|
+
action.choices["du"] = du_test_subparser
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
# If we get here, we couldn't hook the subparser to `rasa test`
|
|
89
|
+
raise RasaException(
|
|
90
|
+
"Hooking the dialogue understanding (du) test subparser to "
|
|
91
|
+
"`rasa test` command could not be completed. "
|
|
92
|
+
"Cannot run dialogue understanding testing."
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def create_du_test_subparser(
|
|
97
|
+
parents: List[argparse.ArgumentParser],
|
|
98
|
+
) -> argparse.ArgumentParser:
|
|
99
|
+
"""Create dialogue understanding test subparser."""
|
|
100
|
+
du_test_subparser = argparse.ArgumentParser(
|
|
101
|
+
prog="rasa test du",
|
|
102
|
+
parents=parents,
|
|
103
|
+
conflict_handler="resolve",
|
|
104
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
105
|
+
description="Runs dialogue understanding testing.",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
du_test_subparser.set_defaults(func=execute_dialogue_understanding_tests)
|
|
109
|
+
|
|
110
|
+
add_du_test_arguments(du_test_subparser)
|
|
111
|
+
add_bot_arguments(du_test_subparser)
|
|
112
|
+
|
|
113
|
+
return du_test_subparser
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def add_bot_arguments(parser: argparse.ArgumentParser) -> None:
|
|
117
|
+
bot_arguments = parser.add_argument_group("Bot Settings")
|
|
118
|
+
add_model_param(bot_arguments, add_positional_arg=False)
|
|
119
|
+
add_endpoint_param(
|
|
120
|
+
bot_arguments,
|
|
121
|
+
help_text="Configuration file for the model server and the connectors as a "
|
|
122
|
+
"yml file.",
|
|
123
|
+
)
|
|
124
|
+
add_remote_storage_param(bot_arguments)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def add_du_test_arguments(parser: argparse.ArgumentParser) -> None:
|
|
128
|
+
"""Arguments for running dialogue understanding tests."""
|
|
129
|
+
du_arguments = parser.add_argument_group("Testing Settings")
|
|
130
|
+
du_arguments.add_argument(
|
|
131
|
+
"path-to-test-cases",
|
|
132
|
+
nargs="?",
|
|
133
|
+
type=str,
|
|
134
|
+
default=DEFAULT_INPUT_TESTS_PATH,
|
|
135
|
+
help="Input file or folder containing dialogue understanding test cases.",
|
|
136
|
+
)
|
|
137
|
+
du_arguments.add_argument(
|
|
138
|
+
"--output-file",
|
|
139
|
+
type=str,
|
|
140
|
+
default="dialogue_understanding_test_{date:%Y%m%d-%H%M%S}.yml".format(
|
|
141
|
+
date=datetime.datetime.now()
|
|
142
|
+
),
|
|
143
|
+
help="Path to the output file to write the results to.",
|
|
144
|
+
)
|
|
145
|
+
du_arguments.add_argument(
|
|
146
|
+
"--no-output",
|
|
147
|
+
action="store_true",
|
|
148
|
+
help="If set, no output file will be written to disk.",
|
|
149
|
+
)
|
|
150
|
+
du_arguments.add_argument(
|
|
151
|
+
"--output-prompt",
|
|
152
|
+
action="store_true",
|
|
153
|
+
help="If set, the dialogue understanding test output will contain "
|
|
154
|
+
"prompts for each failure.",
|
|
155
|
+
)
|
|
156
|
+
du_arguments.add_argument(
|
|
157
|
+
"--additional-commands",
|
|
158
|
+
type=str,
|
|
159
|
+
nargs="*",
|
|
160
|
+
help=(
|
|
161
|
+
"List of additional custom command classes to add, separated by spaces. "
|
|
162
|
+
"For example: --additional-commands my_module.MyCustomCommand"
|
|
163
|
+
),
|
|
164
|
+
)
|
|
165
|
+
du_arguments.add_argument(
|
|
166
|
+
"--remove-default-commands",
|
|
167
|
+
type=str,
|
|
168
|
+
nargs="*",
|
|
169
|
+
help=(
|
|
170
|
+
f"List of default commands to remove, separated by spaces. "
|
|
171
|
+
f"Default commands include: "
|
|
172
|
+
f"{', '.join([command.__name__ for command in DEFAULT_COMMANDS])}. "
|
|
173
|
+
f"For example: --remove-default-commands ClarifyCommand HumanHandoffCommand"
|
|
174
|
+
),
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def ensure_calm_only_bot(agent: Agent) -> None:
|
|
179
|
+
if agent.domain is None or agent.processor is None:
|
|
180
|
+
return
|
|
181
|
+
|
|
182
|
+
if ROUTE_TO_CALM_SLOT in [slot.name for slot in agent.domain.slots]:
|
|
183
|
+
rasa.shared.utils.cli.print_error(
|
|
184
|
+
"You are using coexistence. Dialogue Understanding Tests do only work for "
|
|
185
|
+
"CALM only assistants."
|
|
186
|
+
)
|
|
187
|
+
sys.exit(0)
|
|
188
|
+
|
|
189
|
+
if not agent.processor.is_calm_assistant:
|
|
190
|
+
rasa.shared.utils.cli.print_error(
|
|
191
|
+
"Dialogue Understanding Tests do only work for CALM assistants. "
|
|
192
|
+
"Your assistant does not use CALM."
|
|
193
|
+
)
|
|
194
|
+
sys.exit(0)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def execute_dialogue_understanding_tests(args: argparse.Namespace) -> None:
|
|
198
|
+
"""Run the dialogue understanding tests.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
args: Commandline arguments.
|
|
202
|
+
"""
|
|
203
|
+
ensure_beta_feature_is_enabled(
|
|
204
|
+
"Dialogue Understanding (DU) Testing",
|
|
205
|
+
env_flag=RASA_PRO_BETA_DIALOGUE_UNDERSTANDING_TEST_ENV_VAR_NAME,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# basic validation of the passed CLI arguments
|
|
209
|
+
validate_cli_arguments(args)
|
|
210
|
+
|
|
211
|
+
# initialization of endpoints
|
|
212
|
+
endpoints = set_up_available_endpoints(args)
|
|
213
|
+
|
|
214
|
+
# set up the test runner, e.g. start the agent
|
|
215
|
+
try:
|
|
216
|
+
test_runner = DialogueUnderstandingTestRunner(
|
|
217
|
+
endpoints=endpoints,
|
|
218
|
+
model_path=args.model,
|
|
219
|
+
model_server=endpoints.model,
|
|
220
|
+
remote_storage=args.remote_storage,
|
|
221
|
+
)
|
|
222
|
+
except AgentNotReady as error:
|
|
223
|
+
structlogger.error(
|
|
224
|
+
"rasa.dialogue_understanding_test.agent_not_ready", message=error.message
|
|
225
|
+
)
|
|
226
|
+
sys.exit(1)
|
|
227
|
+
|
|
228
|
+
# Exit if the bot is not calm only
|
|
229
|
+
ensure_calm_only_bot(test_runner.agent)
|
|
230
|
+
|
|
231
|
+
# Ensure processor is not None so that we can extract the flows and the llm config
|
|
232
|
+
if test_runner.agent.processor is None:
|
|
233
|
+
rasa.shared.utils.cli.print_error(
|
|
234
|
+
"No processor: Not able to retrieve flows and config from trained model."
|
|
235
|
+
)
|
|
236
|
+
sys.exit(0)
|
|
237
|
+
|
|
238
|
+
# flows are needed in order to parse the commands when reading the test cases
|
|
239
|
+
flows = asyncio.run(test_runner.agent.processor.get_flows())
|
|
240
|
+
# llm config is needed for instrumentation
|
|
241
|
+
llm_config = _get_llm_command_generator_config(test_runner.agent.processor)
|
|
242
|
+
|
|
243
|
+
# read test cases from the given path
|
|
244
|
+
test_suite: TestSuite = get_valid_test_suite(args, flows, test_runner.agent.domain)
|
|
245
|
+
|
|
246
|
+
# setup stub custom actions if they are used
|
|
247
|
+
set_up_stub_custom_actions(test_suite, endpoints)
|
|
248
|
+
|
|
249
|
+
# run the actual test cases
|
|
250
|
+
test_results = asyncio.run(
|
|
251
|
+
test_runner.run_test_cases(
|
|
252
|
+
test_suite.test_cases, test_suite.fixtures, test_suite.metadata
|
|
253
|
+
)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
# evaluate test results
|
|
257
|
+
passing_test_results, failing_test_results = split_test_results(test_results)
|
|
258
|
+
command_metrics = calculate_command_metrics(test_results)
|
|
259
|
+
|
|
260
|
+
test_suite_result = DialogueUnderstandingTestSuiteResult.from_results(
|
|
261
|
+
failing_test_results, passing_test_results, command_metrics, llm_config
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Do not move this import to the top of the file as it will break the
|
|
265
|
+
# instrumentation of this function: the CLI module is initialized before the
|
|
266
|
+
# instrumentation is set up, and we won't be able to "replace" the function
|
|
267
|
+
# with the instrumented wrapper
|
|
268
|
+
from rasa.dialogue_understanding_test.io import print_test_results
|
|
269
|
+
|
|
270
|
+
# write results to console and file
|
|
271
|
+
print_test_results(test_suite_result, output_prompt=args.output_prompt)
|
|
272
|
+
if not args.no_output:
|
|
273
|
+
write_test_results_to_file(
|
|
274
|
+
test_suite_result,
|
|
275
|
+
args.output_file,
|
|
276
|
+
args.output_prompt,
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _import_custom_command_class(class_path: str) -> Command:
|
|
281
|
+
"""Dynamically import a command class from a string path."""
|
|
282
|
+
try:
|
|
283
|
+
module_name, class_name = class_path.rsplit(".", 1)
|
|
284
|
+
module = importlib.import_module(module_name)
|
|
285
|
+
clz = getattr(module, class_name)
|
|
286
|
+
except (ImportError, AttributeError, ValueError) as e:
|
|
287
|
+
raise ValueError(f"Failed to import class '{class_path}': {e}")
|
|
288
|
+
if not issubclass(clz, Command):
|
|
289
|
+
structlogger.error(
|
|
290
|
+
"rasa.dialogue_understanding_test.invalid_additional_command",
|
|
291
|
+
event_info="The custom command class must be a subclass of Command.",
|
|
292
|
+
class_path=class_path,
|
|
293
|
+
)
|
|
294
|
+
sys.exit(1)
|
|
295
|
+
return clz
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _extract_additional_command_classes_from_cli_args(
|
|
299
|
+
args: argparse.Namespace,
|
|
300
|
+
) -> List[Command]:
|
|
301
|
+
"""Extract additional command classes from the CLI arguments."""
|
|
302
|
+
additional_commands = getattr(args, "additional_commands", [])
|
|
303
|
+
if not additional_commands:
|
|
304
|
+
return []
|
|
305
|
+
return [
|
|
306
|
+
_import_custom_command_class(command_module)
|
|
307
|
+
for command_module in additional_commands
|
|
308
|
+
]
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def get_valid_test_suite(
|
|
312
|
+
args: argparse.Namespace, flows: FlowsList, domain: Optional[Domain]
|
|
313
|
+
) -> TestSuite:
|
|
314
|
+
"""Read the test cases from the given test case path and validate them."""
|
|
315
|
+
path_to_test_cases = getattr(args, "path-to-test-cases", DEFAULT_INPUT_TESTS_PATH)
|
|
316
|
+
remove_default_commands = getattr(args, "remove_default_commands", [])
|
|
317
|
+
custom_command_classes = _extract_additional_command_classes_from_cli_args(args)
|
|
318
|
+
test_suite = read_test_suite(
|
|
319
|
+
path_to_test_cases, flows, custom_command_classes, remove_default_commands
|
|
320
|
+
)
|
|
321
|
+
validate_test_cases(test_suite.test_cases, domain)
|
|
322
|
+
return test_suite
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def set_up_available_endpoints(args: argparse.Namespace) -> AvailableEndpoints:
|
|
326
|
+
"""Set up the available endpoints for the test runner."""
|
|
327
|
+
args.endpoints = rasa.cli.utils.get_validated_path(
|
|
328
|
+
args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
|
|
329
|
+
)
|
|
330
|
+
endpoints = AvailableEndpoints.get_instance(args.endpoints)
|
|
331
|
+
|
|
332
|
+
# Ignore all endpoints apart from action server, model, and nlu
|
|
333
|
+
# to ensure InMemoryTrackerStore is being used instead of production
|
|
334
|
+
# tracker store
|
|
335
|
+
endpoints.tracker_store = None
|
|
336
|
+
endpoints.lock_store = None
|
|
337
|
+
endpoints.event_broker = None
|
|
338
|
+
|
|
339
|
+
# disable nlg endpoint as we don't need it for dialogue understanding tests
|
|
340
|
+
endpoints.nlg = None
|
|
341
|
+
|
|
342
|
+
return endpoints
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def set_up_stub_custom_actions(
|
|
346
|
+
test_suite: TestSuite, endpoints: AvailableEndpoints
|
|
347
|
+
) -> None:
|
|
348
|
+
"""Set up the stub custom actions if they are used."""
|
|
349
|
+
if test_suite.stub_custom_actions:
|
|
350
|
+
if not endpoints.action:
|
|
351
|
+
endpoints.action = EndpointConfig()
|
|
352
|
+
|
|
353
|
+
endpoints.action.kwargs[KEY_STUB_CUSTOM_ACTIONS] = (
|
|
354
|
+
test_suite.stub_custom_actions
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def split_test_results(
|
|
359
|
+
results: List[DialogueUnderstandingTestResult],
|
|
360
|
+
) -> tuple[
|
|
361
|
+
List[DialogueUnderstandingTestResult], List[DialogueUnderstandingTestResult]
|
|
362
|
+
]:
|
|
363
|
+
"""Split the test results into passed and failed test cases."""
|
|
364
|
+
passed_cases = [r for r in results if r.passed]
|
|
365
|
+
failed_cases = [r for r in results if not r.passed]
|
|
366
|
+
|
|
367
|
+
return passed_cases, failed_cases
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def _get_llm_command_generator_config(
|
|
371
|
+
processor: MessageProcessor,
|
|
372
|
+
) -> Optional[Dict[str, Any]]:
|
|
373
|
+
train_schema = processor.model_metadata.train_schema
|
|
374
|
+
|
|
375
|
+
for node_name, node in train_schema.nodes.items():
|
|
376
|
+
if node.matches_type(LLMBasedCommandGenerator, include_subtypes=True):
|
|
377
|
+
# Configurations can reference model groups defined in the endpoints.yml
|
|
378
|
+
resolved_llm_config = resolve_model_client_config(
|
|
379
|
+
node.config.get(LLM_CONFIG_KEY, {}), node_name
|
|
380
|
+
)
|
|
381
|
+
llm_command_generator = cast(Type[LLMBasedCommandGenerator], node.uses)
|
|
382
|
+
return combine_custom_and_default_config(
|
|
383
|
+
resolved_llm_config, llm_command_generator.get_default_llm_config()
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
return None
|
rasa/cli/evaluate.py
CHANGED
rasa/cli/export.py
CHANGED
|
@@ -2,23 +2,23 @@ import argparse
|
|
|
2
2
|
import asyncio
|
|
3
3
|
import logging
|
|
4
4
|
import typing
|
|
5
|
-
from typing import List,
|
|
5
|
+
from typing import List, Optional, Text
|
|
6
6
|
|
|
7
|
-
from rasa import telemetry
|
|
8
|
-
from rasa.cli import SubParsersAction
|
|
9
7
|
import rasa.core.utils
|
|
10
8
|
import rasa.shared.utils.cli
|
|
11
9
|
import rasa.utils.common
|
|
10
|
+
from rasa import telemetry
|
|
11
|
+
from rasa.cli import SubParsersAction
|
|
12
12
|
from rasa.cli.arguments import export as arguments
|
|
13
|
-
from rasa.
|
|
13
|
+
from rasa.core.brokers.pika import PikaEventBroker
|
|
14
14
|
from rasa.exceptions import PublishingError
|
|
15
|
+
from rasa.shared.constants import DOCS_URL_EVENT_BROKERS, DOCS_URL_TRACKER_STORES
|
|
15
16
|
from rasa.shared.exceptions import RasaException
|
|
16
|
-
from rasa.core.brokers.pika import PikaEventBroker
|
|
17
17
|
|
|
18
18
|
if typing.TYPE_CHECKING:
|
|
19
19
|
from rasa.core.brokers.broker import EventBroker
|
|
20
|
-
from rasa.core.tracker_store import TrackerStore
|
|
21
20
|
from rasa.core.exporter import Exporter
|
|
21
|
+
from rasa.core.tracker_store import TrackerStore
|
|
22
22
|
from rasa.core.utils import AvailableEndpoints
|
|
23
23
|
|
|
24
24
|
logger = logging.getLogger(__name__)
|
rasa/cli/inspect.py
CHANGED
|
@@ -9,6 +9,10 @@ from rasa import telemetry
|
|
|
9
9
|
from rasa.cli import SubParsersAction
|
|
10
10
|
from rasa.cli.arguments import shell as arguments
|
|
11
11
|
from rasa.core import constants
|
|
12
|
+
from rasa.engine.storage.local_model_storage import LocalModelStorage
|
|
13
|
+
from rasa.exceptions import ModelNotFound
|
|
14
|
+
from rasa.model import get_local_model
|
|
15
|
+
from rasa.shared.utils.cli import print_error
|
|
12
16
|
from rasa.utils.cli import remove_argument_from_parser
|
|
13
17
|
|
|
14
18
|
|
|
@@ -55,6 +59,8 @@ async def open_inspector_in_browser(server_url: Text, voice: bool = False) -> No
|
|
|
55
59
|
def inspect(args: argparse.Namespace) -> None:
|
|
56
60
|
"""Inspect the bot using the most recent model."""
|
|
57
61
|
import rasa.cli.run
|
|
62
|
+
from rasa.cli.utils import get_validated_path
|
|
63
|
+
from rasa.shared.constants import DEFAULT_MODELS_PATH
|
|
58
64
|
|
|
59
65
|
async def after_start_hook_open_inspector(_: Sanic, __: AbstractEventLoop) -> None:
|
|
60
66
|
"""Hook to open the browser on server start."""
|
|
@@ -71,5 +77,18 @@ def inspect(args: argparse.Namespace) -> None:
|
|
|
71
77
|
args.credentials = None
|
|
72
78
|
args.server_listeners = [(after_start_hook_open_inspector, "after_server_start")]
|
|
73
79
|
|
|
74
|
-
|
|
80
|
+
model = get_validated_path(args.model, "model", DEFAULT_MODELS_PATH)
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
model = get_local_model(model)
|
|
84
|
+
except ModelNotFound:
|
|
85
|
+
print_error(
|
|
86
|
+
"No model found. Train a model before running the "
|
|
87
|
+
"server using `rasa train`."
|
|
88
|
+
)
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
metadata = LocalModelStorage.metadata_from_archive(model)
|
|
92
|
+
|
|
93
|
+
telemetry.track_inspect_started(args.connector, metadata.assistant_id)
|
|
75
94
|
rasa.cli.run.run(args)
|
rasa/cli/interactive.py
CHANGED
|
@@ -4,11 +4,13 @@ import os
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import List, Optional, Text, Union
|
|
6
6
|
|
|
7
|
+
import rasa.cli.train as train
|
|
8
|
+
import rasa.cli.utils
|
|
9
|
+
import rasa.shared.utils.cli
|
|
10
|
+
import rasa.utils.common
|
|
7
11
|
from rasa import model
|
|
8
12
|
from rasa.cli import SubParsersAction
|
|
9
13
|
from rasa.cli.arguments import interactive as arguments
|
|
10
|
-
import rasa.cli.train as train
|
|
11
|
-
import rasa.cli.utils
|
|
12
14
|
from rasa.engine.storage.local_model_storage import LocalModelStorage
|
|
13
15
|
from rasa.shared.constants import (
|
|
14
16
|
ASSISTANT_ID_DEFAULT_VALUE,
|
|
@@ -18,9 +20,6 @@ from rasa.shared.constants import (
|
|
|
18
20
|
)
|
|
19
21
|
from rasa.shared.data import TrainingType
|
|
20
22
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
21
|
-
import rasa.shared.utils.cli
|
|
22
|
-
import rasa.utils.common
|
|
23
|
-
|
|
24
23
|
|
|
25
24
|
logger = logging.getLogger(__name__)
|
|
26
25
|
|
rasa/cli/llm_fine_tuning.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import asyncio
|
|
3
3
|
import sys
|
|
4
|
-
from typing import List,
|
|
4
|
+
from typing import Any, Dict, List, Type, cast
|
|
5
5
|
|
|
6
6
|
import structlog
|
|
7
7
|
|
|
@@ -16,13 +16,18 @@ from rasa.cli.arguments.default_arguments import (
|
|
|
16
16
|
add_remote_storage_param,
|
|
17
17
|
)
|
|
18
18
|
from rasa.cli.e2e_test import (
|
|
19
|
+
RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME,
|
|
19
20
|
read_test_cases,
|
|
20
21
|
validate_model_path,
|
|
21
|
-
RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME,
|
|
22
22
|
)
|
|
23
23
|
from rasa.core.exceptions import AgentNotReady
|
|
24
24
|
from rasa.core.utils import AvailableEndpoints
|
|
25
|
-
from rasa.dialogue_understanding.generator import
|
|
25
|
+
from rasa.dialogue_understanding.generator.llm_based_command_generator import (
|
|
26
|
+
LLMBasedCommandGenerator,
|
|
27
|
+
)
|
|
28
|
+
from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_generator import ( # noqa: E501
|
|
29
|
+
MultiStepLLMCommandGenerator,
|
|
30
|
+
)
|
|
26
31
|
from rasa.e2e_test.e2e_test_runner import E2ETestRunner
|
|
27
32
|
from rasa.llm_fine_tuning.annotation_module import annotate_e2e_tests
|
|
28
33
|
from rasa.llm_fine_tuning.llm_data_preparation_module import convert_to_fine_tuning_data
|
|
@@ -31,14 +36,14 @@ from rasa.llm_fine_tuning.paraphrasing.conversation_rephraser import (
|
|
|
31
36
|
)
|
|
32
37
|
from rasa.llm_fine_tuning.paraphrasing_module import create_paraphrased_conversations
|
|
33
38
|
from rasa.llm_fine_tuning.storage import (
|
|
39
|
+
FileStorageStrategy,
|
|
34
40
|
StorageContext,
|
|
35
41
|
StorageType,
|
|
36
|
-
FileStorageStrategy,
|
|
37
42
|
)
|
|
38
43
|
from rasa.llm_fine_tuning.train_test_split_module import (
|
|
39
|
-
split_llm_fine_tuning_data,
|
|
40
|
-
INSTRUCTION_DATA_FORMAT,
|
|
41
44
|
CONVERSATIONAL_DATA_FORMAT,
|
|
45
|
+
INSTRUCTION_DATA_FORMAT,
|
|
46
|
+
split_llm_fine_tuning_data,
|
|
42
47
|
)
|
|
43
48
|
from rasa.shared.constants import (
|
|
44
49
|
DEFAULT_ENDPOINTS_PATH,
|
|
@@ -112,7 +117,6 @@ def create_llm_finetune_data_preparation_subparser(
|
|
|
112
117
|
help_text="Configuration file for the model server and the connectors as a "
|
|
113
118
|
"yml file.",
|
|
114
119
|
)
|
|
115
|
-
|
|
116
120
|
return data_preparation_subparser
|
|
117
121
|
|
|
118
122
|
|
|
@@ -205,6 +209,9 @@ def prepare_llm_fine_tuning_data(args: argparse.Namespace) -> None:
|
|
|
205
209
|
|
|
206
210
|
flows = asyncio.run(e2e_test_runner.agent.processor.get_flows())
|
|
207
211
|
llm_command_generator_config = _get_llm_command_generator_config(e2e_test_runner)
|
|
212
|
+
llm_command_generator: Type[LLMBasedCommandGenerator] = _get_llm_command_generator(
|
|
213
|
+
e2e_test_runner
|
|
214
|
+
)
|
|
208
215
|
|
|
209
216
|
# set up storage context
|
|
210
217
|
storage_context = create_storage_context(StorageType.FILE, output_dir)
|
|
@@ -235,6 +242,7 @@ def prepare_llm_fine_tuning_data(args: argparse.Namespace) -> None:
|
|
|
235
242
|
rephrase_config,
|
|
236
243
|
args.num_rephrases,
|
|
237
244
|
flows,
|
|
245
|
+
llm_command_generator,
|
|
238
246
|
llm_command_generator_config,
|
|
239
247
|
storage_context,
|
|
240
248
|
)
|
|
@@ -271,30 +279,57 @@ def prepare_llm_fine_tuning_data(args: argparse.Namespace) -> None:
|
|
|
271
279
|
write_statistics(statistics, output_dir)
|
|
272
280
|
|
|
273
281
|
rasa.shared.utils.cli.print_success(
|
|
274
|
-
f"Data and intermediate results are written
|
|
282
|
+
f"Data and intermediate results are written to '{output_dir}'."
|
|
275
283
|
)
|
|
276
284
|
|
|
277
285
|
|
|
278
286
|
def _get_llm_command_generator_config(e2e_test_runner: E2ETestRunner) -> Dict[str, Any]:
|
|
279
|
-
from rasa.dialogue_understanding.generator.constants import DEFAULT_LLM_CONFIG
|
|
280
|
-
|
|
281
287
|
train_schema = e2e_test_runner.agent.processor.model_metadata.train_schema # type: ignore
|
|
282
288
|
|
|
283
289
|
for node_name, node in train_schema.nodes.items():
|
|
284
|
-
if node.matches_type(
|
|
290
|
+
if node.matches_type(
|
|
291
|
+
LLMBasedCommandGenerator, include_subtypes=True
|
|
292
|
+
) and not node.matches_type(
|
|
293
|
+
MultiStepLLMCommandGenerator, include_subtypes=True
|
|
294
|
+
):
|
|
285
295
|
# Configurations can reference model groups defined in the endpoints.yml
|
|
286
|
-
|
|
296
|
+
resolved_llm_config = resolve_model_client_config(
|
|
287
297
|
node.config.get(LLM_CONFIG_KEY, {}), node_name
|
|
288
298
|
)
|
|
299
|
+
llm_command_generator = cast(Type[LLMBasedCommandGenerator], node.uses)
|
|
289
300
|
return combine_custom_and_default_config(
|
|
290
|
-
|
|
301
|
+
resolved_llm_config, llm_command_generator.get_default_llm_config()
|
|
291
302
|
)
|
|
292
303
|
|
|
293
304
|
rasa.shared.utils.cli.print_error(
|
|
294
305
|
"The provided model is not trained using 'SingleStepLLMCommandGenerator' or "
|
|
295
|
-
"its subclasses. Without it, no data for
|
|
296
|
-
"resolve this, please include
|
|
297
|
-
"
|
|
306
|
+
"'CompactLLMCommandGenerator' or its subclasses. Without it, no data for "
|
|
307
|
+
"fine-tuning can be generated. To resolve this, please include "
|
|
308
|
+
"'SingleStepLLMCommandGenerator' or 'CompactLLMCommandGenerator' or its "
|
|
309
|
+
"subclasses in your config and train your model."
|
|
310
|
+
)
|
|
311
|
+
sys.exit(1)
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def _get_llm_command_generator(
|
|
315
|
+
e2e_test_runner: E2ETestRunner,
|
|
316
|
+
) -> Type[LLMBasedCommandGenerator]:
|
|
317
|
+
train_schema = e2e_test_runner.agent.processor.model_metadata.train_schema # type: ignore
|
|
318
|
+
|
|
319
|
+
for _, node in train_schema.nodes.items():
|
|
320
|
+
if node.matches_type(
|
|
321
|
+
LLMBasedCommandGenerator, include_subtypes=True
|
|
322
|
+
) and not node.matches_type(
|
|
323
|
+
MultiStepLLMCommandGenerator, include_subtypes=True
|
|
324
|
+
):
|
|
325
|
+
return cast(Type[LLMBasedCommandGenerator], node.uses)
|
|
326
|
+
|
|
327
|
+
rasa.shared.utils.cli.print_error(
|
|
328
|
+
"The provided model is not trained using 'SingleStepLLMCommandGenerator' or "
|
|
329
|
+
"'CompactLLMCommandGenerator' or its subclasses. Without it, no data for "
|
|
330
|
+
"fine-tuning can be generated. To resolve this, please include "
|
|
331
|
+
"'SingleStepLLMCommandGenerator' or 'CompactLLMCommandGenerator' or its "
|
|
332
|
+
"subclasses in your config and train your model."
|
|
298
333
|
)
|
|
299
334
|
sys.exit(1)
|
|
300
335
|
|
rasa/cli/markers.py
CHANGED
|
@@ -4,11 +4,10 @@ from typing import List, Text
|
|
|
4
4
|
|
|
5
5
|
from rasa.cli import SubParsersAction
|
|
6
6
|
from rasa.cli.arguments.default_arguments import add_domain_param
|
|
7
|
+
from rasa.markers.upload import upload
|
|
7
8
|
from rasa.shared.core.domain import Domain
|
|
8
9
|
from rasa.shared.utils.cli import print_error_and_exit
|
|
9
10
|
|
|
10
|
-
from rasa.markers.upload import upload
|
|
11
|
-
|
|
12
11
|
|
|
13
12
|
def add_subparser(
|
|
14
13
|
subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
|
|
@@ -4,7 +4,7 @@ from rasa_sdk import Action, Tracker
|
|
|
4
4
|
from rasa_sdk.events import SlotSet
|
|
5
5
|
from rasa_sdk.executor import CollectingDispatcher
|
|
6
6
|
|
|
7
|
-
from actions.db import add_contact, get_contacts
|
|
7
|
+
from actions.db import Contact, add_contact, get_contacts
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class AddContact(Action):
|