Files
2026-05-21 15:17:19 +07:00
..
2026-05-21 13:28:04 +07:00
2026-05-21 13:51:42 +07:00
2026-05-21 15:15:09 +07:00
2026-05-21 15:17:19 +07:00

CLIProxyAPI Usage Dashboard

Dashboard theo dõi và thống kê sử dụng CLIProxyAPI - Giám sát token usage, quota, và performance của các tài khoản ChatGPT.

📋 Tính năng

📊 Thống kê tổng quan

  • KPI Cards: Hiển thị tổng số requests, tokens (input/output/reasoning), và failed requests
  • Biểu đồ theo giờ: Theo dõi token usage theo từng giờ
  • Biểu đồ theo model: Phân tích usage theo từng model AI
  • Bảng theo tài khoản: Chi tiết usage của từng tài khoản
  • Bảng quota: Hiển thị hạn mức còn lại (5h và 7d window) của mỗi tài khoản
  • Recent requests: Danh sách các request gần đây với chi tiết

🎨 Giao diện

  • Dark/Light mode: Chuyển đổi theme sáng/tối
  • Đa ngôn ngữ: Hỗ trợ tiếng Anh và tiếng Việt
  • Responsive: Tương thích mobile, tablet, desktop
  • Real-time: Auto-refresh mỗi 30 giây

🔒 Bảo vệ API

  • Quota refresh cooldown: Nút "Refresh Quota" bị khóa 5 phút sau mỗi lần bấm
  • Threading lock: Ngăn chặn multiple concurrent quota refresh calls
  • Rate limiting: Tránh spam ChatGPT API

🚀 Cài đặt

Yêu cầu hệ thống

  • Python 3.8+
  • Redis server (cho CLIProxyAPI)
  • SQLite3
  • Các file auth JSON của ChatGPT (~/.cliproxyapi/codex-*.json)

Cài đặt dependencies

# Clone hoặc copy mã nguồn
cd ~/cliproxyapi/usage-dashboard/

# Không cần cài thêm package, script chỉ dùng Python stdlib

Cấu trúc thư mục

~/cliproxyapi/usage-dashboard/
├── usage-dashboard.py      # Backend Python script
├── usage-dashboard.html    # Frontend HTML
├── config.json             # Configuration file (tùy chọn)
└── usage.db               # SQLite database (tự động tạo)

~/.cliproxyapi/
├── codex-account1@gmail.com.json
├── codex-account2@gmail.com.json
└── ...                    # Các file auth JSON

⚙️ Cấu hình

File config.json (tùy chọn)

Nếu không có file này, script sẽ dùng giá trị mặc định:

{
  "cliproxy_host": "127.0.0.1",
  "cliproxy_port": 6379,
  "management_password": "",
  "poll_interval_seconds": 2,
  "quota_refresh_seconds": 300,
  "dashboard_host": "0.0.0.0",
  "dashboard_port": 8320
}

Các tham số:

  • cliproxy_host: Redis host của CLIProxyAPI
  • cliproxy_port: Redis port (mặc định 6379)
  • management_password: Password cho Redis management channel
  • poll_interval_seconds: Tần suất poll events từ Redis (2 giây)
  • quota_refresh_seconds: Thời gian giữa các lần auto-refresh quota (300 giây = 5 phút) - Đã tắt auto-refresh
  • dashboard_host: Host để bind web server
  • dashboard_port: Port cho dashboard (mặc định 8320)

🎯 Sử dụng

Khởi động dashboard

cd ~/cliproxyapi/usage-dashboard/
python3 usage-dashboard.py start

Dashboard sẽ tự động mở browser tại http://localhost:8320

Chạy ở background (không mở browser)

python3 usage-dashboard.py start --no-browser

Dừng dashboard

# Nếu chạy foreground: Ctrl+C

# Nếu chạy background:
pkill -f usage-dashboard.py

Chạy như systemd service

Tạo file /etc/systemd/system/cliproxy-dashboard.service:

[Unit]
Description=CLIProxyAPI Usage Dashboard
After=network.target

[Service]
Type=simple
User=admin
WorkingDirectory=/home/admin/cliproxyapi/usage-dashboard
ExecStart=/usr/bin/python3 /home/admin/cliproxyapi/usage-dashboard/usage-dashboard.py start --no-browser
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Kích hoạt service:

sudo systemctl daemon-reload
sudo systemctl enable cliproxy-dashboard
sudo systemctl start cliproxy-dashboard
sudo systemctl status cliproxy-dashboard

📖 Hướng dẫn sử dụng Dashboard

1. Chọn khoảng thời gian

Dropdown Range cho phép lọc dữ liệu:

  • Today: Hôm nay
  • Last 1 hour: 1 giờ qua
  • Last 5 hours: 5 giờ qua
  • Last 24 hours: 24 giờ qua
  • Last 7 days: 7 ngày qua

2. Refresh dữ liệu

Nút "Refresh" (xám):

  • Làm mới usage data từ database
  • Không gọi ChatGPT API
  • Có thể bấm bất cứ lúc nào

Nút "Refresh Quota" (xanh):

  • Fetch quota mới từ ChatGPT API cho tất cả tài khoản
  • Bị khóa 5 phút sau mỗi lần bấm (hiển thị countdown)
  • Chỉ dùng khi cần kiểm tra quota thực tế

3. Đọc hiểu các chỉ số

KPI Cards:

  • Requests / Tasks: Tổng số requests (thành công + thất bại)
  • Total Tokens: Tổng tokens = Input + Output + Reasoning
  • Input Tokens: Tokens đầu vào (prompt)
  • Output Tokens: Tokens đầu ra (response)
  • Reasoning Tokens: Tokens suy luận (o1/o3 models)

Quota Table:

  • 5h Remaining: % quota còn lại trong 5 giờ window
  • 7d Remaining: % quota còn lại trong 7 ngày window
  • Status:
    • 🟢 Active: Tài khoản hoạt động bình thường
    • 🔴 Limited: Đã đạt giới hạn quota
  • Reset Time: Thời gian reset quota (local timezone)

Color coding:

  • 🟢 Xanh: > 30% quota còn lại
  • 🟠 Cam: 10-30% quota còn lại
  • 🔴 Đỏ: < 10% quota còn lại

4. Chuyển đổi theme và ngôn ngữ

  • 🌙 / ☀️: Toggle Dark/Light mode
  • EN / VI: Chuyển đổi tiếng Anh / tiếng Việt

Cài đặt được lưu trong browser localStorage.

🔧 Troubleshooting

Dashboard không hiển thị dữ liệu

Kiểm tra:

  1. CLIProxyAPI đang chạy và có events trong Redis queue
  2. File auth JSON tồn tại trong ~/.cliproxyapi/
  3. Database usage.db đã được tạo
# Kiểm tra database
sqlite3 ~/cliproxyapi/usage-dashboard/usage.db "SELECT COUNT(*) FROM events;"

Quota không cập nhật

Nguyên nhân:

  • Nút "Refresh Quota" đang trong cooldown (5 phút)
  • Access token trong file JSON đã hết hạn
  • Network timeout khi gọi ChatGPT API

Giải pháp:

# Xem log để debug
tail -f /var/log/syslog | grep usage-dashboard

# Hoặc nếu chạy foreground, xem console output

Lỗi "refresh_quota: already running"

Nguyên nhân: Có request khác đang fetch quota (threading lock hoạt động đúng)

Giải pháp: Đợi request hiện tại hoàn tất (thường < 30 giây cho 8 tài khoản)

Port 8320 đã được sử dụng

Giải pháp:

# Tìm process đang dùng port
sudo lsof -i :8320

# Hoặc đổi port trong config.json
{
  "dashboard_port": 8321
}

🏗️ Kiến trúc hệ thống

Backend (usage-dashboard.py)

Collector Thread:

  • Poll events từ Redis queue mỗi 2 giây
  • Parse và lưu vào SQLite database
  • KHÔNG tự động refresh quota (tránh spam API)

Web Server:

  • HTTP server đơn giản (Python http.server)
  • Serve static HTML và JSON APIs
  • Endpoints:
    • GET / → usage-dashboard.html
    • GET /api/summary?range=<range> → Usage statistics
    • GET /api/quota → Quota snapshots (từ DB)
    • GET /api/quota?force=1 → Force refresh từ ChatGPT API
    • GET /api/requests?limit=<n> → Recent requests

Database Schema:

-- Usage events
CREATE TABLE events (
  id INTEGER PRIMARY KEY,
  timestamp TEXT,
  ts_epoch REAL,
  auth_index INTEGER,
  source TEXT,
  model TEXT,
  input_tokens INTEGER,
  output_tokens INTEGER,
  reasoning_tokens INTEGER,
  total_tokens INTEGER,
  latency_ms INTEGER,
  failed INTEGER
);

-- Quota snapshots
CREATE TABLE quota_snapshots (
  id INTEGER PRIMARY KEY,
  timestamp TEXT,
  ts_epoch REAL,
  email TEXT,
  plan TEXT,
  allowed INTEGER,
  limit_reached INTEGER,
  primary_used_percent INTEGER,
  primary_remaining_percent INTEGER,
  primary_reset_at TEXT,
  secondary_used_percent INTEGER,
  secondary_remaining_percent INTEGER,
  secondary_reset_at TEXT,
  credits_balance TEXT,
  raw_json TEXT
);

Frontend (usage-dashboard.html)

Single-page application:

  • Vanilla JavaScript (no frameworks)
  • Canvas-based charts (no external libraries)
  • CSS variables cho theming
  • LocalStorage cho preferences

Auto-refresh:

  • Usage data: Mỗi 30 giây
  • Quota data: Chỉ khi user bấm nút (với 5 phút cooldown)

🔐 Bảo mật

Access token protection

  • Tokens được đọc từ file JSON nhưng không được log ra console
  • Raw JSON trong database có thể chứa sensitive data → Bảo vệ file usage.db

Recommendations

# Set proper permissions
chmod 600 ~/.cliproxyapi/*.json
chmod 600 ~/cliproxyapi/usage-dashboard/usage.db
chmod 700 ~/.cliproxyapi/

Network security

  • Dashboard mặc định bind 0.0.0.0:8320 (accessible từ mạng)
  • Nếu chỉ dùng local: Đổi dashboard_host thành 127.0.0.1
  • Hoặc dùng reverse proxy (nginx) với authentication

📊 Performance

Resource usage

  • Memory: ~50-100 MB (Python process)
  • CPU: < 1% (idle), ~5% (khi refresh quota)
  • Disk: Database size ~1 MB / 10,000 events
  • Network: Minimal (chỉ khi refresh quota)

Scalability

  • Tested với 8 tài khoản ChatGPT
  • Database có thể handle hàng triệu events
  • Quota refresh: ~3-5 giây / tài khoản (sequential)

🛠️ Development

Thêm tính năng mới

Backend API endpoint:

# Trong usage-dashboard.py, thêm vào handle_api()
elif path == '/api/custom':
    data = {"result": "custom data"}
    self.send_json(data)

Frontend:

// Trong usage-dashboard.html
async function loadCustomData() {
  const data = await getJSON('/api/custom');
  console.log(data);
}

Debug mode

Thêm logging chi tiết:

# Trong refresh_quota(), đã có 6 logging points
print(f"refresh_quota: found {len(files)} auth files", flush=True)
print(f"refresh_quota: fetching quota for {email}...", flush=True)
print(f"refresh_quota: saved quota for {email}", flush=True)

📝 Changelog

Version 2.0 (2025-05-21)

  • Thêm threading lock cho refresh_quota() (tránh concurrent calls)
  • Tắt auto-refresh quota trong collector thread
  • Frontend: 5-minute cooldown cho nút "Refresh Quota"
  • Đổi thứ tự nút: "Refresh Quota" trước "Refresh"
  • Thêm footer với copyright và link TTAI Solutions
  • Thêm icon 📊 vào header
  • Fix RPOP protocol issue (loop individual calls)
  • Tách JSON_DIRBASE_DIR cho auth files

Version 1.0 (Initial)

  • Basic usage tracking và quota monitoring
  • Dark/Light theme
  • Bilingual support (EN/VI)
  • Canvas charts
  • SQLite storage

📞 Hỗ trợ

Developed by: TTAI Solutions Software
Website: https://ttaisolutions.com
Copyright: 6 - CLIProxyAPI Usage Dashboard


📄 License

Copyright (c) 2026 [Tran Thanh Tan / TTAI Solutions Software] All rights reserved.

No part of this software or its source code may be reproduced, distributed, or transmitted in any form or by any means, including photocopying, recording, or other electronic or mechanical methods, without the prior written permission of the copyright holder.


Lưu ý: Dashboard này được thiết kế để hoạt động với CLIProxyAPI. Đảm bảo CLIProxyAPI đang chạy và có events trong Redis queue trước khi khởi động dashboard.