pleasegpt 0.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 +7 -0
- data/bin/pleasegpt +22 -0
- data/lib/pleasegpt/cli.rb +16 -0
- data/lib/pleasegpt.rb +76 -0
- data/spec/bin/pleasegpt_test.rb +9 -0
- data/spec/lib/cli_test.rb +23 -0
- data/spec/lib/pleasegpt_test.rb +21 -0
- data/spec/spec_helper.rb +17 -0
- metadata +127 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d3fe6ac1bdc94405d7be4ae85189cc4f7b55e4d0ebb8805b64848aa4ad457b57
|
4
|
+
data.tar.gz: 8454842d82d428d31e5c9de69ef3dabcefc471c6222063d865b701f72b2c941e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c06a7d1921370d80d3a63ac34ea8bb9c5f1d21aa2c4e9368fb388e5074c809fa7b592bb4f2eec4f1e02e86a431a4ae87bc98f0f761439aa49cbc73df8350ca52
|
7
|
+
data.tar.gz: ac5ec1c168ec08883c5c44a424058e1ab94e5b57adcd111fd9ce1e97a95804904fc2756b12d14f80f03c69eb1b11096c21044e267718af0d41a3d01ad25a9307
|
data/bin/pleasegpt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'pleasegpt'
|
5
|
+
require 'pleasegpt/cli'
|
6
|
+
require 'openai'
|
7
|
+
|
8
|
+
case ARGV[0]
|
9
|
+
when 'load-key'
|
10
|
+
PleaseGPT::Api.load_api_key
|
11
|
+
when 'help'
|
12
|
+
puts <<-HELP
|
13
|
+
PleaseGPT - A command-line tool for OpenAI's GPT-3 API
|
14
|
+
|
15
|
+
Usage:
|
16
|
+
pleasegpt [input] # Generate text based on input
|
17
|
+
pleasegpt load-key # Save OpenAI API key
|
18
|
+
pleasegpt help # Show this help message
|
19
|
+
HELP
|
20
|
+
else
|
21
|
+
PleaseGPT::CLI.new.start(ARGV)
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'pleasegpt'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
module PleaseGPT
|
5
|
+
# CLI class for the command-line tool interface
|
6
|
+
class CLI
|
7
|
+
def start(args)
|
8
|
+
if args.empty?
|
9
|
+
puts '>>> Please enter a valid command <<<'
|
10
|
+
else
|
11
|
+
input = args.join(' ')
|
12
|
+
puts Api.generate_text(input).to_s.colorize(:green)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/pleasegpt.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'ruby/openai'
|
2
|
+
require 'openai'
|
3
|
+
require 'highline/import'
|
4
|
+
require 'dotenv/load'
|
5
|
+
require 'dotenv'
|
6
|
+
|
7
|
+
# Main module for PleaseGPT gem
|
8
|
+
module PleaseGPT
|
9
|
+
autoload :CLI, 'pleasegpt/cli'
|
10
|
+
|
11
|
+
# API class for OpenAI API requests and responses
|
12
|
+
module Api
|
13
|
+
def self.load_api_key
|
14
|
+
key = ask('Please paste your OpenAI API key: ')
|
15
|
+
if key.nil? || key.empty?
|
16
|
+
puts 'API Key cannot be empty. Please try again.'
|
17
|
+
else
|
18
|
+
save_api_key(key)
|
19
|
+
puts 'API key saved to file'
|
20
|
+
env_variable(key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.gem_dir
|
25
|
+
File.expand_path('..', __dir__)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.join_lib_dir_with_file
|
29
|
+
File.join(gem_dir, 'lib', '.openai')
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.save_api_key(key)
|
33
|
+
File.write(join_lib_dir_with_file, "OPENAI_API_KEY=#{key}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.env_variable(key)
|
37
|
+
File.open(join_lib_dir_with_file, 'w') do |f|
|
38
|
+
f.puts "OPENAI_API_KEY=#{key}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.openai_client
|
43
|
+
Dotenv.load(join_lib_dir_with_file)
|
44
|
+
raise 'OPENAI_API_KEY not set' unless ENV['OPENAI_API_KEY']
|
45
|
+
|
46
|
+
OpenAI::Client.new(access_token: ENV['OPENAI_API_KEY'])
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.generate_text(input)
|
50
|
+
response = openai_client.completions(
|
51
|
+
parameters: {
|
52
|
+
model: 'text-davinci-003',
|
53
|
+
prompt: input,
|
54
|
+
max_tokens: 300,
|
55
|
+
temperature: 0.5,
|
56
|
+
n: 1,
|
57
|
+
stop: '.'
|
58
|
+
}
|
59
|
+
)
|
60
|
+
Error.check_response(response)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Error class for OpenAI API requests and response errors
|
65
|
+
class Error < StandardError
|
66
|
+
def self.check_response(response)
|
67
|
+
if response['choices'].nil? || response['choices'].empty?
|
68
|
+
raise PleaseGPT::Error, 'Request returned empty response'
|
69
|
+
elsif response['choices'][0]['text'].nil?
|
70
|
+
raise PleaseGPT::Error, 'Request returned nil text'
|
71
|
+
else
|
72
|
+
response['choices'][0]['text'].strip
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pleasegpt/cli'
|
3
|
+
require 'colorize'
|
4
|
+
|
5
|
+
RSpec.describe PleaseGPT::CLI do
|
6
|
+
describe "#start" do
|
7
|
+
context "when given a valid command receives a response in blue" do
|
8
|
+
let(:args) { ["how much is 2+2?"] }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(PleaseGPT::Api).to receive(:generate_text).with(args.join(' ')) do
|
12
|
+
'The answer is 4.'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns a non-empty response from the OpenAI API with blue colour" do
|
17
|
+
expect { subject.start(args) }.to output(/.*\n/).to_stdout
|
18
|
+
expect { subject.start(args) }.to output(/\S/).to_stdout
|
19
|
+
expect { subject.start(args) }.to output(/\e\[0;34;49m.*\e\[0m\n/).to_stdout
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pleasegpt'
|
3
|
+
|
4
|
+
RSpec.describe PleaseGPT::Api do
|
5
|
+
describe '#generate_text' do
|
6
|
+
let(:input) { 'Some prompt for GPT' }
|
7
|
+
let(:response_text) { 'Generated text' }
|
8
|
+
|
9
|
+
before do
|
10
|
+
allow_any_instance_of(OpenAI::Client)
|
11
|
+
.to receive(:completions)
|
12
|
+
.and_return('choices' => [{ 'text' => response_text }])
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns a non-empty response' do
|
16
|
+
response = PleaseGPT::Api.generate_text(input)
|
17
|
+
expect(response).not_to be_empty
|
18
|
+
expect(response).to eq(response_text)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'pleasegpt'
|
3
|
+
require 'dotenv/load'
|
4
|
+
|
5
|
+
unless ENV['OPENAI_API_KEY']
|
6
|
+
# Prompt the user to enter their API key
|
7
|
+
puts 'Please enter your OpenAI API key: '
|
8
|
+
api_key = gets.chomp
|
9
|
+
|
10
|
+
# Set the environment variable for the current process
|
11
|
+
ENV['OPENAI_API_KEY'] = api_key
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.color = true
|
16
|
+
config.formatter = :documentation
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pleasegpt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rafael Moreira
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-03-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ruby-openai
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: openai
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dotenv
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.8'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 2.8.1
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '2.8'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 2.8.1
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: highline
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.1'
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.1'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: colorize
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.8.1
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.8.1
|
89
|
+
description:
|
90
|
+
email:
|
91
|
+
- rafamsilva@gmail.com
|
92
|
+
executables:
|
93
|
+
- pleasegpt
|
94
|
+
extensions: []
|
95
|
+
extra_rdoc_files: []
|
96
|
+
files:
|
97
|
+
- bin/pleasegpt
|
98
|
+
- lib/pleasegpt.rb
|
99
|
+
- lib/pleasegpt/cli.rb
|
100
|
+
- spec/bin/pleasegpt_test.rb
|
101
|
+
- spec/lib/cli_test.rb
|
102
|
+
- spec/lib/pleasegpt_test.rb
|
103
|
+
- spec/spec_helper.rb
|
104
|
+
homepage: https://github.com/rafaover/pleasegpt
|
105
|
+
licenses:
|
106
|
+
- MIT
|
107
|
+
metadata: {}
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubygems_version: 3.3.7
|
124
|
+
signing_key:
|
125
|
+
specification_version: 4
|
126
|
+
summary: A simple wrapper around the OpenAI GPT-3 API
|
127
|
+
test_files: []
|