onQueue('ai-content'); } public function handle(LlmProvider $llm, AiSettings $settings): void { if (! $settings->content_optimization_enabled) { return; } $article = Article::query()->find($this->articleId); if ($article === null) { return; } try { $result = $llm->complete((string) $article->content, [ 'title' => $article->title, 'article_id' => $article->id, 'content_format' => $article->content_format, ]); $updates = [ 'ai_summary' => filled($result['summary'] ?? null) ? (string) $result['summary'] : $article->ai_summary, 'ai_suggestions' => array_values($result['suggestions'] ?? []), ]; if (filled($result['polished_content'] ?? null)) { $updates['ai_polished_content'] = (string) $result['polished_content']; } // Fill empty SEO description from the model when the author left it blank. if (blank($article->description) && filled($result['description'] ?? null)) { $updates['description'] = (string) $result['description']; } $article->forceFill($updates)->save(); } catch (\Throwable $exception) { Log::warning('Article content optimization failed.', [ 'article_id' => $this->articleId, 'message' => $exception->getMessage(), ]); } } }