diff options
| author | Fuwn <[email protected]> | 2026-02-04 01:11:12 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-04 01:29:40 -0800 |
| commit | e0beeab2bcf6edd4681912e5cddf2d9ee7eb041d (patch) | |
| tree | 588b8abb71b91aef5e6e7691319468b513929a7d /packages/web/src/server/api | |
| parent | feat(web): Enhance memory dashboard with projects and search (diff) | |
| download | archived-imemio-e0beeab2bcf6edd4681912e5cddf2d9ee7eb041d.tar.xz archived-imemio-e0beeab2bcf6edd4681912e5cddf2d9ee7eb041d.zip | |
feat(web): Add embedding settings with re-embed functionality
Diffstat (limited to 'packages/web/src/server/api')
| -rw-r--r-- | packages/web/src/server/api/routers/memory.ts | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/packages/web/src/server/api/routers/memory.ts b/packages/web/src/server/api/routers/memory.ts index eebe0f8..d523b4e 100644 --- a/packages/web/src/server/api/routers/memory.ts +++ b/packages/web/src/server/api/routers/memory.ts @@ -179,8 +179,7 @@ export const memoryRouter = createTRPCRouter({ if (!embeddingService) { throw new TRPCError({ code: "PRECONDITION_FAILED", - message: - "Search is not available. Configure OPENAI_API_KEY to enable semantic search.", + message: "Search requires OPENAI_API_KEY to be configured.", }); } @@ -194,6 +193,7 @@ export const memoryRouter = createTRPCRouter({ const searchResults = await memoryStore.search(queryEmbedding, { projectId: input.projectId, limit: input.limit, + threshold: 0.3, }); const projectsResult = await projectStore.list(); const projects = projectsResult.success ? projectsResult.value : []; @@ -205,4 +205,44 @@ export const memoryRouter = createTRPCRouter({ return { results: resultsWithProjects, projects }; }), + + embeddingInfo: protectedProcedure.query(() => { + const embeddingService = getEmbeddingService(); + + return { available: embeddingService !== null }; + }), + + reembed: protectedProcedure.mutation(async ({ ctx: context }) => { + const embeddingService = getEmbeddingService(); + + if (!embeddingService) { + throw new TRPCError({ + code: "PRECONDITION_FAILED", + message: "Search is not configured on this server.", + }); + } + + const supabaseClient = await createClient(); + const memoryStore = new SupabaseStore(supabaseClient, context.user.id); + const memories = await memoryStore.list(); + let updated = 0; + + for (const memory of memories) { + const embedding = await embeddingService.generate(memory.content); + const { error } = await supabaseClient + .from("memories") + .update({ + embedding: JSON.stringify(embedding), + embedding_dimensions: embeddingService.dimensions, + }) + .eq("id", memory.id) + .eq("user_id", context.user.id); + + if (!error) { + updated++; + } + } + + return { total: memories.length, updated }; + }), }); |