feat: embedding dimension validation + migration system
Some checks failed
CI / Lint, Test & Build (push) Failing after 8m1s
CI / Deploy production (on server) (push) Has been cancelled

- Add /api/admin/embeddings/dimension (GET column dim, POST test model dim)
- Add /api/admin/embeddings/migrate (alter column, clear, re-index)
- Admin form warns on dimension mismatch after save, offers migrate button
- Remove hardcoded 1536 from validate endpoint and embedding service
- Add validateDimension() utility to EmbeddingService
- Fix health route: import prisma correctly, use router instead of missing registry
- i18n keys for dimension warning (EN/FR)
This commit is contained in:
Antigravity
2026-05-19 18:45:50 +00:00
parent 28f46860c1
commit 6a8d0eb0a5
10 changed files with 297 additions and 20 deletions

View File

@@ -1,5 +1,5 @@
import { NextResponse } from 'next/server'
import { getPrisma } from '@/lib/prisma'
import { prisma } from '@/lib/prisma'
import { redis } from '@/lib/redis'
export const dynamic = 'force-dynamic'
@@ -11,7 +11,6 @@ export async function GET() {
// Database check
try {
const dbStart = Date.now()
const prisma = getPrisma()
const [noteCount, notebookCount, userCount] = await Promise.all([
prisma.note.count(),
prisma.notebook.count(),
@@ -47,13 +46,15 @@ export async function GET() {
// AI providers check
try {
const { getAIProvider, getChatProvider } = await import('@/lib/ai/providers/registry')
const embeddingProvider = getAIProvider()
const chatProvider = getChatProvider()
const { getSystemConfig } = await import('@/lib/config')
const config = await getSystemConfig()
const { resolveAiRoute } = await import('@/lib/ai/router')
const tagsRoute = resolveAiRoute('tags', config)
const chatRoute = resolveAiRoute('chat', config)
checks.ai = {
status: 'configured',
embedding: { provider: embeddingProvider },
chat: { provider: chatProvider },
embedding: { provider: tagsRoute.providerType, model: tagsRoute.modelName },
chat: { provider: chatRoute.providerType, model: chatRoute.modelName },
}
} catch (e) {
checks.ai = { status: 'unhealthy', error: e instanceof Error ? e.message : 'Unknown error' }