Module: LLM::ActiveRecord::ActsAsLLM::InstanceMethods

Defined in:
lib/llm/active_record/acts_as_llm.rb

Instance Method Summary collapse

Instance Method Details

#llm ⇒ LLM::Provider

Returns the resolved provider instance for this record.

Returns:



302
303
304
305
306
307
308
# File 'lib/llm/active_record/acts_as_llm.rb', line 302

def llm
  options = self.class.llm_plugin_options
  return @llm if @llm
  @llm = Utils.resolve_provider(self, options, EMPTY_HASH)
  @llm.tracer = Utils.resolve_option(self, options[:tracer]) if options[:tracer]
  @llm
end

#ask ⇒ LLM::Response

Continues the stored context with new input.

The conversation is saved by LLM::Step at each request.

Returns:

See Also:



79
80
81
# File 'lib/llm/active_record/acts_as_llm.rb', line 79

def ask(...)
  __context__.ask(...)
end

#wait ⇒ Array<LLM::Function::Return>

Waits for queued tool work to finish.

Returns:

See Also:



87
88
89
# File 'lib/llm/active_record/acts_as_llm.rb', line 87

def wait(...)
  __context__.wait(...)
end

#mode ⇒ Symbol

Returns:

  • (Symbol)

See Also:



94
95
96
# File 'lib/llm/active_record/acts_as_llm.rb', line 94

def mode
  __context__.mode
end

#messages ⇒ ActiveRecord::Relation, LLM::Buffer

Note:

A record that stores its state as jsonb reads them from the column, as a relation: the conversation can be filtered, counted and ordered in the database, and nothing here needs a provider to be built. Every other format loads the runtime and hands back the messages it holds.

Returns the messages this record holds.

Returns:

See Also:



112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/llm/active_record/acts_as_llm.rb', line 112

def messages
  if defined?(@messages)
    @messages
  else
    @messages = begin
      options = self.class.llm_plugin_options
      if options[:format] == :jsonb
        LLM::ActiveRecord::Message.for(record: self)
      else
        __context__.messages
      end
    end
  end
end

#messages! ⇒ LLM::Buffer

Returns the messages the runtime holds

Returns:

See Also:



131
132
133
# File 'lib/llm/active_record/acts_as_llm.rb', line 131

def messages!
  __context__.messages
end

#pending_functions ⇒ Array<LLM::Function>

Returns:

See Also:



138
139
140
# File 'lib/llm/active_record/acts_as_llm.rb', line 138

def pending_functions
  __context__.pending_functions
end

#pending_functions? ⇒ Boolean

Returns:

  • (Boolean)

See Also:



145
146
147
# File 'lib/llm/active_record/acts_as_llm.rb', line 145

def pending_functions?
  __context__.pending_functions?
end

#returns ⇒ Array<LLM::Function::Return>

Returns:

See Also:



152
153
154
# File 'lib/llm/active_record/acts_as_llm.rb', line 152

def returns
  __context__.returns
end

#cost ⇒ LLM::Cost

Returns:

See Also:



159
160
161
# File 'lib/llm/active_record/acts_as_llm.rb', line 159

def cost
  __context__.cost
end

#model! ⇒ String

Returns:

  • (String)

See Also:



166
167
168
169
170
171
172
173
# File 'lib/llm/active_record/acts_as_llm.rb', line 166

def model!
  if defined?(@model)
    @model
  else
    @model = __data__&.dig("model") ||
             __context__.model
  end
end

#compactor ⇒ LLM::Compactor?

Returns:

See Also:



178
179
180
# File 'lib/llm/active_record/acts_as_llm.rb', line 178

def compactor
  __context__.compactor
end

#compactor_options ⇒ Hash

Returns:

  • (Hash)

See Also:



185
186
187
# File 'lib/llm/active_record/acts_as_llm.rb', line 185

def compactor_options
  __context__.compactor_options
end

#context_window ⇒ Integer?

Returns the overall size of the context window.

Returns:

  • (Integer, nil)

See Also:



193
194
195
196
197
198
199
200
# File 'lib/llm/active_record/acts_as_llm.rb', line 193

def context_window
  if defined?(@context_window)
    @context_window
  else
    @context_window = __data__&.dig("context_window") ||
                      __context__.context_window
  end
end

#context_used ⇒ Integer?

Returns how many tokens have been used.

Returns:

  • (Integer, nil)

See Also:



206
207
208
209
210
211
212
# File 'lib/llm/active_record/acts_as_llm.rb', line 206

def context_used
  if defined?(@context_used)
    @context_used
  else
    @context_used = __data__&.dig("context_used")
  end
end

#context_usage ⇒ Rational?

Returns context window usage as a Rational

Returns:

  • (Rational, nil)


217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/llm/active_record/acts_as_llm.rb', line 217

def context_usage
  if defined?(@context_usage)
    @context_usage
  else
    @context_usage = begin
      if [context_used, context_window].any?(&:nil?)
        nil
      else
        Rational(context_used, context_window)
      end
    end
  end
end

#token_usage ⇒ LLM::Usage Also known as: usage

Returns the accumulated token usage

Returns:

See Also:



235
236
237
238
239
240
241
242
243
244
245
# File 'lib/llm/active_record/acts_as_llm.rb', line 235

def token_usage
  if defined?(@token_usage)
    @token_usage
  else
    @token_usage = begin
      usage   = __data__&.dig("token_usage") || {}
      fields  = LLM::Usage.fields.to_h { [_1.to_sym, usage[_1]] }
      LLM::Usage.new(**fields.transform_values { _1 || 0 })
    end
  end
end

#interrupt! ⇒ nil Also known as: cancel!

Returns:

  • (nil)

See Also:



251
252
253
# File 'lib/llm/active_record/acts_as_llm.rb', line 251

def interrupt!
  __context__.interrupt!
end

#prompt ⇒ LLM::Prompt Also known as: build_prompt

Returns:

See Also:



259
260
261
# File 'lib/llm/active_record/acts_as_llm.rb', line 259

def prompt(&)
  __context__.prompt(&)
end

#image_url ⇒ LLM::Object

Returns:

See Also:



267
268
269
# File 'lib/llm/active_record/acts_as_llm.rb', line 267

def image_url(...)
  __context__.image_url(...)
end

#local_file ⇒ LLM::Object

Returns:

See Also:



274
275
276
# File 'lib/llm/active_record/acts_as_llm.rb', line 274

def local_file(...)
  __context__.local_file(...)
end

#remote_file ⇒ LLM::Object

Returns:

See Also:



281
282
283
# File 'lib/llm/active_record/acts_as_llm.rb', line 281

def remote_file(...)
  __context__.remote_file(...)
end

#tracer ⇒ LLM::Tracer

Returns:

See Also:



288
289
290
# File 'lib/llm/active_record/acts_as_llm.rb', line 288

def tracer
  __context__.tracer
end

#unwrap! ⇒ LLM::Context, LLM::Agent

Returns the runtime this record wraps.

Returns:



295
296
297
# File 'lib/llm/active_record/acts_as_llm.rb', line 295

def unwrap!
  __context__
end

#talk ⇒ LLM::Response

Continues the stored context with new input.

The conversation is saved by LLM::Step at each request.

Returns:

See Also:



69
70
71
# File 'lib/llm/active_record/acts_as_llm.rb', line 69

def talk(...)
  __context__.talk(...)
end