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
rasa/shared/utils/llm.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import importlib.resources
|
|
1
2
|
import json
|
|
2
3
|
from copy import deepcopy
|
|
3
4
|
from functools import wraps
|
|
4
5
|
from typing import (
|
|
6
|
+
TYPE_CHECKING,
|
|
5
7
|
Any,
|
|
6
8
|
Callable,
|
|
7
9
|
Dict,
|
|
@@ -9,7 +11,6 @@ from typing import (
|
|
|
9
11
|
Text,
|
|
10
12
|
Type,
|
|
11
13
|
TypeVar,
|
|
12
|
-
TYPE_CHECKING,
|
|
13
14
|
Union,
|
|
14
15
|
cast,
|
|
15
16
|
)
|
|
@@ -19,19 +20,19 @@ import structlog
|
|
|
19
20
|
import rasa.shared.utils.io
|
|
20
21
|
from rasa.core.utils import AvailableEndpoints
|
|
21
22
|
from rasa.shared.constants import (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
PROVIDER_CONFIG_KEY,
|
|
23
|
+
DEFAULT_PROMPT_PACKAGE_NAME,
|
|
24
|
+
MODEL_CONFIG_KEY,
|
|
25
25
|
MODEL_GROUP_CONFIG_KEY,
|
|
26
26
|
MODEL_GROUP_ID_CONFIG_KEY,
|
|
27
27
|
MODELS_CONFIG_KEY,
|
|
28
|
+
PROVIDER_CONFIG_KEY,
|
|
29
|
+
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
|
|
30
|
+
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
|
|
28
31
|
ROUTER_CONFIG_KEY,
|
|
29
32
|
)
|
|
30
33
|
from rasa.shared.core.events import BotUttered, UserUttered
|
|
31
|
-
from rasa.shared.core.slots import
|
|
32
|
-
from rasa.shared.engine.caching import
|
|
33
|
-
get_local_cache_location,
|
|
34
|
-
)
|
|
34
|
+
from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, Slot
|
|
35
|
+
from rasa.shared.engine.caching import get_local_cache_location
|
|
35
36
|
from rasa.shared.exceptions import (
|
|
36
37
|
FileIOException,
|
|
37
38
|
FileNotFoundException,
|
|
@@ -50,13 +51,13 @@ from rasa.shared.providers._configs.self_hosted_llm_client_config import (
|
|
|
50
51
|
from rasa.shared.providers.embedding.embedding_client import EmbeddingClient
|
|
51
52
|
from rasa.shared.providers.llm.llm_client import LLMClient
|
|
52
53
|
from rasa.shared.providers.mappings import (
|
|
53
|
-
get_llm_client_from_provider,
|
|
54
54
|
AZURE_OPENAI_PROVIDER,
|
|
55
|
+
HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
|
|
55
56
|
OPENAI_PROVIDER,
|
|
56
57
|
SELF_HOSTED_PROVIDER,
|
|
57
|
-
get_embedding_client_from_provider,
|
|
58
|
-
HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
|
|
59
58
|
get_client_config_class_from_provider,
|
|
59
|
+
get_embedding_client_from_provider,
|
|
60
|
+
get_llm_client_from_provider,
|
|
60
61
|
)
|
|
61
62
|
|
|
62
63
|
if TYPE_CHECKING:
|
|
@@ -355,13 +356,13 @@ def _combine_single_model_configs(
|
|
|
355
356
|
)
|
|
356
357
|
# Checks for deprecated keys, resolves aliases and returns a valid config.
|
|
357
358
|
# This is done to ensure that the custom config is valid.
|
|
358
|
-
return client_config_clazz.from_dict(custom_config).to_dict()
|
|
359
|
+
return client_config_clazz.from_dict(deepcopy(custom_config)).to_dict()
|
|
359
360
|
|
|
360
361
|
# If the provider is the same in both configs
|
|
361
362
|
# OR provider is not specified in the custom config
|
|
362
363
|
# perform MERGE by overriding the default config keys and values
|
|
363
364
|
# with custom config keys and values.
|
|
364
|
-
merged_config = {**default_config
|
|
365
|
+
merged_config = {**deepcopy(default_config), **deepcopy(custom_config)}
|
|
365
366
|
# Check for deprecated keys, resolve aliases and return a valid config.
|
|
366
367
|
# This is done to ensure that the merged config is valid.
|
|
367
368
|
default_config_clazz = get_client_config_class_from_provider(
|
|
@@ -512,7 +513,7 @@ def llm_client_factory(
|
|
|
512
513
|
Returns:
|
|
513
514
|
Instantiated LLM based on the configuration.
|
|
514
515
|
"""
|
|
515
|
-
config = combine_custom_and_default_config(custom_config, default_config)
|
|
516
|
+
config = combine_custom_and_default_config(deepcopy(custom_config), default_config)
|
|
516
517
|
|
|
517
518
|
ensure_cache()
|
|
518
519
|
|
|
@@ -641,7 +642,7 @@ def embedder_client_factory(
|
|
|
641
642
|
Returns:
|
|
642
643
|
Instantiated Embedder based on the configuration.
|
|
643
644
|
"""
|
|
644
|
-
config = combine_custom_and_default_config(custom_config, default_config)
|
|
645
|
+
config = combine_custom_and_default_config(deepcopy(custom_config), default_config)
|
|
645
646
|
|
|
646
647
|
ensure_cache()
|
|
647
648
|
|
|
@@ -666,15 +667,96 @@ def get_prompt_template(
|
|
|
666
667
|
"""
|
|
667
668
|
try:
|
|
668
669
|
if jinja_file_path is not None:
|
|
669
|
-
|
|
670
|
+
prompt_template = rasa.shared.utils.io.read_file(jinja_file_path)
|
|
671
|
+
structlogger.info(
|
|
672
|
+
"utils.llm.get_prompt_template.custom_prompt_template_read_successfull",
|
|
673
|
+
event_info=(
|
|
674
|
+
f"Custom prompt template read successfully from "
|
|
675
|
+
f"`{jinja_file_path}`."
|
|
676
|
+
),
|
|
677
|
+
prompt_file_path=jinja_file_path,
|
|
678
|
+
)
|
|
679
|
+
return prompt_template
|
|
670
680
|
except (FileIOException, FileNotFoundException):
|
|
671
681
|
structlogger.warning(
|
|
672
|
-
"
|
|
673
|
-
|
|
682
|
+
"utils.llm.get_prompt_template.failed_to_read_custom_prompt_template",
|
|
683
|
+
event_info=(
|
|
684
|
+
"Failed to read custom prompt template. Using default template instead."
|
|
685
|
+
),
|
|
674
686
|
)
|
|
675
687
|
return default_prompt_template
|
|
676
688
|
|
|
677
689
|
|
|
690
|
+
def get_default_prompt_template_based_on_model(
|
|
691
|
+
llm_config: Dict[str, Any],
|
|
692
|
+
model_prompt_mapping: Dict[str, Any],
|
|
693
|
+
default_prompt_path: str,
|
|
694
|
+
fallback_prompt_path: str,
|
|
695
|
+
) -> Text:
|
|
696
|
+
"""Returns the default prompt template based on the model name.
|
|
697
|
+
|
|
698
|
+
Args:
|
|
699
|
+
llm_config: The model config.
|
|
700
|
+
model_prompt_mapping: The mapping of model name to prompt template.
|
|
701
|
+
default_prompt_path: The default prompt path of the component.
|
|
702
|
+
fallback_prompt_path: The fallback prompt path for all other models
|
|
703
|
+
that do not have a mapping in the model_prompt_mapping.
|
|
704
|
+
|
|
705
|
+
Returns:
|
|
706
|
+
The default prompt template.
|
|
707
|
+
"""
|
|
708
|
+
_llm_config = deepcopy(llm_config)
|
|
709
|
+
if MODELS_CONFIG_KEY in _llm_config:
|
|
710
|
+
_llm_config = _llm_config[MODELS_CONFIG_KEY][0]
|
|
711
|
+
provider = _llm_config.get(PROVIDER_CONFIG_KEY)
|
|
712
|
+
model = _llm_config.get(MODEL_CONFIG_KEY)
|
|
713
|
+
if not model:
|
|
714
|
+
# If the model is not defined, we default to the default prompt template.
|
|
715
|
+
structlogger.info(
|
|
716
|
+
"utils.llm.get_default_prompt_template_based_on_model.using_default_prompt_template",
|
|
717
|
+
event_info=(
|
|
718
|
+
f"Model not defined in the config. Default prompt template read from"
|
|
719
|
+
f" - `{default_prompt_path}`."
|
|
720
|
+
),
|
|
721
|
+
default_prompt_path=default_prompt_path,
|
|
722
|
+
)
|
|
723
|
+
return importlib.resources.read_text(
|
|
724
|
+
DEFAULT_PROMPT_PACKAGE_NAME, default_prompt_path
|
|
725
|
+
)
|
|
726
|
+
|
|
727
|
+
model_name = model if provider and provider in model else f"{provider}/{model}"
|
|
728
|
+
if prompt_file_path := model_prompt_mapping.get(model_name):
|
|
729
|
+
# If the model is found in the mapping, we use the model-specific prompt
|
|
730
|
+
# template.
|
|
731
|
+
structlogger.info(
|
|
732
|
+
"utils.llm.get_default_prompt_template_based_on_model.using_model_specific_prompt_template",
|
|
733
|
+
event_info=(
|
|
734
|
+
f"Using model-specific default prompt template. Default prompt "
|
|
735
|
+
f"template read from - `{prompt_file_path}`."
|
|
736
|
+
),
|
|
737
|
+
default_prompt_path=prompt_file_path,
|
|
738
|
+
model_name=model_name,
|
|
739
|
+
)
|
|
740
|
+
return importlib.resources.read_text(
|
|
741
|
+
DEFAULT_PROMPT_PACKAGE_NAME, prompt_file_path
|
|
742
|
+
)
|
|
743
|
+
|
|
744
|
+
# If the model is not found in the mapping, we default to the fallback prompt
|
|
745
|
+
# template.
|
|
746
|
+
structlogger.info(
|
|
747
|
+
"utils.llm.get_default_prompt_template_based_on_model.using_fallback_prompt_template",
|
|
748
|
+
event_info=(
|
|
749
|
+
f"Model not found in the model prompt mapping. Fallback prompt template "
|
|
750
|
+
f"read from - `{fallback_prompt_path}`."
|
|
751
|
+
),
|
|
752
|
+
fallback_prompt_path=fallback_prompt_path,
|
|
753
|
+
model_name=model_name,
|
|
754
|
+
)
|
|
755
|
+
return importlib.resources.read_text(
|
|
756
|
+
DEFAULT_PROMPT_PACKAGE_NAME, fallback_prompt_path
|
|
757
|
+
)
|
|
758
|
+
|
|
759
|
+
|
|
678
760
|
def allowed_values_for_slot(slot: Slot) -> Union[str, None]:
|
|
679
761
|
"""Get the allowed values for a slot."""
|
|
680
762
|
if isinstance(slot, BooleanSlot):
|
|
@@ -4,10 +4,15 @@ loaded as an extension of the pykwalify library:
|
|
|
4
4
|
https://pykwalify.readthedocs.io/en/latest/extensions.html#extensions
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Dict, List, Text, Union
|
|
8
8
|
|
|
9
9
|
from pykwalify.errors import SchemaError
|
|
10
10
|
|
|
11
|
+
from rasa.shared.utils.constants import (
|
|
12
|
+
RASA_PRO_BETA_PREDICATES_IN_RESPONSE_CONDITIONS_ENV_VAR_NAME,
|
|
13
|
+
)
|
|
14
|
+
from rasa.utils.beta import ensure_beta_feature_is_enabled
|
|
15
|
+
|
|
11
16
|
|
|
12
17
|
def require_response_keys(
|
|
13
18
|
responses: List[Dict[Text, Any]], _: Dict, __: Text
|
|
@@ -24,4 +29,23 @@ def require_response_keys(
|
|
|
24
29
|
"null 'text' value in response."
|
|
25
30
|
)
|
|
26
31
|
|
|
32
|
+
conditions = response.get("condition", [])
|
|
33
|
+
if isinstance(conditions, str):
|
|
34
|
+
ensure_beta_feature_is_enabled(
|
|
35
|
+
"predicates in response conditions",
|
|
36
|
+
RASA_PRO_BETA_PREDICATES_IN_RESPONSE_CONDITIONS_ENV_VAR_NAME,
|
|
37
|
+
)
|
|
38
|
+
continue
|
|
39
|
+
|
|
40
|
+
for condition in conditions:
|
|
41
|
+
if not isinstance(condition, dict):
|
|
42
|
+
return SchemaError("Condition must be a dictionary.")
|
|
43
|
+
if not all(key in condition for key in ("type", "name", "value")):
|
|
44
|
+
return SchemaError(
|
|
45
|
+
"Condition must have 'type', 'name', and 'value' keys."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
if condition.get("type") != "slot":
|
|
49
|
+
return SchemaError("Condition type must be of type `slot`.")
|
|
50
|
+
|
|
27
51
|
return True
|
|
@@ -78,7 +78,6 @@ mapping:
|
|
|
78
78
|
mappings:
|
|
79
79
|
type: "seq"
|
|
80
80
|
required: False
|
|
81
|
-
allowempty: False
|
|
82
81
|
sequence:
|
|
83
82
|
- type: "map"
|
|
84
83
|
allowempty: True
|
|
@@ -99,6 +98,11 @@ mapping:
|
|
|
99
98
|
type: "any"
|
|
100
99
|
action:
|
|
101
100
|
type: "str"
|
|
101
|
+
run_action_every_turn:
|
|
102
|
+
type: "str"
|
|
103
|
+
coexistence_system:
|
|
104
|
+
type: "str"
|
|
105
|
+
enum: ["NLU", "CALM", "SHARED"]
|
|
102
106
|
conditions:
|
|
103
107
|
type: "seq"
|
|
104
108
|
sequence:
|
|
@@ -112,6 +116,27 @@ mapping:
|
|
|
112
116
|
active_flow:
|
|
113
117
|
type: "str"
|
|
114
118
|
nullable: True
|
|
119
|
+
validation:
|
|
120
|
+
type: map
|
|
121
|
+
required: false
|
|
122
|
+
mapping:
|
|
123
|
+
rejections:
|
|
124
|
+
type: seq
|
|
125
|
+
required: true
|
|
126
|
+
sequence:
|
|
127
|
+
- type: map
|
|
128
|
+
mapping:
|
|
129
|
+
if:
|
|
130
|
+
type: str
|
|
131
|
+
required: true
|
|
132
|
+
utter:
|
|
133
|
+
type: str
|
|
134
|
+
required: true
|
|
135
|
+
refill_utter:
|
|
136
|
+
type: str
|
|
137
|
+
required: false
|
|
138
|
+
nullable: false
|
|
139
|
+
|
|
115
140
|
forms:
|
|
116
141
|
type: "map"
|
|
117
142
|
required: False
|
|
@@ -161,7 +161,7 @@ FLOW_CANCELLED = {
|
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
DIALOGUE_STACK_UPDATED = {
|
|
164
|
-
"properties": {"event": {"const": "stack"}, "update": {"type": "
|
|
164
|
+
"properties": {"event": {"const": "stack"}, "update": {"type": "string"}}
|
|
165
165
|
}
|
|
166
166
|
ROUTING_SESSION_ENDED = {"properties": {"event": {"const": "routing_session_ended"}}}
|
|
167
167
|
|
rasa/shared/utils/yaml.py
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
from contextlib import contextmanager
|
|
2
1
|
import datetime
|
|
3
2
|
import io
|
|
4
3
|
import logging
|
|
5
4
|
import os
|
|
6
5
|
import re
|
|
7
6
|
from collections import OrderedDict
|
|
8
|
-
from
|
|
9
|
-
from dataclasses import field
|
|
7
|
+
from contextlib import contextmanager
|
|
8
|
+
from dataclasses import dataclass, field
|
|
10
9
|
from functools import lru_cache
|
|
11
10
|
from io import StringIO
|
|
12
11
|
from pathlib import Path
|
|
13
|
-
from typing import Any, Generator, List, Optional, Tuple,
|
|
12
|
+
from typing import Any, Callable, Dict, Generator, List, Optional, Tuple, Union
|
|
14
13
|
|
|
15
14
|
import jsonschema
|
|
16
15
|
from importlib_resources import files
|
|
17
16
|
from packaging import version
|
|
18
17
|
from pykwalify.core import Core
|
|
19
18
|
from pykwalify.errors import SchemaError
|
|
19
|
+
from ruamel import yaml as yaml
|
|
20
|
+
from ruamel.yaml import YAML, RoundTripRepresenter, YAMLError
|
|
21
|
+
from ruamel.yaml.comments import CommentedMap, CommentedSeq
|
|
22
|
+
from ruamel.yaml.constructor import BaseConstructor, DuplicateKeyError, ScalarNode
|
|
23
|
+
from ruamel.yaml.loader import SafeLoader
|
|
24
|
+
|
|
20
25
|
from rasa.shared.constants import (
|
|
21
26
|
ASSERTIONS_SCHEMA_EXTENSIONS_FILE,
|
|
22
27
|
ASSERTIONS_SCHEMA_FILE,
|
|
23
|
-
MODEL_CONFIG_SCHEMA_FILE,
|
|
24
28
|
CONFIG_SCHEMA_FILE,
|
|
25
29
|
DOCS_URL_TRAINING_DATA,
|
|
26
|
-
PACKAGE_NAME,
|
|
27
30
|
LATEST_TRAINING_DATA_FORMAT_VERSION,
|
|
28
|
-
|
|
31
|
+
MODEL_CONFIG_SCHEMA_FILE,
|
|
32
|
+
PACKAGE_NAME,
|
|
29
33
|
RESPONSES_SCHEMA_FILE,
|
|
34
|
+
SCHEMA_EXTENSIONS_FILE,
|
|
30
35
|
SENSITIVE_DATA,
|
|
31
36
|
)
|
|
32
37
|
from rasa.shared.exceptions import (
|
|
38
|
+
FileNotFoundException,
|
|
39
|
+
RasaException,
|
|
40
|
+
SchemaValidationError,
|
|
33
41
|
YamlException,
|
|
34
42
|
YamlSyntaxException,
|
|
35
|
-
SchemaValidationError,
|
|
36
|
-
RasaException,
|
|
37
|
-
FileNotFoundException,
|
|
38
43
|
)
|
|
39
44
|
from rasa.shared.utils.constants import (
|
|
40
45
|
DEFAULT_ENCODING,
|
|
41
|
-
READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR,
|
|
42
46
|
DEFAULT_READ_YAML_FILE_CACHE_MAXSIZE,
|
|
47
|
+
READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR,
|
|
43
48
|
)
|
|
44
49
|
from rasa.shared.utils.io import (
|
|
45
|
-
read_file,
|
|
46
50
|
convert_to_ordered_dict,
|
|
47
51
|
raise_warning,
|
|
52
|
+
read_file,
|
|
48
53
|
read_json_file,
|
|
49
54
|
)
|
|
50
|
-
from ruamel import yaml as yaml
|
|
51
|
-
from ruamel.yaml import YAML, RoundTripRepresenter, YAMLError
|
|
52
|
-
from ruamel.yaml.comments import CommentedSeq, CommentedMap
|
|
53
|
-
from ruamel.yaml.constructor import DuplicateKeyError, BaseConstructor, ScalarNode
|
|
54
|
-
from ruamel.yaml.loader import SafeLoader
|
|
55
55
|
|
|
56
56
|
logger = logging.getLogger(__name__)
|
|
57
57
|
|
|
@@ -699,7 +699,9 @@ def read_yaml_file(
|
|
|
699
699
|
|
|
700
700
|
|
|
701
701
|
def read_config_file(
|
|
702
|
-
filename: Union[Path, str],
|
|
702
|
+
filename: Union[Path, str],
|
|
703
|
+
reader_type: Union[str, List[str]] = "safe",
|
|
704
|
+
expand_env_vars: bool = True,
|
|
703
705
|
) -> Dict[str, Any]:
|
|
704
706
|
"""Parses a yaml configuration file. Content needs to be a dictionary.
|
|
705
707
|
|
|
@@ -713,7 +715,9 @@ def read_config_file(
|
|
|
713
715
|
Returns:
|
|
714
716
|
Parsed config file.
|
|
715
717
|
"""
|
|
716
|
-
return read_validated_yaml(
|
|
718
|
+
return read_validated_yaml(
|
|
719
|
+
filename, CONFIG_SCHEMA_FILE, reader_type, expand_env_vars=expand_env_vars
|
|
720
|
+
)
|
|
717
721
|
|
|
718
722
|
|
|
719
723
|
def read_model_configuration(
|
|
@@ -1001,8 +1005,8 @@ def validate_yaml_with_jsonschema(
|
|
|
1001
1005
|
YamlSyntaxException: if the yaml file is not valid.
|
|
1002
1006
|
SchemaValidationError: if validation fails.
|
|
1003
1007
|
"""
|
|
1004
|
-
from ruamel.yaml import YAMLError
|
|
1005
1008
|
import importlib_resources
|
|
1009
|
+
from ruamel.yaml import YAMLError
|
|
1006
1010
|
|
|
1007
1011
|
schema_file = str(importlib_resources.files(package_name).joinpath(schema_path))
|
|
1008
1012
|
schema_content = read_json_file(schema_file)
|
rasa/studio/auth.py
CHANGED
|
@@ -6,10 +6,10 @@ from pathlib import Path
|
|
|
6
6
|
from typing import Any, Dict, List, Optional, Text, Union
|
|
7
7
|
|
|
8
8
|
import jwt
|
|
9
|
-
from keycloak import
|
|
9
|
+
from keycloak import KeycloakError, KeycloakOpenID
|
|
10
|
+
|
|
10
11
|
from rasa.shared.exceptions import RasaException
|
|
11
12
|
from rasa.shared.utils.yaml import read_yaml_file, write_yaml
|
|
12
|
-
|
|
13
13
|
from rasa.studio.config import StudioConfig
|
|
14
14
|
from rasa.studio.constants import (
|
|
15
15
|
KEYCLOAK_ACCESS_TOKEN_KEY,
|
|
@@ -17,7 +17,7 @@ from rasa.studio.constants import (
|
|
|
17
17
|
KEYCLOAK_REFRESH_EXPIRES_IN_KEY,
|
|
18
18
|
KEYCLOAK_REFRESH_TOKEN,
|
|
19
19
|
)
|
|
20
|
-
from rasa.studio.results_logger import
|
|
20
|
+
from rasa.studio.results_logger import StudioResult, with_studio_error_handler
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class StudioAuth:
|
rasa/studio/config.py
CHANGED
|
@@ -4,8 +4,6 @@ import os
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from typing import Any, Dict, Optional, Text
|
|
6
6
|
|
|
7
|
-
from rasa.utils.common import read_global_config_value, write_global_config_value
|
|
8
|
-
|
|
9
7
|
from rasa.studio.constants import (
|
|
10
8
|
RASA_STUDIO_AUTH_SERVER_URL_ENV,
|
|
11
9
|
RASA_STUDIO_CLI_CLIENT_ID_KEY_ENV,
|
|
@@ -14,6 +12,7 @@ from rasa.studio.constants import (
|
|
|
14
12
|
RASA_STUDIO_CLI_STUDIO_URL_ENV,
|
|
15
13
|
STUDIO_CONFIG_KEY,
|
|
16
14
|
)
|
|
15
|
+
from rasa.utils.common import read_global_config_value, write_global_config_value
|
|
17
16
|
|
|
18
17
|
AUTH_SERVER_URL_KEY = "authentication_server_url"
|
|
19
18
|
STUDIO_URL_KEY = "studio_url"
|
rasa/studio/data_handler.py
CHANGED
|
@@ -3,17 +3,17 @@ import logging
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
from typing import Any, Dict, List, Optional, Tuple
|
|
5
5
|
|
|
6
|
-
import rasa.shared.utils.cli
|
|
7
6
|
import requests
|
|
7
|
+
|
|
8
|
+
import rasa.shared.utils.cli
|
|
8
9
|
from rasa.shared.core.domain import KEY_RESPONSES, KEY_SLOTS, Domain
|
|
9
10
|
from rasa.shared.core.flows.flow import Flow
|
|
10
11
|
from rasa.shared.exceptions import RasaException
|
|
11
12
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
12
13
|
from rasa.shared.utils.yaml import read_yaml, write_yaml
|
|
13
|
-
from rasa.utils.common import get_temp_dir_name
|
|
14
|
-
|
|
15
14
|
from rasa.studio.auth import KeycloakToken, KeycloakTokenReader, StudioAuth
|
|
16
15
|
from rasa.studio.config import StudioConfig
|
|
16
|
+
from rasa.utils.common import get_temp_dir_name
|
|
17
17
|
|
|
18
18
|
logger = logging.getLogger(__name__)
|
|
19
19
|
|
rasa/studio/download.py
CHANGED
|
@@ -9,9 +9,9 @@ import structlog
|
|
|
9
9
|
import rasa.cli.utils
|
|
10
10
|
import rasa.shared.utils.cli
|
|
11
11
|
from rasa.shared.constants import (
|
|
12
|
+
DEFAULT_CONFIG_PATH,
|
|
12
13
|
DEFAULT_DATA_PATH,
|
|
13
14
|
DEFAULT_DOMAIN_PATH,
|
|
14
|
-
DEFAULT_CONFIG_PATH,
|
|
15
15
|
DEFAULT_ENDPOINTS_PATH,
|
|
16
16
|
)
|
|
17
17
|
from rasa.shared.core.domain import Domain
|
rasa/studio/results_logger.py
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from functools import wraps
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Any, Callable, Dict
|
|
4
4
|
|
|
5
5
|
import structlog
|
|
6
6
|
from keycloak.exceptions import KeycloakError
|
|
7
|
-
from requests.exceptions import RequestException, Timeout
|
|
7
|
+
from requests.exceptions import ConnectionError, RequestException, Timeout
|
|
8
8
|
|
|
9
9
|
from rasa.shared.exceptions import RasaException
|
|
10
|
-
from rasa.shared.utils.cli import
|
|
10
|
+
from rasa.shared.utils.cli import print_error, print_success
|
|
11
11
|
from rasa.studio.config import StudioConfig
|
|
12
12
|
|
|
13
13
|
structlogger = structlog.get_logger()
|
rasa/studio/upload.py
CHANGED
|
@@ -2,7 +2,7 @@ import argparse
|
|
|
2
2
|
import base64
|
|
3
3
|
import re
|
|
4
4
|
import sys
|
|
5
|
-
from typing import Dict, Iterable, List, Set, Text, Tuple, Union
|
|
5
|
+
from typing import Any, Dict, Iterable, List, Set, Text, Tuple, Union
|
|
6
6
|
|
|
7
7
|
import questionary
|
|
8
8
|
import requests
|
|
@@ -13,13 +13,19 @@ import rasa.cli.utils
|
|
|
13
13
|
import rasa.shared.utils.cli
|
|
14
14
|
import rasa.shared.utils.io
|
|
15
15
|
from rasa.shared.constants import (
|
|
16
|
-
|
|
16
|
+
CONFIG_LANGUAGE_KEY,
|
|
17
|
+
CONFIG_LLM_KEY,
|
|
18
|
+
CONFIG_MODEL_NAME_KEY,
|
|
19
|
+
CONFIG_PIPELINE_KEY,
|
|
20
|
+
CONFIG_POLICIES_KEY,
|
|
21
|
+
CONFIG_RECIPE_KEY,
|
|
17
22
|
DEFAULT_CONFIG_PATH,
|
|
23
|
+
DEFAULT_DOMAIN_PATHS,
|
|
18
24
|
)
|
|
19
25
|
from rasa.shared.core.domain import Domain
|
|
20
26
|
from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader, YamlFlowsWriter
|
|
21
27
|
from rasa.shared.exceptions import RasaException
|
|
22
|
-
from rasa.shared.importers.importer import
|
|
28
|
+
from rasa.shared.importers.importer import FlowSyncImporter, TrainingDataImporter
|
|
23
29
|
from rasa.shared.nlu.training_data.formats.rasa_yaml import (
|
|
24
30
|
RasaYAMLReader,
|
|
25
31
|
RasaYAMLWriter,
|
|
@@ -32,6 +38,7 @@ from rasa.studio import results_logger
|
|
|
32
38
|
from rasa.studio.auth import KeycloakTokenReader
|
|
33
39
|
from rasa.studio.config import StudioConfig
|
|
34
40
|
from rasa.studio.results_logger import StudioResult, with_studio_error_handler
|
|
41
|
+
from rasa.telemetry import track_upload_to_studio_failed
|
|
35
42
|
|
|
36
43
|
structlogger = structlog.get_logger()
|
|
37
44
|
|
|
@@ -131,13 +138,11 @@ def handle_upload(args: argparse.Namespace) -> None:
|
|
|
131
138
|
rasa.shared.utils.cli.print_error_and_exit(
|
|
132
139
|
"No GraphQL endpoint found in config. Please run `rasa studio config`."
|
|
133
140
|
)
|
|
134
|
-
return
|
|
135
141
|
|
|
136
142
|
if not is_auth_working(endpoint, verify):
|
|
137
143
|
rasa.shared.utils.cli.print_error_and_exit(
|
|
138
144
|
"Authentication is invalid or expired. Please run `rasa studio login`."
|
|
139
145
|
)
|
|
140
|
-
return
|
|
141
146
|
|
|
142
147
|
structlogger.info("rasa.studio.upload.loading_data", event_info="Loading data...")
|
|
143
148
|
|
|
@@ -160,6 +165,16 @@ def handle_upload(args: argparse.Namespace) -> None:
|
|
|
160
165
|
upload_nlu_assistant(args, endpoint, verify=verify)
|
|
161
166
|
|
|
162
167
|
|
|
168
|
+
config_keys = [
|
|
169
|
+
CONFIG_RECIPE_KEY,
|
|
170
|
+
CONFIG_POLICIES_KEY,
|
|
171
|
+
CONFIG_PIPELINE_KEY,
|
|
172
|
+
CONFIG_LANGUAGE_KEY,
|
|
173
|
+
CONFIG_LLM_KEY,
|
|
174
|
+
CONFIG_MODEL_NAME_KEY,
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
|
|
163
178
|
def extract_values(data: Dict, keys: List[Text]) -> Dict:
|
|
164
179
|
"""Extracts values for given keys from a dictionary."""
|
|
165
180
|
return {key: data.get(key) for key in keys if data.get(key)}
|
|
@@ -382,6 +397,7 @@ def make_request(endpoint: str, graphql_req: Dict, verify: bool = True) -> Studi
|
|
|
382
397
|
)
|
|
383
398
|
|
|
384
399
|
if results_logger.response_has_errors(res.json()):
|
|
400
|
+
track_upload_to_studio_failed(res.json())
|
|
385
401
|
return StudioResult.error(res.json())
|
|
386
402
|
return StudioResult.success("Upload successful")
|
|
387
403
|
|