rasa-pro 3.11.4__py3-none-any.whl → 3.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +10 -13
- rasa/__main__.py +7 -7
- rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
- rasa/anonymization/anonymization_pipeline.py +3 -3
- rasa/anonymization/anonymization_rule_executor.py +17 -11
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/default_arguments.py +1 -1
- rasa/cli/arguments/evaluate.py +2 -1
- rasa/cli/arguments/interactive.py +1 -1
- rasa/cli/arguments/run.py +1 -1
- rasa/cli/arguments/test.py +7 -5
- rasa/cli/arguments/train.py +3 -3
- rasa/cli/arguments/visualize.py +2 -2
- rasa/cli/arguments/x.py +1 -0
- rasa/cli/data.py +20 -3
- rasa/cli/dialogue_understanding_test.py +386 -0
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/inspect.py +20 -1
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +51 -16
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/calm/config.yml +2 -2
- rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
- rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
- rasa/cli/project_templates/calm/domain/shared.yml +1 -4
- rasa/cli/project_templates/calm/endpoints.yml +2 -2
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +5 -6
- rasa/cli/studio/download.py +1 -2
- rasa/cli/studio/studio.py +2 -3
- rasa/cli/studio/train.py +0 -1
- rasa/cli/telemetry.py +2 -2
- rasa/cli/test.py +11 -11
- rasa/cli/train.py +3 -0
- rasa/cli/utils.py +25 -5
- rasa/constants.py +0 -1
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +137 -208
- rasa/core/actions/action_handle_digressions.py +164 -0
- rasa/core/actions/action_hangup.py +1 -1
- rasa/core/actions/action_repeat_bot_messages.py +2 -2
- rasa/core/actions/action_run_slot_rejections.py +18 -6
- rasa/core/actions/action_trigger_chitchat.py +1 -1
- rasa/core/actions/action_trigger_flow.py +5 -5
- rasa/core/actions/action_trigger_search.py +1 -1
- rasa/core/actions/custom_action_executor.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +1 -0
- rasa/core/actions/forms.py +22 -15
- rasa/core/actions/http_custom_action_executor.py +8 -1
- rasa/core/actions/loops.py +3 -3
- rasa/core/actions/two_stage_fallback.py +13 -13
- rasa/core/auth_retry_tracker_store.py +1 -2
- rasa/core/brokers/broker.py +2 -1
- rasa/core/brokers/file.py +1 -1
- rasa/core/brokers/kafka.py +8 -8
- rasa/core/brokers/pika.py +8 -9
- rasa/core/brokers/sql.py +4 -3
- rasa/core/channels/__init__.py +7 -0
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/callback.py +4 -4
- rasa/core/channels/channel.py +11 -11
- rasa/core/channels/console.py +0 -1
- rasa/core/channels/development_inspector.py +80 -24
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
- rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
- rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
- rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
- rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
- rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
- rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
- rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
- rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
- rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
- rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
- rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
- rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +11 -3
- rasa/core/channels/inspector/src/App.tsx +15 -2
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
- rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
- rasa/core/channels/inspector/yarn.lock +94 -99
- rasa/core/channels/mattermost.py +4 -4
- rasa/core/channels/rasa_chat.py +4 -4
- rasa/core/channels/rest.py +11 -12
- rasa/core/channels/rocketchat.py +4 -3
- rasa/core/channels/slack.py +6 -5
- rasa/core/channels/socketio.py +8 -28
- rasa/core/channels/studio_chat.py +212 -0
- rasa/core/channels/telegram.py +105 -55
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +51 -32
- rasa/core/channels/voice_ready/jambonz.py +5 -5
- rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
- rasa/core/channels/voice_ready/twilio_voice.py +9 -8
- rasa/core/channels/voice_ready/utils.py +2 -2
- rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
- rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
- rasa/core/channels/voice_stream/asr/azure.py +16 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
- rasa/core/channels/voice_stream/audiocodes.py +292 -0
- rasa/core/channels/voice_stream/browser_audio.py +14 -7
- rasa/core/channels/voice_stream/call_state.py +6 -2
- rasa/core/channels/voice_stream/genesys.py +320 -0
- rasa/core/channels/voice_stream/tts/azure.py +13 -5
- rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
- rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +100 -56
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/constants.py +2 -0
- rasa/core/evaluation/marker.py +7 -6
- rasa/core/evaluation/marker_base.py +15 -16
- rasa/core/evaluation/marker_stats.py +3 -4
- rasa/core/evaluation/marker_tracker_loader.py +5 -4
- rasa/core/exporter.py +4 -4
- rasa/core/featurizers/precomputation.py +8 -8
- rasa/core/featurizers/single_state_featurizer.py +7 -7
- rasa/core/featurizers/tracker_featurizers.py +13 -13
- rasa/core/http_interpreter.py +3 -4
- rasa/core/information_retrieval/__init__.py +1 -1
- rasa/core/information_retrieval/faiss.py +4 -4
- rasa/core/information_retrieval/information_retrieval.py +2 -2
- rasa/core/information_retrieval/milvus.py +3 -3
- rasa/core/information_retrieval/qdrant.py +3 -3
- rasa/core/jobs.py +1 -0
- rasa/core/lock.py +2 -3
- rasa/core/lock_store.py +3 -3
- rasa/core/migrate.py +12 -9
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +82 -14
- rasa/core/nlg/generator.py +85 -17
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +9 -7
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/nlg/translate.py +55 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +87 -21
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +85 -55
- rasa/core/policies/intentless_policy.py +6 -7
- rasa/core/policies/memoization.py +22 -20
- rasa/core/policies/policy.py +24 -22
- rasa/core/policies/rule_policy.py +37 -36
- rasa/core/policies/ted_policy.py +87 -85
- rasa/core/policies/unexpected_intent_policy.py +77 -75
- rasa/core/processor.py +167 -74
- rasa/core/run.py +5 -4
- rasa/core/secrets_manager/endpoints.py +2 -3
- rasa/core/secrets_manager/factory.py +2 -3
- rasa/core/secrets_manager/secret_manager.py +2 -3
- rasa/core/secrets_manager/vault.py +2 -2
- rasa/core/test.py +30 -30
- rasa/core/tracker_store.py +138 -49
- rasa/core/train.py +1 -1
- rasa/core/training/__init__.py +2 -2
- rasa/core/training/converters/responses_prefix_converter.py +1 -2
- rasa/core/training/interactive.py +13 -13
- rasa/core/training/story_conflict.py +4 -5
- rasa/core/training/training.py +3 -5
- rasa/core/utils.py +5 -5
- rasa/core/visualize.py +1 -1
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
- rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
- rasa/dialogue_understanding/commands/__init__.py +22 -22
- rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
- rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/clarify_command.py +46 -4
- rasa/dialogue_understanding/commands/command.py +3 -2
- rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
- rasa/dialogue_understanding/commands/error_command.py +1 -1
- rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
- rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
- rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/prompt_command.py +94 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
- rasa/dialogue_understanding/commands/restart_command.py +2 -5
- rasa/dialogue_understanding/commands/session_end_command.py +3 -5
- rasa/dialogue_understanding/commands/session_start_command.py +3 -5
- rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
- rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +126 -43
- rasa/dialogue_understanding/constants.py +2 -0
- rasa/dialogue_understanding/generator/__init__.py +2 -0
- rasa/dialogue_understanding/generator/command_generator.py +120 -79
- rasa/dialogue_understanding/generator/command_parser.py +245 -0
- rasa/dialogue_understanding/generator/constants.py +12 -4
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
- rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
- rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
- rasa/dialogue_understanding/generator/utils.py +76 -0
- rasa/dialogue_understanding/patterns/cancel.py +2 -1
- rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
- rasa/dialogue_understanding/patterns/chitchat.py +1 -1
- rasa/dialogue_understanding/patterns/clarify.py +2 -1
- rasa/dialogue_understanding/patterns/code_change.py +2 -0
- rasa/dialogue_understanding/patterns/collect_information.py +7 -4
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
- rasa/dialogue_understanding/patterns/correction.py +17 -3
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
- rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
- rasa/dialogue_understanding/patterns/internal_error.py +1 -0
- rasa/dialogue_understanding/patterns/search.py +1 -1
- rasa/dialogue_understanding/patterns/session_start.py +1 -1
- rasa/dialogue_understanding/patterns/skip_question.py +1 -0
- rasa/dialogue_understanding/patterns/user_silence.py +1 -1
- rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
- rasa/dialogue_understanding/processor/command_processor.py +193 -43
- rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
- rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
- rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
- rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
- rasa/dialogue_understanding/stack/utils.py +56 -10
- rasa/dialogue_understanding/utils.py +164 -0
- rasa/dialogue_understanding_test/README.md +429 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
- rasa/dialogue_understanding_test/constants.py +22 -0
- rasa/dialogue_understanding_test/du_test_case.py +448 -0
- rasa/dialogue_understanding_test/du_test_result.py +390 -0
- rasa/dialogue_understanding_test/du_test_runner.py +322 -0
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +443 -0
- rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
- rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
- rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
- rasa/dialogue_understanding_test/utils.py +70 -0
- rasa/dialogue_understanding_test/validation.py +77 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +202 -175
- rasa/e2e_test/assertions_schema.yml +6 -0
- rasa/e2e_test/constants.py +16 -1
- rasa/e2e_test/e2e_config.py +102 -41
- rasa/e2e_test/e2e_config_schema.yml +28 -10
- rasa/e2e_test/e2e_test_case.py +5 -5
- rasa/e2e_test/e2e_test_converter.py +2 -3
- rasa/e2e_test/e2e_test_coverage_report.py +6 -6
- rasa/e2e_test/e2e_test_result.py +1 -1
- rasa/e2e_test/e2e_test_runner.py +143 -38
- rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
- rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/generative_assertions.py +243 -0
- rasa/e2e_test/utils/io.py +123 -93
- rasa/e2e_test/utils/validation.py +101 -3
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +3 -2
- rasa/engine/language.py +182 -0
- rasa/engine/recipes/config_files/default_config.yml +4 -0
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/default_recipe.py +65 -49
- rasa/engine/recipes/graph_recipe.py +10 -7
- rasa/engine/recipes/recipe.py +2 -2
- rasa/engine/runner/dask.py +2 -2
- rasa/engine/runner/interface.py +1 -0
- rasa/engine/storage/local_model_storage.py +6 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +8 -3
- rasa/engine/training/components.py +2 -1
- rasa/engine/training/fingerprinting.py +4 -2
- rasa/engine/training/graph_trainer.py +4 -4
- rasa/engine/training/hooks.py +2 -2
- rasa/engine/validation.py +36 -33
- rasa/exceptions.py +3 -2
- rasa/graph_components/converters/nlu_message_converter.py +3 -3
- rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
- rasa/graph_components/providers/domain_provider.py +3 -2
- rasa/graph_components/providers/flows_provider.py +2 -3
- rasa/graph_components/providers/forms_provider.py +4 -4
- rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
- rasa/graph_components/providers/responses_provider.py +4 -4
- rasa/graph_components/providers/rule_only_provider.py +3 -2
- rasa/graph_components/providers/story_graph_provider.py +8 -8
- rasa/graph_components/providers/training_tracker_provider.py +3 -2
- rasa/graph_components/validators/default_recipe_validator.py +16 -16
- rasa/graph_components/validators/finetuning_validator.py +10 -8
- rasa/hooks.py +19 -14
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +5 -33
- rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
- rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/llm_fine_tuning/train_test_split_module.py +27 -27
- rasa/llm_fine_tuning/utils.py +7 -0
- rasa/markers/marker.py +2 -3
- rasa/markers/marker_base.py +1 -2
- rasa/markers/upload.py +2 -2
- rasa/markers/validate.py +2 -3
- rasa/model.py +3 -5
- rasa/model_manager/config.py +1 -1
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +13 -10
- rasa/model_manager/socket_bridge.py +15 -9
- rasa/model_manager/studio_jwt_auth.py +1 -0
- rasa/model_manager/trainer_service.py +9 -7
- rasa/model_manager/utils.py +1 -1
- rasa/model_manager/warm_rasa_process.py +14 -9
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/model_training.py +29 -29
- rasa/nlu/classifiers/diet_classifier.py +72 -73
- rasa/nlu/classifiers/fallback_classifier.py +9 -8
- rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
- rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
- rasa/nlu/classifiers/regex_message_handler.py +3 -2
- rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
- rasa/nlu/convert.py +2 -2
- rasa/nlu/emulators/dialogflow.py +3 -3
- rasa/nlu/emulators/luis.py +5 -5
- rasa/nlu/emulators/no_emulator.py +1 -0
- rasa/nlu/emulators/wit.py +4 -4
- rasa/nlu/extractors/crf_entity_extractor.py +11 -11
- rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
- rasa/nlu/extractors/entity_synonyms.py +10 -9
- rasa/nlu/extractors/extractor.py +16 -16
- rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
- rasa/nlu/extractors/regex_entity_extractor.py +11 -10
- rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
- rasa/nlu/featurizers/featurizer.py +5 -4
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
- rasa/nlu/model.py +0 -1
- rasa/nlu/selectors/response_selector.py +67 -68
- rasa/nlu/test.py +38 -38
- rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
- rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
- rasa/nlu/tokenizers/tokenizer.py +6 -7
- rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
- rasa/nlu/utils/bilou_utils.py +7 -7
- rasa/nlu/utils/hugging_face/registry.py +22 -22
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
- rasa/nlu/utils/mitie_utils.py +2 -1
- rasa/nlu/utils/pattern_utils.py +1 -1
- rasa/nlu/utils/spacy_utils.py +3 -3
- rasa/plugin.py +12 -1
- rasa/server.py +6 -3
- rasa/shared/constants.py +45 -18
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +34 -4
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/domain.py +19 -20
- rasa/shared/core/events.py +60 -39
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/constants.py +11 -0
- rasa/shared/core/flows/flow.py +107 -26
- rasa/shared/core/flows/flow_step.py +4 -3
- rasa/shared/core/flows/flow_step_links.py +1 -2
- rasa/shared/core/flows/flow_step_sequence.py +1 -1
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/flows_yaml_schema.json +69 -3
- rasa/shared/core/flows/nlu_trigger.py +1 -1
- rasa/shared/core/flows/steps/__init__.py +2 -2
- rasa/shared/core/flows/steps/action.py +1 -1
- rasa/shared/core/flows/steps/call.py +1 -1
- rasa/shared/core/flows/steps/collect.py +22 -40
- rasa/shared/core/flows/steps/internal.py +1 -1
- rasa/shared/core/flows/steps/link.py +1 -1
- rasa/shared/core/flows/steps/no_operation.py +2 -2
- rasa/shared/core/flows/steps/set_slots.py +1 -1
- rasa/shared/core/flows/utils.py +44 -4
- rasa/shared/core/flows/validation.py +4 -6
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +360 -121
- rasa/shared/core/slots.py +163 -6
- rasa/shared/core/trackers.py +108 -33
- rasa/shared/core/training_data/loading.py +1 -1
- rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
- rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
- rasa/shared/core/training_data/structures.py +11 -12
- rasa/shared/core/training_data/visualization.py +10 -10
- rasa/shared/data.py +6 -6
- rasa/shared/engine/caching.py +0 -1
- rasa/shared/exceptions.py +2 -2
- rasa/shared/importers/importer.py +58 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +9 -0
- rasa/shared/nlu/training_data/entities_parser.py +6 -6
- rasa/shared/nlu/training_data/features.py +3 -3
- rasa/shared/nlu/training_data/formats/__init__.py +1 -1
- rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
- rasa/shared/nlu/training_data/formats/luis.py +7 -8
- rasa/shared/nlu/training_data/formats/rasa.py +4 -5
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
- rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
- rasa/shared/nlu/training_data/formats/wit.py +3 -4
- rasa/shared/nlu/training_data/loading.py +4 -4
- rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
- rasa/shared/nlu/training_data/message.py +13 -14
- rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
- rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
- rasa/shared/nlu/training_data/training_data.py +12 -13
- rasa/shared/nlu/training_data/util.py +11 -10
- rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
- rasa/shared/providers/_configs/client_config.py +3 -1
- rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
- rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
- rasa/shared/providers/_configs/model_group_config.py +8 -5
- rasa/shared/providers/_configs/oauth_config.py +33 -0
- rasa/shared/providers/_configs/openai_client_config.py +14 -12
- rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
- rasa/shared/providers/_configs/utils.py +1 -0
- rasa/shared/providers/_ssl_verification_utils.py +5 -6
- rasa/shared/providers/_utils.py +5 -5
- rasa/shared/providers/constants.py +6 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
- rasa/shared/providers/llm/_base_litellm_client.py +43 -18
- rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
- rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
- rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
- rasa/shared/providers/llm/llm_client.py +24 -8
- rasa/shared/providers/llm/llm_response.py +61 -2
- rasa/shared/providers/llm/openai_llm_client.py +11 -5
- rasa/shared/providers/llm/rasa_llm_client.py +17 -14
- rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
- rasa/shared/providers/router/router_client.py +3 -1
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +15 -1
- rasa/shared/utils/constants.py +3 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
- rasa/shared/utils/health_check/health_check.py +3 -3
- rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
- rasa/shared/utils/io.py +1 -1
- rasa/shared/utils/llm.py +100 -18
- rasa/shared/utils/pykwalify_extensions.py +25 -1
- rasa/shared/utils/schemas/domain.yml +26 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +24 -20
- rasa/studio/auth.py +3 -3
- rasa/studio/config.py +1 -2
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download.py +1 -1
- rasa/studio/results_logger.py +3 -3
- rasa/studio/upload.py +21 -5
- rasa/telemetry.py +127 -48
- rasa/tracing/config.py +5 -3
- rasa/tracing/constants.py +12 -0
- rasa/tracing/instrumentation/attribute_extractors.py +92 -14
- rasa/tracing/instrumentation/instrumentation.py +61 -5
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +52 -11
- rasa/tracing/metric_instrument_provider.py +54 -14
- rasa/utils/common.py +12 -24
- rasa/utils/endpoints.py +1 -1
- rasa/utils/io.py +7 -7
- rasa/utils/licensing.py +3 -4
- rasa/utils/log_utils.py +7 -6
- rasa/utils/ml_utils.py +1 -0
- rasa/utils/plotting.py +3 -3
- rasa/utils/sanic_error_handler.py +1 -1
- rasa/utils/tensorflow/callback.py +2 -2
- rasa/utils/tensorflow/crf.py +2 -2
- rasa/utils/tensorflow/data_generator.py +5 -5
- rasa/utils/tensorflow/environment.py +3 -3
- rasa/utils/tensorflow/feature_array.py +2 -3
- rasa/utils/tensorflow/layers.py +18 -12
- rasa/utils/tensorflow/layers_utils.py +2 -1
- rasa/utils/tensorflow/metrics.py +2 -2
- rasa/utils/tensorflow/model_data.py +7 -7
- rasa/utils/tensorflow/model_data_utils.py +10 -9
- rasa/utils/tensorflow/models.py +31 -32
- rasa/utils/tensorflow/rasa_layers.py +20 -19
- rasa/utils/tensorflow/types.py +2 -1
- rasa/utils/train_utils.py +23 -21
- rasa/utils/url_tools.py +1 -1
- rasa/validator.py +594 -115
- rasa/version.py +1 -1
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
- rasa_pro-3.12.0.dist-info/RECORD +829 -0
- rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
- rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
- rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
- rasa_pro-3.11.4.dist-info/RECORD +0 -779
- /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
rasa/core/lock.py
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
from collections import deque
|
|
4
|
-
|
|
5
3
|
import time
|
|
6
|
-
from
|
|
4
|
+
from collections import deque
|
|
5
|
+
from typing import Any, Deque, Dict, Optional, Text, Union
|
|
7
6
|
|
|
8
7
|
logger = logging.getLogger(__name__)
|
|
9
8
|
|
rasa/core/lock_store.py
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
import asyncio
|
|
3
|
-
from contextlib import asynccontextmanager
|
|
4
4
|
import json
|
|
5
5
|
import logging
|
|
6
6
|
import os
|
|
7
|
-
|
|
7
|
+
from contextlib import asynccontextmanager
|
|
8
8
|
from typing import AsyncGenerator, Dict, Optional, Text, Union
|
|
9
9
|
|
|
10
|
-
from rasa.shared.exceptions import RasaException, ConnectionException
|
|
11
10
|
import rasa.shared.utils.common
|
|
12
11
|
from rasa.core.constants import DEFAULT_LOCK_LIFETIME
|
|
13
12
|
from rasa.core.lock import TicketLock
|
|
13
|
+
from rasa.shared.exceptions import ConnectionException, RasaException
|
|
14
14
|
from rasa.utils.endpoints import EndpointConfig
|
|
15
15
|
|
|
16
16
|
logger = logging.getLogger(__name__)
|
rasa/core/migrate.py
CHANGED
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import shutil
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text, Tuple, Union
|
|
5
5
|
|
|
6
6
|
from ruamel.yaml.scalarstring import DoubleQuotedScalarString
|
|
7
7
|
|
|
8
|
-
import rasa.shared.utils.io
|
|
9
8
|
import rasa.shared.utils.cli
|
|
10
|
-
|
|
9
|
+
import rasa.shared.utils.io
|
|
10
|
+
from rasa.shared.constants import (
|
|
11
|
+
IGNORED_INTENTS,
|
|
12
|
+
LATEST_TRAINING_DATA_FORMAT_VERSION,
|
|
13
|
+
REQUIRED_SLOTS_KEY,
|
|
14
|
+
)
|
|
11
15
|
from rasa.shared.core.constants import (
|
|
12
16
|
ACTIVE_LOOP,
|
|
17
|
+
KEY_MAPPING_TYPE,
|
|
13
18
|
REQUESTED_SLOT,
|
|
14
|
-
SlotMappingType,
|
|
15
|
-
MAPPING_TYPE,
|
|
16
19
|
SLOT_MAPPINGS,
|
|
20
|
+
SlotMappingType,
|
|
17
21
|
)
|
|
18
|
-
from rasa.shared.
|
|
19
|
-
from rasa.shared.core.domain import KEY_ENTITIES, KEY_SLOTS, KEY_FORMS, Domain
|
|
22
|
+
from rasa.shared.core.domain import KEY_ENTITIES, KEY_FORMS, KEY_SLOTS, Domain
|
|
20
23
|
from rasa.shared.exceptions import RasaException
|
|
21
24
|
from rasa.shared.utils.yaml import (
|
|
22
25
|
KEY_TRAINING_DATA_FORMAT_VERSION,
|
|
23
26
|
read_yaml,
|
|
24
|
-
write_yaml,
|
|
25
27
|
read_yaml_file,
|
|
28
|
+
write_yaml,
|
|
26
29
|
)
|
|
27
30
|
|
|
28
31
|
ORIGINAL_DOMAIN = "original_domain" # not a default, fixed
|
|
@@ -40,7 +43,7 @@ def _create_back_up(domain_file: Path, backup_location: Path) -> Dict[Text, Any]
|
|
|
40
43
|
def _get_updated_mapping_condition(
|
|
41
44
|
condition: Dict[Text, Text], mapping: Dict[Text, Any], slot_name: Text
|
|
42
45
|
) -> Dict[Text, Text]:
|
|
43
|
-
if mapping.get(
|
|
46
|
+
if mapping.get(KEY_MAPPING_TYPE) not in [
|
|
44
47
|
str(SlotMappingType.FROM_ENTITY),
|
|
45
48
|
str(SlotMappingType.FROM_TRIGGER_INTENT),
|
|
46
49
|
]:
|
rasa/core/nlg/__init__.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
+
from rasa.core.nlg.callback import CallbackNaturalLanguageGenerator # noqa: F401
|
|
1
2
|
from rasa.core.nlg.generator import NaturalLanguageGenerator # noqa: F401
|
|
2
3
|
from rasa.core.nlg.response import TemplatedNaturalLanguageGenerator # noqa: F401
|
|
3
|
-
from rasa.core.nlg.callback import CallbackNaturalLanguageGenerator # noqa: F401
|
rasa/core/nlg/callback.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text
|
|
4
4
|
|
|
5
5
|
from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
|
|
6
6
|
from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
|
|
@@ -100,8 +100,7 @@ class CallbackNaturalLanguageGenerator(NaturalLanguageGenerator):
|
|
|
100
100
|
@staticmethod
|
|
101
101
|
def validate_response(content: Optional[Dict[Text, Any]]) -> bool:
|
|
102
102
|
"""Validate the NLG response. Raises exception on failure."""
|
|
103
|
-
from jsonschema import validate
|
|
104
|
-
from jsonschema import ValidationError
|
|
103
|
+
from jsonschema import ValidationError, validate
|
|
105
104
|
|
|
106
105
|
try:
|
|
107
106
|
if content is None or content == "":
|
|
@@ -2,22 +2,31 @@ from typing import Any, Dict, Optional, Text
|
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
from jinja2 import Template
|
|
5
|
+
|
|
5
6
|
from rasa import telemetry
|
|
6
7
|
from rasa.core.nlg.response import TemplatedNaturalLanguageGenerator
|
|
7
8
|
from rasa.core.nlg.summarize import summarize_conversation
|
|
8
9
|
from rasa.shared.constants import (
|
|
9
10
|
LLM_CONFIG_KEY,
|
|
10
11
|
MODEL_CONFIG_KEY,
|
|
12
|
+
MODEL_GROUP_ID_CONFIG_KEY,
|
|
11
13
|
MODEL_NAME_CONFIG_KEY,
|
|
14
|
+
OPENAI_PROVIDER,
|
|
12
15
|
PROMPT_CONFIG_KEY,
|
|
13
16
|
PROVIDER_CONFIG_KEY,
|
|
14
|
-
OPENAI_PROVIDER,
|
|
15
17
|
TIMEOUT_CONFIG_KEY,
|
|
16
|
-
MODEL_GROUP_ID_CONFIG_KEY,
|
|
17
18
|
)
|
|
18
19
|
from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
|
|
19
20
|
from rasa.shared.core.events import BotUttered, UserUttered
|
|
20
21
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
22
|
+
from rasa.shared.nlu.constants import (
|
|
23
|
+
KEY_COMPONENT_NAME,
|
|
24
|
+
KEY_LLM_RESPONSE_METADATA,
|
|
25
|
+
KEY_PROMPT_NAME,
|
|
26
|
+
KEY_USER_PROMPT,
|
|
27
|
+
PROMPTS,
|
|
28
|
+
)
|
|
29
|
+
from rasa.shared.providers.llm.llm_response import LLMResponse, measure_llm_latency
|
|
21
30
|
from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
|
|
22
31
|
from rasa.shared.utils.llm import (
|
|
23
32
|
DEFAULT_OPENAI_GENERATE_MODEL_NAME,
|
|
@@ -27,8 +36,6 @@ from rasa.shared.utils.llm import (
|
|
|
27
36
|
get_prompt_template,
|
|
28
37
|
llm_factory,
|
|
29
38
|
resolve_model_client_config,
|
|
30
|
-
)
|
|
31
|
-
from rasa.shared.utils.llm import (
|
|
32
39
|
tracker_as_readable_transcript,
|
|
33
40
|
)
|
|
34
41
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -57,7 +64,7 @@ DEFAULT_LLM_CONFIG = {
|
|
|
57
64
|
DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE = """The following is a conversation with
|
|
58
65
|
an AI assistant. The assistant is helpful, creative, clever, and very friendly.
|
|
59
66
|
Rephrase the suggested AI response staying close to the original message and retaining
|
|
60
|
-
its meaning. Use simple
|
|
67
|
+
its meaning. Use simple {{language}}.
|
|
61
68
|
|
|
62
69
|
Context / previous conversation with the user:
|
|
63
70
|
{{history}}
|
|
@@ -124,6 +131,55 @@ class ContextualResponseRephraser(
|
|
|
124
131
|
ContextualResponseRephraser.__name__,
|
|
125
132
|
)
|
|
126
133
|
|
|
134
|
+
@classmethod
|
|
135
|
+
def _add_prompt_and_llm_metadata_to_response(
|
|
136
|
+
cls,
|
|
137
|
+
response: Dict[str, Any],
|
|
138
|
+
prompt_name: str,
|
|
139
|
+
user_prompt: str,
|
|
140
|
+
llm_response: Optional["LLMResponse"] = None,
|
|
141
|
+
) -> Dict[str, Any]:
|
|
142
|
+
"""Stores the prompt and LLMResponse metadata to response.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
response: The response to add the prompt and LLMResponse metadata to.
|
|
146
|
+
prompt_name: A name identifying prompt usage.
|
|
147
|
+
user_prompt: The user prompt that was sent to the LLM.
|
|
148
|
+
llm_response: The response object from the LLM (None if no response).
|
|
149
|
+
"""
|
|
150
|
+
from rasa.dialogue_understanding.utils import record_commands_and_prompts
|
|
151
|
+
|
|
152
|
+
if not record_commands_and_prompts:
|
|
153
|
+
return response
|
|
154
|
+
|
|
155
|
+
prompt_data: Dict[Text, Any] = {
|
|
156
|
+
KEY_COMPONENT_NAME: cls.__name__,
|
|
157
|
+
KEY_PROMPT_NAME: prompt_name,
|
|
158
|
+
KEY_USER_PROMPT: user_prompt,
|
|
159
|
+
KEY_LLM_RESPONSE_METADATA: llm_response.to_dict() if llm_response else None,
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
prompts = response.get(PROMPTS, [])
|
|
163
|
+
prompts.append(prompt_data)
|
|
164
|
+
response[PROMPTS] = prompts
|
|
165
|
+
return response
|
|
166
|
+
|
|
167
|
+
@staticmethod
|
|
168
|
+
def get_language_label(tracker: DialogueStateTracker) -> str:
|
|
169
|
+
"""Fetches the label of the language to be used for the rephraser.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
tracker: The tracker to get the language from.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
The label of the current language, or "English" if no language is set.
|
|
176
|
+
"""
|
|
177
|
+
return (
|
|
178
|
+
tracker.current_language.label
|
|
179
|
+
if tracker.current_language
|
|
180
|
+
else tracker.default_language.label
|
|
181
|
+
)
|
|
182
|
+
|
|
127
183
|
def _last_message_if_human(self, tracker: DialogueStateTracker) -> Optional[str]:
|
|
128
184
|
"""Returns the latest message from the tracker.
|
|
129
185
|
|
|
@@ -142,20 +198,21 @@ class ContextualResponseRephraser(
|
|
|
142
198
|
return None
|
|
143
199
|
return None
|
|
144
200
|
|
|
145
|
-
|
|
146
|
-
|
|
201
|
+
@measure_llm_latency
|
|
202
|
+
async def _generate_llm_response(self, prompt: str) -> Optional[LLMResponse]:
|
|
203
|
+
"""Use LLM to generate a response, returning an LLMResponse object
|
|
204
|
+
containing both the generated text (choices) and metadata.
|
|
147
205
|
|
|
148
206
|
Args:
|
|
149
|
-
prompt:
|
|
207
|
+
prompt: The prompt to send to the LLM.
|
|
150
208
|
|
|
151
209
|
Returns:
|
|
152
|
-
|
|
210
|
+
An LLMResponse object if successful, otherwise None.
|
|
153
211
|
"""
|
|
154
212
|
llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
|
|
155
213
|
|
|
156
214
|
try:
|
|
157
|
-
|
|
158
|
-
return llm_response.choices[0]
|
|
215
|
+
return await llm.acompletion(prompt)
|
|
159
216
|
except Exception as e:
|
|
160
217
|
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
161
218
|
# we have to catch all exceptions here
|
|
@@ -240,6 +297,7 @@ class ContextualResponseRephraser(
|
|
|
240
297
|
suggested_response=response_text,
|
|
241
298
|
current_input=current_input,
|
|
242
299
|
slots=tracker.current_slot_values(),
|
|
300
|
+
language=self.get_language_label(tracker),
|
|
243
301
|
)
|
|
244
302
|
log_llm(
|
|
245
303
|
logger=structlogger,
|
|
@@ -255,11 +313,21 @@ class ContextualResponseRephraser(
|
|
|
255
313
|
or self.llm_property(MODEL_NAME_CONFIG_KEY),
|
|
256
314
|
llm_model_group_id=self.llm_property(MODEL_GROUP_ID_CONFIG_KEY),
|
|
257
315
|
)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
316
|
+
llm_response = await self._generate_llm_response(prompt)
|
|
317
|
+
llm_response = LLMResponse.ensure_llm_response(llm_response)
|
|
318
|
+
|
|
319
|
+
response = self._add_prompt_and_llm_metadata_to_response(
|
|
320
|
+
response=response,
|
|
321
|
+
prompt_name="rephrase_prompt",
|
|
322
|
+
user_prompt=prompt,
|
|
323
|
+
llm_response=llm_response,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
if not (llm_response and llm_response.choices and llm_response.choices[0]):
|
|
327
|
+
# If the LLM fails to generate a response, return the original response.
|
|
261
328
|
return response
|
|
262
329
|
|
|
330
|
+
updated_text = llm_response.choices[0]
|
|
263
331
|
structlogger.debug(
|
|
264
332
|
"nlg.rewrite.complete",
|
|
265
333
|
response_text=response_text,
|
rasa/core/nlg/generator.py
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
from typing import Any, Dict, List, Optional, Text, Union
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from jinja2 import Template
|
|
5
|
+
from pypred import Predicate
|
|
3
6
|
|
|
4
7
|
import rasa.shared.utils.common
|
|
5
8
|
import rasa.shared.utils.io
|
|
6
9
|
from rasa.shared.constants import CHANNEL, RESPONSE_CONDITION
|
|
7
10
|
from rasa.shared.core.domain import Domain
|
|
8
|
-
from rasa.utils.endpoints import EndpointConfig
|
|
9
11
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
12
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
structlogger = structlog.get_logger()
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
class NaturalLanguageGenerator:
|
|
@@ -74,7 +77,11 @@ def _create_from_endpoint_config(
|
|
|
74
77
|
else:
|
|
75
78
|
nlg = _load_from_module_name_in_endpoint_config(endpoint_config, domain)
|
|
76
79
|
|
|
77
|
-
|
|
80
|
+
structlogger.debug(
|
|
81
|
+
"rasa.core.nlg.generator.create",
|
|
82
|
+
nlg_class_name=nlg.__class__.__name__,
|
|
83
|
+
event_info=f"Instantiated NLG to '{nlg.__class__.__name__}'.",
|
|
84
|
+
)
|
|
78
85
|
return nlg
|
|
79
86
|
|
|
80
87
|
|
|
@@ -112,18 +119,15 @@ class ResponseVariationFilter:
|
|
|
112
119
|
) -> bool:
|
|
113
120
|
"""Checks if the conditional response variation matches the filled slots."""
|
|
114
121
|
constraints = response.get(RESPONSE_CONDITION, [])
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
if isinstance(constraints, str) and not _evaluate_predicate(
|
|
123
|
+
constraints, filled_slots
|
|
124
|
+
):
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
elif isinstance(constraints, list):
|
|
128
|
+
for constraint in constraints:
|
|
129
|
+
if not _evaluate_and_deprecate_condition(constraint, filled_slots):
|
|
121
130
|
return False
|
|
122
|
-
# slot values can be of different data types
|
|
123
|
-
# such as int, float, bool, etc. hence, this check
|
|
124
|
-
# executes when slot values are not strings
|
|
125
|
-
elif filled_slots_value != value:
|
|
126
|
-
return False
|
|
127
131
|
|
|
128
132
|
return True
|
|
129
133
|
|
|
@@ -180,7 +184,21 @@ class ResponseVariationFilter:
|
|
|
180
184
|
if conditional_no_channel:
|
|
181
185
|
return conditional_no_channel
|
|
182
186
|
|
|
183
|
-
|
|
187
|
+
if default_no_channel:
|
|
188
|
+
return default_no_channel
|
|
189
|
+
|
|
190
|
+
# if there is no response variation selected,
|
|
191
|
+
# return the internal error response to prevent
|
|
192
|
+
# the bot from staying silent
|
|
193
|
+
structlogger.error(
|
|
194
|
+
"rasa.core.nlg.generator.responses_for_utter_action.no_response",
|
|
195
|
+
utter_action=utter_action,
|
|
196
|
+
event_info=f"No response variation selected for the predicted "
|
|
197
|
+
f"utterance {utter_action}. Please check you have provided "
|
|
198
|
+
f"a default variation and that all the conditions are valid. "
|
|
199
|
+
f"Returning the internal error response.",
|
|
200
|
+
)
|
|
201
|
+
return self.responses.get("utter_internal_error_rasa", [])
|
|
184
202
|
|
|
185
203
|
def get_response_variation_id(
|
|
186
204
|
self,
|
|
@@ -228,3 +246,53 @@ class ResponseVariationFilter:
|
|
|
228
246
|
response_ids.add(response_variation_id)
|
|
229
247
|
|
|
230
248
|
return True
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def _evaluate_and_deprecate_condition(
|
|
252
|
+
constraint: Dict[Text, Any], filled_slots: Dict[Text, Any]
|
|
253
|
+
) -> bool:
|
|
254
|
+
"""Evaluates the condition of a response variation."""
|
|
255
|
+
rasa.shared.utils.io.raise_deprecation_warning(
|
|
256
|
+
"Using a dictionary as a condition in a response variation is deprecated. "
|
|
257
|
+
"Please use a pypred string predicate instead. "
|
|
258
|
+
"Dictionary conditions will be removed in Rasa Open Source 4.0.0 .",
|
|
259
|
+
warn_until_version="4.0.0",
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
name = constraint["name"]
|
|
263
|
+
value = constraint["value"]
|
|
264
|
+
filled_slots_value = filled_slots.get(name)
|
|
265
|
+
if isinstance(filled_slots_value, str) and isinstance(value, str):
|
|
266
|
+
if filled_slots_value.casefold() != value.casefold():
|
|
267
|
+
return False
|
|
268
|
+
# slot values can be of different data types
|
|
269
|
+
# such as int, float, bool, etc. hence, this check
|
|
270
|
+
# executes when slot values are not strings
|
|
271
|
+
elif filled_slots_value != value:
|
|
272
|
+
return False
|
|
273
|
+
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def _evaluate_predicate(constraint: str, filled_slots: Dict[Text, Any]) -> bool:
|
|
278
|
+
"""Evaluates the condition of a response variation."""
|
|
279
|
+
context = {"slots": filled_slots}
|
|
280
|
+
document = context.copy()
|
|
281
|
+
try:
|
|
282
|
+
rendered_template = Template(constraint).render(context)
|
|
283
|
+
predicate = Predicate(rendered_template)
|
|
284
|
+
result = predicate.evaluate(document)
|
|
285
|
+
structlogger.debug(
|
|
286
|
+
"rasa.core.nlg.generator.evaluate_conditional_response_predicate",
|
|
287
|
+
predicate=predicate.description(),
|
|
288
|
+
result=result,
|
|
289
|
+
)
|
|
290
|
+
return result
|
|
291
|
+
except (TypeError, Exception) as e:
|
|
292
|
+
structlogger.error(
|
|
293
|
+
"rasa.core.nlg.generator.evaluate_conditional_response_predicate.error",
|
|
294
|
+
predicate=constraint,
|
|
295
|
+
document=document,
|
|
296
|
+
error=str(e),
|
|
297
|
+
)
|
|
298
|
+
return False
|
rasa/core/nlg/interpolator.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import copy
|
|
2
|
-
import re
|
|
3
2
|
import logging
|
|
4
|
-
|
|
3
|
+
import re
|
|
4
|
+
from typing import Any, Dict, List, Text, Union
|
|
5
|
+
|
|
5
6
|
import jinja2
|
|
6
7
|
import structlog
|
|
7
|
-
from
|
|
8
|
+
from jinja2 import Template
|
|
8
9
|
|
|
9
10
|
from rasa.core.constants import JINJA2_TEMPLATE_ENGINE, RASA_FORMAT_TEMPLATE_ENGINE
|
|
10
11
|
|
rasa/core/nlg/response.py
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import logging
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
from rasa.shared.core.trackers import DialogueStateTracker
|
|
6
|
-
from typing import Text, Any, Dict, Optional, List
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text
|
|
7
4
|
|
|
5
|
+
from rasa.core.constants import DEFAULT_TEMPLATE_ENGINE, TEMPLATE_ENGINE_CONFIG_KEY
|
|
8
6
|
from rasa.core.nlg import interpolator
|
|
9
7
|
from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
|
|
10
8
|
from rasa.shared.constants import RESPONSE_CONDITION
|
|
11
9
|
from rasa.shared.core.domain import RESPONSE_KEYS_TO_INTERPOLATE
|
|
10
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
12
11
|
from rasa.shared.nlu.constants import METADATA
|
|
13
12
|
|
|
14
13
|
logger = logging.getLogger(__name__)
|
|
@@ -50,9 +49,12 @@ class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
|
|
|
50
49
|
selected_response = np.random.choice(suitable_responses)
|
|
51
50
|
condition = selected_response.get(RESPONSE_CONDITION)
|
|
52
51
|
if condition:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
if isinstance(condition, list):
|
|
53
|
+
formatted_response_conditions = (
|
|
54
|
+
self._format_response_conditions(condition)
|
|
55
|
+
)
|
|
56
|
+
else:
|
|
57
|
+
formatted_response_conditions = condition
|
|
56
58
|
logger.debug(
|
|
57
59
|
"Selecting response variation with conditions:"
|
|
58
60
|
f"{formatted_response_conditions}"
|
rasa/core/nlg/summarize.py
CHANGED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Optional, Text
|
|
2
|
+
|
|
3
|
+
from rasa.engine.language import Language
|
|
4
|
+
from rasa.shared.core.flows.constants import KEY_TRANSLATION
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def get_translated_text(
|
|
8
|
+
text: Optional[Text],
|
|
9
|
+
translation: Dict[Text, Any],
|
|
10
|
+
language: Optional[Language] = None,
|
|
11
|
+
) -> Optional[Text]:
|
|
12
|
+
"""Get the translated text from the message.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
text: The default text to use if no translation is found.
|
|
16
|
+
translation: The translations for the text.
|
|
17
|
+
language: The language to use for the translation.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
The translated text if found, otherwise the default text.
|
|
21
|
+
"""
|
|
22
|
+
language_code = language.code if language else None
|
|
23
|
+
return translation.get(language_code, text)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_translated_buttons(
|
|
27
|
+
buttons: Optional[List[Dict[Text, Any]]], language: Optional[Language] = None
|
|
28
|
+
) -> Optional[List[Dict[Text, Any]]]:
|
|
29
|
+
"""Get the translated buttons from the message.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
buttons: The default buttons to use if no translation is found.
|
|
33
|
+
language: The language to use for the translation.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The translated buttons if found; otherwise, the default buttons.
|
|
37
|
+
"""
|
|
38
|
+
if buttons is None:
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
language_code = language.code if language else None
|
|
42
|
+
translated_buttons = []
|
|
43
|
+
for button in buttons:
|
|
44
|
+
translation = button.get(KEY_TRANSLATION, {})
|
|
45
|
+
language_translation = translation.get(language_code, {})
|
|
46
|
+
|
|
47
|
+
# Maintain the original key order to ensure
|
|
48
|
+
# accurate comparisons of BotUtter events.
|
|
49
|
+
translated_button = {
|
|
50
|
+
key: language_translation.get(key, button.get(key))
|
|
51
|
+
for key, value in button.items()
|
|
52
|
+
if key != KEY_TRANSLATION
|
|
53
|
+
}
|
|
54
|
+
translated_buttons.append(translated_button)
|
|
55
|
+
return translated_buttons
|
rasa/core/persistor.py
CHANGED
|
@@ -9,14 +9,13 @@ from typing import TYPE_CHECKING, List, Optional, Text, Tuple, Union
|
|
|
9
9
|
|
|
10
10
|
import structlog
|
|
11
11
|
|
|
12
|
-
from rasa.exceptions import ModelNotFound
|
|
13
12
|
import rasa.shared.utils.common
|
|
14
13
|
import rasa.utils.common
|
|
15
14
|
from rasa.constants import (
|
|
15
|
+
DEFAULT_BUCKET_NAME,
|
|
16
16
|
HTTP_STATUS_FORBIDDEN,
|
|
17
17
|
HTTP_STATUS_NOT_FOUND,
|
|
18
18
|
MODEL_ARCHIVE_EXTENSION,
|
|
19
|
-
DEFAULT_BUCKET_NAME,
|
|
20
19
|
)
|
|
21
20
|
from rasa.env import (
|
|
22
21
|
AWS_ENDPOINT_URL_ENV,
|
|
@@ -26,6 +25,7 @@ from rasa.env import (
|
|
|
26
25
|
BUCKET_NAME_ENV,
|
|
27
26
|
REMOTE_STORAGE_PATH_ENV,
|
|
28
27
|
)
|
|
28
|
+
from rasa.exceptions import ModelNotFound
|
|
29
29
|
from rasa.shared.exceptions import RasaException
|
|
30
30
|
from rasa.shared.utils.io import raise_warning
|
|
31
31
|
|
|
@@ -367,8 +367,8 @@ class GCSPersistor(Persistor):
|
|
|
367
367
|
self.bucket = self.storage_client.bucket(bucket_name)
|
|
368
368
|
|
|
369
369
|
def _ensure_bucket_exists(self, bucket_name: Text) -> None:
|
|
370
|
-
from google.cloud import exceptions
|
|
371
370
|
from google.auth import exceptions as auth_exceptions
|
|
371
|
+
from google.cloud import exceptions
|
|
372
372
|
|
|
373
373
|
try:
|
|
374
374
|
self.storage_client.get_bucket(bucket_name)
|
rasa/core/policies/ensemble.py
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Optional, Text, List, Dict, Any
|
|
2
|
+
|
|
4
3
|
import logging
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from typing import Any, Dict, List, Optional, Text
|
|
5
6
|
|
|
7
|
+
from rasa.core.policies.policy import PolicyPrediction
|
|
6
8
|
from rasa.engine.graph import GraphComponent
|
|
7
|
-
from rasa.engine.storage.storage import ModelStorage
|
|
8
|
-
from rasa.engine.storage.resource import Resource
|
|
9
9
|
from rasa.engine.runner.interface import ExecutionContext
|
|
10
|
-
from rasa.
|
|
11
|
-
from rasa.
|
|
10
|
+
from rasa.engine.storage.resource import Resource
|
|
11
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
12
12
|
from rasa.shared.core.constants import ACTION_LISTEN_NAME
|
|
13
13
|
from rasa.shared.core.domain import Domain
|
|
14
14
|
from rasa.shared.core.events import (
|
|
15
|
-
ActionExecutionRejected,
|
|
16
15
|
ActionExecuted,
|
|
16
|
+
ActionExecutionRejected,
|
|
17
17
|
DefinePrevUserUtteredFeaturization,
|
|
18
18
|
)
|
|
19
19
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
20
|
+
from rasa.shared.exceptions import InvalidConfigException, RasaException
|
|
20
21
|
|
|
21
22
|
logger = logging.getLogger(__name__)
|
|
22
23
|
|
|
@@ -34,11 +35,11 @@ def is_not_in_training_data(
|
|
|
34
35
|
`False` if and only if an action was predicted (i.e. `max_confidence` > 0) by
|
|
35
36
|
a `MemoizationPolicy`
|
|
36
37
|
"""
|
|
37
|
-
from rasa.core.policies.rule_policy import RulePolicy
|
|
38
38
|
from rasa.core.policies.memoization import (
|
|
39
|
-
MemoizationPolicy,
|
|
40
39
|
AugmentedMemoizationPolicy,
|
|
40
|
+
MemoizationPolicy,
|
|
41
41
|
)
|
|
42
|
+
from rasa.core.policies.rule_policy import RulePolicy
|
|
42
43
|
|
|
43
44
|
if not policy_name:
|
|
44
45
|
return True
|