mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-07-25 15:33:27 +00:00
This makes it easier to cut and paste snippets it is producing Also fine tune the prompt in an attempt to hone gpt 3.5 which is very finicky
55 lines
1.3 KiB
Ruby
55 lines
1.3 KiB
Ruby
#frozen_string_literal: true
|
|
|
|
module DiscourseAi::AiBot::Commands
|
|
class DbSchemaCommand < Command
|
|
class << self
|
|
def name
|
|
"schema"
|
|
end
|
|
|
|
def desc
|
|
"Will load schema information for specific tables in the database"
|
|
end
|
|
|
|
def parameters
|
|
[
|
|
Parameter.new(
|
|
name: "tables",
|
|
description:
|
|
"list of tables to load schema information for, comma seperated list eg: (users,posts))",
|
|
type: "string",
|
|
required: true,
|
|
),
|
|
]
|
|
end
|
|
end
|
|
|
|
def result_name
|
|
"results"
|
|
end
|
|
|
|
def description_args
|
|
{ tables: @tables.join(", ") }
|
|
end
|
|
|
|
def process(tables:)
|
|
@tables = tables.split(",").map(&:strip)
|
|
|
|
table_info = {}
|
|
DB
|
|
.query(<<~SQL, @tables)
|
|
select table_name, column_name, data_type from information_schema.columns
|
|
where table_schema = 'public'
|
|
and table_name in (?)
|
|
order by table_name
|
|
SQL
|
|
.each { |row| (table_info[row.table_name] ||= []) << "#{row.column_name} #{row.data_type}" }
|
|
|
|
schema_info =
|
|
table_info.map { |table_name, columns| "#{table_name}(#{columns.join(",")})" }.join("\n")
|
|
|
|
{ schema_info: schema_info, tables: tables }
|
|
end
|
|
end
|
|
end
|