rasa-pro 3.11.0a4.dev3__py3-none-any.whl → 3.11.0rc1__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.

Files changed (163) hide show
  1. rasa/__main__.py +22 -12
  2. rasa/api.py +1 -1
  3. rasa/cli/arguments/default_arguments.py +1 -2
  4. rasa/cli/arguments/shell.py +5 -1
  5. rasa/cli/e2e_test.py +1 -1
  6. rasa/cli/evaluate.py +8 -8
  7. rasa/cli/inspect.py +4 -4
  8. rasa/cli/llm_fine_tuning.py +1 -1
  9. rasa/cli/project_templates/calm/config.yml +5 -7
  10. rasa/cli/project_templates/calm/endpoints.yml +8 -0
  11. rasa/cli/project_templates/tutorial/config.yml +8 -5
  12. rasa/cli/project_templates/tutorial/data/flows.yml +1 -1
  13. rasa/cli/project_templates/tutorial/data/patterns.yml +5 -0
  14. rasa/cli/project_templates/tutorial/domain.yml +14 -0
  15. rasa/cli/project_templates/tutorial/endpoints.yml +7 -7
  16. rasa/cli/run.py +1 -1
  17. rasa/cli/scaffold.py +4 -2
  18. rasa/cli/utils.py +5 -0
  19. rasa/cli/x.py +8 -8
  20. rasa/constants.py +1 -1
  21. rasa/core/channels/channel.py +3 -0
  22. rasa/core/channels/inspector/dist/assets/{arc-6852c607.js → arc-bc141fb2.js} +1 -1
  23. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-acc952b2.js → c4Diagram-d0fbc5ce-be2db283.js} +1 -1
  24. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-848a7597.js → classDiagram-936ed81e-55366915.js} +1 -1
  25. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-a73d3e68.js → classDiagram-v2-c3cb15f1-bb529518.js} +1 -1
  26. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-e5ee049d.js → createText-62fc7601-b0ec81d6.js} +1 -1
  27. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-771e517e.js → edges-f2ad444c-6166330c.js} +1 -1
  28. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-aa347178.js → erDiagram-9d236eb7-5ccc6a8e.js} +1 -1
  29. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-651fc57d.js → flowDb-1972c806-fca3bfe4.js} +1 -1
  30. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-ca67804f.js → flowDiagram-7ea5b25a-4739080f.js} +1 -1
  31. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-736177bf.js +1 -0
  32. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-2dbc568d.js → flowchart-elk-definition-abe16c3d-7c1b0e0f.js} +1 -1
  33. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-25a65bd8.js → ganttDiagram-9b5ea136-772fd050.js} +1 -1
  34. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-fdc7378d.js → gitGraphDiagram-99d0ae7c-8eae1dc9.js} +1 -1
  35. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-6f1fd606.js → index-2c4b9a3b-f55afcdf.js} +1 -1
  36. rasa/core/channels/inspector/dist/assets/{index-efdd30c1.js → index-e7cef9de.js} +68 -68
  37. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-cb1a041a.js → infoDiagram-736b4530-124d4a14.js} +1 -1
  38. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-14609879.js → journeyDiagram-df861f2b-7c4fae44.js} +1 -1
  39. rasa/core/channels/inspector/dist/assets/{layout-2490f52b.js → layout-b9885fb6.js} +1 -1
  40. rasa/core/channels/inspector/dist/assets/{line-40186f1f.js → line-7c59abb6.js} +1 -1
  41. rasa/core/channels/inspector/dist/assets/{linear-08814e93.js → linear-4776f780.js} +1 -1
  42. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-1a534584.js → mindmap-definition-beec6740-2332c46c.js} +1 -1
  43. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-72397b61.js → pieDiagram-dbbf0591-8fb39303.js} +1 -1
  44. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-3bb0b6a3.js → quadrantDiagram-4d7f4fd6-3c7180a2.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-57334f61.js → requirementDiagram-6fc4c22a-e910bcb8.js} +1 -1
  46. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-111e1297.js → sankeyDiagram-8f13d901-ead16c89.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-10bcfe62.js → sequenceDiagram-b655622a-29a02a19.js} +1 -1
  48. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-acaf7513.js → stateDiagram-59f0c015-042b3137.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-3ec2a235.js → stateDiagram-v2-2b26beab-2178c0f3.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-62730289.js → styles-080da4f6-23ffa4fc.js} +1 -1
  51. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-5284ee76.js → styles-3dcbcfbf-94f59763.js} +1 -1
  52. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-642435e3.js → styles-9c745c82-78a6bebc.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-b250a350.js → svgDrawCommon-4835440b-eae2a6f6.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-c2b147ed.js → timeline-definition-5b62e21b-5c968d92.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-f92cfea9.js → xychartDiagram-2b33534f-fd3db0d5.js} +1 -1
  56. rasa/core/channels/inspector/dist/index.html +1 -1
  57. rasa/core/channels/inspector/src/App.tsx +1 -1
  58. rasa/core/channels/inspector/src/helpers/audiostream.ts +77 -16
  59. rasa/core/channels/socketio.py +2 -1
  60. rasa/core/channels/telegram.py +1 -1
  61. rasa/core/channels/twilio.py +1 -1
  62. rasa/core/channels/voice_ready/jambonz.py +2 -2
  63. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  64. rasa/core/channels/voice_stream/asr/azure.py +122 -0
  65. rasa/core/channels/voice_stream/asr/deepgram.py +16 -6
  66. rasa/core/channels/voice_stream/audio_bytes.py +1 -0
  67. rasa/core/channels/voice_stream/browser_audio.py +31 -8
  68. rasa/core/channels/voice_stream/call_state.py +23 -0
  69. rasa/core/channels/voice_stream/tts/azure.py +6 -2
  70. rasa/core/channels/voice_stream/tts/cartesia.py +10 -6
  71. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -0
  72. rasa/core/channels/voice_stream/twilio_media_streams.py +27 -18
  73. rasa/core/channels/voice_stream/util.py +4 -4
  74. rasa/core/channels/voice_stream/voice_channel.py +177 -39
  75. rasa/core/featurizers/single_state_featurizer.py +22 -1
  76. rasa/core/featurizers/tracker_featurizers.py +115 -18
  77. rasa/core/nlg/contextual_response_rephraser.py +16 -22
  78. rasa/core/persistor.py +86 -39
  79. rasa/core/policies/enterprise_search_policy.py +159 -60
  80. rasa/core/policies/flows/flow_executor.py +7 -4
  81. rasa/core/policies/intentless_policy.py +120 -22
  82. rasa/core/policies/ted_policy.py +58 -33
  83. rasa/core/policies/unexpected_intent_policy.py +15 -7
  84. rasa/core/processor.py +25 -0
  85. rasa/core/training/interactive.py +34 -35
  86. rasa/core/utils.py +8 -3
  87. rasa/dialogue_understanding/coexistence/llm_based_router.py +58 -16
  88. rasa/dialogue_understanding/commands/change_flow_command.py +6 -0
  89. rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
  90. rasa/dialogue_understanding/commands/utils.py +5 -0
  91. rasa/dialogue_understanding/generator/constants.py +4 -0
  92. rasa/dialogue_understanding/generator/flow_retrieval.py +65 -3
  93. rasa/dialogue_understanding/generator/llm_based_command_generator.py +68 -26
  94. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +57 -8
  95. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +64 -7
  96. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +39 -0
  97. rasa/dialogue_understanding/patterns/user_silence.py +37 -0
  98. rasa/e2e_test/e2e_test_runner.py +4 -2
  99. rasa/e2e_test/utils/io.py +1 -1
  100. rasa/engine/validation.py +297 -7
  101. rasa/model_manager/config.py +15 -3
  102. rasa/model_manager/model_api.py +15 -7
  103. rasa/model_manager/runner_service.py +8 -6
  104. rasa/model_manager/socket_bridge.py +6 -3
  105. rasa/model_manager/trainer_service.py +7 -5
  106. rasa/model_manager/utils.py +28 -7
  107. rasa/model_service.py +6 -2
  108. rasa/model_training.py +2 -0
  109. rasa/nlu/classifiers/diet_classifier.py +38 -25
  110. rasa/nlu/classifiers/logistic_regression_classifier.py +22 -9
  111. rasa/nlu/classifiers/sklearn_intent_classifier.py +37 -16
  112. rasa/nlu/extractors/crf_entity_extractor.py +93 -50
  113. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +45 -16
  114. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +52 -17
  115. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +5 -3
  116. rasa/shared/constants.py +36 -3
  117. rasa/shared/core/constants.py +7 -0
  118. rasa/shared/core/domain.py +26 -0
  119. rasa/shared/core/flows/flow.py +5 -0
  120. rasa/shared/core/flows/flows_yaml_schema.json +10 -0
  121. rasa/shared/core/flows/utils.py +39 -0
  122. rasa/shared/core/flows/validation.py +96 -0
  123. rasa/shared/core/slots.py +5 -0
  124. rasa/shared/nlu/training_data/features.py +120 -2
  125. rasa/shared/providers/_configs/azure_openai_client_config.py +5 -3
  126. rasa/shared/providers/_configs/litellm_router_client_config.py +200 -0
  127. rasa/shared/providers/_configs/model_group_config.py +167 -0
  128. rasa/shared/providers/_configs/openai_client_config.py +1 -1
  129. rasa/shared/providers/_configs/rasa_llm_client_config.py +73 -0
  130. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -0
  131. rasa/shared/providers/_configs/utils.py +16 -0
  132. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +12 -15
  133. rasa/shared/providers/embedding/azure_openai_embedding_client.py +54 -21
  134. rasa/shared/providers/embedding/litellm_router_embedding_client.py +135 -0
  135. rasa/shared/providers/llm/_base_litellm_client.py +31 -30
  136. rasa/shared/providers/llm/azure_openai_llm_client.py +50 -29
  137. rasa/shared/providers/llm/litellm_router_llm_client.py +127 -0
  138. rasa/shared/providers/llm/rasa_llm_client.py +112 -0
  139. rasa/shared/providers/llm/self_hosted_llm_client.py +1 -1
  140. rasa/shared/providers/mappings.py +19 -0
  141. rasa/shared/providers/router/__init__.py +0 -0
  142. rasa/shared/providers/router/_base_litellm_router_client.py +149 -0
  143. rasa/shared/providers/router/router_client.py +73 -0
  144. rasa/shared/utils/common.py +8 -0
  145. rasa/shared/utils/health_check.py +533 -0
  146. rasa/shared/utils/io.py +28 -6
  147. rasa/shared/utils/llm.py +350 -46
  148. rasa/shared/utils/yaml.py +11 -13
  149. rasa/studio/upload.py +64 -20
  150. rasa/telemetry.py +80 -17
  151. rasa/tracing/instrumentation/attribute_extractors.py +74 -17
  152. rasa/utils/io.py +0 -66
  153. rasa/utils/log_utils.py +9 -2
  154. rasa/utils/tensorflow/feature_array.py +366 -0
  155. rasa/utils/tensorflow/model_data.py +2 -193
  156. rasa/validator.py +70 -0
  157. rasa/version.py +1 -1
  158. {rasa_pro-3.11.0a4.dev3.dist-info → rasa_pro-3.11.0rc1.dist-info}/METADATA +10 -10
  159. {rasa_pro-3.11.0a4.dev3.dist-info → rasa_pro-3.11.0rc1.dist-info}/RECORD +162 -146
  160. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-587d82d8.js +0 -1
  161. {rasa_pro-3.11.0a4.dev3.dist-info → rasa_pro-3.11.0rc1.dist-info}/NOTICE +0 -0
  162. {rasa_pro-3.11.0a4.dev3.dist-info → rasa_pro-3.11.0rc1.dist-info}/WHEEL +0 -0
  163. {rasa_pro-3.11.0a4.dev3.dist-info → rasa_pro-3.11.0rc1.dist-info}/entry_points.txt +0 -0
rasa/telemetry.py CHANGED
@@ -32,7 +32,13 @@ from rasa.constants import (
32
32
  CONFIG_TELEMETRY_ENABLED,
33
33
  CONFIG_TELEMETRY_ID,
34
34
  )
35
- from rasa.shared.constants import PROMPT_CONFIG_KEY, PROMPT_TEMPLATE_CONFIG_KEY
35
+ from rasa.shared.constants import (
36
+ PROMPT_CONFIG_KEY,
37
+ PROMPT_TEMPLATE_CONFIG_KEY,
38
+ MODEL_GROUP_CONFIG_KEY,
39
+ LLM_API_HEALTH_CHECK_ENV_VAR,
40
+ LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
41
+ )
36
42
  from rasa.engine.storage.local_model_storage import LocalModelStorage
37
43
  from rasa.shared.constants import DOCS_URL_TELEMETRY, UTTER_ASK_PREFIX
38
44
  from rasa.shared.core.flows import Flow
@@ -157,6 +163,7 @@ NUM_LINK_STEPS = "num_link_steps"
157
163
  NUM_CALL_STEPS = "num_call_steps"
158
164
  NUM_SHARED_SLOTS_BETWEEN_FLOWS = "num_shared_slots_between_flows"
159
165
  LLM_COMMAND_GENERATOR_MODEL_NAME = "llm_command_generator_model_name"
166
+ LLM_COMMAND_GENERATOR_MODEL_GROUP_ID = "llm_command_generator_model_group_id"
160
167
  LLM_COMMAND_GENERATOR_CUSTOM_PROMPT_USED = "llm_command_generator_custom_prompt_used"
161
168
  MULTI_STEP_LLM_COMMAND_GENERATOR_HANDLE_FLOWS_PROMPT_USED = (
162
169
  "multi_step_llm_command_generator_custom_handle_flows_prompt_used"
@@ -166,6 +173,7 @@ MULTI_STEP_LLM_COMMAND_GENERATOR_FILL_SLOTS_PROMPT_USED = (
166
173
  )
167
174
  FLOW_RETRIEVAL_ENABLED = "flow_retrieval_enabled"
168
175
  FLOW_RETRIEVAL_EMBEDDING_MODEL_NAME = "flow_retrieval_embedding_model_name"
176
+ FLOW_RETRIEVAL_EMBEDDING_MODEL_GROUP_ID = "flow_retrieval_embedding_model_group_id"
169
177
  TRACING_BACKEND = "tracing_backend"
170
178
  METRICS_BACKEND = "metrics_backend"
171
179
  VERSION = "version"
@@ -960,6 +968,13 @@ def track_model_training(
960
968
  "policies": config.get("policies"),
961
969
  "train_schema": config.get("train_schema"),
962
970
  "predict_schema": config.get("predict_schema"),
971
+ "model_groups": rasa.core.utils.AvailableEndpoints.get_instance().model_groups,
972
+ "api_health_check_enabled": (
973
+ os.getenv(
974
+ LLM_API_HEALTH_CHECK_ENV_VAR, LLM_API_HEALTH_CHECK_DEFAULT_VALUE
975
+ ).lower()
976
+ == "true"
977
+ ),
963
978
  "num_intent_examples": len(nlu_data.intent_examples),
964
979
  "num_entity_examples": len(nlu_data.entity_examples),
965
980
  "num_actions": len(domain.action_names_or_texts),
@@ -1114,46 +1129,76 @@ def _get_llm_command_generator_config(config: Dict[str, Any]) -> Optional[Dict]:
1114
1129
  return component
1115
1130
  return None
1116
1131
 
1117
- def extract_settings(component: Dict) -> Dict:
1118
- """Extracts the settings from the command generator component."""
1132
+ def extract_llm_command_generator_llm_client_settings(component: Dict) -> Dict:
1133
+ """Extracts settings related to LLM command generator."""
1119
1134
  llm_config = component.get(LLM_CONFIG_KEY, {})
1120
- llm_model_name = (
1121
- llm_config.get(MODEL_CONFIG_KEY)
1122
- or llm_config.get(MODEL_NAME_CONFIG_KEY)
1123
- or DEFAULT_LLM_CONFIG[MODEL_CONFIG_KEY]
1135
+ llm_model_group_id = llm_config.get(MODEL_GROUP_CONFIG_KEY)
1136
+ llm_model_name = llm_config.get(MODEL_CONFIG_KEY) or llm_config.get(
1137
+ MODEL_NAME_CONFIG_KEY
1138
+ )
1139
+ if llm_model_group_id is None and llm_model_name is None:
1140
+ llm_model_name = DEFAULT_LLM_CONFIG[MODEL_CONFIG_KEY]
1141
+
1142
+ custom_prompt_used = (
1143
+ PROMPT_CONFIG_KEY in component or PROMPT_TEMPLATE_CONFIG_KEY in component
1124
1144
  )
1145
+ return {
1146
+ LLM_COMMAND_GENERATOR_MODEL_NAME: llm_model_name,
1147
+ LLM_COMMAND_GENERATOR_MODEL_GROUP_ID: llm_model_group_id,
1148
+ LLM_COMMAND_GENERATOR_CUSTOM_PROMPT_USED: custom_prompt_used,
1149
+ }
1150
+
1151
+ def extract_multistep_command_generator_prompt_settings(component: Dict) -> Dict:
1152
+ """Extracts settings related to multistep command generator."""
1153
+ prompt_templates = component.get("prompt_templates", {})
1154
+ handle_flows_prompt_used = HANDLE_FLOWS_KEY in prompt_templates
1155
+ fill_slots_prompt_used = FILL_SLOTS_KEY in prompt_templates
1156
+ return {
1157
+ MULTI_STEP_LLM_COMMAND_GENERATOR_HANDLE_FLOWS_PROMPT_USED: handle_flows_prompt_used, # noqa: E501
1158
+ MULTI_STEP_LLM_COMMAND_GENERATOR_FILL_SLOTS_PROMPT_USED: fill_slots_prompt_used, # noqa: E501
1159
+ }
1160
+
1161
+ def extract_flow_retrieval_settings(component: Dict) -> Dict:
1162
+ """Extracts settings related to flow retrieval."""
1125
1163
  flow_retrieval_config = component.get(FLOW_RETRIEVAL_KEY, {})
1126
1164
  flow_retrieval_enabled = flow_retrieval_config.get("active", True)
1127
- flow_retrieval_embeddings_config = flow_retrieval_config.get(
1165
+ embeddings_config = flow_retrieval_config.get(
1128
1166
  EMBEDDINGS_CONFIG_KEY, DEFAULT_EMBEDDINGS_CONFIG
1129
1167
  )
1130
1168
  flow_retrieval_embedding_model_name = (
1131
1169
  (
1132
- flow_retrieval_embeddings_config.get(MODEL_NAME_CONFIG_KEY)
1133
- or flow_retrieval_embeddings_config.get(MODEL_CONFIG_KEY)
1170
+ embeddings_config.get(MODEL_NAME_CONFIG_KEY)
1171
+ or embeddings_config.get(MODEL_CONFIG_KEY)
1134
1172
  )
1135
1173
  if flow_retrieval_enabled
1136
1174
  else None
1137
1175
  )
1176
+ flow_retrieval_embedding_model_group_id = embeddings_config.get(
1177
+ MODEL_GROUP_CONFIG_KEY
1178
+ )
1138
1179
  return {
1139
- LLM_COMMAND_GENERATOR_MODEL_NAME: llm_model_name,
1140
- LLM_COMMAND_GENERATOR_CUSTOM_PROMPT_USED: PROMPT_CONFIG_KEY in component
1141
- or PROMPT_TEMPLATE_CONFIG_KEY in component,
1142
- MULTI_STEP_LLM_COMMAND_GENERATOR_HANDLE_FLOWS_PROMPT_USED: HANDLE_FLOWS_KEY
1143
- in component.get("prompt_templates", {}),
1144
- MULTI_STEP_LLM_COMMAND_GENERATOR_FILL_SLOTS_PROMPT_USED: FILL_SLOTS_KEY
1145
- in component.get("prompt_templates", {}),
1146
1180
  FLOW_RETRIEVAL_ENABLED: flow_retrieval_enabled,
1147
1181
  FLOW_RETRIEVAL_EMBEDDING_MODEL_NAME: flow_retrieval_embedding_model_name,
1182
+ FLOW_RETRIEVAL_EMBEDDING_MODEL_GROUP_ID: flow_retrieval_embedding_model_group_id, # noqa: E501
1148
1183
  }
1149
1184
 
1185
+ def extract_settings(component: Dict) -> Dict:
1186
+ """Extracts the settings from the command generator component."""
1187
+ settings = {}
1188
+ settings.update(extract_llm_command_generator_llm_client_settings(component))
1189
+ settings.update(extract_multistep_command_generator_prompt_settings(component))
1190
+ settings.update(extract_flow_retrieval_settings(component))
1191
+ return settings
1192
+
1150
1193
  command_generator_config = {
1151
1194
  LLM_COMMAND_GENERATOR_MODEL_NAME: None,
1195
+ LLM_COMMAND_GENERATOR_MODEL_GROUP_ID: None,
1152
1196
  LLM_COMMAND_GENERATOR_CUSTOM_PROMPT_USED: None,
1153
1197
  MULTI_STEP_LLM_COMMAND_GENERATOR_HANDLE_FLOWS_PROMPT_USED: None,
1154
1198
  MULTI_STEP_LLM_COMMAND_GENERATOR_FILL_SLOTS_PROMPT_USED: None,
1155
1199
  FLOW_RETRIEVAL_ENABLED: None,
1156
1200
  FLOW_RETRIEVAL_EMBEDDING_MODEL_NAME: None,
1201
+ FLOW_RETRIEVAL_EMBEDDING_MODEL_GROUP_ID: None,
1157
1202
  }
1158
1203
 
1159
1204
  pipeline = config.get("pipeline", [])
@@ -1553,6 +1598,7 @@ def track_response_rephrase(
1553
1598
  custom_prompt_template: Optional[str],
1554
1599
  llm_type: Optional[str],
1555
1600
  llm_model: Optional[str],
1601
+ llm_model_group_id: Optional[str],
1556
1602
  ) -> None:
1557
1603
  """Track when a user rephrases a response."""
1558
1604
  _track(
@@ -1562,6 +1608,7 @@ def track_response_rephrase(
1562
1608
  "custom_prompt_template": custom_prompt_template,
1563
1609
  "llm_type": llm_type,
1564
1610
  "llm_model": llm_model,
1611
+ "llm_model_group_id": llm_model_group_id,
1565
1612
  },
1566
1613
  )
1567
1614
 
@@ -1576,8 +1623,10 @@ def track_intentless_policy_train() -> None:
1576
1623
  def track_intentless_policy_train_completed(
1577
1624
  embeddings_type: Optional[str],
1578
1625
  embeddings_model: Optional[str],
1626
+ embeddings_model_group_id: Optional[str],
1579
1627
  llm_type: Optional[str],
1580
1628
  llm_model: Optional[str],
1629
+ llm_model_group_id: Optional[str],
1581
1630
  ) -> None:
1582
1631
  """Track when a user trains a policy."""
1583
1632
  _track(
@@ -1585,8 +1634,10 @@ def track_intentless_policy_train_completed(
1585
1634
  {
1586
1635
  "embeddings_type": embeddings_type,
1587
1636
  "embeddings_model": embeddings_model,
1637
+ "embeddings_model_group_id": embeddings_model_group_id,
1588
1638
  "llm_type": llm_type,
1589
1639
  "llm_model": llm_model,
1640
+ "llm_model_group_id": llm_model_group_id,
1590
1641
  },
1591
1642
  )
1592
1643
 
@@ -1595,8 +1646,10 @@ def track_intentless_policy_train_completed(
1595
1646
  def track_intentless_policy_predict(
1596
1647
  embeddings_type: Optional[str],
1597
1648
  embeddings_model: Optional[str],
1649
+ embeddings_model_group_id: Optional[str],
1598
1650
  llm_type: Optional[str],
1599
1651
  llm_model: Optional[str],
1652
+ llm_model_group_id: Optional[str],
1600
1653
  score: float,
1601
1654
  ) -> None:
1602
1655
  """Track when a user trains a policy."""
@@ -1605,8 +1658,10 @@ def track_intentless_policy_predict(
1605
1658
  {
1606
1659
  "embeddings_type": embeddings_type,
1607
1660
  "embeddings_model": embeddings_model,
1661
+ "embeddings_model_group_id": embeddings_model_group_id,
1608
1662
  "llm_type": llm_type,
1609
1663
  "llm_model": llm_model,
1664
+ "llm_model_group_id": llm_model_group_id,
1610
1665
  "score": score,
1611
1666
  },
1612
1667
  )
@@ -1696,8 +1751,10 @@ def track_enterprise_search_policy_train_completed(
1696
1751
  vector_store_type: Optional[str],
1697
1752
  embeddings_type: Optional[str],
1698
1753
  embeddings_model: Optional[str],
1754
+ embeddings_model_group_id: Optional[str],
1699
1755
  llm_type: Optional[str],
1700
1756
  llm_model: Optional[str],
1757
+ llm_model_group_id: Optional[str],
1701
1758
  citation_enabled: Optional[bool],
1702
1759
  ) -> None:
1703
1760
  """Track when a user completes training Enterprise Search policy."""
@@ -1707,8 +1764,10 @@ def track_enterprise_search_policy_train_completed(
1707
1764
  "vector_store_type": vector_store_type,
1708
1765
  "embeddings_type": embeddings_type,
1709
1766
  "embeddings_model": embeddings_model,
1767
+ "embeddings_model_group_id": embeddings_model_group_id,
1710
1768
  "llm_type": llm_type,
1711
1769
  "llm_model": llm_model,
1770
+ "llm_model_group_id": llm_model_group_id,
1712
1771
  "citation_enabled": citation_enabled,
1713
1772
  },
1714
1773
  )
@@ -1719,8 +1778,10 @@ def track_enterprise_search_policy_predict(
1719
1778
  vector_store_type: Optional[str],
1720
1779
  embeddings_type: Optional[str],
1721
1780
  embeddings_model: Optional[str],
1781
+ embeddings_model_group_id: Optional[str],
1722
1782
  llm_type: Optional[str],
1723
1783
  llm_model: Optional[str],
1784
+ llm_model_group_id: Optional[str],
1724
1785
  citation_enabled: Optional[bool],
1725
1786
  ) -> None:
1726
1787
  """Track when a user predicts the next action using Enterprise Search policy."""
@@ -1730,8 +1791,10 @@ def track_enterprise_search_policy_predict(
1730
1791
  "vector_store_type": vector_store_type,
1731
1792
  "embeddings_type": embeddings_type,
1732
1793
  "embeddings_model": embeddings_model,
1794
+ "embeddings_model_group_id": embeddings_model_group_id,
1733
1795
  "llm_type": llm_type,
1734
1796
  "llm_model": llm_model,
1797
+ "llm_model_group_id": llm_model_group_id,
1735
1798
  "citation_enabled": citation_enabled,
1736
1799
  },
1737
1800
  )
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
5
5
 
6
6
  import tiktoken
7
7
  from numpy import ndarray
8
+ from rasa.dialogue_understanding.generator.constants import FLOW_RETRIEVAL_KEY
8
9
  from rasa_sdk.grpc_py import action_webhook_pb2
9
10
 
10
11
  from rasa.core.actions.action import DirectCustomActionExecutor
@@ -19,6 +20,7 @@ from rasa.core.processor import MessageProcessor
19
20
  from rasa.core.tracker_store import TrackerStore
20
21
  from rasa.dialogue_understanding.commands import Command
21
22
  from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
23
+ from rasa.dialogue_understanding.generator import LLMBasedCommandGenerator
22
24
  from rasa.engine.graph import ExecutionContext, GraphModelConfiguration, GraphNode
23
25
  from rasa.engine.training.graph_trainer import GraphTrainer
24
26
  from rasa.shared.constants import (
@@ -27,6 +29,8 @@ from rasa.shared.constants import (
27
29
  PROVIDER_CONFIG_KEY,
28
30
  TIMEOUT_CONFIG_KEY,
29
31
  DEPLOYMENT_CONFIG_KEY,
32
+ MODEL_GROUP_ID_CONFIG_KEY,
33
+ LLM_CONFIG_KEY,
30
34
  )
31
35
  from rasa.shared.core.constants import REQUESTED_SLOT
32
36
  from rasa.shared.core.domain import Domain
@@ -50,10 +54,7 @@ if TYPE_CHECKING:
50
54
  from rasa.core.policies.enterprise_search_policy import EnterpriseSearchPolicy
51
55
  from rasa.core.policies.intentless_policy import IntentlessPolicy
52
56
  from rasa.core.policies.policy import PolicyPrediction
53
- from rasa.dialogue_understanding.generator import (
54
- CommandGenerator,
55
- LLMBasedCommandGenerator,
56
- )
57
+ from rasa.dialogue_understanding.generator import CommandGenerator
57
58
 
58
59
  # This file contains all attribute extractors for tracing instrumentation.
59
60
  # These are functions that are applied to the arguments of the wrapped function to be
@@ -300,22 +301,49 @@ def extract_attrs_for_command(
300
301
  }
301
302
 
302
303
 
303
- def extract_llm_config(self: Any, default_llm_config: Dict[str, Any]) -> Dict[str, Any]:
304
+ def extract_llm_config(
305
+ self: Any,
306
+ default_llm_config: Dict[str, Any],
307
+ default_embeddings_config: Dict[str, Any],
308
+ ) -> Dict[str, Any]:
304
309
  if isinstance(self, ContextualResponseRephraser):
305
- config = self.nlg_endpoint.kwargs
310
+ # ContextualResponseRephraser is not a graph component, so it's
311
+ # not having a full config.
312
+ config = {"llm": self.llm_config}
306
313
  else:
307
314
  config = self.config
308
315
 
309
316
  llm_property = combine_custom_and_default_config(
310
- config.get("llm"), default_llm_config
317
+ config.get(LLM_CONFIG_KEY), default_llm_config
311
318
  )
312
319
 
320
+ if isinstance(self, LLMBasedCommandGenerator):
321
+ flow_retrieval_config = config.get(FLOW_RETRIEVAL_KEY, {}) or {}
322
+ embeddings_property = combine_custom_and_default_config(
323
+ flow_retrieval_config.get(EMBEDDINGS_CONFIG_KEY),
324
+ default_embeddings_config,
325
+ )
326
+ else:
327
+ embeddings_property = combine_custom_and_default_config(
328
+ config.get(EMBEDDINGS_CONFIG_KEY), default_embeddings_config
329
+ )
330
+
313
331
  attributes = {
314
332
  "class_name": self.__class__.__name__,
333
+ # llm client attributes
315
334
  "llm_model": str(llm_property.get(MODEL_CONFIG_KEY)),
316
335
  "llm_type": str(llm_property.get(PROVIDER_CONFIG_KEY)),
317
- "embeddings": json.dumps(config.get(EMBEDDINGS_CONFIG_KEY, {})),
336
+ "llm_model_group_id": str(llm_property.get(MODEL_GROUP_ID_CONFIG_KEY)),
318
337
  "llm_temperature": str(llm_property.get("temperature")),
338
+ "llm_request_timeout": str(llm_property.get(TIMEOUT_CONFIG_KEY)),
339
+ # embedding client attributes
340
+ "embeddings_model": str(embeddings_property.get(MODEL_CONFIG_KEY)),
341
+ "embeddings_type": str(embeddings_property.get(PROVIDER_CONFIG_KEY)),
342
+ "embeddings_model_group_id": str(
343
+ embeddings_property.get(MODEL_GROUP_ID_CONFIG_KEY)
344
+ ),
345
+ # TODO: Keeping this to avoid potential breaking changes
346
+ "embeddings": json.dumps(embeddings_property, sort_keys=True),
319
347
  "request_timeout": str(llm_property.get(TIMEOUT_CONFIG_KEY)),
320
348
  }
321
349
 
@@ -329,11 +357,16 @@ def extract_attrs_for_llm_based_command_generator(
329
357
  self: "LLMBasedCommandGenerator",
330
358
  prompt: str,
331
359
  ) -> Dict[str, Any]:
332
- from rasa.dialogue_understanding.generator.constants import (
333
- DEFAULT_LLM_CONFIG,
360
+ from rasa.dialogue_understanding.generator.constants import DEFAULT_LLM_CONFIG
361
+ from rasa.dialogue_understanding.generator.flow_retrieval import (
362
+ DEFAULT_EMBEDDINGS_CONFIG,
334
363
  )
335
364
 
336
- attributes = extract_llm_config(self, default_llm_config=DEFAULT_LLM_CONFIG)
365
+ attributes = extract_llm_config(
366
+ self,
367
+ default_llm_config=DEFAULT_LLM_CONFIG,
368
+ default_embeddings_config=DEFAULT_EMBEDDINGS_CONFIG,
369
+ )
337
370
 
338
371
  return extend_attributes_with_prompt_tokens_length(self, attributes, prompt)
339
372
 
@@ -344,7 +377,12 @@ def extract_attrs_for_contextual_response_rephraser(
344
377
  ) -> Dict[str, Any]:
345
378
  from rasa.core.nlg.contextual_response_rephraser import DEFAULT_LLM_CONFIG
346
379
 
347
- attributes = extract_llm_config(self, default_llm_config=DEFAULT_LLM_CONFIG)
380
+ attributes = extract_llm_config(
381
+ self,
382
+ default_llm_config=DEFAULT_LLM_CONFIG,
383
+ # rephraser is not using embeddings
384
+ default_embeddings_config={},
385
+ )
348
386
 
349
387
  return extend_attributes_with_prompt_tokens_length(self, attributes, prompt)
350
388
 
@@ -355,7 +393,12 @@ def extract_attrs_for_create_history(
355
393
  ) -> Dict[str, Any]:
356
394
  from rasa.core.nlg.contextual_response_rephraser import DEFAULT_LLM_CONFIG
357
395
 
358
- return extract_llm_config(self, default_llm_config=DEFAULT_LLM_CONFIG)
396
+ return extract_llm_config(
397
+ self,
398
+ default_llm_config=DEFAULT_LLM_CONFIG,
399
+ # rephraser is not using embeddings
400
+ default_embeddings_config={},
401
+ )
359
402
 
360
403
 
361
404
  def extract_attrs_for_generate(
@@ -580,9 +623,16 @@ def extract_attrs_for_intentless_policy_find_closest_response(
580
623
  def extract_attrs_for_intentless_policy_generate_llm_answer(
581
624
  self: "IntentlessPolicy", llm: "BaseLLM", prompt: str
582
625
  ) -> Dict[str, Any]:
583
- from rasa.core.policies.intentless_policy import DEFAULT_LLM_CONFIG
626
+ from rasa.core.policies.intentless_policy import (
627
+ DEFAULT_LLM_CONFIG,
628
+ DEFAULT_EMBEDDINGS_CONFIG,
629
+ )
584
630
 
585
- attributes = extract_llm_config(self, default_llm_config=DEFAULT_LLM_CONFIG)
631
+ attributes = extract_llm_config(
632
+ self,
633
+ default_llm_config=DEFAULT_LLM_CONFIG,
634
+ default_embeddings_config=DEFAULT_EMBEDDINGS_CONFIG,
635
+ )
586
636
 
587
637
  return extend_attributes_with_prompt_tokens_length(self, attributes, prompt)
588
638
 
@@ -590,9 +640,16 @@ def extract_attrs_for_intentless_policy_generate_llm_answer(
590
640
  def extract_attrs_for_enterprise_search_generate_llm_answer(
591
641
  self: "EnterpriseSearchPolicy", llm: "BaseLLM", prompt: str
592
642
  ) -> Dict[str, Any]:
593
- from rasa.core.policies.enterprise_search_policy import DEFAULT_LLM_CONFIG
643
+ from rasa.core.policies.enterprise_search_policy import (
644
+ DEFAULT_LLM_CONFIG,
645
+ DEFAULT_EMBEDDINGS_CONFIG,
646
+ )
594
647
 
595
- attributes = extract_llm_config(self, default_llm_config=DEFAULT_LLM_CONFIG)
648
+ attributes = extract_llm_config(
649
+ self,
650
+ default_llm_config=DEFAULT_LLM_CONFIG,
651
+ default_embeddings_config=DEFAULT_EMBEDDINGS_CONFIG,
652
+ )
596
653
 
597
654
  return extend_attributes_with_prompt_tokens_length(self, attributes, prompt)
598
655
 
rasa/utils/io.py CHANGED
@@ -2,7 +2,6 @@ import asyncio
2
2
  import filecmp
3
3
  import logging
4
4
  import os
5
- import pickle
6
5
  import tempfile
7
6
  import warnings
8
7
  import re
@@ -98,29 +97,6 @@ def enable_async_loop_debugging(
98
97
  return event_loop
99
98
 
100
99
 
101
- def pickle_dump(filename: Union[Text, Path], obj: Any) -> None:
102
- """Saves object to file.
103
-
104
- Args:
105
- filename: the filename to save the object to
106
- obj: the object to store
107
- """
108
- with open(filename, "wb") as f:
109
- pickle.dump(obj, f)
110
-
111
-
112
- def pickle_load(filename: Union[Text, Path]) -> Any:
113
- """Loads an object from a file.
114
-
115
- Args:
116
- filename: the filename to load the object from
117
-
118
- Returns: the loaded object
119
- """
120
- with open(filename, "rb") as f:
121
- return pickle.load(f)
122
-
123
-
124
100
  def create_temporary_file(data: Any, suffix: Text = "", mode: Text = "w+") -> Text:
125
101
  """Creates a tempfile.NamedTemporaryFile object for data."""
126
102
  encoding = None if "b" in mode else rasa.shared.utils.io.DEFAULT_ENCODING
@@ -191,48 +167,6 @@ def create_validator(
191
167
  return FunctionValidator
192
168
 
193
169
 
194
- def json_unpickle(
195
- file_name: Union[Text, Path], encode_non_string_keys: bool = False
196
- ) -> Any:
197
- """Unpickle an object from file using json.
198
-
199
- Args:
200
- file_name: the file to load the object from
201
- encode_non_string_keys: If set to `True` then jsonpickle will encode non-string
202
- dictionary keys instead of coercing them into strings via `repr()`.
203
-
204
- Returns: the object
205
- """
206
- import jsonpickle.ext.numpy as jsonpickle_numpy
207
- import jsonpickle
208
-
209
- jsonpickle_numpy.register_handlers()
210
-
211
- file_content = rasa.shared.utils.io.read_file(file_name)
212
- return jsonpickle.loads(file_content, keys=encode_non_string_keys)
213
-
214
-
215
- def json_pickle(
216
- file_name: Union[Text, Path], obj: Any, encode_non_string_keys: bool = False
217
- ) -> None:
218
- """Pickle an object to a file using json.
219
-
220
- Args:
221
- file_name: the file to store the object to
222
- obj: the object to store
223
- encode_non_string_keys: If set to `True` then jsonpickle will encode non-string
224
- dictionary keys instead of coercing them into strings via `repr()`.
225
- """
226
- import jsonpickle.ext.numpy as jsonpickle_numpy
227
- import jsonpickle
228
-
229
- jsonpickle_numpy.register_handlers()
230
-
231
- rasa.shared.utils.io.write_text_file(
232
- jsonpickle.dumps(obj, keys=encode_non_string_keys), file_name
233
- )
234
-
235
-
236
170
  def get_emoji_regex() -> Pattern:
237
171
  """Returns regex to identify emojis."""
238
172
  return re.compile(
rasa/utils/log_utils.py CHANGED
@@ -78,6 +78,7 @@ def _anonymizer(
78
78
 
79
79
  def configure_structlog(
80
80
  log_level: Optional[int] = None,
81
+ include_time: bool = False,
81
82
  ) -> None:
82
83
  """Configure logging of the server."""
83
84
  if log_level is None: # Log level NOTSET is 0 so we use `is None` here
@@ -114,6 +115,9 @@ def configure_structlog(
114
115
  SentryProcessor(event_level=logging.FATAL),
115
116
  ]
116
117
 
118
+ if include_time:
119
+ shared_processors.append(structlog.processors.TimeStamper(fmt="iso"))
120
+
117
121
  if not FORCE_JSON_LOGGING and sys.stderr.isatty():
118
122
  # Pretty printing when we run in a terminal session.
119
123
  # Automatically prints pretty tracebacks when "rich" is installed
@@ -143,11 +147,14 @@ def configure_structlog(
143
147
  # logger.
144
148
  cache_logger_on_first_use=True,
145
149
  )
150
+ # doing logger creation inline, to prevent usage of unconfigured logger
151
+ structlog.get_logger().debug("structlog.configured")
146
152
 
147
153
 
148
154
  def log_llm(logger: Any, log_module: str, log_event: str, **kwargs: Any) -> None:
149
- """Logs LLM-specific events depending on a flag passed through an environment
150
- variable. If the module's flag is set to INFO (e.g.
155
+ """Logs LLM-specific events depending on a flag passed through an env var.
156
+
157
+ If the module's flag is set to INFO (e.g.
151
158
  LOG_PROMPT_LLM_COMMAND_GENERATOR=INFO), its prompt is logged at INFO level,
152
159
  overriding the general log level setting.
153
160