Class: Legion::Extensions::Llm::Openai::Provider

Inherits:
Provider
  • Object
show all
Includes:
Provider::OpenAICompatible, Logging::Helper
Defined in:
lib/legion/extensions/llm/openai/provider.rb

Overview

OpenAI provider implementation for the Legion::Extensions::Llm base provider contract.

Defined Under Namespace

Modules: Capabilities

Constant Summary collapse

CAPABILITY_MAP =

── Static capability map for known OpenAI model families ──────Maps model-id prefixes to a set of capabilities and modality vectors. Used by list_models to build Model::Info structs from the raw /v1/models response.

{
  'gpt-4o' => {
    capabilities: %i[completion streaming function_calling vision structured_output],
    modalities_input: %w[text image audio],
    modalities_output: %w[text],
    context_window: 128_000
  },
  'gpt-4.1' => {
    capabilities: %i[completion streaming function_calling vision structured_output],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 1_047_576
  },
  'gpt-4' => {
    capabilities: %i[completion streaming function_calling vision],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 128_000
  },
  'gpt-5' => {
    capabilities: %i[completion streaming function_calling vision structured_output reasoning],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 1_047_576
  },
  'o4' => {
    capabilities: %i[completion streaming function_calling vision reasoning],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 200_000
  },
  'o3' => {
    capabilities: %i[completion streaming function_calling vision reasoning],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 200_000
  },
  'o1' => {
    capabilities: %i[completion streaming function_calling vision reasoning],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 200_000
  },
  'text-embedding-' => {
    capabilities: %i[embedding],
    modalities_input: %w[text],
    modalities_output: %w[embeddings],
    context_window: 8_191
  },
  'omni-moderation' => {
    capabilities: %i[moderation],
    modalities_input: %w[text image],
    modalities_output: %w[moderation]
  },
  'text-moderation' => {
    capabilities: %i[moderation],
    modalities_input: %w[text],
    modalities_output: %w[moderation]
  },
  'gpt-image' => {
    capabilities: %i[image_generation],
    modalities_input: %w[text image],
    modalities_output: %w[image]
  },
  'dall-e' => {
    capabilities: %i[image_generation],
    modalities_input: %w[text],
    modalities_output: %w[image]
  },
  'whisper' => {
    capabilities: %i[audio_transcription],
    modalities_input: %w[audio],
    modalities_output: %w[text]
  },
  'tts' => {
    capabilities: %i[audio_generation],
    modalities_input: %w[text],
    modalities_output: %w[audio]
  }
}.freeze

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.registry_publisherObject



117
118
119
# File 'lib/legion/extensions/llm/openai/provider.rb', line 117

def registry_publisher
  @registry_publisher ||= Legion::Extensions::Llm::RegistryPublisher.new(provider_family: :openai)
end

Class Method Details

.capabilitiesObject



115
# File 'lib/legion/extensions/llm/openai/provider.rb', line 115

def capabilities = Capabilities

.configuration_optionsObject



105
106
107
108
109
110
111
112
113
# File 'lib/legion/extensions/llm/openai/provider.rb', line 105

def configuration_options
  %i[
    openai_api_key
    openai_api_base
    openai_organization_id
    openai_project_id
    openai_use_system_role
  ]
end

.configuration_requirementsObject



103
# File 'lib/legion/extensions/llm/openai/provider.rb', line 103

def configuration_requirements = %i[openai_api_key]

.slugObject



102
# File 'lib/legion/extensions/llm/openai/provider.rb', line 102

def slug = 'openai'

Instance Method Details

#api_baseObject



168
169
170
# File 'lib/legion/extensions/llm/openai/provider.rb', line 168

def api_base
  config.openai_api_base || settings[:endpoint] || 'https://api.openai.com'
end

#chat_urlObject



180
# File 'lib/legion/extensions/llm/openai/provider.rb', line 180

def chat_url = completion_url

#headersObject



172
173
174
175
176
177
178
# File 'lib/legion/extensions/llm/openai/provider.rb', line 172

def headers
  identity_headers.merge({
    'Authorization' => "Bearer #{config.openai_api_key}",
    'OpenAI-Organization' => config.openai_organization_id,
    'OpenAI-Project' => config.openai_project_id
  }.compact)
end

#image_edit_urlObject



182
# File 'lib/legion/extensions/llm/openai/provider.rb', line 182

def image_edit_url = '/v1/images/edits'

#image_generation_urlObject



181
# File 'lib/legion/extensions/llm/openai/provider.rb', line 181

def image_generation_url = '/v1/images/generations'

#image_variation_urlObject



183
# File 'lib/legion/extensions/llm/openai/provider.rb', line 183

def image_variation_url = '/v1/images/variations'

#images_url(with: nil, mask: nil) ⇒ Object



184
# File 'lib/legion/extensions/llm/openai/provider.rb', line 184

def images_url(with: nil, mask: nil) = super

#list_modelsObject



195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/legion/extensions/llm/openai/provider.rb', line 195

def list_models(**)
  log.debug('Listing OpenAI models')
  raw = connection.get(models_url)
  models = build_model_infos(raw.body)
  log.debug { "Discovered #{models.size} OpenAI models; publishing registry availability" }
  self.class.registry_publisher.publish_models_async(models, readiness: readiness(live: false))
  models
rescue StandardError => e
  handle_exception(e, level: :error, handled: true,
                      operation: 'list_models')
  raise
end

#retrieve_model(model) ⇒ Object



186
187
188
189
190
191
192
193
# File 'lib/legion/extensions/llm/openai/provider.rb', line 186

def retrieve_model(model)
  log.debug { "Retrieving OpenAI model: #{model}" }
  connection.get("#{models_url}/#{model}").body
rescue StandardError => e
  handle_exception(e, level: :error, handled: true,
                      operation: 'retrieve_model')
  raise
end

#settingsObject



164
165
166
# File 'lib/legion/extensions/llm/openai/provider.rb', line 164

def settings
  Openai.default_settings
end

#stream_usage_supported?Boolean

Returns:

  • (Boolean)


162
# File 'lib/legion/extensions/llm/openai/provider.rb', line 162

def stream_usage_supported? = true