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, modality vectors, and the family context window. Feeds the discovery runner's capability_entry_for (evidence publication) and the provider's fetch_model_detail (cached model context).

{
  'gpt-4o' => {
    capabilities: %i[completion streaming function_calling tools 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 tools 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 tools vision],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 128_000
  },
  'gpt-5' => {
    capabilities: %i[completion streaming function_calling tools 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 tools vision reasoning],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 200_000
  },
  'o3' => {
    capabilities: %i[completion streaming function_calling tools vision reasoning],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    context_window: 200_000
  },
  'o1' => {
    capabilities: %i[completion streaming function_calling tools 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
DEFAULT_ENDPOINT =

Canonical OpenAI API base URL. Used as fallback when no custom openai_api_base is configured on the provider instance.

'https://api.openai.com'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.capabilitiesObject



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

def capabilities = Capabilities

.configuration_optionsObject



108
109
110
111
112
113
114
115
116
# File 'lib/legion/extensions/llm/openai/provider.rb', line 108

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

.configuration_requirementsObject



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

def configuration_requirements = %i[openai_api_key]

.slugObject



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

def slug = 'openai'

Instance Method Details

#api_baseObject



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

def api_base
  config.openai_api_base || DEFAULT_ENDPOINT
end

#chat_urlObject



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

def chat_url = completion_url

#headersObject



177
178
179
180
181
182
183
# File 'lib/legion/extensions/llm/openai/provider.rb', line 177

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



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

def image_edit_url = '/v1/images/edits'

#image_generation_urlObject



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

def image_generation_url = '/v1/images/generations'

#image_variation_urlObject



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

def image_variation_url = '/v1/images/variations'

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



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

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

#retrieve_model(model) ⇒ Object



191
192
193
194
195
196
197
198
# File 'lib/legion/extensions/llm/openai/provider.rb', line 191

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



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

def settings
  Openai.default_settings
end

#stream_usage_supported?Boolean

Returns:

  • (Boolean)


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

def stream_usage_supported? = true

#translatorObject

Canonical translator instance - the provider boundary contract. Created lazily; delegate translation to the Translator class.



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

def translator
  @translator ||= Translator.new(api_base: api_base, headers: headers)
end