252 lines
6.2 KiB
PHP
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;
|
|
}
|
|
} |