func_bot 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c00ad5a2b3aea12bced2b60da8ffe88910c0413ba5a56163f8f08dee540b3e0
4
- data.tar.gz: 2c91552073019309fc23ae95046763143f1a7f403bd9ee78493201303fe9a592
3
+ metadata.gz: dec89531581e54e3e4c5fb9db21095ab99919347c0f34193eb58c4db0295f558
4
+ data.tar.gz: 51dca7a8ba3d57e22f8873ba16afba9b22671cc50a3f065d561d3b493a3fba1b
5
5
  SHA512:
6
- metadata.gz: 3397880c0ff9482c56653bc3f9b552cdd747f946d13e5091dffa5cc004127506e1c49b2a409daf03c1699fd6368f884d42fd07c4f1fa9b0ca546ea17127c5923
7
- data.tar.gz: d7139064f6ec1dd6546356be3ff93a2a31a0c12307d426e0ffe686db40fca419564d944c30d426cb03d26f093918df411a10d7503f6cdf1f825f63917ad5f880
6
+ metadata.gz: 3f9395775b04bbf6794c30147c7112589611b7c887c2d708819f073f3ff89e674fbfab8bdd5fb318fdef9a0cbafbb474c83f99d2402017b64abc150d3f3c9252
7
+ data.tar.gz: 2efacabefb1a867d761de2ee0614a5be5c7c66b834ddb36c20a41363b006987d6662cd351aa201400597942486492119312550d04859525166f085e3c70cb7c3
data/README.md CHANGED
@@ -2,77 +2,6 @@
2
2
 
3
3
  FuncBot is a Rails gem built on top of the [ruby-openai](https://github.com/alexrudall/ruby-openai) gem. It allows you to easily create chatbots that can answer questions by calling on functions you define. It's goal is to provide a simple interface to consume [OpenAI's Function Calling API](https://openai.com/blog/function-calling-and-other-api-updates?ref=upstract.com).
4
4
 
5
- ## Usage
6
-
7
- - Generate a new function
8
-
9
- ```bash
10
- rails g func_bot:function <function_name>
11
- ```
12
-
13
- - Update the function in `app/lib/func_bot/functions/<function_name>.rb`
14
-
15
- - A function can be as simple or as complex as you need it to be. Your bot will process the results and express them to the user.
16
- - All functions must have an `execute` method.
17
- - Here's a sample function that returns the current weather for the given location.
18
-
19
- ```ruby
20
- module FuncBot
21
- module Functions
22
- class WeatherFunction < BaseFunction
23
- def execute
24
- weather_info = {
25
- location: parsed_response["location"],
26
- temperature: 98,
27
- forecast: ["sunny", "windy"]
28
- }
29
-
30
- JSON.dump(weather_info)
31
- end
32
- end
33
- end
34
- end
35
- ```
36
-
37
- - The `parsed_response` and `response` methods are available to all functions.
38
- - `parsed_response` is a hash that contains the response relevant to your function from OpenAI.
39
- - `response` is the raw response from OpenAI.
40
- - Functions also have access to the `bot` attribute which returns the instance of the bot that called the function.
41
-
42
- - This is useful if you need to access the bot's history or other methods.
43
- - There might be times when you need to ask gpt a question from within a function, but you don't want to trigger the function again. You can set the `bot.include_functions` attribute to false before asking the question and then set it back to true after.
44
-
45
- ```ruby
46
- module FuncBot
47
- module Functions
48
- class SomeFunction < BaseFunction
49
- def execute
50
- bot.include_functions = false
51
- response = bot.ask "Some question that you don't want to trigger any functions for"
52
- bot.include_functions = true
53
- do_something_with_response(response)
54
- ....
55
- end
56
- end
57
- end
58
- end
59
- ```
60
-
61
- - Update your new function in the list of functions in `app/lib/func_bot/functions/list.yml`.
62
- - This list of functions will be available to the bot with every request.
63
- - Adding good descriptions to the functions will help the bot infer when to use which function.
64
- - If the user asks a question that is not related to a function in your list, the bot will just ask ChatGPT.
65
-
66
- `bin/rails c`
67
-
68
- ```ruby
69
- irb(main):001:0> bot = FuncBot::Bot.new
70
- => #<FuncBot::Bot:0x0000000105ecd8e8 @history=#<FuncBot::Bots::History:0x0000000105ecd848 @history=[]>>
71
- irb(main):002:0> bot.ask "What's the weather like in Miami, FL?"
72
- => "The current weather in Miami, FL is sunny and windy with a temperature of 98 degrees."
73
- irb(main):003:0>
74
- ```
75
-
76
5
  ## Installation
77
6
 
78
7
  Add this line to your application's Gemfile:
@@ -107,6 +36,62 @@ openai:
107
36
  api_key: your-private-key
108
37
  ```
109
38
 
39
+ ## Usage
40
+
41
+ - Generate a new function
42
+
43
+ ```bash
44
+ rails g func_bot:function <function_name>
45
+ ```
46
+
47
+ - Update your new function in the list of functions in `app/lib/func_bot/functions/list.yml`.
48
+ - This list of functions will be available to the bot with every request.
49
+ - Adding good descriptions to the functions will help the bot infer when to use which function.
50
+ - If the user asks a question that is not related to a function in your list, the bot will just ask ChatGPT.
51
+ - A function can be as simple or as complex as you need it to be. Your bot will process the results and express them to the user.
52
+ - All functions must have an `execute` method.
53
+ - Here's a sample function that returns the current weather for the given location.
54
+
55
+ ```ruby
56
+ module FuncBot
57
+ module Functions
58
+ class WeatherFunction < BaseFunction
59
+ def execute
60
+ weather_info = {
61
+ location: parsed_response["location"],
62
+ temperature: 98,
63
+ forecast: ["sunny", "windy"]
64
+ }
65
+
66
+ JSON.dump(weather_info)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ ```
72
+
73
+ - The `parsed_response` and `response` methods are available to all functions.
74
+ - `parsed_response` is a hash that contains the response relevant to your function from OpenAI.
75
+ - `response` is the raw response from OpenAI.
76
+ - Functions also have access to the `bot` attribute which returns the instance of the bot that called the function.
77
+
78
+ - This is useful if you need to access the bot's history or other methods.
79
+ - There might be times when you need to ask gpt a question from within a function, but you don't want to trigger the functions again. You can set the `bot.include_functions` attribute to false before asking the question and then set it back to true after.
80
+
81
+ `bin/rails c`
82
+
83
+ ```ruby
84
+ irb(main):001:0> bot = FuncBot::Bot.new
85
+ => #<FuncBot::Bot:0x0000000105ecd8e8 @history=#<FuncBot::Bots::History:0x0000000105ecd848 @history=[]>>
86
+ irb(main):002:0> bot.ask "What's the weather like in Miami, FL?"
87
+ => "The current weather in Miami, FL is sunny and windy with a temperature of 98 degrees."
88
+ irb(main):003:0>
89
+ irb(main):006:0> bot.include_functions = false
90
+ => false
91
+ irb(main):007:0> bot.ask "What's the weather like in Miami, FL today?"
92
+ => "I'm sorry, I cannot provide real-time information as my responses are generated based on pre-existing data. Please check a reliable weather source for the most up-to-date information on the weather in Miami, FL."
93
+ ```
94
+
110
95
  ## Testing
111
96
 
112
97
  ```bash
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FuncBot
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.5"
5
5
  end
@@ -4,6 +4,8 @@ module FuncBot
4
4
 
5
5
  def generate_function
6
6
  template "function.rb", "app/lib/func_bot/functions/#{file_name}_function.rb"
7
+ template "function_spec.rb", "spec/models/func_bot/functions/#{file_name}_function_spec.rb" if defined?(RSpec)
8
+ puts "Update the function list file at lib/func_bot/functions/list.yml with the details of your new function."
7
9
  end
8
10
 
9
11
  def append_to_functions_list
@@ -2,9 +2,8 @@ module FuncBot
2
2
  module Functions
3
3
  class <%= class_name %>Function < BaseFunction
4
4
  def execute
5
- # Add your function logic here.
6
- # eg. data = {some: "data"}
7
- # JSON.dump(data)
5
+ data = {key: "value"}
6
+ JSON.dump(data)
8
7
  end
9
8
  end
10
9
  end
@@ -0,0 +1,31 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.describe FuncBot::Functions::<%= class_name %>Function do
4
+ let(:bot) { FuncBot::Bot.new }
5
+ let(:function_response) { described_class.new(bot).execute }
6
+ let(:function_arguments) do
7
+ {
8
+ "choices" => [
9
+ {
10
+ "message" => {
11
+ "function_call" => {
12
+ "arguments" => JSON.dump({key: "value"})
13
+ }
14
+ }
15
+ }
16
+ ]
17
+ }
18
+ end
19
+
20
+ before do
21
+ bot.response = function_arguments
22
+ end
23
+
24
+ describe "#execute" do
25
+ describe "FuncBot::Functions::<%= class_name %>Function" do
26
+ it "returns the expected data" do
27
+ expect(JSON.parse(function_response)["key"]).to eq("value")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -7,7 +7,6 @@ module FuncBot
7
7
  module Functions
8
8
  class WeatherFunction < BaseFunction
9
9
  def execute
10
- bot.include_functions = false
11
10
  weather_info = {
12
11
  location: parsed_response["location"],
13
12
  temperature: 98,
@@ -3,8 +3,8 @@ namespace :func_bot do
3
3
  task install: :environment do
4
4
  command = "rails g func_bot:install setup"
5
5
  system(command)
6
- puts "Your setup was successful!"
7
- puts "You can now run `rails g func_bot:function <function_name>` to generate a new function."
8
- puts "Please update the function list file at lib/func_bot/functions/list.yml with the functions you want to include."
6
+ puts "FuncBot successfully installed."
7
+ puts "♪┏(°.°)┛┗(°.°)┓┗(°.°)┛┏(°.°)┓ "
8
+ puts "Run `rails g func_bot:function <function_name>` to generate a new function."
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: func_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - lbp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-20 00:00:00.000000000 Z
11
+ date: 2023-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -227,6 +227,7 @@ files:
227
227
  - lib/generators/func_bot/function_generator.rb
228
228
  - lib/generators/func_bot/install_generator.rb
229
229
  - lib/generators/func_bot/templates/function.rb.tt
230
+ - lib/generators/func_bot/templates/function_spec.rb.tt
230
231
  - lib/generators/func_bot/templates/list.yml
231
232
  - lib/generators/func_bot/templates/openai.rb
232
233
  - lib/generators/func_bot/templates/weather_function.rb