Class: LLM::Provider Abstract
- Inherits:
-
Object
- Object
- LLM::Provider
- Includes:
- Transport::Execution
- Defined in:
- lib/llm/provider.rb
Overview
The Provider class represents an abstract class for LLM (Language Model) providers.
Instance Method Summary collapse
-
#assistant_role ⇒ String
Returns the role of the assistant in the conversation.
-
#audio ⇒ LLM::OpenAI::Audio
Returns an interface to the audio API.
-
#chat(prompt, params = {}) ⇒ LLM::Context
Starts a new chat powered by the chat completions API.
-
#complete(prompt, params = {}) ⇒ LLM::Response
Provides an interface to the chat completions API.
-
#default_model ⇒ String
Returns the default model for chat completions.
- #developer_role ⇒ Symbol
-
#embed(input, model: nil, **params) ⇒ LLM::Response
Provides an embedding.
-
#files ⇒ LLM::OpenAI::Files
Returns an interface to the files API.
-
#images ⇒ LLM::OpenAI::Images, LLM::Google::Images
Returns an interface to the images API.
-
#initialize(key:, host:, port: 443, timeout: 180, ssl: true, base_path: "", persistent: false, transport: nil) ⇒ Provider
constructor
A new instance of Provider.
-
#inspect ⇒ String
Returns an inspection of the provider object.
-
#interrupt!(owner) ⇒ nil
(also: #cancel!)
Interrupt the active request, if any.
-
#key? ⇒ Boolean
Returns true when an API key is configured.
-
#models ⇒ LLM::OpenAI::Models
Returns an interface to the models API.
-
#moderations ⇒ LLM::OpenAI::Moderations
Returns an interface to the moderations API.
-
#name ⇒ Symbol
Returns the provider's name.
- #ocr ⇒ LLM::Response
-
#request_owner ⇒ Object
private
Returns the current request owner used by the transport.
-
#respond(prompt, params = {}) ⇒ LLM::Context
Starts a new chat powered by the responses API.
-
#responses ⇒ LLM::OpenAI::Responses
Compared to the chat completions API, the responses API can require less bandwidth on each turn, maintain state server-side, and produce faster responses.
-
#schema ⇒ LLM::Schema
Returns an object that can generate a JSON schema.
-
#server_tool(name, options = {}) ⇒ LLM::ServerTool
Returns a tool provided by a provider.
-
#server_tools ⇒ String => LLM::ServerTool
Returns all known tools provided by a provider.
- #system_role ⇒ Symbol
- #tool_role ⇒ Symbol
-
#tracer ⇒ LLM::Tracer
Returns the current scoped tracer override or provider default tracer.
-
#tracer=(tracer) ⇒ void
Set the provider's default tracer This tracer is shared by the provider instance and becomes the fallback whenever no scoped override is active.
- #user_role ⇒ Symbol
-
#vector_stores ⇒ LLM::OpenAI::VectorStore
Returns an interface to the vector stores API.
-
#web_search(query:) ⇒ LLM::Response
Provides a web search capability.
-
#with(headers:) ⇒ LLM::Provider
Add one or more headers to all requests.
-
#with_tracer(tracer) { ... } ⇒ Object
Override the tracer for the current fiber while the block runs.
Constructor Details
#initialize(key:, host:, port: 443, timeout: 180, ssl: true, base_path: "", persistent: false, transport: nil) ⇒ Provider
Returns a new instance of Provider.
29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/llm/provider.rb', line 29 def initialize(key:, host:, port: 443, timeout: 180, ssl: true, base_path: "", persistent: false, transport: nil) @key = key @host = host @port = port @timeout = timeout @ssl = ssl @base_path = LLM::Utils.normalize_base_path(base_path) @base_uri = URI("#{ssl ? "https" : "http"}://#{host}:#{port}/") @headers = {"User-Agent" => "llm.rb v#{LLM::VERSION}"} @transport = LLM::Transport::Utils.resolve_transport(host:, port:, timeout:, ssl:, transport:, persistent:) @monitor = Monitor.new end |
Instance Method Details
#assistant_role ⇒ String
Returns the role of the assistant in the conversation. Usually "assistant" or "model"
186 187 188 |
# File 'lib/llm/provider.rb', line 186 def assistant_role raise NotImplementedError end |
#audio ⇒ LLM::OpenAI::Audio
Returns an interface to the audio API
150 151 152 |
# File 'lib/llm/provider.rb', line 150 def audio raise NotImplementedError end |
#chat(prompt, params = {}) ⇒ LLM::Context
Starts a new chat powered by the chat completions API
113 114 115 116 |
# File 'lib/llm/provider.rb', line 113 def chat(prompt, params = {}) role = params.delete(:role) LLM::Context.new(self, params).talk(prompt, role:) end |
#complete(prompt, params = {}) ⇒ LLM::Response
Provides an interface to the chat completions API
104 105 106 |
# File 'lib/llm/provider.rb', line 104 def complete(prompt, params = {}) raise NotImplementedError end |
#default_model ⇒ String
Returns the default model for chat completions
193 194 195 |
# File 'lib/llm/provider.rb', line 193 def default_model raise NotImplementedError end |
#developer_role ⇒ Symbol
271 272 273 |
# File 'lib/llm/provider.rb', line 271 def developer_role :developer end |
#embed(input, model: nil, **params) ⇒ LLM::Response
Provides an embedding
70 71 72 |
# File 'lib/llm/provider.rb', line 70 def (input, model: nil, **params) raise NotImplementedError end |
#files ⇒ LLM::OpenAI::Files
Returns an interface to the files API
157 158 159 |
# File 'lib/llm/provider.rb', line 157 def files raise NotImplementedError end |
#images ⇒ LLM::OpenAI::Images, LLM::Google::Images
Returns an interface to the images API
143 144 145 |
# File 'lib/llm/provider.rb', line 143 def images raise NotImplementedError end |
#inspect ⇒ String
The secret key is redacted in inspect for security reasons
Returns an inspection of the provider object
46 47 48 |
# File 'lib/llm/provider.rb', line 46 def inspect "#<#{LLM::Utils.object_id(self)} @key=[REDACTED] @transport=#{transport.inspect} @tracer=#{tracer.inspect}>" end |
#interrupt!(owner) ⇒ nil Also known as: cancel!
Interrupt the active request, if any.
332 333 334 |
# File 'lib/llm/provider.rb', line 332 def interrupt!(owner) transport.interrupt!(owner) end |
#key? ⇒ Boolean
Returns true when an API key is configured
348 349 350 |
# File 'lib/llm/provider.rb', line 348 def key? @key != nil && @key.to_s.strip.size > 0 end |
#models ⇒ LLM::OpenAI::Models
Returns an interface to the models API
164 165 166 |
# File 'lib/llm/provider.rb', line 164 def models raise NotImplementedError end |
#moderations ⇒ LLM::OpenAI::Moderations
Returns an interface to the moderations API
171 172 173 |
# File 'lib/llm/provider.rb', line 171 def moderations raise NotImplementedError end |
#name ⇒ Symbol
Returns the provider's name
55 56 57 |
# File 'lib/llm/provider.rb', line 55 def name raise NotImplementedError end |
#ocr ⇒ LLM::Response
This feature is not implemented by all providers, and it will raise NotImplementedError for providers that do not support it.
80 81 82 |
# File 'lib/llm/provider.rb', line 80 def ocr(...) raise NotImplementedError end |
#request_owner ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns the current request owner used by the transport.
341 342 343 |
# File 'lib/llm/provider.rb', line 341 def request_owner transport.request_owner end |
#respond(prompt, params = {}) ⇒ LLM::Context
Starts a new chat powered by the responses API
124 125 126 127 |
# File 'lib/llm/provider.rb', line 124 def respond(prompt, params = {}) role = params.delete(:role) LLM::Context.new(self, params).respond(prompt, role:) end |
#responses ⇒ LLM::OpenAI::Responses
Compared to the chat completions API, the responses API can require less bandwidth on each turn, maintain state server-side, and produce faster responses.
136 137 138 |
# File 'lib/llm/provider.rb', line 136 def responses raise NotImplementedError end |
#schema ⇒ LLM::Schema
Returns an object that can generate a JSON schema
200 201 202 |
# File 'lib/llm/provider.rb', line 200 def schema LLM::Schema.new end |
#server_tool(name, options = {}) ⇒ LLM::ServerTool
OpenAI, Anthropic, and Gemini provide platform-tools for things like web search, and more.
Returns a tool provided by a provider.
243 244 245 |
# File 'lib/llm/provider.rb', line 243 def server_tool(name, = {}) LLM::ServerTool.new(name, , self) end |
#server_tools ⇒ String => LLM::ServerTool
This method might be outdated, and the LLM::Provider#server_tool method can be used if a tool is not found here.
Returns all known tools provided by a provider.
226 227 228 |
# File 'lib/llm/provider.rb', line 226 def server_tools {} end |
#system_role ⇒ Symbol
265 266 267 |
# File 'lib/llm/provider.rb', line 265 def system_role :system end |
#tool_role ⇒ Symbol
277 278 279 |
# File 'lib/llm/provider.rb', line 277 def tool_role :tool end |
#tracer ⇒ LLM::Tracer
Returns the current scoped tracer override or provider default tracer
284 285 286 |
# File 'lib/llm/provider.rb', line 284 def tracer weakmap[self] || @tracer || LLM::Tracer::Null.new(self) end |
#tracer=(tracer) ⇒ void
This method returns an undefined value.
Set the provider's default tracer This tracer is shared by the provider instance and becomes the fallback whenever no scoped override is active.
298 299 300 |
# File 'lib/llm/provider.rb', line 298 def tracer=(tracer) @tracer = tracer || LLM::Tracer::Null.new(self) end |
#user_role ⇒ Symbol
259 260 261 |
# File 'lib/llm/provider.rb', line 259 def user_role :user end |
#vector_stores ⇒ LLM::OpenAI::VectorStore
Returns an interface to the vector stores API
178 179 180 |
# File 'lib/llm/provider.rb', line 178 def vector_stores raise NotImplementedError end |
#web_search(query:) ⇒ LLM::Response
Provides a web search capability
253 254 255 |
# File 'lib/llm/provider.rb', line 253 def web_search(query:) raise NotImplementedError end |
#with(headers:) ⇒ LLM::Provider
Add one or more headers to all requests
214 215 216 217 218 |
# File 'lib/llm/provider.rb', line 214 def with(headers:) lock do tap { @headers.merge!(headers) } end end |
#with_tracer(tracer) { ... } ⇒ Object
Override the tracer for the current fiber while the block runs. This is useful when you want per-request or per-turn tracing without replacing the provider's default tracer.
313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/llm/provider.rb', line 313 def with_tracer(tracer) had_override = weakmap.key?(self) previous = weakmap[self] weakmap[self] = tracer || LLM::Tracer::Null.new(self) yield ensure if had_override weakmap[self] = previous elsif weakmap.respond_to?(:delete) weakmap.delete(self) else weakmap[self] = nil end end |