mirror of
https://github.com/vrana/adminer.git
synced 2025-08-05 22:27:24 +02:00
New plugin: AI prompt in SQL command creating the queries with Google Gemini
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
- Plugins: autoload plugins from adminer-plugins/
|
||||
- Plugins: configure plugins with adminer-plugins.php
|
||||
- Plugins: Display loaded plugins in server overview
|
||||
- New plugin: AI prompt in SQL command generating the queries with Google Gemini
|
||||
- New plugin: IMAP driver created for fun
|
||||
- New plugin: Display links to tables referencing current row
|
||||
- New plugin: Allow switching light and dark mode (bug #926)
|
||||
|
@@ -263,6 +263,11 @@ class Adminer {
|
||||
return shorten_utf8(trim($query), 1000);
|
||||
}
|
||||
|
||||
/** Print HTML code just before the Execute button in SQL command
|
||||
*/
|
||||
function sqlPrintAfter() {
|
||||
}
|
||||
|
||||
/** Description of a row in a table
|
||||
* @param string
|
||||
* @return string SQL expression, empty string for no description
|
||||
|
@@ -245,6 +245,11 @@ class Plugins extends Adminer {
|
||||
return $this->applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function sqlPrintAfter() {
|
||||
$args = func_get_args();
|
||||
return $this->applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function rowDescription($table) {
|
||||
$args = func_get_args();
|
||||
return $this->applyPlugin(__FUNCTION__, $args);
|
||||
|
@@ -235,7 +235,9 @@ if (!isset($_GET["import"])) {
|
||||
echo "<p>";
|
||||
textarea("query", $q, 20);
|
||||
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history")) . "');");
|
||||
echo "<p>$execute\n";
|
||||
echo "<p>";
|
||||
$adminer->sqlPrintAfter();
|
||||
echo "$execute\n";
|
||||
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
|
||||
|
||||
} else {
|
||||
|
58
plugins/sql-gemini.php
Normal file
58
plugins/sql-gemini.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/** AI prompt in SQL command generating the queries with Google Gemini
|
||||
* Beware that this sends your whole database structure (not data) to Google Gemini.
|
||||
* @link https://www.adminer.org/static/plugins/sql-gemini.gif
|
||||
* @link https://gemini.google.com/
|
||||
* @link https://www.adminer.org/plugins/#use
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
|
||||
*/
|
||||
class AdminerSqlGemini {
|
||||
private $apiKey;
|
||||
private $model;
|
||||
|
||||
/**
|
||||
* @param string Get API key at: https://aistudio.google.com/apikey
|
||||
* @param string Available models: https://ai.google.dev/gemini-api/docs/models#available-models
|
||||
*/
|
||||
function __construct($apiKey, $model = "gemini-2.0-flash") {
|
||||
$this->apiKey = $apiKey;
|
||||
$this->model = $model;
|
||||
}
|
||||
|
||||
function headers() {
|
||||
if ($_POST["gemini"] && !isset($_POST["query"])) {
|
||||
$prompt = "I have a database with this structure:\n\n";
|
||||
foreach (Adminer\tables_list() as $table => $type) {
|
||||
$prompt .= Adminer\create_sql($table, false, "CREATE") . ";\n\n";
|
||||
}
|
||||
$prompt .= "Give me this SQL query and nothing else:\n\n$_POST[gemini]";
|
||||
//~ echo $prompt; exit;
|
||||
$context = stream_context_create(array("http" => array(
|
||||
"method" => "POST",
|
||||
"header" => array("User-Agent: AdminerSqlGemini", "Content-Type: application/json"),
|
||||
"content" => '{"contents": [{"parts":[{"text": ' . json_encode($prompt) . '}]}]}',
|
||||
)));
|
||||
$response = json_decode(file_get_contents("https://generativelanguage.googleapis.com/v1beta/models/$this->model:generateContent?key=$this->apiKey", false, $context));
|
||||
$text = $response->candidates[0]->content->parts[0]->text;
|
||||
echo preg_replace('~```sql\n(.*\n)```~s', '\1', $text) . "\n";
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
function sqlPrintAfter() {
|
||||
echo "<p><textarea name='gemini' rows='5' cols='50' title='AI prompt'>" . Adminer\h($_POST["gemini"]) . "</textarea>\n";
|
||||
echo "<p><input type='button' value='Gemini'>" . Adminer\script("qsl('input').onclick = function () { ajax(
|
||||
'',
|
||||
req => {
|
||||
qs('textarea.sqlarea').value = req.responseText;
|
||||
const sqlarea = qs('pre.sqlarea');
|
||||
sqlarea.textContent = req.responseText;
|
||||
sqlarea.oninput(); // syntax highlighting
|
||||
},
|
||||
'gemini=' + encodeURIComponent(this.form['gemini'].value)
|
||||
); }");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user