Files
go-meter/index.html
T

221 lines
8.3 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OpenCode Go 用量</title>
<link rel="stylesheet" href="/src/styles.css" />
</head>
<body>
<div id="app">
<header>
<h1>OpenCode Go 用量</h1>
<div id="status">
<span id="status-dot"></span>
<span id="status-text">连接中…</span>
</div>
</header>
<nav id="plan-tabs">
<button class="plan-tab active" data-plan="go">Go 套餐</button>
<button class="plan-tab" data-plan="zen">Zen</button>
</nav>
<nav id="tabs">
<button class="tab active" data-view="overview">用量概览</button>
<button class="tab" data-view="details">用量明细</button>
<button class="tab" data-view="report">每日报表</button>
<button class="tab" data-view="pricing">模型定价</button>
<button class="tab" data-view="keys">API Key</button>
</nav>
<main id="content">
<section id="view-overview">
<div id="cards"></div>
<div class="card" id="zen-card">
<div class="card-head">
<span class="card-name">Zen 账户与余额</span>
<button id="btn-zen-refresh">刷新</button>
</div>
<div id="zen-state" class="model-empty">登录并连接后自动读取</div>
<div id="zen-rows">
<div class="zen-balance-row">
<span class="zen-balance-label" id="zen-balance-label">当前余额</span>
<span class="zen-balance" id="zen-balance">—</span>
</div>
<div class="zen-row">
<span class="zen-label">本月已用</span>
<span class="zen-value" id="zen-usage">—</span>
</div>
<div class="bar zen-bar"><div class="bar-fill" id="zen-usage-bar" style="width:0%"></div></div>
<div class="zen-row">
<span class="zen-label">月度限额</span>
<span class="zen-value" id="zen-limit">—</span>
</div>
<div class="zen-row">
<span class="zen-label">自动充值</span>
<span class="zen-value" id="zen-reload">—</span>
</div>
</div>
<div class="card-foot">
<span id="zen-meta"></span>
</div>
</div>
<div class="card" id="model-card">
<div class="card-head">
<span class="card-name">模型使用与费用</span>
<span id="model-total" class="model-total"></span>
</div>
<div id="model-list">
<div class="model-empty">读取中…</div>
</div>
<div class="card-foot">
<span id="model-meta"></span>
<button id="btn-model-refresh">刷新</button>
</div>
</div>
<div class="card" id="requests-card">
<div class="card-head">
<span class="card-name">最近请求</span>
<span id="requests-total" class="model-total"></span>
</div>
<div id="requests-list">
<div class="model-empty">暂无数据</div>
</div>
<div class="card-foot">
<span id="requests-meta"></span>
<button id="btn-requests-refresh">刷新</button>
</div>
</div>
</section>
<section id="view-details" class="hidden">
<div class="card">
<div class="card-head">
<span class="card-name">OpenCode 控制台用量明细</span>
<button id="btn-details-refresh">刷新</button>
</div>
<div id="details-state" class="model-empty">加载中…</div>
<div id="details-table-wrap" class="hidden">
<table>
<thead>
<tr>
<th>日期</th>
<th>模型</th>
<th>输入</th>
<th>输出</th>
<th>花费</th>
<th>会话</th>
</tr>
</thead>
<tbody id="details-body"></tbody>
</table>
</div>
</div>
</section>
<section id="view-report" class="hidden">
<div class="card">
<div class="card-head">
<span class="card-name">每日使用金额报表</span>
<span id="report-total" class="model-total"></span>
</div>
<div id="report-bars">
<div class="model-empty">读取中…</div>
</div>
<div id="report-table-wrap" class="hidden">
<table>
<thead>
<tr>
<th>日期</th>
<th>请求数</th>
<th>输入</th>
<th>输出</th>
<th>总Tokens</th>
<th>花费</th>
</tr>
</thead>
<tbody id="report-body"></tbody>
</table>
</div>
<div class="card-foot">
<span id="report-meta"></span>
<button id="btn-report-refresh">刷新</button>
</div>
</div>
</section>
<section id="view-pricing" class="hidden">
<div class="card">
<div class="card-head">
<span class="card-name">模型官方定价</span>
<span class="model-total" id="pricing-count"></span>
</div>
<div class="pricing-bar">
<input id="pricing-search" type="text" placeholder="搜索模型名称…" />
</div>
<div id="pricing-table-wrap">
<table>
<thead>
<tr>
<th>模型</th>
<th>提供商</th>
<th>输入 $/M</th>
<th>输出 $/M</th>
<th>缓存读 $/M</th>
<th>缓存写 $/M</th>
</tr>
</thead>
<tbody id="pricing-body"></tbody>
</table>
</div>
<div class="card-foot">
<span id="pricing-meta">正在从官网获取官方定价…</span>
<button id="btn-pricing-refresh">刷新</button>
</div>
</div>
</section>
<section id="view-keys" class="hidden">
<div class="card">
<div class="card-head">
<span class="card-name">API Key 管理</span>
<button id="btn-keys-refresh">刷新</button>
</div>
<div class="keys-create">
<input id="key-name-input" type="text" placeholder="新 API Key 名称,例如 cli-local" />
<button id="btn-key-create">新建 Key</button>
</div>
<div id="new-key-box" class="hidden">
<span class="nkb-label">新 Key(完整值仅此一次)</span>
<code id="new-key-value"></code>
<button id="btn-copy-new-key">复制</button>
</div>
<div id="keys-state" class="model-empty">加载中…</div>
<div id="keys-table-wrap" class="hidden">
<table>
<thead>
<tr>
<th>名称</th>
<th>Key</th>
<th>创建者</th>
<th>操作</th>
</tr>
</thead>
<tbody id="keys-body"></tbody>
</table>
</div>
<div class="card-foot">
<span id="keys-meta"></span>
</div>
</div>
</section>
</main>
<footer>
<p id="meta"></p>
<div id="actions">
<button id="btn-login" class="hidden">去登录</button>
<button id="btn-show">打开控制台</button>
<button id="btn-hide" disabled>隐藏</button>
<button id="btn-refresh" disabled>立即刷新</button>
</div>
</footer>
</div>
<div id="toast" class="hidden"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>