iatoolkit 0.11.0__py3-none-any.whl → 0.71.2__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 (122) hide show
  1. iatoolkit/__init__.py +2 -6
  2. iatoolkit/base_company.py +9 -29
  3. iatoolkit/cli_commands.py +1 -1
  4. iatoolkit/common/routes.py +96 -52
  5. iatoolkit/common/session_manager.py +2 -1
  6. iatoolkit/common/util.py +17 -27
  7. iatoolkit/company_registry.py +1 -2
  8. iatoolkit/iatoolkit.py +97 -53
  9. iatoolkit/infra/llm_client.py +15 -20
  10. iatoolkit/infra/llm_proxy.py +38 -10
  11. iatoolkit/infra/openai_adapter.py +1 -1
  12. iatoolkit/infra/redis_session_manager.py +48 -2
  13. iatoolkit/locales/en.yaml +167 -0
  14. iatoolkit/locales/es.yaml +163 -0
  15. iatoolkit/repositories/database_manager.py +23 -3
  16. iatoolkit/repositories/document_repo.py +1 -1
  17. iatoolkit/repositories/models.py +35 -10
  18. iatoolkit/repositories/profile_repo.py +3 -2
  19. iatoolkit/repositories/vs_repo.py +26 -20
  20. iatoolkit/services/auth_service.py +193 -0
  21. iatoolkit/services/branding_service.py +70 -25
  22. iatoolkit/services/company_context_service.py +155 -0
  23. iatoolkit/services/configuration_service.py +133 -0
  24. iatoolkit/services/dispatcher_service.py +80 -105
  25. iatoolkit/services/document_service.py +5 -2
  26. iatoolkit/services/embedding_service.py +146 -0
  27. iatoolkit/services/excel_service.py +30 -26
  28. iatoolkit/services/file_processor_service.py +4 -12
  29. iatoolkit/services/history_service.py +7 -16
  30. iatoolkit/services/i18n_service.py +104 -0
  31. iatoolkit/services/jwt_service.py +18 -29
  32. iatoolkit/services/language_service.py +83 -0
  33. iatoolkit/services/load_documents_service.py +100 -113
  34. iatoolkit/services/mail_service.py +9 -4
  35. iatoolkit/services/profile_service.py +152 -76
  36. iatoolkit/services/prompt_manager_service.py +20 -16
  37. iatoolkit/services/query_service.py +208 -96
  38. iatoolkit/services/search_service.py +11 -4
  39. iatoolkit/services/sql_service.py +57 -25
  40. iatoolkit/services/tasks_service.py +1 -1
  41. iatoolkit/services/user_feedback_service.py +72 -34
  42. iatoolkit/services/user_session_context_service.py +112 -54
  43. iatoolkit/static/images/fernando.jpeg +0 -0
  44. iatoolkit/static/js/chat_feedback_button.js +80 -0
  45. iatoolkit/static/js/chat_help_content.js +124 -0
  46. iatoolkit/static/js/chat_history_button.js +110 -0
  47. iatoolkit/static/js/chat_logout_button.js +36 -0
  48. iatoolkit/static/js/chat_main.js +135 -222
  49. iatoolkit/static/js/chat_onboarding_button.js +103 -0
  50. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  51. iatoolkit/static/js/chat_reload_button.js +35 -0
  52. iatoolkit/static/styles/chat_iatoolkit.css +289 -210
  53. iatoolkit/static/styles/chat_modal.css +63 -77
  54. iatoolkit/static/styles/chat_public.css +107 -0
  55. iatoolkit/static/styles/landing_page.css +182 -0
  56. iatoolkit/static/styles/onboarding.css +176 -0
  57. iatoolkit/system_prompts/query_main.prompt +5 -22
  58. iatoolkit/templates/_company_header.html +20 -0
  59. iatoolkit/templates/_login_widget.html +42 -0
  60. iatoolkit/templates/base.html +40 -20
  61. iatoolkit/templates/change_password.html +57 -36
  62. iatoolkit/templates/chat.html +180 -86
  63. iatoolkit/templates/chat_modals.html +138 -68
  64. iatoolkit/templates/error.html +44 -8
  65. iatoolkit/templates/forgot_password.html +40 -23
  66. iatoolkit/templates/index.html +145 -0
  67. iatoolkit/templates/login_simulation.html +45 -0
  68. iatoolkit/templates/onboarding_shell.html +107 -0
  69. iatoolkit/templates/signup.html +63 -65
  70. iatoolkit/views/base_login_view.py +91 -0
  71. iatoolkit/views/change_password_view.py +56 -31
  72. iatoolkit/views/embedding_api_view.py +65 -0
  73. iatoolkit/views/external_login_view.py +61 -28
  74. iatoolkit/views/{file_store_view.py → file_store_api_view.py} +10 -3
  75. iatoolkit/views/forgot_password_view.py +27 -21
  76. iatoolkit/views/help_content_api_view.py +54 -0
  77. iatoolkit/views/history_api_view.py +56 -0
  78. iatoolkit/views/home_view.py +50 -23
  79. iatoolkit/views/index_view.py +14 -0
  80. iatoolkit/views/init_context_api_view.py +74 -0
  81. iatoolkit/views/llmquery_api_view.py +58 -0
  82. iatoolkit/views/login_simulation_view.py +93 -0
  83. iatoolkit/views/login_view.py +130 -37
  84. iatoolkit/views/logout_api_view.py +49 -0
  85. iatoolkit/views/profile_api_view.py +46 -0
  86. iatoolkit/views/{prompt_view.py → prompt_api_view.py} +10 -10
  87. iatoolkit/views/signup_view.py +41 -36
  88. iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
  89. iatoolkit/views/tasks_review_api_view.py +55 -0
  90. iatoolkit/views/user_feedback_api_view.py +60 -0
  91. iatoolkit/views/verify_user_view.py +34 -29
  92. {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/METADATA +41 -23
  93. iatoolkit-0.71.2.dist-info/RECORD +122 -0
  94. iatoolkit-0.71.2.dist-info/licenses/LICENSE +21 -0
  95. iatoolkit/common/auth.py +0 -200
  96. iatoolkit/static/images/arrow_up.png +0 -0
  97. iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  98. iatoolkit/static/images/logo_clinica.png +0 -0
  99. iatoolkit/static/images/logo_iatoolkit.png +0 -0
  100. iatoolkit/static/images/logo_maxxa.png +0 -0
  101. iatoolkit/static/images/logo_notaria.png +0 -0
  102. iatoolkit/static/images/logo_tarjeta.png +0 -0
  103. iatoolkit/static/images/logo_umayor.png +0 -0
  104. iatoolkit/static/images/upload.png +0 -0
  105. iatoolkit/static/js/chat_feedback.js +0 -115
  106. iatoolkit/static/js/chat_history.js +0 -117
  107. iatoolkit/static/styles/chat_info.css +0 -53
  108. iatoolkit/templates/header.html +0 -31
  109. iatoolkit/templates/home.html +0 -199
  110. iatoolkit/templates/login.html +0 -43
  111. iatoolkit/templates/test.html +0 -9
  112. iatoolkit/views/chat_token_request_view.py +0 -98
  113. iatoolkit/views/chat_view.py +0 -58
  114. iatoolkit/views/download_file_view.py +0 -58
  115. iatoolkit/views/external_chat_login_view.py +0 -95
  116. iatoolkit/views/history_view.py +0 -57
  117. iatoolkit/views/llmquery_view.py +0 -65
  118. iatoolkit/views/tasks_review_view.py +0 -83
  119. iatoolkit/views/user_feedback_view.py +0 -74
  120. iatoolkit-0.11.0.dist-info/RECORD +0 -110
  121. {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/WHEEL +0 -0
  122. {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/top_level.txt +0 -0
@@ -1,37 +1,69 @@
1
- <!-- Modal para mostrar archivos cargados -->
2
- <div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
3
- <div class="modal-dialog">
4
- <div class="modal-content">
5
- <div class="modal-header branded">
6
- <h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
7
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
8
- </div>
9
- <div class="modal-body">
10
- <ul id="uploaded-files-list" class="list-group">
11
- <!-- Los nombres de los archivos se agregarán aquí por JS -->
12
- </ul>
13
- </div>
14
- <div class="modal-footer">
15
- <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
16
- </div>
1
+
2
+
3
+ <!-- Modal para historial -->
4
+ <div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
5
+ <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
6
+ <div class="modal-content">
7
+ <div class="modal-header branded">
8
+ <h5 class="modal-title" id="historyModalLabel">
9
+ <i class="bi bi-clock-history me-3"></i>
10
+ {{ t('ui.modals.history_title') }}
11
+ </h5>
12
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
13
+ </div>
14
+ <div class="modal-body">
15
+ <div id="history-loading" style="display: none;" class="text-center p-4">
16
+ <div class="spinner-border text-primary" role="status">
17
+ <span class="visually-hidden">Cargando...</span>
18
+ </div>
19
+ <p class="mt-2">{{ t('ui.modals.loading_history') }}</p>
20
+ </div>
21
+
22
+ <div id="history-content" style="display: none;">
23
+ <div class="table-responsive">
24
+ <table class="table table-striped table-hover">
25
+ <thead class="thead-branded">
26
+ <tr>
27
+ <th scope="col">{{ t('ui.modals.history_table_date') }}</th>
28
+ <th scope="col">{{ t('ui.modals.history_table_query') }}</th>
29
+ <th scope="col" class="col-icon"></th>
30
+ </tr>
31
+ </thead>
32
+ <tbody id="history-table-body">
33
+ <!-- Los datos se cargarán aquí -->
34
+ </tbody>
35
+ </table>
36
+ </div>
37
+ <div id="no-history-message" style="display: none;">
38
+ {{ t('js_messages.no_history_found') }}
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <div class="modal-footer">
43
+ <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
44
+ <i class="bi bi-x-circle me-1"></i>
45
+ {{ t('ui.buttons.cancel') }}
46
+ </button>
47
+ </div>
48
+ </div>
17
49
  </div>
18
- </div>
19
50
  </div>
20
51
 
52
+
21
53
  <!-- Modal para feedback -->
22
54
  <div class="modal fade" id="feedbackModal" tabindex="-1" aria-labelledby="feedbackModalLabel" aria-hidden="true">
23
55
  <div class="modal-dialog modal-dialog-centered">
24
56
  <div class="modal-content">
25
57
  <div class="modal-header branded">
26
58
  <h5 class="modal-title" id="feedbackModalLabel">
27
- <i class="bi bi-chat-dots me-3"></i>Tu Opinión es Importante
59
+ <i class="bi bi-chat-dots me-3"></i>
60
+ {{ t('ui.modals.feedback_title') }}
28
61
  </h5>
29
62
  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
30
63
  </div>
31
64
  <div class="modal-body">
32
- <p class="text-center mb-2"><strong>¿Qué tan útil fue la respuesta del asistente?</strong></p>
65
+ <p class="text-center mb-2"><strong>{{ t('ui.modals.feedback_prompt') }}</strong></p>
33
66
 
34
- <!-- ▼▼▼ ESTE ES EL BLOQUE DE HTML QUE FALTABA ▼▼▼ -->
35
67
  <div class="rating-stars mb-4">
36
68
  <span class="star" data-rating="1" onclick="gfg(1)"></span>
37
69
  <span class="star" data-rating="2" onclick="gfg(2)"></span>
@@ -39,77 +71,115 @@
39
71
  <span class="star" data-rating="4" onclick="gfg(4)"></span>
40
72
  <span class="star" data-rating="5" onclick="gfg(5)"></span>
41
73
  </div>
42
- <!-- ▲▲▲ FIN DEL BLOQUE DE HTML QUE FALTABA ▲▲▲ -->
43
74
 
44
75
  <div class="form-group">
45
- <label for="feedback-text" class="form-label text-muted">Tu comentario nos ayuda a mejorar:</label>
76
+ <label for="feedback-text" class="form-label text-muted">
77
+ {{ t('ui.modals.feedback_comment_label') }}</label>
46
78
  <textarea
47
79
  class="form-control feedback-text"
48
80
  id="feedback-text"
49
81
  rows="4"
50
- placeholder="Escribe aquí tu opinión, sugerencias o comentarios..."
82
+ placeholder="{{ t('ui.modals.feedback_comment_placeholder') }}"
51
83
  style="resize: vertical; min-height: 100px;"></textarea>
52
84
  </div>
53
85
  </div>
54
86
  <div class="modal-footer">
55
87
  <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
56
- <i class="bi bi-x-circle me-1"></i>Cancelar
88
+ <i class="bi bi-x-circle me-1"></i>
89
+ {{ t('ui.buttons.cancel') }}
57
90
  </button>
58
91
  <button type="button" class="btn btn-branded-primary" id="submit-feedback">
59
- <i class="bi bi-send me-1"></i>Enviar
92
+ <i class="bi bi-send me-1"></i>
93
+ {{ t('ui.buttons.send') }}
60
94
  </button>
61
95
  </div>
62
96
  </div>
63
97
  </div>
64
98
  </div>
65
99
 
66
- <!-- Modal para historial -->
67
- <div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
68
- <div class="modal-dialog modal-lg modal-dialog-centered">
100
+
101
+ <!-- Modal de Onboarding -->
102
+ <div class="modal fade" id="onboardingModal" tabindex="-1" aria-labelledby="onboardingModalLabel" aria-hidden="true">
103
+ <div class="modal-dialog modal-dialog-centered">
104
+ <div class="modal-content" style="border-radius:12px;">
105
+ <div class="modal-header">
106
+ <h5 class="modal-title w-100 text-center" id="onboardingModalLabel" style="color: var(--brand-primary-color, #FF5100);">
107
+ {{ branding.name }}
108
+ </h5>
109
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Cerrar"></button>
110
+ </div>
111
+
112
+ <div class="modal-body ob-root">
113
+ <div id="ob-card" class="ob-card">
114
+ <div id="ob-icon" class="ob-icon"><i class="bi bi-lightbulb"></i></div>
115
+ <h6 id="ob-title" class="ob-title"></h6>
116
+ <div id="ob-text" class="ob-text"></div>
117
+ <div id="ob-example" class="ob-example"></div>
118
+ <div class="ob-nav">
119
+ <button id="ob-prev" class="ob-btn" aria-label="Anterior"><i class="bi bi-chevron-left"></i></button>
120
+ <div id="ob-dots" class="ob-dots"></div>
121
+ <button id="ob-next" class="ob-btn" aria-label="Siguiente"><i class="bi bi-chevron-right"></i></button>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+ <div class="modal-footer">
127
+ <button id="ob-close" type="button" class="btn btn-branded-primary" data-bs-dismiss="modal">
128
+ {{ t('ui.buttons.cancel') }}
129
+ </button>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </div>
134
+
135
+ <!-- Modal de Guía de Uso / Ayuda -->
136
+ <div class="modal fade" id="helpModal" tabindex="-1" aria-labelledby="helpModalLabel" aria-hidden="true">
137
+ <div class="modal-dialog modal-lg modal-dialog-scrollable">
69
138
  <div class="modal-content">
70
- <div class="modal-header branded">
71
- <h5 class="modal-title" id="historyModalLabel">
72
- <i class="bi bi-clock-history me-3"></i>Historial de Consultas
73
- </h5>
74
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
75
- </div>
76
- <div class="modal-body">
77
- <div id="history-loading" style="display: none;" class="text-center p-4">
78
- <div class="spinner-border text-primary" role="status">
79
- <span class="visually-hidden">Cargando...</span>
80
- </div>
81
- <p class="mt-2">Cargando historial...</p>
82
- </div>
83
- <div id="history-error" style="display: none;" class="alert alert-danger">
84
- <!-- Los errores se mostrarán aquí -->
85
- </div>
86
- <div id="history-content" style="display: none;">
87
- <!-- Texto explicativo -->
88
- <div class="alert alert-branded-info mb-3" role="alert">
89
- <i class="bi bi-info-circle me-2"></i>
90
- <strong>Tip:</strong> Haz clic en cualquier pregunta del historial para copiarla automáticamente al área de texto.
91
- </div>
92
- <div class="table-responsive">
93
- <table class="table table-striped table-hover">
94
- <thead class="thead-branded">
95
- <tr>
96
- <th scope="col">#</th>
97
- <th scope="col">Fecha</th>
98
- <th scope="col">Consulta</th>
99
- </tr>
100
- </thead>
101
- <tbody id="history-table-body">
102
- <!-- Los datos se cargarán aquí -->
103
- </tbody>
104
- </table>
105
- </div>
139
+ <div class="modal-header branded">
140
+ <h5 class="modal-title" id="helpModalLabel">
141
+ <i class="bi bi-info-circle me-2"></i>
142
+ {{ t('ui.modals.help_title') }}
143
+ </h5>
144
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
145
+ </div>
146
+ <div class="modal-body">
147
+ <!-- El acordeón con el contenido de ayuda se inyectará aquí dinámicamente -->
148
+ <div id="help-spinner" class="text-center p-5" style="display: none;">
149
+ <div class="spinner-border text-primary" role="status">
150
+ <span class="visually-hidden">Cargando...</span>
106
151
  </div>
107
152
  </div>
108
- <div class="modal-footer">
109
- <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
110
- <i class="bi bi-x-circle me-1"></i>Cerrar
111
- </button>
153
+ <div class="accordion" id="help-accordion-container">
154
+ <!-- Contenido generado por JS -->
112
155
  </div>
156
+ </div>
157
+ <div class="modal-footer">
158
+ <button type="button" class="btn btn-branded-secondary"
159
+ data-bs-dismiss="modal">
160
+ {{ t('ui.buttons.cancel') }}
161
+ </button>
162
+ </div>
113
163
  </div>
164
+ </div>
114
165
  </div>
166
+
167
+ <!-- Modal para mostrar archivos cargados -->
168
+ <div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
169
+ <div class="modal-dialog">
170
+ <div class="modal-content">
171
+ <div class="modal-header branded">
172
+ <h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
173
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
174
+ </div>
175
+ <div class="modal-body">
176
+ <ul id="uploaded-files-list" class="list-group">
177
+ <!-- Los nombres de los archivos se agregarán aquí por JS -->
178
+ </ul>
179
+ </div>
180
+ <div class="modal-footer">
181
+ <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
182
+ </div>
183
+ </div>
184
+ </div>
115
185
  </div>
@@ -1,15 +1,51 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}Error - IAToolkit{% endblock %}
3
+ {% block title %}Error{% endblock %}
4
+
5
+ {% block styles %}
6
+ {# Carga las variables de CSS personalizadas de la empresa #}
7
+ {% if branding %}
8
+ <style>
9
+ {{ branding.css_variables | safe }}
10
+ </style>
11
+ {% endif %}
12
+ {# Enlace a los iconos de Bootstrap para el icono de error #}
13
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
14
+ {% endblock %}
4
15
 
5
16
  {% block content %}
6
- <div class="container vh-100 d-flex justify-content-center align-items-center">
7
- <div class="text-center col-11 col-md-8 col-lg-6 border rounded p-4 shadow-sm bg-light">
8
- <h1 class="text-danger fw-bold">¡Ups! Ha ocurrido un error</h1>
9
- <p class="mt-3 text-muted">
10
- {{ message }}
11
- </p>
12
- <a href="{{ url_for('home') }}" class="btn btn-primary mt-4">Volver al Inicio</a>
17
+ <div class="container mt-4">
18
+
19
+ {% include '_company_header.html' %}
20
+
21
+ {# Contenedor principal para el mensaje de error #}
22
+ <div class="container mt-5">
23
+ <div class="row justify-content-center">
24
+ <div class="col-md-8 col-lg-6">
25
+
26
+ {# Usamos una tarjeta para enmarcar el contenido del error #}
27
+ <div class="card shadow-sm text-center border-danger">
28
+ <div class="card-body p-4 p-md-5">
29
+
30
+ {# Icono de error grande y visible #}
31
+ <i class="bi bi-exclamation-triangle-fill text-danger" style="font-size: 4rem;"></i>
32
+
33
+ <h4 class="card-title mt-4">Ha Ocurrido un Error</h4>
34
+ <h5 class="card-title mt-4">Empresa: {{ company_short_name }} </h5>
35
+
36
+ {# El mensaje de error dinámico que se pasa desde la vista #}
37
+ <p class="text-muted mt-3 mb-4">
38
+ {{ message | default('Lo sentimos, algo salió mal. Por favor, inténtalo de nuevo más tarde.') }}
39
+ </p>
40
+
41
+ <a href="javascript:history.back()"
42
+ class="btn btn-branded-primary px-4">
43
+ Volver
44
+ </a>
45
+ </div>
46
+ </div>
47
+ </div>
13
48
  </div>
14
49
  </div>
50
+ </div>
15
51
  {% endblock %}
@@ -1,33 +1,50 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}Recuperar Contraseña{% endblock %}
3
+ {% block title %}{{ t('ui.forgot_password.title') }} - {{ branding.name }}{% endblock %}
4
+
5
+ {% block styles %}
6
+ <style>{{ branding.css_variables | safe }}</style>
7
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_public.css') }}">
8
+ {% endblock %}
4
9
 
5
10
  {% block content %}
6
- <div class="container d-flex justify-content-center align-items-center vh-100">
7
- <div class="col-11 col-md-6 col-lg-4 border rounded p-3 shadow-sm">
8
- <h4 class="text-muted fw-semibold text-start mb-3">Recuperar Contraseña</h4>
9
-
10
- <form action="{{ url_for('forgot_password', company_short_name=company_short_name) }}" method="post">
11
- <div class="mb-3">
12
- <label for="email" class="form-label text-muted">Correo Electrónico</label>
13
- <input type="email" id="email" name="email"
14
- class="form-control text-muted"
15
- required value="{{ form_data.email if form_data else '' }}"
16
- style="text-align: justify;">
17
- </div>
11
+ <div class="container mt-4">
12
+
13
+ {% include '_company_header.html' %}
18
14
 
19
- <button type="submit" class="btn btn-primary w-100">Enviar Contraseña</button>
15
+ <!-- 3. Sección contenedora para centrar el contenido -->
16
+ <section class="hero-section">
17
+ <div class="container">
18
+ <div class="row justify-content-center">
19
+ <div class="col-lg-6 col-md-8">
20
+ <div class="branded-form-container">
21
+ <h4 class="branded-form-title">{{ t('ui.forgot_password.title') }}</h4>
20
22
 
21
- <!-- Mensaje descriptivo -->
22
- <p class="text-muted text-start mt-3" style="text-align: justify;">
23
- Recibirás un correo con una nueva contraseña temporal junto con un código de seguridad.
24
- Usa este código para cambiar tu contraseña de forma segura y mantener tu cuenta protegida.
25
- </p>
23
+ <p class="text-muted text-center mb-4">
24
+ {{ t('ui.forgot_password.subtitle') }}
25
+ </p>
26
26
 
27
- <div class="text-center mt-3">
28
- <a href="{{ url_for('login', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">Volver al Login</a>
27
+ <form action="{{ url_for('forgot_password', company_short_name=company_short_name) }}" method="post">
28
+ <div class="mb-3">
29
+ <label for="email" class="form-label text-secondary">{{ t('ui.signup.email_label') }}</label>
30
+ <input type="email" id="email" name="email"
31
+ class="form-control"
32
+ required value="{{ form_data.email if form_data else '' }}">
33
+ </div>
34
+
35
+ <button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">{{ t('ui.forgot_password.submit_button') }}</button>
36
+ </form>
37
+
38
+ <div class="text-center mt-4 pt-3" style="border-top: 1px solid #e0e0e0;">
39
+ <a href="{{ url_for('home', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">
40
+ <i class="bi bi-arrow-left me-1"></i>{{ t('ui.forgot_password.back_to_login') }}
41
+ </a>
42
+ </div>
43
+ </div>
44
+ </div>
29
45
  </div>
30
- </form>
31
- </div>
46
+ </div>
47
+ </section>
32
48
  </div>
49
+
33
50
  {% endblock %}
@@ -0,0 +1,145 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}IAToolkit - Framework de IA{% endblock %}
4
+
5
+ {% block styles %}
6
+ {# Enlazamos la hoja de estilos del website y los iconos de Bootstrap #}
7
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/landing_page.css') }}">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
9
+ {% endblock %}
10
+
11
+
12
+ {% block content %}
13
+ <div class="container mt-4">
14
+
15
+ <!-- 1. Encabezado con una clase 100% propia y única -->
16
+ <header class="website-header container">
17
+ <span class="website-brand">IAToolkit</span>
18
+ </header>
19
+
20
+ <!-- 2. Sección Principal (Hero) -->
21
+ <section class="hero-section">
22
+ <div class="container">
23
+ <div class="row align-items-center g-5 py-5">
24
+ <div class="col-lg-7">
25
+ <h1 class="hero-title gradient-text">Framework de IA Open Source</h1>
26
+ <ul class="hero-bullets mt-4">
27
+ <li><i class="bi bi-hdd-stack"></i>Integra tus bases de datos SQL y documentos para dar contexto real a tus asistentes.</li>
28
+ <li><i class="bi bi-code-slash"></i>Crea un repositorio de prompts validados por tu equipo para estandarizar y acelerar las tareas de IA.</li>
29
+ <li><i class="bi bi-shield-lock"></i> Monta la plataforma en tu propia infraestructura con control total sobre el LLM, garantizando la privacidad de los datos.</li> </ul>
30
+ </div>
31
+ <div class="col-lg-5">
32
+ <div class="border rounded-3 p-4 p-md-5 shadow-sm bg-light">
33
+ <h3 class="fw-bold text-center mb-3">Prueba la Plataforma</h3>
34
+ <p class="text-muted mb-4">
35
+ Descubre nuestra demo interactiva, configurada con datos de una empresa de muestra. Explora las funcionalidades de la plataforma en un entorno práctico.<br>
36
+ </p>
37
+ <div class="d-grid">
38
+ {# Este botón usa la clase .btn-primary, que es estilizada por .hero-section .btn-primary en el CSS #}
39
+ <a href="{{ url_for('home', company_short_name='sample_company') }}"
40
+ target="_blank"
41
+ rel="noopener noreferrer"
42
+ class="btn btn-primary btn-lg fw-bold">
43
+ Acceder
44
+ </a>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </section>
51
+
52
+ <!-- 3. Sección de Características -->
53
+ <section class="features-section">
54
+ <div class="container">
55
+ <div class="row g-4">
56
+ <div class="col-lg-4 d-flex align-items-stretch">
57
+ <div class="opensource-box">
58
+ <div>
59
+ <div class="opensource-icon"><i class="bi bi-github"></i></div>
60
+ <h3>100% Open Source</h3>
61
+ <p>Construido en Python, IAToolkit te da control total. Audita el código, adáptalo y contribuye a una comunidad en crecimiento.</p>
62
+ </div>
63
+ <a href="https://github.com/flibedinsky/iatoolkit" target="_blank" class="btn btn-light mt-auto">
64
+ <i class="bi bi-github me-2"></i>Ir a GitHub
65
+ {% if iatoolkit_version %}
66
+ <span class="badge bg-dark ms-2">{{ iatoolkit_version }}</span>
67
+ {% endif %}
68
+ </a>
69
+ </div>
70
+ </div>
71
+ <div class="col-lg-4 d-flex align-items-stretch">
72
+ <div class="feature-item">
73
+ <div class="feature-icon"><i class="bi bi-hdd-stack"></i></div>
74
+ <h3>Conecta tus Datos</h3>
75
+ <p>Integra tus bases de datos SQL, documentos (PDFs, TXT) y otros sistemas para que el asistente tenga un contexto real de tu negocio.</p>
76
+ </div>
77
+ </div>
78
+ <div class="col-lg-4 d-flex align-items-stretch">
79
+ <div class="feature-item">
80
+ <div class="feature-icon"><i class="bi bi-gem"></i></div>
81
+ <h3>Multi-LLM</h3>
82
+ <p>No te ates a un solo proveedor. IAToolkit está diseñado para funcionar con diferentes modelos, incluyendo Gemini y OpenAI (GPT).</p>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ <div class="row g-4 mt-4">
87
+ <div class="col-lg-4 d-flex align-items-stretch">
88
+ <div class="feature-item">
89
+ <div class="feature-icon"><i class="bi bi-magic"></i></div>
90
+ <h3>Prompt Manager</h3>
91
+ <p>Crea, gestiona y comparte una librería de prompts personalizados para tu empresa, optimizando las tareas repetitivas.</p>
92
+ </div>
93
+ </div>
94
+ <div class="col-lg-4 d-flex align-items-stretch">
95
+ <div class="feature-item">
96
+ <div class="feature-icon"><i class="bi bi-palette"></i></div>
97
+ <h3>100% Personalizable</h3>
98
+ <p>Adapta cada aspecto, desde la apariencia visual hasta las capacidades y herramientas del asistente, para que se alinee con la identidad de tu marca.</p>
99
+ </div>
100
+ </div>
101
+ <div class="col-lg-4 d-flex align-items-stretch">
102
+ <div class="feature-item">
103
+ <div class="feature-icon"><i class="bi bi-shield-lock"></i></div>
104
+ <h3>Privacidad Primero</h3>
105
+ <p>Despliega IAToolkit en tus propios servidores. Tus datos y consultas nunca son compartidos con terceros, garantizando la máxima confidencialidad.</p>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </section>
111
+
112
+ <!-- 3.5 Sobre el Autor -->
113
+ <section class="author-section py-5">
114
+ <div class="container">
115
+ <div class="author-card p-4">
116
+ <div class="row align-items-center g-4">
117
+ <div class="col-md-2 text-center">
118
+ <img src="{{ url_for('static', filename='images/fernando.jpeg') }}" alt="Foto de Fernando Libedinsky" class="img-fluid rounded-circle" style="max-width: 120px;">
119
+ </div>
120
+ <div class="col-md-10">
121
+ <div class="d-flex flex-wrap align-items-center mb-2">
122
+ <h5 class="mb-0 me-3">Sobre el autor</h5>
123
+ <a href="https://www.linkedin.com/in/fernandolibedinsky" target="_blank" rel="noopener" class="author-linkedin ms-auto">
124
+ <i class="bi bi-linkedin me-1"></i> LinkedIn
125
+ </a>
126
+ </div>
127
+ <p class="author-bio mb-0">
128
+ Soy <strong>Fernando Libedinsky</strong>, ingeniero de software y creador de <strong>IAToolkit</strong>.
129
+ <br>Tras una extensa trayectoria en el desarrollo de software, sigo movido por la misma curiosidad que me llevó a programar por primera vez: aprender, explorar y construir cosas nuevas.
130
+ <br>IAToolkit es la continuación de ese impulso, una plataforma creada para conectar rapidamente empresas con la IA.
131
+ </p>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </section>
137
+
138
+ <!-- 4. Footer -->
139
+ <footer class="landing-footer">
140
+ <div class="container">
141
+ &copy; 2024 IAToolkit - Proyecto Open Source
142
+ </div>
143
+ </footer>
144
+ </div>
145
+ {% endblock %}
@@ -0,0 +1,45 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Login Test - {{ branding.name }}{% endblock %}
4
+ {% block styles %}
5
+ <style>
6
+ {{ branding.css_variables | safe }}
7
+ </style>
8
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_public.css') }}">
9
+ {% endblock %}
10
+
11
+ {% block content %}
12
+ <div class="container mt-4">
13
+
14
+ {% include '_company_header.html' %}
15
+
16
+ <div class="container-fluid">
17
+ <div class="row flex-fill mt-5 justify-content-center">
18
+ <div class="col-12 col-lg-6">
19
+ <div class="branded-form-container">
20
+ <h4 class="branded-form-title">
21
+ Login Externo para {{ company_short_name }}
22
+ </h4>
23
+ <div class="text-center mb-4">
24
+ <p class="text-muted widget-intro-text">
25
+ Este formulario simula el inicio de una sesión externa. Al enviar, serás redirigido a la URL de login final.
26
+ </p>
27
+ </div>
28
+
29
+ <!-- Formulario HTML estándar que hace un POST a la misma URL -->
30
+ <form method="POST" action="">
31
+ <div class="mb-3">
32
+ <label for="external_user_id" class="form-label d-block">External user ID</label>
33
+ <input type="text" id="external_user_id" name="external_user_id" class="form-control" required>
34
+ </div>
35
+ <button type="submit" class="btn btn-branded-primary">
36
+ Redirigir a External Login
37
+ </button>
38
+ </form>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ {% endblock %}
45
+