nano-bots 0.1.1 → 1.0.1

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.
@@ -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