This branch with celery async workers has no code errors, but running a GPT thread on the celery worker causes a SIGFAULT failure. Need to try this on a server instead of my local machine to see if it will run without failing. If it still fails, then I need to separate my async tasks and the flask app with the tasks dumping into the db and flask just pulling out of the DB.

This commit is contained in:
Normanras
2023-12-07 17:25:43 -05:00
parent adba1147ca
commit b8e3fe7e75
97 changed files with 128 additions and 178987 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,28 +0,0 @@
import requests
from sqlalchemy import text, create_engine
from sqlalchemy.orm import Session
from time import sleep
# engine = create_engine("sqlite+pysqlite:///allwords.db", echo=True)
# with Session(engine) as connect:
# with engine.connect() as connect:
# selections = connect.execute(text("SELECT words from all_words ORDER BY RANDOM() LIMIT 1"))
# print(selections)
# print(type(selections))
# for row in selections:
# y = row.words
# print(y)
# connect.execute(text("CREATE TABLE IF NOT EXISTS all_words (words TEXT(55))"))
headers = {"content-type": "application/json"}
words = requests.get("https://random-word-api.herokuapp.com/all", headers=headers).json()
words = str(words)[1:-1]
words = words.replace(',','\n')
f = open('./data.txt', 'w')
f.write(words)
f.close()
# for word in words:
# sleep(1)
# connect.execute(text(f"INSERT INTO all_words VALUES (:word)"), {"word": word})
# connect.commit()

View File

@ -1 +0,0 @@
from application import app

View File

@ -1,32 +0,0 @@
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base
from .utils import make_celery
app = Flask(__name__)
# app.config.from_object(Config)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///words_prompts.db"
app.config["CELERY_CONFIG"] = {"broker_url": "redis://localhost"}
db = SQLAlchemy(app)
celery = make_celery(app)
celery.set_default()
Base = declarative_base()
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

View File

@ -1,76 +0,0 @@
"""
Flask app that uses gpt4all to generate random song writing prompt.
"""
import os
import string
from uuid import uuid4
import random
from flask import (
render_template,
session,
request,
)
from redbeat import RedBeatSchedulerEntry
from application import app
from sqlalchemy.sql.expression import func
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from celery import current_app as celery_app
# from celery.schedules import schedule
from werkzeug.middleware.profiler import ProfilerMiddleware
from .background_tasks import grab_word
app.wsgi_app = ProfilerMiddleware(
app.wsgi_app,
profile_dir="/Users/normrasmussen/Documents/Github/song-prompt-webapp/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)
TIME_SIGNATURES = ["2/4", "3/4", "4/4", "2/2", "6/8", "9/8", "12/8"]
# Need to decide between manually entering this list or using ascii_letters, below
KEYS = ["A", "B", "C", "D", "E", "F", "G"]
SIGN = ["b", "#"]
# Option 2
MINOR = string.ascii_letters[0:7]
MAJOR = string.ascii_letters[26:33]
@app.route("/", methods=["GET", "POST"])
def prompt_all():
"""
Main function that loads the prompt
"""
schedule_id = str(uuid4())
interval = celery_app.schedule(run_every=60)
entry = RedBeatSchedulerEntry(
schedule_id, "application.background_tasks.grab_word", interval
)
entry.save()
if request.method == "POST":
message = "Results are here"
session["output_key"] = random.choice(KEYS) + random.choice(SIGN)
session["output_signature"] = random.choice(TIME_SIGNATURES)
with Session(engine) as word_session:
random_theme = word_session.query(Themes.themes)
theme = random_theme.order_by(func.random()).first()
session["output_theme"] = str(theme)[3:-3]
return render_template("single-button.html", title="Results", message=message)
return render_template("single-button.html", title="Single Option")
if __name__ == "__main__":
app.run(debug=True)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -1,180 +0,0 @@
/* 1.0 - Foundational Styling */
:root {
--primary: #66C92D;
--text-light: #FFFFFF;
--text-dark: #101314;
--background: #667E8A;
--background-light: #E5E9EB;
height: 100%;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: inherit;
}
body {
background: linear-gradient(
15deg, #ff97c0, #ffa964, #ffff8e, #00ffc8, #d26aff
);
background-size: 700% 550%;
animation: gradient 7s ease-in-out infinite;
color: var(--text-dark);
font-family: 'Space Grotesk', sans-serif;
background-color: var(--background-light);
box-sizing: border-box;
text-align: center;
width: 100%;
}
@keyframes gradient {
0% {
background-position: 0% 79%;
}
50% {
background-position: 100% 22%;
}
100% {
background-position: 0% 79%;
}
}
html {
display: flex;
justify-content: center;
}
header {
height: 10%;
}
.prompt-button {
background-color: rgba(255, 255, 255, 0.5);
border-radius: 4px;
margin-right: 4px;
border: 1px solid black;
white-space: nowrap;
cursor: pointer;
font-size: 14px;
line-height: 16px;
padding: 8px 16px 8px 12px;
width: 300px
}
.prompt {
padding: 5px;
}
.results-container {
display: inline-block;
width: 60%;
text-align: center;
}
/* MODAL POPUP */
.first-time-user-popup {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1000;
display: flex;
padding: 1em;
background-color: rgba(0, 0, 0, 0.75);
transition: 0.25s ease-out;
}
.first-time-user-popup.is-active {
visibility: visible;
opacity: 1;
pointer-events: auto;
}
.first-time-user-popup-container {
width: 100%;
max-width: 600px;
margin: auto;
transform: translateY(-1em) scale(0.95);
background-color: white;
transition: transform 0.25s ease-out;
border-radius: 8px;
}
.first-time-user-popup.is-active .first-time-user-popup-container {
transform: translateY(0) scale(1);
}
.modal-headline {
font-size: 20px;
line-height: normal;
font-weight: 500;
margin-bottom: 32px;
text-align: center;
color: #F7492D;
}
.modal-links {
display: block;
}
.modal-x-out {
float: left;
border: none;
background: transparent;
}
.modal-links a {
border: 2px solid #3c228a;
background: #F7492D;
padding: 8px 16px;
text-align: center;
width: calc(50% - 8px);
margin: 0 8px;
border-radius: 30px;
color: #fff;
text-decoration: none;
font-weight: 700;
transition: all 0.2s;
}
.modal-links a.secondary {
background: transparent;
color: #3c228a;
}
.modal-links a:hover {
border: 2px solid #13014a;
background: #13014a;
}
.modal-links a.secondary:hover {
border: 2px solid #13014a;
background: #ebe8f3;
color: #13014a;
}
.first-time-user-popup-content {
padding: 32px 16px;
}
@media (min-width: 768px) {
.first-time-user-popup-content {
padding: 32px;
}
.modal-headline {
font-size: 24px;
}
.modal-links a {
min-height: 40px;
line-height: 40px;
}
}
.loading {
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><radialGradient id="a12" cx=".66" fx=".66" cy=".3125" fy=".3125" gradientTransform="scale(1.5)"><stop offset="0" stop-color="%23FF156D"></stop><stop offset=".3" stop-color="%23FF156D" stop-opacity=".9"></stop><stop offset=".6" stop-color="%23FF156D" stop-opacity=".6"></stop><stop offset=".8" stop-color="%23FF156D" stop-opacity=".3"></stop><stop offset="1" stop-color="%23FF156D" stop-opacity="0"></stop></radialGradient><circle transform-origin="center" fill="none" stroke="url(%23a12)" stroke-width="15" stroke-linecap="round" stroke-dasharray="200 1000" stroke-dashoffset="0" cx="100" cy="100" r="70"><animateTransform type="rotate" attributeName="transform" calcMode="spline" dur="2" values="360;0" keyTimes="0;1" keySplines="0 0 1 1" repeatCount="indefinite"></animateTransform></circle><circle transform-origin="center" fill="none" opacity=".2" stroke="%23FF156D" stroke-width="15" stroke-linecap="round" cx="100" cy="100" r="70"></circle></svg>')
}

View File

@ -1 +0,0 @@
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><radialGradient id='a12' cx='.66' fx='.66' cy='.3125' fy='.3125' gradientTransform='scale(1.5)'><stop offset='0' stop-color='#FF156D'></stop><stop offset='.3' stop-color='#FF156D' stop-opacity='.9'></stop><stop offset='.6' stop-color='#FF156D' stop-opacity='.6'></stop><stop offset='.8' stop-color='#FF156D' stop-opacity='.3'></stop><stop offset='1' stop-color='#FF156D' stop-opacity='0'></stop></radialGradient><circle transform-origin='center' fill='none' stroke='url(#a12)' stroke-width='15' stroke-linecap='round' stroke-dasharray='200 1000' stroke-dashoffset='0' cx='100' cy='100' r='70'><animateTransform type='rotate' attributeName='transform' calcMode='spline' dur='2' values='360;0' keyTimes='0;1' keySplines='0 0 1 1' repeatCount='indefinite'></animateTransform></circle><circle transform-origin='center' fill='none' opacity='.2' stroke='#FF156D' stroke-width='15' stroke-linecap='round' cx='100' cy='100' r='70'></circle></svg>

View File

@ -1,20 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="shortcut icon" href="{{ url_for('static', filename='np-favicon.png') }}">
<title>Song Writing Prompt Machine</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename="styles.css") }}" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
</head>
<body>
{% block content %} {% endblock %}
</body>
</html>

View File

@ -1,3 +0,0 @@
<!DOCTYPE html>
<header class="header">
</header>

View File

@ -1,44 +0,0 @@
<!DOCTYPE html>
{% include 'head.html' %}
{% include 'header.html' %}
{% block content %}
<div class="main-container">
<h1> Get Inspired with a Song Writing Prompt! </h1>
<h3> Please select from below </h3>
<h2> {{ session.list_response }} </strong></h4>
<div class="prompt-questions">
<form class="prompt"
action="{{ url_for("prompt_influence")}}"
method="post">
<input id="fields" type="keywords" name="keyword-influence">
<input class="prompt-button"
id="fields" type="submit" value="Submit Prompt Only">
</form>
<form class="prompt"
action="{{ url_for("prompt_key")}}"
method="post">
<input class="prompt-button"
id="fields" type="submit" value="Submit Prompt Key Only">
</form>
<form class="prompt"
action="{{ url_for("prompt_timesig")}}"
method="post">
<input class="prompt-button"
id="fields" type="submit" value="Submit Prompt Time Signature Only">
</form>
<form class="prompt"
action="{{ url_for("prompt_instrument")}}"
method="post">
<input class="prompt-button"
id="fields" type="submit" value="Submit Prompt instrument Only">
</form>
<form class="prompt"
action="{{ url_for("prompt_all")}}"
method="post">
<input class="prompt-button"
id="fields" type="submit" value="Submit Prompt all Only">
</form>
</div>
</div>
{% endblock %}

View File

@ -1,36 +0,0 @@
<div
class="first-time-user-popup"
id="firstTimeUsers"
role="dialog"
aria-labelledby="dialogTitle"
aria-describedby="dialogContent"
aria-hidden="true">
<section class="first-time-user-popup-container">
<div id="dialogContent" class="first-time-user-popup-content">
<input
type="button"
class="modal-x-out"
value=&#10006
onclick="document.getElementById('firstTimeUsers').remove();">
<div class="modal-headline">Here you go! Now go write a song!</div>
<div class="modal-links">
<h2> Key: </h2>
<h3> {{ session.output_key }} </h3>
<p></p>
<h2> Time Signature: </h2>
<h3> {{ session.output_signature }} </h3>
<p></p>
<h2> Theme: </h2>
<h3> {{ session.output_theme }} </h3>
<p></p>
</div>
</div>
</section>
</div>
<script>
var elements = $('#firstTimeUsers');
if (elements.length === 1) {
$('#loading').hide();
}
</script>

View File

@ -1,18 +0,0 @@
<!DOCTYPE html>
{% include 'head.html' %}
{% include 'header.html' %}
{% block content %}
<div class="main-container" style="padding-bottom:10px;">
<h1> Here are your results! </h1>
<p></p>
<div class="results-container">
<h2> Key: </h2>
<h3> {{ session.output_key }} </h3>
<h2> Time Signature: </h2>
<h3> {{ session.output_signature }} </h3>
<h2> Theme: </h2>
<h3> {{ session.output_theme }} </h3>
</div>
</div>
{% endblock %}

View File

@ -1,26 +0,0 @@
<!DOCTYPE html>
{% include 'head.html' %}
{% include 'header.html' %}
{% block content %}
<div class="main-container">
{% if message %}
{% include 'modal_results.html' %}
{% endif %}
<h1> Get Inspired with a Song Writing Prompt! </h1>
<h2> {{ session.list_response }} </strong></h4>
<div class="prompt-questions">
<form class="prompt"
action="{{ url_for("prompt_all")}}"
method="post">
<input class="prompt-button"
id="fields" type="submit" value="Click for Inspiration"
onclick="$('#loading').show();">
</form>
<div id="loading" style="display:none;">
<img src={{ url_for('static', filename='tube-spinner.svg') }} width="200px">
Please be patient as we load up on inspiration!
</div>
</div>
</div>
{% endblock %}

View File

@ -1,26 +0,0 @@
import asyncio
import requests
async def grab_words():
while True:
await asyncio.sleep(.5)
word = str(requests.get("https://random-word-api.herokuapp.com/word").text)[2:-2]
print(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_words())
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(grab_words())
loop.run_forever()
# loop.create_task(every(1, grab_words()))

View File

@ -1,4 +0,0 @@
import os
class Config(object):
SECRET_KEY = os.environ.get("SONGPROMPT") or "song-prompt"

178187
data.txt

File diff suppressed because it is too large Load Diff

BIN
dump.rdb

Binary file not shown.

View File

@ -1,53 +0,0 @@
from gpt4all import GPT4All
import requests
from pathlib import Path
def prompt():
MODEL = GPT4All(
model_name="gpt4all-falcon-q4_0.gguf",
# model_path=(Path.home() / ".cache" / "gpt4all"),
# /root/.pyenv/versions/gpt-song-prompt/lib/python3.10/site-packages/gpt4all
allow_download=False,
)
WORD_PROMPT = str(requests.get("https://random-word-api.herokuapp.com/word").text)[
2:-2
]
# SYSTEM_TEMPLATE = "A creative response about a word."
# PROMPT_TEMPLATE = "### Instruction: {0} \n### Response: "
response = MODEL.generate(
f"Give me a writing prompt where the writer has to write a song based on {WORD_PROMPT}.",
temp=1,
callback=stop_on_token_callback,
)
response2 = MODEL.generate(
f"Give me a writing prompt about {WORD_PROMPT}.",
#"Tell me one-sentence about Jitteriest.",
temp=1,
callback=stop_on_token_callback,
)
print("Make up a short story response:")
print(response)
print("\n")
print("Tell me one-sentence story about.")
print(response2)
# with MODEL.chat_session(SYSTEM_TEMPLATE, PROMPT_TEMPLATE):
# response = MODEL.generate(f"A single sentence about {WORD_PROMPT}.", temp=0.7)
# print(WORD_PROMPT)
# resp = str(response.splitlines()[0])
# print(resp)
def stop_on_token_callback(token_id, token_string):
# per_amt = token_string.count('.')
# while per_amt < 3:
# return True
# return False
if "." in token_string:
return False
return True
if __name__ == "__main__":
prompt()

32
gpt_test_loader.py Normal file
View File

@ -0,0 +1,32 @@
from gpt4all import GPT4All
import requests
from pathlib import Path
def prompt():
MODEL = GPT4All(
model_name="gpt4all-falcon-q4_0.gguf",
# model_path=(Path.home() / ".cache" / "gpt4all"),
# /root/.pyenv/versions/gpt-song-prompt/lib/python3.10/site-packages/gpt4all
allow_download=False,
)
WORD_PROMPT = str(requests.get("https://random-word-api.herokuapp.com/word").text)[
2:-2
]
SYSTEM_TEMPLATE = "A creative response about a word."
PROMPT_TEMPLATE = "### Instruction: {0} \n### Response: "
response = MODEL.generate(
f"Tell me something interesting about {WORD_PROMPT}.",
temp=0.7,
callback=stop_on_token_callback,
)
print(response)
def stop_on_token_callback(token_id, token_string):
if "." in token_string:
return False
return True
if __name__ == "__main__":
prompt()

20
project/__init__.py Normal file
View File

@ -0,0 +1,20 @@
from flask import Flask
from .extensions import db
from .views import main
from .utils import make_celery
def create_app():
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///db.sqlite3"
app.config["SECRET_KEY"] = "super-secret-key"
app.config["CELERY_CONFIG"] = {"broker_url": "redis://localhost"}
db.init_app(app)
app.register_blueprint(main)
celery = make_celery(app)
celery.set_default()
return app, celery

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
project/extensions.py Normal file
View File

@ -0,0 +1,3 @@
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

8
project/models.py Normal file
View File

@ -0,0 +1,8 @@
from datetime import datetime
from .extensions import db
class Result(db.Model):
id = db.Column(db.Integer, primary_key=True)
text = db.Column(db.String(100), nullable=False)
date_created = db.Column(db.DateTime, default=datetime.utcnow)

View File

@ -1,11 +1,15 @@
from celery import shared_task from celery import shared_task
from time import sleep
from redbeat import RedBeatSchedulerEntry from redbeat import RedBeatSchedulerEntry
from celery import current_app as celery_app from sqlalchemy import create_engine
from sqlalchemy.sql.expression import func, select, insert from sqlalchemy.sql.expression import func, select, insert
from sqlalchemy.ext.automap import automap_base from sqlalchemy.ext.automap import automap_base
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from gpt4all import GPT4All from gpt4all import GPT4All
from sqlalchemy.orm import Session
from celery import current_app as celery_app
from .extensions import db
from .models import Result
engine = create_engine("sqlite:///words_prompts.db", pool_pre_ping=True) engine = create_engine("sqlite:///words_prompts.db", pool_pre_ping=True)
@ -15,7 +19,6 @@ Base.prepare(engine, reflect=True)
Words = Base.classes.words Words = Base.classes.words
Themes = Base.classes.themes Themes = Base.classes.themes
MODEL = GPT4All( MODEL = GPT4All(
model_name="gpt4all-falcon-q4_0.gguf", model_name="gpt4all-falcon-q4_0.gguf",
# model_path=(Path.home() / ".cache" / "gpt4all"), # model_path=(Path.home() / ".cache" / "gpt4all"),
@ -24,7 +27,7 @@ MODEL = GPT4All(
@shared_task @shared_task
def grab_word(): def my_task(text, schedule_name):
while True: while True:
with Session(engine) as word_session: with Session(engine) as word_session:
random_word = word_session.query(Words.words) random_word = word_session.query(Words.words)
@ -40,6 +43,16 @@ def grab_word():
word_session.execute(insert(Themes).values(themes=response)) word_session.execute(insert(Themes).values(themes=response))
word_session.commit() word_session.commit()
try:
entry = RedBeatSchedulerEntry.from_key(
"redbeat:" + schedule_name, app=celery_app
)
except KeyError:
entry = None
if entry:
entry.delete()
def stop_on_token_callback(token_id, token_string): def stop_on_token_callback(token_id, token_string):
""" """
@ -49,35 +62,3 @@ def stop_on_token_callback(token_id, token_string):
if "." in token_string: if "." in token_string:
return False return False
return True return True
# def every(__seconds: float, func, *args, **kwargs):
# while True:
# func(*args, **kwargs)
# await asyncio.sleep(__seconds)
#
#
# 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(random_word):
# print("Get Theme function running.")
# # SYSTEM_TEMPLATE = "A single sentence based on a word."
# # PROMPT_TEMPLATE = "### Instruction: {0} \n### Response: "
# random_word = await random_word
# print(f"Theme Func, word: {random_word}")
# while True:
# response = MODEL.generate(
# f"Tell me about {random_word}.", 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()

29
project/views.py Normal file
View File

@ -0,0 +1,29 @@
from flask import Blueprint
from redbeat import RedBeatSchedulerEntry
from redbeat.schedules import rrule
from datetime import datetime
from celery import current_app as celery_app
from uuid import uuid4
from .tasks import my_task
main = Blueprint("main", __name__)
@main.route("/", methods=["GET"])
def index():
# my_task.delay("Hello World!")
schedule_name = str(uuid4())
dt = datetime.utcnow()
interval = rrule(freq="MINUTELY", dtstart=dt)
entry = RedBeatSchedulerEntry(
schedule_name,
"project.tasks.my_task",
interval,
args=["From the scheduler"],
kwargs={"schedule_name": schedule_name},
app=celery_app,
)
entry.save()
return "Created the schedule!"

View File

@ -1,4 +0,0 @@
{
"venv" : "songprompt",
"venvPath" : "/Users/normrasmussen/.pyenv/versions"
}

View File

@ -1,224 +1,29 @@
absl-py==1.4.0 amqp==5.1.1
adafruit-nrfutil==0.5.3.post16 async-timeout==4.0.3
aiohttp==3.8.4 billiard==4.1.0
aiosignal==1.3.1 blinker==1.6.2
albumentations==0.4.3 celery==5.3.4
altair==5.0.1
amqp==5.2.0
antlr4-python3-runtime==4.8
anyio==3.7.0
asgiref==3.7.2
async-timeout==4.0.2
asyncio==3.4.3
attrs==23.1.0
Automat==22.10.0
beautifulsoup4==4.12.2
billiard==4.2.0
bitstring==4.0.2
blinker==1.7.0
braceexpand==0.1.7
bs4==0.0.1
cachetools==5.3.1
celery==5.3.6
celery-redbeat==2.1.1 celery-redbeat==2.1.1
certifi==2023.11.17
cffi==1.15.1
charset-normalizer==3.3.2
click==8.1.7 click==8.1.7
click-didyoumean==0.3.0 click-didyoumean==0.3.0
click-plugins==1.1.1 click-plugins==1.1.1
click-repl==0.3.0 click-repl==0.3.0
coloredlogs==15.0.1 Flask==2.3.3
constantly==15.1.0
contourpy==1.1.0
cryptography==41.0.1
cssselect==1.2.0
cycler==0.11.0
decorator==5.1.1
Deprecated==1.2.14
dotmap==1.3.30
ecdsa==0.18.0
einops==0.3.0
esptool==4.6.2
exceptiongroup==1.1.1
fastapi==0.98.0
ffmpy==0.3.0
filelock==3.12.2
Flask==3.0.0
Flask-SQLAlchemy==3.1.1 Flask-SQLAlchemy==3.1.1
flatbuffers==23.5.26 greenlet==2.0.2
fonttools==4.40.0
frozenlist==1.3.3
fsspec==2023.6.0
ftfy==6.1.1
future==0.18.3
geocoder==1.38.1
gevent==23.9.1
gitdb==4.0.10
GitPython==3.1.31
google-auth==2.20.0
google-auth-oauthlib==1.0.0
gpt4all==2.0.2
gradio==3.13.2
greenlet==3.0.1
grpcio==1.56.0
h11==0.14.0
httpcore==0.17.2
httpx==0.24.1
huggingface-hub==0.15.1
humanfriendly==10.0
hyperlink==21.0.0
idna==3.6
imageio==2.9.0
imageio-ffmpeg==0.4.2
imgaug==0.2.6
importlib-metadata==6.7.0
incremental==22.10.0
iniconfig==2.0.0
invisible-watermark==0.1.5
itemadapter==0.8.0
itemloaders==1.1.0
itsdangerous==2.1.2 itsdangerous==2.1.2
Jinja2==3.1.2 Jinja2==3.1.2
jmespath==1.0.1 kombu==5.3.2
jsonschema==4.17.3
kiwisolver==1.4.4
kombu==5.3.4
kornia==0.6.0
lazy_loader==0.2
linkify-it-py==2.0.2
lxml==4.9.3
Markdown==3.4.3
markdown-it-py==3.0.0
MarkupSafe==2.1.3 MarkupSafe==2.1.3
matplotlib==3.7.1 prompt-toolkit==3.0.39
mdit-py-plugins==0.4.0
mdurl==0.1.2
meshtastic==2.1.9
mpmath==1.3.0
multidict==6.0.4
networkx==3.1
numpy==1.25.0
oauthlib==3.2.2
omegaconf==2.1.1
onnx==1.14.0
onnxruntime==1.15.1
open-clip-torch==2.7.0
opencv-python==4.7.0.72
opencv-python-headless==4.7.0.72
orjson==3.9.1
packaging==23.1
pandas==2.0.2
parsel==1.8.1
pexpect==4.8.0
Pillow==9.5.0
playwright==1.38.0
pluggy==1.3.0
prompt-toolkit==3.0.41
Protego==0.3.0
protobuf==4.23.3
psutil==5.9.5
ptyprocess==0.7.0
pudb==2019.2
pyarrow==12.0.1
pyasn1==0.5.0
pyasn1-modules==0.3.0
pycodestyle==2.11.0
pycparser==2.21
pycryptodome==3.18.0
pydantic==1.10.9
pydeck==0.8.1b0
pyDeprecate==0.3.1
PyDispatcher==2.0.7
pydub==0.25.1
pyee==9.0.4
PyGithub==1.59.0
Pygments==2.15.1
PyJWT==2.7.0
Pympler==1.0.1
PyNaCl==1.5.0
pyOpenSSL==23.2.0
pyparsing==3.1.0
Pypubsub==4.0.3
PyQRCode==1.2.1
pyrsistent==0.19.3
pyserial==3.5
PySide6==6.5.1.1
PySide6-Addons==6.5.1.1
PySide6-Essentials==6.5.1.1
pytest==7.4.2
pytest-base-url==2.0.0
pytest-playwright==0.4.2
python-dateutil==2.8.2 python-dateutil==2.8.2
python-dotenv==1.0.0 redis==5.0.0
python-multipart==0.0.6
python-slugify==8.0.1
pytorch-lightning==1.4.2
pytz==2023.3
pytz-deprecation-shim==0.1.0.post0
PyWavelets==1.4.1
PyYAML==6.0
qt-material==2.14
queuelib==1.6.2
ratelim==0.1.6
redis==5.0.1
reedsolo==1.5.4
regex==2023.6.3
requests==2.31.0
requests-file==1.5.1
requests-oauthlib==1.3.1
rich==13.4.2
rsa==4.9
scikit-image==0.20.0
scipy==1.10.1
Scrapy==2.11.0
service-identity==23.1.0
shiboken6==6.5.1.1
six==1.16.0 six==1.16.0
smmap==5.0.0 SQLAlchemy==2.0.21
sniffio==1.3.0 tenacity==8.2.3
soupsieve==2.5
SQLAlchemy==2.0.23
starlette==0.27.0
streamlit==1.23.1
streamlit-drawable-canvas==0.8.0
sympy==1.12
tabulate==0.9.0
tenacity==8.2.2
tensorboard==2.13.0
tensorboard-data-server==0.7.1
test-tube==0.7.5
text-unidecode==1.3
tifffile==2023.4.12
timeago==1.0.16
tldextract==3.6.0
tokenizers==0.12.1
toml==0.10.2
tomli==2.0.1
toolz==0.12.0
torch==2.0.1
torchmetrics==0.6.0
torchvision==0.15.2
tornado==6.3.2
tqdm==4.66.1
transformers==4.19.2
Twisted==22.10.0
typing_extensions==4.8.0 typing_extensions==4.8.0
tzdata==2023.3 tzdata==2023.3
tzlocal==4.3.1 vine==5.0.0
uc-micro-py==1.0.2
urllib3==2.1.0
urwid==2.1.2
uvicorn==0.22.0
validators==0.20.0
vine==5.1.0
w3lib==2.1.2
wcwidth==0.2.6 wcwidth==0.2.6
webdataset==0.2.5 Werkzeug==2.3.7
websockets==11.0.3 gpt4all==2.0.2
Werkzeug==3.0.1
wrapt==1.15.0
yarl==1.9.2
zipp==3.15.0
zope.event==5.0
zope.interface==6.1

4
run.py
View File

@ -1,2 +1,4 @@
from application import app from project import create_app
app, celery = create_app()
app.app_context().push()