gen-ai 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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