pleasegpt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,9 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "pleasegpt executable" do
4
+ it "runs with the given arguments" do
5
+ expect { system('bin/pleasegpt what is the capital of France?') }
6
+ .to output(/\S/).to_stdout
7
+ .and output(String).to_stdout
8
+ end
9
+ 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
@@ -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: []