ruby-openai 2.0.1 → 2.2.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: 4fafce333da7c64cacff4af92a1aa6f9a6b852a6c84bcf139668ad6763e93be0
4
- data.tar.gz: bd5ae87214057466912c2892123e5d1ab6efc2dc570cbbe00c13679417506706
3
+ metadata.gz: 6b9c4dc42598004908a840d7f014259502f876df499c2bcfc93170e4fc44f729
4
+ data.tar.gz: 4149a872b11219223412e9a1c8ce0e8f4c25706b75e30acb8c41ae80144cfd83
5
5
  SHA512:
6
- metadata.gz: 1eac6b65e9ed0b8f932f0f9b65670df4a96e988a56c8ea302abbcf675b670917d4f1dd9289cfc0fa0be5868811888e0e67851338258ccfa8c5954fee82b1df6a
7
- data.tar.gz: e1b856074548b44c228170c8f211737df30d1106edf5097d115df5b286447959bbbd30f6d7d3d8b33a88ebcd64303596240804192c710329b421749da8eac709
6
+ metadata.gz: b2dbfdb269b5cee46758307b32ad149ed198a994aa79274d1790e12c13c5505e6b7a126647725d8169204bea69b16b82f37e42a69903e20af9d3f5f5b07f5b51
7
+ data.tar.gz: 5c75f720b3f329f4ef4d37ed7b768c7edc46b97de843687543e382b49db98fc0df730c3dbab068f05862e765be59a75c7efadc405f9864554db84246efe61ece
data/CHANGELOG.md CHANGED
@@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.2.0] - 2022-12-15
9
+
10
+ ### Added
11
+
12
+ - Add Organization ID to headers so users can charge credits to the correct organization.
13
+ - Thanks [@mridul911](https://github.com/mridul911) for raising this and [@maks112v](https://github.com/maks112v) for adding it!
14
+
15
+ ## [2.1.0] - 2022-11-13
16
+
17
+ ### Added
18
+
19
+ - Add Images#generate endpoint to generate images with DALL·E!
20
+
8
21
  ## [2.0.1] - 2022-10-22
9
22
 
10
23
  ### Removed
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ gemspec
5
5
 
6
6
  gem "byebug", "~> 11.1.3"
7
7
  gem "rake", "~> 13.0"
8
- gem "rspec", "~> 3.11"
9
- gem "rubocop", "~> 1.37.0"
8
+ gem "rspec", "~> 3.12"
9
+ gem "rubocop", "~> 1.40.0"
10
10
  gem "vcr", "~> 6.1.0"
11
11
  gem "webmock", "~> 3.18.1"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-openai (2.0.1)
4
+ ruby-openai (2.2.0)
5
5
  dotenv (>= 2.7.6, < 2.9.0)
6
6
  httparty (>= 0.18.1, < 0.21.0)
7
7
 
@@ -20,43 +20,43 @@ GEM
20
20
  httparty (0.20.0)
21
21
  mime-types (~> 3.0)
22
22
  multi_xml (>= 0.5.2)
23
- json (2.6.2)
23
+ json (2.6.3)
24
24
  mime-types (3.4.1)
25
25
  mime-types-data (~> 3.2015)
26
26
  mime-types-data (3.2022.0105)
27
27
  multi_xml (0.6.0)
28
28
  parallel (1.22.1)
29
- parser (3.1.2.1)
29
+ parser (3.1.3.0)
30
30
  ast (~> 2.4.1)
31
31
  public_suffix (4.0.7)
32
32
  rainbow (3.1.1)
33
33
  rake (13.0.6)
34
- regexp_parser (2.6.0)
34
+ regexp_parser (2.6.1)
35
35
  rexml (3.2.5)
36
- rspec (3.11.0)
37
- rspec-core (~> 3.11.0)
38
- rspec-expectations (~> 3.11.0)
39
- rspec-mocks (~> 3.11.0)
40
- rspec-core (3.11.0)
41
- rspec-support (~> 3.11.0)
42
- rspec-expectations (3.11.0)
36
+ rspec (3.12.0)
37
+ rspec-core (~> 3.12.0)
38
+ rspec-expectations (~> 3.12.0)
39
+ rspec-mocks (~> 3.12.0)
40
+ rspec-core (3.12.0)
41
+ rspec-support (~> 3.12.0)
42
+ rspec-expectations (3.12.0)
43
43
  diff-lcs (>= 1.2.0, < 2.0)
44
- rspec-support (~> 3.11.0)
45
- rspec-mocks (3.11.0)
44
+ rspec-support (~> 3.12.0)
45
+ rspec-mocks (3.12.0)
46
46
  diff-lcs (>= 1.2.0, < 2.0)
47
- rspec-support (~> 3.11.0)
48
- rspec-support (3.11.0)
49
- rubocop (1.37.0)
47
+ rspec-support (~> 3.12.0)
48
+ rspec-support (3.12.0)
49
+ rubocop (1.40.0)
50
50
  json (~> 2.3)
51
51
  parallel (~> 1.10)
52
52
  parser (>= 3.1.2.1)
53
53
  rainbow (>= 2.2.2, < 4.0)
54
54
  regexp_parser (>= 1.8, < 3.0)
55
55
  rexml (>= 3.2.5, < 4.0)
56
- rubocop-ast (>= 1.22.0, < 2.0)
56
+ rubocop-ast (>= 1.23.0, < 2.0)
57
57
  ruby-progressbar (~> 1.7)
58
58
  unicode-display_width (>= 1.4.0, < 3.0)
59
- rubocop-ast (1.22.0)
59
+ rubocop-ast (1.24.0)
60
60
  parser (>= 3.1.1.0)
61
61
  ruby-progressbar (1.11.0)
62
62
  unicode-display_width (2.3.0)
@@ -72,8 +72,8 @@ PLATFORMS
72
72
  DEPENDENCIES
73
73
  byebug (~> 11.1.3)
74
74
  rake (~> 13.0)
75
- rspec (~> 3.11)
76
- rubocop (~> 1.37.0)
75
+ rspec (~> 3.12)
76
+ rubocop (~> 1.40.0)
77
77
  ruby-openai!
78
78
  vcr (~> 6.1.0)
79
79
  webmock (~> 3.18.1)
data/README.md CHANGED
@@ -35,14 +35,16 @@ and require with:
35
35
 
36
36
  ## Usage
37
37
 
38
- Get your API key from [https://beta.openai.com/account/api-keys](https://beta.openai.com/account/api-keys)
38
+ - Get your API key from [https://beta.openai.com/account/api-keys](https://beta.openai.com/account/api-keys)
39
+ - If you belong to multiple organizations, you can get your Organization ID from [https://beta.openai.com/account/org-settings](https://beta.openai.com/account/org-settings)
39
40
 
40
41
  ### With dotenv
41
42
 
42
- If you're using [dotenv](https://github.com/motdotla/dotenv), you can add your secret key to your .env file:
43
+ If you're using [dotenv](https://github.com/motdotla/dotenv), you can add your secret keys to your .env file:
43
44
 
44
45
  ```
45
46
  OPENAI_ACCESS_TOKEN=access_token_goes_here
47
+ OPENAI_ORGANIZATION_ID=organization_id_goes_here # Optional.
46
48
  ```
47
49
 
48
50
  And create a client:
@@ -56,7 +58,10 @@ And create a client:
56
58
  Alternatively you can pass your key directly to a new client:
57
59
 
58
60
  ```ruby
59
- client = OpenAI::Client.new(access_token: "access_token_goes_here")
61
+ client = OpenAI::Client.new(
62
+ access_token: "access_token_goes_here",
63
+ organization_id: "organization_id_goes_here"
64
+ )
60
65
  ```
61
66
 
62
67
  ### Models
@@ -194,6 +199,18 @@ This fine-tuned model name can then be used in classifications:
194
199
  JSON.parse(response.body)["choices"].map { |c| c["text"] }
195
200
  ```
196
201
 
202
+ ### Images
203
+
204
+ Generate an image using DALL·E!
205
+
206
+ ```ruby
207
+ response = client.images.generate(parameters: { prompt: "A baby sea otter cooking pasta wearing a hat of some sort" })
208
+ puts response.dig("data", 0, "url")
209
+ => "https://oaidalleapiprodscus.blob.core.windows.net/private/org-Rf437IxKhh..."
210
+ ```
211
+
212
+ ![Otter Chef](https://oaidalleapiprodscus.blob.core.windows.net/private/org-Rf437IxKhhQPMiIQ0Es8OwrH/user-jxM65ijkZc1qRfHC0IJ8mOIc/img-UrDvFC4tDnuhTieF7TrTJ2gq.png?st=2022-11-13T15%3A55%3A34Z&se=2022-11-13T17%3A55%3A34Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-13T01%3A32%3A30Z&ske=2022-11-14T01%3A32%3A30Z&sks=b&skv=2021-08-06&sig=tLdggckHl20CnnpCleoeiAEQjy4zMjuZJiUdovmkoF0%3D)
213
+
197
214
  ### Moderations
198
215
 
199
216
  Pass a string to check if it violates OpenAI's Content Policy:
@@ -260,11 +277,11 @@ Or use the ID of a file you've uploaded:
260
277
 
261
278
  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.
262
279
 
263
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, update `CHANGELOG.md`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
280
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, update `CHANGELOG.md`, run `bundle install` to update Gemfile.lock, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
264
281
 
265
282
  ## Contributing
266
283
 
267
- Bug reports and pull requests are welcome on GitHub at https://github.com/alexrudall/ruby-openai. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/alexrudall/ruby-openai/blob/main/CODE_OF_CONDUCT.md).
284
+ Bug reports and pull requests are welcome on GitHub at <https://github.com/alexrudall/ruby-openai>. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/alexrudall/ruby-openai/blob/main/CODE_OF_CONDUCT.md).
268
285
 
269
286
  ## License
270
287
 
@@ -3,8 +3,9 @@ module OpenAI
3
3
  include HTTParty
4
4
  base_uri "https://api.openai.com"
5
5
 
6
- def initialize(access_token: nil)
6
+ def initialize(access_token: nil, organization_id: nil)
7
7
  @access_token = access_token || ENV.fetch("OPENAI_ACCESS_TOKEN")
8
+ @organization_id = organization_id || ENV.fetch("OPENAI_ORGANIZATION_ID", nil)
8
9
  end
9
10
 
10
11
  def answers(version: default_version, parameters: {})
@@ -43,19 +44,25 @@ module OpenAI
43
44
  warn "[DEPRECATION WARNING] [ruby-openai] `Client#engines` is deprecated and will
44
45
  be removed from ruby-openai v3.0. Use `Client#models` instead."
45
46
 
46
- @engines ||= OpenAI::Engines.new(access_token: @access_token)
47
+ @engines ||= OpenAI::Engines.new(access_token: @access_token,
48
+ organization_id: @organization_id)
47
49
  end
48
50
 
49
51
  def files
50
- @files ||= OpenAI::Files.new(access_token: @access_token)
52
+ @files ||= OpenAI::Files.new(access_token: @access_token, organization_id: @organization_id)
51
53
  end
52
54
 
53
55
  def finetunes
54
- @finetunes ||= OpenAI::Finetunes.new(access_token: @access_token)
56
+ @finetunes ||= OpenAI::Finetunes.new(access_token: @access_token,
57
+ organization_id: @organization_id)
58
+ end
59
+
60
+ def images
61
+ @images ||= OpenAI::Images.new(access_token: @access_token, organization_id: @organization_id)
55
62
  end
56
63
 
57
64
  def models
58
- @models ||= OpenAI::Models.new(access_token: @access_token)
65
+ @models ||= OpenAI::Models.new(access_token: @access_token, organization_id: @organization_id)
59
66
  end
60
67
 
61
68
  def moderations(version: default_version, parameters: {})
@@ -97,7 +104,8 @@ module OpenAI
97
104
  url,
98
105
  headers: {
99
106
  "Content-Type" => "application/json",
100
- "Authorization" => "Bearer #{@access_token}"
107
+ "Authorization" => "Bearer #{@access_token}",
108
+ "OpenAI-Organization" => @organization_id
101
109
  },
102
110
  body: parameters.to_json
103
111
  )
@@ -3,8 +3,9 @@ module OpenAI
3
3
  include HTTParty
4
4
  base_uri "https://api.openai.com"
5
5
 
6
- def initialize(access_token: nil)
6
+ def initialize(access_token: nil, organization_id: nil)
7
7
  @access_token = access_token || ENV.fetch("OPENAI_ACCESS_TOKEN")
8
+ @organization_id = organization_id || ENV.fetch("OPENAI_ORGANIZATION_ID", nil)
8
9
  end
9
10
 
10
11
  def list(version: default_version)
@@ -12,7 +13,8 @@ module OpenAI
12
13
  "/#{version}/engines",
13
14
  headers: {
14
15
  "Content-Type" => "application/json",
15
- "Authorization" => "Bearer #{@access_token}"
16
+ "Authorization" => "Bearer #{@access_token}",
17
+ "OpenAI-Organization" => @organization_id
16
18
  }
17
19
  )
18
20
  end
@@ -22,7 +24,8 @@ module OpenAI
22
24
  "/#{version}/engines/#{id}",
23
25
  headers: {
24
26
  "Content-Type" => "application/json",
25
- "Authorization" => "Bearer #{@access_token}"
27
+ "Authorization" => "Bearer #{@access_token}",
28
+ "OpenAI-Organization" => @organization_id
26
29
  }
27
30
  )
28
31
  end
@@ -3,8 +3,9 @@ module OpenAI
3
3
  include HTTParty
4
4
  base_uri "https://api.openai.com"
5
5
 
6
- def initialize(access_token: nil)
6
+ def initialize(access_token: nil, organization_id: nil)
7
7
  @access_token = access_token || ENV.fetch("OPENAI_ACCESS_TOKEN")
8
+ @organization_id = organization_id || ENV.fetch("OPENAI_ORGANIZATION_ID", nil)
8
9
  end
9
10
 
10
11
  def list(version: default_version)
@@ -12,7 +13,8 @@ module OpenAI
12
13
  "/#{version}/files",
13
14
  headers: {
14
15
  "Content-Type" => "application/json",
15
- "Authorization" => "Bearer #{@access_token}"
16
+ "Authorization" => "Bearer #{@access_token}",
17
+ "OpenAI-Organization" => @organization_id
16
18
  }
17
19
  )
18
20
  end
@@ -24,7 +26,8 @@ module OpenAI
24
26
  "/#{version}/files",
25
27
  headers: {
26
28
  "Content-Type" => "application/json",
27
- "Authorization" => "Bearer #{@access_token}"
29
+ "Authorization" => "Bearer #{@access_token}",
30
+ "OpenAI-Organization" => @organization_id
28
31
  },
29
32
  body: parameters.merge(file: File.open(parameters[:file]))
30
33
  )
@@ -35,7 +38,8 @@ module OpenAI
35
38
  "/#{version}/files/#{id}",
36
39
  headers: {
37
40
  "Content-Type" => "application/json",
38
- "Authorization" => "Bearer #{@access_token}"
41
+ "Authorization" => "Bearer #{@access_token}",
42
+ "OpenAI-Organization" => @organization_id
39
43
  }
40
44
  )
41
45
  end
@@ -45,7 +49,8 @@ module OpenAI
45
49
  "/#{version}/files/#{id}",
46
50
  headers: {
47
51
  "Content-Type" => "application/json",
48
- "Authorization" => "Bearer #{@access_token}"
52
+ "Authorization" => "Bearer #{@access_token}",
53
+ "OpenAI-Organization" => @organization_id
49
54
  }
50
55
  )
51
56
  end
@@ -3,8 +3,9 @@ module OpenAI
3
3
  include HTTParty
4
4
  base_uri "https://api.openai.com"
5
5
 
6
- def initialize(access_token: nil)
6
+ def initialize(access_token: nil, organization_id: nil)
7
7
  @access_token = access_token || ENV.fetch("OPENAI_ACCESS_TOKEN")
8
+ @organization_id = organization_id || ENV.fetch("OPENAI_ORGANIZATION_ID", nil)
8
9
  end
9
10
 
10
11
  def list(version: default_version)
@@ -12,7 +13,8 @@ module OpenAI
12
13
  "/#{version}/fine-tunes",
13
14
  headers: {
14
15
  "Content-Type" => "application/json",
15
- "Authorization" => "Bearer #{@access_token}"
16
+ "Authorization" => "Bearer #{@access_token}",
17
+ "OpenAI-Organization" => @organization_id
16
18
  }
17
19
  )
18
20
  end
@@ -22,7 +24,8 @@ module OpenAI
22
24
  "/#{version}/fine-tunes",
23
25
  headers: {
24
26
  "Content-Type" => "application/json",
25
- "Authorization" => "Bearer #{@access_token}"
27
+ "Authorization" => "Bearer #{@access_token}",
28
+ "OpenAI-Organization" => @organization_id
26
29
  },
27
30
  body: parameters.to_json
28
31
  )
@@ -33,7 +36,8 @@ module OpenAI
33
36
  "/#{version}/fine-tunes/#{id}",
34
37
  headers: {
35
38
  "Content-Type" => "application/json",
36
- "Authorization" => "Bearer #{@access_token}"
39
+ "Authorization" => "Bearer #{@access_token}",
40
+ "OpenAI-Organization" => @organization_id
37
41
  }
38
42
  )
39
43
  end
@@ -43,7 +47,8 @@ module OpenAI
43
47
  "/#{version}/fine-tunes/#{id}/cancel",
44
48
  headers: {
45
49
  "Content-Type" => "application/json",
46
- "Authorization" => "Bearer #{@access_token}"
50
+ "Authorization" => "Bearer #{@access_token}",
51
+ "OpenAI-Organization" => @organization_id
47
52
  }
48
53
  )
49
54
  end
@@ -53,7 +58,8 @@ module OpenAI
53
58
  "/#{version}/fine-tunes/#{id}/events",
54
59
  headers: {
55
60
  "Content-Type" => "application/json",
56
- "Authorization" => "Bearer #{@access_token}"
61
+ "Authorization" => "Bearer #{@access_token}",
62
+ "OpenAI-Organization" => @organization_id
57
63
  }
58
64
  )
59
65
  end
@@ -0,0 +1,29 @@
1
+ module OpenAI
2
+ class Images
3
+ include HTTParty
4
+ base_uri "https://api.openai.com"
5
+
6
+ def initialize(access_token: nil, organization_id: nil)
7
+ @access_token = access_token || ENV.fetch("OPENAI_ACCESS_TOKEN")
8
+ @organization_id = organization_id || ENV.fetch("OPENAI_ORGANIZATION_ID", nil)
9
+ end
10
+
11
+ def generate(version: default_version, parameters: {})
12
+ self.class.post(
13
+ "/#{version}/images/generations",
14
+ headers: {
15
+ "Content-Type" => "application/json",
16
+ "Authorization" => "Bearer #{@access_token}",
17
+ "OpenAI-Organization" => @organization_id
18
+ },
19
+ body: parameters.to_json
20
+ )
21
+ end
22
+
23
+ private
24
+
25
+ def default_version
26
+ "v1".freeze
27
+ end
28
+ end
29
+ end
@@ -3,8 +3,9 @@ module OpenAI
3
3
  include HTTParty
4
4
  base_uri "https://api.openai.com"
5
5
 
6
- def initialize(access_token: nil)
6
+ def initialize(access_token: nil, organization_id: nil)
7
7
  @access_token = access_token || ENV.fetch("OPENAI_ACCESS_TOKEN")
8
+ @organization_id = organization_id || ENV.fetch("OPENAI_ORGANIZATION_ID", nil)
8
9
  end
9
10
 
10
11
  def list(version: default_version)
@@ -12,7 +13,8 @@ module OpenAI
12
13
  "/#{version}/models",
13
14
  headers: {
14
15
  "Content-Type" => "application/json",
15
- "Authorization" => "Bearer #{@access_token}"
16
+ "Authorization" => "Bearer #{@access_token}",
17
+ "OpenAI-Organization" => @organization_id
16
18
  }
17
19
  )
18
20
  end
@@ -22,7 +24,8 @@ module OpenAI
22
24
  "/#{version}/models/#{id}",
23
25
  headers: {
24
26
  "Content-Type" => "application/json",
25
- "Authorization" => "Bearer #{@access_token}"
27
+ "Authorization" => "Bearer #{@access_token}",
28
+ "OpenAI-Organization" => @organization_id
26
29
  }
27
30
  )
28
31
  end
@@ -1,5 +1,5 @@
1
1
  module Ruby
2
2
  module OpenAI
3
- VERSION = "2.0.1".freeze
3
+ VERSION = "2.2.0".freeze
4
4
  end
5
5
  end
data/lib/ruby/openai.rb CHANGED
@@ -2,6 +2,7 @@ require "httparty"
2
2
  require "ruby/openai/engines"
3
3
  require "ruby/openai/files"
4
4
  require "ruby/openai/finetunes"
5
+ require "ruby/openai/images"
5
6
  require "ruby/openai/models"
6
7
  require "ruby/openai/client"
7
8
  require "ruby/openai/version"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-openai
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-22 00:00:00.000000000 Z
11
+ date: 2022-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv
@@ -80,6 +80,7 @@ files:
80
80
  - lib/ruby/openai/engines.rb
81
81
  - lib/ruby/openai/files.rb
82
82
  - lib/ruby/openai/finetunes.rb
83
+ - lib/ruby/openai/images.rb
83
84
  - lib/ruby/openai/models.rb
84
85
  - lib/ruby/openai/version.rb
85
86
  - pull_request_template.md