The official DeepSeek dashboard shows total spending but not per API key. If you have 5 keys for different projects or team members, you can't tell which one drains the budget.
PayByKey answers that question.
- KPI cards — total cost, requests, tokens, cache hit rate
- 4 charts — cost by model, by API key, by token type, cache hit rate trend
- Detail table — line-by-line breakdown with pagination and filtering
- Filters — month, date range, model, type, API key
- All Time mode — merge all monthly CSV files into one report
- CSV upload — via web interface
- Dark/light theme — smooth CSS transition, no page reload
- Rate limiting —
/uploadprotected from abuse
| Layer | Tool |
|---|---|
| Backend | FastAPI + Uvicorn |
| Data | Pandas |
| Charts | Plotly |
| Templates | Jinja2 |
| Frontend | Bootstrap 5 + vanilla JS |
| Deployment | Docker + uv |
DeepSeek CSV → data_loader.py (Pandas) → charts.py (Plotly) → app.py (FastAPI)
↓
/api/dashboard (JSON)
↓
dashboard.html (AJAX)
data_loader.py—preprocess()cleans CSV, adds cost column, drops zeros & NaN.apply_filters()builds boolean mask.get_total_metrics()computes KPI,get_daily_cache_hit_rate()viapivot_table.charts.py— builds Plotly charts with manual theme control (background colors, grid, legend). Returns HTML fragments.app.py— two endpoints:/(server render) and/api/dashboard(AJAX JSON). Single helper function shared by both.- AJAX + AbortController — previous fetch cancelled on rapid theme/filter changes, new charts fade in (CSS opacity transition).
# Local
uv sync
uv run uvicorn app:app --host 0.0.0.0 --port 8000
# Docker
docker build -t paybykey .
docker run -p 8000:8000 paybykeyOpen http://localhost:8000. Upload CSV via the Upload button or drop files into data/.
- Log in at platform.deepseek.com
- Go to Usage → select month → click Export
- Unzip the downloaded package
- Use the
amountCSV file (contains per-key breakdown)
If this project helps you, I'd appreciate a ⭐ star! Open to suggestions and contributions.
Официальный дашборд DeepSeek показывает общие расходы, но не по API-ключам. Если у вас 5 ключей для разных проектов или сотрудников — непонятно, какой из них тратит бюджет.
PayByKey отвечает на этот вопрос.
- KPI-карточки — общая стоимость, запросы, токены, cache hit rate
- 4 графика — стоимость по моделям, по ключам, по типам токенов, динамика cache hit rate
- Детальная таблица — построчная расшифровка с пагинацией и фильтрацией
- Фильтры — месяц, диапазон дат, модель, тип, API-ключ
- Режим All Time — склеивание всех CSV в один отчёт
- Загрузка CSV — через веб-интерфейс
- Тёмная/светлая тема — плавная CSS-анимация, без перезагрузки
- Rate limiting — защита
/uploadот злоупотребления
| Слой | Инструмент |
|---|---|
| Бэкенд | FastAPI + Uvicorn |
| Данные | Pandas |
| Графики | Plotly |
| Шаблоны | Jinja2 |
| Фронтенд | Bootstrap 5 + vanilla JS |
| Запуск | Docker + uv |
CSV DeepSeek → data_loader.py (Pandas) → charts.py (Plotly) → app.py (FastAPI)
↓
/api/dashboard (JSON)
↓
dashboard.html (AJAX)
data_loader.py—preprocess()чистит CSV, добавляет колонку cost, удаляет нули и NaN.apply_filters()строит boolean mask.get_total_metrics()считает KPI,get_daily_cache_hit_rate()черезpivot_table.charts.py— строит Plotly-графики с ручной настройкой темы (цвет фона, сетка, легенда). Возвращает HTML-фрагменты.app.py— два эндпоинта:/(серверный рендеринг) и/api/dashboard(JSON для AJAX). Один хелпер на оба.- AJAX + AbortController — при быстрой смене темы или фильтров предыдущий fetch отменяется, новые графики появляются плавно (CSS opacity transition).
# Локально
uv sync
uv run uvicorn app:app --host 0.0.0.0 --port 8000
# Docker
docker build -t paybykey .
docker run -p 8000:8000 paybykeyОткрыть http://localhost:8000. CSV загружается кнопкой Upload в интерфейсе или в папку data/.
- Войти на platform.deepseek.com
- Usage → выбрать месяц → Export
- Распаковать архив
- Нужен файл
amount(содержит разбивку по ключам)
Если проект оказался полезным — поставьте ⭐! Открыт к предложениям и доработкам.
