Class: Llmemory::LongTerm::Procedural::Skill

Inherits:
Object
  • Object
show all
Defined in:
lib/llmemory/long_term/procedural/skill.rb

Overview

A Skill is a reusable procedure an agent can retrieve and apply: a prompt, a template or a snippet of code. This is CoALA’s “procedural memory” in the Voyager sense — a growing library of skills the agent learns and reuses.

Skills track success/failure outcomes so proven skills can be preferred over unproven ones during retrieval (see #success_rate, and P8 adaptive retrieval).

Constant Summary collapse

KINDS =
%w[prompt template code].freeze
DEFAULT_KIND =
"prompt"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, user_id:, name:, body:, description: nil, kind: DEFAULT_KIND, version: 1, success_count: 0, failure_count: 0, created_at: nil, updated_at: nil) ⇒ Skill

Returns a new instance of Skill.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/llmemory/long_term/procedural/skill.rb', line 22

def initialize(id:, user_id:, name:, body:, description: nil, kind: DEFAULT_KIND,
               version: 1, success_count: 0, failure_count: 0, created_at: nil, updated_at: nil)
  @id = id
  @user_id = user_id
  @name = name.to_s
  @description = description
  @body = body
  @kind = normalize_kind(kind)
  @version = version.to_i
  @success_count = success_count.to_i
  @failure_count = failure_count.to_i
  @created_at = created_at || Time.now
  @updated_at = updated_at || @created_at
end

Instance Attribute Details

#bodyObject (readonly)

Returns the value of attribute body.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def body
  @body
end

#created_atObject (readonly)

Returns the value of attribute created_at.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def created_at
  @created_at
end

#descriptionObject (readonly)

Returns the value of attribute description.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def description
  @description
end

#failure_countObject (readonly)

Returns the value of attribute failure_count.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def failure_count
  @failure_count
end

#idObject (readonly)

Returns the value of attribute id.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def id
  @id
end

#kindObject (readonly)

Returns the value of attribute kind.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def kind
  @kind
end

#nameObject (readonly)

Returns the value of attribute name.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def name
  @name
end

#success_countObject (readonly)

Returns the value of attribute success_count.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def success_count
  @success_count
end

#updated_atObject (readonly)

Returns the value of attribute updated_at.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def updated_at
  @updated_at
end

#user_idObject (readonly)

Returns the value of attribute user_id.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def user_id
  @user_id
end

#versionObject (readonly)

Returns the value of attribute version.



19
20
21
# File 'lib/llmemory/long_term/procedural/skill.rb', line 19

def version
  @version
end

Class Method Details

.from_h(hash) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/llmemory/long_term/procedural/skill.rb', line 52

def self.from_h(hash)
  new(
    id: hash[:id] || hash["id"],
    user_id: hash[:user_id] || hash["user_id"],
    name: hash[:name] || hash["name"],
    description: hash[:description] || hash["description"],
    body: hash[:body] || hash["body"],
    kind: hash[:kind] || hash["kind"] || DEFAULT_KIND,
    version: hash[:version] || hash["version"] || 1,
    success_count: hash[:success_count] || hash["success_count"] || 0,
    failure_count: hash[:failure_count] || hash["failure_count"] || 0,
    created_at: parse_time(hash[:created_at] || hash["created_at"]),
    updated_at: parse_time(hash[:updated_at] || hash["updated_at"])
  )
end

.parse_time(value) ⇒ Object



68
69
70
71
72
73
# File 'lib/llmemory/long_term/procedural/skill.rb', line 68

def self.parse_time(value)
  return value if value.nil? || value.is_a?(Time)
  Time.parse(value.to_s)
rescue ArgumentError
  nil
end

Instance Method Details

#normalize_kind(kind) ⇒ Object



47
48
49
50
# File 'lib/llmemory/long_term/procedural/skill.rb', line 47

def normalize_kind(kind)
  k = kind.to_s.strip.downcase
  KINDS.include?(k) ? k : DEFAULT_KIND
end

#searchable_textObject



43
44
45
# File 'lib/llmemory/long_term/procedural/skill.rb', line 43

def searchable_text
  [name, description, body].compact.map(&:to_s).reject(&:empty?).join("\n")
end

#success_rateObject

Proven utility in [0, 1]. Unproven skills (no outcomes) are neutral.



38
39
40
41
# File 'lib/llmemory/long_term/procedural/skill.rb', line 38

def success_rate
  total = success_count + failure_count
  total.zero? ? 0.5 : success_count.to_f / total
end

#to_hObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/llmemory/long_term/procedural/skill.rb', line 75

def to_h
  {
    id: id,
    user_id: user_id,
    name: name,
    description: description,
    body: body,
    kind: kind,
    version: version,
    success_count: success_count,
    failure_count: failure_count,
    created_at: created_at.respond_to?(:iso8601) ? created_at.iso8601(6) : created_at,
    updated_at: updated_at.respond_to?(:iso8601) ? updated_at.iso8601(6) : updated_at
  }
end