fix(covers): fallback to neutral prompt when title trips content moderation
Build and Deploy / verify (push) Successful in 10s
Build and Deploy / deploy (push) Successful in 18s

input new_sensitive 的标题(自杀/逝世等)改用不含标题的通用提示词重试一次
This commit is contained in:
2026-10-14 23:52:00 +00:00
parent d041622531
commit ddbf259e93
+32 -10
View File
@@ -35,16 +35,13 @@ class CoverGenerator
// 站点无常驻 queue worker:同步产出 card 转换,避免缩略图永远卡在队列里。 // 站点无常驻 queue worker:同步产出 card 转换,避免缩略图永远卡在队列里。
config(['media-library.queue_conversions_by_default' => false]); config(['media-library.queue_conversions_by_default' => false]);
$response = Http::timeout(120) $response = $this->requestImage($this->buildPrompt($post, $style), $model);
->withToken($this->llm->apiKey())
->post($this->llm->baseUrl().'/image_generation', [ // 标题触发内容审核(input new_sensitive):退化为不含标题的通用提示词重试一次。
'model' => $this->model($model), if (str_contains((string) $response->body(), 'sensitive')
'prompt' => $this->buildPrompt($post, $style), && ! is_string($response->json('data.image_urls.0'))) {
'aspect_ratio' => '16:9', $response = $this->requestImage($this->neutralPrompt($style), $model);
'response_format' => 'url', }
'n' => 1,
'prompt_optimizer' => true,
]);
if ($response->failed()) { if ($response->failed()) {
throw new \RuntimeException('HTTP '.$response->status().':'.Str::limit($response->body(), 200)); throw new \RuntimeException('HTTP '.$response->status().':'.Str::limit($response->body(), 200));
@@ -91,4 +88,29 @@ class CoverGenerator
return implode('。', $parts); return implode('。', $parts);
} }
/**
* 不含标题/摘要的通用封面提示词(标题触发审核时的兜底)。
*/
public function neutralPrompt(?string $style = null): string
{
$style = trim((string) ($style
?: blog_setting('cover_prompt_style', '扁平插画风格,色调柔和,构图简洁')));
return "博客文章封面配图。{$style}。画面中不要出现任何文字";
}
private function requestImage(string $prompt, ?string $model = null): \Illuminate\Http\Client\Response
{
return Http::timeout(120)
->withToken($this->llm->apiKey())
->post($this->llm->baseUrl().'/image_generation', [
'model' => $this->model($model),
'prompt' => $prompt,
'aspect_ratio' => '16:9',
'response_format' => 'url',
'n' => 1,
'prompt_optimizer' => true,
]);
}
} }