Added Modules to Gui
This commit is contained in:
parent
5cf1dd708a
commit
b1100e8338
13
gui/config/config.json.sample
Normal file
13
gui/config/config.json.sample
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"database":
|
||||
{
|
||||
"dbtype": "PostgreSQL",
|
||||
"ip": "localhost",
|
||||
"password": "password",
|
||||
"user": "admin",
|
||||
"port": "5432"
|
||||
"database": "PostgreSQL",
|
||||
},
|
||||
"apikey": "sk-abc***"
|
||||
}
|
||||
|
||||
72
gui/database/postgresql.py
Normal file
72
gui/database/postgresql.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
import psycopg2
|
||||
import os
|
||||
|
||||
class Postgres:
|
||||
def __init__(self, ip, port, username, password, database):
|
||||
self.db_ip = ip
|
||||
self.db_port = port
|
||||
self.db_username = username
|
||||
self.db_password = password
|
||||
self.db_name = database
|
||||
|
||||
self.conn = psycopg2.connect(
|
||||
host=self.db_ip,
|
||||
port=self.db_port,
|
||||
user=self.db_username,
|
||||
password=self.db_password,
|
||||
database=self.db_name
|
||||
)
|
||||
self.tables = []
|
||||
self.tableschema = {}
|
||||
self.get_schema()
|
||||
|
||||
def __str__(self):
|
||||
return f'PostgreSQL Server: {self.db_ip}:{self.db_port} as {self.db_username} on database {self.db_name}'
|
||||
|
||||
def get_schema(self) -> dict:
|
||||
fetch = self.fetchall("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';")
|
||||
for item in fetch:
|
||||
self.tables.append(item[0])
|
||||
|
||||
for table in self.tables:
|
||||
fetch = self.fetchall(f"SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '{table}';")
|
||||
self.tableschema.update({table: fetch})
|
||||
|
||||
return self.tableschema
|
||||
|
||||
def fetchall(self, query: str):
|
||||
cur = self.conn.cursor()
|
||||
cur.execute(query)
|
||||
result = cur.fetchall()
|
||||
cur.close()
|
||||
return result
|
||||
|
||||
def fetchone(self, query: str):
|
||||
cur = self.conn.cursor()
|
||||
cur.execute(query)
|
||||
result = cur.fetchone()
|
||||
cur.close()
|
||||
return result
|
||||
|
||||
def fetchmany(self, query: str, size: int):
|
||||
cur = self.conn.cursor()
|
||||
cur.execute(query)
|
||||
result = cur.fetchmany(size)
|
||||
cur.close()
|
||||
return result
|
||||
|
||||
def execute(self, query: str):
|
||||
cur = self.conn.cursor()
|
||||
cur.execute(query)
|
||||
self.conn.commit()
|
||||
cur.close()
|
||||
|
||||
def executemany(self, query: str, values):
|
||||
cur = self.conn.cursor()
|
||||
cur.executemany(query, values)
|
||||
self.conn.commit()
|
||||
cur.close()
|
||||
|
||||
def close(self):
|
||||
self.conn.close()
|
||||
|
||||
67
gui/modules/aisql.py
Normal file
67
gui/modules/aisql.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
import openai
|
||||
|
||||
|
||||
class AI:
|
||||
def __init__(self, api_key):
|
||||
self.api_key = api_key
|
||||
openai.api_key = self.api_key
|
||||
self.convertlog = []
|
||||
|
||||
def humantosql(self, text: str, dbtype: str, tableschema: list) -> str:
|
||||
if not self.convertlog:
|
||||
self.convertlog = [{"role": "system",
|
||||
"content": f"You convert Human Language to SQL. Only answer as an Valid SQL Statement. Always modify your previous answer and do not create something new. You are using this Database: {dbtype}. For better context here are the tables and columns: {tableschema}"}]
|
||||
|
||||
prompt = {"role": "user", "content": text}
|
||||
self.convertlog.append(prompt)
|
||||
self.response = openai.ChatCompletion.create(
|
||||
model="gpt-4",
|
||||
messages=self.convertlog
|
||||
)
|
||||
self.response = self.response['choices'][0]['message']['content']
|
||||
self.convertlog.append({"role": "assistant", "content": self.response})
|
||||
|
||||
if self.validate(self.response) is True:
|
||||
return self.response
|
||||
else:
|
||||
valid = self.humantosql("Only answer as a Valid SQL-Statement don't add any additional text", dbtype,
|
||||
tableschema)
|
||||
return valid
|
||||
|
||||
def decide(self, sql: str) -> str:
|
||||
prompt = [{"role": "system",
|
||||
"content": "You have to decide which function it should use. Answer with [FETCHALL] to fetch all, [FETCHONE] to fetch only one, [FETCHMANY=N] to fetchmany with N being the range, [EXECUTE] to just execute, [EXECUTEMANY=N] to execute many with N being the range"},
|
||||
{"role": "user", "content": sql}]
|
||||
|
||||
response = openai.ChatCompletion.create(
|
||||
model="gpt-4",
|
||||
messages=prompt
|
||||
)
|
||||
|
||||
response = response['choices'][0]['message']['content']
|
||||
|
||||
return response
|
||||
|
||||
def validate(self, sql: str) -> bool:
|
||||
prompt = [{"role": "system",
|
||||
"content": "You check if the User Input is a valid SQL-Statement. You also return False if there is any kind of text before and after the statement. You only return True or False. Most important: ONLY ANSWER True OR False."},
|
||||
{"role": "user", "content": sql}]
|
||||
|
||||
valid = openai.ChatCompletion.create(
|
||||
model="gpt-4",
|
||||
messages=prompt
|
||||
)
|
||||
valid = valid['choices'][0]['message']['content']
|
||||
if valid == "True":
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def test_key(self) -> bool:
|
||||
openai.api_key = str(self.api_key)
|
||||
try:
|
||||
openai.Engine.list()
|
||||
return True
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return False
|
||||
Loading…
Reference in New Issue
Block a user