iatoolkit 0.3.9__tar.gz → 0.4.0__tar.gz

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 iatoolkit might be problematic. Click here for more details.

Files changed (38) hide show
  1. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/PKG-INFO +1 -1
  2. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/pyproject.toml +1 -1
  3. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/company_registry.py +4 -0
  4. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit.egg-info/PKG-INFO +1 -1
  5. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/dispatcher_service.py +37 -22
  6. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/prompt_manager_service.py +2 -1
  7. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/readme.md +0 -0
  8. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/requirements.txt +0 -0
  9. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/setup.cfg +0 -0
  10. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/__init__.py +2 -2
  11. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/base_company.py +0 -0
  12. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/cli_commands.py +0 -0
  13. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/iatoolkit.py +0 -0
  14. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/system_prompts/arquitectura.prompt +0 -0
  15. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/system_prompts/format_styles.prompt +0 -0
  16. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/system_prompts/query_main.prompt +0 -0
  17. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit/system_prompts/sql_rules.prompt +0 -0
  18. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  19. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  20. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  21. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
  22. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/__init__.py +0 -0
  23. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/api_service.py +0 -0
  24. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/benchmark_service.py +0 -0
  25. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/document_service.py +0 -0
  26. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/excel_service.py +0 -0
  27. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/file_processor_service.py +0 -0
  28. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/history_service.py +0 -0
  29. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/jwt_service.py +0 -0
  30. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/load_documents_service.py +0 -0
  31. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/mail_service.py +0 -0
  32. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/profile_service.py +0 -0
  33. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/query_service.py +0 -0
  34. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/search_service.py +0 -0
  35. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/sql_service.py +0 -0
  36. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/tasks_service.py +0 -0
  37. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/user_feedback_service.py +0 -0
  38. {iatoolkit-0.3.9 → iatoolkit-0.4.0}/src/services/user_session_context_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.3.9
3
+ Version: 0.4.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "iatoolkit"
7
- version = "0.3.9"
7
+ version = "0.4.0"
8
8
  requires-python = ">=3.11"
9
9
  description = "IAToolkit"
10
10
  readme = "readme.md"
@@ -46,6 +46,10 @@ class CompanyRegistry:
46
46
 
47
47
  return self._company_instances.copy()
48
48
 
49
+ def get_all_company_instances(self) -> Dict[str, BaseCompany]:
50
+ """Devuelve un diccionario con todas las instancias de empresas creadas."""
51
+ return self._company_instances.copy()
52
+
49
53
  def get_registered_companies(self) -> Dict[str, Type[BaseCompany]]:
50
54
  return self._company_classes.copy()
51
55
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.3.9
3
+ Version: 0.4.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -3,7 +3,6 @@
3
3
  # Todos los derechos reservados.
4
4
  # En trámite de registro en el Registro de Propiedad Intelectual de Chile.
5
5
 
6
- from iatoolkit import current_iatoolkit
7
6
  from common.exceptions import IAToolkitException
8
7
  from services.prompt_manager_service import PromptService
9
8
  from services.api_service import ApiService
@@ -11,10 +10,10 @@ from repositories.llm_query_repo import LLMQueryRepo
11
10
  from repositories.models import Company, Function
12
11
  from services.excel_service import ExcelService
13
12
  from services.mail_service import MailService
14
- from iatoolkit.company_registry import get_company_registry
15
13
  from common.session_manager import SessionManager
16
14
  from common.util import Utility
17
15
  from injector import inject
16
+ from typing import Dict
18
17
  import logging
19
18
  import os
20
19
 
@@ -37,11 +36,10 @@ class Dispatcher:
37
36
  self.system_functions = _FUNCTION_LIST
38
37
  self.system_prompts = _SYSTEM_PROMPT
39
38
 
40
- # Use the global registry
41
- self.company_registry = get_company_registry()
39
+ self._company_registry = None
40
+ self._company_instances = None
42
41
 
43
42
  # load into the dispatcher the configured companies
44
- self.company_classes = {}
45
43
  self.initialize_companies()
46
44
 
47
45
  # run the statrtup logic for all companies
@@ -53,23 +51,40 @@ class Dispatcher:
53
51
  "iat_api_call": self.api_service.call_api
54
52
  }
55
53
 
54
+ @property
55
+ def company_registry(self):
56
+ """Lazy-loads and returns the CompanyRegistry instance."""
57
+ if self._company_registry is None:
58
+ from iatoolkit.company_registry import get_company_registry
59
+ self._company_registry = get_company_registry()
60
+ return self._company_registry
61
+
62
+ @property
63
+ def company_instances(self):
64
+ """Lazy-loads and returns the instantiated company classes."""
65
+ if self._company_instances is None:
66
+ self._company_instances = self.company_registry.get_all_company_instances()
67
+ return self._company_instances
68
+
56
69
  def initialize_companies(self):
70
+ from iatoolkit import current_iatoolkit
57
71
  """
58
72
  Initializes and instantiates all registered company classes.
59
73
  This method should be called *after* the main injector is fully configured
60
74
  and the company registry is populated.
61
75
  """
62
- if self.company_classes: # Prevent re-initialization
76
+ if self.company_registry.get_all_company_instances(): # Check if already instantiated
63
77
  return
64
78
 
65
79
  # ✅ NOW it is safe to get the injector and instantiate companies.
66
80
  injector = current_iatoolkit().get_injector()
67
81
  self.company_registry.set_injector(injector)
68
- self.company_classes = self.company_registry.instantiate_companies()
82
+ self.company_registry.instantiate_companies()
83
+
69
84
 
70
85
  def start_execution(self):
71
86
  """Runs the startup logic for all registered companies."""
72
- for company_name, company_instance in self.company_classes.items():
87
+ for company_name, company_instance in self.company_instances.items():
73
88
  logging.info(f'Starting execution for company: {company_name}')
74
89
  company_instance.start_execution()
75
90
 
@@ -100,14 +115,14 @@ class Dispatcher:
100
115
  i += 1
101
116
 
102
117
  # register in the database every company class
103
- for company in self.company_classes.values():
118
+ for company in self.company_instances.values():
104
119
  company.register_company()
105
120
 
106
121
  def dispatch(self, company_name: str, action: str, **kwargs) -> str:
107
122
  company_key = company_name.lower()
108
123
 
109
- if company_key not in self.company_classes:
110
- available_companies = list(self.company_classes.keys())
124
+ if company_key not in self.company_instances:
125
+ available_companies = list(self.company_instances.keys())
111
126
  raise IAToolkitException(
112
127
  IAToolkitException.ErrorType.EXTERNAL_SOURCE_ERROR,
113
128
  f"Empresa '{company_name}' no configurada. Empresas disponibles: {available_companies}"
@@ -117,7 +132,7 @@ class Dispatcher:
117
132
  if action in self.tool_handlers:
118
133
  return self.tool_handlers[action](**kwargs)
119
134
 
120
- company_instance = self.company_classes[company_name]
135
+ company_instance = self.company_instances[company_name]
121
136
  try:
122
137
  return company_instance.handle_request(action, **kwargs)
123
138
  except IAToolkitException as e:
@@ -130,7 +145,7 @@ class Dispatcher:
130
145
  f"Error en function call '{action}': {str(e)}") from e
131
146
 
132
147
  def get_company_context(self, company_name: str, **kwargs) -> str:
133
- if company_name not in self.company_classes:
148
+ if company_name not in self.company_instances:
134
149
  raise IAToolkitException(IAToolkitException.ErrorType.EXTERNAL_SOURCE_ERROR,
135
150
  f"Empresa no configurada: {company_name}")
136
151
 
@@ -152,7 +167,7 @@ class Dispatcher:
152
167
  filepath = os.path.join(schema_dir, file)
153
168
  company_context += self.util.generate_context_for_schema(schema_name, filepath)
154
169
 
155
- company_instance = self.company_classes[company_name]
170
+ company_instance = self.company_instances[company_name]
156
171
  try:
157
172
  return company_context + company_instance.get_company_context(**kwargs)
158
173
  except Exception as e:
@@ -180,7 +195,7 @@ class Dispatcher:
180
195
  return tools
181
196
 
182
197
  def get_user_info(self, company_name: str, user_identifier: str, is_local_user: bool) -> dict:
183
- if company_name not in self.company_classes:
198
+ if company_name not in self.company_instances:
184
199
  raise IAToolkitException(IAToolkitException.ErrorType.EXTERNAL_SOURCE_ERROR,
185
200
  f"Empresa no configurada: {company_name}")
186
201
 
@@ -190,7 +205,7 @@ class Dispatcher:
190
205
  raw_user_data = SessionManager.get('user', {})
191
206
  else:
192
207
  # source 2: external company user
193
- company_instance = self.company_classes[company_name]
208
+ company_instance = self.company_instances[company_name]
194
209
  try:
195
210
  raw_user_data = company_instance.get_user_info(user_identifier)
196
211
  except Exception as e:
@@ -226,11 +241,11 @@ class Dispatcher:
226
241
  return normalized_user
227
242
 
228
243
  def get_metadata_from_filename(self, company_name: str, filename: str) -> dict:
229
- if company_name not in self.company_classes:
244
+ if company_name not in self.company_instances:
230
245
  raise IAToolkitException(IAToolkitException.ErrorType.EXTERNAL_SOURCE_ERROR,
231
246
  f"Empresa no configurada: {company_name}")
232
247
 
233
- company_instance = self.company_classes[company_name]
248
+ company_instance = self.company_instances[company_name]
234
249
  try:
235
250
  return company_instance.get_metadata_from_filename(filename)
236
251
  except Exception as e:
@@ -240,14 +255,14 @@ class Dispatcher:
240
255
 
241
256
  def get_company_instance(self, company_name: str):
242
257
  """Returns the instance for a given company name."""
243
- return self.company_classes.get(company_name)
258
+ return self.company_instances.get(company_name)
244
259
 
245
260
  def get_registered_companies(self) -> dict:
246
- """Obtiene todas las empresas registradas (para debugging/admin)"""
261
+ """Gets all registered companies (for debugging/admin purposes)"""
247
262
  return {
248
263
  "registered_classes": list(self.company_registry.get_registered_companies().keys()),
249
- "instantiated": list(self.company_classes.keys()),
250
- "count": len(self.company_classes)
264
+ "instantiated": list(self.company_instances.keys()),
265
+ "count": len(self.company_instances)
251
266
  }
252
267
 
253
268
 
@@ -74,7 +74,8 @@ class PromptService:
74
74
  raise IAToolkitException(IAToolkitException.ErrorType.DOCUMENT_NOT_FOUND,
75
75
  f"No se encontró el prompt '{prompt_name}' para la empresa '{company.short_name}'")
76
76
 
77
- absolute_filepath = os.path.join(execution_dir, user_prompt.filename)
77
+ prompt_file = f'companies/{company.short_name}/prompts/{user_prompt.filename}'
78
+ absolute_filepath = os.path.join(execution_dir, prompt_file)
78
79
  if not os.path.exists(absolute_filepath):
79
80
  raise IAToolkitException(IAToolkitException.ErrorType.FILE_IO_ERROR,
80
81
  f"El archivo para el prompt '{prompt_name}' no existe: {absolute_filepath}")
File without changes
File without changes
File without changes
@@ -21,9 +21,9 @@ from services.excel_service import ExcelService
21
21
  from services.dispatcher_service import Dispatcher
22
22
  from services.document_service import DocumentService
23
23
  from services.search_service import SearchService
24
- from services.query_service import QueryService
25
24
  from repositories.profile_repo import ProfileRepo
26
25
  from repositories.llm_query_repo import LLMQueryRepo
26
+ from services.query_service import QueryService
27
27
  from repositories.database_manager import DatabaseManager
28
28
  from infra.call_service import CallServiceClient
29
29
  from common.util import Utility
@@ -40,8 +40,8 @@ __all__ = [
40
40
  'ExcelService',
41
41
  'Dispatcher',
42
42
  'DocumentService',
43
- 'QueryService',
44
43
  'SearchService',
44
+ 'QueryService',
45
45
  'ProfileRepo',
46
46
  'LLMQueryRepo',
47
47
  'DatabaseManager',