From 67766e3e9f3c57e48bf8e379d5d7186f8bc303bd Mon Sep 17 00:00:00 2001 From: perf3ct Date: Wed, 12 Mar 2025 22:37:49 +0000 Subject: [PATCH] create note_embedding object for becca --- src/becca/entities/bnote_embedding.ts | 73 +++++++++++++++++++++++++++ src/becca/entities/rows.ts | 14 +++++ src/becca/entity_constructor.ts | 2 + 3 files changed, 89 insertions(+) create mode 100644 src/becca/entities/bnote_embedding.ts diff --git a/src/becca/entities/bnote_embedding.ts b/src/becca/entities/bnote_embedding.ts new file mode 100644 index 000000000..2f696ee6f --- /dev/null +++ b/src/becca/entities/bnote_embedding.ts @@ -0,0 +1,73 @@ +import AbstractBeccaEntity from "./abstract_becca_entity.js"; +import dateUtils from "../../services/date_utils.js"; +import type { NoteEmbeddingRow } from "./rows.js"; + +/** + * Entity representing a note's vector embedding for semantic search and AI features + */ +class BNoteEmbedding extends AbstractBeccaEntity { + static get entityName() { + return "note_embeddings"; + } + static get primaryKeyName() { + return "embedId"; + } + static get hashedProperties() { + return ["embedId", "noteId", "providerId", "modelId", "dimension", "version"]; + } + + embedId!: string; + noteId!: string; + providerId!: string; + modelId!: string; + dimension!: number; + embedding!: Buffer; + version!: number; + + constructor(row?: NoteEmbeddingRow) { + super(); + + if (row) { + this.updateFromRow(row); + } + } + + updateFromRow(row: NoteEmbeddingRow): void { + this.embedId = row.embedId; + this.noteId = row.noteId; + this.providerId = row.providerId; + this.modelId = row.modelId; + this.dimension = row.dimension; + this.embedding = row.embedding; + this.version = row.version; + this.dateCreated = row.dateCreated; + this.dateModified = row.dateModified; + this.utcDateCreated = row.utcDateCreated; + this.utcDateModified = row.utcDateModified; + } + + beforeSaving() { + super.beforeSaving(); + + this.dateModified = dateUtils.localNowDateTime(); + this.utcDateModified = dateUtils.utcNowDateTime(); + } + + getPojo(): NoteEmbeddingRow { + return { + embedId: this.embedId, + noteId: this.noteId, + providerId: this.providerId, + modelId: this.modelId, + dimension: this.dimension, + embedding: this.embedding, + version: this.version, + dateCreated: this.dateCreated!, + dateModified: this.dateModified!, + utcDateCreated: this.utcDateCreated, + utcDateModified: this.utcDateModified! + }; + } +} + +export default BNoteEmbedding; diff --git a/src/becca/entities/rows.ts b/src/becca/entities/rows.ts index 3730ed922..6b7d73a7e 100644 --- a/src/becca/entities/rows.ts +++ b/src/becca/entities/rows.ts @@ -139,3 +139,17 @@ export interface NoteRow { utcDateModified: string; content?: string | Buffer; } + +export interface NoteEmbeddingRow { + embedId: string; + noteId: string; + providerId: string; + modelId: string; + dimension: number; + embedding: Buffer; + version: number; + dateCreated: string; + utcDateCreated: string; + dateModified: string; + utcDateModified: string; +} diff --git a/src/becca/entity_constructor.ts b/src/becca/entity_constructor.ts index 18f7a14c7..882f62492 100644 --- a/src/becca/entity_constructor.ts +++ b/src/becca/entity_constructor.ts @@ -6,6 +6,7 @@ import BBlob from "./entities/bblob.js"; import BBranch from "./entities/bbranch.js"; import BEtapiToken from "./entities/betapi_token.js"; import BNote from "./entities/bnote.js"; +import BNoteEmbedding from "./entities/bnote_embedding.js"; import BOption from "./entities/boption.js"; import BRecentNote from "./entities/brecent_note.js"; import BRevision from "./entities/brevision.js"; @@ -19,6 +20,7 @@ const ENTITY_NAME_TO_ENTITY: Record & EntityClass> branches: BBranch, etapi_tokens: BEtapiToken, notes: BNote, + note_embeddings: BNoteEmbedding, options: BOption, recent_notes: BRecentNote, revisions: BRevision