# Documentación Técnica: BotAgenteModel (PHP)

El `BotAgenteModel` es el núcleo de configuración de los asistentes dentro del namespace `App\Models\Bot`. A diferencia de modelos de identidad simple, este modelo gestiona el comportamiento lógico, las instrucciones de sistema para el modelo de lenguaje (LLM) y el estado de disponibilidad de cada agente en el ecosistema.

---

## Estructura de la Entidad

Este modelo define los campos críticos que el `Chat` controller utiliza para inicializar la "mente" del asistente antes de realizar una consulta a Gemini.

### Atributos y Campos Permitidos (`$allowedFields`)

* **nombre**: Nombre público del asistente.
* **descripcion**: Resumen de las capacidades o área de conocimiento del agente.
* **mensaje_bienvenida**: Texto inicial que el bot muestra al abrirse la conversación.
* **slug**: Identificador amigable para URLs, garantizando rutas únicas por agente.
* **instruccion_sistema**: El "System Prompt" detallado. Define las reglas de comportamiento, el tono y las restricciones que seguirá la IA.
* **activo**: Valor booleano (1/0) que determina si el agente está disponible para ser seleccionado por los usuarios.

---

## Configuración y Validación

El modelo incluye reglas de validación nativas de CodeIgniter 4 para asegurar la integridad de los datos antes de la persistencia.

| Propiedad | Valor / Regla | Descripción |
| --- | --- | --- |
| `$table` | `bot_agentes` | Tabla física de almacenamiento. |
| `nombre` | `required|min_length[3]` | El nombre es obligatorio para la interfaz. |
| `slug` | `is_unique[...]` | Evita duplicidad de identificadores en rutas. |

---

## Métodos Personalizados

### `getAgentesActivos()`

* **Propósito**: Filtra la base de datos para retornar únicamente los asistentes que tienen el campo `activo` en 1.
* **Uso**: Principalmente utilizado en la vista de selección de chat para evitar que los usuarios accedan a agentes en desarrollo o dados de baja.

---

## Ejemplo de Implementación

### Carga de Agente en el Controlador de Chat

Este fragmento ilustra cómo el controlador recupera la configuración para pasarla a la librería de Gemini:

```php
use App\Models\Bot\BotAgenteModel;

$agenteModel = new BotAgenteModel();

// Obtener solo agentes disponibles para el público
$agentesParaMostrar = $agenteModel->getAgentesActivos();

// Buscar un agente específico por su ID
$agenteId = 3;
$agente = $agenteModel->find($agenteId);

if ($agente) {
    $instruccion = $agente['instruccion_sistema']; // El prompt que leerá Gemini
    $bienvenida = $agente['mensaje_bienvenida'];
}

```

---

## Casos de Uso

### 1. Despliegue de Múltiples Personalidades

Gracias al campo `instruccion_sistema`, un administrador puede crear un agente llamado "Soporte Técnico" con instrucciones de ser directo, y otro llamado "Consejero Estudiantil" con instrucciones de ser empático, usando la misma estructura de base de datos.

### 2. Gestión de Ciclo de Vida (Mantenimiento)

El campo `activo` permite a los desarrolladores realizar pruebas con nuevos agentes en la base de datos sin que estos aparezcan en la interfaz de usuario final hasta que el entrenamiento (prompt engineering) esté listo.

### 3. SEO y Rutas Amigables

El uso del `slug` permite generar URLs limpias como `dominio.com/chat/vincular/asistente-academico` en lugar de usar IDs numéricos, lo que facilita la compartición de enlaces directos a agentes específicos.
