nano-bots 0.1.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'fetch'
4
+ require_relative 'affixes'
5
+ require_relative 'adapters'
6
+
7
+ module NanoBot
8
+ module Logic
9
+ module Cartridge
10
+ module Tools
11
+ def self.fetch_from_interface(cartridge, interface, action, path)
12
+ Fetch.cascate(cartridge, [
13
+ [:interfaces, interface, :tools, action].concat(path),
14
+ [:interfaces, :tools, action].concat(path),
15
+ %i[interfaces tools].concat(path)
16
+ ])
17
+ end
18
+
19
+ def self.feedback?(cartridge, interface, action)
20
+ Fetch.cascate(cartridge, [
21
+ [:interfaces, interface, :tools, action, :feedback],
22
+ [:interfaces, :tools, action, :feedback],
23
+ %i[interfaces tools feedback]
24
+ ])
25
+ end
26
+
27
+ def self.input(cartridge, interface, content)
28
+ lua = Adapter.expression(cartridge, interface, :input, :lua)
29
+ fennel = Adapter.expression(cartridge, interface, :input, :fennel)
30
+
31
+ prefix = Affixes.get(cartridge, interface, :input, :prefix)
32
+ suffix = Affixes.get(cartridge, interface, :input, :suffix)
33
+
34
+ { content:, prefix:, suffix:, lua:, fennel: }
35
+ end
36
+
37
+ def self.output(cartridge, interface, result, streaming, _finished)
38
+ if streaming
39
+ result[:message] = { content: result[:message], lua: nil, fennel: nil }
40
+ return result
41
+ end
42
+
43
+ lua = Adapter.expression(cartridge, interface, :output, :lua)
44
+ fennel = Adapter.expression(cartridge, interface, :output, :fennel)
45
+
46
+ result[:message] = { content: result[:message], lua:, fennel: }
47
+
48
+ result
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ require_relative '../../helpers/hash'
6
+
7
+ module NanoBot
8
+ module Logic
9
+ module OpenAI
10
+ module Tools
11
+ def self.prepare(cartridge, tools)
12
+ applies = []
13
+
14
+ tools = Marshal.load(Marshal.dump(tools))
15
+
16
+ tools.each do |tool|
17
+ tool = Helpers::Hash.symbolize_keys(tool)
18
+
19
+ cartridge.each do |candidate|
20
+ next unless tool[:function][:name] == candidate[:name]
21
+
22
+ source = {}
23
+
24
+ source[:clojure] = candidate[:clojure] if candidate[:clojure]
25
+ source[:fennel] = candidate[:fennel] if candidate[:fennel]
26
+ source[:lua] = candidate[:lua] if candidate[:lua]
27
+
28
+ applies << {
29
+ id: tool[:id],
30
+ name: tool[:function][:name],
31
+ type: 'function',
32
+ parameters: JSON.parse(tool[:function][:arguments]),
33
+ source:
34
+ }
35
+ end
36
+ end
37
+
38
+ raise 'missing tool' if applies.size != tools.size
39
+
40
+ applies
41
+ end
42
+
43
+ def self.adapt(cartridge)
44
+ output = {
45
+ type: 'function',
46
+ function: {
47
+ name: cartridge[:name], description: cartridge[:description]
48
+ }
49
+ }
50
+
51
+ output[:function][:parameters] = (cartridge[:parameters] || { type: 'object', properties: {} })
52
+
53
+ output
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module NanoBot
6
+ module Logic
7
+ module OpenAI
8
+ def self.prepare_tools(cartridge, tools)
9
+ applies = []
10
+ tools.each do |tool|
11
+ cartridge.each do |candidate|
12
+ next unless candidate[:type] == 'function' &&
13
+ tool[:type] == candidate[:type] &&
14
+ tool[:function][:name] == candidate[:name]
15
+
16
+ source = {}
17
+
18
+ source[:fennel] = candidate[:fennel] if candidate[:fennel]
19
+ source[:lua] = candidate[:lua] if candidate[:lua]
20
+
21
+ applies << {
22
+ name: tool[:function][:name],
23
+ type: candidate[:type],
24
+ parameters: JSON.parse(tool[:function][:arguments]),
25
+ source:
26
+ }
27
+ end
28
+ end
29
+
30
+ applies
31
+ end
32
+
33
+ def self.adapt_tool(cartridge)
34
+ raise 'unsupported tool' if cartridge[:type] != 'function'
35
+
36
+ adapted = {
37
+ type: 'function',
38
+ function: {
39
+ name: cartridge[:name], description: cartridge[:description],
40
+ parameters: { type: 'object', properties: {} }
41
+ }
42
+ }
43
+
44
+ properties = adapted[:function][:parameters][:properties]
45
+
46
+ cartridge[:parameters].each do |parameter|
47
+ key = parameter[:name].to_sym
48
+ properties[key] = {}
49
+ properties[key][:type] = parameter[:type] || 'string'
50
+ properties[key][:description] = parameter[:description] if parameter[:description]
51
+ end
52
+
53
+ adapted
54
+ end
55
+ end
56
+ end
57
+ end
data/nano-bots.gemspec CHANGED
@@ -32,12 +32,13 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = ['nb']
33
33
 
34
34
  spec.add_dependency 'babosa', '~> 2.0'
35
+ spec.add_dependency 'concurrent-ruby', '~> 1.2', '>= 1.2.2'
35
36
  spec.add_dependency 'dotenv', '~> 2.8', '>= 2.8.1'
36
- spec.add_dependency 'faraday', '~> 2.7', '>= 2.7.5'
37
+ spec.add_dependency 'faraday', '~> 2.7', '>= 2.7.12'
37
38
  spec.add_dependency 'pry', '~> 0.14.2'
38
39
  spec.add_dependency 'rainbow', '~> 3.1', '>= 3.1.1'
39
40
  spec.add_dependency 'rbnacl', '~> 7.1', '>= 7.1.1'
40
- spec.add_dependency 'ruby-openai', '~> 4.0'
41
+ spec.add_dependency 'ruby-openai', '~> 6.3'
41
42
  spec.add_dependency 'sweet-moon', '~> 0.0.7'
42
43
 
43
44
  spec.metadata['rubygems_mfa_required'] = 'true'
@@ -14,4 +14,4 @@ provider:
14
14
  access-token: ENV/OPENAI_API_KEY
15
15
  settings:
16
16
  user: ENV/NANO_BOTS_END_USER
17
- model: gpt-3.5-turbo
17
+ model: gpt-3.5-turbo-1106
@@ -1,4 +1,10 @@
1
1
  ---
2
+ safety:
3
+ functions:
4
+ sandboxed: true
5
+ tools:
6
+ confirmable: true
7
+
2
8
  interfaces:
3
9
  repl:
4
10
  output:
@@ -12,6 +18,16 @@ interfaces:
12
18
  output:
13
19
  stream: true
14
20
  suffix: "\n"
21
+ tools:
22
+ confirming:
23
+ suffix: ' [yN] '
24
+ default: 'n'
25
+ yeses: ['y', 'yes']
26
+ executing:
27
+ feedback: false
28
+ responding:
29
+ suffix: "\n\n"
30
+ feedback: true
15
31
 
16
32
  provider:
17
33
  settings:
@@ -1,7 +1,5 @@
1
1
  MIT License
2
2
 
3
- Copyright © 2016-2022 Calvin Rose and contributors
4
-
5
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
4
  of this software and associated documentation files (the "Software"), to deal
7
5
  in the Software without restriction, including without limitation the rights