Expose the protected phrase extraction pipeline through the web UI:
- Admin routes: POST /admin/build-phrases, /admin/generate-ngrams, and
/admin/judge-ngrams, each wrapping the protected_phrases.lib backfill
helpers, committing on success, rolling back and rendering an error
partial on failure, and reporting per-book/candidate/mention counts.
- Book detail page: show candidate, judged, and protected phrase counts,
list top candidate n-grams (with kept/rejected status) and protected
phrases, and add a POST /books/{id}/recalculate-phrases action that
clears and regenerates candidates, then redirects back with a status
message.
- Admin template: add Generate/Judge n-gram buttons.
Also reflows admin.html to 2-space HTML formatting.
66 lines
1.5 KiB
HTML
66 lines
1.5 KiB
HTML
{% extends "base.html" %} {% block title %}EPUB Admin{% endblock %} {% block
|
|
head %}
|
|
<script src="https://unpkg.com/htmx.org@2.0.4"></script>
|
|
{% endblock %} {% block content %}
|
|
<h1>Admin</h1>
|
|
<section id="admin-status"></section>
|
|
<section class="actions">
|
|
<form hx-post="/admin/scan" hx-target="#admin-status" hx-swap="innerHTML">
|
|
<button type="submit">Scan</button>
|
|
</form>
|
|
<form
|
|
hx-post="/admin/generate-ngrams"
|
|
hx-target="#admin-status"
|
|
hx-swap="innerHTML"
|
|
>
|
|
<button type="submit">Generate n-grams</button>
|
|
</form>
|
|
<form
|
|
hx-post="/admin/judge-ngrams"
|
|
hx-target="#admin-status"
|
|
hx-swap="innerHTML"
|
|
>
|
|
<button type="submit">Judge n-grams</button>
|
|
</form>
|
|
<form
|
|
hx-post="/admin/embed-missing"
|
|
hx-target="#admin-status"
|
|
hx-swap="innerHTML"
|
|
>
|
|
<button type="submit">Embed</button>
|
|
</form>
|
|
<form
|
|
hx-post="/admin/embed-all"
|
|
hx-target="#admin-status"
|
|
hx-swap="innerHTML"
|
|
>
|
|
<button type="submit">Embed all</button>
|
|
</form>
|
|
</section>
|
|
<section>
|
|
<h2>Embeddings</h2>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Model</th>
|
|
<th>Dimensions</th>
|
|
<th>Embedded</th>
|
|
<th>Missing</th>
|
|
<th>Total chunks</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in stats %}
|
|
<tr>
|
|
<td>{{ item.model_name }}</td>
|
|
<td>{{ item.dimension }}</td>
|
|
<td>{{ item.embedded_chunks }}</td>
|
|
<td>{{ item.missing_chunks }}</td>
|
|
<td>{{ item.total_chunks }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</section>
|
|
{% endblock %}
|