Files
ByteCenter/app/controllers/chatBotController.php
T
2026-08-04 19:20:18 -03:00

252 lines
6.2 KiB
PHP

<?php
// Helper encargado de detectar el módulo relacionado según el mensaje del usuario
require_once __DIR__ . '/../helpers/chatbot_helper.php';
// Helper encargado de conectarse a la API de Groq
require_once __DIR__ . '/../helpers/groq_helper.php';
class chatBotController {
public function responder() {
// Indicamos que la respuesta será JSON
header('Content-Type: application/json');
// Validar método HTTP
// Solo se permiten peticiones POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode([
'success' => false
]);
exit;
}
// Obtener mensaje enviado desde JS
// trim() elimina espacios innecesarios
$mensaje = trim($_POST['mensaje'] ?? '');
// Validar mensaje vacío
if (empty($mensaje)) {
echo json_encode([
'success' => false
]);
exit;
}
// Limitar longitud máxima del mensaje para evitar abuso o consumo excesivo de tokens
if (mb_strlen($mensaje) > 500) {
echo json_encode([
'success' => false,
'error' => 'La consulta es demasiado larga.'
]);
exit;
}
// Inicializar historial del chat en sesión si aún no existe
if (!isset($_SESSION['chat_historial'])) {
$_SESSION['chat_historial'] = [];
}
// Detectar automáticamente el módulo relacionado con la consulta
$modulo = detectarModulo($mensaje);
// Cache estática para evitar leer archivos en cada consulta
static $docsCache = [];
// Cargar documentación general solamente una vez
if (!isset($docsCache['general'])) {
$docsCache['general'] = file_get_contents(
__DIR__ . '/../docs/general.txt'
);
}
// Cargar documentación específica del módulo detectado
if (!isset($docsCache[$modulo])) {
$rutaModulo = __DIR__ . "/../docs/{$modulo}.txt";
// Verificar si existe el archivo
if (file_exists($rutaModulo)) {
$docsCache[$modulo] = file_get_contents($rutaModulo);
} else {
// Si no existe, guardar vacío
$docsCache[$modulo] = '';
}
}
// Unir documentación general + documentación específica del módulo
$contexto = $docsCache['general'] . "\n\n" . $docsCache[$modulo];
// Prompt del sistema
// Define comportamiento y restricciones de la IA
$systemPrompt = "
Sos el asistente interno del sistema ByteCenter.
Tu función es ayudar a operadores y administradores
utilizando únicamente la documentación proporcionada.
REGLAS IMPORTANTES:
- Respondé únicamente usando información presente en la documentación.
- No inventes funcionalidades, botones, módulos,
pantallas, acciones, permisos ni procesos.
- No asumas comportamientos típicos de otros sistemas.
- Si el usuario consulta sobre una funcionalidad del sistema que no aparece documentada,
indicá brevemente que no encontraste información específica sobre esa funcionalidad.
- Nunca completes información faltante usando suposiciones.
- Cuando exista un procedimiento documentado,
explicalo paso a paso.
- Utilizá exactamente los nombres de botones,
módulos y acciones documentadas.
- La documentación puede contener símbolos como:
#, ##, ###, *, **
- Esos símbolos son únicamente separadores internos
de títulos y subtítulos.
- Nunca escribas esos símbolos en la respuesta.
- Respondé siempre en texto plano.
- No uses markdown.
- No uses encabezados markdown.
- No uses listas markdown.
- Para enumerar pasos, utilizá solamente:
1.
2.
3.
- Mantené respuestas claras, naturales y breves.
EJEMPLOS DE RESPUESTAS INCORRECTAS:
- 'Exportar clientes'
- 'Venta rápida'
- 'Dashboard'
- 'Panel avanzado'
- 'Modo express'
- 'CSV'
- 'Métricas automáticas'
DOCUMENTACIÓN:
$contexto
";
// Recuperar últimos mensajes para mantener contexto conversacional
$historial = array_slice(
$_SESSION['chat_historial'],
-10
);
// Array final enviado a la IA
$messages = [];
// Primer mensaje: prompt del sistema
$messages[] = [
'role' => 'system',
'content' => $systemPrompt
];
// Agregar historial previo
foreach ($historial as $msg) {
$messages[] = $msg;
}
// Agregar mensaje actual del usuario
$messages[] = [
'role' => 'user',
'content' => $mensaje
];
// Consultar API
$resultado = consultarChatbot($messages);
// Validar errores
if (!$resultado['success']) {
echo json_encode([
'success' => false,
'error' => $resultado['error']
]);
exit;
}
// Obtener contenido de respuesta
$respuesta = $resultado['content'];
// Guardar mensaje usuario
$_SESSION['chat_historial'][] = [
'role' => 'user',
'content' => $mensaje
];
// Guardar respuesta IA
$_SESSION['chat_historial'][] = [
'role' => 'assistant',
'content' => $respuesta
];
// Limitar tamaño del historial para evitar exceso de tokens
$_SESSION['chat_historial'] = array_slice(
$_SESSION['chat_historial'],
-20
);
// Respuesta final al frontend (JSON)
echo json_encode([
'success' => true,
'respuesta' => $respuesta
]);
exit;
}
}