gen-ai 0.2.2 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b25d130c100818a73d652eaf9b585a4d024f6134a66de3f20eb5dd6e3d2212a
4
- data.tar.gz: 7d971d676915f71edf74fec57cd7cb59b2d2c6607d7ed818d05d07b19f8cdecc
3
+ metadata.gz: 1bbe9213620c2cb3e76d8b77bf895408a3e48398ac6bddf2a9cad20e5933fee4
4
+ data.tar.gz: 479fe26279cff268b640aba8afd100422f1c2548b0842543081c829637bbf8dd
5
5
  SHA512:
6
- metadata.gz: 98554f5f32925f6ea70ea78e8c462d3d24949fb265fed69ae5f73fc722206c455e81bec75a879aa21bf841b372518f6ffce5497ec3c82bf60260b4d4c8ed2525
7
- data.tar.gz: 905b2aa2b483711de399aa166dc5c83f9e7a482a1649f77281c995adbcf0f3dc9847b3ecbc0bdc21028a0f79f4ffb770c0a09dbad6a02d2a191d206dfeb43712
6
+ metadata.gz: dacb5b6e3a5b56e3d2dc0833b9169ef77146decd34010a20945f69a974a273c5a3e7316893c7c0a2809b6e96f0113b976cd9d3dad036060c6a054ca6a9170831
7
+ data.tar.gz: c0fd1e20f18d89c828b32a76f8c43af78fa7b0e3730f8172256e193e65eeec5a4eba26b32bb08ddcf9f2147196c2ba20d37c1eba6fdbbbea8f91787319723f79
data/README.md CHANGED
@@ -20,23 +20,29 @@ If bundler is not being used to manage dependencies, install the gem by executin
20
20
 
21
21
  ## Usage
22
22
 
23
+ Require it in you code:
24
+
25
+ ```ruby
26
+ require 'gen_ai'
27
+ ```
28
+
23
29
  ### Feature support
24
- ✅ - Supported | ❌ - Not supported | 🛠️ - Work in progress
30
+
31
+ ✅ - Supported | ❌ - Not supported | 🛠️ - Work in progress
25
32
 
26
33
  Language models capabilities
27
34
 
28
35
  | Provider | Embedding | Completion | Conversation | Sentiment | Summarization |
29
- | ---------------- | --------- | :--------: | :----------: | :-------: | :-----------: |
30
- | **OpenAI** | | | | 🛠️ | 🛠️ |
31
- | **Google Palm2** | | | | 🛠️ | 🛠️ |
32
-
36
+ | ---------------- | :-------: | :--------: | :----------: | :-------: | :-----------: |
37
+ | **OpenAI** | | | | 🛠️ | 🛠️ |
38
+ | **Google Palm2** | | | | 🛠️ | 🛠️ |
33
39
 
34
40
  Image generation model capabilities
35
41
 
36
- | Provider | Generate | Variations | Edit | Upscale |
37
- | ---------------- | --------- | :--------: | :----------: | :-------: |
38
- | **OpenAI** | | | | |
39
- | **StabilityAI** | | | | |
42
+ | Provider | Generate | Variations | Edit | Upscale |
43
+ | --------------- | :------: | :--------: | :--: | :-----: |
44
+ | **OpenAI** | | | | |
45
+ | **StabilityAI** | | | | |
40
46
 
41
47
  ### Language
42
48
 
@@ -116,15 +122,18 @@ result = model.generate('A painting of a dog')
116
122
  # => #<GenAI::Result:0x0000000110be6f20...>
117
123
 
118
124
  result.value
119
- # => Base64 encoded image
125
+ # => image binary
126
+
127
+ result.value(:base64)
128
+ # => image in base64
120
129
 
121
130
  # Save image to file
122
131
  File.open('dog.jpg', 'wb') do |f|
123
- f.write(Base64.decode64(result.value))
132
+ f.write(result.value)
124
133
  end
125
134
  ```
126
- ![dog](https://github.com/alchaplinsky/gen-ai/assets/695947/27a2af5d-530b-4966-94e8-6cdf628b6cac)
127
135
 
136
+ ![dog](https://github.com/alchaplinsky/gen-ai/assets/695947/27a2af5d-530b-4966-94e8-6cdf628b6cac)
128
137
 
129
138
  Get more **variations** of the same image
130
139
 
@@ -133,16 +142,19 @@ result = model.variations('./dog.jpg')
133
142
  # => #<GenAI::Result:0x0000000116a1ec50...>
134
143
 
135
144
  result.value
136
- # => Base64 encoded image
145
+ # => image binary
146
+
147
+ result.value(:base64)
148
+ # => image in base64
137
149
 
138
150
  # Save image to file
139
151
  File.open('dog_variation.jpg', 'wb') do |f|
140
- f.write(Base64.decode64(result.value))
152
+ f.write(result.value)
141
153
  end
142
154
 
143
155
  ```
144
- ![dog_variation](https://github.com/alchaplinsky/gen-ai/assets/695947/977f5238-0114-4085-8e61-8f8b356ce308)
145
156
 
157
+ ![dog_variation](https://github.com/alchaplinsky/gen-ai/assets/695947/977f5238-0114-4085-8e61-8f8b356ce308)
146
158
 
147
159
  **Editing** existing images with additional prompt
148
160
 
@@ -151,18 +163,20 @@ result = model.edit('./llama.jpg', 'A cute llama wearing a beret', mask: './mask
151
163
  # => #<GenAI::Result:0x0000000116a1ec50...>
152
164
 
153
165
  result.value
154
- # => Base64 encoded image
166
+ # => image binary
167
+
168
+ result.value(:base64)
169
+ # => image in base64
155
170
 
156
171
  # Save image to file
157
172
  File.open('dog_edited.jpg', 'wb') do |f|
158
- f.write(Base64.decode64(result.value))
173
+ f.write(result.value)
159
174
  end
160
175
  ```
161
176
 
162
177
  ![llama](https://github.com/alchaplinsky/gen-ai/assets/695947/9c862c6c-428e-463c-b935-ca749a6a33df)
163
178
  ![llama_edited](https://github.com/alchaplinsky/gen-ai/assets/695947/070d8e6a-07a0-4ed2-826f-8b9aabd183ae)
164
179
 
165
-
166
180
  ## Development
167
181
 
168
182
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/gen/ai.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../gen_ai'
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'base64'
4
+
3
5
  module GenAI
4
6
  class Image
5
7
  class OpenAI < Base
6
8
  DEFAULT_SIZE = '256x256'
9
+ DEFAULT_MODEL = 'dall-e-3'
7
10
  RESPONSE_FORMAT = 'b64_json'
8
11
 
9
12
  def initialize(token:, options: {})
@@ -19,8 +22,8 @@ module GenAI
19
22
 
20
23
  build_result(
21
24
  raw: response,
22
- model: 'dall-e',
23
- parsed: response['data'].map { |datum| datum[RESPONSE_FORMAT] }
25
+ model: parameters[:model],
26
+ parsed: parse_response_data(response['data'])
24
27
  )
25
28
  end
26
29
 
@@ -31,8 +34,8 @@ module GenAI
31
34
 
32
35
  build_result(
33
36
  raw: response,
34
- model: 'dall-e',
35
- parsed: response['data'].map { |datum| datum[RESPONSE_FORMAT] }
37
+ model: parameters[:model],
38
+ parsed: parse_response_data(response['data'])
36
39
  )
37
40
  end
38
41
 
@@ -43,8 +46,8 @@ module GenAI
43
46
 
44
47
  build_result(
45
48
  raw: response,
46
- model: 'dall-e',
47
- parsed: response['data'].map { |datum| datum[RESPONSE_FORMAT] }
49
+ model: parameters[:model],
50
+ parsed: parse_response_data(response['data'])
48
51
  )
49
52
  end
50
53
 
@@ -54,6 +57,7 @@ module GenAI
54
57
  {
55
58
  prompt: prompt,
56
59
  size: options.delete(:size) || DEFAULT_SIZE,
60
+ model: options.delete(:model) || DEFAULT_MODEL,
57
61
  response_format: options.delete(:response_format) || RESPONSE_FORMAT
58
62
  }.merge(options)
59
63
  end
@@ -62,6 +66,7 @@ module GenAI
62
66
  {
63
67
  image: image,
64
68
  size: options.delete(:size) || DEFAULT_SIZE,
69
+ model: 'dall-e-2', # variation is only available on dall-e-2
65
70
  response_format: options.delete(:response_format) || RESPONSE_FORMAT
66
71
  }.merge(options)
67
72
  end
@@ -71,9 +76,14 @@ module GenAI
71
76
  image: image,
72
77
  prompt: prompt,
73
78
  size: options.delete(:size) || DEFAULT_SIZE,
79
+ model: 'dall-e-2', # edit is only available on dall-e-2
74
80
  response_format: options.delete(:response_format) || RESPONSE_FORMAT
75
81
  }.merge(options)
76
82
  end
83
+
84
+ def parse_response_data(data)
85
+ data.map { |datum| Base64.decode64(datum[RESPONSE_FORMAT]) }
86
+ end
77
87
  end
78
88
  end
79
89
  end
@@ -23,7 +23,7 @@ module GenAI
23
23
  build_result(
24
24
  raw: response,
25
25
  model: model,
26
- parsed: response['artifacts'].map { |artifact| artifact['base64'] }
26
+ parsed: parse_response_data(response['artifacts'])
27
27
  )
28
28
  end
29
29
 
@@ -36,7 +36,7 @@ module GenAI
36
36
  build_result(
37
37
  raw: response,
38
38
  model: model,
39
- parsed: response['artifacts'].map { |artifact| artifact['base64'] }
39
+ parsed: parse_response_data(response['artifacts'])
40
40
  )
41
41
  end
42
42
 
@@ -49,7 +49,7 @@ module GenAI
49
49
  build_result(
50
50
  raw: response,
51
51
  model: model,
52
- parsed: response['artifacts'].map { |artifact| artifact['base64'] }
52
+ parsed: parse_response_data(response['artifacts'])
53
53
  )
54
54
  end
55
55
 
@@ -91,6 +91,10 @@ module GenAI
91
91
  size = options.delete(:size) || DEFAULT_SIZE
92
92
  size.split('x').map(&:to_i)
93
93
  end
94
+
95
+ def parse_response_data(data)
96
+ data.map { |artifact| Base64.decode64(artifact['base64']) }
97
+ end
94
98
  end
95
99
  end
96
100
  end
data/lib/gen_ai/result.rb CHANGED
@@ -11,8 +11,15 @@ module GenAI
11
11
  @values = values
12
12
  end
13
13
 
14
- def value
15
- values.first
14
+ def value(format = :raw)
15
+ case format
16
+ when :raw
17
+ values.first
18
+ when :base64
19
+ Base64.encode64(values.first)
20
+ else
21
+ raise "Unsupported format: #{format}"
22
+ end
16
23
  end
17
24
 
18
25
  def prompt_tokens
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GenAI
4
- VERSION = '0.2.2'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/gen_ai.rb CHANGED
@@ -8,6 +8,7 @@ loader.inflector.inflect(
8
8
  'open_ai' => 'OpenAI',
9
9
  'stability_ai' => 'StabilityAI'
10
10
  )
11
+ loader.ignore("#{__dir__}/gen")
11
12
  loader.setup
12
13
 
13
14
  module GenAI
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gen-ai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Chaplinsky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-29 00:00:00.000000000 Z
11
+ date: 2023-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -96,6 +96,7 @@ files:
96
96
  - README.md
97
97
  - Rakefile
98
98
  - gen-ai.gemspec
99
+ - lib/gen/ai.rb
99
100
  - lib/gen_ai.rb
100
101
  - lib/gen_ai/api/client.rb
101
102
  - lib/gen_ai/base.rb