Class: Legion::Extensions::Llm::Ollama::Provider

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

Overview

Ollama 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



24
25
26
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 24

def registry_publisher
  @registry_publisher ||= Ollama.registry_publisher
end

Class Method Details

.capabilitiesObject



22
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 22

def capabilities = Capabilities

.configuration_requirementsObject



21
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 21

def configuration_requirements = []

.default_tierObject



20
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 20

def default_tier = :local

.default_transportObject



19
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 19

def default_transport = :http

.local?Boolean

Returns:

  • (Boolean)


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

def local? = true

.slugObject



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

def slug = 'ollama'

Instance Method Details

#api_baseObject



48
49
50
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 48

def api_base
  resolve_base_url || normalize_url(settings[:base_url] || settings[:endpoint] || 'http://127.0.0.1:11434')
end

#completion_urlObject



56
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 56

def completion_url = '/api/chat'

#config_base_urlObject



52
53
54
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 52

def config_base_url
  config.respond_to?(:base_url) ? config.base_url : settings[:base_url]
end

#discover_offerings(live: false, raise_on_unreachable: false, **filters) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 87

def discover_offerings(live: false, raise_on_unreachable: false, **filters)
  return filter_cached_offerings(Array(@cached_offerings), filters) unless live

  provider_health = health(live:)
  @cached_offerings = discover_live_offerings(filters, provider_health, live:)
  log_discover_complete(@cached_offerings)
  @cached_offerings
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
  log.warn("[#{slug}] instance=#{provider_instance_id} unreachable: #{e.message}")
  raise if raise_on_unreachable

  []
end

#embedding_urlObject



61
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 61

def embedding_url(**) = '/api/embed'

#fetch_model_detail(model_name) ⇒ Object



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

def fetch_model_detail(model_name)
  raw = show_model(model_name)
  context_window = extract_context_window(raw)
  { context_window: context_window, capabilities: extract_capabilities(raw) }.compact
rescue StandardError => e
  handle_exception(e, level: :warn, handled: true, operation: 'ollama.fetch_model_detail',
                      model: model_name)
  nil
end

#list_models(live: false, **filters) ⇒ Object



80
81
82
83
84
85
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 80

def list_models(live: false, **filters)
  log.debug { "ollama provider discovering models endpoint=#{api_base}#{models_url}" }
  super.tap do |models|
    log.debug { "ollama provider discovered model_count=#{models.size}" }
  end
end

#list_running_modelsObject



65
66
67
68
69
70
71
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 65

def list_running_models
  log.debug { "ollama provider listing running models endpoint=#{api_base}#{running_models_url}" }
  connection.get(running_models_url).body.fetch('models', [])
rescue StandardError => e
  handle_exception(e, level: :error, handled: true, operation: 'ollama.list_running_models')
  []
end

#models_urlObject



58
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 58

def models_url = '/api/tags'

#pull_model(model, stream: false) ⇒ Object



119
120
121
122
123
124
125
126
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 119

def pull_model(model, stream: false)
  log.debug { "ollama provider pulling model=#{model} stream=#{stream}" }
  log.info { "pulling model #{model} stream=#{stream}" }
  connection.post(pull_url, { model: model, stream: stream }).body
rescue StandardError => e
  handle_exception(e, level: :error, handled: true, operation: 'ollama.pull_model')
  raise
end

#pull_urlObject



62
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 62

def pull_url = '/api/pull'

#readiness(live: false) ⇒ Object



73
74
75
76
77
78
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 73

def readiness(live: false)
  log.debug { "ollama provider checking readiness live=#{live} endpoint=#{api_base}" }
  super.tap do ||
    self.class.registry_publisher.publish_readiness_async() if live
  end
end

#running_models_urlObject



59
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 59

def running_models_url = '/api/ps'

#settingsObject



40
41
42
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 40

def settings
  Ollama.default_settings
end

#show_model(model) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 101

def show_model(model)
  log.debug { "ollama provider fetching model details model=#{model}" }
  connection.post(show_model_url, { model: model }).body
rescue StandardError => e
  handle_exception(e, level: :error, handled: true, operation: 'ollama.show_model')
  raise
end

#show_model_urlObject



60
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 60

def show_model_url = '/api/show'

#stream_urlObject



57
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 57

def stream_url = '/api/chat'

#translatorObject



44
45
46
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 44

def translator
  @translator ||= Translator.new(config: config)
end

#version_urlObject



63
# File 'lib/legion/extensions/llm/ollama/provider.rb', line 63

def version_url = '/api/version'