summaryrefslogtreecommitdiff
path: root/frontend/src/pages/UsagePage.svelte
blob: 88dd8a5cef31ba45ec4f16c956f9324fe20e38d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<script lang="ts">
  import Page from '../components/Page.svelte';
  import Status from '../components/Status.svelte';
  import { getAIUsage } from '../lib/client';
  import { extractStatusMessage } from '../lib/state';
  import { fmtDateTime, fmtNum } from '../lib/format';
  import type { AIUsage } from '../lib/types';

  let usage = $state<AIUsage | null>(null);
  let busy = $state(true);
  let error = $state<string | null>(null);

  $effect(() => {
    void load();
  });

  async function load() {
    busy = true;
    error = null;
    try {
      usage = await getAIUsage();
    } catch (e) {
      error = extractStatusMessage(e);
    } finally {
      busy = false;
    }
  }
</script>

<Page title="AI 用量" subtitle="内部 POC 阶段的用量计量与限额参考。不含报价或计费">
  <div class="stack">
    <Status busy={busy} error={error} busyText="正在载入用量…" empty={null} />
    {#if usage}
      <div class="card">
        <div class="row spaced">
          <div>
            <div class="mlabel">模型请求</div>
            <div class="mvalue">{usage.totals?.requests ?? usage.items.length}</div>
          </div>
          <div>
            <div class="mlabel">输入 tokens</div>
            <div class="mvalue">{usage.totals?.input_tokens ?? '—'}</div>
          </div>
          <div>
            <div class="mlabel">输出 tokens</div>
            <div class="mvalue">{usage.totals?.output_tokens ?? '—'}</div>
          </div>
        </div>
        {#if usage.internal_poc}
          <p class="hint">内部 POC:请在当前配额内使用,不对实际价格负责;接受模型输出的决策需重新人工复核。</p>
        {/if}
      </div>

      {#if usage.items.length > 0}
        <div class="card" style="padding:0.4rem 0.6rem">
          <table class="data">
            <thead>
              <tr>
                <th>时间</th>
                <th>模型</th>
                <th>输入</th>
                <th>输出</th>
                <th>状态</th>
              </tr>
            </thead>
            <tbody>
              {#each usage.items as it, i (it.id)}
                <tr>
                  <td>{fmtDateTime(it.created_at)}</td>
                  <td>{it.model}</td>
                  <td class="num">{it.input_tokens ?? '—'}</td>
                  <td class="num">{it.output_tokens ?? '—'}</td>
                  <td class="badge">{it.status ?? '—'}</td>
                </tr>
              {/each}
            </tbody>
          </table>
        </div>
      {:else}
        <Status busy={false} empty="尚未使用 AI 建议" emptyHint="在项目「策略」标签发起一次 AI 修改,记录会出现在这里" />
      {/if}
    {/if}
  </div>
</Page>