Class: Engram::Adapters::PgvectorStore
- Inherits:
-
Object
- Object
- Engram::Adapters::PgvectorStore
- Includes:
- Ports::MemoryStore
- Defined in:
- lib/engram/adapters/pgvector_store.rb
Overview
MemoryStore backed by PostgreSQL + pgvector via the ‘neighbor` gem.
Requires the host app to provide ActiveRecord, the ‘neighbor` gem, and an AR model (default: Engram::MemoryRecord) created by the install generator. These are NOT hard dependencies of engram; this adapter only references them at call time.
Instance Method Summary collapse
- #add(record) ⇒ Object
- #all(scope:) ⇒ Object
- #delete(id:) ⇒ Object
-
#initialize(model: nil) ⇒ PgvectorStore
constructor
A new instance of PgvectorStore.
- #search(embedding:, scope:, limit:, kinds: nil) ⇒ Object
- #touch(id:, at: Time.now) ⇒ Object
- #update(id:, record:) ⇒ Object
Constructor Details
#initialize(model: nil) ⇒ PgvectorStore
Returns a new instance of PgvectorStore.
13 14 15 |
# File 'lib/engram/adapters/pgvector_store.rb', line 13 def initialize(model: nil) @model = model end |
Instance Method Details
#add(record) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/engram/adapters/pgvector_store.rb', line 17 def add(record) validate_scope!(record.scope) row = model.create!( content: record.content, scope: record.scope, kind: record.kind.to_s, importance: record.importance, metadata: record., embedding: record. ) to_record(row) end |
#all(scope:) ⇒ Object
42 43 44 |
# File 'lib/engram/adapters/pgvector_store.rb', line 42 def all(scope:) model.where(scope: scope).map { |row| to_record(row) } end |
#delete(id:) ⇒ Object
58 59 60 |
# File 'lib/engram/adapters/pgvector_store.rb', line 58 def delete(id:) model.where(id: id).delete_all end |
#search(embedding:, scope:, limit:, kinds: nil) ⇒ Object
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/engram/adapters/pgvector_store.rb', line 31 def search(embedding:, scope:, limit:, kinds: nil) query = model.where(scope: scope) normalized_kinds = normalize_kinds(kinds) query = query.where(kind: normalized_kinds) if normalized_kinds query .nearest_neighbors(:embedding, , distance: "cosine") .limit(limit) .map { |row| to_record(row) } end |
#touch(id:, at: Time.now) ⇒ Object
62 63 64 |
# File 'lib/engram/adapters/pgvector_store.rb', line 62 def touch(id:, at: Time.now) model.where(id: id).update_all(last_accessed_at: at) end |
#update(id:, record:) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/engram/adapters/pgvector_store.rb', line 46 def update(id:, record:) row = model.find(id) row.update!( content: record.content, kind: record.kind.to_s, importance: record.importance, metadata: record., embedding: record. ) to_record(row) end |