Carpeta controllers
This commit is contained in:
@@ -0,0 +1,252 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user