ruby-amazon-bedrock 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile.lock +9 -1
  5. data/README.md +2 -2
  6. data/lib/amazon_bedrock/version.rb +1 -1
  7. data/lib/bedrock_runtime/client.rb +1 -2
  8. data/lib/bedrock_runtime/payload_builders/ai_21_labs/base.rb +2 -2
  9. data/lib/bedrock_runtime/payload_builders/amazon/base.rb +1 -1
  10. data/lib/bedrock_runtime/response_builders/ai_21_labs.rb +32 -0
  11. data/lib/bedrock_runtime/response_builders/{image.rb → amazon_image.rb} +42 -7
  12. data/lib/bedrock_runtime/response_builders/amazon_text.rb +32 -0
  13. data/lib/bedrock_runtime/response_builders/anthropic.rb +32 -0
  14. data/lib/bedrock_runtime/response_builders/cohere_command.rb +32 -0
  15. data/lib/bedrock_runtime/response_builders/cohere_embed.rb +32 -0
  16. data/lib/bedrock_runtime/response_builders/{text.rb → meta.rb} +11 -5
  17. data/lib/bedrock_runtime/response_builders/stability_ai.rb +85 -0
  18. data/lib/bedrock_runtime/response_factory.rb +42 -16
  19. data/ruby-amazon-bedrock.gemspec +1 -0
  20. data/spec/bedrock_runtime/payload_builders/ai_21_labs/base_spec.rb +1 -1
  21. data/spec/bedrock_runtime/payload_builders/ai_21_labs/j2_mid_v1_spec.rb +1 -1
  22. data/spec/bedrock_runtime/payload_builders/ai_21_labs/j2_ultra_v1_spec.rb +1 -1
  23. data/spec/bedrock_runtime/response_builders/{text_spec.rb → ai_21_labs_spec.rb} +3 -4
  24. data/spec/bedrock_runtime/response_builders/{image_spec.rb → stability_ai_spec.rb} +2 -2
  25. data/spec/bedrock_runtime/response_factory_spec.rb +74 -14
  26. data/spec/support/helpers.rb +1 -3
  27. metadata +26 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e34184a2246b1054a64d6d29bc7bb1144487a508c6d27f717d8f92edb4cb32a2
4
- data.tar.gz: ae40e48b1107bf163bbb30e4c058d660784f1bf9cc6fcafa0bfa9843b526dd49
3
+ metadata.gz: 81db5e2aa4d8b27014d6f2f24bc79083ddae2401a60a2d6d120fbc27e9facd62
4
+ data.tar.gz: f8f3ae19c0756142df41ef49e9d1d66d33f480013d375b6086cdb70e5365a3f2
5
5
  SHA512:
6
- metadata.gz: fcdfeb1017d3bf2cefeb1bf77b68a85bd36bd3a7906651b1a56f8ff2544309ba98eee08fc1f04ce80ed22b738302fd38e7811087f56a976c6eeea1f7cfae0010
7
- data.tar.gz: f19b95ef5965317c53eda21c96c69e421abdb34ce441cc850731663aa8ed35bbc67000d02a34ebc2f192ce7fbe81e0d18afe3ab59d0dbea38e32c858625fcc89
6
+ metadata.gz: 4cd2bdd5a70da7ddd8f92dfed38cee2432b3a1800d9d774918fd967f6d623df68afef0b1e250866a90a013a0ff3f4226146cf1e9684c1e28bd8ebdd4dad444bc
7
+ data.tar.gz: e2b2f8a61ab61967e7d79ce0762002fbee9ce3fdc60086b5a6cb7f0c825caa91835fe07c632380cabcf8d0cadd237f609b104d3335af7bd9ffb08224bdf84d7f
data/.gitignore CHANGED
@@ -8,7 +8,7 @@
8
8
  /tmp/
9
9
  .env
10
10
  *.gem
11
- image.jpg
11
+ *.jpg
12
12
 
13
13
  # rspec failure tracking
14
14
  .rspec_status
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [0.2.3] - 2024-01-12
2
+
3
+ - Fix A121 Labs bug for maxTokens parameter
4
+ - Allow Image generator to store images in S3 after being created
5
+
1
6
  ## [0.2.2] - 2024-01-10
2
7
 
3
8
  - Fix bug for Amazon Titan Text Lite
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-amazon-bedrock (0.2.2)
4
+ ruby-amazon-bedrock (0.2.3)
5
5
  aws-sdk-bedrockruntime (~> 1.0)
6
+ aws-sdk-s3 (~> 1.0)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
@@ -20,6 +21,13 @@ GEM
20
21
  aws-partitions (~> 1, >= 1.651.0)
21
22
  aws-sigv4 (~> 1.8)
22
23
  jmespath (~> 1, >= 1.6.1)
24
+ aws-sdk-kms (1.71.0)
25
+ aws-sdk-core (~> 3, >= 3.177.0)
26
+ aws-sigv4 (~> 1.1)
27
+ aws-sdk-s3 (1.132.0)
28
+ aws-sdk-core (~> 3, >= 3.179.0)
29
+ aws-sdk-kms (~> 1)
30
+ aws-sigv4 (~> 1.6)
23
31
  aws-sigv4 (1.8.0)
24
32
  aws-eventstream (~> 1, >= 1.0.2)
25
33
  bundler-audit (0.9.1)
data/README.md CHANGED
@@ -14,7 +14,7 @@ Amazon Bedrock is a fully managed service that makes FMs from leading AI startup
14
14
  Add the following line to your application's Gemfile:
15
15
 
16
16
  ```ruby
17
- gem "ruby-amazon-bedrock", "~> 0.2.2"
17
+ gem "ruby-amazon-bedrock", "~> 0.2.3"
18
18
  ```
19
19
 
20
20
  And then execute:
@@ -28,7 +28,7 @@ $ bundle install
28
28
  Or install with:
29
29
 
30
30
  ```bash
31
- $ gem install ruby-amazon-bedrock -v 0.2.1
31
+ $ gem install ruby-amazon-bedrock -v 0.2.3
32
32
  ```
33
33
 
34
34
  and require with:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyAmazonBedrock
4
- VERSION = "0.2.2"
4
+ VERSION = "0.2.3"
5
5
  end
@@ -39,8 +39,7 @@ module RubyAmazonBedrock
39
39
  payload_builder_class = RubyAmazonBedrock::PayloadFactory.new(id, prompt, options).create
40
40
  response = @client.invoke_model(payload_builder_class.build)
41
41
 
42
- response_builder_class = RubyAmazonBedrock::ResponseFactory.new(payload_builder_class.type, response,
43
- options).create
42
+ response_builder_class = RubyAmazonBedrock::ResponseFactory.new(id, response, options).create
44
43
  response_builder_class.build
45
44
  end
46
45
  end
@@ -35,7 +35,7 @@ module RubyAmazonBedrock
35
35
  accept: '*/*',
36
36
  body: {
37
37
  prompt: @prompt,
38
- maxTokenCount: parameters[:maxTokenCount],
38
+ maxTokens: parameters[:maxTokens],
39
39
  temperature: parameters[:temperature],
40
40
  topP: parameters[:topP],
41
41
  stopSequences: parameters[:stopSequences],
@@ -52,7 +52,7 @@ module RubyAmazonBedrock
52
52
 
53
53
  def parameters # rubocop:disable Metrics/CyclomaticComplexity
54
54
  {
55
- maxTokenCount: @options[:max_tokens] || 200,
55
+ maxTokens: @options[:max_tokens] || 200,
56
56
  stopSequences: @options[:stop_sequences] || [],
57
57
  temperature: @options[:temperature] || 0,
58
58
  topP: @options[:top_p] || 1,
@@ -20,7 +20,7 @@ module RubyAmazonBedrock
20
20
  # - :body [String] A JSON string that includes the following details:
21
21
  # - :inputText [String] The input text to be processed by the model.
22
22
  # - :textGenerationConfig [Hash] A hash containing configuration parameters for text generation:
23
- # - :maxTokenCount [Integer] The maximum number of tokens to generate.
23
+ # - :maxTokens [Integer] The maximum number of tokens to generate.
24
24
  # - :stopSequences [Array<String>] An array of strings that, when encountered, will signal the end
25
25
  # of generation.
26
26
  # - :temperature [Float] A parameter controlling the randomness in the response generation.
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyAmazonBedrock
4
+ module ResponseBuilders
5
+ # The Ai21Labs class is responsible for parsing and building a structured response from a raw text response.
6
+ # It converts the HTTP response for an AI21 Labs model into a structured format to make it easier to access
7
+ # the response data.
8
+ class Ai21Labs
9
+ # Initializes a new instance of the Text class.
10
+ #
11
+ # @param response [Object] The raw response object with is an HTTP response.
12
+ def initialize(response, _options = {})
13
+ @response = response
14
+ end
15
+
16
+ # Builds and returns a structured representation of the raw text response.
17
+ # This method parses the raw response body as JSON and symbolizes the names
18
+ # for easier access in Ruby.
19
+ #
20
+ # @return [Hash] A hash representing the structured data from the response body.
21
+ # The keys of the hash are symbolized for convenient access.
22
+ def build
23
+ response = JSON.parse(@response.body.read, symbolize_names: true)
24
+
25
+ {
26
+ text: response[:completions]&.first&.dig(:data, :text),
27
+ full_response: response
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'aws-sdk-s3'
3
4
  require 'base64'
5
+ require 'digest'
4
6
 
5
7
  module RubyAmazonBedrock
6
8
  module ResponseBuilders
7
- # The Image class is responsible for handling and processing image data received in a response.
9
+ # The AmazonImage class is responsible for handling and processing image data received in a response.
8
10
  # It parses the response, extracts the image data, decodes it from Base64, and saves it as a file.
9
- class Image
10
- # Initializes a new instance of the Image class.
11
+ class AmazonImage
12
+ # Initializes a new instance of the AmazonImage class.
11
13
  #
12
14
  # @param response [Object] The raw response object which is an HTTP response.
13
15
  # The response should contain the image data in Base64 format.
@@ -16,6 +18,7 @@ module RubyAmazonBedrock
16
18
  def initialize(response, options = {})
17
19
  @response = response
18
20
  @file_path = options[:file_path] || 'image.jpg'
21
+ @upload = options[:upload] || false
19
22
  end
20
23
 
21
24
  # Processes the response to extract and decode image data, then saves it as a file.
@@ -26,15 +29,20 @@ module RubyAmazonBedrock
26
29
  #
27
30
  # @return [Hash] A hash indicating the result of the operation.
28
31
  # If successful, the hash includes :result set to :success and :file_path.
32
+ # If upload option is provided it will also include :s3_url after saving the image in S3.
29
33
  # If failure, the hash includes :result set to :failure and :error with exception details.
30
34
  def build
31
35
  response_object = JSON.parse(@response.body.read, symbolize_names: true)
32
36
  image_data = Base64.decode64(response_object[:artifacts].first[:base64])
33
37
  File.binwrite(@file_path, image_data)
38
+
39
+ upload_image if can_upload?
40
+
34
41
  {
35
42
  result: :success,
36
- file_path: @file_path
37
- }
43
+ file_path: @file_path,
44
+ s3_url: s3_url
45
+ }.compact
38
46
  rescue StandardError => e
39
47
  {
40
48
  result: :failure,
@@ -42,8 +50,35 @@ module RubyAmazonBedrock
42
50
  }
43
51
  end
44
52
 
45
- def model_id
46
- # noop
53
+ private
54
+
55
+ def bucket
56
+ @bucket ||= ENV.fetch('AWS_S3_BUCKET')
57
+ end
58
+
59
+ def key
60
+ @key ||= Digest::SHA1.hexdigest(Time.now.to_s)[0..11]
61
+ end
62
+
63
+ def can_upload?
64
+ @upload && bucket && File.exist?(@file_path)
65
+ end
66
+
67
+ def s3_url
68
+ s3_resource = Aws::S3::Resource.new
69
+ object = s3_resource.bucket(bucket).object(key)
70
+ object.presigned_url(:get)
71
+ end
72
+
73
+ def upload_image
74
+ s3_client = Aws::S3::Client.new
75
+ s3_client.put_object(
76
+ bucket: bucket,
77
+ key: key,
78
+ body: File.read(@file_path)
79
+ )
80
+ rescue StandardError => e
81
+ Rails.logger.error("Error uploading image to S3: #{e}")
47
82
  end
48
83
  end
49
84
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyAmazonBedrock
4
+ module ResponseBuilders
5
+ # The AmazonText class is responsible for parsing and building a structured response from a raw text response.
6
+ # It converts the HTTP response for an Amazon Titan model into a structured format to make it easier to access
7
+ # the response data.
8
+ class AmazonText
9
+ # Initializes a new instance of the Text class.
10
+ #
11
+ # @param response [Object] The raw response object with is an HTTP response.
12
+ def initialize(response, _options = {})
13
+ @response = response
14
+ end
15
+
16
+ # Builds and returns a structured representation of the raw text response.
17
+ # This method parses the raw response body as JSON and symbolizes the names
18
+ # for easier access in Ruby.
19
+ #
20
+ # @return [Hash] A hash representing the structured data from the response body.
21
+ # The keys of the hash are symbolized for convenient access.
22
+ def build
23
+ response = JSON.parse(@response.body.read, symbolize_names: true)
24
+
25
+ {
26
+ text: response[:results]&.first&.dig(:outputText),
27
+ full_response: response
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyAmazonBedrock
4
+ module ResponseBuilders
5
+ # The Anthropic class is responsible for parsing and building a structured response from a raw text response.
6
+ # It converts the HTTP response for an Anthropic model into a structured format to make it easier to access
7
+ # the response data.
8
+ class Anthropic
9
+ # Initializes a new instance of the Text class.
10
+ #
11
+ # @param response [Object] The raw response object with is an HTTP response.
12
+ def initialize(response, _options = {})
13
+ @response = response
14
+ end
15
+
16
+ # Builds and returns a structured representation of the raw text response.
17
+ # This method parses the raw response body as JSON and symbolizes the names
18
+ # for easier access in Ruby.
19
+ #
20
+ # @return [Hash] A hash representing the structured data from the response body.
21
+ # The keys of the hash are symbolized for convenient access.
22
+ def build
23
+ response = JSON.parse(@response.body.read, symbolize_names: true)
24
+
25
+ {
26
+ text: response[:completion],
27
+ full_response: response
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyAmazonBedrock
4
+ module ResponseBuilders
5
+ # The CohereCommand class is responsible for parsing and building a structured response from a raw text response.
6
+ # It converts the HTTP response for an Cohere Command model into a structured format to make it easier to access
7
+ # the response data.
8
+ class CohereCommand
9
+ # Initializes a new instance of the Text class.
10
+ #
11
+ # @param response [Object] The raw response object with is an HTTP response.
12
+ def initialize(response, _options = {})
13
+ @response = response
14
+ end
15
+
16
+ # Builds and returns a structured representation of the raw text response.
17
+ # This method parses the raw response body as JSON and symbolizes the names
18
+ # for easier access in Ruby.
19
+ #
20
+ # @return [Hash] A hash representing the structured data from the response body.
21
+ # The keys of the hash are symbolized for convenient access.
22
+ def build
23
+ response = JSON.parse(@response.body.read, symbolize_names: true)
24
+
25
+ {
26
+ text: response[:generations]&.first&.[](:text),
27
+ full_response: response
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyAmazonBedrock
4
+ module ResponseBuilders
5
+ # The CohereEmbed class is responsible for parsing and building a structured response from a raw text response.
6
+ # It converts the HTTP response for an Cohere Embed model into a structured format to make it easier to access
7
+ # the response data.
8
+ class CohereEmbed
9
+ # Initializes a new instance of the Text class.
10
+ #
11
+ # @param response [Object] The raw response object with is an HTTP response.
12
+ def initialize(response, _options = {})
13
+ @response = response
14
+ end
15
+
16
+ # Builds and returns a structured representation of the raw text response.
17
+ # This method parses the raw response body as JSON and symbolizes the names
18
+ # for easier access in Ruby.
19
+ #
20
+ # @return [Hash] A hash representing the structured data from the response body.
21
+ # The keys of the hash are symbolized for convenient access.
22
+ def build
23
+ response = JSON.parse(@response.body.read, symbolize_names: true)
24
+
25
+ {
26
+ text: response[:texts].first,
27
+ full_response: response
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,13 +2,14 @@
2
2
 
3
3
  module RubyAmazonBedrock
4
4
  module ResponseBuilders
5
- # The Text class is responsible for parsing and building a structured response from a raw text response.
6
- # It converts the HTTP response into a structured format to make it easier to access the data.
7
- class Text
5
+ # The Meta class is responsible for parsing and building a structured response from a raw text response.
6
+ # It converts the HTTP response for an Meta model into a structured format to make it easier to access
7
+ # the response data.
8
+ class Meta
8
9
  # Initializes a new instance of the Text class.
9
10
  #
10
11
  # @param response [Object] The raw response object with is an HTTP response.
11
- def initialize(response)
12
+ def initialize(response, _options = {})
12
13
  @response = response
13
14
  end
14
15
 
@@ -19,7 +20,12 @@ module RubyAmazonBedrock
19
20
  # @return [Hash] A hash representing the structured data from the response body.
20
21
  # The keys of the hash are symbolized for convenient access.
21
22
  def build
22
- JSON.parse(@response.body.read, symbolize_names: true)
23
+ response = JSON.parse(@response.body.read, symbolize_names: true)
24
+
25
+ {
26
+ text: response[:generation],
27
+ full_response: response
28
+ }
23
29
  end
24
30
  end
25
31
  end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-s3'
4
+ require 'base64'
5
+ require 'digest'
6
+
7
+ module RubyAmazonBedrock
8
+ module ResponseBuilders
9
+ # The StabilityAi class is responsible for handling and processing image data received in a response.
10
+ # It parses the response, extracts the image data, decodes it from Base64, and saves it as a file.
11
+ class StabilityAi
12
+ # Initializes a new instance of the StabilityAi class.
13
+ #
14
+ # @param response [Object] The raw response object which is an HTTP response.
15
+ # The response should contain the image data in Base64 format.
16
+ # @param options [Hash] Optional parameters, currently supporting :file_path for specifying
17
+ # the location and name of the file to save the image. Default is 'image.jpg'.
18
+ def initialize(response, options = {})
19
+ @response = response
20
+ @file_path = options[:file_path] || 'image.jpg'
21
+ @upload = options[:upload] || false
22
+ end
23
+
24
+ # Processes the response to extract and decode image data, then saves it as a file.
25
+ # This method parses the response body as JSON, extracts the first artifact which is
26
+ # expected to be an image in Base64 format, decodes it, and writes it to a file.
27
+ # If the operation is successful, a hash with a success status and file path is returned.
28
+ # If an error occurs, a hash with a failure status and error details is returned.
29
+ #
30
+ # @return [Hash] A hash indicating the result of the operation.
31
+ # If successful, the hash includes :result set to :success and :file_path.
32
+ # If upload option is provided it will also include :s3_url after saving the image in S3.
33
+ # If failure, the hash includes :result set to :failure and :error with exception details.
34
+ def build
35
+ response_object = JSON.parse(@response.body.read, symbolize_names: true)
36
+ image_data = Base64.decode64(response_object[:artifacts].first[:base64])
37
+ File.binwrite(@file_path, image_data)
38
+
39
+ upload_image if can_upload?
40
+
41
+ {
42
+ result: :success,
43
+ file_path: @file_path,
44
+ s3_url: s3_url
45
+ }.compact
46
+ rescue StandardError => e
47
+ {
48
+ result: :failure,
49
+ error: e
50
+ }
51
+ end
52
+
53
+ private
54
+
55
+ def bucket
56
+ @bucket ||= ENV.fetch('AWS_S3_BUCKET')
57
+ end
58
+
59
+ def key
60
+ @key ||= Digest::SHA1.hexdigest(Time.now.to_s)[0..11]
61
+ end
62
+
63
+ def can_upload?
64
+ @upload && bucket && File.exist?(@file_path)
65
+ end
66
+
67
+ def s3_url
68
+ s3_resource = Aws::S3::Resource.new
69
+ object = s3_resource.bucket(bucket).object(key)
70
+ object.presigned_url(:get)
71
+ end
72
+
73
+ def upload_image
74
+ s3_client = Aws::S3::Client.new
75
+ s3_client.put_object(
76
+ bucket: bucket,
77
+ key: key,
78
+ body: File.read(@file_path)
79
+ )
80
+ rescue StandardError => e
81
+ Rails.logger.error("Error uploading image to S3: #{e}")
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,19 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'response_builders/image'
4
- require_relative 'response_builders/text'
3
+ require_relative 'response_builders/ai_21_labs'
4
+ require_relative 'response_builders/amazon_text'
5
+ require_relative 'response_builders/amazon_image'
6
+ require_relative 'response_builders/anthropic'
7
+ require_relative 'response_builders/cohere_command'
8
+ require_relative 'response_builders/cohere_embed'
9
+ require_relative 'response_builders/meta'
10
+ require_relative 'response_builders/stability_ai'
5
11
 
6
12
  module RubyAmazonBedrock
7
13
  # The ResponseFactory class is a factory for creating different types of response builder objects.
8
- # It is designed to instantiate and return either a Text or Image response builder based on the type specified.
14
+ # It is designed to instantiate and return an object of a specific response builder class
9
15
  class ResponseFactory
10
16
  # Initializes a new instance of the ResponseFactory class.
11
17
  #
12
- # @param type [Symbol] The type of response builder to create (:text or :image).
18
+ # @param model_id [String] The model_id of response builder to create (Amazon Bedrock model id).
13
19
  # @param response [Object] The raw response object, typically an HTTP response.
14
- # @param optios [Hash] Additional options for the response builder.
15
- def initialize(type, response, options = {})
16
- @type = type
20
+ # @param options [Object] optional attributes to customize the response.
21
+ def initialize(model_id, response, options = {})
22
+ @model_id = model_id
17
23
  @response = response
18
24
  @options = options
19
25
  end
@@ -22,16 +28,36 @@ module RubyAmazonBedrock
22
28
  # This method uses the @type instance variable to determine which type of response
23
29
  # builder to instantiate and return.
24
30
  #
25
- # @return [ResponseBuilders::Text, ResponseBuilders::Image] Depending on the type,
26
- # it returns an instance of either ResponseBuilders::Text or ResponseBuilders::Image.
27
- # Returns nil if the type does not match any known response builders.
31
+ # @return [ResponseBuilders::Class] Depending on the model_id,
32
+ # it returns an instance of any of the response builder classes.
33
+ # Returns nil if the model_id does not match any known response builders.
28
34
  def create
29
- case @type
30
- when :text
31
- ResponseBuilders::Text.new(@response)
32
- when :image
33
- ResponseBuilders::Image.new(@response, @options)
34
- end
35
+ builder_class = models_to_builders[@model_id]
36
+ builder_class.new(@response, @options)
37
+ end
38
+
39
+ # Defines a mapping from model identifiers to their respective builder classes.
40
+ #
41
+ # @return [Hash] The mapping of model identifiers to builder classes.
42
+ def models_to_builders
43
+ {
44
+ 'ai21.j2-mid-v1' => ResponseBuilders::Ai21Labs,
45
+ 'ai21.j2-ultra-v1' => ResponseBuilders::Ai21Labs,
46
+ 'amazon.titan-image-generator-v1' => ResponseBuilders::AmazonImage,
47
+ 'amazon.titan-text-lite-v1' => ResponseBuilders::AmazonText,
48
+ 'amazon.titan-text-express-v1' => ResponseBuilders::AmazonText,
49
+ 'anthropic.claude-instant-v1' => ResponseBuilders::Anthropic,
50
+ 'anthropic.claude-v1' => ResponseBuilders::Anthropic,
51
+ 'anthropic.claude-v2' => ResponseBuilders::Anthropic,
52
+ 'cohere.command-light-text-v14' => ResponseBuilders::CohereCommand,
53
+ 'cohere.command-text-v14' => ResponseBuilders::CohereCommand,
54
+ 'cohere.embed-english-v3' => ResponseBuilders::CohereEmbed,
55
+ 'cohere.embed-multilingual-v3' => ResponseBuilders::CohereEmbed,
56
+ 'meta.llama2-13b-chat-v1' => ResponseBuilders::Meta,
57
+ 'meta.llama2-70b-chat-v1' => ResponseBuilders::Meta,
58
+ 'stability.stable-diffusion-xl-v0' => ResponseBuilders::StabilityAi,
59
+ 'stability.stable-diffusion-xl-v1' => ResponseBuilders::StabilityAi
60
+ }
35
61
  end
36
62
  end
37
63
  end
@@ -36,4 +36,5 @@ Gem::Specification.new do |spec|
36
36
  spec.require_paths = ["lib"]
37
37
 
38
38
  spec.add_dependency "aws-sdk-bedrockruntime", "~> 1.0"
39
+ spec.add_dependency "aws-sdk-s3", "~> 1.0"
39
40
  end
@@ -9,7 +9,7 @@ RSpec.describe RubyAmazonBedrock::PayloadBuilders::Ai21Labs::Base do
9
9
  let(:body) do
10
10
  {
11
11
  prompt: prompt,
12
- maxTokenCount: 200,
12
+ maxTokens: 200,
13
13
  temperature: 0,
14
14
  topP: 1,
15
15
  stopSequences: [],
@@ -9,7 +9,7 @@ RSpec.describe RubyAmazonBedrock::PayloadBuilders::Ai21Labs::J2MidV1 do
9
9
  let(:body) do
10
10
  {
11
11
  prompt: prompt,
12
- maxTokenCount: 200,
12
+ maxTokens: 200,
13
13
  temperature: 0,
14
14
  topP: 1,
15
15
  stopSequences: [],
@@ -9,7 +9,7 @@ RSpec.describe RubyAmazonBedrock::PayloadBuilders::Ai21Labs::J2UltraV1 do
9
9
  let(:body) do
10
10
  {
11
11
  prompt: prompt,
12
- maxTokenCount: 200,
12
+ maxTokens: 200,
13
13
  temperature: 0,
14
14
  topP: 1,
15
15
  stopSequences: [],
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'bedrock_runtime/response_builders/text'
4
+ require 'bedrock_runtime/response_builders/ai_21_labs'
5
5
 
6
- RSpec.describe RubyAmazonBedrock::ResponseBuilders::Text do
6
+ RSpec.describe RubyAmazonBedrock::ResponseBuilders::Ai21Labs do
7
7
  let(:response_body) { { key1: 'value1', key2: 'value2' }.to_json }
8
8
  let(:response) { double('response', body: StringIO.new(response_body)) }
9
9
 
@@ -14,8 +14,7 @@ RSpec.describe RubyAmazonBedrock::ResponseBuilders::Text do
14
14
  result = subject.build
15
15
  expect(result).to be_a(Hash)
16
16
  expect(result.keys).to all(be_a(Symbol))
17
- expect(result[:key1]).to eq('value1')
18
- expect(result[:key2]).to eq('value2')
17
+ expect(result[:full_response]).to eq(JSON.parse(response_body, symbolize_names: true))
19
18
  end
20
19
  end
21
20
 
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'bedrock_runtime/response_builders/image'
4
+ require 'bedrock_runtime/response_builders/stability_ai'
5
5
 
6
- RSpec.describe RubyAmazonBedrock::ResponseBuilders::Image do
6
+ RSpec.describe RubyAmazonBedrock::ResponseBuilders::StabilityAi do
7
7
  let(:base64_image) { Base64.encode64(File.binread('spec/fixtures/sample_image.jpg')) }
8
8
  let(:response_body) { { artifacts: [{ base64: base64_image }] }.to_json }
9
9
  let(:response) { double('response', body: StringIO.new(response_body)) }
@@ -2,34 +2,94 @@
2
2
 
3
3
  require 'spec_helper'
4
4
  require 'bedrock_runtime/response_factory'
5
- require 'bedrock_runtime/response_builders/text'
6
- require 'bedrock_runtime/response_builders/image'
5
+ require 'bedrock_runtime/response_builders/ai_21_labs'
6
+ require 'bedrock_runtime/response_builders/amazon_text'
7
+ require 'bedrock_runtime/response_builders/amazon_image'
8
+ require 'bedrock_runtime/response_builders/anthropic'
9
+ require 'bedrock_runtime/response_builders/cohere_command'
10
+ require 'bedrock_runtime/response_builders/cohere_embed'
11
+ require 'bedrock_runtime/response_builders/meta'
12
+ require 'bedrock_runtime/response_builders/stability_ai'
7
13
 
8
14
  RSpec.describe RubyAmazonBedrock::ResponseFactory do
9
15
  let(:response) { double('response') }
10
16
  let(:options) { { some_option: 'value' } }
11
17
 
12
- context 'when type is :text' do
13
- subject { described_class.new(:text, response) }
18
+ context 'when model_id is from ai_21_labs' do
19
+ ['ai21.j2-mid-v1', 'ai21.j2-ultra-v1'].each do |model_id|
20
+ subject { described_class.new(model_id, response) }
14
21
 
15
- it 'creates a Text response builder' do
16
- expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::Text)
22
+ it 'creates an Ai21Labs response builder' do
23
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::Ai21Labs)
24
+ end
17
25
  end
18
26
  end
19
27
 
20
- context 'when type is :image' do
21
- subject { described_class.new(:image, response, options) }
28
+ context 'when model_id is from Amazon text generators' do
29
+ ['amazon.titan-text-lite-v1', 'amazon.titan-text-express-v1'].each do |model_id|
30
+ subject { described_class.new(model_id, response) }
22
31
 
23
- it 'creates an Image response builder' do
24
- expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::Image)
32
+ it 'creates an AmazonText response builder' do
33
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::AmazonText)
34
+ end
25
35
  end
26
36
  end
27
37
 
28
- context 'when type is invalid' do
29
- subject { described_class.new(:invalid_type, response) }
38
+ context 'when model_id is from Amazon image generators' do
39
+ subject { described_class.new('amazon.titan-image-generator-v1', response) }
30
40
 
31
- it 'returns nil' do
32
- expect(subject.create).to be_nil
41
+ it 'creates an AmazonText response builder' do
42
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::AmazonImage)
43
+ end
44
+ end
45
+
46
+ context 'when model_id is from Anthropic generators' do
47
+ ['anthropic.claude-instant-v1', 'anthropic.claude-v1', 'anthropic.claude-v2'].each do |model_id|
48
+ subject { described_class.new(model_id, response) }
49
+
50
+ it 'creates an AmazonText response builder' do
51
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::Anthropic)
52
+ end
53
+ end
54
+ end
55
+
56
+ context 'when model_id is from Cohere commnand generators' do
57
+ ['cohere.command-light-text-v14', 'cohere.command-text-v14'].each do |model_id|
58
+ subject { described_class.new(model_id, response) }
59
+
60
+ it 'creates an AmazonText response builder' do
61
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::CohereCommand)
62
+ end
63
+ end
64
+ end
65
+
66
+ context 'when model_id is from Cohere embed generators' do
67
+ ['cohere.embed-english-v3', 'cohere.embed-multilingual-v3'].each do |model_id|
68
+ subject { described_class.new(model_id, response) }
69
+
70
+ it 'creates an AmazonText response builder' do
71
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::CohereEmbed)
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'when model_id is from Meta generators' do
77
+ ['meta.llama2-13b-chat-v1', 'meta.llama2-70b-chat-v1'].each do |model_id|
78
+ subject { described_class.new(model_id, response) }
79
+
80
+ it 'creates an AmazonText response builder' do
81
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::Meta)
82
+ end
83
+ end
84
+ end
85
+
86
+ context 'when model_id is from Stability AI generators' do
87
+ ['stability.stable-diffusion-xl-v0', 'stability.stable-diffusion-xl-v0'].each do |model_id|
88
+ subject { described_class.new(model_id, response) }
89
+
90
+ it 'creates an AmazonText response builder' do
91
+ expect(subject.create).to be_a(RubyAmazonBedrock::ResponseBuilders::StabilityAi)
92
+ end
33
93
  end
34
94
  end
35
95
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'pry'
4
-
5
3
  RSpec.shared_examples 'a payload builder' do
6
4
  it 'validates the payload structure' do
7
5
  payload_builder = described_class.new(prompt, options)
@@ -28,7 +26,7 @@ RSpec.shared_context 'a121 labs parameters' do
28
26
  let(:body) do
29
27
  {
30
28
  prompt: prompt,
31
- maxTokenCount: 100,
29
+ maxTokens: 100,
32
30
  temperature: 0.5,
33
31
  topP: 2,
34
32
  stopSequences: %w[stop1 stop2],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-amazon-bedrock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alvaro Delgado
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-11 00:00:00.000000000 Z
11
+ date: 2024-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-bedrockruntime
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk-s3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
27
41
  description: The ruby-amazon-bedrock gem offers Ruby developers an efficient and user-friendly
28
42
  interface to Amazon Bedrock, a powerful library for AI-driven text and image
29
43
  generation. This gem simplifies the process of connecting to Amazon Bedrock's
@@ -80,8 +94,14 @@ files:
80
94
  - lib/bedrock_runtime/payload_builders/stability_ai/stable_diffusion_xl_v0.rb
81
95
  - lib/bedrock_runtime/payload_builders/stability_ai/stable_diffusion_xl_v1.rb
82
96
  - lib/bedrock_runtime/payload_factory.rb
83
- - lib/bedrock_runtime/response_builders/image.rb
84
- - lib/bedrock_runtime/response_builders/text.rb
97
+ - lib/bedrock_runtime/response_builders/ai_21_labs.rb
98
+ - lib/bedrock_runtime/response_builders/amazon_image.rb
99
+ - lib/bedrock_runtime/response_builders/amazon_text.rb
100
+ - lib/bedrock_runtime/response_builders/anthropic.rb
101
+ - lib/bedrock_runtime/response_builders/cohere_command.rb
102
+ - lib/bedrock_runtime/response_builders/cohere_embed.rb
103
+ - lib/bedrock_runtime/response_builders/meta.rb
104
+ - lib/bedrock_runtime/response_builders/stability_ai.rb
85
105
  - lib/bedrock_runtime/response_factory.rb
86
106
  - ruby-amazon-bedrock.gemspec
87
107
  - sig/ruby_amazon_bedrock.rbs
@@ -112,8 +132,8 @@ files:
112
132
  - spec/bedrock_runtime/payload_builders/stability_ai/stable_diffusion_xl_v0_spec.rb
113
133
  - spec/bedrock_runtime/payload_builders/stability_ai/stable_diffusion_xl_v1_spec.rb
114
134
  - spec/bedrock_runtime/payload_factory_spec.rb
115
- - spec/bedrock_runtime/response_builders/image_spec.rb
116
- - spec/bedrock_runtime/response_builders/text_spec.rb
135
+ - spec/bedrock_runtime/response_builders/ai_21_labs_spec.rb
136
+ - spec/bedrock_runtime/response_builders/stability_ai_spec.rb
117
137
  - spec/bedrock_runtime/response_factory_spec.rb
118
138
  - spec/cassettes/models/amazon_titan-text-express-v1.yml
119
139
  - spec/cassettes/models/amazon_titan-text-lite-v1.yml