Class: RailsConsoleAi::Agent

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/rails_console_ai/agent.rb

Constant Summary collapse

STATUS_PROPOSED =
'proposed'.freeze
STATUS_APPROVED =
'approved'.freeze
STATUSES =
[STATUS_PROPOSED, STATUS_APPROVED].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.connectionObject



28
29
30
31
32
33
34
35
36
# File 'app/models/rails_console_ai/agent.rb', line 28

def self.connection
  klass = RailsConsoleAi.configuration.connection_class
  if klass
    klass = Object.const_get(klass) if klass.is_a?(String)
    klass.connection
  else
    super
  end
end

.record_use!(id) ⇒ Object



56
57
58
59
60
61
62
63
64
65
# File 'app/models/rails_console_ai/agent.rb', line 56

def self.record_use!(id)
  where(id: id).update_all([
    'use_count = COALESCE(use_count, 0) + 1, last_used_at = ?',
    Time.now.utc
  ])
  true
rescue ::ActiveRecord::ActiveRecordError => e
  RailsConsoleAi.logger.warn("RailsConsoleAi::Agent.record_use!(#{id.inspect}) failed: #{e.message}")
  false
end

Instance Method Details

#approve!(approved_by:) ⇒ Object

Raises:

  • (ArgumentError)


110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'app/models/rails_console_ai/agent.rb', line 110

def approve!(approved_by:)
  raise ArgumentError, 'approved_by is required' if approved_by.to_s.strip.empty?

  update_with_version!(
    {
      status:      STATUS_APPROVED,
      approved_by: approved_by,
      approved_at: Time.now.utc
    },
    edited_by: approved_by,
    change_note: "Approved by #{approved_by}",
    preserve_approval: true
  )
end

#approved?Boolean

Returns:

  • (Boolean)


54
# File 'app/models/rails_console_ai/agent.rb', line 54

def approved?; status.to_s == STATUS_APPROVED; end

#bodyObject



48
# File 'app/models/rails_console_ai/agent.rb', line 48

def body;        parsed['body']; end

#content=(value) ⇒ Object



42
43
44
45
# File 'app/models/rails_console_ai/agent.rb', line 42

def content=(value)
  @parsed = nil
  super
end

#descriptionObject



47
# File 'app/models/rails_console_ai/agent.rb', line 47

def description; parsed['description']; end

#max_roundsObject



49
# File 'app/models/rails_console_ai/agent.rb', line 49

def max_rounds;  parsed['max_rounds']; end

#modelObject



50
# File 'app/models/rails_console_ai/agent.rb', line 50

def model;       parsed['model']; end

#parsedObject



38
39
40
# File 'app/models/rails_console_ai/agent.rb', line 38

def parsed
  @parsed ||= (RailsConsoleAi::AgentLoader.parse(content.to_s) || {})
end

#proposed?Boolean

Returns:

  • (Boolean)


53
# File 'app/models/rails_console_ai/agent.rb', line 53

def proposed?; status.to_s == STATUS_PROPOSED; end

#to_hashObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/models/rails_console_ai/agent.rb', line 67

def to_hash
  {
    'id'           => id,
    'name'         => name,
    'description'  => description,
    'body'         => body,
    'max_rounds'   => max_rounds,
    'model'        => model,
    'tools'        => tools,
    'content'      => content,
    'status'       => status,
    'approved_by'  => approved_by,
    'approved_at'  => approved_at,
    'use_count'    => use_count,
    'last_used_at' => last_used_at,
    'source'       => :db,
    'updated_at'   => updated_at
  }
end

#toolsObject



51
# File 'app/models/rails_console_ai/agent.rb', line 51

def tools;       Array(parsed['tools']); end

#update_with_version!(attrs, edited_by: nil, change_note: nil, preserve_approval: false) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'app/models/rails_console_ai/agent.rb', line 87

def update_with_version!(attrs, edited_by: nil, change_note: nil, preserve_approval: false)
  transaction do
    assign_attributes(attrs)

    if !preserve_approval && approved? && changes.key?('content')
      self.status      = STATUS_PROPOSED
      self.approved_by = nil
      self.approved_at = nil
    end

    save!
    RailsConsoleAi::AgentVersion.create!(
      agent_id:    id,
      name:        name,
      content:     content,
      status:      status,
      edited_by:   edited_by,
      change_note: change_note
    )
  end
  self
end