ask-ai 1.0.0 → 1.0.1
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/lib/config.rb +3 -3
- data/lib/context.rb +82 -3
- data/lib/file_format_error.rb +7 -0
- data/lib/help.rb +1 -0
- data/lib/main.rb +20 -2
- data/lib/prompt.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e73628fad8025e8de63e07c4256f42426eb9651fb62a418f8f73c6b7b4db432d
|
4
|
+
data.tar.gz: 4575f5535ddedd005e846cf598c3f464717130b2ce065b7c29e2e174cadebd30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2fccb29fba0174e10556377b2422fb6d3de99eef58820af2289ef77dd0379029c5d989d745eb388ef0901c153de2ce22163a9fb8b11d1f133d84e0d3bdb6b62
|
7
|
+
data.tar.gz: 45bc0ea0ef5e78a465b196fe262a2b1b88cdeb2bd9b15af86300d72ac2cf220c4b1ebeb860b41782e02bad51dc87d34e32a7522c1ff3129bc1902995c0dfcebf
|
data/lib/config.rb
CHANGED
@@ -9,7 +9,7 @@ module Config
|
|
9
9
|
|
10
10
|
def save_key(api_key)
|
11
11
|
config = YAML.load_file(config_path)
|
12
|
-
if config == false
|
12
|
+
if (config == false || config.nil?)
|
13
13
|
config = {}
|
14
14
|
end
|
15
15
|
config['OPENAI_API_KEY'] = api_key
|
@@ -18,7 +18,7 @@ module Config
|
|
18
18
|
|
19
19
|
def load_temperature
|
20
20
|
config = YAML.load_file(config_path)
|
21
|
-
unless config == false
|
21
|
+
unless (config == false || config.nil?)
|
22
22
|
config['TEMPERATURE']
|
23
23
|
end
|
24
24
|
end
|
@@ -34,7 +34,7 @@ module Config
|
|
34
34
|
|
35
35
|
def load_context_length
|
36
36
|
config = YAML.load_file(config_path)
|
37
|
-
unless config == false
|
37
|
+
unless (config == false || config.nil?)
|
38
38
|
config['CONTEXT_LENGTH']
|
39
39
|
end
|
40
40
|
end
|
data/lib/context.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require_relative './files.rb'
|
2
2
|
require_relative './config.rb'
|
3
|
+
require_relative './file_format_error.rb'
|
3
4
|
class Context
|
4
5
|
extend Files, Config, Logging
|
5
|
-
def self.load_context()
|
6
|
+
def self.load_context(file_with_context: false)
|
6
7
|
if File.exist?(context_path)
|
7
8
|
conversation = File.readlines(context_path).map { |line| JSON.parse(line) }
|
8
9
|
else
|
@@ -21,6 +22,10 @@ class Context
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
25
|
+
if file_with_context
|
26
|
+
return load_context_file() + context_as_string
|
27
|
+
end
|
28
|
+
|
24
29
|
return context_as_string
|
25
30
|
end
|
26
31
|
|
@@ -48,12 +53,19 @@ class Context
|
|
48
53
|
end
|
49
54
|
|
50
55
|
def self.save_context_file(file_path)
|
56
|
+
## If the file extenstion is pdf or docx raise an error.
|
57
|
+
## This is not a complete list of file extensions.
|
58
|
+
if file_path.include?(".pdf") || file_path.include?(".docx")
|
59
|
+
raise FileFormatError, "File type not supported."
|
60
|
+
end
|
51
61
|
unless file_path.nil?
|
62
|
+
conter = 0
|
52
63
|
file_in = File.open(file_path, 'r')
|
53
|
-
file_out = File.open(context_file_path, '
|
64
|
+
file_out = File.open(context_file_path, 'a')
|
65
|
+
file_out.write("loaded_context_file_path=#{file_path}\n")
|
54
66
|
char_count = 0
|
55
67
|
file_in.each do |line|
|
56
|
-
puts "Line: #{line}"
|
68
|
+
#puts "Line: #{line}"
|
57
69
|
char_count += line.length
|
58
70
|
file_out.write(line)
|
59
71
|
end
|
@@ -68,6 +80,8 @@ class Context
|
|
68
80
|
end
|
69
81
|
rescue Errno::ENOENT
|
70
82
|
log("No file at '#{file_path}' found.")
|
83
|
+
rescue FileFormatError => e
|
84
|
+
log(e.message)
|
71
85
|
end
|
72
86
|
|
73
87
|
def self.load_context_file()
|
@@ -83,5 +97,70 @@ class Context
|
|
83
97
|
log("Load a file with 'aa -lf <file_path>'")
|
84
98
|
return ""
|
85
99
|
end
|
100
|
+
## This first class pasta method need to be refactored.
|
101
|
+
## It's a mess.
|
102
|
+
def self.delete_file_context()
|
103
|
+
counter = 1
|
104
|
+
delete_lines = []
|
105
|
+
last_line = 0
|
106
|
+
File.open(context_file_path, "r") { |file|
|
107
|
+
if file.size == 0
|
108
|
+
log("No files loaded.")
|
109
|
+
return
|
110
|
+
end
|
111
|
+
file.readlines.each_with_index { |line, index|
|
112
|
+
if line.include?("loaded_context_file_path=")
|
113
|
+
log("#{counter}: #{line.gsub("loaded_context_file_path=", "")}")
|
114
|
+
delete_lines.push(index)
|
115
|
+
counter += 1
|
116
|
+
end
|
117
|
+
last_line = index
|
118
|
+
}
|
119
|
+
}
|
120
|
+
if counter == 1 + 1
|
121
|
+
log "One file loaded. Enter '1' or 'all' to delete it."
|
122
|
+
log "Enter 'a' to abort."
|
123
|
+
else
|
124
|
+
log("Which file do you want to delete? (1-#{counter - 1}) or 'all'")
|
125
|
+
log("Enter 'a' to abort.")
|
126
|
+
end
|
127
|
+
|
128
|
+
delete_counter = 0
|
129
|
+
while input = Readline.readline("\nDelete --> ", true) do
|
130
|
+
if input == "a"
|
131
|
+
log("Aborting.")
|
132
|
+
return
|
133
|
+
elsif input == "all"
|
134
|
+
File.truncate(context_file_path, 0)
|
135
|
+
log("Deleted all files.")
|
136
|
+
return
|
137
|
+
elsif input.to_i >= 1 && input.to_i < counter
|
138
|
+
lines_to_save = []
|
139
|
+
File.open(context_file_path, "r") { |file|
|
140
|
+
file.readlines.each_with_index { |line, index|
|
141
|
+
start_line = delete_lines[input.to_i - 1]
|
142
|
+
end_line = delete_lines[input.to_i]
|
143
|
+
if end_line.nil?
|
144
|
+
end_line = last_line + 1
|
145
|
+
end
|
146
|
+
if index < start_line || index > end_line - 1
|
147
|
+
lines_to_save.push(line)
|
148
|
+
end
|
149
|
+
}
|
150
|
+
}
|
151
|
+
File.truncate(context_file_path, 0)
|
152
|
+
File.open(context_file_path, "a") { |file|
|
153
|
+
lines_to_save.each { |line|
|
154
|
+
file.write(line)
|
155
|
+
}
|
156
|
+
}
|
157
|
+
log("Deleting file")
|
158
|
+
return
|
159
|
+
elsif input.to_i <= 0 || input.to_i > counter
|
160
|
+
log("Please enter a number between 1 and #{counter - 1}")
|
161
|
+
log("Enter 'a' to abort.")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
86
165
|
|
87
166
|
end
|
data/lib/help.rb
CHANGED
@@ -44,6 +44,7 @@ class Help
|
|
44
44
|
log("Type '-w <filepath>' to whisper transcribe.")
|
45
45
|
log("Type '-t' <filepath> to whisper translate.")
|
46
46
|
log("Type '-lf' <filepath> to load file.")
|
47
|
+
log "Type '-df' to delete file context."
|
47
48
|
log("Type '-f' to use loaded file as context.")
|
48
49
|
end
|
49
50
|
end
|
data/lib/main.rb
CHANGED
@@ -15,7 +15,7 @@ class Main
|
|
15
15
|
extend Logging, Files, Config
|
16
16
|
LIST = [
|
17
17
|
"exit", "quit", "version", "clear", "help", "show",
|
18
|
-
"-w", "-t", "-lf", "-f", "config", "temp", "context"
|
18
|
+
"-w", "-t", "-lf", "-f", "-df", "config", "temp", "context"
|
19
19
|
].sort
|
20
20
|
|
21
21
|
def self.run()
|
@@ -27,6 +27,21 @@ class Main
|
|
27
27
|
#Readline.completion_append_character = ""
|
28
28
|
#Readline.completion_proc = comp
|
29
29
|
|
30
|
+
## Function that when called activates completion from LIST
|
31
|
+
# def self.list_auto_complete()
|
32
|
+
# Readline.completion_append_character = ""
|
33
|
+
# Readline.completion_proc = proc do |s|
|
34
|
+
# if s.start_with?("-w", "-t", "-lf", "-f")
|
35
|
+
# pattern = s.sub(/^-w/, "") + "*"
|
36
|
+
# Dir.glob(pattern).grep(/^#{Regexp.escape('')}/)
|
37
|
+
# else
|
38
|
+
# LIST.grep(/^#{Regexp.escape(s)}/)
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
|
43
|
+
# list_auto_complete()
|
44
|
+
|
30
45
|
Help.interactive_desc()
|
31
46
|
while input = Readline.readline("\n> ", true) do
|
32
47
|
case input
|
@@ -55,6 +70,8 @@ class Main
|
|
55
70
|
stript_input = input.sub(/^-lf/, "").strip
|
56
71
|
log("Loading File #{stript_input}")
|
57
72
|
Context.save_context_file(stript_input)
|
73
|
+
when /^-df/
|
74
|
+
Context.delete_file_context()
|
58
75
|
when /^-f/
|
59
76
|
stript_input = input.sub(/^-f/, "").strip
|
60
77
|
file_as_string = Context.load_context_file()
|
@@ -62,8 +79,9 @@ class Main
|
|
62
79
|
log("No file loaded.")
|
63
80
|
next
|
64
81
|
end
|
82
|
+
context = Context.load_context(file_with_context: true)
|
65
83
|
log("")
|
66
|
-
Prompt.stream_prompt(stript_input,
|
84
|
+
Context.save_context(Prompt.stream_prompt(stript_input, context))
|
67
85
|
log("")
|
68
86
|
when ""
|
69
87
|
log("No input given.")
|
data/lib/prompt.rb
CHANGED
@@ -20,7 +20,7 @@ class Prompt
|
|
20
20
|
parameters: {
|
21
21
|
model: "gpt-3.5-turbo",
|
22
22
|
messages: [{ role: "user", content: conversation}],
|
23
|
-
temperature: temp,
|
23
|
+
temperature: temp,
|
24
24
|
stream: proc do |chunk, _bytesize|
|
25
25
|
response += chunk.dig("choices", 0, "delta", "content") unless chunk.dig("choices", 0, "delta", "content").nil?
|
26
26
|
print chunk.dig("choices", 0, "delta", "content")
|
@@ -119,7 +119,7 @@ class Prompt
|
|
119
119
|
|
120
120
|
def self.client()
|
121
121
|
conf = YAML.load(File.read(config_path))
|
122
|
-
unless conf == false
|
122
|
+
unless (conf == false || conf.nil?)
|
123
123
|
key = conf["OPENAI_API_KEY"]
|
124
124
|
end
|
125
125
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ask-ai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oskar Franck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-openai
|
@@ -38,6 +38,7 @@ files:
|
|
38
38
|
- files/context_file.txt
|
39
39
|
- lib/config.rb
|
40
40
|
- lib/context.rb
|
41
|
+
- lib/file_format_error.rb
|
41
42
|
- lib/files.rb
|
42
43
|
- lib/help.rb
|
43
44
|
- lib/logging.rb
|
@@ -62,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
63
|
- !ruby/object:Gem::Version
|
63
64
|
version: '0'
|
64
65
|
requirements: []
|
65
|
-
rubygems_version: 3.
|
66
|
+
rubygems_version: 3.3.7
|
66
67
|
signing_key:
|
67
68
|
specification_version: 4
|
68
69
|
summary: A simple CLI for OpenAI's GPT-3 API.
|