Class: Legion::Extensions::Ollama::Actor::ModelSync

Inherits:
Actors::Once
  • Object
show all
Includes:
Logging::Helper
Defined in:
lib/legion/extensions/ollama/actors/model_sync.rb

Overview

Once actor — runs once shortly after extension load. Reads legion.ollama.s3 and legion.ollama.default_models from settings and calls import_from_s3 for any model not already present locally.

Settings example:

{
  "legion": {
    "ollama": {
      "s3": {
        "bucket": "legion",
        "prefix": "ollama/models",
        "endpoint": "https://s3.example.internal"
      },
      "default_models": ["qwen3.5:4b", "nomic-embed-text:latest"]
    }
  }
}

Instance Method Summary collapse

Instance Method Details

#delayObject

Run 5 seconds after extension load to allow the rest of startup to complete.



28
29
30
# File 'lib/legion/extensions/ollama/actors/model_sync.rb', line 28

def delay
  5.0
end

#enabled?Boolean

Returns:

  • (Boolean)


40
41
42
43
44
45
46
47
48
49
# File 'lib/legion/extensions/ollama/actors/model_sync.rb', line 40

def enabled?
  return false unless defined?(Legion::Settings)

  models = Legion::Settings.dig(:ollama, :default_models)
  s3_cfg = Legion::Settings.dig(:ollama, :s3)
  models.is_a?(Array) && !models.empty? && s3_cfg.is_a?(Hash) && s3_cfg[:bucket]
rescue StandardError => e
  handle_exception(e, level: :warn, handled: true)
  false
end

#manualObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/legion/extensions/ollama/actors/model_sync.rb', line 51

def manual
  models = Legion::Settings.dig(:ollama, :default_models) || []
  s3_cfg = Legion::Settings.dig(:ollama, :s3)
  bucket = s3_cfg[:bucket]
  s3_opts = s3_cfg.except(:bucket)

  client = Object.new.extend(Legion::Extensions::Ollama::Runners::S3Models)
  models_path = ENV.fetch('OLLAMA_MODELS', File.join(Dir.home, '.ollama', 'models'))

  models.each do |model|
    if model_present_locally?(model, models_path)
      log.debug "[ModelSync] #{model} already present locally, skipping"
      next
    end

    log.info "[ModelSync] importing #{model} from S3"
    result = client.import_from_s3(model: model, bucket: bucket, models_path: models_path, **s3_opts)
    if result[:status] == 200
      log.info "[ModelSync] imported #{model} (blobs_downloaded=#{result[:blobs_downloaded]}, blobs_skipped=#{result[:blobs_skipped]})"
    else
      log.warn "[ModelSync] failed to import #{model}: #{result.inspect}"
    end
  rescue StandardError => e
    handle_exception(e, level: :error, handled: true, model: model)
  end
end

#runner_classObject



36
37
38
# File 'lib/legion/extensions/ollama/actors/model_sync.rb', line 36

def runner_class
  self.class
end

#use_runner?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/legion/extensions/ollama/actors/model_sync.rb', line 32

def use_runner?
  false
end