Add /metrics + /metrics-dash endpoints, Claude cost tracking and safety caps

- Track Claude token usage + cost in metrics.json after each call
- Add /metrics JSON endpoint
- Add /metrics-dash visual dashboard (KPIs, charts, burn bars)
- Switch model to claude-3-haiku-20240307 (3.2x cheaper)
- Add per-run cap (50 calls) and daily spend cap ($2.00, env: CLAUDE_DAILY_CAP_USD)
This commit is contained in:
Henrik Jess Nielsen
2026-05-28 13:41:53 +02:00
parent 2294f5bc07
commit 6a407cf216
2 changed files with 54 additions and 20 deletions

View File

@@ -31,11 +31,6 @@ LOG_DIR = Path(os.getenv("LOG_DIR", str(Path(__file__).parent / "logs")))
METRICS_FILE = Path(__file__).parent / "metrics.json"
REFRESH = 60 # seconds
CAPITAL = 10_000
LOG_DIR = Path(os.getenv("LOG_DIR", str(Path(__file__).parent / "logs")))
METRICS_FILE = Path(__file__).parent / "metrics.json"
REFRESH = 60 # seconds
app = Flask(__name__)
# ── Metrics dashboard template ────────────────────────────────────────────────
@@ -246,9 +241,9 @@ METRICS_TEMPLATE = """<!DOCTYPE html>
</tr>
</thead>
<tbody>
<tr><td>Model</td><td class="mono">claude-haiku-4-5</td><td>Anthropic</td></tr>
<tr><td>Input price</td><td class="mono">$0.80 / MTok</td><td>${{ "%.6f"|format(0.80/1_000_000) }} per token</td></tr>
<tr><td>Output price</td><td class="mono">$4.00 / MTok</td><td>${{ "%.6f"|format(4.00/1_000_000) }} per token</td></tr>
<tr><td>Model</td><td class="mono">claude-3-haiku-20240307</td><td>Anthropic</td></tr>
<tr><td>Input price</td><td class="mono">$0.25 / MTok</td><td>${{ "%.6f"|format(0.25/1_000_000) }} per token</td></tr>
<tr><td>Output price</td><td class="mono">$1.25 / MTok</td><td>${{ "%.6f"|format(1.25/1_000_000) }} per token</td></tr>
<tr><td>Total calls</td><td class="mono">{{ total_calls }}</td><td>articles sent to Claude</td></tr>
<tr><td>Total input tokens</td><td class="mono">{{ "{:,}".format(total_input_tokens) }}</td><td>cost ${{ "%.5f"|format(cost_input) }}</td></tr>
<tr><td>Total output tokens</td><td class="mono">{{ "{:,}".format(total_output_tokens) }}</td><td>cost ${{ "%.5f"|format(cost_output) }}</td></tr>
@@ -298,7 +293,7 @@ window.addEventListener('resize', () => { barChart.resize(); donut.resize(); });
</script>
{% endif %}
<div class="footer">MoneyMaker · claude-haiku-4-5 · metrics updated on each analyze run</div>
<div class="footer">MoneyMaker · claude-3-haiku-20240307 · metrics updated on each analyze run</div>
</body>
</html>
"""