6. Modelo Chatbot
Modelo Chatbot - Creación y Configuración
1. Creación del Modelo Chatbot
1.1. Generar el Modelo con Todos sus Archivos
Ejecutamos el comando para crear el modelo con todos los archivos relacionados:
bash
php artisan make:model Chatbot --all
Archivos generados:
✅ app/Models/Chatbot.php - Modelo
✅ database/migrations/xxxx_create_chatbots_table.php - Migración
✅ database/factories/ChatbotFactory.php - Factory
✅ app/Http/Requests/StoreChatbotRequest.php - Request para crear
✅ app/Http/Requests/UpdateChatbotRequest.php - Request para actualizar
✅ app/Http/Controllers/ChatbotController.php - Controlador
Selección interactiva:
Si usas --all, puedes seleccionar archivos específicos con la barra espaciadora y flechas.
2. Migración del Modelo Chatbot
2.1. Estructura de la Migración
Editamos el archivo de migración en database/migrations/xxxx_create_chatbots_table.php:
php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('chatbots', function (Blueprint $table) {
// UUID como clave primaria
$table->uuid('id')->primary();
// Relación con el usuario
$table->foreignUuid('user_id')
->constrained()
->cascadeOnDelete();
// Campos principales del chatbot
$table->string('name');
$table->text('system_prompt');
$table->string('model');
$table->float('temperature', 8, 2)->default(0.0);
// Soft deletes para recuperación
$table->softDeletes();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('chatbots');
}
};
2.2. Explicación de Campos
2.3. Notas sobre Soft Deletes
Los soft deletes permiten:
✅ Eliminar chatbots sin perder datos
✅ Recuperar chatbots eliminados
✅ Mantener historial de conversaciones
✅ Auditoría de eliminaciones
3. Relaciones del Modelo
3.1. En el Modelo Chatbot (app/Models/Chatbot.php)
php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class Chatbot extends Model
{
use HasFactory, HasUuids, SoftDeletes;
/**
* Los atributos que son asignables masivamente.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'system_prompt',
'model',
'temperature',
'user_id',
];
/**
* Los atributos que deben ser convertidos.
*
* @var array<string, string>
*/
protected $casts = [
'temperature' => 'float',
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
/**
* Relación: Un chatbot pertenece a un usuario.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
3.2. En el Modelo User (app/Models/User.php)
php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
// ... otros imports
class User extends Authenticatable
{
use HasFactory, HasUuids;
// ... otros traits
/**
* Relación: Un usuario tiene muchos chatbots.
*/
public function chatbots(): HasMany
{
return $this->hasMany(Chatbot::class);
}
}
3.3. Diagrama de Relaciones
text
┌─────────────┐ ┌─────────────┐
│ Users │ │ Chatbots │
├─────────────┤ ├─────────────┤
│ id (UUID) │◄─────────│ user_id │
│ name │ │ id (UUID) │
│ email │ │ name │
│ ... │ │ system_prompt│
└─────────────┘ │ model │
│ temperature │
│ deleted_at │
└─────────────┘
4. Factory para Datos de Prueba
4.1. Configuración del Factory (database/factories/ChatbotFactory.php)
php
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Chatbot>
*/
class ChatbotFactory extends Factory
{
/**
* Define el estado por defecto del modelo.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => $this->faker->sentence(3), // Nombre aleatorio
'user_id' => User::factory(), // Crea un usuario asociado
'system_prompt' => $this->faker->paragraph(3), // Prompt extenso
'model' => $this->faker->word(), // Ej: "gpt-3.5-turbo"
'temperature' => $this->faker->randomFloat(1, 0, 1), // 0.0 a 1.0
];
}
}
4.2. Métodos Útiles del Factory
php
// Crear chatbot con un usuario específico
Chatbot::factory()->create([
'user_id' => $user->id,
]);
// Crear múltiples chatbots
Chatbot::factory()->count(5)->create();
// Crear chatbots con diferentes temperaturas
Chatbot::factory()->create([
'temperature' => 0.8, // Más creativo
]);
5. Seeder con Relaciones
5.1. Configurar Database Seeder (database/seeders/DatabaseSeeder.php)
php
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
// Crear usuario con chatbots asociados
User::factory()
->hasChatbots(1) // Crear 1 chatbot asociado
->create([
'name' => 'Usuario Prueba',
'email' => 'usuario@prueba.com',
]);
// Para crear 2 chatbots:
// User::factory()
// ->hasChatbots(2)
// ->create([...]);
// Crear varios usuarios con chatbots
// User::factory()
// ->count(3)
// ->hasChatbots(2)
// ->create();
}
}
5.2. Explicación del Método hasChatbots()
Este método mágico funciona porque:
La relación chatbots() está definida en el modelo User
Laravel detecta automáticamente la relación
Crea y asocia los chatbots al usuario
6. Verificación en la Base de Datos
6.1. Ejecutar Migraciones y Seeders
bash
php artisan migrate:fresh --seed
O usando el alias:
bash
mfs
6.2. Verificar la Tabla Chatbots
Consultas SQL de verificación:
sql
-- Ver estructura de la tabla
DESCRIBE chatbots;
Resultado esperado:
text
+----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| id | char(36) | NO | PRI | NULL | |
| user_id | char(36) | NO | MUL | NULL | |
| name | varchar(255)| NO | | NULL | |
| system_prompt | text | NO | | NULL | |
| model | varchar(255)| NO | | NULL | |
| temperature | double | YES | | 0 | |
| deleted_at | timestamp | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+----------------+-------------+------+-----+---------+-------+
Ver datos:
sql
SELECT
c.id,
c.name,
u.name as owner,
c.model,
c.temperature
FROM chatbots c
JOIN users u ON c.user_id = u.id;
7. Funcionalidades Adicionales
7.1. Scopes para Consultas Comunes
Agregar en el modelo Chatbot:
php
/**
* Scope para chatbots activos (no eliminados)
*/
public function scopeActive($query)
{
return $query->whereNull('deleted_at');
}
/**
* Scope para chatbots de un usuario específico
*/
public function scopeForUser($query, $userId)
{
return $query->where('user_id', $userId);
}
7.2. Métodos de Ayuda
php
/**
* Verificar si el chatbot está eliminado
*/
public function isDeleted(): bool
{
return $this->trashed();
}
/**
* Obtener el nombre del modelo de IA
*/
public function getModelDisplayName(): string
{
$models = [
'gpt-3.5-turbo' => 'GPT-3.5 Turbo',
'gpt-4' => 'GPT-4',
'gpt-4-turbo' => 'GPT-4 Turbo',
];
return $models[$this->model] ?? $this->model;
}
8. Ejemplos de Uso
8.1. Crear un Chatbot desde el Código
php
use App\Models\Chatbot;
$chatbot = Chatbot::create([
'user_id' => auth()->id(),
'name' => 'Chef Ecuador',
'system_prompt' => 'Eres un experto en gastronomía ecuatoriana...',
'model' => 'gpt-3.5-turbo',
'temperature' => 0.0,
]);
8.2. Obtener Chatbots del Usuario Autenticado
php
// En un controlador
$chatbots = auth()->user()->chatbots;
// O usando el scope
$chatbots = Chatbot::forUser(auth()->id())->get();
8.3. Eliminación Lógica y Recuperación
php
// Eliminar (soft delete)
$chatbot->delete();
// Verificar si está eliminado
if ($chatbot->trashed()) {
// Restaurar
$chatbot->restore();
}
// Forzar eliminación permanente
$chatbot->forceDelete();
9. Resumen de Archivos Creados
9.1. Estructura de Archivos
text
app/Models/
└── Chatbot.php
app/Http/Controllers/
└── ChatbotController.php
app/Http/Requests/
├── StoreChatbotRequest.php
└── UpdateChatbotRequest.php
database/migrations/
└── xxxx_create_chatbots_table.php
database/factories/
└── ChatbotFactory.php
database/seeders/
└── DatabaseSeeder.php (modificado)
9.2. Configuraciones Aplicadas
10. Próximos Pasos
Con el modelo Chatbot configurado, ahora podemos:
✅ Crear la interfaz de usuario para gestionar chatbots
✅ Implementar la lógica para chatear con la IA
✅ Añadir fuentes de conocimiento (PDFs, URLs)
✅ Gestionar múltiples conversaciones
¡El modelo base está listo para comenzar a construir la funcionalidad principal! 🚀
Comentarios
Publicar un comentario