chatgpt-ruby 0.3.0 → 0.6.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: 5f01f292bb8825b0d36f4474f988a1cee11a9f065eb9f02643de9e4b9d4c433b
4
- data.tar.gz: c5ef2ddfeaccacfcb68be33257384facc83b33f983233acda917c9962bef0826
3
+ metadata.gz: 7aa91296be7cab7d9f1f5f1b2b6e55fa784c4a8760fabebbaac3cf903268da1d
4
+ data.tar.gz: cd8a13397002dec2a38da0ad766ce3b9301ca3d6bc5efa2669b30851d3ebc4ca
5
5
  SHA512:
6
- metadata.gz: 27062bcbbba5cdc8804235ea72d305e4699e8b40faef562693428007f3564b227db2ec13ddc8100bafa955c9234f85d9bc1582f8a88aa9b486207b9daaf8965a
7
- data.tar.gz: 5b60cc1a80ff20fcb4f6f2b45452758847c1585a02541658c49e8a432a0fa62145a0bde1fcb81ff5a5e92ab7ddf67ca373c52fe0cb96f705c6bd24e33b6628fc
6
+ metadata.gz: adf9e9cdc0e6b3e834d86e388b2c6319a42292c302333cc4a039817c9b4136e1394e00dff859c9f2359674728bf550171a22d64387089accdf48aed2d023658f
7
+ data.tar.gz: f1d0932b4ad810440543fa9b538a52190f6355ef892356519373748eb002f94a4d3de35f234fbd120c0bcd959b1f609fd6f35bbd27cd2125009a0b84e11dd8bd
data/Gemfile CHANGED
@@ -11,5 +11,4 @@ gem "minitest", "~> 5.0"
11
11
 
12
12
  gem "rubocop", "~> 1.21"
13
13
 
14
- gem 'httparty'
15
- gem 'json'
14
+ gem 'rest-client'
data/Gemfile.lock CHANGED
@@ -1,25 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- chatgpt-ruby (0.3.0)
4
+ chatgpt-ruby (0.6.0)
5
+ rest-client
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
9
10
  ast (2.4.2)
10
- httparty (0.21.0)
11
- mini_mime (>= 1.0.0)
12
- multi_xml (>= 0.5.2)
11
+ domain_name (0.5.20190701)
12
+ unf (>= 0.0.5, < 1.0.0)
13
+ http-accept (1.7.0)
14
+ http-cookie (1.0.5)
15
+ domain_name (~> 0.5)
13
16
  json (2.6.3)
14
- mini_mime (1.1.2)
17
+ mime-types (3.4.1)
18
+ mime-types-data (~> 3.2015)
19
+ mime-types-data (3.2023.0218.1)
15
20
  minitest (5.18.0)
16
- multi_xml (0.6.0)
21
+ netrc (0.11.0)
17
22
  parallel (1.22.1)
18
23
  parser (3.2.1.1)
19
24
  ast (~> 2.4.1)
20
25
  rainbow (3.1.1)
21
26
  rake (13.0.6)
22
27
  regexp_parser (2.7.0)
28
+ rest-client (2.1.0)
29
+ http-accept (>= 1.7.0, < 2.0)
30
+ http-cookie (>= 1.0.2, < 2.0)
31
+ mime-types (>= 1.16, < 4.0)
32
+ netrc (~> 0.8)
23
33
  rexml (3.2.5)
24
34
  rubocop (1.48.1)
25
35
  json (~> 2.3)
@@ -34,6 +44,9 @@ GEM
34
44
  rubocop-ast (1.27.0)
35
45
  parser (>= 3.2.1.0)
36
46
  ruby-progressbar (1.13.0)
47
+ unf (0.1.4)
48
+ unf_ext
49
+ unf_ext (0.0.8.2)
37
50
  unicode-display_width (2.4.2)
38
51
 
39
52
  PLATFORMS
@@ -41,10 +54,9 @@ PLATFORMS
41
54
 
42
55
  DEPENDENCIES
43
56
  chatgpt-ruby!
44
- httparty
45
- json
46
57
  minitest (~> 5.0)
47
58
  rake (~> 13.0)
59
+ rest-client
48
60
  rubocop (~> 1.21)
49
61
 
50
62
  BUNDLED WITH
data/README.md CHANGED
@@ -1,46 +1,161 @@
1
1
  # ChatGPTRuby
2
2
 
3
- The `chatgpt-ruby` gem is a simple Ruby SDK for accessing the OpenAI ChatGPT API. This client makes it easy to integrate the ChatGPT API into your Ruby applications.
3
+ The `chatgpt-ruby` is a Ruby SDK for the OpenAI API, including methods for generating text, completing prompts, and more.
4
4
 
5
- ### Bundler
5
+ ## Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem "chatgpt-ruby"
10
+ gem 'chatgpt-ruby'
11
11
  ```
12
12
 
13
+
14
+
13
15
  And then execute:
14
16
 
17
+ ```ruby
15
18
  $ bundle install
19
+ ```
20
+
16
21
 
17
- ### Gem install
18
22
 
19
- Or install with:
23
+ Or install it yourself as:
20
24
 
25
+ ```ruby
21
26
  $ gem install chatgpt-ruby
27
+ ```
22
28
 
23
29
  ## Usage
24
30
 
25
- To use the gem in a Ruby script or application, simply require it and initialize the client:
31
+ To use the ChatGPT API SDK, you will need an API key from OpenAI. You can obtain an API key by signing up for the [OpenAI API beta program](https://beta.openai.com/signup/) .
32
+
33
+ Once you have an API key, you can create a new `ChatGPT::Client` instance with your API key:
34
+
35
+ ```ruby
36
+ require 'chatgpt_api'
37
+
38
+ api_key = 'your-api-key'
39
+ client = ChatGPT::Client.new(api_key)
40
+ ```
41
+
42
+
43
+ ### Completions
44
+
45
+ To generate completions given a prompt, you can use the `completions` method:
46
+
47
+ ```ruby
48
+ prompt = 'Hello, my name is'
49
+ completions = client.completions(prompt)
50
+
51
+ # Output: an array of completion strings
52
+ ```
53
+
54
+
55
+
56
+ You can customize the generation process by passing in additional parameters as a hash:
57
+
58
+ ```ruby
59
+ params = {
60
+ engine: 'text-davinci-002',
61
+ max_tokens: 50,
62
+ temperature: 0.7
63
+ }
64
+ completions = client.completions(prompt, params)
65
+
66
+ # Output: an array of completion strings
67
+ ```
68
+
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
+
26
86
  ```ruby
27
- require 'chatgpt_client'
87
+ params = {
88
+ engine: 'ada',
89
+ max_rerank: 100
90
+ }
91
+ results = client.search(documents, query, params)
28
92
 
29
- client = ChatGPTClient::Client.new('your_api_key')
30
- response = client.chat('Please translate the following English text to French: "Hello, how are you?"')
31
- puts response
93
+ # Output: an array of search result objects
32
94
  ```
33
95
 
34
- Replace 'your_api_key' with your actual ChatGPT API key.
35
96
 
36
- ### Parameters
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
+
37
108
 
38
- The `chat` method accepts a mandatory `prompt` parameter and an optional `options` parameter.
39
109
 
40
- The `prompt` parameter is a string representing the input you want to send to the ChatGPT API.
110
+ You can customize the classification process by passing in additional parameters as a hash:
41
111
 
42
- The `options` parameter is a hash that can include the following keys:
43
- - `max_tokens`: The maximum number of tokens
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
+ ```
44
159
 
45
160
  ## Development
46
161
 
@@ -1,45 +1,114 @@
1
- # chatgpt_client.rb
2
- require 'httparty'
1
+ # lib/chatgpt/client.rb
2
+
3
+ require 'rest-client'
3
4
  require 'json'
4
5
 
5
- module ChatGPTRuby
6
+ module ChatGPT
6
7
  class Client
7
- include HTTParty
8
- base_uri 'https://api.openai.com/v1'
9
-
10
8
  def initialize(api_key)
11
9
  @api_key = api_key
12
- @headers = {
13
- 'Authorization' => "Bearer #{@api_key}",
14
- 'Content-Type' => 'application/json'
10
+ @endpoint = 'https://api.openai.com/v1'
11
+ end
12
+
13
+ def completions(prompt, params = {})
14
+ engine = params[:engine] || 'text-davinci-002'
15
+ max_tokens = params[:max_tokens] || 16
16
+ temperature = params[:temperature] || 0.5
17
+ top_p = params[:top_p] || 1.0
18
+ n = params[:n] || 1
19
+
20
+ url = "#{@endpoint}/engines/#{engine}/completions"
21
+ headers = {
22
+ 'Content-Type' => 'application/json',
23
+ 'Authorization' => "Bearer #{@api_key}"
24
+ }
25
+ data = {
26
+ prompt: prompt,
27
+ max_tokens: max_tokens,
28
+ temperature: temperature,
29
+ top_p: top_p,
30
+ n: n
15
31
  }
32
+ response = RestClient.post(url, data.to_json, headers)
33
+ JSON.parse(response.body)
16
34
  end
17
35
 
18
- # Methods to interact with the API
19
- def generate(prompt, options = {})
20
- body = {
21
- 'prompt' => prompt,
22
- 'max_tokens' => options.fetch(:max_tokens, 100),
23
- 'n' => options.fetch(:n, 1),
24
- 'stop' => options.fetch(:stop, nil),
25
- 'temperature' => options.fetch(:temperature, 1.0),
26
- 'top_p' => options.fetch(:top_p, 1.0),
27
- 'frequency_penalty' => options.fetch(:frequency_penalty, 0.0),
28
- 'presence_penalty' => options.fetch(:presence_penalty, 0.0),
29
- }.to_json
30
-
31
- response = self.class.post('/davinci-codex/completions', headers: @headers, body: body)
32
- handle_response(response)
36
+ def search(documents, query, params = {})
37
+ engine = params[:engine] || 'ada'
38
+ max_rerank = params[:max_rerank] || 200
39
+
40
+ url = "#{@endpoint}/engines/#{engine}/search"
41
+ headers = {
42
+ 'Content-Type' => 'application/json',
43
+ 'Authorization' => "Bearer #{@api_key}"
44
+ }
45
+ data = {
46
+ documents: documents,
47
+ query: query,
48
+ max_rerank: max_rerank
49
+ }
50
+ response = RestClient.post(url, data.to_json, headers)
51
+ JSON.parse(response.body)['data']
33
52
  end
34
53
 
35
- private
54
+ def classify(text, params = {})
55
+ model = params[:model] || 'text-davinci-002'
36
56
 
37
- def handle_response(response)
38
- if response.code == 200
39
- JSON.parse(response.body)
40
- else
41
- raise "Error: #{response.code} - #{response.message}"
42
- end
57
+ url = "#{@endpoint}/classifications/#{model}"
58
+ headers = {
59
+ 'Content-Type' => 'application/json',
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']
43
112
  end
44
113
  end
45
114
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Chatgpt
4
4
  module Ruby
5
- VERSION = "0.1.0"
5
+ VERSION = "0.6.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chatgpt-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nagendra Dhanakeerthi
@@ -9,8 +9,23 @@ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
11
  date: 2023-03-22 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Write a longer description or delete this line.
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: This gem provides a Ruby SDK for interacting with the OpenAI API, including
28
+ methods for generating text, completing prompts, and more.
14
29
  email:
15
30
  - nagendra.dhanakeerthi@gmail.com
16
31
  executables: []
@@ -29,10 +44,13 @@ files:
29
44
  - lib/chatgpt/ruby.rb
30
45
  - lib/chatgpt/ruby/version.rb
31
46
  - sig/chatgpt/ruby.rbs
32
- homepage:
47
+ homepage: https://github.com/nagstler/chatgpt-ruby.git
33
48
  licenses:
34
49
  - MIT
35
- metadata: {}
50
+ metadata:
51
+ homepage_uri: https://github.com/nagstler/chatgpt-ruby.git
52
+ source_code_uri: https://github.com/nagstler/chatgpt-ruby.git
53
+ changelog_uri: https://github.com/nagstler/chatgpt-ruby/blob/main/CHANGELOG.md
36
54
  post_install_message:
37
55
  rdoc_options: []
38
56
  require_paths:
@@ -51,5 +69,5 @@ requirements: []
51
69
  rubygems_version: 3.3.26
52
70
  signing_key:
53
71
  specification_version: 4
54
- summary: Write a short summary, because RubyGems requires one.
72
+ summary: A Ruby SDK for the OpenAI API
55
73
  test_files: []