Add models caching and management functionality with corresponding API endpoints and templates

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-04-29 13:51:43 +02:00
parent fe32c32726
commit 96d13fc440
9 changed files with 534 additions and 8 deletions
+22 -8
View File
@@ -153,8 +153,9 @@ def generate():
@login_required
def generate_text():
result = error = None
token = session["access_token"]
if request.method == "POST":
resp = _api("POST", "/generate/text", token=session["access_token"], json={
resp = _api("POST", "/generate/text", token=token, json={
"model": request.form.get("model", "").strip(),
"prompt": request.form.get("prompt", "").strip(),
})
@@ -162,28 +163,35 @@ def generate_text():
result = resp.json()
else:
error = resp.json().get("detail", "Generation failed.")
return render_template("generate_text.html", result=result, error=error)
models_resp = _api("GET", "/models/", token=token,
params={"modality": "text"})
models = models_resp.json() if models_resp.status_code == 200 else []
return render_template("generate_text.html", result=result, error=error, models=models)
@app.route("/generate/image", methods=["GET", "POST"])
@login_required
def generate_image():
result = error = None
token = session["access_token"]
if request.method == "POST":
# Upload reference image if provided
ref_file = request.files.get("reference_image")
if ref_file and ref_file.filename:
up_resp = _api(
"POST", "/images/upload",
token=session["access_token"],
token=token,
files={"file": (ref_file.filename,
ref_file.stream, ref_file.content_type)},
)
if up_resp.status_code not in (200, 201):
error = up_resp.json().get("detail", "Image upload failed.")
return render_template("generate_image.html", result=result, error=error)
models_resp = _api("GET", "/models/",
token=token, params={"modality": "image"})
models = models_resp.json() if models_resp.status_code == 200 else []
return render_template("generate_image.html", result=result, error=error, models=models)
resp = _api("POST", "/generate/image", token=session["access_token"], json={
resp = _api("POST", "/generate/image", token=token, json={
"model": request.form.get("model", "").strip(),
"prompt": request.form.get("prompt", "").strip(),
"n": int(request.form.get("n", 1)),
@@ -195,16 +203,19 @@ def generate_image():
result = resp.json()
else:
error = resp.json().get("detail", "Generation failed.")
return render_template("generate_image.html", result=result, error=error)
models_resp = _api("GET", "/models/", token=token,
params={"modality": "image"})
models = models_resp.json() if models_resp.status_code == 200 else []
return render_template("generate_image.html", result=result, error=error, models=models)
@app.route("/generate/video", methods=["GET", "POST"])
@login_required
def generate_video():
result = error = None
token = session["access_token"]
if request.method == "POST":
mode = request.form.get("mode", "text")
token = session["access_token"]
duration_raw = request.form.get("duration_seconds", "")
duration = int(
duration_raw) if duration_raw.strip().isdigit() else None
@@ -230,7 +241,10 @@ def generate_video():
result = resp.json()
else:
error = resp.json().get("detail", "Generation failed.")
return render_template("generate_video.html", result=result, error=error)
models_resp = _api("GET", "/models/", token=token,
params={"modality": "video"})
models = models_resp.json() if models_resp.status_code == 200 else []
return render_template("generate_video.html", result=result, error=error, models=models)
@app.get("/generate/video/status")
@@ -5,9 +5,17 @@
<h1>Image Generation</h1>
<form method="post" enctype="multipart/form-data">
<label for="model">Model</label>
{% if models %}
<select id="model" name="model" required>
{% for m in models %}
<option value="{{ m.id }}" {% if request.form.get('model', '') == m.id %}selected{% endif %}>{{ m.name }}</option>
{% endfor %}
</select>
{% else %}
<input id="model" name="model" type="text" required
placeholder="e.g. openai/dall-e-3"
value="{{ request.form.get('model', '') }}">
{% endif %}
<label for="prompt">Prompt</label>
<textarea id="prompt" name="prompt" rows="4" required
@@ -4,6 +4,13 @@ AI{% endblock %} {% block content %}
<h1>Text Generation</h1>
<form method="post">
<label for="model">Model</label>
{% if models %}
<select id="model" name="model" required>
{% for m in models %}
<option value="{{ m.id }}" {% if request.form.get('model', '') == m.id %}selected{% endif %}>{{ m.name }}</option>
{% endfor %}
</select>
{% else %}
<input
id="model"
name="model"
@@ -12,6 +19,7 @@ AI{% endblock %} {% block content %}
placeholder="e.g. openai/gpt-4o"
value="{{ request.form.get('model', '') }}"
/>
{% endif %}
<label for="prompt">Prompt</label>
<textarea
@@ -19,6 +19,13 @@ AI{% endblock %} {% block content %}
<input type="hidden" name="mode" value="text" />
<label for="model-t">Model</label>
{% if models %}
<select id="model-t" name="model" required>
{% for m in models %}
<option value="{{ m.id }}" {% if request.form.get('model', '') == m.id and request.form.get('mode','text')=='text' %}selected{% endif %}>{{ m.name }}</option>
{% endfor %}
</select>
{% else %}
<input
id="model-t"
name="model"
@@ -27,6 +34,7 @@ AI{% endblock %} {% block content %}
placeholder="e.g. openai/sora-2-pro"
value="{{ request.form.get('model', '') if request.form.get('mode','text')=='text' else '' }}"
/>
{% endif %}
<label for="prompt-t">Prompt</label>
<textarea
@@ -80,6 +88,13 @@ AI{% endblock %} {% block content %}
<input type="hidden" name="mode" value="image" />
<label for="model-i">Model</label>
{% if models %}
<select id="model-i" name="model" required>
{% for m in models %}
<option value="{{ m.id }}" {% if request.form.get('model', '') == m.id and request.form.get('mode')=='image' %}selected{% endif %}>{{ m.name }}</option>
{% endfor %}
</select>
{% else %}
<input
id="model-i"
name="model"
@@ -88,6 +103,7 @@ AI{% endblock %} {% block content %}
placeholder="e.g. openai/sora-2-pro"
value="{{ request.form.get('model', '') if request.form.get('mode')=='image' else '' }}"
/>
{% endif %}
<label for="image_url">Source image URL</label>
<input