Skip to content

Commit

Permalink
Merge pull request #3 from icebaker/ib-path
Browse files Browse the repository at this point in the history
Migrating to PATH
  • Loading branch information
icebaker committed Jan 13, 2024
2 parents 1e3ceec + a2e3866 commit b3255b1
Show file tree
Hide file tree
Showing 10 changed files with 104 additions and 64 deletions.
6 changes: 4 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ PORT=3048

RUN_DANGEROUSLY_AS_SUDO=false
RVM=false
RERUN=false

FORCE_SANDBOXED=true
ALLOW_CARTRIDGES_PATH_HEADER=true

NANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE
NANO_BOTS_END_USER=your-user

# NANO_BOTS_CARTRIDGES_DIRECTORY=/home/user/.local/share/nano-bots/cartridges
# NANO_BOTS_STATE_DIRECTORY=/home/user/.local/state/nano-bots
# NANO_BOTS_CARTRIDGES_PATH=/home/user/.local/share/nano-bots/cartridges
# NANO_BOTS_STATE_PATH=/home/user/.local/state/nano-bots
# NANO_BOTS_RACK_ATTACK=false
# NANO_BOTS_NEW_RELIC=false

Expand Down
8 changes: 4 additions & 4 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ gem 'rack', '~> 3.0', '>= 3.0.8'
gem 'rack-cors', '~> 2.0', '>= 2.0.1'
gem 'rackup', '~> 2.1'

gem 'puma', '~> 6.4', '>= 6.4.1'
gem 'puma', '~> 6.4', '>= 6.4.2'
gem 'rack-attack', '~> 6.7'
gem 'roda', '~> 3.75'
gem 'roda', '~> 3.76'

gem 'concurrent-ruby', '~> 1.2', '>= 1.2.2'

gem 'newrelic_rpm', '~> 9.6'
gem 'newrelic_rpm', '~> 9.7'

gem 'nano-bots', '~> 2.5', '>= 2.5.1'
gem 'nano-bots', '~> 3.0', '>= 3.0.1'

group :test, :development do
gem 'pry-byebug', '~> 3.10', '>= 3.10.1'
Expand Down
65 changes: 33 additions & 32 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,23 @@ GEM
public_suffix (>= 2.0.2, < 6.0)
ast (2.4.2)
babosa (2.0.0)
base64 (0.2.0)
byebug (11.1.3)
coderay (1.1.3)
cohere-ai (1.0.1)
faraday (~> 2.8, >= 2.8.1)
cohere-ai (1.0.2)
faraday (~> 2.9)
concurrent-ruby (1.2.2)
dotenv (2.8.1)
event_stream_parser (1.0.0)
faraday (2.8.1)
base64
faraday-net_http (>= 2.0, < 3.1)
ruby2_keywords (>= 0.0.4)
faraday (2.9.0)
faraday-net_http (>= 2.0, < 3.2)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-net_http (3.0.2)
faraday-net_http (3.1.0)
net-http
ffi (1.16.3)
gemini-ai (3.1.2)
gemini-ai (3.1.3)
event_stream_parser (~> 1.0)
faraday (~> 2.8, >= 2.8.1)
faraday (~> 2.9)
googleauth (~> 1.8)
google-cloud-env (2.1.0)
faraday (>= 1.0, < 3.a)
Expand All @@ -40,36 +38,38 @@ GEM
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
maritaca-ai (1.0.0)
faraday (~> 2.8, >= 2.8.1)
maritaca-ai (1.0.1)
faraday (~> 2.9)
method_source (1.0.0)
mistral-ai (1.1.1)
mistral-ai (1.1.2)
event_stream_parser (~> 1.0)
faraday (~> 2.8, >= 2.8.1)
faraday (~> 2.9)
multi_json (1.15.0)
multipart-post (2.3.0)
nano-bots (2.5.1)
nano-bots (3.0.1)
babosa (~> 2.0)
cohere-ai (~> 1.0, >= 1.0.1)
cohere-ai (~> 1.0, >= 1.0.2)
concurrent-ruby (~> 1.2, >= 1.2.2)
dotenv (~> 2.8, >= 2.8.1)
gemini-ai (~> 3.1, >= 3.1.2)
maritaca-ai (~> 1.0)
mistral-ai (~> 1.1, >= 1.1.1)
ollama-ai (~> 1.0)
gemini-ai (~> 3.1, >= 3.1.3)
maritaca-ai (~> 1.0, >= 1.0.1)
mistral-ai (~> 1.1, >= 1.1.2)
ollama-ai (~> 1.0, >= 1.0.1)
pry (~> 0.14.2)
rainbow (~> 3.1, >= 3.1.1)
rbnacl (~> 7.1, >= 7.1.1)
redcarpet (~> 3.6)
ruby-openai (~> 6.3, >= 6.3.1)
sweet-moon (~> 0.0.7)
newrelic_rpm (9.6.0)
base64
net-http (0.4.1)
uri
newrelic_rpm (9.7.0)
nio4r (2.7.0)
ollama-ai (1.0.0)
faraday (~> 2.8)
ollama-ai (1.0.1)
faraday (~> 2.9)
os (1.1.4)
parallel (1.24.0)
parser (3.3.0.1)
parser (3.3.0.2)
ast (~> 2.4.1)
racc
pry (0.14.2)
Expand All @@ -79,7 +79,7 @@ GEM
byebug (~> 11.0)
pry (>= 0.13, < 0.15)
public_suffix (5.0.4)
puma (6.4.1)
puma (6.4.2)
nio4r (~> 2.0)
racc (1.7.3)
rack (3.0.8)
Expand All @@ -96,11 +96,12 @@ GEM
ffi (~> 1.0)
rbnacl (7.1.1)
ffi
redcarpet (3.6.0)
regexp_parser (2.9.0)
rerun (0.14.0)
listen (~> 3.0)
rexml (3.2.6)
roda (3.75.0)
roda (3.76.0)
rack
rubocop (1.59.0)
json (~> 2.3)
Expand All @@ -120,7 +121,6 @@ GEM
faraday (>= 1)
faraday-multipart (>= 1)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
signet (0.18.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
Expand All @@ -129,6 +129,7 @@ GEM
sweet-moon (0.0.7)
ffi (~> 1.15, >= 1.15.5)
unicode-display_width (2.5.0)
uri (0.13.0)
webrick (1.8.1)

PLATFORMS
Expand All @@ -137,16 +138,16 @@ PLATFORMS
DEPENDENCIES
concurrent-ruby (~> 1.2, >= 1.2.2)
dotenv (~> 2.8, >= 2.8.1)
nano-bots (~> 2.5, >= 2.5.1)
newrelic_rpm (~> 9.6)
nano-bots (~> 3.0, >= 3.0.1)
newrelic_rpm (~> 9.7)
pry-byebug (~> 3.10, >= 3.10.1)
puma (~> 6.4, >= 6.4.1)
puma (~> 6.4, >= 6.4.2)
rack (~> 3.0, >= 3.0.8)
rack-attack (~> 6.7)
rack-cors (~> 2.0, >= 2.0.1)
rackup (~> 2.1)
rerun (~> 0.14.0)
roda (~> 3.75)
roda (~> 3.76)
rubocop (~> 1.59)

RUBY VERSION
Expand Down
35 changes: 26 additions & 9 deletions controllers/cartridges.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,14 @@
require './logic/safety'

module CartridgesController
def self.index
cartridges = NanoBot.cartridges
def self.index(environment)
components = {}

if environment[:NANO_BOTS_CARTRIDGES_PATH]
components[:ENV] = { 'NANO_BOTS_CARTRIDGES_PATH' => environment[:NANO_BOTS_CARTRIDGES_PATH] }
end

cartridges = NanoBot.cartridges.all(components:)

cartridges = cartridges.map do |cartridge|
{
Expand All @@ -27,22 +33,28 @@ def self.index
end

default_override = cartridges.find do |cartridge|
cartridge[:system][:id].to_s.downcase == 'default'
cartridge[:system][:id].to_s.downcase.strip == 'default'
end

if default_override
cartridges = cartridges.filter do |cartridge|
cartridge[:system][:id] != '-' && cartridge[:system][:id].to_s.downcase != 'default'
cartridge[:system][:id] != '-' && cartridge[:system][:id].to_s.downcase.strip != 'default'
end.prepend(default_override)
end

{ body: cartridges, status: 200 }
end

def self.source(params)
def self.source(params, environment)
params = JSON.parse(params)

cartridge = NanoBot.cartridges.find do |cartridge|
components = {}

if environment[:NANO_BOTS_CARTRIDGES_PATH]
components[:ENV] = { 'NANO_BOTS_CARTRIDGES_PATH' => environment[:NANO_BOTS_CARTRIDGES_PATH] }
end

cartridge = NanoBot.cartridges.all(components:).find do |cartridge|
cartridge[:system][:id] == params['id']
end

Expand Down Expand Up @@ -73,12 +85,14 @@ def self.get_stream(id)
end

def self.create_stream(params, environment)
status = 200

params = JSON.parse(params)

stream = Stream.instance.create

nbot = NanoBot.new(
cartridge: SafetyLogic.ensure_cartridge_is_safe_to_run(params['cartridge']),
cartridge: SafetyLogic.ensure_cartridge_is_safe_to_run(params['cartridge'], environment),
state: params['state'],
environment:
)
Expand Down Expand Up @@ -116,17 +130,18 @@ def self.create_stream(params, environment)
end
rescue StandardError => e
Stream.instance.get(stream[:id])[:finished_at] = Time.now
status = 500
Stream.instance.get(stream[:id])[:state] = 'failed'
Stream.instance.get(stream[:id])[:error] = { message: e.message, backtrace: e.backtrace }
end

{ body: stream, status: 200 }
{ body: stream, status: }
end

def self.run(params, environment)
params = JSON.parse(params)
nbot = NanoBot.new(
cartridge: SafetyLogic.ensure_cartridge_is_safe_to_run(params['cartridge']),
cartridge: SafetyLogic.ensure_cartridge_is_safe_to_run(params['cartridge'], environment),
state: params['state'],
environment:
)
Expand All @@ -150,5 +165,7 @@ def self.run(params, environment)
state[:finished_at] = Time.now

{ body: state, status: 200 }
rescue StandardError => e
{ body: { error: { message: e.message, backtrace: e.backtrace } }, status: 500 }
end
end
5 changes: 3 additions & 2 deletions docker-compose.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ services:
RVM: "false"

FORCE_SANDBOXED: "true"
ALLOW_CARTRIDGES_PATH_HEADER: "true"

NANO_BOTS_ENCRYPTION_PASSWORD: UNSAFE
NANO_BOTS_END_USER: your-user
NANO_BOTS_CARTRIDGES_DIRECTORY: /cartridges
# NANO_BOTS_STATE_DIRECTORY=/state
NANO_BOTS_CARTRIDGES_PATH: /cartridges
# NANO_BOTS_STATE_PATH=/state
NANO_BOTS_RACK_ATTACK: "false"
NANO_BOTS_NEW_RELIC: "false"

Expand Down
2 changes: 1 addition & 1 deletion init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ export $(grep -v '^#' .env | xargs)

command="bundle exec rackup --server puma -o 0.0.0.0 -p $PORT"

if [ "$ENVIRONMENT" = 'development' ]; then
if [ "$RERUN" = 'true' ]; then
command="bundle exec rerun -- $command"
fi

Expand Down
17 changes: 12 additions & 5 deletions logic/safety.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,23 @@ def self.symbolize_keys(object)
end
end

def self.ensure_cartridge_is_safe_to_run(cartridge_input)
def self.ensure_cartridge_is_safe_to_run(cartridge_input, environment)
components = {}

if environment[:NANO_BOTS_CARTRIDGES_PATH]
components[:ENV] = { 'NANO_BOTS_CARTRIDGES_PATH' => environment[:NANO_BOTS_CARTRIDGES_PATH] }
end

cartridge = if cartridge_input.is_a?(Hash)
cartridge_input
else
found = NanoBot.cartridges.find do |cartridge|
found = NanoBot.cartridges.all(components:).find do |cartridge|
cartridge[:system][:id].to_s == cartridge_input.to_s
end

if found.nil? && cartridge_input == 'default'
if found.nil? && cartridge_input.to_s.downcase.strip == 'default'
cartridge_input = '-'
found = NanoBot.cartridges.find do |cartridge|
found = NanoBot.cartridges.all(components:).find do |cartridge|
cartridge[:system][:id].to_s == cartridge_input.to_s
end
end
Expand All @@ -37,8 +43,9 @@ def self.ensure_cartridge_is_safe_to_run(cartridge_input)
cartridge = SafetyLogic.symbolize_keys(cartridge)

unless cartridge[:provider]
cartridge[:provider] =
cartridge[:provider] = SafetyLogic.symbolize_keys(
YAML.safe_load_file('static/cartridges/default.yml', permitted_classes: [Symbol])['provider']
)
end

cartridge[:safety] = {} if cartridge[:safety].nil?
Expand Down
11 changes: 9 additions & 2 deletions ports/http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,19 @@
module HTTP
def self.routes(route, request, response)
new_relic = ENV.fetch('NANO_BOTS_NEW_RELIC', nil).to_s == 'true'

ip = request.env['HTTP_X_FORWARDED_FOR']&.split(',')&.first || request.ip

environment = {
NANO_BOTS_END_USER: "#{ip}-#{request.get_header('HTTP_NANO_BOTS_END_USER')}"
}

cartridges_path = request.get_header('HTTP_NANO_BOTS_CARTRIDGES_PATH')

if ENV.fetch('ALLOW_CARTRIDGES_PATH_HEADER', nil).to_s == 'true' && !cartridges_path.to_s.strip.empty?
environment[:NANO_BOTS_CARTRIDGES_PATH] = cartridges_path
end

route.root do
NewRelic::Agent.set_transaction_name('GET/') if new_relic
IndexController.handler
Expand All @@ -27,7 +34,7 @@ def self.routes(route, request, response)

route.get 'cartridges' do
NewRelic::Agent.set_transaction_name('GET/cartridges') if new_relic
result = CartridgesController.index
result = CartridgesController.index(environment)
response.status = result[:status]
result[:body]
end
Expand All @@ -41,7 +48,7 @@ def self.routes(route, request, response)

route.post 'cartridges/source' do
NewRelic::Agent.set_transaction_name('POST/cartridges/source') if new_relic
result = CartridgesController.source(request.body.read)
result = CartridgesController.source(request.body.read, environment)
response.status = result[:status]
result[:body]
end
Expand Down
Loading

0 comments on commit b3255b1

Please sign in to comment.