Class: LLM::Agent
- Inherits:
-
Object
- Object
- LLM::Agent
- Defined in:
- lib/llm/agent.rb
Overview
LLM::Agent provides a class-level DSL for defining reusable, preconfigured assistants with defaults for model, tools, schema, and instructions.
It wraps the same stateful runtime surface as LLM::Context: message history, usage, persistence, streaming parameters, and provider-backed requests still flow through an underlying context. The defining behavior of an agent is that it automatically resolves pending tool calls for you during ‘talk` and `respond`, instead of leaving tool loops to the caller.
Notes:
-
Instructions are injected only on the first request.
-
An agent automatically executes tool loops (unlike LLM::Context).
-
Tool loop execution can be configured with ‘concurrency :call`, `:thread`, `:task`, `:fiber`, `:ractor`, or a list of queued task types such as `[:thread, :ractor]`.
Instance Attribute Summary collapse
-
#llm ⇒ LLM::Provider
readonly
Returns a provider.
Class Method Summary collapse
-
.concurrency(concurrency = nil) ⇒ Symbol, ...
Set or get the tool execution concurrency.
-
.instructions(instructions = nil) ⇒ String?
Set or get the default instructions.
-
.model(model = nil) ⇒ String?
Set or get the default model.
-
.schema(schema = nil) ⇒ #to_json?
Set or get the default schema.
-
.skills(*skills) ⇒ Array<String>?
Set or get the default skills.
-
.tools(*tools) ⇒ Array<LLM::Function>
Set or get the default tools.
Instance Method Summary collapse
- #call ⇒ Object
-
#concurrency ⇒ Symbol, ...
Returns the configured tool execution concurrency.
- #context_window ⇒ Integer
- #cost ⇒ LLM::Cost
- #deserialize(**kw) ⇒ Object (also: #restore)
- #functions ⇒ Array<LLM::Function>
-
#image_url(url) ⇒ LLM::Object
Returns a tagged object.
-
#initialize(llm, params = {}) ⇒ Agent
constructor
A new instance of Agent.
- #inspect ⇒ String
-
#interrupt! ⇒ nil
(also: #cancel!)
Interrupt the active request, if any.
-
#local_file(path) ⇒ LLM::Object
Returns a tagged object.
- #messages ⇒ LLM::Buffer<LLM::Message>
- #mode ⇒ Symbol
-
#model ⇒ String
Returns the model an Agent is actively using.
- #prompt(&b) ⇒ LLM::Prompt (also: #build_prompt)
-
#remote_file(res) ⇒ LLM::Object
Returns a tagged object.
-
#respond(prompt, params = {}) ⇒ LLM::Response
Maintain a conversation via the responses API.
- #returns ⇒ Array<LLM::Function::Return>
- #serialize(**kw) ⇒ void (also: #save)
-
#talk(prompt, params = {}) ⇒ LLM::Response
(also: #chat)
Maintain a conversation via the chat completions API.
- #to_h ⇒ Hash
- #to_json ⇒ String
-
#tracer ⇒ LLM::Tracer
Returns an LLM tracer.
- #usage ⇒ LLM::Object
- #wait ⇒ Array<LLM::Function::Return>
Constructor Details
#initialize(llm, params = {}) ⇒ Agent
Returns a new instance of Agent.
127 128 129 130 131 132 |
# File 'lib/llm/agent.rb', line 127 def initialize(llm, params = {}) defaults = {model: self.class.model, tools: self.class.tools, skills: self.class.skills, schema: self.class.schema}.compact @concurrency = params.delete(:concurrency) || self.class.concurrency @llm = llm @ctx = LLM::Context.new(llm, defaults.merge(params)) end |
Instance Attribute Details
#llm ⇒ LLM::Provider (readonly)
Returns a provider
38 39 40 |
# File 'lib/llm/agent.rb', line 38 def llm @llm end |
Class Method Details
.concurrency(concurrency = nil) ⇒ Symbol, ...
Set or get the tool execution concurrency.
110 111 112 113 |
# File 'lib/llm/agent.rb', line 110 def self.concurrency(concurrency = nil) return @concurrency if concurrency.nil? @concurrency = concurrency end |
.instructions(instructions = nil) ⇒ String?
Set or get the default instructions
90 91 92 93 |
# File 'lib/llm/agent.rb', line 90 def self.instructions(instructions = nil) return @instructions if instructions.nil? @instructions = instructions end |
.model(model = nil) ⇒ String?
Set or get the default model
46 47 48 49 |
# File 'lib/llm/agent.rb', line 46 def self.model(model = nil) return @model if model.nil? @model = model end |
.schema(schema = nil) ⇒ #to_json?
Set or get the default schema
79 80 81 82 |
# File 'lib/llm/agent.rb', line 79 def self.schema(schema = nil) return @schema if schema.nil? @schema = schema end |
.skills(*skills) ⇒ Array<String>?
Set or get the default skills
68 69 70 71 |
# File 'lib/llm/agent.rb', line 68 def self.skills(*skills) return @skills if skills.empty? @skills = skills.flatten end |
.tools(*tools) ⇒ Array<LLM::Function>
Set or get the default tools
57 58 59 60 |
# File 'lib/llm/agent.rb', line 57 def self.tools(*tools) return @tools || [] if tools.empty? @tools = tools.flatten end |
Instance Method Details
#concurrency ⇒ Symbol, ...
Returns the configured tool execution concurrency.
290 291 292 |
# File 'lib/llm/agent.rb', line 290 def concurrency @concurrency end |
#context_window ⇒ Integer
304 305 306 |
# File 'lib/llm/agent.rb', line 304 def context_window @ctx.context_window end |
#deserialize(**kw) ⇒ Object Also known as: restore
339 340 341 |
# File 'lib/llm/agent.rb', line 339 def deserialize(**kw) @ctx.deserialize(**kw) end |
#functions ⇒ Array<LLM::Function>
192 193 194 |
# File 'lib/llm/agent.rb', line 192 def functions @ctx.functions end |
#image_url(url) ⇒ LLM::Object
Returns a tagged object
245 246 247 |
# File 'lib/llm/agent.rb', line 245 def image_url(url) @ctx.image_url(url) end |
#inspect ⇒ String
323 324 325 326 |
# File 'lib/llm/agent.rb', line 323 def inspect "#<#{self.class.name}:0x#{object_id.to_s(16)} " \ "@llm=#{@llm.class}, @mode=#{mode.inspect}, @messages=#{.inspect}>" end |
#interrupt! ⇒ nil Also known as: cancel!
Interrupt the active request, if any.
226 227 228 |
# File 'lib/llm/agent.rb', line 226 def interrupt! @ctx.interrupt! end |
#local_file(path) ⇒ LLM::Object
Returns a tagged object
254 255 256 |
# File 'lib/llm/agent.rb', line 254 def local_file(path) @ctx.local_file(path) end |
#mode ⇒ Symbol
283 284 285 |
# File 'lib/llm/agent.rb', line 283 def mode @ctx.mode end |
#model ⇒ String
Returns the model an Agent is actively using
277 278 279 |
# File 'lib/llm/agent.rb', line 277 def model @ctx.model end |
#prompt(&b) ⇒ LLM::Prompt Also known as: build_prompt
235 236 237 |
# File 'lib/llm/agent.rb', line 235 def prompt(&b) @ctx.prompt(&b) end |
#remote_file(res) ⇒ LLM::Object
Returns a tagged object
263 264 265 |
# File 'lib/llm/agent.rb', line 263 def remote_file(res) @ctx.remote_file(res) end |
#respond(prompt, params = {}) ⇒ LLM::Response
Not all LLM providers support this API
Maintain a conversation via the responses API. This method immediately sends a request to the LLM and returns the response.
173 174 175 176 177 178 179 180 181 182 |
# File 'lib/llm/agent.rb', line 173 def respond(prompt, params = {}) max = Integer(params.delete(:tool_attempts) || 10) res = @ctx.respond(apply_instructions(prompt), params) max.times do break if @ctx.functions.empty? res = @ctx.respond(call_functions, params) end raise LLM::ToolLoopError, "pending tool calls remain" unless @ctx.functions.empty? res end |
#returns ⇒ Array<LLM::Function::Return>
199 200 201 |
# File 'lib/llm/agent.rb', line 199 def returns @ctx.returns end |
#serialize(**kw) ⇒ void Also known as: save
This method returns an undefined value.
331 332 333 |
# File 'lib/llm/agent.rb', line 331 def serialize(**kw) @ctx.serialize(**kw) end |
#talk(prompt, params = {}) ⇒ LLM::Response Also known as: chat
Maintain a conversation via the chat completions API. This method immediately sends a request to the LLM and returns the response.
147 148 149 150 151 152 153 154 155 156 |
# File 'lib/llm/agent.rb', line 147 def talk(prompt, params = {}) max = Integer(params.delete(:tool_attempts) || 10) res = @ctx.talk(apply_instructions(prompt), params) max.times do break if @ctx.functions.empty? res = @ctx.talk(call_functions, params) end raise LLM::ToolLoopError, "pending tool calls remain" unless @ctx.functions.empty? res end |
#to_h ⇒ Hash
311 312 313 |
# File 'lib/llm/agent.rb', line 311 def to_h @ctx.to_h end |
#to_json ⇒ String
317 318 319 |
# File 'lib/llm/agent.rb', line 317 def to_json(...) to_h.to_json(...) end |
#tracer ⇒ LLM::Tracer
Returns an LLM tracer
270 271 272 |
# File 'lib/llm/agent.rb', line 270 def tracer @ctx.tracer end |
#wait ⇒ Array<LLM::Function::Return>
213 214 215 |
# File 'lib/llm/agent.rb', line 213 def wait(...) @ctx.wait(...) end |