ruby-openai 3.0.2 → 3.1.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: 73d5bf4fb81e5c4901998a20fcebc52a0f2c81edc12e7e8abac06a2171dd5c6e
4
- data.tar.gz: 4775fd5959d4c5949cec0a02212a73ddc2b3af8cde3f1f9d996bcd3c71031c62
3
+ metadata.gz: 7fc83568b242ec1d301ebe76a0eeb5a22485f94cb287df47b92c1a46f47c193d
4
+ data.tar.gz: 2736973c009f727093c14960cb1468e00f3af357281ea8bba237d82da7d39ff4
5
5
  SHA512:
6
- metadata.gz: 1a8d81ddbb8e2542f968549ef4014600c7cd6fff78404501a7d72d322d823651842e0b0f1aaf96238d5a2ea870eda7e626c53652e21aba105703b062c746487c
7
- data.tar.gz: 3ff7ba70a3fc55b2e9e56144a221ac485e3d3c2854980a3b340aeffc4c0a544bed8a2506d7c71f387403482eb4c8565f4a6705dad582f47ea726593d4c82a135
6
+ metadata.gz: 8056501328713524128f12120f3d005f4d980d1d73cedb2f0994ac59cb2e5c52fc43ddc12519640ac2834eaa61c774888c5e59e31b8035ba22cc7f09ddbffc6f
7
+ data.tar.gz: be7f713a587469f977615f16f03161252c9a729f79ff9e73e1b09c365fb52266d3c4c329630f226a6f56fe2cc2fe7f5346e00d9503470095cf1b9922ba084218
data/.circleci/config.yml CHANGED
@@ -42,3 +42,4 @@ workflows:
42
42
  - cimg/ruby:2.7-node
43
43
  - cimg/ruby:3.0-node
44
44
  - cimg/ruby:3.1-node
45
+ - cimg/ruby:3.2-node
data/CHANGELOG.md CHANGED
@@ -5,6 +5,29 @@ 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
+ ## [3.1.0] - 2023-02-13
9
+
10
+ ### Added
11
+
12
+ - Add Finetunes#delete endpoint - thanks [@lancecarlson](https://github.com/lancecarlson) for flagging this.
13
+ - Add VCR header and body matching - thanks [@petergoldstein](https://github.com/petergoldstein)!
14
+
15
+ ### Fixed
16
+
17
+ - Update File#upload specs to remove deprecated `answers` purpose.
18
+
19
+ ## [3.0.3] - 2023-01-07
20
+
21
+ ### Added
22
+
23
+ - Add ability to run the specs without VCR cassettes using `NO_VCR=true bundle exec rspec`.
24
+ - Add Ruby 3.2 to CircleCI config - thanks [@petergoldstein](https://github.com/petergoldstein)!
25
+ - A bit of detail added to the README on DALLE image sizes - thanks [@ndemianc](https://github.com/ndemianc)!
26
+
27
+ ### Fixed
28
+
29
+ - Fix finetunes and files uploads endpoints - thanks [@chaadow](https://github.com/chaadow) for your PR on this and [@petergoldstein](https://github.com/petergoldstein) for the PR we ultimately went with.
30
+
8
31
  ## [3.0.2] - 2022-12-27
9
32
 
10
33
  ### Fixed
data/Gemfile CHANGED
@@ -7,6 +7,6 @@ gem "byebug", "~> 11.1.3"
7
7
  gem "dotenv", "~> 2.8.1"
8
8
  gem "rake", "~> 13.0"
9
9
  gem "rspec", "~> 3.12"
10
- gem "rubocop", "~> 1.41.1"
10
+ gem "rubocop", "~> 1.45.1"
11
11
  gem "vcr", "~> 6.1.0"
12
12
  gem "webmock", "~> 3.18.1"
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-openai (3.0.2)
5
- httparty (>= 0.18.1, < 0.21.0)
4
+ ruby-openai (3.1.0)
5
+ httparty (>= 0.18.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- addressable (2.8.0)
11
- public_suffix (>= 2.0.2, < 5.0)
10
+ addressable (2.8.1)
11
+ public_suffix (>= 2.0.2, < 6.0)
12
12
  ast (2.4.2)
13
13
  byebug (11.1.3)
14
14
  crack (0.4.5)
@@ -16,21 +16,19 @@ GEM
16
16
  diff-lcs (1.5.0)
17
17
  dotenv (2.8.1)
18
18
  hashdiff (1.0.1)
19
- httparty (0.20.0)
20
- mime-types (~> 3.0)
19
+ httparty (0.21.0)
20
+ mini_mime (>= 1.0.0)
21
21
  multi_xml (>= 0.5.2)
22
22
  json (2.6.3)
23
- mime-types (3.4.1)
24
- mime-types-data (~> 3.2015)
25
- mime-types-data (3.2022.0105)
23
+ mini_mime (1.1.2)
26
24
  multi_xml (0.6.0)
27
25
  parallel (1.22.1)
28
- parser (3.1.3.0)
26
+ parser (3.2.0.0)
29
27
  ast (~> 2.4.1)
30
- public_suffix (4.0.7)
28
+ public_suffix (5.0.1)
31
29
  rainbow (3.1.1)
32
30
  rake (13.0.6)
33
- regexp_parser (2.6.1)
31
+ regexp_parser (2.7.0)
34
32
  rexml (3.2.5)
35
33
  rspec (3.12.0)
36
34
  rspec-core (~> 3.12.0)
@@ -38,27 +36,27 @@ GEM
38
36
  rspec-mocks (~> 3.12.0)
39
37
  rspec-core (3.12.0)
40
38
  rspec-support (~> 3.12.0)
41
- rspec-expectations (3.12.0)
39
+ rspec-expectations (3.12.2)
42
40
  diff-lcs (>= 1.2.0, < 2.0)
43
41
  rspec-support (~> 3.12.0)
44
- rspec-mocks (3.12.0)
42
+ rspec-mocks (3.12.3)
45
43
  diff-lcs (>= 1.2.0, < 2.0)
46
44
  rspec-support (~> 3.12.0)
47
45
  rspec-support (3.12.0)
48
- rubocop (1.41.1)
46
+ rubocop (1.45.1)
49
47
  json (~> 2.3)
50
48
  parallel (~> 1.10)
51
- parser (>= 3.1.2.1)
49
+ parser (>= 3.2.0.0)
52
50
  rainbow (>= 2.2.2, < 4.0)
53
51
  regexp_parser (>= 1.8, < 3.0)
54
52
  rexml (>= 3.2.5, < 4.0)
55
- rubocop-ast (>= 1.23.0, < 2.0)
53
+ rubocop-ast (>= 1.24.1, < 2.0)
56
54
  ruby-progressbar (~> 1.7)
57
- unicode-display_width (>= 1.4.0, < 3.0)
58
- rubocop-ast (1.24.0)
55
+ unicode-display_width (>= 2.4.0, < 3.0)
56
+ rubocop-ast (1.24.1)
59
57
  parser (>= 3.1.1.0)
60
58
  ruby-progressbar (1.11.0)
61
- unicode-display_width (2.3.0)
59
+ unicode-display_width (2.4.2)
62
60
  vcr (6.1.0)
63
61
  webmock (3.18.1)
64
62
  addressable (>= 2.8.0)
@@ -73,10 +71,10 @@ DEPENDENCIES
73
71
  dotenv (~> 2.8.1)
74
72
  rake (~> 13.0)
75
73
  rspec (~> 3.12)
76
- rubocop (~> 1.41.1)
74
+ rubocop (~> 1.45.1)
77
75
  ruby-openai!
78
76
  vcr (~> 6.1.0)
79
77
  webmock (~> 3.18.1)
80
78
 
81
79
  BUNDLED WITH
82
- 2.2.20
80
+ 2.4.5
data/README.md CHANGED
@@ -134,14 +134,14 @@ You can use the embeddings endpoint to get a vector of numbers representing an i
134
134
  Put your data in a `.jsonl` file like this:
135
135
 
136
136
  ```json
137
- {"text": "puppy A is happy", "metadata": "emotional state of puppy A"}
138
- {"text": "puppy B is sad", "metadata": "emotional state of puppy B"}
137
+ {"prompt":"Overjoyed with my new phone! ->", "completion":" positive"}
138
+ {"prompt":"@lakers disappoint for a third straight night ->", "completion":" negative"}
139
139
  ```
140
140
 
141
141
  and pass the path to `client.files.upload` to upload it to OpenAI, and then interact with it:
142
142
 
143
143
  ```ruby
144
- client.files.upload(parameters: { file: "path/to/puppy.jsonl", purpose: "search" })
144
+ client.files.upload(parameters: { file: "path/to/sentiment.jsonl", purpose: "fine-tune" })
145
145
  client.files.list
146
146
  client.files.retrieve(id: 123)
147
147
  client.files.delete(id: 123)
@@ -149,14 +149,7 @@ and pass the path to `client.files.upload` to upload it to OpenAI, and then inte
149
149
 
150
150
  ### Fine-tunes
151
151
 
152
- Put your fine-tuning data in a `.jsonl` file like this:
153
-
154
- ```json
155
- {"prompt":"Overjoyed with my new phone! ->", "completion":" positive"}
156
- {"prompt":"@lakers disappoint for a third straight night ->", "completion":" negative"}
157
- ```
158
-
159
- and pass the path to `client.files.upload` to upload it to OpenAI and get its ID:
152
+ Upload your fine-tuning data in a `.jsonl` file as above and get its ID:
160
153
 
161
154
  ```ruby
162
155
  response = client.files.upload(parameters: { file: "path/to/sentiment.jsonl", purpose: "fine-tune" })
@@ -200,12 +193,19 @@ This fine-tuned model name can then be used in completions:
200
193
  JSON.parse(response.body)["choices"].map { |c| c["text"] }
201
194
  ```
202
195
 
196
+ You can delete the fine-tuned model when you are done with it:
197
+
198
+ ```ruby
199
+ client.finetunes.delete(fine_tuned_model: fine_tuned_model)
200
+ ```
201
+
203
202
  ### Image Generation
204
203
 
205
- Generate an image using DALL·E!
204
+ Generate an image using DALL·E! The size of any generated images must be one of `256x256`, `512x512` or `1024x1024` -
205
+ if not specified the image will default to `1024x1024`.
206
206
 
207
207
  ```ruby
208
- response = client.images.generate(parameters: { prompt: "A baby sea otter cooking pasta wearing a hat of some sort" })
208
+ response = client.images.generate(parameters: { prompt: "A baby sea otter cooking pasta wearing a hat of some sort", size: "256x256" })
209
209
  puts response.dig("data", 0, "url")
210
210
  => "https://oaidalleapiprodscus.blob.core.windows.net/private/org-Rf437IxKhh..."
211
211
  ```
@@ -249,9 +249,19 @@ Pass a string to check if it violates OpenAI's Content Policy:
249
249
 
250
250
  ## Development
251
251
 
252
- 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.
252
+ After checking out the repo, run `bin/setup` to install dependencies. You can run `bin/console` for an interactive prompt that will allow you to experiment.
253
+
254
+ To install this gem onto your local machine, run `bundle exec rake install`.
255
+
256
+ ## Release
257
+
258
+ First run the specs without VCR so they actually hit the API. This will cost about 2 cents. You'll need to add your `OPENAI_ACCESS_TOKEN=` in `.env`.
259
+
260
+ ```
261
+ NO_VCR=true bundle exec rspec
262
+ ```
253
263
 
254
- 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
+ Then 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).
255
265
 
256
266
  ## Contributing
257
267
 
@@ -8,15 +8,15 @@ module OpenAI
8
8
  end
9
9
 
10
10
  def completions(parameters: {})
11
- OpenAI::Client.post(path: "/completions", parameters: parameters)
11
+ OpenAI::Client.json_post(path: "/completions", parameters: parameters)
12
12
  end
13
13
 
14
14
  def edits(parameters: {})
15
- OpenAI::Client.post(path: "/edits", parameters: parameters)
15
+ OpenAI::Client.json_post(path: "/edits", parameters: parameters)
16
16
  end
17
17
 
18
18
  def embeddings(parameters: {})
19
- OpenAI::Client.post(path: "/embeddings", parameters: parameters)
19
+ OpenAI::Client.json_post(path: "/embeddings", parameters: parameters)
20
20
  end
21
21
 
22
22
  def files
@@ -36,7 +36,7 @@ module OpenAI
36
36
  end
37
37
 
38
38
  def moderations(parameters: {})
39
- OpenAI::Client.post(path: "/moderations", parameters: parameters)
39
+ OpenAI::Client.json_post(path: "/moderations", parameters: parameters)
40
40
  end
41
41
 
42
42
  def self.get(path:)
@@ -46,11 +46,19 @@ module OpenAI
46
46
  )
47
47
  end
48
48
 
49
- def self.post(path:, parameters: nil)
49
+ def self.json_post(path:, parameters:)
50
50
  HTTParty.post(
51
51
  uri(path: path),
52
52
  headers: headers,
53
- body: parameters.to_json
53
+ body: parameters&.to_json
54
+ )
55
+ end
56
+
57
+ def self.multipart_post(path:, parameters: nil)
58
+ HTTParty.post(
59
+ uri(path: path),
60
+ headers: headers.merge({ "Content-Type" => "multipart/form-data" }),
61
+ body: parameters
54
62
  )
55
63
  end
56
64
 
@@ -12,7 +12,7 @@ module OpenAI
12
12
  def upload(parameters: {})
13
13
  validate(file: parameters[:file])
14
14
 
15
- OpenAI::Client.post(
15
+ OpenAI::Client.multipart_post(
16
16
  path: "/files",
17
17
  parameters: parameters.merge(file: File.open(parameters[:file]))
18
18
  )
@@ -10,7 +10,7 @@ module OpenAI
10
10
  end
11
11
 
12
12
  def create(parameters: {})
13
- OpenAI::Client.post(path: "/fine-tunes", parameters: parameters)
13
+ OpenAI::Client.json_post(path: "/fine-tunes", parameters: parameters)
14
14
  end
15
15
 
16
16
  def retrieve(id:)
@@ -18,11 +18,19 @@ module OpenAI
18
18
  end
19
19
 
20
20
  def cancel(id:)
21
- OpenAI::Client.post(path: "/fine-tunes/#{id}/cancel")
21
+ OpenAI::Client.multipart_post(path: "/fine-tunes/#{id}/cancel")
22
22
  end
23
23
 
24
24
  def events(id:)
25
25
  OpenAI::Client.get(path: "/fine-tunes/#{id}/events")
26
26
  end
27
+
28
+ def delete(fine_tuned_model:)
29
+ if fine_tuned_model.start_with?("ft-")
30
+ raise ArgumentError, "Please give a fine_tuned_model name, not a fine-tune ID"
31
+ end
32
+
33
+ OpenAI::Client.delete(path: "/models/#{fine_tuned_model}")
34
+ end
27
35
  end
28
36
  end
@@ -6,15 +6,15 @@ module OpenAI
6
6
  end
7
7
 
8
8
  def generate(parameters: {})
9
- OpenAI::Client.post(path: "/images/generations", parameters: parameters)
9
+ OpenAI::Client.json_post(path: "/images/generations", parameters: parameters)
10
10
  end
11
11
 
12
12
  def edit(parameters: {})
13
- OpenAI::Client.post(path: "/images/edits", parameters: open_files(parameters))
13
+ OpenAI::Client.multipart_post(path: "/images/edits", parameters: open_files(parameters))
14
14
  end
15
15
 
16
16
  def variations(parameters: {})
17
- OpenAI::Client.post(path: "/images/variations", parameters: open_files(parameters))
17
+ OpenAI::Client.multipart_post(path: "/images/variations", parameters: open_files(parameters))
18
18
  end
19
19
 
20
20
  private
@@ -1,5 +1,5 @@
1
1
  module Ruby
2
2
  module OpenAI
3
- VERSION = "3.0.2".freeze
3
+ VERSION = "3.1.0".freeze
4
4
  end
5
5
  end
data/ruby-openai.gemspec CHANGED
@@ -25,5 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ["lib"]
27
27
 
28
- spec.add_dependency "httparty", ">= 0.18.1", "< 0.21.0"
28
+ spec.add_dependency "httparty", ">= 0.18.1"
29
29
  end
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: 3.0.2
4
+ version: 3.1.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-12-27 00:00:00.000000000 Z
11
+ date: 2023-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.18.1
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: 0.21.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 0.18.1
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: 0.21.0
33
27
  description:
34
28
  email:
35
29
  - alexrudall@users.noreply.github.com
@@ -44,7 +38,6 @@ files:
44
38
  - ".gitignore"
45
39
  - ".rspec"
46
40
  - ".rubocop.yml"
47
- - ".travis.yml"
48
41
  - CHANGELOG.md
49
42
  - CODE_OF_CONDUCT.md
50
43
  - CONTRIBUTING.md
@@ -87,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
80
  - !ruby/object:Gem::Version
88
81
  version: '0'
89
82
  requirements: []
90
- rubygems_version: 3.2.33
83
+ rubygems_version: 3.4.5
91
84
  signing_key:
92
85
  specification_version: 4
93
86
  summary: A Ruby gem for the OpenAI GPT-3 API
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.7.1
6
- before_install: gem install bundler -v 2.1.4