floriandomgjoni/laravel-ai-factory

Laravel package for generating realistic factory data using AI (OpenAI, Gemini, DeepSeek) with support for manual and hardcoded fields, model events, and bulk inserts.

dev-main 2025-06-03 18:02 UTC

This package is not auto-updated.

Last update: 2025-06-12 12:35:07 UTC


README

Laravel AI Factory is a developer-friendly package for generating realistic test data using AI models. It integrates seamlessly with Laravel factories and supports both AI-generated and manually defined fields, with the option to use bulk or individual inserts.

๐Ÿš€ Features

  • โœ… Generate factory data using AI prompts
  • โœ… Supports OpenAI - Gemini and DeepSeek support coming soon...
  • โœ… Mix AI-generated fields with hardcoded or Faker-generated fields
  • โœ… Optional bulk insert for performance (without triggering model events)
  • โœ… Easy to extend and override

๐Ÿ“ฆ Installation

composer require floriandomgjoni/laravel-ai-factory

โš™๏ธ Configuration

Publish the config:

php artisan vendor:publish --tag=ai-factory-config

Update your .env with the appropriate API keys:

AI_FACTORY_DRIVER=openai
AI_FACTORY_OPENAI_API_KEY=your-api-key
AI_FACTORY_OPENAI_MODEL=gpt-4o-mini

or, for a local LLM:

AI_FACTORY_DRIVER=local
AI_FACTORY_LOCAL_URL=http://localhost:8080/v1/chat/completions
AI_FACTORY_LOCAL_API_KEY=""
AI_FACTORY_LOCAL_MODEL=Default

๐Ÿง  Defining AI Fields

In your factory, use the HasAIFactory trait and define the aiFields() method:

<?php
use FlorianDomgjoni\AIFactory\Concerns\HasAIFactory;

class UserFactory extends Factory
{
    use HasAIFactory;

    protected $model = \App\Models\User::class;

    public function aiFields(): array
    {
        return [
            'name' => 'Generate a realistic full name',
            'email' => fn () => fake()->unique()->safeEmail(),
            'password' => fn () => bcrypt('password'),
            'api_token' => fn () => Str::random(60),
        ];
    }
}
  • Use a string for AI-generated fields (prompt).
  • Use a callable for manual or faker-based fields.

You also need to fill the $model property with the model class inside the factory. It is required in order to function properly.

๐Ÿ›  Usage

Basic Usage

User::factory()->count(5)->createWithAI();

Override Fields

User::factory()->count(3)->createWithAI([
    'email' => fn () => fake()->unique()->safeEmail(),
    'role' => fn () => 'admin'
]);

Bulk Insert (faster, skips model events)

User::factory()->count(100)->createWithAI([], true);

๐Ÿงช Example Prompt

[
    'title' => 'Generate a blog post title related to technology',
    'content' => 'Generate a paragraph of blog content about AI',
    'published_at' => fn () => now()->subDays(rand(1, 30)),
]

๐Ÿ“‚ Config File

return [
    'driver' => env('AI_FACTORY_DRIVER', 'openai'),

    'openai' => [
        'api_key' => env('AI_FACTORY_OPENAI_API_KEY'),
        'model' => env('AI_FACTORY_OPENAI_MODEL', 'gpt-4o-mini'),
    ],

    'local' => [
        'url' => env('AI_FACTORY_LOCAL_URL', 'http://localhost:8080'),
        'api_key' => env('AI_FACTORY_LOCAL_API_KEY', null),
        'model' => env('AI_FACTORY_LOCAL_MODEL', null),
    ],
];

๐Ÿ›ก Error Handling

  • AI data generation is wrapped in try/catch.
  • Model creation errors are logged individually.
  • Invalid JSON or failed API calls will throw descriptive exceptions.

๐Ÿ“„ License

This package is open-sourced software licensed under the MIT license.