d3ro-voice/server/supabase/functions/embed-chunks/index.ts

26 lines
1.1 KiB
TypeScript

// server/supabase/functions/embed-chunks/index.ts
// Composition root: wires the real adapters into the embed-chunks use case.
import { requireUser } from '../_shared/auth.ts'
import { createServiceRoleClient } from '../_shared/quota.ts'
import { readProviderKey } from '../_shared/provider-key.ts'
import { createOpenAIEmbeddingProvider } from '../_shared/openai-embeddings.ts'
import { createSupabaseEmbeddingUsageStore } from '../_shared/embedding-quota.ts'
import { createEmbedChunksHandler } from './handler.ts'
import { createSupabaseKnowledgeStore } from './supabase-knowledge-store.ts'
let serviceClient: ReturnType<typeof createServiceRoleClient> | null = null
function service(): ReturnType<typeof createServiceRoleClient> {
serviceClient ??= createServiceRoleClient()
return serviceClient
}
Deno.serve(createEmbedChunksHandler({
authenticate: requireUser,
embeddingProvider: () => {
const key = readProviderKey('OPENAI_API_KEY')
return key ? createOpenAIEmbeddingProvider(key) : null
},
knowledgeStore: () => createSupabaseKnowledgeStore(service()),
usageStore: () => createSupabaseEmbeddingUsageStore(service()),
}))