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 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: []