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 +4 -4
- data/.circleci/config.yml +1 -0
- data/CHANGELOG.md +23 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +20 -22
- data/README.md +25 -15
- data/lib/ruby/openai/client.rb +14 -6
- data/lib/ruby/openai/files.rb +1 -1
- data/lib/ruby/openai/finetunes.rb +10 -2
- data/lib/ruby/openai/images.rb +3 -3
- data/lib/ruby/openai/version.rb +1 -1
- data/ruby-openai.gemspec +1 -1
- metadata +3 -10
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7fc83568b242ec1d301ebe76a0eeb5a22485f94cb287df47b92c1a46f47c193d
|
|
4
|
+
data.tar.gz: 2736973c009f727093c14960cb1468e00f3af357281ea8bba237d82da7d39ff4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8056501328713524128f12120f3d005f4d980d1d73cedb2f0994ac59cb2e5c52fc43ddc12519640ac2834eaa61c774888c5e59e31b8035ba22cc7f09ddbffc6f
|
|
7
|
+
data.tar.gz: be7f713a587469f977615f16f03161252c9a729f79ff9e73e1b09c365fb52266d3c4c329630f226a6f56fe2cc2fe7f5346e00d9503470095cf1b9922ba084218
|
data/.circleci/config.yml
CHANGED
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
data/Gemfile.lock
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
ruby-openai (3.0
|
|
5
|
-
httparty (>= 0.18.1
|
|
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.
|
|
11
|
-
public_suffix (>= 2.0.2, <
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
26
|
+
parser (3.2.0.0)
|
|
29
27
|
ast (~> 2.4.1)
|
|
30
|
-
public_suffix (
|
|
28
|
+
public_suffix (5.0.1)
|
|
31
29
|
rainbow (3.1.1)
|
|
32
30
|
rake (13.0.6)
|
|
33
|
-
regexp_parser (2.
|
|
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.
|
|
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.
|
|
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.
|
|
46
|
+
rubocop (1.45.1)
|
|
49
47
|
json (~> 2.3)
|
|
50
48
|
parallel (~> 1.10)
|
|
51
|
-
parser (>= 3.
|
|
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.
|
|
53
|
+
rubocop-ast (>= 1.24.1, < 2.0)
|
|
56
54
|
ruby-progressbar (~> 1.7)
|
|
57
|
-
unicode-display_width (>=
|
|
58
|
-
rubocop-ast (1.24.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
{"
|
|
138
|
-
{"
|
|
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/
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
data/lib/ruby/openai/client.rb
CHANGED
|
@@ -8,15 +8,15 @@ module OpenAI
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def completions(parameters: {})
|
|
11
|
-
OpenAI::Client.
|
|
11
|
+
OpenAI::Client.json_post(path: "/completions", parameters: parameters)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def edits(parameters: {})
|
|
15
|
-
OpenAI::Client.
|
|
15
|
+
OpenAI::Client.json_post(path: "/edits", parameters: parameters)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def embeddings(parameters: {})
|
|
19
|
-
OpenAI::Client.
|
|
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.
|
|
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.
|
|
49
|
+
def self.json_post(path:, parameters:)
|
|
50
50
|
HTTParty.post(
|
|
51
51
|
uri(path: path),
|
|
52
52
|
headers: headers,
|
|
53
|
-
body: parameters
|
|
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
|
|
data/lib/ruby/openai/files.rb
CHANGED
|
@@ -10,7 +10,7 @@ module OpenAI
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def create(parameters: {})
|
|
13
|
-
OpenAI::Client.
|
|
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.
|
|
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
|
data/lib/ruby/openai/images.rb
CHANGED
|
@@ -6,15 +6,15 @@ module OpenAI
|
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def generate(parameters: {})
|
|
9
|
-
OpenAI::Client.
|
|
9
|
+
OpenAI::Client.json_post(path: "/images/generations", parameters: parameters)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def edit(parameters: {})
|
|
13
|
-
OpenAI::Client.
|
|
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.
|
|
17
|
+
OpenAI::Client.multipart_post(path: "/images/variations", parameters: open_files(parameters))
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
private
|
data/lib/ruby/openai/version.rb
CHANGED
data/ruby-openai.gemspec
CHANGED
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
|
|
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:
|
|
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.
|
|
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
|