OmniAI::Tools

LICENSE RubyGems GitHub Yard CircleCI

OmniAI::Tools is a library of pre-built tools to simplify integrating common tasks with OmniAI.

Browser

Database tools are focused on running SQL statements:

require "omniai/openai"
require "omniai/tools"

require "watir"

browser = Watir::Browser.new(:chrome)

client = OmniAI::OpenAI::Client.new
logger = Logger.new($stdout)

tools = [
  OmniAI::Tools::Browser::VisitTool,
  OmniAI::Tools::Browser::InspectTool,
  OmniAI::Tools::Browser::ButtonClickTool,
  OmniAI::Tools::Browser::LinkClickTool,
  OmniAI::Tools::Browser::TextFieldAreaSetTool,
].map { |klass| klass.new(browser:, logger:) }

puts "Type 'exit' or 'quit' to leave."

prompt = OmniAI::Chat::Prompt.build do |builder|
  builder.system <<~TEXT
    You are tasked with assisting a user in browsing the web.
  TEXT
end

loop do
  print "# "
  text = gets.strip
  break if %w[exit quit].include?(text)

  prompt.user(text)
  response = client.chat(prompt, stream: $stdout, tools:)
  prompt.assistant(response.text)
end
Type 'exit' or 'quit' to leave.
# Visit news.ycombinator.com and list the top 5 posts.

[browser] OmniAI::Tools::Browser::VisitTool#execute url="https://news.ycombinator.com"
[browser] OmniAI::Tools::Browser::InspectTool#execute

Here are the top 5 posts on Hacker News right now:

...

Database

Database tools are focused on running SQL statements:

require "omniai/openai"
require "omniai/tools"

require "sqlite3"

db = SQLite3::Database.new(":memory:")

client = OmniAI::OpenAI::Client.new
logger = Logger.new($stdout)

tools = [
  OmniAI::Tools::Database::SqliteTool.new(logger:, db:),
]

puts "Type 'exit' or 'quit' to leave."

prompt = OmniAI::Chat::Prompt.build do |builder|
  builder.system "Use tools to manage a database as requested."
end

loop do
  print "# "
  text = gets.strip
  break if %w[exit quit].include?(text)

  prompt.user(text)
  response = client.chat(prompt, stream: $stdout, tools:)
  prompt.assistant(response.text)
end
Type 'exit' or 'quit' to leave.
# Generate tables for artists, albums, songs, bands, members and populate it with data surrounding the Beatles.

CREATE TABLE artists (id INTEGER PRIMARY KEY, name TEXT NOT NULL)
CREATE TABLE bands (id INTEGER PRIMARY KEY, name TEXT NOT NULL)
CREATE TABLE members (id INTEGER PRIMARY KEY, artist_id INTEGER, band_id INTEGER, FOREIGN KEY(artist_id) REFERENCES artists(id), FOREIGNKEY(band_id) REFERENCES bands(id))"
CREATE TABLE albums (id INTEGER PRIMARY KEY, title TEXT NOT NULL, band_id INTEGER, FOREIGN KEY(band_id) REFERENCES bands(id))
CREATE TABLE songs (id INTEGER PRIMARY KEY, title TEXT NOT NULL, album_id INTEGER, FOREIGN KEY(album_id) REFERENCES albums(id))
...

Disk

Disk tools are focused on creating, updating, and deleting files and directories within a "root":

require "omniai/openai"
require "omniai/tools"

print "Root (e.g. /usr/src/project): "
root = gets.strip

client = OmniAI::OpenAI::Client.new
logger = Logger.new($stdout)

tools = [
  OmniAI::Tools::Disk::DirectoryCreateTool,
  OmniAI::Tools::Disk::DirectoryDeleteTool,
  OmniAI::Tools::Disk::FileCreateTool,
  OmniAI::Tools::Disk::FileDeleteTool,
  OmniAI::Tools::Disk::FileMoveTool,
  OmniAI::Tools::Disk::FileReplaceTool,
  OmniAI::Tools::Disk::FileReadTool,
  OmniAI::Tools::Disk::FileWriteTool,
  OmniAI::Tools::Disk::SummaryTool,
].map { |klass| klass.new(root:, logger:) }

puts "Type 'exit' or 'quit' to leave."

prompt = OmniAI::Chat::Prompt.build do |builder|
  builder.system "Use tools to manage files and directories as requested."
end

loop do
  print "# "
  text = gets.strip
  break if %w[exit quit].include?(text)

  prompt.user(text)
  response = client.chat(prompt, stream: $stdout, tools:)
  prompt.assistant(response.text)
end

Docker

Docker tools are focused on running commands through Docker via Compose:

require "omniai/openai"
require "omniai/tools"

print "Root (e.g. /usr/src/project): "
root = gets.strip

client = OmniAI::OpenAI::Client.new
logger = Logger.new($stdout)

tools = [
  OmniAI::Tools::Docker::ComposeRunTool,
].map { |klass| klass.new(root:, logger:) }

puts "Type 'exit' or 'quit' to leave."

prompt = OmniAI::Chat::Prompt.build do |builder|
  builder.system "Use tools to interact with Docker."
end

loop do
  print "# "
  text = gets.strip
  break if %w[exit quit].include?(text)

  prompt.user(text)
  response = client.chat(prompt, stream: $stdout, tools:)
  prompt.assistant(response.text)
end