cwyodmodules 0.3.35__py3-none-any.whl → 0.3.37__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.
Files changed (48) hide show
  1. cwyodmodules/api/chat_history.py +10 -9
  2. cwyodmodules/batch/utilities/chat_history/auth_utils.py +3 -2
  3. cwyodmodules/batch/utilities/chat_history/cosmosdb.py +13 -12
  4. cwyodmodules/batch/utilities/chat_history/postgresdbservice.py +13 -12
  5. cwyodmodules/batch/utilities/common/source_document.py +9 -8
  6. cwyodmodules/batch/utilities/document_chunking/fixed_size_overlap.py +2 -1
  7. cwyodmodules/batch/utilities/document_chunking/layout.py +2 -1
  8. cwyodmodules/batch/utilities/document_chunking/page.py +2 -1
  9. cwyodmodules/batch/utilities/document_loading/read.py +2 -1
  10. cwyodmodules/batch/utilities/helpers/azure_computer_vision_client.py +7 -6
  11. cwyodmodules/batch/utilities/helpers/azure_form_recognizer_helper.py +3 -2
  12. cwyodmodules/batch/utilities/helpers/azure_postgres_helper.py +11 -10
  13. cwyodmodules/batch/utilities/helpers/azure_postgres_helper_light_rag.py +11 -10
  14. cwyodmodules/batch/utilities/helpers/azure_search_helper.py +10 -9
  15. cwyodmodules/batch/utilities/helpers/config/config_helper.py +20 -19
  16. cwyodmodules/batch/utilities/helpers/embedders/integrated_vectorization_embedder.py +12 -3
  17. cwyodmodules/batch/utilities/helpers/embedders/postgres_embedder.py +8 -2
  18. cwyodmodules/batch/utilities/helpers/embedders/push_embedder.py +11 -2
  19. cwyodmodules/batch/utilities/helpers/env_helper.py +4 -1
  20. cwyodmodules/batch/utilities/helpers/lightrag_helper.py +5 -4
  21. cwyodmodules/batch/utilities/helpers/llm_helper.py +10 -9
  22. cwyodmodules/batch/utilities/helpers/secret_helper.py +3 -3
  23. cwyodmodules/batch/utilities/integrated_vectorization/azure_search_index.py +5 -4
  24. cwyodmodules/batch/utilities/integrated_vectorization/azure_search_indexer.py +4 -3
  25. cwyodmodules/batch/utilities/integrated_vectorization/azure_search_skillset.py +2 -1
  26. cwyodmodules/batch/utilities/orchestrator/lang_chain_agent.py +4 -3
  27. cwyodmodules/batch/utilities/orchestrator/open_ai_functions.py +2 -1
  28. cwyodmodules/batch/utilities/orchestrator/orchestrator_base.py +5 -4
  29. cwyodmodules/batch/utilities/orchestrator/prompt_flow.py +5 -4
  30. cwyodmodules/batch/utilities/orchestrator/semantic_kernel_orchestrator.py +2 -1
  31. cwyodmodules/batch/utilities/parser/output_parser_tool.py +5 -4
  32. cwyodmodules/batch/utilities/plugins/outlook_calendar_plugin.py +4 -3
  33. cwyodmodules/batch/utilities/search/azure_search_handler.py +12 -11
  34. cwyodmodules/batch/utilities/search/azure_search_handler_light_rag.py +10 -9
  35. cwyodmodules/batch/utilities/search/integrated_vectorization_search_handler.py +12 -11
  36. cwyodmodules/batch/utilities/search/lightrag_search_handler.py +9 -8
  37. cwyodmodules/batch/utilities/search/postgres_search_handler.py +13 -12
  38. cwyodmodules/batch/utilities/search/postgres_search_handler_light_rag.py +14 -13
  39. cwyodmodules/batch/utilities/search/search.py +3 -2
  40. cwyodmodules/batch/utilities/tools/content_safety_checker.py +5 -4
  41. cwyodmodules/batch/utilities/tools/post_prompt_tool.py +2 -1
  42. cwyodmodules/batch/utilities/tools/question_answer_tool.py +8 -7
  43. cwyodmodules/batch/utilities/tools/text_processing_tool.py +2 -1
  44. {cwyodmodules-0.3.35.dist-info → cwyodmodules-0.3.37.dist-info}/METADATA +2 -2
  45. {cwyodmodules-0.3.35.dist-info → cwyodmodules-0.3.37.dist-info}/RECORD +48 -48
  46. {cwyodmodules-0.3.35.dist-info → cwyodmodules-0.3.37.dist-info}/WHEEL +0 -0
  47. {cwyodmodules-0.3.35.dist-info → cwyodmodules-0.3.37.dist-info}/licenses/LICENSE +0 -0
  48. {cwyodmodules-0.3.35.dist-info → cwyodmodules-0.3.37.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,7 @@ from ..helpers.azure_identity_helper import AzureIdentityHelper
7
7
 
8
8
  from logging_config import logger
9
9
  env_helper: EnvHelper = EnvHelper()
10
+ log_execution = env_helper.LOG_EXECUTION
10
11
  log_args = env_helper.LOG_ARGS
11
12
  log_result = env_helper.LOG_RESULT
12
13
 
@@ -19,7 +20,7 @@ class AzurePostgresHelper:
19
20
  self.azure_identity_helper = AzureIdentityHelper()
20
21
  self.conn = None
21
22
 
22
- @logger.trace_function(log_args=log_args, log_result=False)
23
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
23
24
  def _create_search_client(self):
24
25
  """
25
26
  Establishes a connection to Azure PostgreSQL using AAD authentication.
@@ -49,7 +50,7 @@ class AzurePostgresHelper:
49
50
  logger.error(f"Error establishing a connection to PostgreSQL: {e}")
50
51
  raise
51
52
 
52
- @logger.trace_function(log_args=log_args, log_result=False)
53
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
53
54
  def get_search_client(self):
54
55
  """
55
56
  Provides a reusable database connection.
@@ -58,7 +59,7 @@ class AzurePostgresHelper:
58
59
  self.conn = self._create_search_client()
59
60
  return self.conn
60
61
 
61
- @logger.trace_function(log_args=False, log_result=False)
62
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
62
63
  def get_vector_store(self, embedding_array):
63
64
  """
64
65
  Fetches search indexes from PostgreSQL based on an embedding vector.
@@ -87,7 +88,7 @@ class AzurePostgresHelper:
87
88
  finally:
88
89
  conn.close()
89
90
 
90
- @logger.trace_function(log_args=False, log_result=log_result)
91
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=log_result)
91
92
  def create_vector_store(self, documents_to_upload):
92
93
  """
93
94
  Inserts documents into the `vector_store` table in batch mode.
@@ -131,7 +132,7 @@ class AzurePostgresHelper:
131
132
  finally:
132
133
  conn.close()
133
134
 
134
- @logger.trace_function(log_args=log_args, log_result=False)
135
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
135
136
  def get_files(self):
136
137
  """
137
138
  Fetches distinct titles from the PostgreSQL database.
@@ -164,7 +165,7 @@ class AzurePostgresHelper:
164
165
  finally:
165
166
  conn.close()
166
167
 
167
- @logger.trace_function(log_args=log_args, log_result=log_result)
168
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
168
169
  def delete_documents(self, ids_to_delete):
169
170
  """
170
171
  Deletes documents from the PostgreSQL database based on the provided ids.
@@ -212,7 +213,7 @@ class AzurePostgresHelper:
212
213
  finally:
213
214
  conn.close()
214
215
 
215
- @logger.trace_function(log_args=log_args, log_result=False)
216
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
216
217
  def perform_search(self, title):
217
218
  """
218
219
  Fetches search results from PostgreSQL based on the title.
@@ -239,7 +240,7 @@ class AzurePostgresHelper:
239
240
  finally:
240
241
  conn.close()
241
242
 
242
- @logger.trace_function(log_args=log_args, log_result=False)
243
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
243
244
  def get_unique_files(self):
244
245
  """
245
246
  Fetches unique titles from PostgreSQL.
@@ -264,7 +265,7 @@ class AzurePostgresHelper:
264
265
  finally:
265
266
  conn.close()
266
267
 
267
- @logger.trace_function(log_args=log_args, log_result=False)
268
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
268
269
  def search_by_blob_url(self, blob_url):
269
270
  """
270
271
  Fetches unique titles from PostgreSQL based on a given blob URL.
@@ -291,7 +292,7 @@ class AzurePostgresHelper:
291
292
  finally:
292
293
  conn.close()
293
294
 
294
- @logger.trace_function(log_args=False, log_result=False)
295
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
295
296
  def store_with_lightrag(self, documents_to_upload):
296
297
  """
297
298
  Stores documents using LightRAG for enhanced vector and text storage capabilities.
@@ -30,6 +30,7 @@ from ..helpers.llm_helper import LLMHelper
30
30
  from ..helpers.env_helper import EnvHelper
31
31
  from logging_config import logger
32
32
  env_helper: EnvHelper = EnvHelper()
33
+ log_execution = env_helper.LOG_EXECUTION
33
34
  log_args = env_helper.LOG_ARGS
34
35
  log_result = env_helper.LOG_RESULT
35
36
 
@@ -47,7 +48,7 @@ class AzureSearchHelper:
47
48
  self.search_index_client = self._create_search_index_client(search_credential)
48
49
  self.azure_computer_vision_client = AzureComputerVisionClient(self.env_helper)
49
50
 
50
- @logger.trace_function(log_args=log_args, log_result=False)
51
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
51
52
  def _search_credential(self):
52
53
  if self.env_helper.is_auth_type_keys():
53
54
  return AzureKeyCredential(self.env_helper.AZURE_SEARCH_KEY)
@@ -55,7 +56,7 @@ class AzureSearchHelper:
55
56
  credential = self.azure_identity_helper.get_credential()
56
57
  return credential
57
58
 
58
- @logger.trace_function(log_args=False, log_result=False)
59
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
59
60
  def _create_search_client(
60
61
  self, search_credential: Union[AzureKeyCredential, ChainedTokenCredential, DefaultAzureCredential]
61
62
  ) -> SearchClient:
@@ -65,7 +66,7 @@ class AzureSearchHelper:
65
66
  credential=search_credential,
66
67
  )
67
68
 
68
- @logger.trace_function(log_args=False, log_result=False)
69
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
69
70
  def _create_search_index_client(
70
71
  self, search_credential: Union[AzureKeyCredential, ChainedTokenCredential, DefaultAzureCredential]
71
72
  ):
@@ -73,13 +74,13 @@ class AzureSearchHelper:
73
74
  endpoint=self.env_helper.AZURE_SEARCH_SERVICE, credential=search_credential
74
75
  )
75
76
 
76
- @logger.trace_function(log_args=log_args, log_result=False)
77
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
77
78
  def get_search_client(self) -> SearchClient:
78
79
  self.create_index()
79
80
  return self.search_client
80
81
 
81
82
  @property
82
- @logger.trace_function(log_args=log_args, log_result=False)
83
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
83
84
  def search_dimensions(self) -> int:
84
85
  if AzureSearchHelper._search_dimension is None:
85
86
  AzureSearchHelper._search_dimension = len(
@@ -88,7 +89,7 @@ class AzureSearchHelper:
88
89
  return AzureSearchHelper._search_dimension
89
90
 
90
91
  @property
91
- @logger.trace_function(log_args=log_args, log_result=False)
92
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
92
93
  def image_search_dimensions(self) -> int:
93
94
  if AzureSearchHelper._image_search_dimension is None:
94
95
  AzureSearchHelper._image_search_dimension = len(
@@ -96,7 +97,7 @@ class AzureSearchHelper:
96
97
  )
97
98
  return AzureSearchHelper._image_search_dimension
98
99
 
99
- @logger.trace_function(log_args=log_args, log_result=False)
100
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
100
101
  def create_index(self):
101
102
  fields = [
102
103
  SimpleField(
@@ -211,13 +212,13 @@ class AzureSearchHelper:
211
212
  )
212
213
  self.search_index_client.create_index(index)
213
214
 
214
- @logger.trace_function(log_args=log_args, log_result=log_result)
215
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
215
216
  def _index_not_exists(self, index_name: str) -> bool:
216
217
  return index_name not in [
217
218
  name for name in self.search_index_client.list_index_names()
218
219
  ]
219
220
 
220
- @logger.trace_function(log_args=log_args, log_result=False)
221
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
221
222
  def get_conversation_logger(self):
222
223
  fields = [
223
224
  SimpleField(
@@ -20,6 +20,7 @@ ADVANCED_IMAGE_PROCESSING_FILE_TYPES = ["jpeg", "jpg", "png", "tiff", "bmp"]
20
20
 
21
21
  from logging_config import logger
22
22
  env_helper: EnvHelper = EnvHelper()
23
+ log_execution = env_helper.LOG_EXECUTION
23
24
  log_args = env_helper.LOG_ARGS
24
25
  log_result = env_helper.LOG_RESULT
25
26
 
@@ -59,7 +60,7 @@ class Config:
59
60
  "conversational_flow", self.env_helper.CONVERSATION_FLOW
60
61
  )
61
62
 
62
- @logger.trace_function(log_args=log_args, log_result=log_result)
63
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
63
64
  def get_available_document_types(self) -> list[str]:
64
65
  document_types = {
65
66
  "txt",
@@ -78,27 +79,27 @@ class Config:
78
79
 
79
80
  return sorted(document_types)
80
81
 
81
- @logger.trace_function(log_args=log_args, log_result=log_result)
82
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
82
83
  def get_advanced_image_processing_image_types(self):
83
84
  return ADVANCED_IMAGE_PROCESSING_FILE_TYPES
84
85
 
85
- @logger.trace_function(log_args=log_args, log_result=log_result)
86
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
86
87
  def get_available_chunking_strategies(self):
87
88
  return [c.value for c in ChunkingStrategy]
88
89
 
89
- @logger.trace_function(log_args=log_args, log_result=log_result)
90
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
90
91
  def get_available_loading_strategies(self):
91
92
  return [c.value for c in LoadingStrategy]
92
93
 
93
- @logger.trace_function(log_args=log_args, log_result=log_result)
94
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
94
95
  def get_available_orchestration_strategies(self):
95
96
  return [c.value for c in OrchestrationStrategy]
96
97
 
97
- @logger.trace_function(log_args=log_args, log_result=log_result)
98
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
98
99
  def get_available_ai_assistant_types(self):
99
100
  return [c.value for c in AssistantStrategy]
100
101
 
101
- @logger.trace_function(log_args=log_args, log_result=log_result)
102
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
102
103
  def get_available_conversational_flows(self):
103
104
  return [c.value for c in ConversationFlow]
104
105
 
@@ -149,7 +150,7 @@ class ConfigHelper:
149
150
  _default_config = None
150
151
 
151
152
  @staticmethod
152
- @logger.trace_function(log_args=False, log_result=False)
153
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
153
154
  def _set_new_config_properties(config: dict, default_config: dict):
154
155
  """
155
156
  Function used to set newer properties that will not be present in older configs.
@@ -200,7 +201,7 @@ class ConfigHelper:
200
201
 
201
202
  @staticmethod
202
203
  @functools.cache
203
- @logger.trace_function(log_args=False, log_result=False)
204
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
204
205
  def get_active_config_or_default():
205
206
  logger.info("Method get_active_config_or_default started")
206
207
  env_helper = EnvHelper()
@@ -226,13 +227,13 @@ class ConfigHelper:
226
227
 
227
228
  @staticmethod
228
229
  @functools.cache
229
- @logger.trace_function(log_args=False, log_result=False)
230
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
230
231
  def get_default_assistant_prompt():
231
232
  config = ConfigHelper.get_default_config()
232
233
  return config["prompts"]["answering_user_prompt"]
233
234
 
234
235
  @staticmethod
235
- @logger.trace_function(log_args=False, log_result=log_result)
236
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=log_result)
236
237
  def save_config_as_active(config):
237
238
  ConfigHelper.validate_config(config)
238
239
  blob_client = AzureBlobStorageClient(container_name=CONFIG_CONTAINER_NAME)
@@ -244,7 +245,7 @@ class ConfigHelper:
244
245
  ConfigHelper.get_active_config_or_default.cache_clear()
245
246
 
246
247
  @staticmethod
247
- @logger.trace_function(log_args=False, log_result=log_result)
248
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=log_result)
248
249
  def validate_config(config: dict):
249
250
  for document_processor in config.get("document_processors"):
250
251
  document_type = document_processor.get("document_type")
@@ -260,7 +261,7 @@ class ConfigHelper:
260
261
  )
261
262
 
262
263
  @staticmethod
263
- @logger.trace_function(log_args=log_args, log_result=False)
264
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
264
265
  def get_default_config():
265
266
  if ConfigHelper._default_config is None:
266
267
  env_helper = EnvHelper()
@@ -292,7 +293,7 @@ class ConfigHelper:
292
293
 
293
294
  @staticmethod
294
295
  @functools.cache
295
- @logger.trace_function(log_args=log_args, log_result=False)
296
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
296
297
  def get_default_contract_assistant():
297
298
  contract_file_path = os.path.join(
298
299
  os.path.dirname(__file__), "default_contract_assistant_prompt.txt"
@@ -305,7 +306,7 @@ class ConfigHelper:
305
306
 
306
307
  @staticmethod
307
308
  @functools.cache
308
- @logger.trace_function(log_args=log_args, log_result=False)
309
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
309
310
  def get_default_employee_assistant():
310
311
  employee_file_path = os.path.join(
311
312
  os.path.dirname(__file__), "default_employee_assistant_prompt.txt"
@@ -317,13 +318,13 @@ class ConfigHelper:
317
318
  return "".join([str(elem) for elem in employee_assistant])
318
319
 
319
320
  @staticmethod
320
- @logger.trace_function(log_args=log_args, log_result=log_result)
321
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
321
322
  def clear_config():
322
323
  ConfigHelper._default_config = None
323
324
  ConfigHelper.get_active_config_or_default.cache_clear()
324
325
 
325
326
  @staticmethod
326
- @logger.trace_function(log_args=log_args, log_result=log_result)
327
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
327
328
  def _append_advanced_image_processors():
328
329
  image_file_types = ["jpeg", "jpg", "png", "tiff", "bmp"]
329
330
  ConfigHelper._remove_processors_for_file_types(image_file_types)
@@ -335,7 +336,7 @@ class ConfigHelper:
335
336
  )
336
337
 
337
338
  @staticmethod
338
- @logger.trace_function(log_args=log_args, log_result=log_result)
339
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
339
340
  def _remove_processors_for_file_types(file_types: list[str]):
340
341
  document_processors = ConfigHelper._default_config["document_processors"]
341
342
  document_processors = [
@@ -346,7 +347,7 @@ class ConfigHelper:
346
347
  ConfigHelper._default_config["document_processors"] = document_processors
347
348
 
348
349
  @staticmethod
349
- @logger.trace_function(log_args=log_args, log_result=log_result)
350
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
350
351
  def delete_config():
351
352
  blob_client = AzureBlobStorageClient(container_name=CONFIG_CONTAINER_NAME)
352
353
  blob_client.delete_file(CONFIG_FILE_NAME)
@@ -1,3 +1,4 @@
1
+ import azure.functions as func
1
2
  from .embedder_base import EmbedderBase
2
3
  from ..env_helper import EnvHelper
3
4
  from ..llm_helper import LLMHelper
@@ -6,9 +7,14 @@ from ...integrated_vectorization.azure_search_indexer import AzureSearchIndexer
6
7
  from ...integrated_vectorization.azure_search_datasource import AzureSearchDatasource
7
8
  from ...integrated_vectorization.azure_search_skillset import AzureSearchSkillset
8
9
  from ..config.config_helper import ConfigHelper
9
- import logging
10
10
 
11
- logger = logging.getLogger("__main__")
11
+ from logging_config import logger
12
+ env_helper: EnvHelper = EnvHelper()
13
+ log_execution = env_helper.LOG_EXECUTION
14
+ log_args = env_helper.LOG_ARGS
15
+ log_result = env_helper.LOG_RESULT
16
+
17
+ bp_add_url_embeddings = func.Blueprint()
12
18
 
13
19
 
14
20
  class IntegratedVectorizationEmbedder(EmbedderBase):
@@ -16,13 +22,15 @@ class IntegratedVectorizationEmbedder(EmbedderBase):
16
22
  self.env_helper = env_helper
17
23
  self.llm_helper: LLMHelper = LLMHelper()
18
24
  logger.info("Initialized IntegratedVectorizationEmbedder.")
19
-
25
+
26
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
20
27
  def embed_file(self, source_url: str, file_name: str = None):
21
28
  logger.info(
22
29
  f"Starting embed_file for source_url: {source_url}, file_name: {file_name}."
23
30
  )
24
31
  self.process_using_integrated_vectorization(source_url=source_url)
25
32
 
33
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
26
34
  def process_using_integrated_vectorization(self, source_url: str):
27
35
  logger.info(f"Starting integrated vectorization for source_url: {source_url}.")
28
36
  config = ConfigHelper.get_active_config_or_default()
@@ -46,6 +54,7 @@ class IntegratedVectorizationEmbedder(EmbedderBase):
46
54
  logger.error(f"Error processing {source_url}: {e}")
47
55
  raise e
48
56
 
57
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
49
58
  def reprocess_all(self):
50
59
  logger.info("Starting reprocess_all operation.")
51
60
  search_indexer = AzureSearchIndexer(self.env_helper)
@@ -1,5 +1,4 @@
1
1
  import json
2
- import logging
3
2
  from typing import List
4
3
 
5
4
  from ...helpers.llm_helper import LLMHelper
@@ -15,7 +14,11 @@ from ..document_loading_helper import DocumentLoading
15
14
  from ..document_chunking_helper import DocumentChunking
16
15
  from ...common.source_document import SourceDocument
17
16
 
18
- logger = logging.getLogger("__main__")
17
+ from logging_config import logger
18
+ env_helper: EnvHelper = EnvHelper()
19
+ log_execution = env_helper.LOG_EXECUTION
20
+ log_args = env_helper.LOG_ARGS
21
+ log_result = env_helper.LOG_RESULT
19
22
 
20
23
 
21
24
  class PostgresEmbedder(EmbedderBase):
@@ -33,6 +36,7 @@ class PostgresEmbedder(EmbedderBase):
33
36
  ext = processor.document_type.lower()
34
37
  self.embedding_configs[ext] = processor
35
38
 
39
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
36
40
  def embed_file(self, source_url: str, file_name: str):
37
41
  logger.info(f"Embedding file: {file_name} from source: {source_url}")
38
42
  file_extension = file_name.split(".")[-1].lower()
@@ -47,6 +51,7 @@ class PostgresEmbedder(EmbedderBase):
47
51
  file_name, {"embeddings_added": "true"}
48
52
  )
49
53
 
54
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=log_result)
50
55
  def __embed(
51
56
  self, source_url: str, file_extension: str, embedding_config: EmbeddingConfig
52
57
  ):
@@ -84,6 +89,7 @@ class PostgresEmbedder(EmbedderBase):
84
89
  else:
85
90
  logger.warning("No documents to upload.")
86
91
 
92
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
87
93
  def __convert_to_search_document(self, document: SourceDocument):
88
94
  logger.info(f"Generating embeddings for document ID: {document.id}")
89
95
  embedded_content = self.llm_helper.generate_embeddings(document.content)
@@ -1,6 +1,5 @@
1
1
  import hashlib
2
2
  import json
3
- import logging
4
3
  from typing import List
5
4
  from urllib.parse import urlparse
6
5
 
@@ -19,7 +18,11 @@ from ..document_loading_helper import DocumentLoading
19
18
  from ..document_chunking_helper import DocumentChunking
20
19
  from ...common.source_document import SourceDocument
21
20
 
22
- logger = logging.getLogger("__main__")
21
+ from logging_config import logger
22
+ env_helper: EnvHelper = EnvHelper()
23
+ log_execution = env_helper.LOG_EXECUTION
24
+ log_args = env_helper.LOG_ARGS
25
+ log_result = env_helper.LOG_RESULT
23
26
 
24
27
 
25
28
  class PushEmbedder(EmbedderBase):
@@ -40,6 +43,7 @@ class PushEmbedder(EmbedderBase):
40
43
  self.embedding_configs[ext] = processor
41
44
  logger.info("Document processors loaded")
42
45
 
46
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
43
47
  def embed_file(self, source_url: str, file_name: str):
44
48
  logger.info(f"Embedding file: {file_name} from URL: {source_url}")
45
49
  file_extension = file_name.split(".")[-1].lower()
@@ -55,6 +59,7 @@ class PushEmbedder(EmbedderBase):
55
59
  file_name, {"embeddings_added": "true"}
56
60
  )
57
61
 
62
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=log_result)
58
63
  def __embed(
59
64
  self, source_url: str, file_extension: str, embedding_config: EmbeddingConfig
60
65
  ):
@@ -101,6 +106,7 @@ class PushEmbedder(EmbedderBase):
101
106
  else:
102
107
  logger.warning("No documents to upload.")
103
108
 
109
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
104
110
  def __generate_image_caption(self, source_url):
105
111
  logger.info(f"Generating image caption for URL: {source_url}")
106
112
  model = self.env_helper.AZURE_OPENAI_VISION_MODEL
@@ -129,6 +135,7 @@ If the image is mostly text, use OCR to extract the text as it is displayed in t
129
135
  logger.info("Caption generation completed")
130
136
  return caption
131
137
 
138
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
132
139
  def __convert_to_search_document(self, document: SourceDocument):
133
140
  logger.info(f"Converting document ID {document.id} to search document format")
134
141
  embedded_content = self.llm_helper.generate_embeddings(document.content)
@@ -152,10 +159,12 @@ If the image is mostly text, use OCR to extract the text as it is displayed in t
152
159
  self.env_helper.AZURE_SEARCH_OFFSET_COLUMN: document.offset,
153
160
  }
154
161
 
162
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=log_result)
155
163
  def __generate_document_id(self, source_url: str) -> str:
156
164
  hash_key = hashlib.sha1(f"{source_url}_1".encode("utf-8")).hexdigest()
157
165
  return f"doc_{hash_key}"
158
166
 
167
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
159
168
  def __create_image_document(
160
169
  self,
161
170
  source_url: str,
@@ -25,7 +25,7 @@ class EnvHelper:
25
25
  cls._instance = instance
26
26
  return cls._instance
27
27
 
28
- @logger.trace_function(log_args=False, log_result=False)
28
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
29
29
  def __load_config(self, **kwargs) -> None:
30
30
  # load_dotenv()
31
31
 
@@ -48,6 +48,9 @@ class EnvHelper:
48
48
  # )
49
49
 
50
50
  self.LOGLEVEL = self.secretHelper.get_secret("logging-level")
51
+ self.LOG_EXECUTION = self.get_env_var_bool(
52
+ "LOG_EXECUTION", "True"
53
+ )
51
54
  self.LOG_ARGS = self.get_env_var_bool(
52
55
  "LOG_ARGS", "True"
53
56
  )
@@ -5,6 +5,7 @@ from ..helpers.azure_identity_helper import AzureIdentityHelper
5
5
  from ...utilities.helpers.env_helper import EnvHelper
6
6
  from logging_config import logger
7
7
  env_helper: EnvHelper = EnvHelper()
8
+ log_execution = env_helper.LOG_EXECUTION
8
9
  log_args = env_helper.LOG_ARGS
9
10
  log_result = env_helper.LOG_RESULT
10
11
 
@@ -15,7 +16,7 @@ class LightRAGHelper:
15
16
  self.azure_identity_helper = AzureIdentityHelper()
16
17
  self.conn = None
17
18
 
18
- @logger.trace_function(log_args=log_args, log_result=False)
19
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
19
20
  def _create_connection(self):
20
21
  """
21
22
  Establishes a connection to PostgreSQL using AAD authentication.
@@ -45,7 +46,7 @@ class LightRAGHelper:
45
46
  logger.error(f"Error establishing a connection to PostgreSQL: {e}")
46
47
  raise
47
48
 
48
- @logger.trace_function(log_args=log_args, log_result=False)
49
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
49
50
  def get_connection(self):
50
51
  """
51
52
  Provides a reusable database connection.
@@ -54,7 +55,7 @@ class LightRAGHelper:
54
55
  self.conn = self._create_connection()
55
56
  return self.conn
56
57
 
57
- @logger.trace_function(log_args=False, log_result=False)
58
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
58
59
  def store_vector_and_text(self, vector, text, metadata):
59
60
  """
60
61
  Stores a vector and associated text in the PostgreSQL database.
@@ -76,7 +77,7 @@ class LightRAGHelper:
76
77
  finally:
77
78
  conn.close()
78
79
 
79
- @logger.trace_function(log_args=False, log_result=False)
80
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
80
81
  def retrieve_vectors(self, query_vector, top_k):
81
82
  """
82
83
  Retrieves the top K vectors similar to the provided query vector.
@@ -12,6 +12,7 @@ from .env_helper import EnvHelper
12
12
 
13
13
  from logging_config import logger
14
14
  env_helper: EnvHelper = EnvHelper()
15
+ log_execution = env_helper.LOG_EXECUTION
15
16
  log_args = env_helper.LOG_ARGS
16
17
  log_result = env_helper.LOG_RESULT
17
18
 
@@ -48,7 +49,7 @@ class LLMHelper:
48
49
 
49
50
  logger.info("Initializing LLMHelper completed")
50
51
 
51
- @logger.trace_function(log_args=log_args, log_result=False)
52
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
52
53
  def get_llm(self):
53
54
  if self.auth_type_keys:
54
55
  return AzureChatOpenAI(
@@ -70,7 +71,7 @@ class LLMHelper:
70
71
  )
71
72
 
72
73
  # TODO: This needs to have a custom callback to stream back to the UI
73
- @logger.trace_function(log_args=log_args, log_result=False)
74
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
74
75
  def get_streaming_llm(self):
75
76
  if self.auth_type_keys:
76
77
  return AzureChatOpenAI(
@@ -96,7 +97,7 @@ class LLMHelper:
96
97
  azure_ad_token_provider=self.token_provider,
97
98
  )
98
99
 
99
- @logger.trace_function(log_args=log_args, log_result=False)
100
+ @logger.trace_function(log_execution=log_execution, log_args=log_args, log_result=False)
100
101
  def get_embedding_model(self):
101
102
  if self.auth_type_keys:
102
103
  return AzureOpenAIEmbeddings(
@@ -113,7 +114,7 @@ class LLMHelper:
113
114
  azure_ad_token_provider=self.token_provider,
114
115
  )
115
116
 
116
- @logger.trace_function(log_args=False, log_result=False)
117
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
117
118
  def generate_embeddings(self, input: Union[str, list[int]]) -> List[float]:
118
119
  return (
119
120
  self.openai_client.embeddings.create(
@@ -123,7 +124,7 @@ class LLMHelper:
123
124
  .embedding
124
125
  )
125
126
 
126
- @logger.trace_function(log_args=False, log_result=False)
127
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
127
128
  def get_chat_completion_with_functions(
128
129
  self, messages: list[dict], functions: list[dict], function_call: str = "auto"
129
130
  ):
@@ -134,7 +135,7 @@ class LLMHelper:
134
135
  function_call=function_call,
135
136
  )
136
137
 
137
- @logger.trace_function(log_args=False, log_result=False)
138
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
138
139
  def get_chat_completion(
139
140
  self, messages: list[dict], model: str | None = None, **kwargs
140
141
  ):
@@ -145,7 +146,7 @@ class LLMHelper:
145
146
  **kwargs,
146
147
  )
147
148
 
148
- @logger.trace_function(log_args=False, log_result=False)
149
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
149
150
  def get_sk_chat_completion_service(self, service_id: str):
150
151
  if self.auth_type_keys:
151
152
  return AzureChatCompletion(
@@ -175,7 +176,7 @@ class LLMHelper:
175
176
  ad_token_provider=self.token_provider,
176
177
  )
177
178
 
178
- @logger.trace_function(log_args=False, log_result=False)
179
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
179
180
  def get_sk_service_settings(self, service: AzureChatCompletion):
180
181
  return cast(
181
182
  AzureChatPromptExecutionSettings,
@@ -186,7 +187,7 @@ class LLMHelper:
186
187
  ),
187
188
  )
188
189
 
189
- @logger.trace_function(log_args=False, log_result=False)
190
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
190
191
  def get_ml_client(self):
191
192
  if not hasattr(self, "_ml_client"):
192
193
  credential = self.azure_identity_helper.get_credential()
@@ -30,7 +30,7 @@ class SecretHelper:
30
30
  connection_verify=True,
31
31
  )
32
32
 
33
- @logger.trace_function(log_args=False, log_result=False)
33
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
34
34
  def get_secret(self, secret_name: str) -> str:
35
35
  """
36
36
  Retrieves the value of a secret from the environment variables or Azure Key Vault.
@@ -48,7 +48,7 @@ class SecretHelper:
48
48
  secret_value = self.secret_client.get_secret(name=secret_name).value
49
49
  return secret_value
50
50
 
51
- @logger.trace_function(log_args=False, log_result=False)
51
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
52
52
  def set_secret(self, secret_name: str, secret_value: str) -> None:
53
53
  """
54
54
  Sets the value of a secret in Azure Key Vault only if it doesn't exist or has a different value.
@@ -76,7 +76,7 @@ class SecretHelper:
76
76
  logger.warning(f"Secret {secret_name} has been created")
77
77
 
78
78
 
79
- @logger.trace_function(log_args=False, log_result=False)
79
+ @logger.trace_function(log_execution=log_execution, log_args=False, log_result=False)
80
80
  def get_secret_from_json(self, secret_name: str) -> str:
81
81
  secret_value = self.secret_client.get_secret(secret_name).value
82
82
  return secret_value