nano-bots 2.5.0 → 3.0.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 +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +17 -15
- data/README.md +39 -22
- data/components/embedding.rb +1 -1
- data/components/providers/openai.rb +2 -2
- data/components/storage.rb +52 -17
- data/controllers/cartridges.rb +25 -17
- data/controllers/instance.rb +2 -5
- data/docker-compose.example.yml +9 -5
- data/logic/cartridge/parser.rb +134 -0
- data/logic/helpers/hash.rb +23 -0
- data/nano-bots.gemspec +2 -1
- data/ports/dsl/nano-bots/cartridges.rb +15 -0
- data/ports/dsl/nano-bots.rb +2 -1
- data/static/gem.rb +2 -2
- metadata +24 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e8c2efff966a76151fb23a83f4c77bc5af780f31898194747c53d8ddd2ff2877
|
|
4
|
+
data.tar.gz: 94642cd59c39f0f9d308e97fe3736bb3d89f529928d3e3896f4c1351a2f10fed
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ff0d2f67a1126a43443cd231184ad3dd02dea9c34178d6aa5da4c49cfdcceb137ab24af7bbaaad83d3e9c61d7019b2ba2950c15b7c1c7d072abc24de8eb8a5a7
|
|
7
|
+
data.tar.gz: 6850151d3af95c232c800e891e4c6ef8ee610030e6f9e45d24c623d497b1d61804f4b709e35b682ad89781fbb5b304d2e9b1048ae0150abaffdec9a0b2084f03
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
nano-bots (
|
|
4
|
+
nano-bots (3.0.0)
|
|
5
5
|
babosa (~> 2.0)
|
|
6
6
|
cohere-ai (~> 1.0, >= 1.0.1)
|
|
7
7
|
concurrent-ruby (~> 1.2, >= 1.2.2)
|
|
8
8
|
dotenv (~> 2.8, >= 2.8.1)
|
|
9
9
|
gemini-ai (~> 3.1, >= 3.1.2)
|
|
10
10
|
maritaca-ai (~> 1.0)
|
|
11
|
-
mistral-ai (~> 1.1)
|
|
11
|
+
mistral-ai (~> 1.1, >= 1.1.1)
|
|
12
12
|
ollama-ai (~> 1.0)
|
|
13
13
|
pry (~> 0.14.2)
|
|
14
14
|
rainbow (~> 3.1, >= 3.1.1)
|
|
15
15
|
rbnacl (~> 7.1, >= 7.1.1)
|
|
16
|
+
redcarpet (~> 3.6)
|
|
16
17
|
ruby-openai (~> 6.3, >= 6.3.1)
|
|
17
18
|
sweet-moon (~> 0.0.7)
|
|
18
19
|
|
|
@@ -23,7 +24,6 @@ GEM
|
|
|
23
24
|
public_suffix (>= 2.0.2, < 6.0)
|
|
24
25
|
ast (2.4.2)
|
|
25
26
|
babosa (2.0.0)
|
|
26
|
-
base64 (0.2.0)
|
|
27
27
|
byebug (11.1.3)
|
|
28
28
|
coderay (1.1.3)
|
|
29
29
|
cohere-ai (1.0.1)
|
|
@@ -32,13 +32,12 @@ GEM
|
|
|
32
32
|
diff-lcs (1.5.0)
|
|
33
33
|
dotenv (2.8.1)
|
|
34
34
|
event_stream_parser (1.0.0)
|
|
35
|
-
faraday (2.
|
|
36
|
-
|
|
37
|
-
faraday-net_http (>= 2.0, < 3.1)
|
|
38
|
-
ruby2_keywords (>= 0.0.4)
|
|
35
|
+
faraday (2.9.0)
|
|
36
|
+
faraday-net_http (>= 2.0, < 3.2)
|
|
39
37
|
faraday-multipart (1.0.4)
|
|
40
38
|
multipart-post (~> 2)
|
|
41
|
-
faraday-net_http (3.0
|
|
39
|
+
faraday-net_http (3.1.0)
|
|
40
|
+
net-http
|
|
42
41
|
ffi (1.16.3)
|
|
43
42
|
gemini-ai (3.1.2)
|
|
44
43
|
event_stream_parser (~> 1.0)
|
|
@@ -59,16 +58,18 @@ GEM
|
|
|
59
58
|
maritaca-ai (1.0.0)
|
|
60
59
|
faraday (~> 2.8, >= 2.8.1)
|
|
61
60
|
method_source (1.0.0)
|
|
62
|
-
mistral-ai (1.1.
|
|
61
|
+
mistral-ai (1.1.1)
|
|
63
62
|
event_stream_parser (~> 1.0)
|
|
64
63
|
faraday (~> 2.8, >= 2.8.1)
|
|
65
64
|
multi_json (1.15.0)
|
|
66
65
|
multipart-post (2.3.0)
|
|
66
|
+
net-http (0.4.1)
|
|
67
|
+
uri
|
|
67
68
|
ollama-ai (1.0.0)
|
|
68
69
|
faraday (~> 2.8)
|
|
69
70
|
os (1.1.4)
|
|
70
71
|
parallel (1.24.0)
|
|
71
|
-
parser (3.3.0.
|
|
72
|
+
parser (3.3.0.2)
|
|
72
73
|
ast (~> 2.4.1)
|
|
73
74
|
racc
|
|
74
75
|
pry (0.14.2)
|
|
@@ -82,7 +83,8 @@ GEM
|
|
|
82
83
|
rainbow (3.1.1)
|
|
83
84
|
rbnacl (7.1.1)
|
|
84
85
|
ffi
|
|
85
|
-
|
|
86
|
+
redcarpet (3.6.0)
|
|
87
|
+
regexp_parser (2.9.0)
|
|
86
88
|
rexml (3.2.6)
|
|
87
89
|
rspec (3.12.0)
|
|
88
90
|
rspec-core (~> 3.12.0)
|
|
@@ -112,8 +114,8 @@ GEM
|
|
|
112
114
|
parser (>= 3.2.1.0)
|
|
113
115
|
rubocop-capybara (2.20.0)
|
|
114
116
|
rubocop (~> 1.41)
|
|
115
|
-
rubocop-factory_bot (2.25.
|
|
116
|
-
rubocop (~> 1.
|
|
117
|
+
rubocop-factory_bot (2.25.1)
|
|
118
|
+
rubocop (~> 1.41)
|
|
117
119
|
rubocop-rspec (2.26.1)
|
|
118
120
|
rubocop (~> 1.40)
|
|
119
121
|
rubocop-capybara (~> 2.17)
|
|
@@ -123,7 +125,6 @@ GEM
|
|
|
123
125
|
faraday (>= 1)
|
|
124
126
|
faraday-multipart (>= 1)
|
|
125
127
|
ruby-progressbar (1.13.0)
|
|
126
|
-
ruby2_keywords (0.0.5)
|
|
127
128
|
signet (0.18.0)
|
|
128
129
|
addressable (~> 2.8)
|
|
129
130
|
faraday (>= 0.17.5, < 3.a)
|
|
@@ -132,6 +133,7 @@ GEM
|
|
|
132
133
|
sweet-moon (0.0.7)
|
|
133
134
|
ffi (~> 1.15, >= 1.15.5)
|
|
134
135
|
unicode-display_width (2.5.0)
|
|
136
|
+
uri (0.13.0)
|
|
135
137
|
|
|
136
138
|
PLATFORMS
|
|
137
139
|
x86_64-linux
|
|
@@ -141,7 +143,7 @@ DEPENDENCIES
|
|
|
141
143
|
pry-byebug (~> 3.10, >= 3.10.1)
|
|
142
144
|
rspec (~> 3.12)
|
|
143
145
|
rubocop (~> 1.59)
|
|
144
|
-
rubocop-rspec (~> 2.
|
|
146
|
+
rubocop-rspec (~> 2.26, >= 2.26.1)
|
|
145
147
|
|
|
146
148
|
BUNDLED WITH
|
|
147
149
|
2.4.22
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Nano Bots 💎 🤖
|
|
2
2
|
|
|
3
|
-
An implementation of the [Nano Bots](https://spec.nbots.io) specification with support for [Cohere Command](https://cohere.com), [Google Gemini](https://deepmind.google/technologies/gemini), [Maritaca AI MariTalk](https://www.maritaca.ai), [Mistral AI](https://mistral.ai), [Ollama](https://ollama.ai), [OpenAI ChatGPT](https://openai.com/chatgpt), and others.
|
|
3
|
+
An implementation of the [Nano Bots](https://spec.nbots.io) specification with support for [Cohere Command](https://cohere.com), [Google Gemini](https://deepmind.google/technologies/gemini), [Maritaca AI MariTalk](https://www.maritaca.ai), [Mistral AI](https://mistral.ai), [Ollama](https://ollama.ai), [OpenAI ChatGPT](https://openai.com/chatgpt), and others, with support for calling tools (functions).
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ https://user-images.githubusercontent.com/113217272/238141567-c58a240c-7b67-4b3b
|
|
|
9
9
|
## TL;DR and Quick Start
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
gem install nano-bots -v
|
|
12
|
+
gem install nano-bots -v 3.0.0
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```bash
|
|
@@ -34,13 +34,22 @@ well. How can I assist you?
|
|
|
34
34
|
---
|
|
35
35
|
meta:
|
|
36
36
|
symbol: 🤖
|
|
37
|
-
name:
|
|
37
|
+
name: Nano Bot Name
|
|
38
|
+
author: Your Name
|
|
39
|
+
version: 1.0.0
|
|
40
|
+
license: CC0-1.0
|
|
41
|
+
description: A helpful assistant.
|
|
42
|
+
|
|
43
|
+
behaviors:
|
|
44
|
+
interaction:
|
|
45
|
+
directive: You are a helpful assistant.
|
|
38
46
|
|
|
39
47
|
provider:
|
|
40
48
|
id: openai
|
|
41
49
|
credentials:
|
|
42
50
|
access-token: ENV/OPENAI_API_KEY
|
|
43
51
|
settings:
|
|
52
|
+
user: ENV/NANO_BOTS_END_USER
|
|
44
53
|
model: gpt-4-1106-preview
|
|
45
54
|
```
|
|
46
55
|
|
|
@@ -50,7 +59,7 @@ nb gpt.yml - eval "hi"
|
|
|
50
59
|
```
|
|
51
60
|
|
|
52
61
|
```ruby
|
|
53
|
-
gem 'nano-bots', '~>
|
|
62
|
+
gem 'nano-bots', '~> 3.0.0'
|
|
54
63
|
```
|
|
55
64
|
|
|
56
65
|
```ruby
|
|
@@ -241,13 +250,13 @@ end
|
|
|
241
250
|
To install the CLI on your system:
|
|
242
251
|
|
|
243
252
|
```sh
|
|
244
|
-
gem install nano-bots -v
|
|
253
|
+
gem install nano-bots -v 3.0.0
|
|
245
254
|
```
|
|
246
255
|
|
|
247
256
|
To use it in a Ruby project as a library, add to your `Gemfile`:
|
|
248
257
|
|
|
249
258
|
```ruby
|
|
250
|
-
gem 'nano-bots', '~>
|
|
259
|
+
gem 'nano-bots', '~> 3.0.0'
|
|
251
260
|
```
|
|
252
261
|
|
|
253
262
|
```sh
|
|
@@ -260,8 +269,8 @@ For credentials and configurations, relevant environment variables can be set in
|
|
|
260
269
|
export NANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE
|
|
261
270
|
export NANO_BOTS_END_USER=your-user
|
|
262
271
|
|
|
263
|
-
# export
|
|
264
|
-
# export
|
|
272
|
+
# export NANO_BOTS_STATE_PATH=/home/user/.local/state/nano-bots
|
|
273
|
+
# export NANO_BOTS_CARTRIDGES_PATH=/home/user/.local/share/nano-bots/cartridges
|
|
265
274
|
```
|
|
266
275
|
|
|
267
276
|
Alternatively, if your current directory has a `.env` file with the environment variables, they will be automatically loaded:
|
|
@@ -270,8 +279,8 @@ Alternatively, if your current directory has a `.env` file with the environment
|
|
|
270
279
|
NANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE
|
|
271
280
|
NANO_BOTS_END_USER=your-user
|
|
272
281
|
|
|
273
|
-
#
|
|
274
|
-
#
|
|
282
|
+
# NANO_BOTS_STATE_PATH=/home/user/.local/state/nano-bots
|
|
283
|
+
# NANO_BOTS_CARTRIDGES_PATH=/home/user/.local/share/nano-bots/cartridges
|
|
275
284
|
```
|
|
276
285
|
|
|
277
286
|
### Cohere Command
|
|
@@ -954,7 +963,7 @@ cd ruby-nano-bots
|
|
|
954
963
|
cp docker-compose.example.yml docker-compose.yml
|
|
955
964
|
```
|
|
956
965
|
|
|
957
|
-
Set your provider credentials and choose your desired
|
|
966
|
+
Set your provider credentials and choose your desired path for the cartridges files:
|
|
958
967
|
|
|
959
968
|
### Cohere Command Container
|
|
960
969
|
|
|
@@ -963,7 +972,7 @@ Set your provider credentials and choose your desired directory for the cartridg
|
|
|
963
972
|
services:
|
|
964
973
|
nano-bots:
|
|
965
974
|
image: ruby:3.2.2-slim-bookworm
|
|
966
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
975
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
967
976
|
environment:
|
|
968
977
|
COHERE_API_KEY: your-api-key
|
|
969
978
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
@@ -980,7 +989,7 @@ services:
|
|
|
980
989
|
services:
|
|
981
990
|
nano-bots:
|
|
982
991
|
image: ruby:3.2.2-slim-bookworm
|
|
983
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
992
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
984
993
|
environment:
|
|
985
994
|
MARITACA_API_KEY: your-api-key
|
|
986
995
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
@@ -997,7 +1006,7 @@ services:
|
|
|
997
1006
|
services:
|
|
998
1007
|
nano-bots:
|
|
999
1008
|
image: ruby:3.2.2-slim-bookworm
|
|
1000
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
1009
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
1001
1010
|
environment:
|
|
1002
1011
|
MISTRAL_API_KEY: your-api-key
|
|
1003
1012
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
@@ -1009,21 +1018,23 @@ services:
|
|
|
1009
1018
|
|
|
1010
1019
|
### Ollama Container
|
|
1011
1020
|
|
|
1012
|
-
Remember that your `localhost` is inaccessible from inside Docker. You need to either establish [inter-container networking](https://docs.docker.com/compose/networking/)
|
|
1021
|
+
Remember that your `localhost` is by default inaccessible from inside Docker. You need to either establish [inter-container networking](https://docs.docker.com/compose/networking/), use the [host's address](https://docs.docker.com/desktop/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host), or use the [host network](https://docs.docker.com/network/network-tutorial-host/), depending on where the Ollama server is running and your preferences.
|
|
1013
1022
|
|
|
1014
1023
|
```yaml
|
|
1015
1024
|
---
|
|
1016
1025
|
services:
|
|
1017
1026
|
nano-bots:
|
|
1018
1027
|
image: ruby:3.2.2-slim-bookworm
|
|
1019
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
1028
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
1020
1029
|
environment:
|
|
1021
|
-
OLLAMA_API_ADDRESS: http://
|
|
1030
|
+
OLLAMA_API_ADDRESS: http://localhost:11434
|
|
1022
1031
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
1023
1032
|
NANO_BOTS_END_USER: your-user
|
|
1024
1033
|
volumes:
|
|
1025
1034
|
- ./your-cartridges:/root/.local/share/nano-bots/cartridges
|
|
1026
1035
|
- ./your-state-path:/root/.local/state/nano-bots
|
|
1036
|
+
# If you are running the Ollama server on your localhost:
|
|
1037
|
+
network_mode: host # WARNING: Be careful, this may be a security risk.
|
|
1027
1038
|
```
|
|
1028
1039
|
|
|
1029
1040
|
### OpenAI ChatGPT Container
|
|
@@ -1033,7 +1044,7 @@ services:
|
|
|
1033
1044
|
services:
|
|
1034
1045
|
nano-bots:
|
|
1035
1046
|
image: ruby:3.2.2-slim-bookworm
|
|
1036
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
1047
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
1037
1048
|
environment:
|
|
1038
1049
|
OPENAI_API_KEY: your-access-token
|
|
1039
1050
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
@@ -1052,7 +1063,7 @@ services:
|
|
|
1052
1063
|
services:
|
|
1053
1064
|
nano-bots:
|
|
1054
1065
|
image: ruby:3.2.2-slim-bookworm
|
|
1055
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
1066
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
1056
1067
|
environment:
|
|
1057
1068
|
GOOGLE_API_KEY: your-api-key
|
|
1058
1069
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
@@ -1069,7 +1080,7 @@ services:
|
|
|
1069
1080
|
services:
|
|
1070
1081
|
nano-bots:
|
|
1071
1082
|
image: ruby:3.2.2-slim-bookworm
|
|
1072
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
1083
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
1073
1084
|
environment:
|
|
1074
1085
|
GOOGLE_CREDENTIALS_FILE_PATH: /root/.config/google-credentials.json
|
|
1075
1086
|
GOOGLE_REGION: us-east4
|
|
@@ -1088,7 +1099,7 @@ services:
|
|
|
1088
1099
|
services:
|
|
1089
1100
|
nano-bots:
|
|
1090
1101
|
image: ruby:3.2.2-slim-bookworm
|
|
1091
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
1102
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
1092
1103
|
environment:
|
|
1093
1104
|
GOOGLE_REGION: us-east4
|
|
1094
1105
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
@@ -1137,6 +1148,12 @@ bundle exec ruby spec/tasks/run-model.rb spec/data/cartridges/models/openai/gpt-
|
|
|
1137
1148
|
bundle exec ruby spec/tasks/run-model.rb spec/data/cartridges/models/openai/gpt-4-turbo.yml stream
|
|
1138
1149
|
```
|
|
1139
1150
|
|
|
1151
|
+
If you face issues upgrading gem versions:
|
|
1152
|
+
|
|
1153
|
+
```sh
|
|
1154
|
+
bundle install --full-index
|
|
1155
|
+
```
|
|
1156
|
+
|
|
1140
1157
|
### Publish to RubyGems
|
|
1141
1158
|
|
|
1142
1159
|
```bash
|
|
@@ -1144,5 +1161,5 @@ gem build nano-bots.gemspec
|
|
|
1144
1161
|
|
|
1145
1162
|
gem signin
|
|
1146
1163
|
|
|
1147
|
-
gem push nano-bots-
|
|
1164
|
+
gem push nano-bots-3.0.0.gem
|
|
1148
1165
|
```
|
data/components/embedding.rb
CHANGED
|
@@ -45,7 +45,7 @@ module NanoBot
|
|
|
45
45
|
def self.clojure(source:, parameters:, values:, safety:)
|
|
46
46
|
ensure_safety!(safety)
|
|
47
47
|
|
|
48
|
-
raise '
|
|
48
|
+
raise 'Sandboxed Clojure not supported.' if safety[:sandboxed]
|
|
49
49
|
|
|
50
50
|
raise 'invalid Clojure parameter name' if parameters.include?('injected-parameters')
|
|
51
51
|
|
|
@@ -140,7 +140,7 @@ module NanoBot
|
|
|
140
140
|
begin
|
|
141
141
|
@client.chat(parameters: Logic::OpenAI::Tokens.apply_policies!(cartridge, payload))
|
|
142
142
|
rescue StandardError => e
|
|
143
|
-
raise e.class, e.response[:body] if e.response && e.response[:body]
|
|
143
|
+
raise e.class, e.response[:body] if e.respond_to?(:response) && e.response && e.response[:body]
|
|
144
144
|
|
|
145
145
|
raise e
|
|
146
146
|
end
|
|
@@ -148,7 +148,7 @@ module NanoBot
|
|
|
148
148
|
begin
|
|
149
149
|
result = @client.chat(parameters: Logic::OpenAI::Tokens.apply_policies!(cartridge, payload))
|
|
150
150
|
rescue StandardError => e
|
|
151
|
-
raise e.class, e.response[:body] if e.response && e.response[:body]
|
|
151
|
+
raise e.class, e.response[:body] if e.respond_to?(:response) && e.response && e.response[:body]
|
|
152
152
|
|
|
153
153
|
raise e
|
|
154
154
|
end
|
data/components/storage.rb
CHANGED
|
@@ -8,6 +8,8 @@ require_relative 'crypto'
|
|
|
8
8
|
module NanoBot
|
|
9
9
|
module Components
|
|
10
10
|
class Storage
|
|
11
|
+
EXTENSIONS = %w[yml yaml markdown mdown mkdn md].freeze
|
|
12
|
+
|
|
11
13
|
def self.end_user(cartridge, environment)
|
|
12
14
|
user = ENV.fetch('NANO_BOTS_END_USER', nil)
|
|
13
15
|
|
|
@@ -35,7 +37,9 @@ module NanoBot
|
|
|
35
37
|
|
|
36
38
|
def self.build_path_and_ensure_state_file!(key, cartridge, environment: {})
|
|
37
39
|
path = [
|
|
40
|
+
Logic::Helpers::Hash.fetch(cartridge, %i[state path]),
|
|
38
41
|
Logic::Helpers::Hash.fetch(cartridge, %i[state directory]),
|
|
42
|
+
ENV.fetch('NANO_BOTS_STATE_PATH', nil),
|
|
39
43
|
ENV.fetch('NANO_BOTS_STATE_DIRECTORY', nil)
|
|
40
44
|
].find do |candidate|
|
|
41
45
|
!candidate.nil? && !candidate.empty?
|
|
@@ -64,32 +68,59 @@ module NanoBot
|
|
|
64
68
|
path
|
|
65
69
|
end
|
|
66
70
|
|
|
67
|
-
def self.cartridges_path
|
|
68
|
-
[
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
def self.cartridges_path(components: {})
|
|
72
|
+
components[:directory?] = ->(path) { File.directory?(path) } unless components.key?(:directory?)
|
|
73
|
+
components[:ENV] = ENV unless components.key?(:ENV)
|
|
74
|
+
|
|
75
|
+
default = "#{user_home!(components:).sub(%r{/$}, '')}/.local/share/nano-bots/cartridges"
|
|
76
|
+
|
|
77
|
+
from_environment = [
|
|
78
|
+
components[:ENV].fetch('NANO_BOTS_CARTRIDGES_PATH', nil),
|
|
79
|
+
components[:ENV].fetch('NANO_BOTS_CARTRIDGES_DIRECTORY', nil)
|
|
80
|
+
].compact
|
|
81
|
+
|
|
82
|
+
elected = [
|
|
83
|
+
from_environment.empty? ? nil : from_environment.join(':'),
|
|
84
|
+
default
|
|
85
|
+
].compact.uniq.filter do |path|
|
|
86
|
+
path.split(':').any? { |candidate| components[:directory?].call(candidate) }
|
|
87
|
+
end.compact.first
|
|
88
|
+
|
|
89
|
+
return default unless elected
|
|
90
|
+
|
|
91
|
+
elected = elected.split(':').filter do |path|
|
|
92
|
+
components[:directory?].call(path)
|
|
93
|
+
end.compact
|
|
94
|
+
|
|
95
|
+
elected.size.positive? ? elected.join(':') : default
|
|
72
96
|
end
|
|
73
97
|
|
|
74
98
|
def self.cartridge_path(path)
|
|
75
99
|
partial = File.join(File.dirname(path), File.basename(path, File.extname(path)))
|
|
76
100
|
|
|
77
|
-
candidates = [
|
|
78
|
-
path,
|
|
79
|
-
"#{partial}.yml",
|
|
80
|
-
"#{partial}.yaml"
|
|
81
|
-
]
|
|
101
|
+
candidates = [path]
|
|
82
102
|
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
EXTENSIONS.each do |extension|
|
|
104
|
+
candidates << "#{partial}.#{extension}"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
directories = [
|
|
108
|
+
ENV.fetch('NANO_BOTS_CARTRIDGES_PATH', nil),
|
|
109
|
+
ENV.fetch('NANO_BOTS_CARTRIDGES_DIRECTORY', nil)
|
|
110
|
+
].compact.map do |directory|
|
|
111
|
+
directory.split(':')
|
|
112
|
+
end.flatten.map { |directory| directory.sub(%r{/$}, '') }
|
|
85
113
|
|
|
114
|
+
directories.each do |directory|
|
|
86
115
|
partial = File.join(File.dirname(partial), File.basename(partial, File.extname(partial)))
|
|
87
116
|
|
|
88
117
|
partial = partial.sub(%r{^\.?/}, '')
|
|
89
118
|
|
|
90
119
|
candidates << "#{directory}/#{partial}"
|
|
91
|
-
|
|
92
|
-
|
|
120
|
+
|
|
121
|
+
EXTENSIONS.each do |extension|
|
|
122
|
+
candidates << "#{directory}/#{partial}.#{extension}"
|
|
123
|
+
end
|
|
93
124
|
end
|
|
94
125
|
|
|
95
126
|
directory = "#{user_home!.sub(%r{/$}, '')}/.local/share/nano-bots/cartridges"
|
|
@@ -99,8 +130,10 @@ module NanoBot
|
|
|
99
130
|
partial = partial.sub(%r{^\.?/}, '')
|
|
100
131
|
|
|
101
132
|
candidates << "#{directory}/#{partial}"
|
|
102
|
-
|
|
103
|
-
|
|
133
|
+
|
|
134
|
+
EXTENSIONS.each do |extension|
|
|
135
|
+
candidates << "#{directory}/#{partial}.#{extension}"
|
|
136
|
+
end
|
|
104
137
|
|
|
105
138
|
candidates = candidates.uniq
|
|
106
139
|
|
|
@@ -109,7 +142,9 @@ module NanoBot
|
|
|
109
142
|
end
|
|
110
143
|
end
|
|
111
144
|
|
|
112
|
-
def self.user_home!
|
|
145
|
+
def self.user_home!(components: {})
|
|
146
|
+
return components[:home] if components[:home]
|
|
147
|
+
|
|
113
148
|
[Dir.home, `echo ~`.strip, '~'].find do |candidate|
|
|
114
149
|
!candidate.nil? && !candidate.empty?
|
|
115
150
|
end
|
data/controllers/cartridges.rb
CHANGED
|
@@ -3,35 +3,43 @@
|
|
|
3
3
|
require_relative '../components/storage'
|
|
4
4
|
require_relative '../logic/helpers/hash'
|
|
5
5
|
require_relative '../logic/cartridge/default'
|
|
6
|
+
require_relative '../logic/cartridge/parser'
|
|
6
7
|
|
|
7
8
|
module NanoBot
|
|
8
9
|
module Controllers
|
|
9
10
|
class Cartridges
|
|
10
|
-
def self.
|
|
11
|
+
def self.load(path)
|
|
12
|
+
Logic::Cartridge::Parser.parse(File.read(path), format: File.extname(path))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.all(components: {})
|
|
11
16
|
files = {}
|
|
12
17
|
|
|
13
|
-
|
|
18
|
+
paths = Components::Storage.cartridges_path(components:)
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
paths.split(':').each do |path|
|
|
21
|
+
Dir.glob("#{path}/**/*.{yml,yaml,markdown,mdown,mkdn,md}").each do |file|
|
|
22
|
+
files[Pathname.new(file).realpath] = {
|
|
23
|
+
base: path,
|
|
24
|
+
path: Pathname.new(file).realpath
|
|
25
|
+
}
|
|
26
|
+
end
|
|
20
27
|
end
|
|
21
28
|
|
|
22
29
|
cartridges = []
|
|
23
30
|
|
|
24
31
|
files.values.uniq.map do |file|
|
|
25
|
-
cartridge =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
cartridge = load(file[:path]).merge(
|
|
33
|
+
{
|
|
34
|
+
system: {
|
|
35
|
+
id: file[:path].to_s.sub(
|
|
36
|
+
/^#{Regexp.escape(file[:base])}/, ''
|
|
37
|
+
).sub(%r{^/}, '').sub(/\.[^.]+\z/, ''),
|
|
38
|
+
path: file[:path],
|
|
39
|
+
base: file[:base]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
)
|
|
35
43
|
|
|
36
44
|
next if cartridge[:meta][:name].nil?
|
|
37
45
|
|
data/controllers/instance.rb
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'yaml'
|
|
4
|
-
|
|
5
3
|
require_relative '../logic/helpers/hash'
|
|
6
4
|
require_relative '../components/provider'
|
|
7
5
|
require_relative '../components/storage'
|
|
8
6
|
require_relative '../components/stream'
|
|
7
|
+
require_relative 'cartridges'
|
|
9
8
|
require_relative 'interfaces/repl'
|
|
10
9
|
require_relative 'interfaces/eval'
|
|
11
10
|
require_relative 'session'
|
|
@@ -83,13 +82,11 @@ module NanoBot
|
|
|
83
82
|
raise StandardError, "Cartridge file not found: \"#{path}\""
|
|
84
83
|
end
|
|
85
84
|
|
|
86
|
-
@cartridge =
|
|
85
|
+
@cartridge = Cartridges.load(elected_path)
|
|
87
86
|
end
|
|
88
87
|
|
|
89
88
|
@safe_cartridge = Marshal.load(Marshal.dump(@cartridge))
|
|
90
89
|
|
|
91
|
-
@cartridge = Logic::Helpers::Hash.symbolize_keys(@cartridge)
|
|
92
|
-
|
|
93
90
|
inject_environment_variables!(@cartridge)
|
|
94
91
|
end
|
|
95
92
|
|
data/docker-compose.example.yml
CHANGED
|
@@ -2,27 +2,31 @@
|
|
|
2
2
|
services:
|
|
3
3
|
nano-bots:
|
|
4
4
|
image: ruby:3.2.2-slim-bookworm
|
|
5
|
-
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v
|
|
5
|
+
command: sh -c "apt-get update && apt-get install -y --no-install-recommends build-essential libffi-dev libsodium-dev lua5.4-dev curl && curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | bash && gem install nano-bots -v 3.0.0 && bash"
|
|
6
6
|
environment:
|
|
7
7
|
COHERE_API_KEY: your-api-key
|
|
8
8
|
|
|
9
|
-
GOOGLE_API_KEY: your-api-key
|
|
9
|
+
# GOOGLE_API_KEY: your-api-key
|
|
10
10
|
|
|
11
|
-
GOOGLE_CREDENTIALS_FILE_PATH: /root/.config/google-credentials.json
|
|
12
|
-
GOOGLE_PROJECT_ID: your-project-id
|
|
11
|
+
# GOOGLE_CREDENTIALS_FILE_PATH: /root/.config/google-credentials.json
|
|
12
|
+
# GOOGLE_PROJECT_ID: your-project-id
|
|
13
13
|
GOOGLE_REGION: us-east4
|
|
14
14
|
|
|
15
15
|
MARITACA_API_KEY: 'your-api-key'
|
|
16
16
|
|
|
17
17
|
MISTRAL_API_KEY: your-api-key
|
|
18
18
|
|
|
19
|
-
OLLAMA_API_ADDRESS: http://
|
|
19
|
+
OLLAMA_API_ADDRESS: http://localhost:11434
|
|
20
20
|
|
|
21
21
|
OPENAI_API_KEY: your-access-token
|
|
22
22
|
|
|
23
23
|
NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
|
|
24
24
|
NANO_BOTS_END_USER: your-user
|
|
25
|
+
|
|
25
26
|
volumes:
|
|
26
27
|
- ./google-credentials.json:/root/.config/google-credentials.json
|
|
27
28
|
- ./your-cartridges:/root/.local/share/nano-bots/cartridges
|
|
28
29
|
- ./your-state-path:/root/.local/state/nano-bots
|
|
30
|
+
|
|
31
|
+
# If you are running the Ollama server on your localhost:
|
|
32
|
+
# network_mode: host # WARNING: Be careful, this may be a security risk.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'singleton'
|
|
4
|
+
|
|
5
|
+
require 'redcarpet'
|
|
6
|
+
require 'redcarpet/render_strip'
|
|
7
|
+
|
|
8
|
+
module NanoBot
|
|
9
|
+
module Logic
|
|
10
|
+
module Cartridge
|
|
11
|
+
module Parser
|
|
12
|
+
def self.parse(raw, format:)
|
|
13
|
+
normalized = format.to_s.downcase.gsub('.', '').strip
|
|
14
|
+
|
|
15
|
+
if %w[yml yaml].include?(normalized)
|
|
16
|
+
yaml(raw)
|
|
17
|
+
elsif %w[markdown mdown mkdn md].include?(normalized)
|
|
18
|
+
markdown(raw)
|
|
19
|
+
else
|
|
20
|
+
raise "Unknown cartridge format: '#{format}'"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.markdown(raw)
|
|
25
|
+
yaml_source = []
|
|
26
|
+
|
|
27
|
+
tools = []
|
|
28
|
+
|
|
29
|
+
blocks = Markdown.new.render(raw).blocks
|
|
30
|
+
|
|
31
|
+
previous_block_is_tool = false
|
|
32
|
+
|
|
33
|
+
blocks.each do |block|
|
|
34
|
+
if block[:language] == 'yaml'
|
|
35
|
+
parsed = Logic::Helpers::Hash.symbolize_keys(
|
|
36
|
+
YAML.safe_load(block[:source], permitted_classes: [Symbol])
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
if parsed.key?(:tools) && parsed[:tools].is_a?(Array) && !parsed[:tools].empty?
|
|
40
|
+
previous_block_is_tool = true
|
|
41
|
+
|
|
42
|
+
tools.concat(parsed[:tools])
|
|
43
|
+
|
|
44
|
+
parsed.delete(:tools)
|
|
45
|
+
|
|
46
|
+
unless parsed.empty?
|
|
47
|
+
yaml_source << YAML.dump(
|
|
48
|
+
Logic::Helpers::Hash.stringify_keys(parsed)
|
|
49
|
+
).gsub(/^---/, '') # TODO: Is this safe enough?
|
|
50
|
+
end
|
|
51
|
+
else
|
|
52
|
+
yaml_source << block[:source]
|
|
53
|
+
previous_block_is_tool = false
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
elsif previous_block_is_tool
|
|
57
|
+
tools.last[block[:language].to_sym] = block[:source]
|
|
58
|
+
previous_block_is_tool = false
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
unless tools.empty?
|
|
63
|
+
yaml_source << YAML.dump(
|
|
64
|
+
Logic::Helpers::Hash.stringify_keys({ tools: })
|
|
65
|
+
).gsub(/^---/, '') # TODO: Is this safe enough?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
cartridge = {}
|
|
69
|
+
|
|
70
|
+
yaml_source.each do |source|
|
|
71
|
+
cartridge = Logic::Helpers::Hash.deep_merge(cartridge, yaml(source))
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
cartridge
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.yaml(raw)
|
|
78
|
+
Logic::Helpers::Hash.symbolize_keys(
|
|
79
|
+
YAML.safe_load(raw, permitted_classes: [Symbol])
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class Renderer < Redcarpet::Render::Base
|
|
84
|
+
LANGUAGES_MAP = {
|
|
85
|
+
'yml' => 'yaml',
|
|
86
|
+
'yaml' => 'yaml',
|
|
87
|
+
'lua' => 'lua',
|
|
88
|
+
'fnl' => 'fennel',
|
|
89
|
+
'fennel' => 'fennel',
|
|
90
|
+
'clj' => 'clojure',
|
|
91
|
+
'clojure' => 'clojure'
|
|
92
|
+
}.freeze
|
|
93
|
+
|
|
94
|
+
LANGUAGES = LANGUAGES_MAP.keys.freeze
|
|
95
|
+
|
|
96
|
+
def initialize(...)
|
|
97
|
+
super(...)
|
|
98
|
+
@_nano_bots_blocks = []
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
attr_reader :_nano_bots_blocks
|
|
102
|
+
|
|
103
|
+
def block_code(code, language)
|
|
104
|
+
key = language.to_s.downcase.strip
|
|
105
|
+
|
|
106
|
+
return nil unless LANGUAGES.include?(key)
|
|
107
|
+
|
|
108
|
+
@_nano_bots_blocks << { language: LANGUAGES_MAP[key], source: code }
|
|
109
|
+
|
|
110
|
+
nil
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
class Markdown
|
|
115
|
+
attr_reader :markdown
|
|
116
|
+
|
|
117
|
+
def initialize
|
|
118
|
+
@renderer = Renderer.new
|
|
119
|
+
@markdown = Redcarpet::Markdown.new(@renderer, fenced_code_blocks: true)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def blocks
|
|
123
|
+
@renderer._nano_bots_blocks
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def render(raw)
|
|
127
|
+
@markdown.render(raw.gsub(/```\w/, "\n\n\\0"))
|
|
128
|
+
self
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
data/logic/helpers/hash.rb
CHANGED
|
@@ -4,6 +4,16 @@ module NanoBot
|
|
|
4
4
|
module Logic
|
|
5
5
|
module Helpers
|
|
6
6
|
module Hash
|
|
7
|
+
def self.deep_merge(hash1, hash2)
|
|
8
|
+
hash1.merge(hash2) do |_key, old_val, new_val|
|
|
9
|
+
if old_val.is_a?(::Hash) && new_val.is_a?(::Hash)
|
|
10
|
+
deep_merge(old_val, new_val)
|
|
11
|
+
else
|
|
12
|
+
new_val
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
7
17
|
def self.symbolize_keys(object)
|
|
8
18
|
case object
|
|
9
19
|
when ::Hash
|
|
@@ -17,6 +27,19 @@ module NanoBot
|
|
|
17
27
|
end
|
|
18
28
|
end
|
|
19
29
|
|
|
30
|
+
def self.stringify_keys(object)
|
|
31
|
+
case object
|
|
32
|
+
when ::Hash
|
|
33
|
+
object.each_with_object({}) do |(key, value), result|
|
|
34
|
+
result[key.to_s] = stringify_keys(value)
|
|
35
|
+
end
|
|
36
|
+
when Array
|
|
37
|
+
object.map { |e| stringify_keys(e) }
|
|
38
|
+
else
|
|
39
|
+
object
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
20
43
|
def self.fetch(object, path)
|
|
21
44
|
node = object
|
|
22
45
|
|
data/nano-bots.gemspec
CHANGED
|
@@ -37,12 +37,13 @@ Gem::Specification.new do |spec|
|
|
|
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 'rbnacl', '~> 7.1', '>= 7.1.1'
|
|
40
|
+
spec.add_dependency 'redcarpet', '~> 3.6'
|
|
40
41
|
spec.add_dependency 'sweet-moon', '~> 0.0.7'
|
|
41
42
|
|
|
42
43
|
spec.add_dependency 'cohere-ai', '~> 1.0', '>= 1.0.1'
|
|
43
44
|
spec.add_dependency 'gemini-ai', '~> 3.1', '>= 3.1.2'
|
|
44
45
|
spec.add_dependency 'maritaca-ai', '~> 1.0'
|
|
45
|
-
spec.add_dependency 'mistral-ai', '~> 1.1'
|
|
46
|
+
spec.add_dependency 'mistral-ai', '~> 1.1', '>= 1.1.1'
|
|
46
47
|
spec.add_dependency 'ollama-ai', '~> 1.0'
|
|
47
48
|
spec.add_dependency 'ruby-openai', '~> 6.3', '>= 6.3.1'
|
|
48
49
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../controllers/cartridges'
|
|
4
|
+
|
|
5
|
+
module NanoBot
|
|
6
|
+
module Cartridges
|
|
7
|
+
def self.all(components: {})
|
|
8
|
+
Controllers::Cartridges.all(components:)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.load(path)
|
|
12
|
+
Controllers::Cartridges.load(path)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
data/ports/dsl/nano-bots.rb
CHANGED
|
@@ -8,6 +8,7 @@ require_relative '../../controllers/instance'
|
|
|
8
8
|
require_relative '../../controllers/security'
|
|
9
9
|
require_relative '../../controllers/interfaces/cli'
|
|
10
10
|
require_relative '../../components/stream'
|
|
11
|
+
require_relative 'nano-bots/cartridges'
|
|
11
12
|
|
|
12
13
|
module NanoBot
|
|
13
14
|
def self.new(cartridge: '-', state: '-', environment: {})
|
|
@@ -24,7 +25,7 @@ module NanoBot
|
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
def self.cartridges
|
|
27
|
-
|
|
28
|
+
Cartridges
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def self.cli
|
data/static/gem.rb
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
module NanoBot
|
|
4
4
|
GEM = {
|
|
5
5
|
name: 'nano-bots',
|
|
6
|
-
version: '
|
|
7
|
-
specification: '
|
|
6
|
+
version: '3.0.0',
|
|
7
|
+
specification: '3.0.0',
|
|
8
8
|
author: 'icebaker',
|
|
9
9
|
summary: 'Ruby Implementation of Nano Bots: small, AI-powered bots for OpenAI ChatGPT, Ollama, Mistral AI, Cohere Command, Maritaca AI MariTalk, and Google Gemini.',
|
|
10
10
|
description: 'Ruby Implementation of Nano Bots: small, AI-powered bots that can be easily shared as a single file, designed to support multiple providers such as OpenAI ChatGPT, Ollama, Mistral AI, Cohere Command, Maritaca AI MariTalk, and Google Gemini, with support for calling Tools (Functions).',
|
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:
|
|
4
|
+
version: 3.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- icebaker
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-01-
|
|
11
|
+
date: 2024-01-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: babosa
|
|
@@ -118,6 +118,20 @@ dependencies:
|
|
|
118
118
|
- - ">="
|
|
119
119
|
- !ruby/object:Gem::Version
|
|
120
120
|
version: 7.1.1
|
|
121
|
+
- !ruby/object:Gem::Dependency
|
|
122
|
+
name: redcarpet
|
|
123
|
+
requirement: !ruby/object:Gem::Requirement
|
|
124
|
+
requirements:
|
|
125
|
+
- - "~>"
|
|
126
|
+
- !ruby/object:Gem::Version
|
|
127
|
+
version: '3.6'
|
|
128
|
+
type: :runtime
|
|
129
|
+
prerelease: false
|
|
130
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - "~>"
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: '3.6'
|
|
121
135
|
- !ruby/object:Gem::Dependency
|
|
122
136
|
name: sweet-moon
|
|
123
137
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -193,6 +207,9 @@ dependencies:
|
|
|
193
207
|
- - "~>"
|
|
194
208
|
- !ruby/object:Gem::Version
|
|
195
209
|
version: '1.1'
|
|
210
|
+
- - ">="
|
|
211
|
+
- !ruby/object:Gem::Version
|
|
212
|
+
version: 1.1.1
|
|
196
213
|
type: :runtime
|
|
197
214
|
prerelease: false
|
|
198
215
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -200,6 +217,9 @@ dependencies:
|
|
|
200
217
|
- - "~>"
|
|
201
218
|
- !ruby/object:Gem::Version
|
|
202
219
|
version: '1.1'
|
|
220
|
+
- - ">="
|
|
221
|
+
- !ruby/object:Gem::Version
|
|
222
|
+
version: 1.1.1
|
|
203
223
|
- !ruby/object:Gem::Dependency
|
|
204
224
|
name: ollama-ai
|
|
205
225
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -281,6 +301,7 @@ files:
|
|
|
281
301
|
- logic/cartridge/default.rb
|
|
282
302
|
- logic/cartridge/fetch.rb
|
|
283
303
|
- logic/cartridge/interaction.rb
|
|
304
|
+
- logic/cartridge/parser.rb
|
|
284
305
|
- logic/cartridge/safety.rb
|
|
285
306
|
- logic/cartridge/streaming.rb
|
|
286
307
|
- logic/cartridge/tools.rb
|
|
@@ -296,6 +317,7 @@ files:
|
|
|
296
317
|
- logic/providers/openai/tools.rb
|
|
297
318
|
- nano-bots.gemspec
|
|
298
319
|
- ports/dsl/nano-bots.rb
|
|
320
|
+
- ports/dsl/nano-bots/cartridges.rb
|
|
299
321
|
- ports/dsl/nano-bots/cli.rb
|
|
300
322
|
- static/cartridges/baseline.yml
|
|
301
323
|
- static/cartridges/default.yml
|