rasa-pro 3.11.0a4.dev2__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.
- rasa/__main__.py +22 -12
- rasa/api.py +1 -1
- rasa/cli/arguments/default_arguments.py +1 -2
- rasa/cli/arguments/shell.py +5 -1
- rasa/cli/e2e_test.py +1 -1
- rasa/cli/evaluate.py +8 -8
- rasa/cli/inspect.py +4 -4
- rasa/cli/llm_fine_tuning.py +1 -1
- rasa/cli/project_templates/calm/config.yml +5 -7
- rasa/cli/project_templates/calm/endpoints.yml +8 -0
- rasa/cli/project_templates/tutorial/config.yml +8 -5
- rasa/cli/project_templates/tutorial/data/flows.yml +1 -1
- rasa/cli/project_templates/tutorial/data/patterns.yml +5 -0
- rasa/cli/project_templates/tutorial/domain.yml +14 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +7 -7
- rasa/cli/run.py +1 -1
- rasa/cli/scaffold.py +4 -2
- rasa/cli/utils.py +5 -0
- rasa/cli/x.py +8 -8
- rasa/constants.py +1 -1
- rasa/core/channels/channel.py +3 -0
- rasa/core/channels/inspector/dist/assets/{arc-6852c607.js → arc-bc141fb2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-acc952b2.js → c4Diagram-d0fbc5ce-be2db283.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-848a7597.js → classDiagram-936ed81e-55366915.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-a73d3e68.js → classDiagram-v2-c3cb15f1-bb529518.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-e5ee049d.js → createText-62fc7601-b0ec81d6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-771e517e.js → edges-f2ad444c-6166330c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-aa347178.js → erDiagram-9d236eb7-5ccc6a8e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-651fc57d.js → flowDb-1972c806-fca3bfe4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-ca67804f.js → flowDiagram-7ea5b25a-4739080f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-736177bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-2dbc568d.js → flowchart-elk-definition-abe16c3d-7c1b0e0f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-25a65bd8.js → ganttDiagram-9b5ea136-772fd050.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-fdc7378d.js → gitGraphDiagram-99d0ae7c-8eae1dc9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-6f1fd606.js → index-2c4b9a3b-f55afcdf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-efdd30c1.js → index-e7cef9de.js} +68 -68
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-cb1a041a.js → infoDiagram-736b4530-124d4a14.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-14609879.js → journeyDiagram-df861f2b-7c4fae44.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-2490f52b.js → layout-b9885fb6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-40186f1f.js → line-7c59abb6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-08814e93.js → linear-4776f780.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-1a534584.js → mindmap-definition-beec6740-2332c46c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-72397b61.js → pieDiagram-dbbf0591-8fb39303.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-3bb0b6a3.js → quadrantDiagram-4d7f4fd6-3c7180a2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-57334f61.js → requirementDiagram-6fc4c22a-e910bcb8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-111e1297.js → sankeyDiagram-8f13d901-ead16c89.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-10bcfe62.js → sequenceDiagram-b655622a-29a02a19.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-acaf7513.js → stateDiagram-59f0c015-042b3137.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-3ec2a235.js → stateDiagram-v2-2b26beab-2178c0f3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-080da4f6-62730289.js → styles-080da4f6-23ffa4fc.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-5284ee76.js → styles-3dcbcfbf-94f59763.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-642435e3.js → styles-9c745c82-78a6bebc.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-b250a350.js → svgDrawCommon-4835440b-eae2a6f6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-c2b147ed.js → timeline-definition-5b62e21b-5c968d92.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-f92cfea9.js → xychartDiagram-2b33534f-fd3db0d5.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +1 -1
- rasa/core/channels/inspector/src/helpers/audiostream.ts +77 -16
- rasa/core/channels/socketio.py +2 -1
- rasa/core/channels/telegram.py +1 -1
- rasa/core/channels/twilio.py +1 -1
- rasa/core/channels/voice_ready/jambonz.py +2 -2
- rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
- rasa/core/channels/voice_stream/asr/azure.py +122 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +16 -6
- rasa/core/channels/voice_stream/audio_bytes.py +1 -0
- rasa/core/channels/voice_stream/browser_audio.py +31 -8
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/azure.py +6 -2
- rasa/core/channels/voice_stream/tts/cartesia.py +10 -6
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +27 -18
- rasa/core/channels/voice_stream/util.py +4 -4
- rasa/core/channels/voice_stream/voice_channel.py +177 -39
- rasa/core/featurizers/single_state_featurizer.py +22 -1
- rasa/core/featurizers/tracker_featurizers.py +115 -18
- rasa/core/nlg/contextual_response_rephraser.py +16 -22
- rasa/core/persistor.py +86 -39
- rasa/core/policies/enterprise_search_policy.py +159 -60
- rasa/core/policies/flows/flow_executor.py +7 -4
- rasa/core/policies/intentless_policy.py +120 -22
- rasa/core/policies/ted_policy.py +58 -33
- rasa/core/policies/unexpected_intent_policy.py +15 -7
- rasa/core/processor.py +25 -0
- rasa/core/training/interactive.py +34 -35
- rasa/core/utils.py +8 -3
- rasa/dialogue_understanding/coexistence/llm_based_router.py +58 -16
- rasa/dialogue_understanding/commands/change_flow_command.py +6 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +5 -0
- rasa/dialogue_understanding/generator/constants.py +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +65 -3
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +68 -26
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +57 -8
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +64 -7
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +39 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/e2e_test/e2e_test_runner.py +4 -2
- rasa/e2e_test/utils/io.py +1 -1
- rasa/engine/validation.py +297 -7
- rasa/model_manager/config.py +17 -3
- rasa/model_manager/model_api.py +16 -8
- rasa/model_manager/runner_service.py +8 -6
- rasa/model_manager/socket_bridge.py +6 -3
- rasa/model_manager/trainer_service.py +7 -5
- rasa/model_manager/utils.py +28 -7
- rasa/model_service.py +7 -5
- rasa/model_training.py +2 -0
- rasa/nlu/classifiers/diet_classifier.py +38 -25
- rasa/nlu/classifiers/logistic_regression_classifier.py +22 -9
- rasa/nlu/classifiers/sklearn_intent_classifier.py +37 -16
- rasa/nlu/extractors/crf_entity_extractor.py +93 -50
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +45 -16
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +52 -17
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +5 -3
- rasa/shared/constants.py +36 -3
- rasa/shared/core/constants.py +7 -0
- rasa/shared/core/domain.py +26 -0
- rasa/shared/core/flows/flow.py +5 -0
- rasa/shared/core/flows/flows_yaml_schema.json +10 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +96 -0
- rasa/shared/core/slots.py +5 -0
- rasa/shared/nlu/training_data/features.py +120 -2
- rasa/shared/providers/_configs/azure_openai_client_config.py +5 -3
- rasa/shared/providers/_configs/litellm_router_client_config.py +200 -0
- rasa/shared/providers/_configs/model_group_config.py +167 -0
- rasa/shared/providers/_configs/openai_client_config.py +1 -1
- rasa/shared/providers/_configs/rasa_llm_client_config.py +73 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -0
- rasa/shared/providers/_configs/utils.py +16 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +12 -15
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +54 -21
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +135 -0
- rasa/shared/providers/llm/_base_litellm_client.py +31 -30
- rasa/shared/providers/llm/azure_openai_llm_client.py +50 -29
- rasa/shared/providers/llm/litellm_router_llm_client.py +127 -0
- rasa/shared/providers/llm/rasa_llm_client.py +112 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +1 -1
- rasa/shared/providers/mappings.py +19 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +149 -0
- rasa/shared/providers/router/router_client.py +73 -0
- rasa/shared/utils/common.py +8 -0
- rasa/shared/utils/health_check.py +533 -0
- rasa/shared/utils/io.py +28 -6
- rasa/shared/utils/llm.py +350 -46
- rasa/shared/utils/yaml.py +11 -13
- rasa/studio/upload.py +64 -20
- rasa/telemetry.py +80 -17
- rasa/tracing/instrumentation/attribute_extractors.py +74 -17
- rasa/utils/io.py +0 -66
- rasa/utils/log_utils.py +9 -2
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/model_data.py +2 -193
- rasa/validator.py +70 -0
- rasa/version.py +1 -1
- {rasa_pro-3.11.0a4.dev2.dist-info → rasa_pro-3.11.0rc1.dist-info}/METADATA +10 -10
- {rasa_pro-3.11.0a4.dev2.dist-info → rasa_pro-3.11.0rc1.dist-info}/RECORD +162 -146
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-587d82d8.js +0 -1
- {rasa_pro-3.11.0a4.dev2.dist-info → rasa_pro-3.11.0rc1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.11.0a4.dev2.dist-info → rasa_pro-3.11.0rc1.dist-info}/WHEEL +0 -0
- {rasa_pro-3.11.0a4.dev2.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
|
|
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
|
|
1118
|
-
"""Extracts
|
|
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
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1133
|
-
or
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
"
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
626
|
+
from rasa.core.policies.intentless_policy import (
|
|
627
|
+
DEFAULT_LLM_CONFIG,
|
|
628
|
+
DEFAULT_EMBEDDINGS_CONFIG,
|
|
629
|
+
)
|
|
584
630
|
|
|
585
|
-
attributes = extract_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
|
|
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(
|
|
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
|
|
150
|
-
|
|
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
|
|