Class: RubyLLM::Registry::Adapters::S3

Inherits:
Base
  • Object
show all
Defined in:
lib/ruby_llm/registry/adapters/s3.rb

Overview

S3-backed prompt repository.

Instance Method Summary collapse

Methods inherited from Base

#export, #import

Constructor Details

#initialize(client:, bucket:, prefix: "prompts") ⇒ S3

Returns a new instance of S3.



10
11
12
13
14
# File 'lib/ruby_llm/registry/adapters/s3.rb', line 10

def initialize(client:, bucket:, prefix: "prompts")
  @client = client
  @bucket = bucket
  @prefix = prefix.to_s.sub(%r{\A/+|/+$}, "")
end

Instance Method Details

#available_versions(path) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/ruby_llm/registry/adapters/s3.rb', line 26

def available_versions(path)
  prefix_key = object_prefix(path)
  response = client.list_objects_v2(bucket: bucket, prefix: prefix_key)
  Array(response.contents).map do |object|
    version_from_key(object.key)
  end.compact.map { |value| Version.parse(value) }.sort
end

#get(path, version: nil, label: nil) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/ruby_llm/registry/adapters/s3.rb', line 16

def get(path, version: nil, label: nil)
  key = object_key(path, version: version, label: label)
  raise PromptNotFoundError, "Prompt not found: #{path}" unless key

  payload = client.get_object(bucket: bucket, key: key).body.read
  Importer.new(payload, format: :json, path: path).to_prompt
rescue NoMethodError
  raise PromptNotFoundError, "Prompt not found: #{path}"
end

#store(prompt, overwrite: false) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/ruby_llm/registry/adapters/s3.rb', line 34

def store(prompt, overwrite: false)
  key = object_key(prompt.path, version: prompt.version.to_s)
  if !overwrite && object_exists?(key)
    raise Error, "Prompt #{prompt.path}@#{prompt.version} already exists"
  end

  client.put_object(
    bucket: bucket,
    key: key,
    body: Exporter.new(prompt).to_json,
    content_type: "application/json"
  )
  prompt
end