summaryrefslogtreecommitdiff
path: root/internal/adminui/assets/models.html
diff options
context:
space:
mode:
authorChia <Chia@93.nz>2026-08-06 09:29:41 +1200
committerChia <Chia@93.nz>2026-08-06 09:32:46 +1200
commit41e322c53d7b4b796eb377d0df9c29ecd10ba431 (patch)
treec730526150e55e39b822d5197e4a20318ecaa449 /internal/adminui/assets/models.html
parenteadb2ffe85c43cf6fc741c9823cd28eedb4a844c (diff)
feat: complete commercial control plane, billing, auth, and model catalog
- add PostgreSQL control-plane persistence with Redis-degraded hot reload - implement prepaid balance, usage ledger, Stripe top-up and reconciliation - add registration, email verification, password reset, invitations and RBAC - support TOTP, Passkey MFA, device sessions, quotas and rate limits - add tenant billing profiles, audit logs and operational readiness checks - build authenticated admin console, Quickstart, Playground and usage analytics - add public model catalog with pricing, filtering and cost estimation - support OpenAI Responses providers and provider health failover - validate real upstream usage reporting and balance settlement
Diffstat (limited to 'internal/adminui/assets/models.html')
-rw-r--r--internal/adminui/assets/models.html50
1 files changed, 50 insertions, 0 deletions
diff --git a/internal/adminui/assets/models.html b/internal/adminui/assets/models.html
new file mode 100644
index 0000000..0af0f50
--- /dev/null
+++ b/internal/adminui/assets/models.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="Browse AIGW models, API protocols, context limits, and current token prices.">
+ <title>Models | AIGW</title>
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%23102a3a'/%3E%3Ctext x='16' y='22' text-anchor='middle' font-family='Arial' font-weight='700' font-size='18' fill='%23b8eef7'%3EA%3C/text%3E%3C/svg%3E">
+ <link rel="stylesheet" href="./models.css">
+ <script src="./models.js" defer></script>
+</head>
+<body>
+ <header class="catalog-header">
+ <a class="catalog-brand" href="./models" aria-label="AIGW model catalog"><span>A</span><strong>AIGW</strong><small>MODEL CATALOG</small></a>
+ <nav aria-label="Account access"><a class="button secondary" href="./">Sign in</a><a class="button primary" id="create-account" href="./?auth=register">Create account</a></nav>
+ </header>
+ <main>
+ <section class="catalog-intro">
+ <div><span class="eyebrow">UNIFIED API</span><h1>Models</h1></div>
+ <div class="catalog-stats" aria-live="polite"><span><strong id="model-count">0</strong> models</span><span><strong id="provider-count">0</strong> routes</span><span><strong id="protocol-count">0</strong> APIs</span></div>
+ </section>
+
+ <form class="catalog-filters" id="catalog-filters">
+ <label class="search-field">Search<input id="search" type="search" placeholder="Model, developer, or capability" autocomplete="off"></label>
+ <label>Protocol<select id="protocol"><option value="">All protocols</option></select></label>
+ <label>Input<select id="input"><option value="">Any input</option><option value="text">Text</option><option value="image">Image</option><option value="audio">Audio</option><option value="video">Video</option></select></label>
+ <label>Developer<select id="owner"><option value="">All developers</option></select></label>
+ <label>Sort<select id="sort"><option value="newest">Newest</option><option value="name">Name</option><option value="input_price">Lowest input price</option><option value="output_price">Lowest output price</option><option value="context">Largest context</option></select></label>
+ </form>
+
+ <div class="catalog-status hidden" id="catalog-error" role="alert"></div>
+ <div class="catalog-grid" id="catalog-grid" aria-live="polite"></div>
+ <div class="catalog-status hidden" id="catalog-empty">No models match these filters.</div>
+ </main>
+
+ <dialog id="model-dialog">
+ <article class="model-dialog">
+ <header><div><span class="eyebrow" id="detail-owner"></span><h2 id="detail-name"></h2><code id="detail-id"></code></div><button class="icon-button" id="close-dialog" type="button" aria-label="Close">&times;</button></header>
+ <p id="detail-description"></p>
+ <div class="detail-tags" id="detail-tags"></div>
+ <dl class="detail-grid" id="detail-grid"></dl>
+ <section class="price-estimator">
+ <div><span class="eyebrow">COST ESTIMATE</span><h3>Token estimate</h3></div>
+ <div class="estimate-inputs"><label>Input tokens<input id="estimate-input" type="number" min="0" step="100" value="1000"></label><label>Output tokens<input id="estimate-output" type="number" min="0" step="100" value="500"></label><output id="estimate-total"></output></div>
+ </section>
+ <footer><a class="button secondary" href="./">Sign in</a><a class="button primary" id="detail-register" href="./?auth=register">Start with this model</a></footer>
+ </article>
+ </dialog>
+</body>
+</html>