Skip to content

Commit fb73b36

Browse files
committed
fix インデックス情報は非同期でとる
1 parent 3fe5d5a commit fb73b36

2 files changed

Lines changed: 85 additions & 84 deletions

File tree

frontend/src/routes/[id]/+page.server.ts

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -137,35 +137,26 @@ export const load: PageServerLoad = async ({
137137
}
138138

139139
// RAGインデックス状態を取得(entry.id が必要なため第2フェーズ)
140+
// Promiseのまま返してストリーミングし、ページ表示をブロックしない
140141
const semanticSearchEnabled =
141142
userInfo.llmKeys?.find((k) => k.llmProvider === 1)?.semanticSearchEnabled ??
142143
false;
143-
let embeddingStatus: {
144-
indexed: boolean;
145-
modelVersion: string;
146-
createdAt: number;
147-
updatedAt: number;
148-
chunkCount: number;
149-
chunkSummaries: string[];
150-
} | null = null;
151-
if (entryResponse.entry && semanticSearchEnabled) {
152-
try {
153-
const statusResponse = await getDiaryEmbeddingStatus({
154-
diaryId: entryResponse.entry.id,
155-
accessToken: authResult.accessToken,
156-
});
157-
embeddingStatus = {
158-
indexed: statusResponse.indexed,
159-
modelVersion: statusResponse.modelVersion,
160-
createdAt: Number(statusResponse.createdAt),
161-
updatedAt: Number(statusResponse.updatedAt),
162-
chunkCount: statusResponse.chunkCount,
163-
chunkSummaries: statusResponse.chunkSummaries,
164-
};
165-
} catch (_embeddingErr) {
166-
embeddingStatus = null;
167-
}
168-
}
144+
const embeddingStatus =
145+
entryResponse.entry && semanticSearchEnabled
146+
? getDiaryEmbeddingStatus({
147+
diaryId: entryResponse.entry.id,
148+
accessToken: authResult.accessToken,
149+
})
150+
.then((statusResponse) => ({
151+
indexed: statusResponse.indexed,
152+
modelVersion: statusResponse.modelVersion,
153+
createdAt: Number(statusResponse.createdAt),
154+
updatedAt: Number(statusResponse.updatedAt),
155+
chunkCount: statusResponse.chunkCount,
156+
chunkSummaries: statusResponse.chunkSummaries,
157+
}))
158+
.catch(() => null)
159+
: Promise.resolve(null);
169160

170161
// 過去日記を整形
171162
const pastEntriesObject = pastEntriesKeys.reduce(

frontend/src/routes/[id]/+page.svelte

Lines changed: 68 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -516,67 +516,77 @@ use:enhance={createSubmitHandler(
516516
<!-- RAGインデックス状態 -->
517517
{#if data.semanticSearchEnabled && data.entry}
518518
<div class="mt-2 text-xs">
519-
<div class="flex items-center gap-2">
520-
{#if data.embeddingStatus?.indexed}
521-
<button
522-
type="button"
523-
class="inline-flex items-center px-2 py-0.5 rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 hover:bg-purple-200 dark:hover:bg-purple-900/50 transition-colors cursor-pointer"
524-
on:click={() => (embeddingDetailOpen = !embeddingDetailOpen)}
525-
>
526-
<svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20">
527-
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" />
528-
</svg>
529-
{$_("diary.embedding.indexed")}
530-
<svg class="w-3 h-3 ml-1 transition-transform {embeddingDetailOpen ? 'rotate-180' : ''}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
531-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
532-
</svg>
533-
</button>
534-
{:else}
535-
<span class="inline-flex items-center px-2 py-0.5 rounded-full bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400">
536-
<svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20">
537-
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />
538-
</svg>
539-
{$_("diary.embedding.notIndexed")}
540-
</span>
541-
{/if}
542-
</div>
519+
{#await data.embeddingStatus}
520+
<!-- ローディング中 -->
521+
<span class="inline-flex items-center px-2 py-0.5 rounded-full bg-gray-100 text-gray-500 dark:bg-gray-700 dark:text-gray-400">
522+
<svg class="w-3 h-3 mr-1 animate-spin" fill="none" stroke="currentColor" viewBox="0 0 24 24">
523+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
524+
</svg>
525+
{$_("common.loading")}
526+
</span>
527+
{:then embeddingStatus}
528+
<div class="flex items-center gap-2">
529+
{#if embeddingStatus?.indexed}
530+
<button
531+
type="button"
532+
class="inline-flex items-center px-2 py-0.5 rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 hover:bg-purple-200 dark:hover:bg-purple-900/50 transition-colors cursor-pointer"
533+
on:click={() => (embeddingDetailOpen = !embeddingDetailOpen)}
534+
>
535+
<svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20">
536+
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" />
537+
</svg>
538+
{$_("diary.embedding.indexed")}
539+
<svg class="w-3 h-3 ml-1 transition-transform {embeddingDetailOpen ? 'rotate-180' : ''}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
540+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
541+
</svg>
542+
</button>
543+
{:else}
544+
<span class="inline-flex items-center px-2 py-0.5 rounded-full bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400">
545+
<svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20">
546+
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />
547+
</svg>
548+
{$_("diary.embedding.notIndexed")}
549+
</span>
550+
{/if}
551+
</div>
543552

544-
{#if data.embeddingStatus?.indexed && embeddingDetailOpen}
545-
<div class="mt-2 p-3 rounded-lg bg-purple-50 dark:bg-purple-950/20 border border-purple-200 dark:border-purple-800/40 space-y-1.5">
546-
<div class="flex items-center gap-2">
547-
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.modelVersion")}:</span>
548-
<span class="font-mono text-purple-700 dark:text-purple-300">{data.embeddingStatus.modelVersion}</span>
549-
</div>
550-
<div class="flex items-center gap-2">
551-
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.chunkCount")}:</span>
552-
<span class="text-gray-700 dark:text-gray-300">{data.embeddingStatus.chunkCount}</span>
553-
</div>
554-
{#if data.embeddingStatus.chunkSummaries.length > 0}
555-
<div>
556-
<span class="text-gray-500 dark:text-gray-400">{$_("diary.embedding.chunkSummaries")}:</span>
557-
<ol class="mt-1 space-y-0.5 list-decimal list-inside">
558-
{#each data.embeddingStatus.chunkSummaries as chunkSummary}
559-
<li class="text-gray-600 dark:text-gray-400">
560-
{#if chunkSummary}
561-
{chunkSummary}
562-
{:else}
563-
{$_("diary.embedding.chunkSummaryEmpty")}
564-
{/if}
565-
</li>
566-
{/each}
567-
</ol>
553+
{#if embeddingStatus?.indexed && embeddingDetailOpen}
554+
<div class="mt-2 p-3 rounded-lg bg-purple-50 dark:bg-purple-950/20 border border-purple-200 dark:border-purple-800/40 space-y-1.5">
555+
<div class="flex items-center gap-2">
556+
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.modelVersion")}:</span>
557+
<span class="font-mono text-purple-700 dark:text-purple-300">{embeddingStatus.modelVersion}</span>
558+
</div>
559+
<div class="flex items-center gap-2">
560+
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.chunkCount")}:</span>
561+
<span class="text-gray-700 dark:text-gray-300">{embeddingStatus.chunkCount}</span>
562+
</div>
563+
{#if embeddingStatus.chunkSummaries.length > 0}
564+
<div>
565+
<span class="text-gray-500 dark:text-gray-400">{$_("diary.embedding.chunkSummaries")}:</span>
566+
<ol class="mt-1 space-y-0.5 list-decimal list-inside">
567+
{#each embeddingStatus.chunkSummaries as chunkSummary}
568+
<li class="text-gray-600 dark:text-gray-400">
569+
{#if chunkSummary}
570+
{chunkSummary}
571+
{:else}
572+
{$_("diary.embedding.chunkSummaryEmpty")}
573+
{/if}
574+
</li>
575+
{/each}
576+
</ol>
577+
</div>
578+
{/if}
579+
<div class="flex items-center gap-2">
580+
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.indexedAt")}:</span>
581+
<span class="text-gray-700 dark:text-gray-300">{new Date(embeddingStatus.createdAt * 1000).toLocaleString()}</span>
582+
</div>
583+
<div class="flex items-center gap-2">
584+
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.updatedAt")}:</span>
585+
<span class="text-gray-700 dark:text-gray-300">{new Date(embeddingStatus.updatedAt * 1000).toLocaleString()}</span>
568586
</div>
569-
{/if}
570-
<div class="flex items-center gap-2">
571-
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.indexedAt")}:</span>
572-
<span class="text-gray-700 dark:text-gray-300">{new Date(data.embeddingStatus.createdAt * 1000).toLocaleString()}</span>
573-
</div>
574-
<div class="flex items-center gap-2">
575-
<span class="text-gray-500 dark:text-gray-400 w-28 shrink-0">{$_("diary.embedding.updatedAt")}:</span>
576-
<span class="text-gray-700 dark:text-gray-300">{new Date(data.embeddingStatus.updatedAt * 1000).toLocaleString()}</span>
577587
</div>
578-
</div>
579-
{/if}
588+
{/if}
589+
{/await}
580590
</div>
581591
{/if}
582592

0 commit comments

Comments
 (0)