where('provider', 'stability_ai')->where('is_active', true)->first(); if (! $provider) { $engine->failStep($step, 'No active StabilityAI provider configured.'); return; } $input = $step->input ?? []; $basePrompt = $input['prompt'] ?? $this->defaultPrompt($step->videoProject); $styles = $input['styles'] ?? self::DEFAULT_STYLES; $assetIds = []; foreach (array_values($styles) as $i => $style) { $prompt = "{$basePrompt}. Eye-catching YouTube thumbnail, bold, high contrast, {$style}."; try { $result = $this->aiProviders->generate($provider, $prompt); } catch (AiGenerationException $e) { $engine->failStep($step, 'variant '.($i + 1).": {$e->getMessage()}"); return; } $extension = str($result->contentType)->after('image/')->toString() ?: 'png'; $asset = $this->assets->store( $step->videoProject, 'image', $result->content, $extension, step: $step, mimeType: $result->contentType, metadata: ['kind' => 'thumbnail', 'variant' => $i + 1, 'style' => $style], ); $assetIds[] = $asset->id; } $engine->completeStep($step, [ 'asset_ids' => $assetIds, 'variant_count' => count($assetIds), ]); } private function defaultPrompt(VideoProject $project): string { return trim(($project->title ?? '').'. '.($project->description ?? '')); } }