ruby-openai 2.0.1 → 2.2.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: 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