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:) ⇒ 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 |
# File 'lib/engram/adapters/pgvector_store.rb', line 17 def add(record) 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
37 38 39 |
# File 'lib/engram/adapters/pgvector_store.rb', line 37 def all(scope:) model.where(scope: scope).map { |row| to_record(row) } end |
#delete(id:) ⇒ Object
53 54 55 |
# File 'lib/engram/adapters/pgvector_store.rb', line 53 def delete(id:) model.where(id: id).delete_all end |
#search(embedding:, scope:, limit:) ⇒ Object
29 30 31 32 33 34 35 |
# File 'lib/engram/adapters/pgvector_store.rb', line 29 def search(embedding:, scope:, limit:) model .where(scope: scope) .nearest_neighbors(:embedding, , distance: "cosine") .limit(limit) .map { |row| to_record(row) } end |
#touch(id:, at: Time.now) ⇒ Object
57 58 59 |
# File 'lib/engram/adapters/pgvector_store.rb', line 57 def touch(id:, at: Time.now) model.where(id: id).update_all(last_accessed_at: at) end |
#update(id:, record:) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/engram/adapters/pgvector_store.rb', line 41 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 |