FuncBot
FuncBot is a Rails gem built on top of the 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.
Installation
Add this line to your application's Gemfile:
gem "func_bot"
And then execute:
$ bundle
Or install it yourself as:
$ gem install func_bot
Setup
rails g func_bot:install
- Make sure to add your OpenAI API key to your credentials file or update the
config/initializers/openai.rb
file accordingly.
openai:
api_key: your-private-key
Usage
- Generate a new function
rails g func_bot:function <function_name>
- Update your new function in the list of functions in
app/lib/func_bot/functions/list.yml
.- This list of functions will be available to the bot with every request.
- Adding good descriptions to the functions will help the bot infer when to use which function.
- If the user asks a question that is not related to a function in your list, the bot will just ask ChatGPT.
- 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.
- All functions must have an
execute
method. - Here's a sample function that returns the current weather for the given location.
module FuncBot
module Functions
class WeatherFunction < BaseFunction
def execute
weather_info = {
location: parsed_response["location"],
temperature: 98,
forecast: ["sunny", "windy"]
}
JSON.dump(weather_info)
end
end
end
end
- The
parsed_response
andresponse
methods are available to all functions.parsed_response
is a hash that contains the response relevant to your function from OpenAI.response
is the raw response from OpenAI.
Functions also have access to the
bot
attribute which returns the instance of the bot that called the function.- This is useful if you need to access the bot's history or other methods.
- 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.
bin/rails c
irb(main):001:0> bot = FuncBot::Bot.new
=> #<FuncBot::Bot:0x0000000105ecd8e8 @history=#<FuncBot::Bots::History:0x0000000105ecd848 @history=[]>>
irb(main):002:0> bot.ask "What's the weather like in Miami, FL?"
=> "The current weather in Miami, FL is sunny and windy with a temperature of 98 degrees."
irb(main):003:0>
irb(main):006:0> bot.include_functions = false
=> false
irb(main):007:0> bot.ask "What's the weather like in Miami, FL today?"
=> "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."
Testing
cd spec/dummy
bin/setup
bundle exec rspec
Contributing
Contribution directions go here.
License
The gem is available as open source under the terms of the MIT License.