Class: SharedTools::Tools::DatabaseTool

Inherits:
RubyLLM::Tool
  • Object
show all
Defined in:
lib/shared_tools/tools/database_tool.rb

Overview

Examples:

db = Sqlite3::Database.new("./db.sqlite")
driver = SharedTools::Tools::Database::SqliteDriver.new(db:)
tool = SharedTools::Tools::DatabaseTool.new(driver:)
tool.execute(statements: ["SELECT * FROM people"])

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(driver: nil, logger: nil) ⇒ DatabaseTool

Returns a new instance of DatabaseTool.

Parameters:

  • driver (SharedTools::Tools::Database::BaseDriver) (defaults to: nil)

    database driver (SqliteDriver, PostgresDriver, etc.) Required for execute, but optional for instantiation to support RubyLLM tool discovery

  • logger (Logger) (defaults to: nil)

    optional logger



68
69
70
71
# File 'lib/shared_tools/tools/database_tool.rb', line 68

def initialize(driver: nil, logger: nil)
  @driver = driver
  @logger = logger || RubyLLM.logger
end

Instance Attribute Details

#driver=(value) ⇒ Object (writeonly)

Set driver after instantiation (useful when tool is discovered by RubyLLM)



74
75
76
# File 'lib/shared_tools/tools/database_tool.rb', line 74

def driver=(value)
  @driver = value
end

Class Method Details

.nameObject



13
# File 'lib/shared_tools/tools/database_tool.rb', line 13

def self.name = 'database_tool'

Instance Method Details

#execute(statements:) ⇒ Array<Hash>

Examples:

tool = SharedTools::Tools::Database::BaseTool.new
tool.execute(statements: ["SELECT * FROM people"])

Parameters:

  • statements (Array<String>)

Returns:

  • (Array<Hash>)

Raises:

  • (ArgumentError)


83
84
85
86
87
88
89
90
91
92
93
# File 'lib/shared_tools/tools/database_tool.rb', line 83

def execute(statements:)
  raise ArgumentError, "driver is required for DatabaseTool#execute. Set via initialize(driver:) or tool.driver=" if @driver.nil?

  [].tap do |executions|
    statements.map do |statement|
      execution = perform(statement:).merge(statement:)
      executions << execution
      break unless execution[:status].eql?(:ok)
    end
  end
end

#perform(statement:) ⇒ Object



95
96
97
98
99
100
101
# File 'lib/shared_tools/tools/database_tool.rb', line 95

def perform(statement:)
  @logger&.info("#perform statement=#{statement.inspect}")

  @driver.perform(statement:).tap do |result|
    @logger&.info(JSON.generate(result))
  end
end