Een eigen "Midjourney" voor het bedrijf: beelden maken en bewerken met AI, met vaste stijlen (presets) zodat alles in de huisstijl blijft, en een galerij voor het hele team. Denk aan productfoto's, social-posts, sfeerbeelden voor een website.
Wow-moment
Kies preset "Productfoto op marmer", typ "rode koffiemok", klik Maak 4 varianten: de workers maken ze tegelijk en ze verschijnen één voor één in de galerij. Daarna: upload een eigen foto en zeg "zet hem op een strand".
Gegevens
| Tabel | Kolommen |
|---|---|
presets |
name, description, prompt_template (met {onderwerp}), aspect_ratio (vierkant, liggend, staand), model |
generations |
preset_id (nullable), user_id (nullable), prompt, final_prompt, source_path (bij bewerken), status (wachten, bezig, klaar, fout), error, image_path, seconds, favorite (bool) |
collections (optioneel) |
name; koppeltabel collection_generation |
Pagina's
- Studio (
/studio): links preset-keuze (kaarten met voorbeeldbeeld), prompt-veld, aantal (1-4), beeldverhouding; rechts de laatste generaties in een<x-live>-raster dat elke 2 s ververst (status "bezig" = skeleton-kaart). - Galerij (
/gallery): alle beelden, filter op preset en favoriet, klik = groot (Alpine-modal) met prompt, knoppen "Download", "Favoriet", "Opnieuw met variatie", "Bewerk". - Presets (
/presets): lijst + toevoegen/bewerken (alleen voor de beheerder alsAPP_AUTH=demo). - Dashboard (
_live): aantal beelden vandaag, populairste preset, laatste 6 beelden.
Bouwvolgorde
- Migraties, modellen, seeder met 6 presets (Productfoto op marmer, Lifestyle buiten, Social post vlak met tekstruimte,
Isometrische illustratie, Zwart-wit editorial, Kerst-sfeer) en
prompt_template's. - Job
GenerateImage(één generation): roept Requesty aan (zie hieronder), slaat de PNG op instorage/app/public/generations/{id}.png, zetstatusenseconds. Fout:error=Ai::friendlyError($e). - Studio-pagina: formulier maakt N
generationsmet statuswachtenen dispatcht N jobs (10 workers = tegelijk). - Galerij + modal + download (
Storage::disk('public')->download(...)). - Bewerken: upload of kies een bestaand beeld als bron, prompt "zet hem op een strand" (edit-endpoint hieronder).
- Extra's als er tijd is: "Verbeter mijn prompt" (tekst-AI herschrijft de prompt), collecties, beeld beschrijven met vision (alt-tekst voor de website), batch: een lijst van 10 producten in één keer.
AI: beelden via Requesty
Gebruik voor beelden niet Image::of() van de Laravel AI SDK (die staat op een provider zonder sleutel), maar roep Requesty direct aan met Http:
$key = config('ai.providers.requesty.key') en $url = config('ai.providers.requesty.url'). Beschikbare
beeldmodellen: Http::withToken($key)->get("{$url}/models") en filter op image (bijv. azure/openai/gpt-image-1.5,
vertex/google/gemini-3-pro-image-preview). Zet het gekozen model in config/ai.php bij
'models' => ['image' => ['default' => env('AI_IMAGE_MODEL', '...')]] en lees het met
config('ai.providers.requesty.models.image.default').
// Nieuw beeld (OpenAI-stijl images-endpoint)
$response = Http::withToken($key)->timeout(120)->post("{$url}/images/generations", [
'model' => $model, // bv. azure/openai/gpt-image-1.5
'prompt' => $finalPrompt,
'n' => 1,
'size' => '1024x1024', // alleen deze drie: vierkant 1024x1024, liggend 1536x1024, staand 1024x1536
])->throw()->json();
$data = $response['data'][0];
$png = isset($data['b64_json']) ? base64_decode($data['b64_json']) : Http::get($data['url'])->body();
Storage::disk('public')->put("generations/{$generation->id}.png", $png);
// Bewerken met een bronbeeld (multipart)
$response = Http::withToken($key)->timeout(120)
->attach('image[]', Storage::disk('public')->get($generation->source_path), 'bron.png')
->post("{$url}/images/edits", ['model' => $model, 'prompt' => $prompt, 'size' => '1024x1024'])
->throw()->json();
Gemini-beeldmodellen gaan via /chat/completions met image_config (aspect_ratio); het beeld staat dan in
choices.0.message.images.0.image_url.url als data:image/png;base64,.... Werkt het ene model niet, probeer het andere.
Test eerst één aanroep met php artisan tinker voordat je de pagina bouwt.
Demo-data
Seeder met de presets. Laat bij het seeden geen beelden genereren (kost tijd en geld); maak vóór de demo zelf 8 tot 12 beelden via de studio, dan is de galerij gevuld.
Demo (3 minuten)
- "Onze marketing wacht dagen op beelden." 2. Preset kiezen, prompt, 4 varianten: live verschijnen.
- Eén favoriet, bewerken: "op een strand". 4. Galerij en dashboard: wat het team deze avond maakte.
Let op
- Beelden kosten per stuk geld: zet een maximum van 4 per klik.
- Beeldgeneratie duurt 5 tot 30 seconden: altijd via een job, nooit in het verzoek zelf.
- Geen andere beelddiensten (fal, Midjourney, Replicate): alleen Requesty.