chatgpt-ruby 0.6.0 → 1.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/.codeclimate.yml +8 -0
- data/CHANGELOG.md +9 -1
- data/Gemfile +8 -1
- data/Gemfile.lock +10 -1
- data/README.md +10 -105
- data/Rakefile +3 -0
- data/lib/chatgpt/client.rb +52 -84
- data/lib/chatgpt/ruby/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ab25c3c1b76e0b3249dbeba1c4b0772c4c6f7d34580005f3888ff09c2829453
|
|
4
|
+
data.tar.gz: 3feffdb2bed24d6464bdd945b6a94abb1a752567fac19d2866b5430dfffda019
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d42c42272c0f17cecc040f2796f08181cc858b744a5fbf33d6a26c31aa8990352b6f022832a6b9b61d25cf9b8577939783a93ce6e250a3c4458dfec16d4d43f1
|
|
7
|
+
data.tar.gz: f9a3cd15ff2901c09361ba53dd71d3ea7263669069126672b390444b11a8d660805cb34a7ea71b792afd5208c6971c3d374d58e3bb74fe2cccbc4af3a23baa5d
|
data/.codeclimate.yml
ADDED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
## [1.0.0] - 2023-04-30
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- Initial release of the `chatgpt-ruby` gem.
|
|
6
|
+
- Implements ChatGPT Client with methods for completions, search, classification, summary, and answer generation.
|
|
7
|
+
- Includes unit tests for each method.
|
|
8
|
+
|
|
1
9
|
## [Unreleased]
|
|
2
10
|
|
|
3
11
|
## [0.1.0] - 2023-03-22
|
|
4
12
|
|
|
5
|
-
- Initial release
|
|
13
|
+
- Initial release
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
chatgpt-ruby (0.
|
|
4
|
+
chatgpt-ruby (1.0.0)
|
|
5
5
|
rest-client
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
10
|
ast (2.4.2)
|
|
11
|
+
docile (1.4.0)
|
|
11
12
|
domain_name (0.5.20190701)
|
|
12
13
|
unf (>= 0.0.5, < 1.0.0)
|
|
13
14
|
http-accept (1.7.0)
|
|
@@ -44,6 +45,12 @@ GEM
|
|
|
44
45
|
rubocop-ast (1.27.0)
|
|
45
46
|
parser (>= 3.2.1.0)
|
|
46
47
|
ruby-progressbar (1.13.0)
|
|
48
|
+
simplecov (0.22.0)
|
|
49
|
+
docile (~> 1.1)
|
|
50
|
+
simplecov-html (~> 0.11)
|
|
51
|
+
simplecov_json_formatter (~> 0.1)
|
|
52
|
+
simplecov-html (0.12.3)
|
|
53
|
+
simplecov_json_formatter (0.1.4)
|
|
47
54
|
unf (0.1.4)
|
|
48
55
|
unf_ext
|
|
49
56
|
unf_ext (0.0.8.2)
|
|
@@ -58,6 +65,8 @@ DEPENDENCIES
|
|
|
58
65
|
rake (~> 13.0)
|
|
59
66
|
rest-client
|
|
60
67
|
rubocop (~> 1.21)
|
|
68
|
+
simplecov
|
|
69
|
+
simplecov_json_formatter
|
|
61
70
|
|
|
62
71
|
BUNDLED WITH
|
|
63
72
|
2.3.26
|
data/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ChatGPT Ruby
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://badge.fury.io/rb/chatgpt-ruby) [](https://opensource.org/licenses/MIT) [](https://codeclimate.com/github/nagstler/chatgpt-ruby/maintainability) [](https://codeclimate.com/github/nagstler/chatgpt-ruby/test_coverage) [](https://github.com/nagstler/chatgpt-ruby/actions/workflows/ci.yml) [](https://github.com/nagstler/chatgpt-ruby/graphs/contributors)
|
|
4
|
+
|
|
5
|
+
The `chatgpt-ruby` is a Ruby SDK for the OpenAI API, providing methods for generating text and completing prompts using the ChatGPT model.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
@@ -10,16 +12,12 @@ Add this line to your application's Gemfile:
|
|
|
10
12
|
gem 'chatgpt-ruby'
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
15
|
And then execute:
|
|
16
16
|
|
|
17
17
|
```ruby
|
|
18
18
|
$ bundle install
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
21
|
Or install it yourself as:
|
|
24
22
|
|
|
25
23
|
```ruby
|
|
@@ -33,14 +31,13 @@ To use the ChatGPT API SDK, you will need an API key from OpenAI. You can obtain
|
|
|
33
31
|
Once you have an API key, you can create a new `ChatGPT::Client` instance with your API key:
|
|
34
32
|
|
|
35
33
|
```ruby
|
|
36
|
-
require '
|
|
34
|
+
require 'chatgpt/client'
|
|
37
35
|
|
|
38
36
|
api_key = 'your-api-key'
|
|
39
37
|
client = ChatGPT::Client.new(api_key)
|
|
40
38
|
```
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
### Completions
|
|
40
|
+
## Completions
|
|
44
41
|
|
|
45
42
|
To generate completions given a prompt, you can use the `completions` method:
|
|
46
43
|
|
|
@@ -51,8 +48,6 @@ completions = client.completions(prompt)
|
|
|
51
48
|
# Output: an array of completion strings
|
|
52
49
|
```
|
|
53
50
|
|
|
54
|
-
|
|
55
|
-
|
|
56
51
|
You can customize the generation process by passing in additional parameters as a hash:
|
|
57
52
|
|
|
58
53
|
```ruby
|
|
@@ -63,109 +58,19 @@ params = {
|
|
|
63
58
|
}
|
|
64
59
|
completions = client.completions(prompt, params)
|
|
65
60
|
|
|
61
|
+
puts completions["choices"].map { |c| c["text"] }
|
|
66
62
|
# Output: an array of completion strings
|
|
67
63
|
```
|
|
68
64
|
|
|
69
|
-
|
|
70
|
-
### Search
|
|
71
|
-
|
|
72
|
-
To perform a search query given a set of documents and a search query, you can use the `search` method:
|
|
73
|
-
|
|
74
|
-
```ruby
|
|
75
|
-
documents = ['Document 1', 'Document 2', 'Document 3']
|
|
76
|
-
query = 'Search query'
|
|
77
|
-
results = client.search(documents, query)
|
|
78
|
-
|
|
79
|
-
# Output: an array of search result objects
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
You can customize the search process by passing in additional parameters as a hash:
|
|
85
|
-
|
|
86
|
-
```ruby
|
|
87
|
-
params = {
|
|
88
|
-
engine: 'ada',
|
|
89
|
-
max_rerank: 100
|
|
90
|
-
}
|
|
91
|
-
results = client.search(documents, query, params)
|
|
92
|
-
|
|
93
|
-
# Output: an array of search result objects
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
### Classify
|
|
98
|
-
|
|
99
|
-
To classify a given text, you can use the `classify` method:
|
|
100
|
-
|
|
101
|
-
```ruby
|
|
102
|
-
text = 'This is a sample text'
|
|
103
|
-
label = client.classify(text)
|
|
104
|
-
|
|
105
|
-
# Output: a string representing the classified label
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
You can customize the classification process by passing in additional parameters as a hash:
|
|
111
|
-
|
|
112
|
-
```ruby
|
|
113
|
-
params = {
|
|
114
|
-
model: 'text-davinci-002'
|
|
115
|
-
}
|
|
116
|
-
label = client.classify(text, params)
|
|
117
|
-
|
|
118
|
-
# Output: a string representing the classified label
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
### Generate Summaries
|
|
123
|
-
|
|
124
|
-
To generate summaries given a set of documents, you can use the `generate_summaries` method:
|
|
125
|
-
|
|
126
|
-
```ruby
|
|
127
|
-
documents = ['Document 1', 'Document 2', 'Document 3']
|
|
128
|
-
summary = client.generate_summaries(documents)
|
|
129
|
-
|
|
130
|
-
# Output: a string representing the generated summary
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
You can customize the summary generation process by passing in additional parameters as a hash:
|
|
136
|
-
|
|
137
|
-
```ruby
|
|
138
|
-
params = {
|
|
139
|
-
model: 'text-davinci-002',
|
|
140
|
-
max_tokens: 100
|
|
141
|
-
}
|
|
142
|
-
summary = client.generate_summaries(documents, params)
|
|
143
|
-
|
|
144
|
-
# Output: a string representing the generated summary
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
### Generate Answers
|
|
149
|
-
|
|
150
|
-
To generate answers given a prompt and a set of documents, you can use the `generate_answers` method:
|
|
151
|
-
|
|
152
|
-
```ruby
|
|
153
|
-
prompt = 'What is the capital of France?'
|
|
154
|
-
documents = ['France is a country in Europe', 'Paris is the capital of France']
|
|
155
|
-
answer = client.generate_answers(prompt, documents)
|
|
156
|
-
|
|
157
|
-
# Output
|
|
158
|
-
```
|
|
159
|
-
|
|
160
65
|
## Development
|
|
161
66
|
|
|
162
67
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
163
68
|
|
|
164
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
|
69
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
|
165
70
|
|
|
166
71
|
## Contributing
|
|
167
72
|
|
|
168
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
73
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/nagstler/chatgpt-ruby. 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/nagstler/chatgpt-ruby/blob/main/CODE_OF_CONDUCT.md).
|
|
169
74
|
|
|
170
75
|
## License
|
|
171
76
|
|
|
@@ -173,4 +78,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
|
173
78
|
|
|
174
79
|
## Code of Conduct
|
|
175
80
|
|
|
176
|
-
Everyone interacting in the Chatgpt::Ruby project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
|
81
|
+
Everyone interacting in the Chatgpt::Ruby project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/nagstler/chatgpt-ruby/blob/main/CODE_OF_CONDUCT.md).
|
data/Rakefile
CHANGED
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
require "bundler/gem_tasks"
|
|
4
4
|
require "rake/testtask"
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
Rake::TestTask.new(:test) do |t|
|
|
7
8
|
t.libs << "test"
|
|
9
|
+
t.pattern = 'test/**/*_test.rb'
|
|
8
10
|
t.libs << "lib"
|
|
9
11
|
t.test_files = FileList["test/**/test_*.rb"]
|
|
10
12
|
end
|
|
@@ -14,3 +16,4 @@ require "rubocop/rake_task"
|
|
|
14
16
|
RuboCop::RakeTask.new
|
|
15
17
|
|
|
16
18
|
task default: %i[test rubocop]
|
|
19
|
+
|
data/lib/chatgpt/client.rb
CHANGED
|
@@ -1,27 +1,45 @@
|
|
|
1
|
-
# lib/chatgpt/client.rb
|
|
2
|
-
|
|
3
1
|
require 'rest-client'
|
|
4
2
|
require 'json'
|
|
5
3
|
|
|
6
4
|
module ChatGPT
|
|
7
5
|
class Client
|
|
6
|
+
# Initialize the client with the API key
|
|
7
|
+
#
|
|
8
|
+
# @param api_key [String] The API key for the GPT-3 service
|
|
8
9
|
def initialize(api_key)
|
|
9
10
|
@api_key = api_key
|
|
11
|
+
# Base endpoint for the OpenAI API
|
|
10
12
|
@endpoint = 'https://api.openai.com/v1'
|
|
11
13
|
end
|
|
12
14
|
|
|
15
|
+
# Prepare headers for the API request
|
|
16
|
+
#
|
|
17
|
+
# @return [Hash] The headers for the API request
|
|
18
|
+
def headers
|
|
19
|
+
{
|
|
20
|
+
'Content-Type' => 'application/json',
|
|
21
|
+
'Authorization' => "Bearer #{@api_key}"
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Generate completions based on a given prompt
|
|
26
|
+
#
|
|
27
|
+
# @param prompt [String] The prompt to be completed
|
|
28
|
+
# @param params [Hash] Additional parameters for the completion request
|
|
29
|
+
#
|
|
30
|
+
# @return [Hash] The completion results from the API
|
|
13
31
|
def completions(prompt, params = {})
|
|
32
|
+
# Set default parameters
|
|
14
33
|
engine = params[:engine] || 'text-davinci-002'
|
|
15
34
|
max_tokens = params[:max_tokens] || 16
|
|
16
35
|
temperature = params[:temperature] || 0.5
|
|
17
36
|
top_p = params[:top_p] || 1.0
|
|
18
37
|
n = params[:n] || 1
|
|
19
38
|
|
|
39
|
+
# Construct the URL for the completion request
|
|
20
40
|
url = "#{@endpoint}/engines/#{engine}/completions"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
'Authorization' => "Bearer #{@api_key}"
|
|
24
|
-
}
|
|
41
|
+
|
|
42
|
+
# Prepare the data for the request
|
|
25
43
|
data = {
|
|
26
44
|
prompt: prompt,
|
|
27
45
|
max_tokens: max_tokens,
|
|
@@ -29,86 +47,36 @@ module ChatGPT
|
|
|
29
47
|
top_p: top_p,
|
|
30
48
|
n: n
|
|
31
49
|
}
|
|
32
|
-
|
|
33
|
-
|
|
50
|
+
|
|
51
|
+
# Make the request to the API
|
|
52
|
+
request_api(url, data)
|
|
34
53
|
end
|
|
35
54
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
'Authorization' => "Bearer #{@api_key}"
|
|
61
|
-
}
|
|
62
|
-
data = {
|
|
63
|
-
model: model,
|
|
64
|
-
input: text
|
|
65
|
-
}
|
|
66
|
-
response = RestClient.post(url, data.to_json, headers)
|
|
67
|
-
JSON.parse(response.body)['data'][0]['label']
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def generate_summaries(documents, params = {})
|
|
71
|
-
model = params[:model] || 'text-davinci-002'
|
|
72
|
-
max_tokens = params[:max_tokens] || 60
|
|
73
|
-
temperature = params[:temperature] || 0.5
|
|
74
|
-
top_p = params[:top_p] || 1.0
|
|
75
|
-
frequency_penalty = params[:frequency_penalty] || 0.0
|
|
76
|
-
presence_penalty = params[:presence_penalty] || 0.0
|
|
77
|
-
|
|
78
|
-
url = "#{@endpoint}/engines/#{model}/generate"
|
|
79
|
-
headers = {
|
|
80
|
-
'Content-Type' => 'application/json',
|
|
81
|
-
'Authorization' => "Bearer #{@api_key}"
|
|
82
|
-
}
|
|
83
|
-
data = {
|
|
84
|
-
prompt: '',
|
|
85
|
-
max_tokens: max_tokens,
|
|
86
|
-
temperature: temperature,
|
|
87
|
-
top_p: top_p,
|
|
88
|
-
frequency_penalty: frequency_penalty,
|
|
89
|
-
presence_penalty: presence_penalty,
|
|
90
|
-
documents: documents
|
|
91
|
-
}
|
|
92
|
-
response = RestClient.post(url, data.to_json, headers)
|
|
93
|
-
JSON.parse(response.body)['choices'][0]['text']
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def generate_answers(prompt, documents, params = {})
|
|
97
|
-
model = params[:model] || 'text-davinci-002'
|
|
98
|
-
max_tokens = params[:max_tokens] || 5
|
|
99
|
-
|
|
100
|
-
url = "#{@endpoint}/engines/#{model}/answers"
|
|
101
|
-
headers = {
|
|
102
|
-
'Content-Type' => 'application/json',
|
|
103
|
-
'Authorization' => "Bearer #{@api_key}"
|
|
104
|
-
}
|
|
105
|
-
data = {
|
|
106
|
-
prompt: prompt,
|
|
107
|
-
documents: documents,
|
|
108
|
-
max_tokens: max_tokens
|
|
109
|
-
}
|
|
110
|
-
response = RestClient.post(url, data.to_json, headers)
|
|
111
|
-
JSON.parse(response.body)['data'][0]['answer']
|
|
55
|
+
private
|
|
56
|
+
# Make a request to the API
|
|
57
|
+
#
|
|
58
|
+
# @param url [String] The URL for the request
|
|
59
|
+
# @param data [Hash] The data to be sent in the request
|
|
60
|
+
# @param method [Symbol] The HTTP method for the request (:post by default)
|
|
61
|
+
#
|
|
62
|
+
# @return [Hash] The response from the API
|
|
63
|
+
#
|
|
64
|
+
# @raise [RestClient::ExceptionWithResponse] If the API request fails
|
|
65
|
+
def request_api(url, data, method = :post)
|
|
66
|
+
begin
|
|
67
|
+
# Execute the request
|
|
68
|
+
response = RestClient::Request.execute(method: method, url: url, payload: data.to_json, headers: headers)
|
|
69
|
+
|
|
70
|
+
# Parse and return the response body
|
|
71
|
+
JSON.parse(response.body)
|
|
72
|
+
rescue RestClient::ExceptionWithResponse => e
|
|
73
|
+
# Parse the error message from the API response
|
|
74
|
+
error_msg = JSON.parse(e.response.body)['error']['message']
|
|
75
|
+
|
|
76
|
+
# Raise an exception with the API error message
|
|
77
|
+
raise RestClient::ExceptionWithResponse.new("#{e.message}: #{error_msg} (#{e.http_code})"), nil, e.backtrace
|
|
78
|
+
end
|
|
112
79
|
end
|
|
80
|
+
|
|
113
81
|
end
|
|
114
82
|
end
|
data/lib/chatgpt/ruby/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: chatgpt-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nagendra Dhanakeerthi
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-03
|
|
11
|
+
date: 2023-06-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rest-client
|
|
@@ -32,6 +32,7 @@ executables: []
|
|
|
32
32
|
extensions: []
|
|
33
33
|
extra_rdoc_files: []
|
|
34
34
|
files:
|
|
35
|
+
- ".codeclimate.yml"
|
|
35
36
|
- ".rubocop.yml"
|
|
36
37
|
- CHANGELOG.md
|
|
37
38
|
- CODE_OF_CONDUCT.md
|