engram 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +118 -0
- data/README.md +409 -39
- data/lib/engram/adapters/in_memory_processed_turns.rb +40 -8
- data/lib/engram/adapters/in_memory_store.rb +49 -11
- data/lib/engram/adapters/null_embedder.rb +9 -0
- data/lib/engram/adapters/pgvector_store.rb +67 -20
- data/lib/engram/adapters/ruby_llm_embedder.rb +45 -4
- data/lib/engram/configuration.rb +5 -1
- data/lib/engram/consolidators/heuristic_consolidator.rb +7 -1
- data/lib/engram/consolidators/llm_consolidator.rb +44 -12
- data/lib/engram/embedding_metadata.rb +135 -0
- data/lib/engram/extractors/llm_extractor.rb +16 -6
- data/lib/engram/instrumentation.rb +57 -0
- data/lib/engram/memory.rb +42 -17
- data/lib/engram/memory_kind.rb +19 -0
- data/lib/engram/persistence.rb +39 -0
- data/lib/engram/persistence_policy.rb +45 -0
- data/lib/engram/ports/memory_store.rb +16 -8
- data/lib/engram/ports/processed_turns.rb +16 -8
- data/lib/engram/provenance.rb +257 -0
- data/lib/engram/rails/cache_processed_turns.rb +51 -10
- data/lib/engram/rails/observe_job.rb +5 -0
- data/lib/engram/rails/tasks.rake +26 -0
- data/lib/engram/railtie.rb +4 -0
- data/lib/engram/record.rb +8 -3
- data/lib/engram/reserved_metadata.rb +52 -0
- data/lib/engram/use_cases/forget.rb +6 -2
- data/lib/engram/use_cases/inject.rb +17 -3
- data/lib/engram/use_cases/observe.rb +83 -19
- data/lib/engram/use_cases/rebuild_embeddings.rb +189 -0
- data/lib/engram/use_cases/recall.rb +28 -9
- data/lib/engram/version.rb +1 -1
- data/lib/engram.rb +11 -0
- data/lib/generators/engram/install_generator.rb +10 -0
- data/lib/generators/engram/templates/create_engram_memories.rb.tt +10 -3
- metadata +14 -4
data/lib/engram.rb
CHANGED
|
@@ -3,9 +3,16 @@
|
|
|
3
3
|
require_relative "engram/version"
|
|
4
4
|
require_relative "engram/configuration"
|
|
5
5
|
require_relative "engram/math"
|
|
6
|
+
require_relative "engram/reserved_metadata"
|
|
7
|
+
require_relative "engram/embedding_metadata"
|
|
8
|
+
require_relative "engram/provenance"
|
|
9
|
+
require_relative "engram/memory_kind"
|
|
6
10
|
require_relative "engram/record"
|
|
7
11
|
require_relative "engram/decision"
|
|
8
12
|
require_relative "engram/turn_digest"
|
|
13
|
+
require_relative "engram/persistence_policy"
|
|
14
|
+
require_relative "engram/instrumentation"
|
|
15
|
+
require_relative "engram/persistence"
|
|
9
16
|
|
|
10
17
|
# Ports (contracts)
|
|
11
18
|
require_relative "engram/ports/memory_store"
|
|
@@ -20,6 +27,7 @@ require_relative "engram/use_cases/recall"
|
|
|
20
27
|
require_relative "engram/use_cases/inject"
|
|
21
28
|
require_relative "engram/use_cases/observe"
|
|
22
29
|
require_relative "engram/use_cases/forget"
|
|
30
|
+
require_relative "engram/use_cases/rebuild_embeddings"
|
|
23
31
|
|
|
24
32
|
# Built-in adapters (pure Ruby, no external deps)
|
|
25
33
|
require_relative "engram/adapters/in_memory_store"
|
|
@@ -47,6 +55,9 @@ require_relative "engram/integrations/ruby_llm"
|
|
|
47
55
|
module Engram
|
|
48
56
|
class Error < StandardError; end
|
|
49
57
|
|
|
58
|
+
# Raised when a live claim suppresses an observation that has not completed.
|
|
59
|
+
class ObservationInProgressError < Error; end
|
|
60
|
+
|
|
50
61
|
class << self
|
|
51
62
|
def config
|
|
52
63
|
@config ||= Configuration.new
|
|
@@ -17,6 +17,10 @@ module Engram
|
|
|
17
17
|
class_option :dimensions, type: :numeric, default: DEFAULT_DIMENSIONS,
|
|
18
18
|
desc: "Embedding dimensions (match your embedding model)"
|
|
19
19
|
|
|
20
|
+
def validate_dimensions
|
|
21
|
+
validate_dimensions!
|
|
22
|
+
end
|
|
23
|
+
|
|
20
24
|
def create_migration_file
|
|
21
25
|
migration_template "create_engram_memories.rb.tt",
|
|
22
26
|
"db/migrate/create_engram_memories.rb"
|
|
@@ -40,6 +44,12 @@ module Engram
|
|
|
40
44
|
options[:dimensions]
|
|
41
45
|
end
|
|
42
46
|
|
|
47
|
+
def validate_dimensions!
|
|
48
|
+
return if dimensions.is_a?(Integer) && dimensions.positive?
|
|
49
|
+
|
|
50
|
+
raise ArgumentError, "dimensions must be a positive integer that matches your embedding model"
|
|
51
|
+
end
|
|
52
|
+
|
|
43
53
|
def migration_version
|
|
44
54
|
"#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}"
|
|
45
55
|
end
|
|
@@ -7,7 +7,7 @@ class CreateEngramMemories < ActiveRecord::Migration[<%= migration_version %>]
|
|
|
7
7
|
create_table :engram_memories do |t|
|
|
8
8
|
t.string :scope, null: false
|
|
9
9
|
t.text :content, null: false
|
|
10
|
-
t.string :kind, null: false, default: "
|
|
10
|
+
t.string :kind, null: false, default: "fact"
|
|
11
11
|
t.float :importance, null: false, default: 1.0
|
|
12
12
|
t.jsonb :metadata, null: false, default: {}
|
|
13
13
|
t.vector :embedding, limit: <%= dimensions %>
|
|
@@ -18,7 +18,14 @@ class CreateEngramMemories < ActiveRecord::Migration[<%= migration_version %>]
|
|
|
18
18
|
|
|
19
19
|
add_index :engram_memories, :scope
|
|
20
20
|
|
|
21
|
-
# For larger datasets,
|
|
22
|
-
#
|
|
21
|
+
# For larger datasets, choose one approximate vector index after backfilling data.
|
|
22
|
+
# HNSW is a strong default for read-heavy recall workloads with frequent inserts.
|
|
23
|
+
# IVFFlat can be smaller/faster to build, but should be created after enough representative data exists.
|
|
24
|
+
#
|
|
25
|
+
# HNSW:
|
|
26
|
+
# add_index :engram_memories, :embedding, using: :hnsw, opclass: :vector_cosine_ops
|
|
27
|
+
# IVFFlat:
|
|
28
|
+
# add_index :engram_memories, :embedding, using: :ivfflat, opclass: :vector_cosine_ops
|
|
29
|
+
# See the Engram README for production index guidance.
|
|
23
30
|
end
|
|
24
31
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: engram
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alexandr Kholodniak
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-07-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: |
|
|
14
14
|
Engram gives AI agents durable, long-term memory. It recalls relevant facts about a
|
|
@@ -36,25 +36,34 @@ files:
|
|
|
36
36
|
- lib/engram/consolidators/heuristic_consolidator.rb
|
|
37
37
|
- lib/engram/consolidators/llm_consolidator.rb
|
|
38
38
|
- lib/engram/decision.rb
|
|
39
|
+
- lib/engram/embedding_metadata.rb
|
|
39
40
|
- lib/engram/extractors/llm_extractor.rb
|
|
41
|
+
- lib/engram/instrumentation.rb
|
|
40
42
|
- lib/engram/integrations/ruby_llm.rb
|
|
41
43
|
- lib/engram/math.rb
|
|
42
44
|
- lib/engram/memory.rb
|
|
45
|
+
- lib/engram/memory_kind.rb
|
|
46
|
+
- lib/engram/persistence.rb
|
|
47
|
+
- lib/engram/persistence_policy.rb
|
|
43
48
|
- lib/engram/ports/completion.rb
|
|
44
49
|
- lib/engram/ports/consolidator.rb
|
|
45
50
|
- lib/engram/ports/embedder.rb
|
|
46
51
|
- lib/engram/ports/extractor.rb
|
|
47
52
|
- lib/engram/ports/memory_store.rb
|
|
48
53
|
- lib/engram/ports/processed_turns.rb
|
|
54
|
+
- lib/engram/provenance.rb
|
|
49
55
|
- lib/engram/rails/cache_processed_turns.rb
|
|
50
56
|
- lib/engram/rails/has_memory.rb
|
|
51
57
|
- lib/engram/rails/observe_job.rb
|
|
58
|
+
- lib/engram/rails/tasks.rake
|
|
52
59
|
- lib/engram/railtie.rb
|
|
53
60
|
- lib/engram/record.rb
|
|
61
|
+
- lib/engram/reserved_metadata.rb
|
|
54
62
|
- lib/engram/turn_digest.rb
|
|
55
63
|
- lib/engram/use_cases/forget.rb
|
|
56
64
|
- lib/engram/use_cases/inject.rb
|
|
57
65
|
- lib/engram/use_cases/observe.rb
|
|
66
|
+
- lib/engram/use_cases/rebuild_embeddings.rb
|
|
58
67
|
- lib/engram/use_cases/recall.rb
|
|
59
68
|
- lib/engram/version.rb
|
|
60
69
|
- lib/generators/engram/install_generator.rb
|
|
@@ -66,8 +75,9 @@ licenses:
|
|
|
66
75
|
- MIT
|
|
67
76
|
metadata:
|
|
68
77
|
homepage_uri: https://github.com/kholdrex/engram
|
|
69
|
-
source_code_uri: https://github.com/kholdrex/engram
|
|
78
|
+
source_code_uri: https://github.com/kholdrex/engram/tree/main
|
|
70
79
|
changelog_uri: https://github.com/kholdrex/engram/blob/main/CHANGELOG.md
|
|
80
|
+
bug_tracker_uri: https://github.com/kholdrex/engram/issues
|
|
71
81
|
rubygems_mfa_required: 'true'
|
|
72
82
|
post_install_message:
|
|
73
83
|
rdoc_options: []
|
|
@@ -84,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
84
94
|
- !ruby/object:Gem::Version
|
|
85
95
|
version: '0'
|
|
86
96
|
requirements: []
|
|
87
|
-
rubygems_version: 3.5.
|
|
97
|
+
rubygems_version: 3.5.22
|
|
88
98
|
signing_key:
|
|
89
99
|
specification_version: 4
|
|
90
100
|
summary: Long-term memory for AI agents in Ruby — stored in your own Postgres.
|