nano-bots 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73bb77d7db0d570b10ac2b267c6fc2c550c19933bd68c96bc56c926ff4df013d
4
- data.tar.gz: 4a945487832c8deef8513d6cb16c518b078e075b50435b4e5ae898a80090dd2b
3
+ metadata.gz: 6d496441fb846ecb3deb69ecfaee74d929ee7cfab8d8f7ad779da9ebc84dd970
4
+ data.tar.gz: 6d96a3b14b471f8b5f3e616c036a95e4fba9a36f1f608d0eddf263b4401a5b3d
5
5
  SHA512:
6
- metadata.gz: 777872e14cb28d72597b4734f1ccd0ecf57b3613b5a4da451662120bb6e2eb7ce8530e86c009b5f3cbff1e8ae10c5e15016551afe75f0cfd773ad0df44f657a0
7
- data.tar.gz: 4e7dcf5b6087c2387660e379ae2c4c9dc5cd247a146f25fc4a97b472a9467e5ca8d7fab7e0629c2f5698a4851a4fe73eca5c248cbfb3ac18ccbb26678ba72547
6
+ metadata.gz: 9c04eec85e715e87030ae6b9e3f070ee760392b78719747215f12adf1ac0368452a4f9c6381a8382246ecc11b50830ede50a879c191212006b3593bf3e2bd92e
7
+ data.tar.gz: '08de387499a77c6e955d90d5f53f02a8fd5197b30df520952d9abbaa9731e324b3e73ccaae8f0c8da29325955319bb727a8790a68103273d12dd0953e7e64e5e'
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nano-bots (0.0.7)
4
+ nano-bots (0.0.8)
5
5
  babosa (~> 2.0)
6
6
  dotenv (~> 2.8, >= 2.8.1)
7
- faraday (~> 2.7, >= 2.7.4)
7
+ faraday (~> 2.7, >= 2.7.5)
8
8
  pry (~> 0.14.2)
9
9
  rainbow (~> 3.1, >= 3.1.1)
10
10
  ruby-openai (~> 4.0)
@@ -18,7 +18,7 @@ GEM
18
18
  coderay (1.1.3)
19
19
  diff-lcs (1.5.0)
20
20
  dotenv (2.8.1)
21
- faraday (2.7.4)
21
+ faraday (2.7.5)
22
22
  faraday-net_http (>= 2.0, < 3.1)
23
23
  ruby2_keywords (>= 0.0.4)
24
24
  faraday-multipart (1.0.4)
data/README.md CHANGED
@@ -23,13 +23,13 @@ https://user-images.githubusercontent.com/113217272/238141567-c58a240c-7b67-4b3b
23
23
  For a system usage:
24
24
 
25
25
  ```sh
26
- gem install nano-bots -v 0.0.7
26
+ gem install nano-bots -v 0.0.8
27
27
  ```
28
28
 
29
29
  To use it in a project, add it to your `Gemfile`:
30
30
 
31
31
  ```ruby
32
- gem 'nano-bots', '~> 0.0.7'
32
+ gem 'nano-bots', '~> 0.0.8'
33
33
  ```
34
34
 
35
35
  ```sh
@@ -76,7 +76,7 @@ version: '3.7'
76
76
  services:
77
77
  nano-bots:
78
78
  image: ruby:3.2.2-slim-bullseye
79
- command: sh -c "gem install nano-bots -v 0.0.7 && bash"
79
+ command: sh -c "gem install nano-bots -v 0.0.8 && bash"
80
80
  environment:
81
81
  OPENAI_API_ADDRESS: https://api.openai.com
82
82
  OPENAI_API_ACCESS_TOKEN: your-token
@@ -193,13 +193,40 @@ NanoBot.repl(cartridge: 'cartridge.yml') # Starts a new REPL.
193
193
 
194
194
  bot = NanoBot.new(cartridge: 'cartridge.yml')
195
195
 
196
+ bot = NanoBot.new(
197
+ cartridge: YAML.safe_load(File.read('cartridge.yml'), permitted_classes: [Symbol])
198
+ )
199
+
200
+ bot = NanoBot.new(
201
+ cartridge: { ... } # Parsed Cartridge Hash
202
+ )
203
+
196
204
  bot.eval('Hello')
197
205
 
206
+ bot.eval('Hello', as: 'eval')
207
+ bot.eval('Hello', as: 'repl')
208
+
209
+ # When stream is enabled and available:
210
+ bot.eval('Hi!') do |content, fragment, finished|
211
+ print fragment unless fragment.nil?
212
+ end
213
+
198
214
  bot.repl # Starts a new REPL.
199
215
 
200
216
  NanoBot.repl(cartridge: 'cartridge.yml', state: '6ea6c43c42a1c076b1e3c36fa349ac2c')
201
217
 
202
218
  bot = NanoBot.new(cartridge: 'cartridge.yml', state: '6ea6c43c42a1c076b1e3c36fa349ac2c')
219
+
220
+ bot.prompt # => "🤖\u001b[34m> \u001b[0m"
221
+
222
+ bot.boot
223
+
224
+ bot.boot(as: 'eval')
225
+ bot.boot(as: 'repl')
226
+
227
+ bot.boot do |content, fragment, finished|
228
+ print fragment unless fragment.nil?
229
+ end
203
230
  ```
204
231
 
205
232
  ## Cartridges
@@ -209,9 +236,12 @@ Here's what a Nano Bot Cartridge looks like:
209
236
  ```yaml
210
237
  ---
211
238
  meta:
239
+ symbol: 🤖
212
240
  name: Nano Bot Name
213
241
  author: Your Name
214
- version: 0.0.1
242
+ version: 1.0.0
243
+ license: CC0-1.0
244
+ description: A helpful assistant.
215
245
 
216
246
  behaviors:
217
247
  interaction:
@@ -227,18 +257,22 @@ provider:
227
257
  user-identifier: ENV/OPENAI_API_USER_IDENTIFIER
228
258
  ```
229
259
 
230
- Check the Nano Bots specification to learn more about [how to build cartridges](https://icebaker.github.io/nano-bots/#/README?id=cartridges).
260
+ Check the Nano Bots specification to learn more about [how to build cartridges](https://spec.nbots.io/#/README?id=cartridges).
261
+
262
+ Try the [Nano Bots Clinic (Live Editor)](https://clinic.nbots.io) to learn about creating Cartridges.
231
263
 
232
264
  ## Providers
233
265
 
234
266
  Currently supported providers:
235
267
 
236
- - [ ] [Vicuna](https://github.com/lm-sys/FastChat)
268
+ - [x] [FastChat (Vicuna)](https://github.com/lm-sys/FastChat)
237
269
  - [x] [Open AI](https://platform.openai.com/docs/api-reference)
238
270
  - [ ] [Google PaLM](https://developers.generativeai.google/)
239
271
  - [ ] [Alpaca](https://github.com/tatsu-lab/stanford_alpaca)
240
272
  - [ ] [LLaMA](https://github.com/facebookresearch/llama)
241
273
 
274
+ Although only OpenAI has been officially tested, some of the open-source providers offer APIs that are compatible with OpenAI, such as [FastChat](https://github.com/lm-sys/FastChat#openai-compatible-restful-apis--sdk). Therefore, it is highly probable that they will work just fine.
275
+
242
276
  ## Development
243
277
 
244
278
  ```bash
@@ -254,5 +288,5 @@ gem build nano-bots.gemspec
254
288
 
255
289
  gem signin
256
290
 
257
- gem push nano-bots-0.0.7.gem
291
+ gem push nano-bots-0.0.8.gem
258
292
  ```
@@ -31,10 +31,24 @@ module NanoBot
31
31
  @session.state
32
32
  end
33
33
 
34
- def eval(input, &block)
34
+ def boot(as: 'eval', &block)
35
35
  @stream.callback = block if block && @stream.is_a?(Components::Stream)
36
36
 
37
- Interfaces::Eval.evaluate(input, @cartridge, @session)
37
+ Interfaces::REPL.boot(@cartridge, @session, as:)
38
+
39
+ return unless @stream.is_a?(Components::Stream)
40
+
41
+ @stream.finish
42
+ end
43
+
44
+ def prompt
45
+ Interfaces::REPL.prompt(@cartridge)
46
+ end
47
+
48
+ def eval(input, as: 'eval', &block)
49
+ @stream.callback = block if block && @stream.is_a?(Components::Stream)
50
+
51
+ Interfaces::Eval.evaluate(input, @cartridge, @session, as)
38
52
 
39
53
  return unless @stream.is_a?(Components::Stream)
40
54
 
@@ -10,13 +10,13 @@ module NanoBot
10
10
  module Controllers
11
11
  module Interfaces
12
12
  module Eval
13
- def self.evaluate(input, cartridge, session)
14
- prefix = Logic::Cartridge::Affixes.get(cartridge, :eval, :output, :prefix)
15
- suffix = Logic::Cartridge::Affixes.get(cartridge, :eval, :output, :suffix)
13
+ def self.evaluate(input, cartridge, session, mode)
14
+ prefix = Logic::Cartridge::Affixes.get(cartridge, mode.to_sym, :output, :prefix)
15
+ suffix = Logic::Cartridge::Affixes.get(cartridge, mode.to_sym, :output, :suffix)
16
16
 
17
17
  session.print(prefix) unless prefix.nil?
18
18
 
19
- session.evaluate_and_print(input, mode: 'eval')
19
+ session.evaluate_and_print(input, mode:)
20
20
 
21
21
  session.print(suffix) unless suffix.nil?
22
22
  end
@@ -10,18 +10,26 @@ module NanoBot
10
10
  module Controllers
11
11
  module Interfaces
12
12
  module REPL
13
+ def self.boot(cartridge, session, prefix = nil, suffix = nil, as: 'repl')
14
+ return unless Logic::Helpers::Hash.fetch(cartridge, %i[behaviors boot instruction])
15
+
16
+ prefix ||= Logic::Cartridge::Affixes.get(cartridge, as.to_sym, :output, :prefix)
17
+ suffix ||= Logic::Cartridge::Affixes.get(cartridge, as.to_sym, :output, :suffix)
18
+
19
+ session.print(prefix) unless prefix.nil?
20
+ session.boot(mode: as)
21
+ session.print(suffix) unless suffix.nil?
22
+ end
23
+
13
24
  def self.start(cartridge, session)
14
25
  prefix = Logic::Cartridge::Affixes.get(cartridge, :repl, :output, :prefix)
15
26
  suffix = Logic::Cartridge::Affixes.get(cartridge, :repl, :output, :suffix)
16
27
 
17
- if Logic::Helpers::Hash.fetch(cartridge, %i[behaviors boot instruction])
18
- session.print(prefix) unless prefix.nil?
19
- session.boot(mode: 'repl')
20
- session.print(suffix) unless suffix.nil?
21
- session.print("\n")
22
- end
28
+ boot(cartridge, session, prefix, suffix)
29
+
30
+ session.print("\n") if Logic::Helpers::Hash.fetch(cartridge, %i[behaviors boot instruction])
23
31
 
24
- prompt = build_prompt(Logic::Helpers::Hash.fetch(cartridge, %i[interfaces repl prompt]))
32
+ prompt = self.prompt(cartridge)
25
33
 
26
34
  Pry.config.prompt = Pry::Prompt.new(
27
35
  'REPL',
@@ -40,7 +48,8 @@ module NanoBot
40
48
  Pry.start
41
49
  end
42
50
 
43
- def self.build_prompt(prompt)
51
+ def self.prompt(cartridge)
52
+ prompt = Logic::Helpers::Hash.fetch(cartridge, %i[interfaces repl prompt])
44
53
  result = ''
45
54
 
46
55
  if prompt.is_a?(Array)
@@ -61,6 +61,8 @@ module NanoBot
61
61
 
62
62
  @state[:history] << {
63
63
  who: 'user',
64
+ mode: mode.to_s,
65
+ input: message,
64
66
  message: Components::Adapter.apply(
65
67
  :input, Logic::Cartridge::Interaction.input(@cartridge, mode.to_sym, message)
66
68
  )
@@ -72,6 +74,9 @@ module NanoBot
72
74
  end
73
75
 
74
76
  def process(input, mode:)
77
+ prefix = Logic::Cartridge::Affixes.get(@cartridge, mode.to_sym, :output, :prefix)
78
+ suffix = Logic::Cartridge::Affixes.get(@cartridge, mode.to_sym, :output, :suffix)
79
+
75
80
  interface = Logic::Helpers::Hash.fetch(@cartridge, [:interfaces, mode.to_sym]) || {}
76
81
 
77
82
  streaming = Logic::Cartridge::Streaming.enabled?(@cartridge, mode.to_sym)
@@ -85,7 +90,7 @@ module NanoBot
85
90
  updated_at = Time.now
86
91
 
87
92
  if finished
88
- @state[:history] << Marshal.load(Marshal.dump(output))
93
+ event = Marshal.load(Marshal.dump(output))
89
94
 
90
95
  output = Logic::Cartridge::Interaction.output(
91
96
  @cartridge, mode.to_sym, output, streaming, finished
@@ -93,6 +98,11 @@ module NanoBot
93
98
 
94
99
  output[:message] = Components::Adapter.apply(:output, output[:message])
95
100
 
101
+ event[:mode] = mode.to_s
102
+ event[:output] = "#{prefix}#{output[:message]}#{suffix}"
103
+
104
+ @state[:history] << event
105
+
96
106
  self.print(output[:message]) unless streaming
97
107
 
98
108
  ready = true
@@ -3,7 +3,7 @@ version: '3.7'
3
3
  services:
4
4
  nano-bots:
5
5
  image: ruby:3.2.2-slim-bullseye
6
- command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev lua5.4-dev && gem install nano-bots -v 0.0.7 && bash"
6
+ command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev lua5.4-dev && gem install nano-bots -v 0.0.8 && bash"
7
7
  environment:
8
8
  OPENAI_API_ADDRESS: https://api.openai.com
9
9
  OPENAI_API_ACCESS_TOKEN: your-token
data/nano-bots.gemspec CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.add_dependency 'babosa', '~> 2.0'
35
35
  spec.add_dependency 'dotenv', '~> 2.8', '>= 2.8.1'
36
- spec.add_dependency 'faraday', '~> 2.7', '>= 2.7.4'
36
+ spec.add_dependency 'faraday', '~> 2.7', '>= 2.7.5'
37
37
  spec.add_dependency 'pry', '~> 0.14.2'
38
38
  spec.add_dependency 'rainbow', '~> 3.1', '>= 3.1.1'
39
39
  spec.add_dependency 'ruby-openai', '~> 4.0'
data/static/gem.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  module NanoBot
4
4
  GEM = {
5
5
  name: 'nano-bots',
6
- version: '0.0.7',
6
+ version: '0.0.8',
7
7
  author: 'icebaker',
8
8
  summary: 'Ruby Implementation of Nano Bots: small, AI-powered bots',
9
9
  description: 'Ruby Implementation of Nano Bots: small, AI-powered bots easily shared as a single file, designed to support multiple providers such as Vicuna, OpenAI ChatGPT, Google PaLM, Alpaca, and LLaMA.',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nano-bots
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - icebaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-21 00:00:00.000000000 Z
11
+ date: 2023-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: babosa
@@ -53,7 +53,7 @@ dependencies:
53
53
  version: '2.7'
54
54
  - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: 2.7.4
56
+ version: 2.7.5
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -63,7 +63,7 @@ dependencies:
63
63
  version: '2.7'
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
- version: 2.7.4
66
+ version: 2.7.5
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: pry
69
69
  requirement: !ruby/object:Gem::Requirement