Class: Layered::Assistant::Conversation

Inherits:
ApplicationRecord show all
Defined in:
app/models/layered/assistant/conversation.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.default_nameObject



34
35
36
# File 'app/models/layered/assistant/conversation.rb', line 34

def self.default_name
  "New conversation"
end

Instance Method Details

#responding?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'app/models/layered/assistant/conversation.rb', line 38

def responding?
  messages.where(role: :assistant, stopped: false, output_tokens: nil).exists?
end

#stop_response!Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'app/models/layered/assistant/conversation.rb', line 42

def stop_response!
  with_lock do
    message = messages.where(role: :assistant, stopped: false).order(created_at: :desc).first
    return false unless message

    attrs = {
      stopped: true,
      output_tokens: TokenEstimator.estimate(message.content) || 0,
      tokens_estimated: true
    }

    if message.input_tokens.nil?
      prior_content = messages.where("created_at < ?", message.created_at).pluck(:content).compact.join(" ")
      attrs[:input_tokens] = TokenEstimator.estimate(prior_content) || 0
    end

    message.update!(attrs)
    update_token_totals!
    message.reload
    message.broadcast_updated
    message.broadcast_response_complete
  end

  true
end

#to_paramObject



23
24
25
# File 'app/models/layered/assistant/conversation.rb', line 23

def to_param
  uid
end

#update_name_from_content!(content) ⇒ Object



68
69
70
71
72
73
74
75
# File 'app/models/layered/assistant/conversation.rb', line 68

def update_name_from_content!(content)
  return unless name == self.class.default_name
  return if content.blank?

  old_name = name
  update!(name: content.truncate(60))
  broadcast_name_updated(old_name)
end

#update_token_totals!Object

Name



28
29
30
31
32
# File 'app/models/layered/assistant/conversation.rb', line 28

def update_token_totals!
  input = messages.sum(:input_tokens)
  output = messages.sum(:output_tokens)
  update!(input_tokens: input, output_tokens: output, token_estimate: input + output)
end