ruby-openai 2.3.0 → 3.0.1
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/.rubocop.yml +1 -3
- data/CHANGELOG.md +19 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -2
- data/README.md +14 -67
- data/lib/ruby/openai/client.rb +39 -77
- data/lib/ruby/openai/files.rb +12 -45
- data/lib/ruby/openai/finetunes.rb +12 -57
- data/lib/ruby/openai/images.rb +8 -43
- data/lib/ruby/openai/models.rb +6 -29
- data/lib/ruby/openai/version.rb +1 -1
- data/lib/ruby/openai.rb +34 -3
- data/ruby-openai.gemspec +0 -1
- metadata +2 -23
- data/lib/ruby/openai/engines.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a823ba01c0dbec587f96e5d2d59b6eb67e48c348b00a7e78f415c6b65583d05
|
4
|
+
data.tar.gz: 98e7ae98831997f66bcbd73c644c78b0f5ed291b5b98c6ca01e5152596ca7b25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15a75647453b2b526680b5e2d3b7bc3d5ef6b05f223bdef0194e751f829228d9db7d17d5c483db66bf7706983c4d996ff4c348b505e6d52b6cbb5ef523e68133
|
7
|
+
data.tar.gz: a7362b11bfeefa471e70369696d746d5c89c201ef374799a6163dbad814f405d7642861d588ef6360f088e21d41ba4b10e7f40467d2a4d515767ea66bf52b4d3
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,25 @@ 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.0.1] - 2022-12-26
|
9
|
+
|
10
|
+
### Removed
|
11
|
+
|
12
|
+
- [BREAKING] Remove deprecated answers, classifications, embeddings, engines and search endpoints.
|
13
|
+
- [BREAKING] Remove ability to pass engine to completions and embeddings outside of the parameters hash.
|
14
|
+
|
15
|
+
## [3.0.0] - 2022-12-26
|
16
|
+
|
17
|
+
### Added
|
18
|
+
|
19
|
+
- Add ability to set access_token via gem configuration.
|
20
|
+
- Thanks [@grjones](https://github.com/grjones) and [@aquaflamingo](https://github.com/aquaflamingo) for raising this and [@feministy](https://github.com/feministy) for the [excellent guide](https://github.com/feministy/lizabinante.com/blob/stable/source/2016-01-30-creating-a-configurable-ruby-gem.markdown#configuration-block-the-end-goal) to adding config to a gem.
|
21
|
+
|
22
|
+
### Removed
|
23
|
+
|
24
|
+
- [BREAKING] Remove ability to include access_token directly via ENV vars.
|
25
|
+
- [BREAKING] Remove ability to pass API version directly to endpoints.
|
26
|
+
|
8
27
|
## [2.3.0] - 2022-12-23
|
9
28
|
|
10
29
|
### Added
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ruby-openai (
|
5
|
-
dotenv (>= 2.7.6, < 2.9.0)
|
4
|
+
ruby-openai (3.0.1)
|
6
5
|
httparty (>= 0.18.1, < 0.21.0)
|
7
6
|
|
8
7
|
GEM
|
@@ -71,6 +70,7 @@ PLATFORMS
|
|
71
70
|
|
72
71
|
DEPENDENCIES
|
73
72
|
byebug (~> 11.1.3)
|
73
|
+
dotenv (~> 2.8.1)
|
74
74
|
rake (~> 13.0)
|
75
75
|
rspec (~> 3.12)
|
76
76
|
rubocop (~> 1.41.1)
|
data/README.md
CHANGED
@@ -40,30 +40,29 @@ and require with:
|
|
40
40
|
- Get your API key from [https://beta.openai.com/account/api-keys](https://beta.openai.com/account/api-keys)
|
41
41
|
- 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)
|
42
42
|
|
43
|
-
###
|
43
|
+
### Quickstart
|
44
44
|
|
45
|
-
|
45
|
+
For a quick test you can pass your token directly to a new client:
|
46
46
|
|
47
|
-
```
|
48
|
-
|
49
|
-
OPENAI_ORGANIZATION_ID=organization_id_goes_here # Optional.
|
47
|
+
```ruby
|
48
|
+
client = OpenAI::Client.new(access_token: "access_token_goes_here")
|
50
49
|
```
|
51
50
|
|
52
|
-
|
51
|
+
### With Config
|
52
|
+
|
53
|
+
For a more robust setup, you can configure the gem with your API keys, for example in an `openai.rb` initializer file. Never hardcode secrets into your codebase - instead use something like [dotenv](https://github.com/motdotla/dotenv) to pass the keys safely into your environments.
|
53
54
|
|
54
55
|
```ruby
|
55
|
-
|
56
|
+
Ruby::OpenAI.configure do |config|
|
57
|
+
config.access_token = ENV.fetch('OPENAI_ACCESS_TOKEN')
|
58
|
+
config.organization_id = ENV.fetch('OPENAI_ORGANIZATION_ID') # Optional.
|
59
|
+
end
|
56
60
|
```
|
57
61
|
|
58
|
-
|
59
|
-
|
60
|
-
Alternatively you can pass your key directly to a new client:
|
62
|
+
Then you can create a client like this:
|
61
63
|
|
62
64
|
```ruby
|
63
|
-
client = OpenAI::Client.new
|
64
|
-
access_token: "access_token_goes_here",
|
65
|
-
organization_id: "organization_id_goes_here"
|
66
|
-
)
|
65
|
+
client = OpenAI::Client.new
|
67
66
|
```
|
68
67
|
|
69
68
|
### Models
|
@@ -189,7 +188,7 @@ You may need to wait a short time for processing to complete. Once processed, yo
|
|
189
188
|
fine_tuned_model = JSON.parse(response.body)["fine_tuned_model"]
|
190
189
|
```
|
191
190
|
|
192
|
-
This fine-tuned model name can then be used in
|
191
|
+
This fine-tuned model name can then be used in completions:
|
193
192
|
|
194
193
|
```ruby
|
195
194
|
response = client.completions(
|
@@ -248,58 +247,6 @@ Pass a string to check if it violates OpenAI's Content Policy:
|
|
248
247
|
=> 5.505014632944949e-05
|
249
248
|
```
|
250
249
|
|
251
|
-
### Classifications
|
252
|
-
|
253
|
-
Pass examples and a query to predict the most likely labels:
|
254
|
-
|
255
|
-
```ruby
|
256
|
-
response = client.classifications(parameters: {
|
257
|
-
examples: [
|
258
|
-
["A happy moment", "Positive"],
|
259
|
-
["I am sad.", "Negative"],
|
260
|
-
["I am feeling awesome", "Positive"]
|
261
|
-
],
|
262
|
-
query: "It is a raining day :(",
|
263
|
-
model: "text-ada-001"
|
264
|
-
})
|
265
|
-
```
|
266
|
-
|
267
|
-
Or use the ID of a file you've uploaded:
|
268
|
-
|
269
|
-
```ruby
|
270
|
-
response = client.classifications(parameters: {
|
271
|
-
file: "123abc,
|
272
|
-
query: "It is a raining day :(",
|
273
|
-
model: "text-ada-001"
|
274
|
-
})
|
275
|
-
```
|
276
|
-
|
277
|
-
### Answers
|
278
|
-
|
279
|
-
Pass documents, a question string, and an example question/response to get an answer to a question:
|
280
|
-
|
281
|
-
```ruby
|
282
|
-
response = client.answers(parameters: {
|
283
|
-
documents: ["Puppy A is happy.", "Puppy B is sad."],
|
284
|
-
question: "which puppy is happy?",
|
285
|
-
model: "text-curie-001",
|
286
|
-
examples_context: "In 2017, U.S. life expectancy was 78.6 years.",
|
287
|
-
examples: [["What is human life expectancy in the United States?","78 years."]],
|
288
|
-
})
|
289
|
-
```
|
290
|
-
|
291
|
-
Or use the ID of a file you've uploaded:
|
292
|
-
|
293
|
-
```ruby
|
294
|
-
response = client.answers(parameters: {
|
295
|
-
file: "123abc",
|
296
|
-
question: "which puppy is happy?",
|
297
|
-
model: "text-curie-001",
|
298
|
-
examples_context: "In 2017, U.S. life expectancy was 78.6 years.",
|
299
|
-
examples: [["What is human life expectancy in the United States?","78 years."]],
|
300
|
-
})
|
301
|
-
```
|
302
|
-
|
303
250
|
## Development
|
304
251
|
|
305
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.
|
data/lib/ruby/openai/client.rb
CHANGED
@@ -1,114 +1,76 @@
|
|
1
1
|
module OpenAI
|
2
2
|
class Client
|
3
|
-
|
4
|
-
base_uri "https://api.openai.com"
|
3
|
+
URI_BASE = "https://api.openai.com/".freeze
|
5
4
|
|
6
5
|
def initialize(access_token: nil, organization_id: nil)
|
7
|
-
|
8
|
-
|
6
|
+
Ruby::OpenAI.configuration.access_token = access_token if access_token
|
7
|
+
Ruby::OpenAI.configuration.organization_id = organization_id if organization_id
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
12
|
-
|
13
|
-
be removed from the OpenAI API on 3 December 2022 and from ruby-openai v3.0.
|
14
|
-
More information: https://help.openai.com/en/articles/6233728-answers-transition-guide"
|
15
|
-
|
16
|
-
post(url: "/#{version}/answers", parameters: parameters)
|
17
|
-
end
|
18
|
-
|
19
|
-
def classifications(version: default_version, parameters: {})
|
20
|
-
warn "[DEPRECATION WARNING] [ruby-openai] `Client#classifications` is deprecated and will
|
21
|
-
be removed from the OpenAI API on 3 December 2022 and from ruby-openai v3.0.
|
22
|
-
More information: https://help.openai.com/en/articles/6272941-classifications-transition-guide"
|
23
|
-
|
24
|
-
post(url: "/#{version}/classifications", parameters: parameters)
|
10
|
+
def completions(parameters: {})
|
11
|
+
OpenAI::Client.post(path: "/completions", parameters: parameters)
|
25
12
|
end
|
26
13
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
post(url: "/#{version}/completions", parameters: parameters)
|
14
|
+
def edits(parameters: {})
|
15
|
+
OpenAI::Client.post(path: "/edits", parameters: parameters)
|
31
16
|
end
|
32
17
|
|
33
|
-
def
|
34
|
-
post(
|
35
|
-
end
|
36
|
-
|
37
|
-
def embeddings(engine: nil, version: default_version, parameters: {})
|
38
|
-
parameters = deprecate_engine(engine: engine, method: "embeddings", parameters: parameters)
|
39
|
-
|
40
|
-
post(url: "/#{version}/embeddings", parameters: parameters)
|
41
|
-
end
|
42
|
-
|
43
|
-
def engines
|
44
|
-
warn "[DEPRECATION WARNING] [ruby-openai] `Client#engines` is deprecated and will
|
45
|
-
be removed from ruby-openai v3.0. Use `Client#models` instead."
|
46
|
-
|
47
|
-
@engines ||= OpenAI::Engines.new(access_token: @access_token,
|
48
|
-
organization_id: @organization_id)
|
18
|
+
def embeddings(parameters: {})
|
19
|
+
OpenAI::Client.post(path: "/embeddings", parameters: parameters)
|
49
20
|
end
|
50
21
|
|
51
22
|
def files
|
52
|
-
@files ||= OpenAI::Files.new
|
23
|
+
@files ||= OpenAI::Files.new
|
53
24
|
end
|
54
25
|
|
55
26
|
def finetunes
|
56
|
-
@finetunes ||= OpenAI::Finetunes.new
|
57
|
-
organization_id: @organization_id)
|
27
|
+
@finetunes ||= OpenAI::Finetunes.new
|
58
28
|
end
|
59
29
|
|
60
30
|
def images
|
61
|
-
@images ||= OpenAI::Images.new
|
31
|
+
@images ||= OpenAI::Images.new
|
62
32
|
end
|
63
33
|
|
64
34
|
def models
|
65
|
-
@models ||= OpenAI::Models.new
|
35
|
+
@models ||= OpenAI::Models.new
|
66
36
|
end
|
67
37
|
|
68
|
-
def moderations(
|
69
|
-
post(
|
38
|
+
def moderations(parameters: {})
|
39
|
+
OpenAI::Client.post(path: "/moderations", parameters: parameters)
|
70
40
|
end
|
71
41
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
post(url: "/#{version}/engines/#{engine}/search", parameters: parameters)
|
42
|
+
def self.get(path:)
|
43
|
+
HTTParty.get(
|
44
|
+
uri(path: path),
|
45
|
+
headers: headers
|
46
|
+
)
|
78
47
|
end
|
79
48
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
warn "[DEPRECATION WARNING] [ruby-openai] Passing `engine` directly to `Client##{method}` is
|
88
|
-
deprecated and will be removed in ruby-openai 3.0. Pass `model` within `parameters` instead:
|
89
|
-
client.completions(parameters: { #{parameters.map { |k, v| "#{k}: \"#{v}\"" }.join(', ')} })"
|
90
|
-
|
91
|
-
parameters
|
49
|
+
def self.post(path:, parameters: nil)
|
50
|
+
HTTParty.post(
|
51
|
+
uri(path: path),
|
52
|
+
headers: headers,
|
53
|
+
body: parameters.to_json
|
54
|
+
)
|
92
55
|
end
|
93
56
|
|
94
|
-
def
|
95
|
-
|
57
|
+
def self.delete(path:)
|
58
|
+
HTTParty.delete(
|
59
|
+
uri(path: path),
|
60
|
+
headers: headers
|
61
|
+
)
|
96
62
|
end
|
97
63
|
|
98
|
-
def
|
99
|
-
|
64
|
+
private_class_method def self.uri(path:)
|
65
|
+
URI_BASE + Ruby::OpenAI.configuration.api_version + path
|
100
66
|
end
|
101
67
|
|
102
|
-
def
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
"OpenAI-Organization" => @organization_id
|
109
|
-
},
|
110
|
-
body: parameters.to_json
|
111
|
-
)
|
68
|
+
private_class_method def self.headers
|
69
|
+
{
|
70
|
+
"Content-Type" => "application/json",
|
71
|
+
"Authorization" => "Bearer #{Ruby::OpenAI.configuration.access_token}",
|
72
|
+
"OpenAI-Organization" => Ruby::OpenAI.configuration.organization_id
|
73
|
+
}
|
112
74
|
end
|
113
75
|
end
|
114
76
|
end
|
data/lib/ruby/openai/files.rb
CHANGED
@@ -1,66 +1,33 @@
|
|
1
1
|
module OpenAI
|
2
2
|
class Files
|
3
|
-
include HTTParty
|
4
|
-
base_uri "https://api.openai.com"
|
5
|
-
|
6
3
|
def initialize(access_token: nil, organization_id: nil)
|
7
|
-
|
8
|
-
|
4
|
+
Ruby::OpenAI.configuration.access_token = access_token if access_token
|
5
|
+
Ruby::OpenAI.configuration.organization_id = organization_id if organization_id
|
9
6
|
end
|
10
7
|
|
11
|
-
def list
|
12
|
-
|
13
|
-
"/#{version}/files",
|
14
|
-
headers: {
|
15
|
-
"Content-Type" => "application/json",
|
16
|
-
"Authorization" => "Bearer #{@access_token}",
|
17
|
-
"OpenAI-Organization" => @organization_id
|
18
|
-
}
|
19
|
-
)
|
8
|
+
def list
|
9
|
+
OpenAI::Client.get(path: "/files")
|
20
10
|
end
|
21
11
|
|
22
|
-
def upload(
|
12
|
+
def upload(parameters: {})
|
23
13
|
validate(file: parameters[:file])
|
24
14
|
|
25
|
-
|
26
|
-
"
|
27
|
-
|
28
|
-
"Content-Type" => "application/json",
|
29
|
-
"Authorization" => "Bearer #{@access_token}",
|
30
|
-
"OpenAI-Organization" => @organization_id
|
31
|
-
},
|
32
|
-
body: parameters.merge(file: File.open(parameters[:file]))
|
15
|
+
OpenAI::Client.post(
|
16
|
+
path: "/files",
|
17
|
+
parameters: parameters.merge(file: File.open(parameters[:file]))
|
33
18
|
)
|
34
19
|
end
|
35
20
|
|
36
|
-
def retrieve(id
|
37
|
-
|
38
|
-
"/#{version}/files/#{id}",
|
39
|
-
headers: {
|
40
|
-
"Content-Type" => "application/json",
|
41
|
-
"Authorization" => "Bearer #{@access_token}",
|
42
|
-
"OpenAI-Organization" => @organization_id
|
43
|
-
}
|
44
|
-
)
|
21
|
+
def retrieve(id:)
|
22
|
+
OpenAI::Client.get(path: "/files/#{id}")
|
45
23
|
end
|
46
24
|
|
47
|
-
def delete(id
|
48
|
-
|
49
|
-
"/#{version}/files/#{id}",
|
50
|
-
headers: {
|
51
|
-
"Content-Type" => "application/json",
|
52
|
-
"Authorization" => "Bearer #{@access_token}",
|
53
|
-
"OpenAI-Organization" => @organization_id
|
54
|
-
}
|
55
|
-
)
|
25
|
+
def delete(id:)
|
26
|
+
OpenAI::Client.delete(path: "/files/#{id}")
|
56
27
|
end
|
57
28
|
|
58
29
|
private
|
59
30
|
|
60
|
-
def default_version
|
61
|
-
"v1".freeze
|
62
|
-
end
|
63
|
-
|
64
31
|
def validate(file:)
|
65
32
|
File.open(file).each_line.with_index do |line, index|
|
66
33
|
JSON.parse(line)
|
@@ -1,73 +1,28 @@
|
|
1
1
|
module OpenAI
|
2
2
|
class Finetunes
|
3
|
-
include HTTParty
|
4
|
-
base_uri "https://api.openai.com"
|
5
|
-
|
6
3
|
def initialize(access_token: nil, organization_id: nil)
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def list(version: default_version)
|
12
|
-
self.class.get(
|
13
|
-
"/#{version}/fine-tunes",
|
14
|
-
headers: {
|
15
|
-
"Content-Type" => "application/json",
|
16
|
-
"Authorization" => "Bearer #{@access_token}",
|
17
|
-
"OpenAI-Organization" => @organization_id
|
18
|
-
}
|
19
|
-
)
|
4
|
+
Ruby::OpenAI.configuration.access_token = access_token if access_token
|
5
|
+
Ruby::OpenAI.configuration.organization_id = organization_id if organization_id
|
20
6
|
end
|
21
7
|
|
22
|
-
def
|
23
|
-
|
24
|
-
"/#{version}/fine-tunes",
|
25
|
-
headers: {
|
26
|
-
"Content-Type" => "application/json",
|
27
|
-
"Authorization" => "Bearer #{@access_token}",
|
28
|
-
"OpenAI-Organization" => @organization_id
|
29
|
-
},
|
30
|
-
body: parameters.to_json
|
31
|
-
)
|
8
|
+
def list
|
9
|
+
OpenAI::Client.get(path: "/fine-tunes")
|
32
10
|
end
|
33
11
|
|
34
|
-
def
|
35
|
-
|
36
|
-
"/#{version}/fine-tunes/#{id}",
|
37
|
-
headers: {
|
38
|
-
"Content-Type" => "application/json",
|
39
|
-
"Authorization" => "Bearer #{@access_token}",
|
40
|
-
"OpenAI-Organization" => @organization_id
|
41
|
-
}
|
42
|
-
)
|
12
|
+
def create(parameters: {})
|
13
|
+
OpenAI::Client.post(path: "/fine-tunes", parameters: parameters.to_json)
|
43
14
|
end
|
44
15
|
|
45
|
-
def
|
46
|
-
|
47
|
-
"/#{version}/fine-tunes/#{id}/cancel",
|
48
|
-
headers: {
|
49
|
-
"Content-Type" => "application/json",
|
50
|
-
"Authorization" => "Bearer #{@access_token}",
|
51
|
-
"OpenAI-Organization" => @organization_id
|
52
|
-
}
|
53
|
-
)
|
16
|
+
def retrieve(id:)
|
17
|
+
OpenAI::Client.get(path: "/fine-tunes/#{id}")
|
54
18
|
end
|
55
19
|
|
56
|
-
def
|
57
|
-
|
58
|
-
"/#{version}/fine-tunes/#{id}/events",
|
59
|
-
headers: {
|
60
|
-
"Content-Type" => "application/json",
|
61
|
-
"Authorization" => "Bearer #{@access_token}",
|
62
|
-
"OpenAI-Organization" => @organization_id
|
63
|
-
}
|
64
|
-
)
|
20
|
+
def cancel(id:)
|
21
|
+
OpenAI::Client.post(path: "/fine-tunes/#{id}/cancel")
|
65
22
|
end
|
66
23
|
|
67
|
-
|
68
|
-
|
69
|
-
def default_version
|
70
|
-
"v1".freeze
|
24
|
+
def events(id:)
|
25
|
+
OpenAI::Client.get(path: "/fine-tunes/#{id}/events")
|
71
26
|
end
|
72
27
|
end
|
73
28
|
end
|
data/lib/ruby/openai/images.rb
CHANGED
@@ -1,59 +1,24 @@
|
|
1
1
|
module OpenAI
|
2
2
|
class Images
|
3
|
-
include HTTParty
|
4
|
-
base_uri "https://api.openai.com"
|
5
|
-
|
6
3
|
def initialize(access_token: nil, organization_id: nil)
|
7
|
-
|
8
|
-
|
4
|
+
Ruby::OpenAI.configuration.access_token = access_token if access_token
|
5
|
+
Ruby::OpenAI.configuration.organization_id = organization_id if organization_id
|
9
6
|
end
|
10
7
|
|
11
|
-
def generate(
|
12
|
-
|
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
|
-
)
|
8
|
+
def generate(parameters: {})
|
9
|
+
OpenAI::Client.post(path: "/images/generations", parameters: parameters.to_json)
|
21
10
|
end
|
22
11
|
|
23
|
-
def edit(
|
24
|
-
parameters
|
25
|
-
|
26
|
-
self.class.post(
|
27
|
-
"/#{version}/images/edits",
|
28
|
-
headers: {
|
29
|
-
"Content-Type" => "application/json",
|
30
|
-
"Authorization" => "Bearer #{@access_token}",
|
31
|
-
"OpenAI-Organization" => @organization_id
|
32
|
-
},
|
33
|
-
body: parameters
|
34
|
-
)
|
12
|
+
def edit(parameters: {})
|
13
|
+
OpenAI::Client.post(path: "/images/edits", parameters: open_files(parameters))
|
35
14
|
end
|
36
15
|
|
37
|
-
def variations(
|
38
|
-
parameters
|
39
|
-
|
40
|
-
self.class.post(
|
41
|
-
"/#{version}/images/variations",
|
42
|
-
headers: {
|
43
|
-
"Content-Type" => "application/json",
|
44
|
-
"Authorization" => "Bearer #{@access_token}",
|
45
|
-
"OpenAI-Organization" => @organization_id
|
46
|
-
},
|
47
|
-
body: parameters
|
48
|
-
)
|
16
|
+
def variations(parameters: {})
|
17
|
+
OpenAI::Client.post(path: "/images/variations", parameters: open_files(parameters))
|
49
18
|
end
|
50
19
|
|
51
20
|
private
|
52
21
|
|
53
|
-
def default_version
|
54
|
-
"v1".freeze
|
55
|
-
end
|
56
|
-
|
57
22
|
def open_files(parameters)
|
58
23
|
parameters = parameters.merge(image: File.open(parameters[:image]))
|
59
24
|
parameters = parameters.merge(mask: File.open(parameters[:mask])) if parameters[:mask]
|
data/lib/ruby/openai/models.rb
CHANGED
@@ -1,39 +1,16 @@
|
|
1
1
|
module OpenAI
|
2
2
|
class Models
|
3
|
-
include HTTParty
|
4
|
-
base_uri "https://api.openai.com"
|
5
|
-
|
6
3
|
def initialize(access_token: nil, organization_id: nil)
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def list(version: default_version)
|
12
|
-
self.class.get(
|
13
|
-
"/#{version}/models",
|
14
|
-
headers: {
|
15
|
-
"Content-Type" => "application/json",
|
16
|
-
"Authorization" => "Bearer #{@access_token}",
|
17
|
-
"OpenAI-Organization" => @organization_id
|
18
|
-
}
|
19
|
-
)
|
4
|
+
Ruby::OpenAI.configuration.access_token = access_token if access_token
|
5
|
+
Ruby::OpenAI.configuration.organization_id = organization_id if organization_id
|
20
6
|
end
|
21
7
|
|
22
|
-
def
|
23
|
-
|
24
|
-
"/#{version}/models/#{id}",
|
25
|
-
headers: {
|
26
|
-
"Content-Type" => "application/json",
|
27
|
-
"Authorization" => "Bearer #{@access_token}",
|
28
|
-
"OpenAI-Organization" => @organization_id
|
29
|
-
}
|
30
|
-
)
|
8
|
+
def list
|
9
|
+
OpenAI::Client.get(path: "/models")
|
31
10
|
end
|
32
11
|
|
33
|
-
|
34
|
-
|
35
|
-
def default_version
|
36
|
-
"v1".freeze
|
12
|
+
def retrieve(id:)
|
13
|
+
OpenAI::Client.get(path: "/models/#{id}")
|
37
14
|
end
|
38
15
|
end
|
39
16
|
end
|
data/lib/ruby/openai/version.rb
CHANGED
data/lib/ruby/openai.rb
CHANGED
@@ -1,15 +1,46 @@
|
|
1
1
|
require "httparty"
|
2
|
-
require "ruby/openai/
|
2
|
+
require "ruby/openai/client"
|
3
3
|
require "ruby/openai/files"
|
4
4
|
require "ruby/openai/finetunes"
|
5
5
|
require "ruby/openai/images"
|
6
6
|
require "ruby/openai/models"
|
7
|
-
require "ruby/openai/client"
|
8
7
|
require "ruby/openai/version"
|
9
|
-
require "dotenv/load"
|
10
8
|
|
11
9
|
module Ruby
|
12
10
|
module OpenAI
|
13
11
|
class Error < StandardError; end
|
12
|
+
class ConfigurationError < Error; end
|
13
|
+
|
14
|
+
class Configuration
|
15
|
+
attr_writer :access_token
|
16
|
+
attr_accessor :api_version, :organization_id
|
17
|
+
|
18
|
+
DEFAULT_API_VERSION = "v1".freeze
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@access_token = nil
|
22
|
+
@api_version = DEFAULT_API_VERSION
|
23
|
+
@organization_id = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def access_token
|
27
|
+
return @access_token if @access_token
|
28
|
+
|
29
|
+
error_text = "OpenAI access token missing! See https://github.com/alexrudall/ruby-openai#usage"
|
30
|
+
raise ConfigurationError, error_text
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class << self
|
35
|
+
attr_writer :configuration
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.configuration
|
39
|
+
@configuration ||= OpenAI::Configuration.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.configure
|
43
|
+
yield(configuration)
|
44
|
+
end
|
14
45
|
end
|
15
46
|
end
|
data/ruby-openai.gemspec
CHANGED
metadata
CHANGED
@@ -1,35 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-openai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.1
|
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-
|
11
|
+
date: 2022-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: dotenv
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 2.7.6
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 2.9.0
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 2.7.6
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 2.9.0
|
33
13
|
- !ruby/object:Gem::Dependency
|
34
14
|
name: httparty
|
35
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -77,7 +57,6 @@ files:
|
|
77
57
|
- bin/setup
|
78
58
|
- lib/ruby/openai.rb
|
79
59
|
- lib/ruby/openai/client.rb
|
80
|
-
- lib/ruby/openai/engines.rb
|
81
60
|
- lib/ruby/openai/files.rb
|
82
61
|
- lib/ruby/openai/finetunes.rb
|
83
62
|
- lib/ruby/openai/images.rb
|
data/lib/ruby/openai/engines.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module OpenAI
|
2
|
-
class Engines
|
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 list(version: default_version)
|
12
|
-
self.class.get(
|
13
|
-
"/#{version}/engines",
|
14
|
-
headers: {
|
15
|
-
"Content-Type" => "application/json",
|
16
|
-
"Authorization" => "Bearer #{@access_token}",
|
17
|
-
"OpenAI-Organization" => @organization_id
|
18
|
-
}
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
def retrieve(id:, version: default_version)
|
23
|
-
self.class.get(
|
24
|
-
"/#{version}/engines/#{id}",
|
25
|
-
headers: {
|
26
|
-
"Content-Type" => "application/json",
|
27
|
-
"Authorization" => "Bearer #{@access_token}",
|
28
|
-
"OpenAI-Organization" => @organization_id
|
29
|
-
}
|
30
|
-
)
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def default_version
|
36
|
-
"v1".freeze
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|