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

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.registry_publisherObject



32
33
34
# File 'lib/legion/extensions/llm/openai/provider.rb', line 32

def registry_publisher
  @registry_publisher ||= RegistryPublisher.new
end

Class Method Details

.capabilitiesObject



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

def capabilities = Capabilities

.configuration_optionsObject



20
21
22
23
24
25
26
27
28
# File 'lib/legion/extensions/llm/openai/provider.rb', line 20

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

.configuration_requirementsObject



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

def configuration_requirements = %i[openai_api_key]

.slugObject



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

def slug = 'openai'

Instance Method Details

#api_baseObject



79
80
81
# File 'lib/legion/extensions/llm/openai/provider.rb', line 79

def api_base
  config.openai_api_base || 'https://api.openai.com'
end

#chat_urlObject



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

def chat_url = completion_url

#headersObject



83
84
85
86
87
88
89
# File 'lib/legion/extensions/llm/openai/provider.rb', line 83

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

#image_edit_urlObject



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

def image_edit_url = '/v1/images/edits'

#image_generation_urlObject



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

def image_generation_url = '/v1/images/generations'

#image_variation_urlObject



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

def image_variation_url = '/v1/images/variations'

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



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

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

#list_modelsObject



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

def list_models
  log.info('Listing OpenAI models') if respond_to?(:log)
  super.tap do |models|
    log.info("Discovered #{models.size} OpenAI models") if respond_to?(:log)
    self.class.registry_publisher.publish_models_async(models, readiness: readiness(live: false))
  end
rescue StandardError => e
  if respond_to?(:handle_exception)
    handle_exception(e, level: :error, handled: true,
                        operation: 'list_models')
  end
  raise
end

#retrieve_model(model) ⇒ Object



97
98
99
100
101
102
103
104
105
106
# File 'lib/legion/extensions/llm/openai/provider.rb', line 97

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

#stream_usage_supported?Boolean

Returns:

  • (Boolean)


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

def stream_usage_supported? = true