From df49bc9b269d041256e521bb79b4adfb96f176a5 Mon Sep 17 00:00:00 2001 From: Norm Rasmussen Date: Mon, 4 Dec 2023 13:32:48 -0500 Subject: [PATCH] Got the database setup and am able to pull a random word from the query. I can read the themes table and have the async functions setup, but not yet working as expected. There are a few test scripts in there that need to be cleaned up before pushing to main. --- application/__init__.py | 18 +++ .../__pycache__/__init__.cpython-311.pyc | Bin 449 -> 1818 bytes .../__pycache__/routes.cpython-311.pyc | Bin 4555 -> 6987 bytes application/dbmodels.py | 0 application/routes.py | 123 +++++++++++------- 5 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 application/dbmodels.py diff --git a/application/__init__.py b/application/__init__.py index 36df6ff..e3d8e33 100644 --- a/application/__init__.py +++ b/application/__init__.py @@ -1,7 +1,25 @@ from flask import Flask from config import Config +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() app = Flask(__name__) app.config.from_object(Config) +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///words_prompts.db" +db = SQLAlchemy(app) + +class AllWords(Base, db.Model): + word = db.Column(db.String, primary_key=True) + + def __init__(self, word): + self.word = word + +class Themes(Base, db.Model): + themes = db.Column(db.String, primary_key=True) + + def __init__(self, themes): + self.themes = themes import application.routes diff --git a/application/__pycache__/__init__.cpython-311.pyc b/application/__pycache__/__init__.cpython-311.pyc index 781aa63cb94017e1c7e332ac9d9887078273bbcd..182fbd873f0027a2089951a7388a9b56033a09a9 100644 GIT binary patch literal 1818 zcmcgs&2JM&6rcUH;QXA7I;?N3wz!v4u2BAs@L#Y(ff{j}5Wwr56QiuI8vuj#M z92Ut33su60NV#%KiPAsDt|Hai6H-sT1*IoWeQ(zr>_kH9rL!|{-@JM6&Aj)UH@{^v zDFW@mzDYfvkiT#eH+jMw=Qu)ki9rm`Bo?P~9P+%$TY@TtykLr!q)H(#nzEHp6CB|Q zP3(b-gV-NYlOW^h+#dKlfDtt{MN?a_chp`fF*p6E!mJJKBu!fx@=Z_&?;xGkRMR~9 zh8T$+F_JV%(_5L?@16*!fDtwIT&On(dZ`cUWg&LOoL3hNrACVBztOzN1=3wpcOL^I z-*)Vc)+TVN+Jn`K+5CxGU6{=qv}x*0_gYV>wywK$`=a~AY=54S(_Bk5^&3ODIt}gQz?eUd1cZ+Jp*Q zQYgIBfzoCzOJ`l}G3_=_EWj7?0*vGH zKz7M9?ita5i<&`dWS?7u*hP%5$OocJ%?)-AmR+>Gbm`r9lW3tAf;)RV{}a9)0+0Aqnncz9g|zA0t6+mPc{{32qT0!3xN|2jdf*B0>ApU}Ul{8!s9I zw$puW^c$nh^~20{|1N^DgkYQ|ky~`OR$L6E4Xk^HMG(l%u=E*LUoamoXi(#N^ae02 zz5t7UA}G;cywcRG!0^Eh#9Qz-gmDG}T=GEKfLB3t*0Bu2cmwIaV^A}?V0esRajFz&MSss$*@s+9%@}ctChRrFuU@EK&nF9ZFe{QMIA;{3dH z-2$MRf)d^G)Fhx5eIU-sOinDx%+J%0kI&4@EQycTE2#X%VUwGmQks)$SHurA0OaE0 ZIEKmGY}%7E*p$T|Fi2iNMMb;ZCND2S| diff --git a/application/__pycache__/routes.cpython-311.pyc b/application/__pycache__/routes.cpython-311.pyc index 1613c24cd945de0ea7fe7541a71001a774e8dae5..7dffc39ca411d63885f63c8be4be5f8c142b92e6 100644 GIT binary patch literal 6987 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 literal 4555 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 PDPP+RVp~DP&g=gGAw(Gg diff --git a/application/dbmodels.py b/application/dbmodels.py new file mode 100644 index 0000000..e69de29 diff --git a/application/routes.py b/application/routes.py index 042082a..a160a88 100644 --- a/application/routes.py +++ b/application/routes.py @@ -4,26 +4,43 @@ Flask app that uses gpt4all to generate random song writing prompt. import os import string import random -import requests +import asyncio from flask import ( render_template, session, request, ) from gpt4all import GPT4All -from datetime import datetime, timezone, timedelta -from pathlib import Path +from datetime import timedelta from application import app -from werkzeug.middleware.profiler import ProfilerMiddleware -app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir="/root/flask-profiler/") +# , AllWords, Themes +from sqlalchemy.sql.expression import func, select +from sqlalchemy.ext.automap import automap_base +from sqlalchemy.orm import Session +from sqlalchemy import create_engine + +# from werkzeug.middleware.profiler import ProfilerMiddleware + +# app.wsgi_app = ProfilerMiddleware( +# app.wsgi_app, +# profile_dir="/Users/normrasmussen/Documents/Projects/gpt-song-prompt/flask-profiler/", +# ) + +engine = create_engine("sqlite:///words_prompts.db", pool_pre_ping=True) + +Base = automap_base() +Base.prepare(engine, reflect=True) + +Words = Base.classes.words +Themes = Base.classes.themes app.config.update(SECRET_KEY=os.urandom(24)) app.permanent_session_lifetime = timedelta(minutes=30) MODEL = GPT4All( model_name="gpt4all-falcon-q4_0.gguf", -# model_path=(Path.home() / ".cache" / "gpt4all"), + # model_path=(Path.home() / ".cache" / "gpt4all"), allow_download=False, ) TIME_SIGNATURES = ["2/4", "3/4", "4/4", "2/2", "6/8", "9/8", "12/8"] @@ -34,8 +51,46 @@ SIGN = ["b", "#"] # Option 2 MINOR = string.ascii_letters[0:7] MAJOR = string.ascii_letters[26:33] -# and then use this: -# output = random.choice(KEYS)+random.choice(SIGN) + +async def grab_word(): + print("Running Grab_word func") + await asyncio.sleep(1) + while True: + with Session(engine) as word_session: + random_word = word_session.query(Words.words) + random_word = random_word.order_by(func.random()).first() + random_word = str(random_word)[4:-4] + print(f"Word func, random word: {random_word}") + return random_word + + +async def every(__seconds: float, func, *args, **kwargs): + while True: + func(*args, **kwargs) + await asyncio.sleep(__seconds) + + +async def main(): + asyncio.ensure_future(grab_word()) + +with app.app_context(): + loop = asyncio.get_event_loop() + loop.run_until_complete(grab_word()) + loop.run_forever() + + +async def get_theme(): + # SYSTEM_TEMPLATE = "A single sentence based on a word." + # PROMPT_TEMPLATE = "### Instruction: {0} \n### Response: " + WORD_PROMPT = await grab_word() + print(f"Theme Func, word: {WORD_PROMPT}") + while True: + response = MODEL.generate( + f"Tell me about {WORD_PROMPT}.", temp=0.7, callback=stop_on_token_callback) + with Session(engine) as thm_session: + print(f"Theme func, response: {response}") + thm_session.add(response) + thm_session.commit() @app.route("/") @@ -48,58 +103,30 @@ def main_prompt(): @app.route("/all", methods=["GET", "POST"]) def prompt_all(): - print("Running Prompt_all func") - WORD_PROMPT = str(requests.get("https://random-word-api.herokuapp.com/word").text)[ - 2:-2 - ] - SYSTEM_TEMPLATE = 'A single sentence based on a word.' - PROMPT_TEMPLATE = '### Instruction: {0} \n### Response: ' if request.method == "POST": message = "Results are here" session["output_key"] = random.choice(KEYS) + random.choice(SIGN) session["output_signature"] = random.choice(TIME_SIGNATURES) - session["word_prompt"] = WORD_PROMPT + with Session(engine) as word_session: + random_theme = word_session.query(Themes.themes) + session["output_theme"] = random_theme.order_by(func.random()).first() + + # with MODEL.chat_session(SYSTEM_TEMPLATE, PROMPT_TEMPLATE): # response = MODEL.generate(f"A single sentence about {WORD_PROMPT}.", temp=0.7) # session["output_theme"] = str(response.splitlines()[0]) - response = MODEL.generate(f"Tell me about {WORD_PROMPT}.", temp=0.7, callback=stop_on_token_callback) - session["output_theme"] = response - - # numresp = len(response)- 1 - # if numresp <= 1: - # session["output_theme"] = str(response) - # randresp = random.randrange(0, numresp) - # session["output_theme"] = response return render_template("single-button.html", title="Results", message=message) return render_template("single-button.html", title="Single Option") -def stop_on_token_callback(token_id, token_string): - if '.' in token_string: + +def stop_on_token_callback(token_string): + """ + Function to limit return length of the gpt4all response. Period indicates a sentence. + """ + if "." in token_string: return False - else: - return True - -@app.route("/") -def prompt_instrument(): - pass - - -@app.route("/") -def prompt_key(): - pass - - -@app.route("/") -def prompt_timesig(): - pass - - -@app.route("/") -def prompt_influence(): - pass - response = MODEL.generate("The writing prompt is about the weather:", temp=0) - session["list_response"] = response.splitlines() + return True if __name__ == "__main__":