gpt4all 0.0.2 → 0.0.4
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/.rubocop.yml +0 -1
- data/Gemfile +1 -2
- data/Gemfile.lock +6 -21
- data/README.md +1 -1
- data/gpt4all.gemspec +1 -1
- data/lib/gpt4all/conversational_ai.rb +50 -24
- data/lib/gpt4all/version.rb +1 -1
- metadata +3 -4
- data/sig/gpt4all.rbs +0 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bcbc4d0a68ce0e29cae2ded264680ea57c279b0cb514545b199b6c03141b6af4
|
|
4
|
+
data.tar.gz: 9662b980b9c22ec94d252ac5793f48deba90739db2804757438f2a345632cff2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a6f1e2c6146a365aee6ec0df861113b6e9ea452781f19473429147d563c32a7d1897a55aeeab72dfc66d64e0e32a6cf0a0f9ddf70062a154ad84fbb6766fe14a
|
|
7
|
+
data.tar.gz: 13e4b5cd8aa2dbbf7d707d8e484c8ddebb3699aed13c761813085b9b55ae4e7d7145d48fb6a2549d66eb04f59eb5528a0caf5d579bacff04f2fd7bfec24b5e86
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
gpt4all (0.0.
|
|
4
|
+
gpt4all (0.0.4)
|
|
5
5
|
faraday (~> 2.7)
|
|
6
6
|
os (~> 1.1)
|
|
7
7
|
tty-progressbar (~> 0.18.2)
|
|
@@ -17,7 +17,6 @@ GEM
|
|
|
17
17
|
bundler (>= 1.2.0, < 3)
|
|
18
18
|
thor (~> 1.0)
|
|
19
19
|
byebug (11.1.3)
|
|
20
|
-
childprocess (4.1.0)
|
|
21
20
|
crack (0.4.5)
|
|
22
21
|
rexml
|
|
23
22
|
diff-lcs (1.5.0)
|
|
@@ -27,20 +26,8 @@ GEM
|
|
|
27
26
|
ruby2_keywords (>= 0.0.4)
|
|
28
27
|
faraday-net_http (3.0.2)
|
|
29
28
|
hashdiff (1.0.1)
|
|
30
|
-
iniparse (1.5.0)
|
|
31
29
|
json (2.6.3)
|
|
32
|
-
license_finder (7.1.0)
|
|
33
|
-
bundler
|
|
34
|
-
rubyzip (>= 1, < 3)
|
|
35
|
-
thor (~> 1.2)
|
|
36
|
-
tomlrb (>= 1.3, < 2.1)
|
|
37
|
-
with_env (= 1.1.0)
|
|
38
|
-
xml-simple (~> 1.1.9)
|
|
39
30
|
os (1.1.4)
|
|
40
|
-
overcommit (0.60.0)
|
|
41
|
-
childprocess (>= 0.6.3, < 5)
|
|
42
|
-
iniparse (~> 1.4)
|
|
43
|
-
rexml (~> 3.2)
|
|
44
31
|
parallel (1.22.1)
|
|
45
32
|
parser (3.2.2.0)
|
|
46
33
|
ast (~> 2.4.1)
|
|
@@ -83,10 +70,8 @@ GEM
|
|
|
83
70
|
rubocop (~> 1.44)
|
|
84
71
|
ruby-progressbar (1.13.0)
|
|
85
72
|
ruby2_keywords (0.0.5)
|
|
86
|
-
rubyzip (2.3.2)
|
|
87
73
|
strings-ansi (0.2.0)
|
|
88
74
|
thor (1.2.1)
|
|
89
|
-
tomlrb (2.0.3)
|
|
90
75
|
tty-cursor (0.7.1)
|
|
91
76
|
tty-progressbar (0.18.2)
|
|
92
77
|
strings-ansi (~> 0.2)
|
|
@@ -99,12 +84,14 @@ GEM
|
|
|
99
84
|
addressable (>= 2.8.0)
|
|
100
85
|
crack (>= 0.3.2)
|
|
101
86
|
hashdiff (>= 0.4.0, < 2.0.0)
|
|
102
|
-
with_env (1.1.0)
|
|
103
|
-
xml-simple (1.1.9)
|
|
104
|
-
rexml
|
|
105
87
|
|
|
106
88
|
PLATFORMS
|
|
89
|
+
aarch64-linux
|
|
90
|
+
aarch64-linux-musl
|
|
91
|
+
arm64-darwin-21
|
|
107
92
|
arm64-darwin-22
|
|
93
|
+
x86_64-linux
|
|
94
|
+
x86_64-linux-musl
|
|
108
95
|
|
|
109
96
|
DEPENDENCIES
|
|
110
97
|
brakeman
|
|
@@ -112,8 +99,6 @@ DEPENDENCIES
|
|
|
112
99
|
byebug
|
|
113
100
|
dotenv
|
|
114
101
|
gpt4all!
|
|
115
|
-
license_finder
|
|
116
|
-
overcommit
|
|
117
102
|
rake (~> 13.0)
|
|
118
103
|
rspec (~> 3.0)
|
|
119
104
|
rubocop (~> 1.21)
|
data/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://badge.fury.io/rb/gpt4all)
|
|
4
4
|
[](https://github.com/jaigouk/gpt4all/actions/workflows/main.yml)
|
|
5
5
|
|
|
6
|
-
Gpt4all is a Ruby gem that provides an easy-to-use interface for interacting with the
|
|
6
|
+
Gpt4all is a Ruby gem that provides an easy-to-use interface for interacting with the [GPT4ALL](https://github.com/nomic-ai/gpt4all-ts) conversational AI model.
|
|
7
7
|
|
|
8
8
|
## Installation
|
|
9
9
|
|
data/gpt4all.gemspec
CHANGED
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
|
12
12
|
spec.description = 'interface to gpt4all'
|
|
13
13
|
spec.homepage = 'https://github.com/jaigouk/gpt4all'
|
|
14
14
|
spec.license = 'MIT'
|
|
15
|
-
spec.required_ruby_version = '>=
|
|
15
|
+
spec.required_ruby_version = '>= 2.7.0'
|
|
16
16
|
|
|
17
17
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
|
18
18
|
|
|
@@ -9,8 +9,9 @@ require 'tty-progressbar'
|
|
|
9
9
|
module Gpt4all
|
|
10
10
|
# rubocop:disable Metrics/ClassLength
|
|
11
11
|
class ConversationalAI
|
|
12
|
-
attr_accessor :
|
|
12
|
+
attr_accessor :model, :decoder_config, :executable_path, :model_path, :force_download, :test_mode
|
|
13
13
|
|
|
14
|
+
# https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/gpt4all-lora-quantized.bin
|
|
14
15
|
OSX_INTEL_URL = 'https://github.com/nomic-ai/gpt4all/blob/main/chat/gpt4all-lora-quantized-OSX-intel?raw=true'
|
|
15
16
|
OSX_M1_URL = 'https://github.com/nomic-ai/gpt4all/blob/main/chat/gpt4all-lora-quantized-OSX-m1?raw=true'
|
|
16
17
|
LINUX_URL = 'https://github.com/nomic-ai/gpt4all/blob/main/chat/gpt4all-lora-quantized-linux-x86?raw=true'
|
|
@@ -66,9 +67,33 @@ module Gpt4all
|
|
|
66
67
|
@bot_pid = nil
|
|
67
68
|
end
|
|
68
69
|
|
|
70
|
+
def restart_bot
|
|
71
|
+
stop_bot
|
|
72
|
+
start_bot
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def prompt(input)
|
|
76
|
+
ensure_bot_is_ready
|
|
77
|
+
|
|
78
|
+
begin
|
|
79
|
+
bot.first.puts(input)
|
|
80
|
+
response = bot.last.gets.strip
|
|
81
|
+
rescue StandardError => e
|
|
82
|
+
puts "Error during prompt: #{e.message}"
|
|
83
|
+
restart_bot
|
|
84
|
+
response = prompt(input)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
response
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
attr_reader :bot
|
|
93
|
+
|
|
69
94
|
def download_executable
|
|
70
|
-
|
|
71
|
-
download_file(
|
|
95
|
+
FileUtils.mkdir_p(File.dirname(executable_path))
|
|
96
|
+
download_file(determine_upstream_url, executable_path)
|
|
72
97
|
FileUtils.chmod(0o755, executable_path)
|
|
73
98
|
puts "File downloaded successfully to #{executable_path}"
|
|
74
99
|
end
|
|
@@ -87,8 +112,9 @@ module Gpt4all
|
|
|
87
112
|
|
|
88
113
|
def download_model
|
|
89
114
|
model_url = "https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/#{model}.bin"
|
|
90
|
-
|
|
91
115
|
download_file(model_url, model_path)
|
|
116
|
+
download_md5_file
|
|
117
|
+
verify_md5_signature
|
|
92
118
|
|
|
93
119
|
puts "File downloaded successfully to #{model_path}"
|
|
94
120
|
end
|
|
@@ -130,13 +156,33 @@ module Gpt4all
|
|
|
130
156
|
|
|
131
157
|
def write_chunks_to_file(response, destination, progress_bar)
|
|
132
158
|
File.open(destination, 'wb') do |file|
|
|
159
|
+
downloaded_size = 0
|
|
133
160
|
response.body.each_chunk do |chunk|
|
|
134
161
|
progress_bar.advance(chunk.bytesize)
|
|
135
162
|
file.write(chunk)
|
|
163
|
+
downloaded_size += chunk.bytesize
|
|
136
164
|
end
|
|
165
|
+
raise 'Incomplete file downloaded.' if downloaded_size < progress_bar.total
|
|
137
166
|
end
|
|
138
167
|
end
|
|
139
168
|
|
|
169
|
+
def download_md5_file
|
|
170
|
+
md5_url = "https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/#{model}.bin.md5"
|
|
171
|
+
md5_path = "#{model_path}.md5"
|
|
172
|
+
download_file(md5_url, md5_path)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def verify_md5_signature
|
|
176
|
+
md5_path = "#{model_path}.md5"
|
|
177
|
+
raise 'MD5 file not found.' unless File.exist?(md5_path)
|
|
178
|
+
|
|
179
|
+
expected_md5 = File.read(md5_path).strip
|
|
180
|
+
actual_md5 = Digest::MD5.file(model_path).hexdigest
|
|
181
|
+
raise 'MD5 signature mismatch.' unless expected_md5 == actual_md5
|
|
182
|
+
|
|
183
|
+
puts 'MD5 signature verified successfully.'
|
|
184
|
+
end
|
|
185
|
+
|
|
140
186
|
def wait_for_bot_ready
|
|
141
187
|
loop do
|
|
142
188
|
output = bot.last.gets
|
|
@@ -144,29 +190,9 @@ module Gpt4all
|
|
|
144
190
|
end
|
|
145
191
|
end
|
|
146
192
|
|
|
147
|
-
def prompt(input)
|
|
148
|
-
ensure_bot_is_ready
|
|
149
|
-
|
|
150
|
-
begin
|
|
151
|
-
bot.first.puts(input)
|
|
152
|
-
response = bot.last.gets.strip
|
|
153
|
-
rescue StandardError => e
|
|
154
|
-
puts "Error during prompt: #{e.message}"
|
|
155
|
-
restart_bot
|
|
156
|
-
response = prompt(input)
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
response
|
|
160
|
-
end
|
|
161
|
-
|
|
162
193
|
def ensure_bot_is_ready
|
|
163
194
|
raise 'Bot is not initialized.' unless bot
|
|
164
195
|
end
|
|
165
|
-
|
|
166
|
-
def restart_bot
|
|
167
|
-
stop_bot
|
|
168
|
-
start_bot
|
|
169
|
-
end
|
|
170
196
|
end
|
|
171
197
|
# rubocop:enable Metrics/ClassLength
|
|
172
198
|
end
|
data/lib/gpt4all/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gpt4all
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jaigouk Kim
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-04-
|
|
11
|
+
date: 2023-04-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
@@ -71,7 +71,6 @@ files:
|
|
|
71
71
|
- lib/gpt4all.rb
|
|
72
72
|
- lib/gpt4all/conversational_ai.rb
|
|
73
73
|
- lib/gpt4all/version.rb
|
|
74
|
-
- sig/gpt4all.rbs
|
|
75
74
|
homepage: https://github.com/jaigouk/gpt4all
|
|
76
75
|
licenses:
|
|
77
76
|
- MIT
|
|
@@ -89,7 +88,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
89
88
|
requirements:
|
|
90
89
|
- - ">="
|
|
91
90
|
- !ruby/object:Gem::Version
|
|
92
|
-
version:
|
|
91
|
+
version: 2.7.0
|
|
93
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
93
|
requirements:
|
|
95
94
|
- - ">="
|
data/sig/gpt4all.rbs
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
module Gpt4all
|
|
2
|
-
VERSION: String
|
|
3
|
-
|
|
4
|
-
class ConversationalAI
|
|
5
|
-
@bot: Process::Child | nil
|
|
6
|
-
@model: String
|
|
7
|
-
@decoder_config: Hash[String, untyped]
|
|
8
|
-
@executable_path: String
|
|
9
|
-
@model_path: String
|
|
10
|
-
|
|
11
|
-
def initialize: (String? model, bool? force_download, Hash[String, untyped]? decoder_config) -> void
|
|
12
|
-
|
|
13
|
-
def init: (?bool force_download) -> void
|
|
14
|
-
|
|
15
|
-
def open: () -> void
|
|
16
|
-
|
|
17
|
-
def close: () -> void
|
|
18
|
-
|
|
19
|
-
private def download_executable: () -> void
|
|
20
|
-
|
|
21
|
-
private def download_model: () -> void
|
|
22
|
-
|
|
23
|
-
private def download_file: (String url, String destination) -> void
|
|
24
|
-
|
|
25
|
-
def prompt: (String input) -> String
|
|
26
|
-
end
|
|
27
|
-
end
|