OmniAI::Tools
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