diff options
author | icebaker <icebaker@proton.me> | 2023-11-18 20:08:34 -0300 |
---|---|---|
committer | icebaker <icebaker@proton.me> | 2023-11-18 20:08:34 -0300 |
commit | 89962f27a75183947fc44cd051a1061ce157221d (patch) | |
tree | 1d39a227a58ffc24a73401f697592af229be1d0c /components/providers | |
parent | 989c276b6acf9d0e2b584d980b72a4eb9564a77c (diff) |
adding safety sandbox
Diffstat (limited to 'components/providers')
-rw-r--r-- | components/providers/openai.rb | 6 | ||||
-rw-r--r-- | components/providers/openai/tools.rb | 16 |
2 files changed, 14 insertions, 8 deletions
diff --git a/components/providers/openai.rb b/components/providers/openai.rb index bf5ae73..996f7f6 100644 --- a/components/providers/openai.rb +++ b/components/providers/openai.rb @@ -45,7 +45,7 @@ module NanoBot provider && interface end - def evaluate(input, &feedback) + def evaluate(input, cartridge, &feedback) messages = input[:history].map do |event| if event[:message].nil? && event[:meta] && event[:meta][:tool_calls] { role: 'assistant', content: nil, tool_calls: event[:meta][:tool_calls] } @@ -122,7 +122,7 @@ module NanoBot needs_another_round: true, interaction: { who: 'AI', message: nil, meta: { tool_calls: tools } } } ) - Tools.apply(input[:tools], tools, feedback).each do |interaction| + Tools.apply(cartridge, input[:tools], tools, feedback).each do |interaction| feedback.call({ should_be_stored: true, needs_another_round: true, interaction: }) end end @@ -149,7 +149,7 @@ module NanoBot needs_another_round: true, interaction: { who: 'AI', message: nil, meta: { tool_calls: tools } } } ) - Tools.apply(input[:tools], tools, feedback).each do |interaction| + Tools.apply(cartridge, input[:tools], tools, feedback).each do |interaction| feedback.call({ should_be_stored: true, needs_another_round: true, interaction: }) end end diff --git a/components/providers/openai/tools.rb b/components/providers/openai/tools.rb index ea34ae6..50eead9 100644 --- a/components/providers/openai/tools.rb +++ b/components/providers/openai/tools.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require_relative '../../embedding' +require_relative '../../../logic/cartridge/safety' require 'concurrent' @@ -9,11 +10,12 @@ module NanoBot module Providers class OpenAI < Base module Tools - def self.apply(cartridge, tools, feedback) - prepared_tools = NanoBot::Logic::OpenAI::Tools.prepare(cartridge, tools) + def self.apply(cartridge, function_cartridge, tools, feedback) + prepared_tools = NanoBot::Logic::OpenAI::Tools.prepare(function_cartridge, tools) + # TODO: Confirm before starting futures. futures = prepared_tools.map do |tool| - Concurrent::Promises.future { process!(tool, feedback) } + Concurrent::Promises.future { process!(tool, feedback, function_cartridge, cartridge) } end results = Concurrent::Promises.zip(*futures).value! @@ -27,7 +29,7 @@ module NanoBot end end - def self.process!(tool, feedback) + def self.process!(tool, feedback, _function_cartridge, cartridge) feedback.call( { should_be_stored: false, interaction: { who: 'AI', message: nil, meta: { @@ -35,7 +37,11 @@ module NanoBot } } } ) - call = { parameters: %w[parameters], values: [tool[:parameters]], safety: false } + call = { + parameters: %w[parameters], + values: [tool[:parameters]], + safety: { sandboxed: Logic::Cartridge::Safety.sandboxed?(cartridge) } + } if %i[fennel lua clojure].count { |key| !tool[:source][key].nil? } > 1 raise StandardError, 'conflicting tools' |