embeddingService->context(); $articles = Article::query()->count(); $articlesWithChunks = Article::query()->has('chunks')->count(); $chunks = ArticleChunk::query()->count(); $chunksWithEmbedding = ArticleChunk::query()->whereNotNull('embedding')->count(); $currentChunks = ArticleChunk::query() ->where('embedding_provider_instance_id', $context['provider_instance_id']) ->where('embedding_model', $context['embedding_model']) ->count(); return [ 'articles' => $articles, 'articles_with_chunks' => $articlesWithChunks, 'articles_without_chunks' => max(0, $articles - $articlesWithChunks), 'chunks' => $chunks, 'chunks_with_embedding' => $chunksWithEmbedding, 'chunks_without_embedding' => max(0, $chunks - $chunksWithEmbedding), 'current_embedding_chunks' => $currentChunks, 'stale_or_other_model_chunks' => max(0, $chunks - $currentChunks), 'active_provider_instance_id' => $context['provider_instance_id'], 'active_embedding_model' => $context['embedding_model'], ]; } public function dispatchReindex(bool $force = false): int { $query = Article::query()->orderBy('id'); if (! $force) { $query->whereDoesntHave('chunks'); } $count = 0; $query->chunkById(100, function ($articles) use (&$count) { foreach ($articles as $article) { GenerateArticleEmbeddingJob::dispatch($article->id); $count++; } }); return $count; } }