gpt4all 0.0.3 → 0.0.5
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/CHANGELOG.md +8 -5
- data/Gemfile +2 -2
- data/Gemfile.lock +12 -22
- data/lib/gpt4all/conversational_ai.rb +64 -24
- data/lib/gpt4all/version.rb +1 -1
- metadata +3 -5
- data/model.bin +0 -1
- 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: 63ef21af70c63628f51e23eeee9a4958227a5789c43323c792676eef52289300
|
|
4
|
+
data.tar.gz: 19271183c40dffbae53dc3e171510ed787edbebdbb33ae432c92f9b0edcc0972
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8c929aa6408d5f6668ee0c6513968e64e0ee2e7ec4f71f87a5fe24de916a98300904a68837d2b8aaf2970754dfdd3a21f241e98ebde3225af31a64c93044d1a5
|
|
7
|
+
data.tar.gz: 2ef1a65e439ea312d01b7bb0445a1a0aed89981b0b7a6546ab3914f6bc8294cad196cb1d47f7036e4cfb32d6e8bde27a3067862e7eb941c3884b3e905a80fc52
|
data/CHANGELOG.md
CHANGED
|
@@ -4,12 +4,15 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
-
## [Unreleased]
|
|
8
7
|
|
|
9
|
-
## [0.0.
|
|
8
|
+
## [0.0.5] - 2023-04-18
|
|
10
9
|
|
|
11
|
-
-
|
|
10
|
+
- [Fix error "private method gets called on Process::Waiter"]() by [Francis](https://github.com/francis)
|
|
11
|
+
- Fix write_chunks_to_file
|
|
12
|
+
|
|
13
|
+
## [0.0.4] - 2023-04-11
|
|
14
|
+
|
|
15
|
+
- check md5 when downloading model file
|
|
16
|
+
- CI is working for multiple ruby version
|
|
12
17
|
|
|
13
|
-
## [0.0.2] - 2023-04-07
|
|
14
18
|
|
|
15
|
-
- updated changelog link
|
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.5)
|
|
5
5
|
faraday (~> 2.7)
|
|
6
6
|
os (~> 1.1)
|
|
7
7
|
tty-progressbar (~> 0.18.2)
|
|
@@ -17,9 +17,11 @@ 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
|
|
22
|
+
debug (1.7.2)
|
|
23
|
+
irb (>= 1.5.0)
|
|
24
|
+
reline (>= 0.3.1)
|
|
23
25
|
diff-lcs (1.5.0)
|
|
24
26
|
dotenv (2.8.1)
|
|
25
27
|
faraday (2.7.4)
|
|
@@ -27,20 +29,11 @@ GEM
|
|
|
27
29
|
ruby2_keywords (>= 0.0.4)
|
|
28
30
|
faraday-net_http (3.0.2)
|
|
29
31
|
hashdiff (1.0.1)
|
|
30
|
-
|
|
32
|
+
io-console (0.6.0)
|
|
33
|
+
irb (1.6.4)
|
|
34
|
+
reline (>= 0.3.0)
|
|
31
35
|
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
36
|
os (1.1.4)
|
|
40
|
-
overcommit (0.60.0)
|
|
41
|
-
childprocess (>= 0.6.3, < 5)
|
|
42
|
-
iniparse (~> 1.4)
|
|
43
|
-
rexml (~> 3.2)
|
|
44
37
|
parallel (1.22.1)
|
|
45
38
|
parser (3.2.2.0)
|
|
46
39
|
ast (~> 2.4.1)
|
|
@@ -48,6 +41,8 @@ GEM
|
|
|
48
41
|
rainbow (3.1.1)
|
|
49
42
|
rake (13.0.6)
|
|
50
43
|
regexp_parser (2.7.0)
|
|
44
|
+
reline (0.3.3)
|
|
45
|
+
io-console (~> 0.5)
|
|
51
46
|
rexml (3.2.5)
|
|
52
47
|
rspec (3.12.0)
|
|
53
48
|
rspec-core (~> 3.12.0)
|
|
@@ -83,10 +78,8 @@ GEM
|
|
|
83
78
|
rubocop (~> 1.44)
|
|
84
79
|
ruby-progressbar (1.13.0)
|
|
85
80
|
ruby2_keywords (0.0.5)
|
|
86
|
-
rubyzip (2.3.2)
|
|
87
81
|
strings-ansi (0.2.0)
|
|
88
82
|
thor (1.2.1)
|
|
89
|
-
tomlrb (2.0.3)
|
|
90
83
|
tty-cursor (0.7.1)
|
|
91
84
|
tty-progressbar (0.18.2)
|
|
92
85
|
strings-ansi (~> 0.2)
|
|
@@ -99,15 +92,13 @@ GEM
|
|
|
99
92
|
addressable (>= 2.8.0)
|
|
100
93
|
crack (>= 0.3.2)
|
|
101
94
|
hashdiff (>= 0.4.0, < 2.0.0)
|
|
102
|
-
with_env (1.1.0)
|
|
103
|
-
xml-simple (1.1.9)
|
|
104
|
-
rexml
|
|
105
95
|
|
|
106
96
|
PLATFORMS
|
|
107
97
|
aarch64-linux
|
|
108
98
|
aarch64-linux-musl
|
|
109
99
|
arm64-darwin-21
|
|
110
100
|
arm64-darwin-22
|
|
101
|
+
x86_64-darwin-21
|
|
111
102
|
x86_64-linux
|
|
112
103
|
x86_64-linux-musl
|
|
113
104
|
|
|
@@ -115,10 +106,9 @@ DEPENDENCIES
|
|
|
115
106
|
brakeman
|
|
116
107
|
bundler-audit
|
|
117
108
|
byebug
|
|
109
|
+
debug
|
|
118
110
|
dotenv
|
|
119
111
|
gpt4all!
|
|
120
|
-
license_finder
|
|
121
|
-
overcommit
|
|
122
112
|
rake (~> 13.0)
|
|
123
113
|
rspec (~> 3.0)
|
|
124
114
|
rubocop (~> 1.21)
|
|
@@ -128,4 +118,4 @@ DEPENDENCIES
|
|
|
128
118
|
webmock
|
|
129
119
|
|
|
130
120
|
BUNDLED WITH
|
|
131
|
-
2.4.
|
|
121
|
+
2.4.7
|
|
@@ -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'
|
|
@@ -61,11 +62,37 @@ module Gpt4all
|
|
|
61
62
|
def stop_bot
|
|
62
63
|
return unless bot
|
|
63
64
|
|
|
64
|
-
bot.
|
|
65
|
+
bot[0].close
|
|
66
|
+
bot[1].close
|
|
67
|
+
bot[2].exit
|
|
65
68
|
@bot = nil
|
|
66
69
|
@bot_pid = nil
|
|
67
70
|
end
|
|
68
71
|
|
|
72
|
+
def restart_bot
|
|
73
|
+
stop_bot
|
|
74
|
+
start_bot
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def prompt(input)
|
|
78
|
+
ensure_bot_is_ready
|
|
79
|
+
|
|
80
|
+
begin
|
|
81
|
+
bot.first.puts(input)
|
|
82
|
+
response = read_from_bot
|
|
83
|
+
rescue StandardError => e
|
|
84
|
+
puts "Error during prompt: #{e.message}"
|
|
85
|
+
restart_bot
|
|
86
|
+
response = prompt(input)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
response
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
attr_reader :bot
|
|
95
|
+
|
|
69
96
|
def download_executable
|
|
70
97
|
FileUtils.mkdir_p(File.dirname(executable_path))
|
|
71
98
|
download_file(determine_upstream_url, executable_path)
|
|
@@ -87,8 +114,9 @@ module Gpt4all
|
|
|
87
114
|
|
|
88
115
|
def download_model
|
|
89
116
|
model_url = "https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/#{model}.bin"
|
|
90
|
-
|
|
91
117
|
download_file(model_url, model_path)
|
|
118
|
+
download_md5_file
|
|
119
|
+
verify_md5_signature
|
|
92
120
|
|
|
93
121
|
puts "File downloaded successfully to #{model_path}"
|
|
94
122
|
end
|
|
@@ -131,7 +159,7 @@ module Gpt4all
|
|
|
131
159
|
def write_chunks_to_file(response, destination, progress_bar)
|
|
132
160
|
File.open(destination, 'wb') do |file|
|
|
133
161
|
downloaded_size = 0
|
|
134
|
-
response.body.
|
|
162
|
+
response.body.each(2048) do |chunk|
|
|
135
163
|
progress_bar.advance(chunk.bytesize)
|
|
136
164
|
file.write(chunk)
|
|
137
165
|
downloaded_size += chunk.bytesize
|
|
@@ -140,36 +168,48 @@ module Gpt4all
|
|
|
140
168
|
end
|
|
141
169
|
end
|
|
142
170
|
|
|
143
|
-
def
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
end
|
|
171
|
+
def download_md5_file
|
|
172
|
+
md5_url = "https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/#{model}.bin.md5"
|
|
173
|
+
md5_path = "#{model_path}.md5"
|
|
174
|
+
download_file(md5_url, md5_path)
|
|
148
175
|
end
|
|
149
176
|
|
|
150
|
-
def
|
|
151
|
-
|
|
177
|
+
def verify_md5_signature
|
|
178
|
+
md5_path = "#{model_path}.md5"
|
|
179
|
+
raise 'MD5 file not found.' unless File.exist?(md5_path)
|
|
152
180
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
181
|
+
expected_md5 = File.read(md5_path).strip
|
|
182
|
+
actual_md5 = Digest::MD5.file(model_path).hexdigest
|
|
183
|
+
raise 'MD5 signature mismatch.' unless expected_md5 == actual_md5
|
|
184
|
+
|
|
185
|
+
puts 'MD5 signature verified successfully.'
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# remove the stop character from end of the output
|
|
189
|
+
def strip_stop(output, stop)
|
|
190
|
+
output[0...output.rindex(stop)]
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def read_from_bot(stop: '>')
|
|
194
|
+
output = ''
|
|
195
|
+
loop do
|
|
196
|
+
new_output = bot[1].read_nonblock(2048)
|
|
197
|
+
output += new_output
|
|
198
|
+
return strip_stop(output, stop) if new_output&.include?(stop)
|
|
199
|
+
|
|
200
|
+
rescue IO::WaitReadable
|
|
201
|
+
bot[1].wait_readable
|
|
202
|
+
retry
|
|
160
203
|
end
|
|
204
|
+
end
|
|
161
205
|
|
|
162
|
-
|
|
206
|
+
def wait_for_bot_ready
|
|
207
|
+
read_from_bot
|
|
163
208
|
end
|
|
164
209
|
|
|
165
210
|
def ensure_bot_is_ready
|
|
166
211
|
raise 'Bot is not initialized.' unless bot
|
|
167
212
|
end
|
|
168
|
-
|
|
169
|
-
def restart_bot
|
|
170
|
-
stop_bot
|
|
171
|
-
start_bot
|
|
172
|
-
end
|
|
173
213
|
end
|
|
174
214
|
# rubocop:enable Metrics/ClassLength
|
|
175
215
|
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.5
|
|
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-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
@@ -71,8 +71,6 @@ files:
|
|
|
71
71
|
- lib/gpt4all.rb
|
|
72
72
|
- lib/gpt4all/conversational_ai.rb
|
|
73
73
|
- lib/gpt4all/version.rb
|
|
74
|
-
- model.bin
|
|
75
|
-
- sig/gpt4all.rbs
|
|
76
74
|
homepage: https://github.com/jaigouk/gpt4all
|
|
77
75
|
licenses:
|
|
78
76
|
- MIT
|
|
@@ -97,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
97
95
|
- !ruby/object:Gem::Version
|
|
98
96
|
version: '0'
|
|
99
97
|
requirements: []
|
|
100
|
-
rubygems_version: 3.
|
|
98
|
+
rubygems_version: 3.4.10
|
|
101
99
|
signing_key:
|
|
102
100
|
specification_version: 4
|
|
103
101
|
summary: gpt4all
|
data/model.bin
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
This is a mock file content
|
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
|