rasa-pro 3.11.0__py3-none-any.whl → 3.11.0a1__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 (220) hide show
  1. README.md +396 -17
  2. rasa/__main__.py +15 -31
  3. rasa/api.py +1 -5
  4. rasa/cli/arguments/default_arguments.py +2 -1
  5. rasa/cli/arguments/shell.py +1 -5
  6. rasa/cli/arguments/train.py +0 -14
  7. rasa/cli/e2e_test.py +1 -1
  8. rasa/cli/evaluate.py +8 -8
  9. rasa/cli/inspect.py +7 -15
  10. rasa/cli/interactive.py +0 -1
  11. rasa/cli/llm_fine_tuning.py +1 -1
  12. rasa/cli/project_templates/calm/config.yml +7 -5
  13. rasa/cli/project_templates/calm/endpoints.yml +2 -15
  14. rasa/cli/project_templates/tutorial/config.yml +5 -8
  15. rasa/cli/project_templates/tutorial/data/flows.yml +1 -1
  16. rasa/cli/project_templates/tutorial/data/patterns.yml +0 -5
  17. rasa/cli/project_templates/tutorial/domain.yml +0 -14
  18. rasa/cli/project_templates/tutorial/endpoints.yml +0 -5
  19. rasa/cli/run.py +1 -1
  20. rasa/cli/scaffold.py +2 -4
  21. rasa/cli/studio/studio.py +8 -18
  22. rasa/cli/studio/upload.py +15 -0
  23. rasa/cli/train.py +0 -3
  24. rasa/cli/utils.py +1 -6
  25. rasa/cli/x.py +8 -8
  26. rasa/constants.py +1 -3
  27. rasa/core/actions/action.py +33 -75
  28. rasa/core/actions/e2e_stub_custom_action_executor.py +1 -5
  29. rasa/core/actions/http_custom_action_executor.py +0 -4
  30. rasa/core/channels/__init__.py +0 -2
  31. rasa/core/channels/channel.py +0 -20
  32. rasa/core/channels/development_inspector.py +3 -10
  33. rasa/core/channels/inspector/dist/assets/{arc-bc141fb2.js → arc-86942a71.js} +1 -1
  34. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-be2db283.js → c4Diagram-d0fbc5ce-b0290676.js} +1 -1
  35. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-55366915.js → classDiagram-936ed81e-f6405f6e.js} +1 -1
  36. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-bb529518.js → classDiagram-v2-c3cb15f1-ef61ac77.js} +1 -1
  37. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-b0ec81d6.js → createText-62fc7601-f0411e58.js} +1 -1
  38. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-6166330c.js → edges-f2ad444c-7dcc4f3b.js} +1 -1
  39. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-5ccc6a8e.js → erDiagram-9d236eb7-e0c092d7.js} +1 -1
  40. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-fca3bfe4.js → flowDb-1972c806-fba2e3ce.js} +1 -1
  41. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-4739080f.js → flowDiagram-7ea5b25a-7a70b71a.js} +1 -1
  42. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-24a5f41a.js +1 -0
  43. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-7c1b0e0f.js → flowchart-elk-definition-abe16c3d-00a59b68.js} +1 -1
  44. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-772fd050.js → ganttDiagram-9b5ea136-293c91fa.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-8eae1dc9.js → gitGraphDiagram-99d0ae7c-07b2d68c.js} +1 -1
  46. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-f55afcdf.js → index-2c4b9a3b-bc959fbd.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/{index-e7cef9de.js → index-3a8a5a28.js} +143 -143
  48. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-124d4a14.js → infoDiagram-736b4530-4a350f72.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-7c4fae44.js → journeyDiagram-df861f2b-af464fb7.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/{layout-b9885fb6.js → layout-0071f036.js} +1 -1
  51. rasa/core/channels/inspector/dist/assets/{line-7c59abb6.js → line-2f73cc83.js} +1 -1
  52. rasa/core/channels/inspector/dist/assets/{linear-4776f780.js → linear-f014b4cc.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-2332c46c.js → mindmap-definition-beec6740-d2426fb6.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-8fb39303.js → pieDiagram-dbbf0591-776f01a2.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-3c7180a2.js → quadrantDiagram-4d7f4fd6-82e00b57.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-e910bcb8.js → requirementDiagram-6fc4c22a-ea13c6bb.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-ead16c89.js → sankeyDiagram-8f13d901-1feca7e9.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-29a02a19.js → sequenceDiagram-b655622a-070c61d2.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-042b3137.js → stateDiagram-59f0c015-24f46263.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-2178c0f3.js → stateDiagram-v2-2b26beab-c9056051.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-23ffa4fc.js → styles-080da4f6-08abc34a.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-94f59763.js → styles-3dcbcfbf-bc74c25a.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-78a6bebc.js → styles-9c745c82-4e5d66de.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-eae2a6f6.js → svgDrawCommon-4835440b-849c4517.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-5c968d92.js → timeline-definition-5b62e21b-d0fb1598.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-fd3db0d5.js → xychartDiagram-2b33534f-04d115e2.js} +1 -1
  67. rasa/core/channels/inspector/dist/index.html +1 -1
  68. rasa/core/channels/inspector/src/App.tsx +1 -1
  69. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +3 -6
  70. rasa/core/channels/socketio.py +2 -7
  71. rasa/core/channels/telegram.py +1 -1
  72. rasa/core/channels/twilio.py +1 -1
  73. rasa/core/channels/voice_ready/audiocodes.py +4 -15
  74. rasa/core/channels/voice_ready/jambonz.py +4 -15
  75. rasa/core/channels/voice_ready/twilio_voice.py +21 -6
  76. rasa/core/channels/voice_ready/utils.py +5 -6
  77. rasa/core/channels/voice_stream/asr/asr_engine.py +1 -19
  78. rasa/core/channels/voice_stream/asr/asr_event.py +0 -5
  79. rasa/core/channels/voice_stream/asr/deepgram.py +15 -28
  80. rasa/core/channels/voice_stream/audio_bytes.py +0 -1
  81. rasa/core/channels/voice_stream/tts/azure.py +3 -9
  82. rasa/core/channels/voice_stream/tts/cartesia.py +8 -12
  83. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -11
  84. rasa/core/channels/voice_stream/twilio_media_streams.py +19 -28
  85. rasa/core/channels/voice_stream/util.py +4 -4
  86. rasa/core/channels/voice_stream/voice_channel.py +42 -222
  87. rasa/core/featurizers/single_state_featurizer.py +1 -22
  88. rasa/core/featurizers/tracker_featurizers.py +18 -115
  89. rasa/core/information_retrieval/qdrant.py +0 -1
  90. rasa/core/nlg/contextual_response_rephraser.py +25 -44
  91. rasa/core/persistor.py +34 -191
  92. rasa/core/policies/enterprise_search_policy.py +60 -119
  93. rasa/core/policies/flows/flow_executor.py +4 -7
  94. rasa/core/policies/intentless_policy.py +22 -82
  95. rasa/core/policies/ted_policy.py +33 -58
  96. rasa/core/policies/unexpected_intent_policy.py +7 -15
  97. rasa/core/processor.py +13 -89
  98. rasa/core/run.py +2 -2
  99. rasa/core/training/interactive.py +35 -34
  100. rasa/core/utils.py +22 -58
  101. rasa/dialogue_understanding/coexistence/llm_based_router.py +12 -39
  102. rasa/dialogue_understanding/commands/__init__.py +0 -4
  103. rasa/dialogue_understanding/commands/change_flow_command.py +0 -6
  104. rasa/dialogue_understanding/commands/utils.py +0 -5
  105. rasa/dialogue_understanding/generator/constants.py +0 -2
  106. rasa/dialogue_understanding/generator/flow_retrieval.py +4 -49
  107. rasa/dialogue_understanding/generator/llm_based_command_generator.py +23 -37
  108. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +10 -57
  109. rasa/dialogue_understanding/generator/nlu_command_adapter.py +1 -19
  110. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +0 -3
  111. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +10 -90
  112. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +0 -53
  113. rasa/dialogue_understanding/processor/command_processor.py +1 -21
  114. rasa/e2e_test/assertions.py +16 -133
  115. rasa/e2e_test/assertions_schema.yml +0 -23
  116. rasa/e2e_test/e2e_test_case.py +6 -85
  117. rasa/e2e_test/e2e_test_runner.py +4 -6
  118. rasa/e2e_test/utils/io.py +1 -3
  119. rasa/engine/loader.py +0 -12
  120. rasa/engine/validation.py +11 -541
  121. rasa/keys +1 -0
  122. rasa/llm_fine_tuning/notebooks/unsloth_finetuning.ipynb +407 -0
  123. rasa/model_training.py +7 -29
  124. rasa/nlu/classifiers/diet_classifier.py +25 -38
  125. rasa/nlu/classifiers/logistic_regression_classifier.py +9 -22
  126. rasa/nlu/classifiers/sklearn_intent_classifier.py +16 -37
  127. rasa/nlu/extractors/crf_entity_extractor.py +50 -93
  128. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +16 -45
  129. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +17 -52
  130. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +3 -5
  131. rasa/nlu/tokenizers/whitespace_tokenizer.py +14 -3
  132. rasa/server.py +1 -3
  133. rasa/shared/constants.py +0 -61
  134. rasa/shared/core/constants.py +0 -9
  135. rasa/shared/core/domain.py +5 -8
  136. rasa/shared/core/flows/flow.py +0 -5
  137. rasa/shared/core/flows/flows_list.py +1 -5
  138. rasa/shared/core/flows/flows_yaml_schema.json +0 -10
  139. rasa/shared/core/flows/validation.py +0 -96
  140. rasa/shared/core/flows/yaml_flows_io.py +4 -13
  141. rasa/shared/core/slots.py +0 -5
  142. rasa/shared/importers/importer.py +2 -19
  143. rasa/shared/importers/rasa.py +1 -5
  144. rasa/shared/nlu/training_data/features.py +2 -120
  145. rasa/shared/nlu/training_data/formats/rasa_yaml.py +3 -18
  146. rasa/shared/providers/_configs/azure_openai_client_config.py +3 -5
  147. rasa/shared/providers/_configs/openai_client_config.py +1 -1
  148. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +0 -1
  149. rasa/shared/providers/_configs/utils.py +0 -16
  150. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +29 -18
  151. rasa/shared/providers/embedding/azure_openai_embedding_client.py +21 -54
  152. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -24
  153. rasa/shared/providers/llm/_base_litellm_client.py +31 -63
  154. rasa/shared/providers/llm/azure_openai_llm_client.py +29 -50
  155. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -24
  156. rasa/shared/providers/llm/self_hosted_llm_client.py +29 -17
  157. rasa/shared/providers/mappings.py +0 -19
  158. rasa/shared/utils/common.py +2 -37
  159. rasa/shared/utils/io.py +6 -28
  160. rasa/shared/utils/llm.py +46 -353
  161. rasa/shared/utils/yaml.py +82 -181
  162. rasa/studio/auth.py +5 -3
  163. rasa/studio/config.py +4 -13
  164. rasa/studio/constants.py +0 -1
  165. rasa/studio/data_handler.py +4 -13
  166. rasa/studio/upload.py +80 -175
  167. rasa/telemetry.py +17 -94
  168. rasa/tracing/config.py +1 -3
  169. rasa/tracing/instrumentation/attribute_extractors.py +17 -94
  170. rasa/tracing/instrumentation/instrumentation.py +0 -121
  171. rasa/utils/common.py +0 -5
  172. rasa/utils/endpoints.py +1 -27
  173. rasa/utils/io.py +81 -7
  174. rasa/utils/log_utils.py +2 -9
  175. rasa/utils/tensorflow/model_data.py +193 -2
  176. rasa/validator.py +4 -110
  177. rasa/version.py +1 -1
  178. rasa_pro-3.11.0a1.dist-info/METADATA +576 -0
  179. {rasa_pro-3.11.0.dist-info → rasa_pro-3.11.0a1.dist-info}/RECORD +182 -216
  180. rasa/core/actions/action_repeat_bot_messages.py +0 -89
  181. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-736177bf.js +0 -1
  182. rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -165
  183. rasa/core/channels/voice_stream/asr/azure.py +0 -129
  184. rasa/core/channels/voice_stream/browser_audio.py +0 -107
  185. rasa/core/channels/voice_stream/call_state.py +0 -23
  186. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +0 -60
  187. rasa/dialogue_understanding/commands/user_silence_command.py +0 -59
  188. rasa/dialogue_understanding/patterns/repeat.py +0 -37
  189. rasa/dialogue_understanding/patterns/user_silence.py +0 -37
  190. rasa/model_manager/__init__.py +0 -0
  191. rasa/model_manager/config.py +0 -40
  192. rasa/model_manager/model_api.py +0 -559
  193. rasa/model_manager/runner_service.py +0 -286
  194. rasa/model_manager/socket_bridge.py +0 -146
  195. rasa/model_manager/studio_jwt_auth.py +0 -86
  196. rasa/model_manager/trainer_service.py +0 -325
  197. rasa/model_manager/utils.py +0 -87
  198. rasa/model_manager/warm_rasa_process.py +0 -187
  199. rasa/model_service.py +0 -112
  200. rasa/shared/core/flows/utils.py +0 -39
  201. rasa/shared/providers/_configs/litellm_router_client_config.py +0 -220
  202. rasa/shared/providers/_configs/model_group_config.py +0 -167
  203. rasa/shared/providers/_configs/rasa_llm_client_config.py +0 -73
  204. rasa/shared/providers/_utils.py +0 -79
  205. rasa/shared/providers/embedding/litellm_router_embedding_client.py +0 -135
  206. rasa/shared/providers/llm/litellm_router_llm_client.py +0 -182
  207. rasa/shared/providers/llm/rasa_llm_client.py +0 -112
  208. rasa/shared/providers/router/__init__.py +0 -0
  209. rasa/shared/providers/router/_base_litellm_router_client.py +0 -183
  210. rasa/shared/providers/router/router_client.py +0 -73
  211. rasa/shared/utils/health_check/__init__.py +0 -0
  212. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +0 -31
  213. rasa/shared/utils/health_check/health_check.py +0 -258
  214. rasa/shared/utils/health_check/llm_health_check_mixin.py +0 -31
  215. rasa/utils/sanic_error_handler.py +0 -32
  216. rasa/utils/tensorflow/feature_array.py +0 -366
  217. rasa_pro-3.11.0.dist-info/METADATA +0 -198
  218. {rasa_pro-3.11.0.dist-info → rasa_pro-3.11.0a1.dist-info}/NOTICE +0 -0
  219. {rasa_pro-3.11.0.dist-info → rasa_pro-3.11.0a1.dist-info}/WHEEL +0 -0
  220. {rasa_pro-3.11.0.dist-info → rasa_pro-3.11.0a1.dist-info}/entry_points.txt +0 -0
@@ -1,31 +0,0 @@
1
- from typing import Optional, Dict, Any
2
-
3
-
4
- class EmbeddingsHealthCheckMixin:
5
- """Mixin class that provides methods for performing embeddings health checks during
6
- training and inference within components.
7
-
8
- This mixin offers static methods that wrap the following health check functions:
9
- - `perform_embeddings_health_check`
10
- """
11
-
12
- @staticmethod
13
- def perform_embeddings_health_check(
14
- custom_embeddings_config: Optional[Dict[str, Any]],
15
- default_embeddings_config: Dict[str, Any],
16
- log_source_method: str,
17
- log_source_component: str,
18
- ) -> None:
19
- """Wraps the `perform_embeddings_health_check` function to enable
20
- tracing and instrumentation.
21
- """
22
- from rasa.shared.utils.health_check.health_check import (
23
- perform_embeddings_health_check,
24
- )
25
-
26
- perform_embeddings_health_check(
27
- custom_embeddings_config,
28
- default_embeddings_config,
29
- log_source_method,
30
- log_source_component,
31
- )
@@ -1,258 +0,0 @@
1
- import os
2
- import sys
3
- from typing import Optional, Dict, Any
4
-
5
- from rasa.shared.constants import (
6
- LLM_API_HEALTH_CHECK_ENV_VAR,
7
- MODELS_CONFIG_KEY,
8
- LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
9
- )
10
- from rasa.shared.exceptions import ProviderClientValidationError
11
- from rasa.shared.providers.embedding.embedding_client import EmbeddingClient
12
- from rasa.shared.providers.llm.llm_client import LLMClient
13
- from rasa.shared.utils.llm import llm_factory, structlogger, embedder_factory
14
-
15
-
16
- def try_instantiate_llm_client(
17
- custom_llm_config: Optional[Dict],
18
- default_llm_config: Optional[Dict],
19
- log_source_function: str,
20
- log_source_component: str,
21
- ) -> LLMClient:
22
- """Validate llm configuration."""
23
- try:
24
- return llm_factory(custom_llm_config, default_llm_config)
25
- except (ProviderClientValidationError, ValueError) as e:
26
- structlogger.error(
27
- f"{log_source_function}.llm_instantiation_failed",
28
- event_info=(
29
- f"Unable to create the LLM client for component - "
30
- f"{log_source_component}. "
31
- f"Please make sure you specified the required environment variables "
32
- f"and configuration keys. "
33
- ),
34
- error=e,
35
- )
36
- sys.exit(1)
37
-
38
-
39
- def try_instantiate_embedder(
40
- custom_embeddings_config: Optional[Dict],
41
- default_embeddings_config: Optional[Dict],
42
- log_source_function: str,
43
- log_source_component: str,
44
- ) -> EmbeddingClient:
45
- """Validate embeddings configuration."""
46
- try:
47
- return embedder_factory(custom_embeddings_config, default_embeddings_config)
48
- except (ProviderClientValidationError, ValueError) as e:
49
- structlogger.error(
50
- f"{log_source_function}.embedder_instantiation_failed",
51
- event_info=(
52
- f"Unable to create the Embedding client for component - "
53
- f"{log_source_component}. Please make sure you specified the required "
54
- f"environment variables and configuration keys."
55
- ),
56
- error=e,
57
- )
58
- sys.exit(1)
59
-
60
-
61
- def perform_llm_health_check(
62
- custom_config: Optional[Dict[str, Any]],
63
- default_config: Dict[str, Any],
64
- log_source_function: str,
65
- log_source_component: str,
66
- ) -> None:
67
- """Try to instantiate the LLM Client to validate the provided config.
68
- If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
69
- to the LLM API. If config contains multiple models, perform a test call for each
70
- model in the model group.
71
-
72
- This method supports both single model configurations and model group configurations
73
- (configs that have the `models` key).
74
- """
75
- # Instantiate the LLM client or Router LLM client to validate the provided config.
76
- llm_client = try_instantiate_llm_client(
77
- custom_config, default_config, log_source_function, log_source_component
78
- )
79
-
80
- if is_api_health_check_enabled():
81
- if (
82
- custom_config
83
- and MODELS_CONFIG_KEY in custom_config
84
- and len(custom_config[MODELS_CONFIG_KEY]) > 1
85
- ):
86
- # If the config uses a router, instantiate the LLM client for each model
87
- # in the model group. This is required to perform a test api call for each
88
- # model in the group.
89
- # Note: The Router LLM client is not used here as we need to perform a test
90
- # api call and not load balance the requests.
91
- for model_config in custom_config[MODELS_CONFIG_KEY]:
92
- llm_client = try_instantiate_llm_client(
93
- model_config,
94
- default_config,
95
- log_source_function,
96
- log_source_component,
97
- )
98
- send_test_llm_api_request(
99
- llm_client, log_source_function, log_source_component
100
- )
101
- else:
102
- # Make a test api call to perform a health check for the LLM client.
103
- # LLM config from config file and model group config from endpoint config
104
- # without router are handled here.
105
- send_test_llm_api_request(
106
- llm_client,
107
- log_source_function,
108
- log_source_component,
109
- )
110
- else:
111
- structlogger.warning(
112
- f"{log_source_function}.perform_llm_health_check.disabled",
113
- event_info=(
114
- f"The {LLM_API_HEALTH_CHECK_ENV_VAR} environment variable is set "
115
- f"to false, which will disable LLM health check. "
116
- f"It is recommended to set this variable to true in production "
117
- f"environments."
118
- ),
119
- )
120
- return None
121
-
122
-
123
- def perform_embeddings_health_check(
124
- custom_config: Optional[Dict[str, Any]],
125
- default_config: Dict[str, Any],
126
- log_source_function: str,
127
- log_source_component: str,
128
- ) -> None:
129
- """Try to instantiate the Embedder to validate the provided config.
130
- If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
131
- to the Embeddings API. If config contains multiple models, perform a test call for
132
- each model in the model group.
133
-
134
- This method supports both single model configurations and model group configurations
135
- (configs that have the `models` key).
136
- """
137
- # Instantiate the Embedder client or the Embedder Router client to validate the
138
- # provided config. Deprecation warnings and errors are logged here.
139
- embedder = try_instantiate_embedder(
140
- custom_config, default_config, log_source_function, log_source_component
141
- )
142
-
143
- if is_api_health_check_enabled():
144
- if (
145
- custom_config
146
- and MODELS_CONFIG_KEY in custom_config
147
- and len(custom_config[MODELS_CONFIG_KEY]) > 1
148
- ):
149
- # If the config uses a router, instantiate the Embedder client for each
150
- # model in the model group. This is required to perform a test api call
151
- # for every model in the group.
152
- # Note: The Router Embedding client is not used here as we need to perform
153
- # a test API call and not load balance the requests.
154
- for model_config in custom_config[MODELS_CONFIG_KEY]:
155
- embedder = try_instantiate_embedder(
156
- model_config,
157
- default_config,
158
- log_source_function,
159
- log_source_component,
160
- )
161
- send_test_embeddings_api_request(
162
- embedder, log_source_function, log_source_component
163
- )
164
- else:
165
- # Make a test api call to perform a health check for the Embedding client.
166
- # Embeddings config from config file and model group config from endpoint
167
- # config without router are handled here.
168
- send_test_embeddings_api_request(
169
- embedder, log_source_function, log_source_component
170
- )
171
- else:
172
- structlogger.warning(
173
- f"{log_source_function}" f".perform_embeddings_health_check.disabled",
174
- event_info=(
175
- f"The {LLM_API_HEALTH_CHECK_ENV_VAR} environment variable is set "
176
- f"to false, which will disable embeddings API health check. "
177
- f"It is recommended to set this variable to true in production "
178
- f"environments."
179
- ),
180
- )
181
- return None
182
-
183
-
184
- def send_test_llm_api_request(
185
- llm_client: LLMClient, log_source_function: str, log_source_component: str
186
- ) -> None:
187
- """Sends a test request to the LLM API to perform a health check.
188
-
189
- Raises:
190
- Exception: If the API call fails.
191
- """
192
- structlogger.info(
193
- f"{log_source_function}.send_test_llm_api_request",
194
- event_info=(
195
- f"Sending a test LLM API request for the component - "
196
- f"{log_source_component}."
197
- ),
198
- config=llm_client.config,
199
- )
200
- try:
201
- llm_client.completion("hello")
202
- except Exception as e:
203
- structlogger.error(
204
- f"{log_source_function}.send_test_llm_api_request_failed",
205
- event_info=(
206
- f"Test call to the LLM API failed for component - "
207
- f"{log_source_component}.",
208
- ),
209
- config=llm_client.config,
210
- error=e,
211
- )
212
- sys.exit(1)
213
-
214
-
215
- def send_test_embeddings_api_request(
216
- embedder: EmbeddingClient, log_source_function: str, log_source_component: str
217
- ) -> None:
218
- """Sends a test request to the Embeddings API to perform a health check.
219
-
220
- Raises:
221
- Exception: If the API call fails.
222
- """
223
- structlogger.info(
224
- f"{log_source_function}.send_test_embeddings_api_request",
225
- event_info=(
226
- f"Sending a test Embeddings API request for the component - "
227
- f"{log_source_component}."
228
- ),
229
- config=embedder.config,
230
- )
231
- try:
232
- embedder.embed(["hello"])
233
- except Exception as e:
234
- structlogger.error(
235
- f"{log_source_function}.send_test_llm_api_request_failed",
236
- event_info=(
237
- f"Test call to the Embeddings API failed for component - "
238
- f"{log_source_component}."
239
- ),
240
- config=embedder.config,
241
- error=e,
242
- )
243
- sys.exit(1)
244
-
245
-
246
- def is_api_health_check_enabled() -> bool:
247
- """Determines whether the API health check is enabled based on an environment
248
- variable.
249
-
250
- Returns:
251
- bool: True if the API health check is enabled, False otherwise.
252
- """
253
- return (
254
- os.getenv(
255
- LLM_API_HEALTH_CHECK_ENV_VAR, LLM_API_HEALTH_CHECK_DEFAULT_VALUE
256
- ).lower()
257
- == "true"
258
- )
@@ -1,31 +0,0 @@
1
- from typing import Optional, Dict, Any
2
-
3
-
4
- class LLMHealthCheckMixin:
5
- """Mixin class that provides methods for performing llm health checks during
6
- training and inference within components.
7
-
8
- This mixin offers static methods that wrap the following health check functions:
9
- - `perform_llm_health_check`
10
- """
11
-
12
- @staticmethod
13
- def perform_llm_health_check(
14
- custom_llm_config: Optional[Dict[str, Any]],
15
- default_llm_config: Dict[str, Any],
16
- log_source_method: str,
17
- log_source_component: str,
18
- ) -> None:
19
- """Wraps the `perform_llm_health_check` function to enable
20
- tracing and instrumentation.
21
- """
22
- from rasa.shared.utils.health_check.health_check import (
23
- perform_llm_health_check,
24
- )
25
-
26
- perform_llm_health_check(
27
- custom_llm_config,
28
- default_llm_config,
29
- log_source_method,
30
- log_source_component,
31
- )
@@ -1,32 +0,0 @@
1
- from sanic import Sanic
2
- from sanic.handlers import ErrorHandler
3
- from sanic.request import Request
4
- from sanic.exceptions import ServerError
5
-
6
-
7
- # TODO: remove custom handler when upgrading to sanic >= 24
8
- # the underlying issue https://github.com/sanic-org/sanic/issues/2572
9
- # has been fixed in sanic 24
10
- class IgnoreWSServerErrorHandler(ErrorHandler):
11
- @staticmethod
12
- def log(request: Request, exception: Exception) -> None:
13
- try:
14
- if (
15
- request.url.startswith("ws")
16
- and isinstance(exception, ServerError)
17
- and exception.args
18
- and (
19
- exception.args[0]
20
- == "Invalid response type None (need HTTPResponse)"
21
- )
22
- ):
23
- # in case we are in a websocket connection, we don't want to log the
24
- # the error, as this is a bug in sanic
25
- return
26
- except Exception:
27
- pass
28
- ErrorHandler.log(request, exception) # type: ignore
29
-
30
-
31
- def register_custom_sanic_error_handler(app: Sanic) -> None:
32
- app.error_handler = IgnoreWSServerErrorHandler()