aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/sdk/src/supabase-store.ts5
-rw-r--r--packages/sdk/src/types.ts2
-rw-r--r--supabase/migrations/002_variable_embedding_dimensions.sql62
3 files changed, 69 insertions, 0 deletions
diff --git a/packages/sdk/src/supabase-store.ts b/packages/sdk/src/supabase-store.ts
index 7f69791..386c3cb 100644
--- a/packages/sdk/src/supabase-store.ts
+++ b/packages/sdk/src/supabase-store.ts
@@ -20,6 +20,7 @@ type MemoryRow = {
tags: Tag[];
metadata: Record<string, unknown>;
embedding: unknown;
+ embedding_dimensions: number | null;
created_at: string;
updated_at: string;
};
@@ -88,6 +89,8 @@ export class SupabaseStore implements MemoryStore {
if (input.embedding) {
insertData.embedding = input.embedding;
+ insertData.embedding_dimensions =
+ input.embeddingDimensions ?? input.embedding.length;
}
const { data, error } = await this.client
@@ -142,6 +145,8 @@ export class SupabaseStore implements MemoryStore {
if (input.embedding !== undefined) {
updates.embedding = input.embedding;
+ updates.embedding_dimensions =
+ input.embeddingDimensions ?? input.embedding.length;
}
const { data, error } = await this.client
diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts
index 76a63de..4586ecd 100644
--- a/packages/sdk/src/types.ts
+++ b/packages/sdk/src/types.ts
@@ -42,6 +42,7 @@ export type MemoryCreateInput = {
tags?: Tag[];
metadata?: MemoryMetadata;
embedding?: number[];
+ embeddingDimensions?: number;
};
export type MemoryUpdateInput = {
@@ -50,6 +51,7 @@ export type MemoryUpdateInput = {
tags?: Tag[];
metadata?: MemoryMetadata;
embedding?: number[];
+ embeddingDimensions?: number;
};
export type MemoryFilter = {
diff --git a/supabase/migrations/002_variable_embedding_dimensions.sql b/supabase/migrations/002_variable_embedding_dimensions.sql
new file mode 100644
index 0000000..522df47
--- /dev/null
+++ b/supabase/migrations/002_variable_embedding_dimensions.sql
@@ -0,0 +1,62 @@
+drop index if exists memories_embedding_idx;
+
+alter table public.memories
+ drop column if exists embedding;
+
+alter table public.memories
+ add column embedding vector,
+ add column embedding_dimensions integer;
+
+create index memories_embedding_idx on public.memories using hnsw (embedding vector_cosine_ops);
+
+drop function if exists public.search_memories(vector(1536), float, int, uuid, uuid);
+
+create or replace function public.search_memories(
+ query_embedding vector,
+ match_threshold float default 0.7,
+ match_count int default 10,
+ filter_project_id uuid default null,
+ filter_folder_id uuid default null,
+ required_dimensions int default null
+)
+returns table (
+ id uuid,
+ content text,
+ project_id uuid,
+ folder_id uuid,
+ tags jsonb,
+ metadata jsonb,
+ similarity float,
+ created_at timestamptz,
+ updated_at timestamptz
+)
+language plpgsql
+security definer
+as $$
+declare
+ query_dimensions int;
+begin
+ query_dimensions := array_length(query_embedding::float[], 1);
+
+ return query
+ select
+ m.id,
+ m.content,
+ m.project_id,
+ m.folder_id,
+ m.tags,
+ m.metadata,
+ 1 - (m.embedding <=> query_embedding) as similarity,
+ m.created_at,
+ m.updated_at
+ from public.memories m
+ where m.user_id = auth.uid()
+ and m.embedding is not null
+ and m.embedding_dimensions = query_dimensions
+ and 1 - (m.embedding <=> query_embedding) > match_threshold
+ and (filter_project_id is null or m.project_id = filter_project_id)
+ and (filter_folder_id is null or m.folder_id = filter_folder_id)
+ order by m.embedding <=> query_embedding
+ limit match_count;
+end;
+$$;