Files
ByteCenter/app/helpers/groq_helper.php
T
2026-08-04 19:21:38 -03:00

191 lines
3.3 KiB
PHP

<?php
/*
Función encargada de comunicarse con la API de Groq
Recibe:
- Un array con todos los mensajes de contexto: system, historial y mensaje actual del usuario
Devuelve:
- success -> true/false
- content -> respuesta del modelo
- error -> mensaje de error en caso de fallo
*/
function consultarChatbot($mensajes) {
/*
DATA
Arma el cuerpo JSON que será enviado a la API
model:
- Modelo de IA a utilizar
messages:
- Conversación completa
temperature:
- Nivel de creatividad
- Mientras mas bajo, más preciso y menos inventa
*/
$data = [
'model' => 'llama-3.1-8b-instant',
'messages' => $mensajes,
'temperature' => 0.2
];
/*
HEADERS HTTP
Content-Type:
- Indicamos que enviamos JSON
Authorization:
- Token Bearer con la API KEY
- Se obtiene desde el archivo .env cargado en $_ENV
*/
$headers = [
'Content-Type: application/json',
'Authorization: Bearer ' . $_ENV['GROQ_API_KEY']
];
/*
INICIALIZAR CURL
cURL permite realizar solicitudes HTTP desde PHP
*/
$ch = curl_init();
/*
CONFIGURACIÓN CURL
CURLOPT_URL
- Endpoint oficial de Groq
CURLOPT_RETURNTRANSFER
- Hace que la respuesta se devuelva como string
- Si no estuviera, la imprimiría directamente
CURLOPT_POST
- Indicamos que la petición será POST
CURLOPT_HTTPHEADER
- Enviamos headers HTTP
CURLOPT_POSTFIELDS
- Enviamos el body JSON
*/
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.groq.com/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => json_encode($data)
]);
/*
EJECUTAR CONSULTA
- Se realiza la petición HTTP a Groq
*/
$response = curl_exec($ch);
/*
ERROR CURL
Detecta errores de conexión reales
*/
if (curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
return [
'success' => false,
'error' => $error
];
}
/*
HTTP STATUS CODE
Obtenemos el código HTTP de la respuesta
*/
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
/*
CERRAR cURL
Liberamos recursos
*/
curl_close($ch);
/*
RATE LIMIT
Groq limita la cantidad de tokens por minuto
429 = demasiadas consultas o contexto muy grande
*/
if ($httpCode === 429) {
return [
'success' => false,
'error' => 'Límite temporal alcanzado. Esperá unos segundos.'
];
}
/*
OTROS ERRORES HTTP
Si la respuesta no fue 200, devolvemos error (200 -> OK)
*/
if ($httpCode !== 200) {
return [
'success' => false,
'error' => "HTTP ERROR {$httpCode}: {$response}"
];
}
/*
DECODIFICAR JSON
Convertimos la respuesta JSON de Groq en array PHP
*/
$resultado = json_decode($response, true);
/*
RESPUESTA FINAL
choices[0]['message']['content']
Es donde Groq devuelve el texto generado
*/
return [
'success' => true,
'content' => $resultado['choices'][0]['message']['content'] ?? 'Sin respuesta.'
];
}