Files
openclaw/tools/model-dashboard/ARCHITECTURE.md
Clawd Bot ca9b510922 chore: align with upstream openclaw/openclaw and overlay local additions
- Reset master to upstream/main (16,697 commits)
- Overlay 2,271 local-only files (skills, tools, workspace, configs, apps)
- Restore IDENTITY.md and USER.md templates
- Build verified, gateway running, Discord working

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 07:40:46 +01:00

206 lines
8.2 KiB
Markdown

# OpenClaw Model Dashboard - Arkitektur
## Oversigt
```
┌─────────────────────────────────────────────────────────────────────────┐
│ Dashboard Server (Node.js) │
│ Port 3031 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Data Sources │ │ Rate Tracking │ │ API Endpoints │ │
│ ├──────────────────┤ ├──────────────────┤ ├──────────────────┤ │
│ │ • Session Logs │ │ • Rolling Windows│ │ GET /api/status │ │
│ │ • Claude Stats │───▶│ • Per-Provider │───▶│ GET /api/rates │ │
│ │ • GitHub API │ │ • Free Tier Aware│ │ POST /api/set-* │ │
│ │ • OpenAI API │ │ • Cooldown State │ │ │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ Mobile-Friendly UI │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Totals │ │ Rate Limits │ │ Budget │ │ Charts │ │
│ │ Cards │ │ Monitor │ │ Tracking │ │ (Chart.js) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Providers │ │ GitHub │ │ Claude │ │ Usage │ │
│ │ & Models │ │ Copilot │ │ Code │ │ Tables │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
```
## Data Sources
### 1. OpenClaw Session Logs
- **Sti:** `~/.openclaw/agents/*/sessions/*.jsonl`
- **Data:** Token usage, requests, provider/model info
- **Parsing:** Streaming JSONL, skip filer > 50MB
### 2. Claude Code Stats
- **Sti:** `~/.claude/stats-cache.json`
- **Data:** Sessions, messages, model usage, costs
- **Cache:** Læses direkte (ingen API)
### 3. GitHub Copilot Billing
- **API:** `gh api /users/{user}/settings/billing/premium_request/usage`
- **Data:** Per-model requests, gross/net costs, discounts
- **Cache:** 5 minutter
### 4. OpenAI Admin API
- **Sti:** `~/.openclaw/credentials/openai-admin.key`
- **API:** `api.openai.com/v1/organization/costs`
- **Data:** Daily costs, total spend
- **Cache:** 5 minutter
### 5. Persistent DB
- **Sti:** `~/.openclaw/dashboard-usage.json`
- **Data:** Snapshots, rate states, budget, quotas
- **Retention:** 90 dage
## Provider Configuration
| Provider | Icon | Free Tier Limits | Color |
| -------------- | ---- | ----------------- | ------- |
| Anthropic | 🟠 | 50 RPM (paid) | #D97706 |
| GitHub Copilot | 🐙 | $20/month budget | #238636 |
| Google Gemini | 🔵 | 10 RPM, 1500 RPD | #4285F4 |
| NVIDIA NIM | 🟢 | 40 RPM, 10000 RPD | #76B900 |
| OpenRouter | 🔀 | 20 RPM | #8B5CF6 |
| OpenAI | 🤖 | 60 RPM (paid) | #10A37F |
| Moonshot | 🌙 | 10 RPM | #6366F1 |
## Rate Tracking
```
Rate Windows:
├── 1 minute (RPM calculation)
├── 5 minutes (smoothed rate)
├── 1 hour (hourly trends)
└── 1 day (daily totals)
Only RECENT log entries (< 5 min) contribute to rate calculations.
Historical data is used for usage totals only.
```
## API Endpoints
### GET /api/status
Full dashboard status (cached 5 min):
- providers, models, aliases
- usage totals, by-agent breakdown
- budget status, alerts
- GitHub Copilot & OpenAI billing
- Claude Code stats
- Rate limit predictions
### GET /api/rates
Real-time rate data (no cache):
- Per-provider RPM/RPD
- Limit percentages
- Reset timestamps
### POST /api/set-model
Change default model.
### POST /api/set-budget
Update daily/monthly budget limits.
### POST /api/set-quotas
Set provider-specific quotas.
## Mobile UI Features
- **Responsive Grid:** Auto-fit columns (280px min)
- **Touch Targets:** 44px minimum height
- **Progress Bars:** Visual rate limit indicators
- **Real-time Timers:** Countdown to rate reset
- **Charts:** Cost & token trends (daily/weekly)
## Pricing Model
```typescript
// Per 1M tokens (USD)
const MODEL_PRICING = {
"anthropic/claude-opus-4-5": { input: 15.0, output: 75.0 },
"anthropic/claude-sonnet-4-5": { input: 3.0, output: 15.0 },
// Free tier models
"google/gemini-2.5-pro": { input: 0, output: 0 },
"nvidia/deepseek-ai/deepseek-v3.2": { input: 0, output: 0 },
// ...
};
```
## Systemd Service
```ini
[Service]
WorkingDirectory=/home/alex/clawd/tools/model-dashboard
EnvironmentFile=%h/.config/openclaw/model-dashboard.env
ExecStart=/usr/bin/env bash -lc 'pnpm -s start'
Restart=always
```
Environment:
- `AUTH_TOKEN` - API authentication
- `BIND_HOST` - Listen address (0.0.0.0)
- `PORT` - Server port (3031)
## Testing
```bash
# Check status
curl -s "http://localhost:3031/api/status?token=<TOKEN>" | jq
# Check rates
curl -s "http://localhost:3031/api/rates?token=<TOKEN>" | jq
# Restart service
systemctl --user restart openclaw-model-dashboard
```
## Data Flow
```
Session Log Entry (JSONL)
┌───────────────────┐
│ Parse & Validate │
└───────────────────┘
├──▶ Usage Totals (all time)
└──▶ Rate Tracking (last 5 min only)
┌───────────────┐
│ Rolling Window│
│ 1m/5m/1h/1d │
└───────────────┘
┌───────────────┐
│ Rate Alerts │
│ (>80% limit) │
└───────────────┘
```