From 6aae919bf7e2fbe9c961bec3a614e64105fb9da0 Mon Sep 17 00:00:00 2001 From: gouki Date: Thu, 15 Oct 2026 00:11:42 +0000 Subject: [PATCH] fix(covers): retry without prompt_optimizer on silent empty-image failure --- app/Blog/Services/CoverGenerator.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/Blog/Services/CoverGenerator.php b/app/Blog/Services/CoverGenerator.php index 2f503fa..c72aaea 100644 --- a/app/Blog/Services/CoverGenerator.php +++ b/app/Blog/Services/CoverGenerator.php @@ -55,6 +55,11 @@ class CoverGenerator $response = $this->requestImage($this->neutralPrompt($style), $model); } + // 少数提示词在 prompt_optimizer 下静默失败(success 但无图):关掉优化器重试一次。 + if ($response->successful() && ! is_string($response->json('data.image_urls.0'))) { + $response = $this->requestImage($this->buildPrompt($post, $style), $model, false); + } + if ($response->failed()) { throw new \RuntimeException('HTTP '.$response->status().':'.Str::limit($response->body(), 200)); } @@ -112,7 +117,7 @@ class CoverGenerator return "博客文章封面配图。{$style}。画面中不要出现任何文字"; } - private function requestImage(string $prompt, ?string $model = null): \Illuminate\Http\Client\Response + private function requestImage(string $prompt, ?string $model = null, bool $optimizer = true): \Illuminate\Http\Client\Response { $llm = $this->llm(); @@ -124,7 +129,7 @@ class CoverGenerator 'aspect_ratio' => '16:9', 'response_format' => 'url', 'n' => 1, - 'prompt_optimizer' => true, + 'prompt_optimizer' => $optimizer, ]); } }