iatoolkit 0.59.0__tar.gz → 0.59.2__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 (119) hide show
  1. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/PKG-INFO +1 -1
  2. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/pyproject.toml +1 -1
  3. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/base_company.py +3 -1
  4. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/iatoolkit.py +2 -3
  5. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/models.py +1 -1
  6. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/auth_service.py +1 -1
  7. iatoolkit-0.59.2/src/iatoolkit/services/user_feedback_service.py +103 -0
  8. iatoolkit-0.59.2/src/iatoolkit/static/js/chat_context_reload.js +54 -0
  9. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/js/chat_feedback.js +1 -3
  10. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/init_context_api_view.py +0 -2
  11. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/user_feedback_api_view.py +0 -10
  12. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit.egg-info/PKG-INFO +1 -1
  13. iatoolkit-0.59.0/src/iatoolkit/services/user_feedback_service.py +0 -64
  14. iatoolkit-0.59.0/src/iatoolkit/static/js/chat_context_reload.js +0 -61
  15. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/readme.md +0 -0
  16. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/requirements.txt +0 -0
  17. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/setup.cfg +0 -0
  18. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/__init__.py +0 -0
  19. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/cli_commands.py +0 -0
  20. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/common/__init__.py +0 -0
  21. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/common/exceptions.py +0 -0
  22. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/common/routes.py +0 -0
  23. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/common/session_manager.py +0 -0
  24. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/common/util.py +0 -0
  25. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/company_registry.py +0 -0
  26. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/__init__.py +0 -0
  27. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/call_service.py +0 -0
  28. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  29. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  30. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  31. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  32. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  33. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  34. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  35. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/gemini_adapter.py +0 -0
  36. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/google_chat_app.py +0 -0
  37. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/llm_client.py +0 -0
  38. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/llm_proxy.py +0 -0
  39. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/llm_response.py +0 -0
  40. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/mail_app.py +0 -0
  41. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/openai_adapter.py +0 -0
  42. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  43. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/__init__.py +0 -0
  44. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/database_manager.py +0 -0
  45. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/document_repo.py +0 -0
  46. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  47. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/profile_repo.py +0 -0
  48. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/tasks_repo.py +0 -0
  49. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/repositories/vs_repo.py +0 -0
  50. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/__init__.py +0 -0
  51. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/benchmark_service.py +0 -0
  52. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/branding_service.py +0 -0
  53. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/dispatcher_service.py +0 -0
  54. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/document_service.py +0 -0
  55. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/excel_service.py +0 -0
  56. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/file_processor_service.py +0 -0
  57. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/history_service.py +0 -0
  58. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/jwt_service.py +0 -0
  59. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/load_documents_service.py +0 -0
  60. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/mail_service.py +0 -0
  61. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/onboarding_service.py +0 -0
  62. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/profile_service.py +0 -0
  63. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/prompt_manager_service.py +0 -0
  64. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/query_service.py +0 -0
  65. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/search_service.py +0 -0
  66. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/sql_service.py +0 -0
  67. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/tasks_service.py +0 -0
  68. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/services/user_session_context_service.py +0 -0
  69. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  70. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  71. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/js/chat_history.js +0 -0
  72. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/js/chat_main.js +0 -0
  73. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/js/chat_onboarding.js +0 -0
  74. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  75. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/styles/chat_info.css +0 -0
  76. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  77. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/styles/landing_page.css +0 -0
  78. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/styles/llm_output.css +0 -0
  79. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/static/styles/onboarding.css +0 -0
  80. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/system_prompts/format_styles.prompt +0 -0
  81. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/system_prompts/query_main.prompt +0 -0
  82. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/system_prompts/sql_rules.prompt +0 -0
  83. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/_branding_styles.html +0 -0
  84. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/_login_widget.html +0 -0
  85. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/_navbar.html +0 -0
  86. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/about.html +0 -0
  87. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/base.html +0 -0
  88. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/change_password.html +0 -0
  89. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/chat.html +0 -0
  90. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/chat_modals.html +0 -0
  91. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/error.html +0 -0
  92. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/forgot_password.html +0 -0
  93. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/header.html +0 -0
  94. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/index.html +0 -0
  95. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/login_simulation.html +0 -0
  96. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  97. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/signup.html +0 -0
  98. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/templates/test.html +0 -0
  99. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/__init__.py +0 -0
  100. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/base_login_view.py +0 -0
  101. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/change_password_view.py +0 -0
  102. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/chat_token_request_view.py +0 -0
  103. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/external_login_view.py +0 -0
  104. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/file_store_api_view.py +0 -0
  105. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/forgot_password_view.py +0 -0
  106. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/history_api_view.py +0 -0
  107. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/index_view.py +0 -0
  108. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  109. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/login_simulation_view.py +0 -0
  110. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/login_view.py +0 -0
  111. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/prompt_api_view.py +0 -0
  112. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/signup_view.py +0 -0
  113. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/tasks_review_view.py +0 -0
  114. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/tasks_view.py +0 -0
  115. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit/views/verify_user_view.py +0 -0
  116. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  117. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  118. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit.egg-info/requires.txt +0 -0
  119. {iatoolkit-0.59.0 → iatoolkit-0.59.2}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.59.0
3
+ Version: 0.59.2
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.59.0"
7
+ version = "0.59.2"
8
8
  requires-python = ">=3.12"
9
9
  description = "IAToolkit"
10
10
  readme = "readme.md"
@@ -29,11 +29,13 @@ class BaseCompany(ABC):
29
29
  def _create_company(self,
30
30
  short_name: str,
31
31
  name: str,
32
+ parameters: dict | None = None,
32
33
  branding: dict | None = None,
33
- onboarding_cards: dict | None = None
34
+ onboarding_cards: dict | None = None,
34
35
  ) -> Company:
35
36
  company_obj = Company(short_name=short_name,
36
37
  name=name,
38
+ parameters=parameters,
37
39
  branding=branding,
38
40
  onboarding_cards=onboarding_cards)
39
41
  self.company = self.profile_repo.create_company(company_obj)
@@ -19,7 +19,7 @@ from werkzeug.middleware.proxy_fix import ProxyFix
19
19
  from injector import Binder, singleton, Injector
20
20
  from importlib.metadata import version as _pkg_version, PackageNotFoundError
21
21
 
22
- IATOOLKIT_VERSION = "0.59.0"
22
+ IATOOLKIT_VERSION = "0.59.2"
23
23
 
24
24
  # global variable for the unique instance of IAToolkit
25
25
  _iatoolkit_instance: Optional['IAToolkit'] = None
@@ -117,7 +117,7 @@ class IAToolkit:
117
117
  log_level = getattr(logging, log_level_name, logging.INFO)
118
118
 
119
119
  logging.basicConfig(
120
- level=logging.INFO, # log_level,
120
+ level=log_level,
121
121
  format="%(asctime)s - IATOOLKIT - %(name)s - %(levelname)s - %(message)s",
122
122
  handlers=[logging.StreamHandler()],
123
123
  force=True
@@ -230,7 +230,6 @@ class IAToolkit:
230
230
  default_origins = [
231
231
  "http://localhost:5001",
232
232
  "http://127.0.0.1:5001",
233
- "https://portal-interno.maxxa.cl",
234
233
  os.getenv('IATOOLKIT_BASE_URL')
235
234
  ]
236
235
 
@@ -60,7 +60,7 @@ class Company(Base):
60
60
 
61
61
  branding = Column(JSON, nullable=True)
62
62
  onboarding_cards = Column(JSON, nullable=True)
63
- parameters = Column(JSON, nullable=True, default={})
63
+ parameters = Column(JSON, nullable=True)
64
64
  created_at = Column(DateTime, default=datetime.now)
65
65
  allow_jwt = Column(Boolean, default=True, nullable=True)
66
66
 
@@ -140,7 +140,7 @@ class AuthService:
140
140
  }
141
141
 
142
142
  # --- Failure: No valid credentials found ---
143
- logging.info(f"Authentication required. No session cookie or API Key provided.")
143
+ logging.info(f"Authentication required. No session cookie or API Key provided. session: {str(session_info)}")
144
144
  return {"success": False, "error_message": "Authentication required. No session cookie or API Key provided.",
145
145
  "status_code": 402}
146
146
 
@@ -0,0 +1,103 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from iatoolkit.repositories.models import UserFeedback, Company
7
+ from injector import inject
8
+ from iatoolkit.repositories.profile_repo import ProfileRepo
9
+ from iatoolkit.infra.google_chat_app import GoogleChatApp
10
+ from iatoolkit.infra.mail_app import MailApp # <-- 1. Importar MailApp
11
+ import logging
12
+
13
+
14
+ class UserFeedbackService:
15
+ @inject
16
+ def __init__(self,
17
+ profile_repo: ProfileRepo,
18
+ google_chat_app: GoogleChatApp,
19
+ mail_app: MailApp):
20
+ self.profile_repo = profile_repo
21
+ self.google_chat_app = google_chat_app
22
+ self.mail_app = mail_app
23
+
24
+ def _send_google_chat_notification(self, space_name: str, message_text: str):
25
+ """Envía una notificación de feedback a un espacio de Google Chat."""
26
+ try:
27
+ chat_data = {
28
+ "type": "MESSAGE_TRIGGER",
29
+ "space": {"name": space_name},
30
+ "message": {"text": message_text}
31
+ }
32
+ chat_result = self.google_chat_app.send_message(message_data=chat_data)
33
+ if not chat_result.get('success'):
34
+ logging.warning(f"Error al enviar notificación a Google Chat: {chat_result.get('message')}")
35
+ except Exception as e:
36
+ logging.exception(f"Fallo inesperado al enviar notificación a Google Chat: {e}")
37
+
38
+ def _send_email_notification(self, destination_email: str, company_name: str, message_text: str):
39
+ """Envía una notificación de feedback por correo electrónico."""
40
+ try:
41
+ subject = f"Nuevo Feedback de {company_name}"
42
+ # Convertir el texto plano a un HTML simple para mantener los saltos de línea
43
+ html_body = message_text.replace('\n', '<br>')
44
+ self.mail_app.send_email(to=destination_email, subject=subject, body=html_body)
45
+ except Exception as e:
46
+ logging.exception(f"Fallo inesperado al enviar email de feedback: {e}")
47
+
48
+ def _handle_notification(self, company: Company, message_text: str):
49
+ """Lee la configuración de la empresa y envía la notificación al canal correspondiente."""
50
+ feedback_params = company.parameters.get('user_feedback')
51
+ if not isinstance(feedback_params, dict):
52
+ logging.warning(f"No se encontró configuración de 'user_feedback' para la empresa {company.short_name}.")
53
+ return
54
+
55
+ # get channel and destination
56
+ channel = feedback_params.get('channel')
57
+ destination = feedback_params.get('destination')
58
+ if not channel or not destination:
59
+ logging.warning(f"Configuración 'user_feedback' incompleta para {company.short_name}. Faltan 'channel' o 'destination'.")
60
+ return
61
+
62
+ if channel == 'google_chat':
63
+ self._send_google_chat_notification(space_name=destination, message_text=message_text)
64
+ elif channel == 'email':
65
+ self._send_email_notification(destination_email=destination, company_name=company.short_name, message_text=message_text)
66
+ else:
67
+ logging.warning(f"Canal de feedback '{channel}' no reconocido para la empresa {company.short_name}.")
68
+
69
+ def new_feedback(self,
70
+ company_short_name: str,
71
+ message: str,
72
+ user_identifier: str,
73
+ rating: int = None) -> dict:
74
+ try:
75
+ # 1. Validar empresa
76
+ company = self.profile_repo.get_company_by_short_name(company_short_name)
77
+ if not company:
78
+ return {'error': f'No existe la empresa: {company_short_name}'}
79
+
80
+ # 2. Enviar notificación según la configuración de la empresa
81
+ notification_text = (f"*Nuevo feedback de {company_short_name}*:\n"
82
+ f"*Usuario:* {user_identifier}\n"
83
+ f"*Mensaje:* {message}\n"
84
+ f"*Calificación:* {rating if rating is not None else 'N/A'}")
85
+ self._handle_notification(company, notification_text)
86
+
87
+ # 3. Guardar el feedback en la base de datos (independientemente del éxito de la notificación)
88
+ new_feedback_obj = UserFeedback(
89
+ company_id=company.id,
90
+ message=message,
91
+ user_identifier=user_identifier,
92
+ rating=rating
93
+ )
94
+ saved_feedback = self.profile_repo.save_feedback(new_feedback_obj)
95
+ if not saved_feedback:
96
+ logging.error(f"No se pudo guardar el feedback para el usuario {user_identifier} en la empresa {company_short_name}")
97
+ return {'error': 'No se pudo guardar el feedback'}
98
+
99
+ return {'message': 'Feedback guardado correctamente'}
100
+
101
+ except Exception as e:
102
+ logging.exception(f"Error crítico en el servicio de feedback: {e}")
103
+ return {'error': str(e)}
@@ -0,0 +1,54 @@
1
+ document.addEventListener('DOMContentLoaded', function() {
2
+ const reloadButton = document.getElementById('force-reload-button');
3
+ if (!reloadButton) return;
4
+
5
+ const originalIconClass = 'bi bi-arrow-clockwise';
6
+ const spinnerIconClass = 'spinner-border spinner-border-sm';
7
+
8
+ // Configuración de Toastr para que aparezca abajo a la derecha
9
+ toastr.options = { "positionClass": "toast-bottom-right", "preventDuplicates": true };
10
+
11
+ reloadButton.addEventListener('click', async function(event) {
12
+ event.preventDefault();
13
+
14
+ if (reloadButton.disabled) return; // Prevenir doble clic
15
+
16
+ // 1. Deshabilitar y mostrar spinner
17
+ reloadButton.disabled = true;
18
+ const icon = reloadButton.querySelector('i');
19
+ icon.className = spinnerIconClass;
20
+ toastr.info('Iniciando recarga de contexto en segundo plano...');
21
+
22
+ try {
23
+ // 2. Definir los parámetros para callToolkit
24
+ const apiPath = '/api/init-context';
25
+ const payload = { 'user_identifier': window.user_identifier };
26
+
27
+ // 3. Hacer la llamada usando callToolkit
28
+ const data = await callToolkit(apiPath, payload, 'POST');
29
+
30
+ // 4. Procesar la respuesta
31
+ // callToolkit devuelve null si hubo un error que ya mostró en el chat.
32
+ if (data) {
33
+ if (data.status === 'OK') {
34
+ toastr.success(data.message || 'Contexto recargado exitosamente.');
35
+ } else {
36
+ // El servidor respondió 200 OK pero con un mensaje de error en el cuerpo
37
+ toastr.error(data.error_message || 'Ocurrió un error desconocido durante la recarga.');
38
+ }
39
+ } else {
40
+ // Si data es null, callToolkit ya manejó el error (mostrando un mensaje en el chat).
41
+ // Añadimos un toast para notificar al usuario que algo falló.
42
+ toastr.error('Falló la recarga del contexto. Revisa el chat para más detalles.');
43
+ }
44
+ } catch (error) {
45
+ // Este bloque se ejecutará para errores no controlados por callToolkit (como AbortError)
46
+ console.error('Error durante la recarga del contexto:', error);
47
+ toastr.error(error.message || 'Error de red al intentar recargar.');
48
+ } finally {
49
+ // 5. Restaurar el botón en cualquier caso
50
+ reloadButton.disabled = false;
51
+ icon.className = originalIconClass;
52
+ }
53
+ });
54
+ });
@@ -101,12 +101,10 @@ const sendFeedback = async function(message) {
101
101
  "user_identifier": window.user_identifier,
102
102
  "message": message,
103
103
  "rating": activeStars,
104
- "space": "spaces/AAQAupQldd4", // Este valor podría necesitar ser dinámico
105
- "type": "MESSAGE_TRIGGER"
106
104
  };
107
105
  try {
108
106
  // Asumiendo que callLLMAPI está definido globalmente en otro archivo (ej. chat_main.js)
109
- const responseData = await callToolkit('/feedback', data, "POST");
107
+ const responseData = await callToolkit('/api/feedback', data, "POST");
110
108
  return responseData;
111
109
  } catch (error) {
112
110
  console.error("Error al enviar feedback:", error);
@@ -53,8 +53,6 @@ class InitContextApiView(MethodView):
53
53
  user_identifier=user_identifier
54
54
  )
55
55
 
56
- # logging.info(f"Context for {company_short_name}/{user_identifier} rebuilt successfully.")
57
-
58
56
  # 3. Respond with JSON, as this is an API endpoint.
59
57
  return jsonify({'status': 'OK', 'message': 'El context se ha recargado con éxito.'}), 200
60
58
 
@@ -37,14 +37,6 @@ class UserFeedbackApiView(MethodView):
37
37
  if not message:
38
38
  return jsonify({"error_message": "Falta el mensaje de feedback"}), 400
39
39
 
40
- space = data.get("space")
41
- if not space:
42
- return jsonify({"error_message": "Falta el espacio de Google Chat"}), 400
43
-
44
- type = data.get("type")
45
- if not type:
46
- return jsonify({"error_message": "Falta el tipo de feedback"}), 400
47
-
48
40
  rating = data.get("rating")
49
41
  if not rating:
50
42
  return jsonify({"error_message": "Falta la calificación"}), 400
@@ -54,8 +46,6 @@ class UserFeedbackApiView(MethodView):
54
46
  company_short_name=company_short_name,
55
47
  message=message,
56
48
  user_identifier=user_identifier,
57
- space=space,
58
- type=type,
59
49
  rating=rating
60
50
  )
61
51
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.59.0
3
+ Version: 0.59.2
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -1,64 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- from iatoolkit.repositories.models import UserFeedback
7
- from injector import inject
8
- from iatoolkit.repositories.profile_repo import ProfileRepo
9
- from iatoolkit.infra.google_chat_app import GoogleChatApp
10
- import logging
11
-
12
-
13
- class UserFeedbackService:
14
- @inject
15
- def __init__(self, profile_repo: ProfileRepo, google_chat_app: GoogleChatApp):
16
- self.profile_repo = profile_repo
17
- self.google_chat_app = google_chat_app
18
-
19
- def new_feedback(self,
20
- company_short_name: str,
21
- message: str,
22
- user_identifier: str,
23
- space: str = None,
24
- type: str = None,
25
- rating: int = None) -> dict:
26
- try:
27
- # validate company
28
- company = self.profile_repo.get_company_by_short_name(company_short_name)
29
- if not company:
30
- return {'error': f'No existe la empresa: {company_short_name}'}
31
-
32
- # send notification to Google Chat
33
- chat_message = f"*Nuevo feedback de {company_short_name}*:\n*Usuario:* {user_identifier}\n*Mensaje:* {message}\n*Calificación:* {rating}"
34
-
35
- # TO DO: get the space and type from the input data
36
- chat_data = {
37
- "type": type,
38
- "space": {
39
- "name": space
40
- },
41
- "message": {
42
- "text": chat_message
43
- }
44
- }
45
-
46
- chat_result = self.google_chat_app.send_message(message_data=chat_data)
47
- if not chat_result.get('success'):
48
- logging.warning(f"Error al enviar notificación a Google Chat: {chat_result.get('message')}")
49
-
50
- # create the UserFeedback object
51
- new_feedback = UserFeedback(
52
- company_id=company.id,
53
- message=message,
54
- user_identifier=user_identifier,
55
- rating=rating
56
- )
57
- new_feedback = self.profile_repo.save_feedback(new_feedback)
58
- if not new_feedback:
59
- return {'error': 'No se pudo guardar el feedback'}
60
-
61
- return {'message': 'Feedback guardado correctamente'}
62
-
63
- except Exception as e:
64
- return {'error': str(e)}
@@ -1,61 +0,0 @@
1
- document.addEventListener('DOMContentLoaded', function() {
2
- const reloadButton = document.getElementById('force-reload-button');
3
- if (!reloadButton) return;
4
-
5
- const originalIconClass = 'bi bi-arrow-clockwise';
6
- const spinnerIconClass = 'spinner-border spinner-border-sm';
7
-
8
- // Configuración de Toastr para que aparezca abajo a la derecha
9
- toastr.options = { "positionClass": "toast-bottom-right", "preventDuplicates": true };
10
-
11
- reloadButton.addEventListener('click', function(event) {
12
- event.preventDefault();
13
-
14
- if (reloadButton.disabled) return; // Prevenir doble clic
15
-
16
- // 1. Deshabilitar y mostrar spinner
17
- reloadButton.disabled = true;
18
- const icon = reloadButton.querySelector('i');
19
- icon.className = spinnerIconClass;
20
- toastr.info('Iniciando recarga de contexto en segundo plano...');
21
-
22
- // 2. Construir la URL dinámicamente
23
- const company = window.companyShortName;
24
- const reloadUrl = `${window.iatoolkit_base_url}/${company}/api/init-context`;
25
- console.log('URL de recarga:', reloadUrl);
26
-
27
- // 3. Hacer la llamada AJAX con POST
28
- fetch(reloadUrl, {
29
- method: 'POST',
30
- headers: {
31
- 'Content-Type': 'application/json'
32
- },
33
- // Envía un cuerpo vacío o los datos necesarios
34
- body: JSON.stringify({'user_identifier': window.user_identifier})
35
- })
36
- .then(response => {
37
- if (!response.ok) {
38
- return response.json().then(err => {
39
- throw new Error(err.error_message || `Error del servidor: ${response.status}`);
40
- });
41
- }
42
- return response.json();
43
- })
44
- .then(data => {
45
- if (data.status === 'OK') {
46
- toastr.success(data.message || 'Contexto recargado exitosamente.');
47
- } else {
48
- toastr.error(data.error_message || 'Ocurrió un error desconocido.');
49
- }
50
- })
51
- .catch(error => {
52
- console.error('Error durante la recarga del contexto:', error);
53
- toastr.error(error.message || 'Error de red al intentar recargar.');
54
- })
55
- .finally(() => {
56
- // 4. Restaurar el botón
57
- reloadButton.disabled = false;
58
- icon.className = originalIconClass;
59
- });
60
- });
61
- });
File without changes
File without changes
File without changes