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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
You are a detail-oriented judge whose task is to generate {{ num_variations }} question variations based on the provided answer.
|
|
2
|
+
Each question variation should be a question that the input answer is attempting to address.
|
|
3
|
+
|
|
4
|
+
## Task Steps
|
|
5
|
+
|
|
6
|
+
Follow these steps to complete the task:
|
|
7
|
+
|
|
8
|
+
1. Generate {{ num_variations }} question variations that the input answer is attempting to answer.
|
|
9
|
+
3. Compile all the question variations into a JSON object.
|
|
10
|
+
|
|
11
|
+
### JSON Output
|
|
12
|
+
|
|
13
|
+
Format your output as a JSON object with the following attribute:
|
|
14
|
+
|
|
15
|
+
- `question_variations`: a list of strings, where each string represents the generated question that the input answer is addressing.
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"question_variations": [
|
|
22
|
+
"Does Rasa Pro support building an AI assistant with LLMs?",
|
|
23
|
+
"In which version of Rasa Pro was support for LLM usage released?",
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Task Requirements
|
|
29
|
+
|
|
30
|
+
- Ensure that each question variation is relevant to the input answer.
|
|
31
|
+
|
|
32
|
+
### Examples
|
|
33
|
+
|
|
34
|
+
These are a few examples of how to generate question variations and identify non-committed answers:
|
|
35
|
+
|
|
36
|
+
#### Example 1
|
|
37
|
+
- **Input Answer**:
|
|
38
|
+
```
|
|
39
|
+
You can build a CALM assistant with Rasa Pro by defining your own business logic flows.
|
|
40
|
+
I could not identify the exact version of Rasa Pro which released CALM.
|
|
41
|
+
```
|
|
42
|
+
- **Output**:
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"question_variations": [
|
|
46
|
+
"How can you build a CALM assistant with Rasa Pro?",
|
|
47
|
+
"What is the version of Rasa Pro that released CALM?",
|
|
48
|
+
"What type of assistant can you build with Rasa Pro?",
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### Example 2:
|
|
54
|
+
- **Input Answer**:
|
|
55
|
+
```
|
|
56
|
+
You can integrate external knowledge sources into your Rasa Pro assistant.
|
|
57
|
+
```
|
|
58
|
+
- **Output**:
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"question_variations": [
|
|
62
|
+
"Can you integrate external knowledge sources into your Rasa Pro assistant?",
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
#### Example 3:
|
|
69
|
+
- **Input Answer**:
|
|
70
|
+
```
|
|
71
|
+
Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI, in version 3.7.0.
|
|
72
|
+
```
|
|
73
|
+
- **Output**:
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"question_variations": [
|
|
77
|
+
"What is CALM in Rasa Pro?",
|
|
78
|
+
"In which Rasa Pro version was CALM released?",
|
|
79
|
+
"What is the LLM-native approach in Rasa Pro?",
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
## Task Inputs
|
|
86
|
+
|
|
87
|
+
- **Input Answer**: {{ bot_message }}
|
|
88
|
+
|
|
89
|
+
## Task Outputs
|
|
90
|
+
|
|
91
|
+
Do not include any additional explanations in your output. Only provide the JSON object as described in the task steps.
|
|
92
|
+
|
|
93
|
+
Your output:
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
You are a detail-oriented impartial judge whose task is to evaluate the correctness of a given answer based on the provided ground truth.
|
|
2
|
+
|
|
3
|
+
## Task Steps
|
|
4
|
+
|
|
5
|
+
Follow these steps to complete the task:
|
|
6
|
+
|
|
7
|
+
1. Given the input answer, break down the answer into one or more sentences.
|
|
8
|
+
2. Extract from each sentence one or more fully understandable and distinct statements while also ensuring no pronouns are used in each statement.
|
|
9
|
+
3. For each statement, determine whether the statement is supported by the provided ground truth. If the statement is supported,
|
|
10
|
+
mark it with the score `1`. If the statement is not supported, mark it with the score `0`.
|
|
11
|
+
4. Provide a justification for the score you assigned. Each justification must reference the relevant part of the ground truth.
|
|
12
|
+
5. Compile all the statements, scores, and justifications into a JSON object.
|
|
13
|
+
|
|
14
|
+
### JSON Output
|
|
15
|
+
|
|
16
|
+
Format your output as a JSON object with the following attribute:
|
|
17
|
+
|
|
18
|
+
- `statements`: a list of dictionaries, where each dictionary contains the following keys:
|
|
19
|
+
- `statement`: the extracted statement from the input answer
|
|
20
|
+
- `score`: the score assigned to the statement (0 or 1)
|
|
21
|
+
- `justification`: a brief and distinct explanation justifying the score assigned to the statement
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"statements": [
|
|
28
|
+
{
|
|
29
|
+
"statement": "You can run Rasa Pro using Python 3.11 starting from Rasa Pro version 3.11.",
|
|
30
|
+
"score": 1,
|
|
31
|
+
"justification": "According to the ground truth source, support for Python 3.11 was added in Rasa Pro version 3.11"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"statement": "Rasa Pro does not support LLM usage in any version.",
|
|
35
|
+
"score": 0,
|
|
36
|
+
"justification": "According to the ground truth source, Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI, in version 3.7.0"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Task Requirements
|
|
43
|
+
|
|
44
|
+
- If the answer contains multiple statements, ensure that each statement is evaluated independently.
|
|
45
|
+
- If the answer contains a statement that is not verifiable by the ground truth, mark the statement as unsupported with the score `0`.
|
|
46
|
+
- If the answer contains a statement that is verifiable by the ground truth, mark the statement as supported with the score `1`.
|
|
47
|
+
- Provide a brief justification for each score assigned to a statement.
|
|
48
|
+
|
|
49
|
+
### Examples
|
|
50
|
+
|
|
51
|
+
These are a few examples of how to evaluate the correctness of the answer based on the ground truth:
|
|
52
|
+
|
|
53
|
+
#### Example 1
|
|
54
|
+
- **Input Answer**:
|
|
55
|
+
```
|
|
56
|
+
You can build a CALM assistant with Rasa Pro by defining your own business logic flows.
|
|
57
|
+
In addition, CALM leverages customizable default flows designed to handle various conversational repair scenarios.
|
|
58
|
+
CALM contains a built-in LLM approach designed to generate predefined commands that
|
|
59
|
+
reflect the user's intentions to start and stop flows, fill slots and more.
|
|
60
|
+
```
|
|
61
|
+
- **Ground Truth**:
|
|
62
|
+
```
|
|
63
|
+
Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI, in version 3.7.0.
|
|
64
|
+
The CALM approach has three key elements: Business Logic, Dialogue Understanding, and Automatic Conversation Repair.
|
|
65
|
+
Business logic is implemented as a set of flows. A flow describes a business process that your AI assistant can handle.
|
|
66
|
+
Dialogue understanding is designed to interpret what end users are communicating to your assistant.
|
|
67
|
+
This process involves generating commands that reflect the user's intentions, by starting and stopping flows, filling slots and more.
|
|
68
|
+
Automatic conversation repair handles all the ways conversations can go "off script". This is implemented as a set of default flows open for customization.
|
|
69
|
+
```
|
|
70
|
+
- **Output**:
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"statements": [
|
|
74
|
+
{
|
|
75
|
+
"statement": "You can build a CALM assistant with Rasa Pro.",
|
|
76
|
+
"score": 1,
|
|
77
|
+
"justification": "The ground truth confirms that Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"statement": "You can define your own business logic as flows in a CALM assistant with Rasa Pro.",
|
|
81
|
+
"score": 1,
|
|
82
|
+
"justification": "The ground truth confirms that business logic is implemented as a set of flows in CALM"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"statement": "Conversation repair scenarios are handled by customizable default flows in CALM.",
|
|
86
|
+
"score": 1,
|
|
87
|
+
"justification": "The ground truth confirms that automatic conversation repair is implemented as a set of default flows open for customization"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"statement": "CALM contains a built-in LLM approach.",
|
|
91
|
+
"score": 1,
|
|
92
|
+
"justification": "The ground truth confirms that CALM leverages an LLM-native approach"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"statement": "The LLM approach in CALM generates predefined commands reflecting user intentions.",
|
|
96
|
+
"score": 1,
|
|
97
|
+
"justification": "The ground truth confirms that dialogue understanding involves generating commands reflecting user intentions"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"statement": "The LLM approach in CALM is designed to start and stop flows, fill slots, and more.",
|
|
101
|
+
"score": 1,
|
|
102
|
+
"justification": "The ground truth confirms that dialogue understanding involves generating commands to start and stop flows, fill slots, and more"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
#### Example 2:
|
|
109
|
+
- **Input Answer**:
|
|
110
|
+
```
|
|
111
|
+
You cannot integrate external knowledge into your Rasa Pro assistant.
|
|
112
|
+
```
|
|
113
|
+
- **Ground Truth**:
|
|
114
|
+
```
|
|
115
|
+
The Enterprise Search Policy is part of Rasa's new Conversational AI with Language Models (CALM) approach and available starting with version 3.7.0.
|
|
116
|
+
The Enterprise Search Policy uses an LLM to search external knowledge base documents in order to deliver a relevant, context-aware response from the data.
|
|
117
|
+
```
|
|
118
|
+
- **Output**:
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"statements": [
|
|
122
|
+
{
|
|
123
|
+
"statement": "Rasa Pro does not support integrating external knowledge.",
|
|
124
|
+
"score": 0,
|
|
125
|
+
"justification": "The provided statement is incorrect, because the ground truth confirms that the Enterprise Search Policy in Rasa Pro's CALM approach uses an LLM to search external knowledge base documents"
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
#### Example 3:
|
|
133
|
+
- **Input Answer**:
|
|
134
|
+
```
|
|
135
|
+
Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI, in version 3.6.0.
|
|
136
|
+
```
|
|
137
|
+
- **Ground Truth**:
|
|
138
|
+
```
|
|
139
|
+
Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI, in version 3.7.0.
|
|
140
|
+
```
|
|
141
|
+
- **Output**:
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"statements": [
|
|
145
|
+
{
|
|
146
|
+
"statement": "CALM is Rasa Pro's LLM-native approach to building reliable conversational AI.",
|
|
147
|
+
"score": 1,
|
|
148
|
+
"justification": "The ground truth confirms that Rasa Pro has released CALM, its LLM-native approach to building reliable conversational AI"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"statement": "CALM was released in Rasa Pro version 3.6.0.",
|
|
152
|
+
"score": 0,
|
|
153
|
+
"justification": "The provided statement is incorrect, as the ground truth confirms that CALM was released in Rasa Pro version 3.7.0"
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
## Task Inputs
|
|
161
|
+
|
|
162
|
+
- **Input Answer**: {{ bot_message }}
|
|
163
|
+
- **Ground Truth**: {{ ground_truth }}
|
|
164
|
+
|
|
165
|
+
## Task Outputs
|
|
166
|
+
|
|
167
|
+
Do not include any additional explanations in your output. Only provide the JSON object as described in the task steps.
|
|
168
|
+
|
|
169
|
+
Your output:
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
|
|
3
|
+
|
|
4
|
+
import jsonschema
|
|
5
|
+
import numpy as np
|
|
6
|
+
import structlog
|
|
7
|
+
from pydantic import BaseModel, ConfigDict
|
|
8
|
+
|
|
9
|
+
from rasa.core.constants import (
|
|
10
|
+
UTTER_SOURCE_METADATA_KEY,
|
|
11
|
+
)
|
|
12
|
+
from rasa.e2e_test.constants import (
|
|
13
|
+
KEY_JUSTIFICATION,
|
|
14
|
+
KEY_SCORE,
|
|
15
|
+
)
|
|
16
|
+
from rasa.e2e_test.e2e_config import LLMJudgeConfig
|
|
17
|
+
from rasa.shared.constants import MODEL_CONFIG_KEY, OPENAI_PROVIDER, PROVIDER_CONFIG_KEY
|
|
18
|
+
from rasa.shared.core.events import BotUttered
|
|
19
|
+
from rasa.shared.exceptions import RasaException
|
|
20
|
+
from rasa.shared.utils.llm import DEFAULT_OPENAI_EMBEDDING_MODEL_NAME, embedder_factory
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from rasa.shared.core.events import Event
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
structlogger = structlog.get_logger()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
DEFAULT_EMBEDDINGS_CONFIG = {
|
|
30
|
+
PROVIDER_CONFIG_KEY: OPENAI_PROVIDER,
|
|
31
|
+
MODEL_CONFIG_KEY: DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
ELIGIBLE_UTTER_SOURCE_METADATA = [
|
|
35
|
+
"EnterpriseSearchPolicy",
|
|
36
|
+
"ContextualResponseRephraser",
|
|
37
|
+
"IntentlessPolicy",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
GROUNDEDNESS_JSON_SUB_SCHEMA = {
|
|
41
|
+
"properties": {
|
|
42
|
+
"statements": {
|
|
43
|
+
"type": "array",
|
|
44
|
+
"items": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"properties": {
|
|
47
|
+
"statement": {"type": "string"},
|
|
48
|
+
"score": {"type": "number"},
|
|
49
|
+
"justification": {"type": "string"},
|
|
50
|
+
},
|
|
51
|
+
"required": ["statement", "score", "justification"],
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"required": ["statements"],
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
ANSWER_RELEVANCE_JSON_SUB_SCHEMA = {
|
|
59
|
+
"properties": {
|
|
60
|
+
"question_variations": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"items": {"type": "string"},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
"required": ["question_variations"],
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
LLM_JUDGE_OUTPUT_JSON_SCHEMA = {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"oneOf": [
|
|
71
|
+
GROUNDEDNESS_JSON_SUB_SCHEMA,
|
|
72
|
+
ANSWER_RELEVANCE_JSON_SUB_SCHEMA,
|
|
73
|
+
],
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ScoreInputs(BaseModel):
|
|
78
|
+
"""Input data for the score calculation."""
|
|
79
|
+
|
|
80
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
81
|
+
|
|
82
|
+
threshold: float
|
|
83
|
+
matching_event: BotUttered
|
|
84
|
+
user_question: str
|
|
85
|
+
llm_judge_config: LLMJudgeConfig
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _calculate_similarity(
|
|
89
|
+
user_question: str,
|
|
90
|
+
generated_questions: List[str],
|
|
91
|
+
llm_judge_config: LLMJudgeConfig,
|
|
92
|
+
) -> np.ndarray:
|
|
93
|
+
"""Calculate the cosine similarity between the user question and the generated questions.""" # noqa: E501
|
|
94
|
+
embedding_client = embedder_factory(
|
|
95
|
+
llm_judge_config.embeddings_config_as_dict, DEFAULT_EMBEDDINGS_CONFIG
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
user_question_embedding_response = embedding_client.embed([user_question])
|
|
99
|
+
question_vector = np.asarray(user_question_embedding_response.data[0]).reshape(
|
|
100
|
+
1, -1
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
gen_questions_embedding_response = embedding_client.embed(generated_questions)
|
|
104
|
+
generated_questions_vectors = np.asarray(
|
|
105
|
+
gen_questions_embedding_response.data
|
|
106
|
+
).reshape(len(generated_questions), -1)
|
|
107
|
+
|
|
108
|
+
# calculate norm
|
|
109
|
+
question_vector_norm = np.linalg.norm(question_vector, axis=1)
|
|
110
|
+
generated_questions_vectors_norm = np.linalg.norm(
|
|
111
|
+
generated_questions_vectors, axis=1
|
|
112
|
+
)
|
|
113
|
+
norm = generated_questions_vectors_norm * question_vector_norm
|
|
114
|
+
norm = np.maximum(norm, 1e-10)
|
|
115
|
+
|
|
116
|
+
# calculate the dot product
|
|
117
|
+
dot_product = np.dot(generated_questions_vectors, question_vector.T).reshape(-1)
|
|
118
|
+
|
|
119
|
+
# calculate and return cosine similarity
|
|
120
|
+
return dot_product / norm
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def calculate_relevance_score(
|
|
124
|
+
processed_output: List[Union[str, Dict[str, Any]]],
|
|
125
|
+
score_inputs: ScoreInputs,
|
|
126
|
+
) -> Tuple[float, str]:
|
|
127
|
+
"""Calculate the score based on the LLM response."""
|
|
128
|
+
user_question = score_inputs.user_question
|
|
129
|
+
llm_judge_config = score_inputs.llm_judge_config
|
|
130
|
+
|
|
131
|
+
generated_questions = [output for output in processed_output]
|
|
132
|
+
if all(not question for question in generated_questions):
|
|
133
|
+
score = 0.0
|
|
134
|
+
error_justification = "No relevant questions were generated"
|
|
135
|
+
return score, error_justification
|
|
136
|
+
|
|
137
|
+
cosine_sim = _calculate_similarity(
|
|
138
|
+
user_question, generated_questions, llm_judge_config
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
score = cosine_sim.mean()
|
|
142
|
+
|
|
143
|
+
if score < score_inputs.threshold:
|
|
144
|
+
error_justifications = [
|
|
145
|
+
f"Question '{generated_questions[i]}' "
|
|
146
|
+
f"has a cosine similarity score of '{round(cosine_sim[i], 2)}' "
|
|
147
|
+
f"with the user question '{user_question}'"
|
|
148
|
+
for i in range(len(generated_questions))
|
|
149
|
+
]
|
|
150
|
+
error_justification = ", ".join(error_justifications)
|
|
151
|
+
return score, error_justification
|
|
152
|
+
|
|
153
|
+
return score, ""
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def calculate_groundedness_score(
|
|
157
|
+
processed_output: List[Any],
|
|
158
|
+
score_inputs: ScoreInputs,
|
|
159
|
+
) -> Tuple[float, str]:
|
|
160
|
+
"""Calculate the score based on the LLM response."""
|
|
161
|
+
matching_event = score_inputs.matching_event
|
|
162
|
+
|
|
163
|
+
total_statements = len(processed_output)
|
|
164
|
+
correct_statements = sum([output.get(KEY_SCORE, 0) for output in processed_output])
|
|
165
|
+
score = correct_statements / total_statements
|
|
166
|
+
|
|
167
|
+
structlogger.debug(
|
|
168
|
+
"generative_response_is_grounded_assertion.run_results",
|
|
169
|
+
matching_event=repr(matching_event),
|
|
170
|
+
score=score,
|
|
171
|
+
justification=f"There were {correct_statements} correct statements "
|
|
172
|
+
f"out of {total_statements} total extracted statements.",
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
if score < score_inputs.threshold:
|
|
176
|
+
justifications = [
|
|
177
|
+
output.get(KEY_JUSTIFICATION, "")
|
|
178
|
+
for output in processed_output
|
|
179
|
+
if output.get(KEY_SCORE, 0) == 0
|
|
180
|
+
]
|
|
181
|
+
justification = ", ".join(justifications).replace(".", "")
|
|
182
|
+
|
|
183
|
+
error_justification = (
|
|
184
|
+
f"There were {total_statements - correct_statements} "
|
|
185
|
+
f"incorrect statements out of {total_statements} total "
|
|
186
|
+
f"extracted statements. The justifications for "
|
|
187
|
+
f"these statements include: {justification}"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
return score, error_justification
|
|
191
|
+
|
|
192
|
+
return score, ""
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _find_matching_generative_events(
|
|
196
|
+
turn_events: List["Event"], utter_source: Optional[str]
|
|
197
|
+
) -> List[BotUttered]:
|
|
198
|
+
"""Find the matching events for the generative response assertions."""
|
|
199
|
+
if utter_source is None:
|
|
200
|
+
return [
|
|
201
|
+
event
|
|
202
|
+
for event in turn_events
|
|
203
|
+
if isinstance(event, BotUttered)
|
|
204
|
+
and event.metadata.get(UTTER_SOURCE_METADATA_KEY)
|
|
205
|
+
in ELIGIBLE_UTTER_SOURCE_METADATA
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
return [
|
|
209
|
+
event
|
|
210
|
+
for event in turn_events
|
|
211
|
+
if isinstance(event, BotUttered)
|
|
212
|
+
and event.metadata.get(UTTER_SOURCE_METADATA_KEY) == utter_source
|
|
213
|
+
]
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def _parse_llm_output(llm_response: str, bot_message: str) -> Dict[str, Any]:
|
|
217
|
+
"""Parse the LLM output."""
|
|
218
|
+
llm_output = (
|
|
219
|
+
llm_response.replace("```json\n", "").replace("```", "").replace("\n", "")
|
|
220
|
+
)
|
|
221
|
+
try:
|
|
222
|
+
parsed_llm_output = json.loads(llm_output)
|
|
223
|
+
except json.JSONDecodeError as exc:
|
|
224
|
+
raise RasaException(
|
|
225
|
+
f"Failed to parse the LLM Judge response '{llm_output}' for "
|
|
226
|
+
f"the generative bot message '{bot_message}': {exc}"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return parsed_llm_output
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _validate_parsed_llm_output(
|
|
233
|
+
parsed_llm_output: Dict[str, Any], bot_message: str
|
|
234
|
+
) -> None:
|
|
235
|
+
"""Validate the parsed LLM output."""
|
|
236
|
+
try:
|
|
237
|
+
jsonschema.validate(parsed_llm_output, LLM_JUDGE_OUTPUT_JSON_SCHEMA)
|
|
238
|
+
except jsonschema.ValidationError as exc:
|
|
239
|
+
raise RasaException(
|
|
240
|
+
f"Failed to validate the LLM Judge json response "
|
|
241
|
+
f"'{parsed_llm_output}' for the generative bot message "
|
|
242
|
+
f"'{bot_message}'. Error: {exc}"
|
|
243
|
+
)
|