@goodandready/dsh-cost-meter 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -2
- package/README.ru.md +156 -0
- package/README.zh.md +144 -0
- package/docs/README.ru.md +23 -1
- package/docs/README.zh.md +17 -1
- package/docs/design/DESIGN.md +15 -0
- package/docs/plans/findings.md +11 -11
- package/docs/plans/progress.md +11 -24
- package/docs/plans/task_plan.md +29 -23
- package/lib/client.js +415 -141
- package/lib/index.js +128 -53
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,10 +18,20 @@
|
|
|
18
18
|
|
|
19
19
|
<p align="center">
|
|
20
20
|
<a href="README.md"><b>🇬🇧 English</b></a> •
|
|
21
|
-
<a href="
|
|
22
|
-
<a href="
|
|
21
|
+
<a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
|
|
22
|
+
<a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
|
+
<table align="center">
|
|
26
|
+
<tr>
|
|
27
|
+
<td align="center">
|
|
28
|
+
⭐ <strong>If you like this plugin, please star it on GitHub</strong> — it shows me that the plugin is useful to you and motivates me to keep developing it.
|
|
29
|
+
<br><br>
|
|
30
|
+
🐛 <strong>If you find a bug or would like to request a feature</strong>, open a GitHub issue in any language — I will review your proposal and implement useful suggestions in a future plugin version.
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
</table>
|
|
34
|
+
|
|
25
35
|
</div>
|
|
26
36
|
|
|
27
37
|
---
|
|
@@ -138,3 +148,16 @@ npm test
|
|
|
138
148
|
## 📄 License
|
|
139
149
|
|
|
140
150
|
MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
|
|
151
|
+
|
|
152
|
+
### Performance & Smart Cost Features (v0.8.1)
|
|
153
|
+
- **O(K) Rate Change Calculation**: Next schedule transition is resolved in $O(K)$ boundary hops instead of full-day iterations.
|
|
154
|
+
- **Server Cache & ETag**: High-throughput state polling with `304 Not Modified` support and internal tariff LRU cache.
|
|
155
|
+
- **Manual Catalog Sync**: On-demand catalog fetch via `POST /dsh-cost-meter/refresh` or UI "Sync Now" button.
|
|
156
|
+
- **Savings Advice & Budget Threshold**: Popover hints on impending off-peak discounts (50% off) and optional warning thresholds (`budgetThreshold`).
|
|
157
|
+
- **Quick Summary Export**: Instant markdown/text summary copy to clipboard.
|
|
158
|
+
|
|
159
|
+
### UI Refinements & Language Standards (v0.8.2)
|
|
160
|
+
- **Native Dot Status Indicator**: Header chip uses a refined status dot (green for off-peak, amber for peak, pulsing red for budget overrun, neutral for flat/idle) rather than full-fill backgrounds.
|
|
161
|
+
- **Context Cache Savings**: Automatically calculates and highlights financial savings gained from prompt caching (e.g. `Cache saved: ≈ $0.14 (-68%)`).
|
|
162
|
+
- **Multi-Model Accordion**: Clean collapsible list when 3 or more models are used in a single session.
|
|
163
|
+
- **DSH Locale Standards**: Full English (`en`) and Chinese (`zh`) locale dictionaries registered directly in the client bundle. Russian translations are provided externally via `@goodandready/dsh-russian-lang`.
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# 📦 @goodandready/dsh-cost-meter
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
<h3>Чип стоимости сессии, переключатель пиковых тарифов и мониторинг расходов токенов для DeepSeek Harness</h3>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@goodandready/dsh-cost-meter"><img src="https://img.shields.io/npm/v/@goodandready/dsh-cost-meter.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
|
|
9
|
+
<a href="../LICENSE"><img src="https://img.shields.io/github/license/GooDAnDReaDY/dsh-cost-meter.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
|
|
10
|
+
<a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
|
|
11
|
+
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<!-- Обязательная кнопка перехода на витрину всех проектов -->
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://goodandready.app/"><img src="https://img.shields.io/badge/Все_проекты_автора-goodandready.app-ff4500.svg?style=for-the-badge&logo=rocket&logoColor=white&labelColor=1a1a2e" alt="Все проекты автора"></a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="README.md"><b>🇬🇧 English</b></a> •
|
|
21
|
+
<a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
|
|
22
|
+
<a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<table align="center">
|
|
26
|
+
<tr>
|
|
27
|
+
<td align="center">
|
|
28
|
+
⭐ <strong>Если вам нравится этот плагин, поставьте ему звезду на GitHub</strong> — это покажет мне, что плагин вам полезен, и будет мотивировать меня развивать его дальше.
|
|
29
|
+
<br><br>
|
|
30
|
+
🐛 <strong>Если вы нашли баг или хотите предложить новый функционал</strong>, создайте issue на GitHub на любом языке — я рассмотрю ваше предложение и реализую полезные идеи в одной из следующих версий плагина.
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
</table>
|
|
34
|
+
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## ⚡ Обзор и решаемая проблема
|
|
40
|
+
|
|
41
|
+
Разработка с помощью ИИ-агентов и генерация кода требуют активного потребления токенов (промпты, рассуждения, контекстный кэш). Без непрерывного финансового контроля разработчики рискуют столкнуться с перерасходом бюджета или упустить окна 50% скидок внепикового тарифа.
|
|
42
|
+
|
|
43
|
+
**`@goodandready/dsh-cost-meter`** встраивает компактный высокоточный телеметрический чип прямо в заголовок диалога DeepSeek Harness (`conversation.session.header.utilities`):
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
● ≈ ₽8.55 0:17 ← Чип стоимости сессии в шапке с обратным отсчётом тарифа
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
По клику открывается интерактивная панель: тарифная сетка за 1M токенов (не-пик / пик с подсветкой активного режима), статус окон в UTC и детальная разбивка расходов текущей сессии по моделям.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 🏛️ Архитектура
|
|
54
|
+
|
|
55
|
+
```mermaid
|
|
56
|
+
graph TD
|
|
57
|
+
subgraph StreamTelemetry ["Рантайм DeepSeek Harness"]
|
|
58
|
+
Req["Запрос LLM / Заголовок<br/>(provider, model)"]
|
|
59
|
+
StreamHook["Потоковые инкрементальные чанки"]
|
|
60
|
+
Proj["Проекция costByModel<br/>(30-минутные слоты UTC)"]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
subgraph PricingCatalog ["Движок тарификации"]
|
|
64
|
+
Manual["Пользовательские цены<br/>(settings.yaml: prices)"]
|
|
65
|
+
DeepSeekTier["Сетка DeepSeek<br/>(Пик / 50% скидка не-пик)"]
|
|
66
|
+
OpenRouterTier["Каталог OpenRouter<br/>(Ежедневный кэш)"]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
subgraph UI ["Интерфейс пользователя"]
|
|
70
|
+
Chip["Чип стоимости в шапке<br/>(Тариф + таймер смены)"]
|
|
71
|
+
Modal["Модальное окно разбивки<br/>(Ставки за 1M, окна UTC, модели)"]
|
|
72
|
+
Settings["Карточка настроек<br/>(Валюта, курс USD, таймзона)"]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
Req --> Proj
|
|
76
|
+
StreamHook --> Proj
|
|
77
|
+
Proj --> Chip
|
|
78
|
+
PricingCatalog --> Proj
|
|
79
|
+
Manual --> PricingCatalog
|
|
80
|
+
DeepSeekTier --> PricingCatalog
|
|
81
|
+
OpenRouterTier --> PricingCatalog
|
|
82
|
+
Chip --> Modal
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## ✨ Ключевые возможности
|
|
88
|
+
|
|
89
|
+
1. **Живой расчёт во время стриминга**: расчёт стоимости инкрементально обновляется в реальном времени прямо во время генерации ответа.
|
|
90
|
+
2. **Двухуровневая сетка тарифов**: официальные пиковые окна DeepSeek (01:00–04:00 и 06:00–10:00 UTC) со скидкой 50% во внепиковое время.
|
|
91
|
+
3. **Иммутабельность получасовых слотов UTC**: исторические расходы сессии фиксируются по ставке слота и не пересчитываются задним числом при смене тарифа.
|
|
92
|
+
4. **Provider-aware тарификация**: раздельный учёт для прямых подключений DeepSeek и шлюзов OpenRouter.
|
|
93
|
+
5. **Гибкая настройка валюты**: поддержка пользовательских символов валют (`₽`, `$`, `€`, `¥`), курсов конвертации и таймзон.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 📦 Установка
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
dsh plugin --profile web add @goodandready/dsh-cost-meter
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Перезапустите экземпляр DeepSeek Harness и обновите страницу в браузере.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## ⚙️ Таблица конфигурации (`settings.yaml`)
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
dsh-cost-meter:
|
|
111
|
+
currency: "₽"
|
|
112
|
+
usdRate: 90.0
|
|
113
|
+
displayTimeZone: "Europe/Moscow"
|
|
114
|
+
useOpenRouter: true
|
|
115
|
+
prices: {}
|
|
116
|
+
modelMap: {}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Параметры конфигурации
|
|
120
|
+
|
|
121
|
+
| Параметр | Доступность | Тип | По умолчанию | Описание |
|
|
122
|
+
|:---|:---|:---|:---|:---|
|
|
123
|
+
| `currency` | GUI / `settings.yaml` | `string` | `"₽"` | Символ валюты в интерфейсе (например, `₽`, `$`, `€`) |
|
|
124
|
+
| `usdRate` | GUI / `settings.yaml` | `number` | `80.0` | Курс обмена: единиц валюты за 1 USD |
|
|
125
|
+
| `displayTimeZone` | GUI / `settings.yaml` | `string` | `"Europe/Moscow"` | IANA часовой пояс для отображения окон пика и не-пика |
|
|
126
|
+
| `useOpenRouter` | GUI / `settings.yaml` | `boolean` | `true` | Загружать ли каталог тарифов и скидочных окон OpenRouter |
|
|
127
|
+
| `refreshHours` | GUI / `settings.yaml` | `number` | `24` | Частота обновления каталога OpenRouter (в часах) |
|
|
128
|
+
| `deepseekPeakPrices` | Только `settings.yaml` | `object` | `{}` | Переопределение встроенных пиковых ставок DeepSeek по id модели |
|
|
129
|
+
| `prices` | Только `settings.yaml` | `object` | `{}` | Ручные ставки за 1M токенов `{ input, output, cacheHit?, cacheWrite? }` |
|
|
130
|
+
| `modelMap` | Только `settings.yaml` | `object` | `{}` | Сопоставление маршрута `"provider/model"` на id в OpenRouter |
|
|
131
|
+
| `manualPeakWindowsUtc` | Только `settings.yaml` | `array` | `[]` | Ручные окна пика HH:MM-HH:MM UTC для ручных ставок |
|
|
132
|
+
| `manualOffPeakMultiplier` | Только `settings.yaml` | `number` | `1.0` | Коэффициент тарифа вне ручных окон пика |
|
|
133
|
+
|
|
134
|
+
> **Интерфейс настроек (GUI) vs settings.yaml**: Основные параметры (`currency`, `usdRate`, `displayTimeZone`, `useOpenRouter`, `refreshHours`) настраиваются прямо в карточке интерфейса DSH (**Настройки → Плагины → Настройки плагинов → Cost Meter**). Расширенные структурированные правила сопоставления и ручных тарифов задаются через `settings.yaml` из-за сложной древовидной структуры.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 🧪 Тестирование
|
|
139
|
+
|
|
140
|
+
Запуск набора юнит-тестов:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npm test
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 📄 Лицензия
|
|
149
|
+
|
|
150
|
+
MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
|
|
151
|
+
|
|
152
|
+
### Производительность и интеллектуальные подсказки (v0.8.1)
|
|
153
|
+
- **Алгоритм O(K)**: Моментальный расчёт границ смены тарифов и мемоизация экстремумов без лишних циклов в браузере.
|
|
154
|
+
- **Серверный кэш и ETag**: Поддержка заголовка `304 Not Modified` для маршрута `/state` и кэширование сопоставлений моделей.
|
|
155
|
+
- **Ручная синхронизация**: Кнопка «Синхронизировать сейчас» в настройках с защитой от флуда (`POST /dsh-cost-meter/refresh`).
|
|
156
|
+
- **Подсказки экономии и порог бюджета**: Отсчёт времени до льготного окна (скидка 50%), порог сессии (`budgetThreshold`) и экспорт сводки в буфер обмена.
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# 📦 @goodandready/dsh-cost-meter
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
<h3>面向 DeepSeek Harness 的会话实时花费计费芯片、波峰/波谷阶梯电价与 Token 监控插件</h3>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@goodandready/dsh-cost-meter"><img src="https://img.shields.io/npm/v/@goodandready/dsh-cost-meter.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
|
|
9
|
+
<a href="../LICENSE"><img src="https://img.shields.io/github/license/GooDAnDReaDY/dsh-cost-meter.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
|
|
10
|
+
<a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
|
|
11
|
+
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<!-- 作者所有项目展示页面链接 -->
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://goodandready.app/"><img src="https://img.shields.io/badge/作者所有开源项目-goodandready.app-ff4500.svg?style=for-the-badge&logo=rocket&logoColor=white&labelColor=1a1a2e" alt="所有项目"></a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="README.md"><b>🇬🇧 English</b></a> •
|
|
21
|
+
<a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
|
|
22
|
+
<a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<table align="center">
|
|
26
|
+
<tr>
|
|
27
|
+
<td align="center">
|
|
28
|
+
⭐ <strong>如果您喜欢这个插件,请在 GitHub 上为它点亮 Star</strong> — 这能让我知道插件对您有用,并鼓励我继续开发和维护它。
|
|
29
|
+
<br><br>
|
|
30
|
+
🐛 <strong>如果您发现 Bug 或希望增加功能</strong>,请使用任意语言在 GitHub 上提交 Issue — 我会评估您的建议,并在后续版本中实现有价值的改进。
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
</table>
|
|
34
|
+
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## ⚡ 概述与核心痛点
|
|
40
|
+
|
|
41
|
+
在使用智能体与大语言模型编程时,模型推理、长上下文以及缓存读写会产生大量 Token 消耗。如果缺乏实时的财务监控,开发者容易错过官方 50% 闲时折扣窗口,或因死循环导致账单超出预算。
|
|
42
|
+
|
|
43
|
+
**`@goodandready/dsh-cost-meter`** 在 DeepSeek Harness 会话顶部工具栏(`conversation.session.header.utilities`)无缝嵌入高精度花费微件芯片:
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
● ≈ ¥0.85 0:17 ← 会话顶部实时花费芯片与换价倒计时
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
点击芯片可展开交互式详情面板:按每 1M Token 展示峰谷两档费率表格(高亮显示当前激活档位)、UTC 优惠时间段状态以及各模型在当前会话中的累计消费明细。
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 🏛️ 架构设计
|
|
54
|
+
|
|
55
|
+
```mermaid
|
|
56
|
+
graph TD
|
|
57
|
+
subgraph StreamTelemetry ["DSH 流式遥测运行时"]
|
|
58
|
+
Req["LLM 请求 / 报头<br/>(provider, model)"]
|
|
59
|
+
StreamHook["增量流式分片 Hook"]
|
|
60
|
+
Proj["costByModel 会话投影<br/>(半小时 UTC 时隙)"]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
subgraph PricingCatalog ["费率解析引擎"]
|
|
64
|
+
Manual["自定义费率配置<br/>(settings.yaml: prices)"]
|
|
65
|
+
DeepSeekTier["DeepSeek 官方费率<br/>(高峰 / 闲时 50% 折扣)"]
|
|
66
|
+
OpenRouterTier["OpenRouter 公开目录<br/>(每日自动缓存)"]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
subgraph UI ["用户交互界面"]
|
|
70
|
+
Chip["顶部花费芯片<br/>(实时计费 + 换价倒计时)"]
|
|
71
|
+
Modal["消费明细抽屉面板<br/>(1M 单价表, UTC 时段, 模型清单)"]
|
|
72
|
+
Settings["设置卡片<br/>(币种符号, 汇率, 时区)"]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
Req --> Proj
|
|
76
|
+
StreamHook --> Proj
|
|
77
|
+
Proj --> Chip
|
|
78
|
+
PricingCatalog --> Proj
|
|
79
|
+
Manual --> PricingCatalog
|
|
80
|
+
DeepSeekTier --> PricingCatalog
|
|
81
|
+
OpenRouterTier --> PricingCatalog
|
|
82
|
+
Chip --> Modal
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## ✨ 核心特性
|
|
88
|
+
|
|
89
|
+
1. **增量流式实时计算**:在模型打字生成过程中毫秒级更新 Prompt、Completion 和 Cache 费用,无轮询无卡顿。
|
|
90
|
+
2. **两级阶梯电价引擎**:支持 DeepSeek 官方高峰时段(UTC 01:00–04:00 与 06:00–10:00)及闲时 50% 优惠折扣自动匹配。
|
|
91
|
+
3. **UTC 半小时时隙不可变性**:历史消费严格锁定在消耗发生时刻的时隙费率,切换费率不溯及既往。
|
|
92
|
+
4. **服务商智能路由**:精准区分直连 DeepSeek 服务商与 OpenRouter 等代理网关。
|
|
93
|
+
5. **多币种与本地化**:支持自定义货币符号(`¥`, `$`, `€`, `₽`)、汇率换算与显示时区。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 📦 快速安装
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
dsh plugin --profile web add @goodandready/dsh-cost-meter
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
重启 DeepSeek Harness 实例并刷新浏览器页面。
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## ⚙️ 配置项说明 (`settings.yaml`)
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
dsh-cost-meter:
|
|
111
|
+
currency: "¥"
|
|
112
|
+
usdRate: 7.2
|
|
113
|
+
displayTimeZone: "Asia/Shanghai"
|
|
114
|
+
useOpenRouter: true
|
|
115
|
+
prices: {}
|
|
116
|
+
modelMap: {}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 配置参数列表
|
|
120
|
+
|
|
121
|
+
| 参数项 | 类型 | 默认值 | 说明 |
|
|
122
|
+
|:---|:---|:---|:---|
|
|
123
|
+
| `currency` | `string` | `"¥"` | 显示的货币符号或代码 |
|
|
124
|
+
| `usdRate` | `number` | `7.2` | 美元到目标货币的换算汇率 |
|
|
125
|
+
| `displayTimeZone` | `string` | `"Asia/Shanghai"` | 界面中优惠时间段显示的参考时区 |
|
|
126
|
+
| `useOpenRouter` | `boolean` | `true` | 是否加载 OpenRouter 价格表作为备用 |
|
|
127
|
+
| `prices` | `object` | `{}` | 自定义每 1M Token 的费率覆盖 |
|
|
128
|
+
| `modelMap` | `object` | `{}` | 模型别名映射表 |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 🧪 自动化测试
|
|
133
|
+
|
|
134
|
+
运行单元测试套件:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
npm test
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 📄 许可证
|
|
143
|
+
|
|
144
|
+
MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
|
package/docs/README.ru.md
CHANGED
|
@@ -17,11 +17,21 @@
|
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
<p align="center">
|
|
20
|
-
<a href="
|
|
20
|
+
<a href="README.md"><b>🇬🇧 English</b></a> •
|
|
21
21
|
<a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
|
|
22
22
|
<a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
|
+
<table align="center">
|
|
26
|
+
<tr>
|
|
27
|
+
<td align="center">
|
|
28
|
+
⭐ <strong>Если вам нравится этот плагин, поставьте ему звезду на GitHub</strong> — это покажет мне, что плагин вам полезен, и будет мотивировать меня развивать его дальше.
|
|
29
|
+
<br><br>
|
|
30
|
+
🐛 <strong>Если вы нашли баг или хотите предложить новый функционал</strong>, создайте issue на GitHub на любом языке — я рассмотрю ваше предложение и реализую полезные идеи в одной из следующих версий плагина.
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
</table>
|
|
34
|
+
|
|
25
35
|
</div>
|
|
26
36
|
|
|
27
37
|
---
|
|
@@ -138,3 +148,15 @@ npm test
|
|
|
138
148
|
## 📄 Лицензия
|
|
139
149
|
|
|
140
150
|
MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
|
|
151
|
+
|
|
152
|
+
### Производительность и интеллектуальные подсказки (v0.8.1)
|
|
153
|
+
- **Алгоритм O(K)**: Моментальный расчёт границ смены тарифов и мемоизация экстремумов без лишних циклов в браузере.
|
|
154
|
+
- **Серверный кэш и ETag**: Поддержка заголовка `304 Not Modified` для маршрута `/state` и кэширование сопоставлений моделей.
|
|
155
|
+
- **Ручная синхронизация**: Кнопка «Синхронизировать сейчас» в настройках с защитой от флуда (`POST /dsh-cost-meter/refresh`).
|
|
156
|
+
- **Подсказки экономии и порог бюджета**: Отсчёт времени до льготного окна (скидка 50%), порог сессии (`budgetThreshold`) и экспорт сводки в буфер обмена.
|
|
157
|
+
|
|
158
|
+
### Визуальные улучшения и языковой стандарт (v0.8.2)
|
|
159
|
+
- **Нативный точечный индикатор**: В шапке используется аккуратная статусная точка (зелёная — скидка 50%, янтарная — пик, красная пульсирующая — превышен бюджет).
|
|
160
|
+
- **Строка экономии кэша**: Отображение сэкономленных средств за счёт кэша контекста (например: `Кэш сэкономил: ≈ $0.14 (-68%)`).
|
|
161
|
+
- **Компактный список моделей**: Аккордеон со сворачиванием списка при использовании 3+ моделей в сессии.
|
|
162
|
+
- **Стандарт локализации DSH**: Встроенные словари `en` и `zh`. Русский язык предоставляется через `dsh-russian-lang`.
|
package/docs/README.zh.md
CHANGED
|
@@ -17,11 +17,21 @@
|
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
<p align="center">
|
|
20
|
-
<a href="
|
|
20
|
+
<a href="README.md"><b>🇬🇧 English</b></a> •
|
|
21
21
|
<a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
|
|
22
22
|
<a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
|
+
<table align="center">
|
|
26
|
+
<tr>
|
|
27
|
+
<td align="center">
|
|
28
|
+
⭐ <strong>如果您喜欢这个插件,请在 GitHub 上为它点亮 Star</strong> — 这能让我知道插件对您有用,并鼓励我继续开发和维护它。
|
|
29
|
+
<br><br>
|
|
30
|
+
🐛 <strong>如果您发现 Bug 或希望增加功能</strong>,请使用任意语言在 GitHub 上提交 Issue — 我会评估您的建议,并在后续版本中实现有价值的改进。
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
</table>
|
|
34
|
+
|
|
25
35
|
</div>
|
|
26
36
|
|
|
27
37
|
---
|
|
@@ -132,3 +142,9 @@ npm test
|
|
|
132
142
|
## 📄 许可证
|
|
133
143
|
|
|
134
144
|
MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
|
|
145
|
+
|
|
146
|
+
### 界面优化与语言规范 (v0.8.2)
|
|
147
|
+
- **原生状态圆点指示器**:顶部芯片采用更精简的原生状态圆点(绿色代表低谷优惠,琥珀色代表高峰,红色脉冲代表超出预算上限,灰色代表平价/空闲)。
|
|
148
|
+
- **上下文缓存节省提示**:自动计算并高亮显示命中提示词缓存所节省的费用(例如:`上下文缓存节省:≈ $0.14 (-68%)`)。
|
|
149
|
+
- **多模型折叠列表**:当单次会话中使用 3 个或更多模型时,提供紧凑的可折叠模型明细展示。
|
|
150
|
+
- **DSH 规范双语支持**:插件内置完整的英文(`en`)与中文(`zh`)语言字典。
|
package/docs/design/DESIGN.md
CHANGED
|
@@ -86,6 +86,21 @@
|
|
|
86
86
|
- Не допускать утечек локальных путей и инфраструктурных данных в коде или документации.
|
|
87
87
|
|
|
88
88
|
## History & Decisions
|
|
89
|
+
- 2026-09-13 (v0.8.2):
|
|
90
|
+
- Приведение к стандарту локализации DSH (dsh-plugin-authoring): английский (en) — исходный и fallback-язык, китайский (zh) — обязательная пользовательская локаль. Русский словарь вынесен из плагина; все строки для русского интерфейса переданы в goodandready/dsh-russian-lang.
|
|
91
|
+
- Нативный точечный dot-индикатор статуса чипа в шапке (.dcm-dot): зеленый (off-peak), янтарный (peak), красный пульсирующий (budget exceeded), серый (idle/unknown).
|
|
92
|
+
- Адаптивное скрытие таймера чипа на экранах < 680px при сохранении суммы расхода.
|
|
93
|
+
- Расчёт и отображение выгоды от контекстного кэша (Cache Savings): строка 'Cache saved: ≈ $X.XX (-Y%)' при наличии cacheReadTokens.
|
|
94
|
+
- Компактный список моделей с аккордеоном при 3+ задействованных моделях сессии.
|
|
95
|
+
- 2026-09-12 (v0.8.1):
|
|
96
|
+
- Оптимизация производительности расчёта тарифов: замена 1440-минутного цикла на алгоритм O(K) по точкам перехода и мемоизация экстремумов через WeakMap.
|
|
97
|
+
- Серверный кэш разрешения тарифов resolveTariffCache (Map) с автоматической очисткой при обновлении каталога.
|
|
98
|
+
- Поддержка ETag и ответа 304 Not Modified на эндпоинте /dsh-cost-meter/state.
|
|
99
|
+
- Кнопка ручной синхронизации каталога цен в секции OpenRouter с защитой от флуда (cooldown 30 сек).
|
|
100
|
+
- Интеллектуальные подсказки экономии: плашка скорого наступления льготного тарифа (скидка 50%) и отсчёт времени.
|
|
101
|
+
- Поддержка настраиваемого порога бюджета сессии (budgetThreshold) с предупреждающей подсветкой чипа.
|
|
102
|
+
- Кнопка быстрого копирования текстового отчёта о расходах в буфер обмена.
|
|
103
|
+
- Таблица нормализации алиасов вендоров (z-ai -> zai, deepseek-official -> deepseek, gemini -> google).
|
|
89
104
|
- 2026-09-05 (v0.7.9):
|
|
90
105
|
- Hotfix: исправлен ReferenceError (t is not defined) в объекте словаря ru (lib/client.js) (#15).
|
|
91
106
|
- Добавлен автоматический тест на чистое исполнение фабрики client loader (`test/public-route.test.mjs`).
|
package/docs/plans/findings.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Findings: Issue #
|
|
1
|
+
# Findings: Issue #27 (v0.8.2)
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
- `refreshMirrorUntilVisible(ctx)` обеспечивает доступность зеркала настроек в `settingsScope`.
|
|
7
|
-
- Бейджи статуса (`cb-badge-ok`, `cb-badge-warn`, `cb-badge-bad`) позволяют пользователю моментально оценить состояние плагина.
|
|
3
|
+
## 1. Точечный индикатор статуса
|
|
4
|
+
- Сплошной яркий фон чипа в тулбаре DSH перетягивает на себя внимание от основного чата.
|
|
5
|
+
- Нативный паттерн DSH: нейтральный полупрозрачный фон с цветной точкой (dot indicator 6x6px) и моноширинным текстом `tabular-nums`.
|
|
8
6
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
## 2. Экономия кэша (Cache Savings)
|
|
8
|
+
- При использовании кэша провайдера (DeepSeek, Claude, Gemini) стоимость `cacheReadTokens` значительно ниже `uncachedInputTokens` (у DeepSeek: $0.014 vs $0.14-$0.44 за 1M токенов).
|
|
9
|
+
- Разница между стоимостью токенов без кэша (`cacheReadTokens * inputRate`) и фактической стоимостью (`cacheReadTokens * cacheHitRate`) наглядно демонстрирует реальную экономию пользователя прямо в поповере.
|
|
10
|
+
|
|
11
|
+
## 3. Стандарт локализации
|
|
12
|
+
- По стандарту DSH (`dsh-plugin-authoring`, `dhs-plugin-release-workflow`), плагин обязан иметь `en` как канонический исходный и `zh` как обязательную локаль.
|
|
13
|
+
- Русский перевод не зашивается в плагин, а поставляется через отдельный плагин `dsh-russian-lang`. Для синхронизации перевода открывается issue в репозитории `goodandready/dsh-russian-lang`.
|
package/docs/plans/progress.md
CHANGED
|
@@ -1,25 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
# Progress: Issue #23 — Стабилизация кода и редизайн UI по стандарту dsh-clinebot
|
|
1
|
+
# Progress: Issue #27 (v0.8.2)
|
|
3
2
|
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- [x] Внедрён `createErrorBoundary()` для защиты слотов от падений
|
|
15
|
-
- [x] Внедрён `refreshMirrorUntilVisible(ctx)` для синхронизации настроек
|
|
16
|
-
- [x] Внедрена нативная CSS-система дизайн-токенов (`--dsw-alias-*`)
|
|
17
|
-
- [x] Шапка карточки снабжена бейджами статуса каталога, тарифа и таймзоны
|
|
18
|
-
- [x] Настройки структурированы по 3 секциям (`Основные параметры`, `Каталог OpenRouter`, `Диагностика`)
|
|
19
|
-
- [x] Модернизирован поповер шапки сессии
|
|
20
|
-
- [x] Обновлена документация (`DESIGN.md`, `README.md`, `docs/README.ru.md`)
|
|
21
|
-
- [x] Поднята версия до `0.7.10` в `package.json`
|
|
22
|
-
- [x] Написаны и успешно пройдены 16 тестов в `test/stability-and-visual.test.mjs` (`npm test` 16/16 pass)
|
|
23
|
-
- [ ] Оформление коммита, push ветки и создание PR #24
|
|
24
|
-
- [ ] Merge PR в `main` и сборка тарбола
|
|
25
|
-
- [ ] Тестирование на проде, публикация релиза v0.7.10 и закрытие Issue #23
|
|
3
|
+
- **2026-09-13 15:06**:
|
|
4
|
+
- Создана Gitea Issue #27.
|
|
5
|
+
- Развернут worktree `.worktrees/issue-27` на ветке `feat/issue-27-ui-and-locales`.
|
|
6
|
+
- Зафиксированы планы и стандарты в `docs/plans/`.
|
|
7
|
+
|
|
8
|
+
- **2026-09-13 15:08**:
|
|
9
|
+
- Реализованы улучшения в `lib/client.js` (dot status indicator, cache savings display, multi-model accordion, en/zh locales).
|
|
10
|
+
- Добавлены тесты в `test/v082-ui-locales.test.mjs` (все 22 теста успешно пройдены).
|
|
11
|
+
- Версия обновлена до `0.8.2`.
|
|
12
|
+
- Документация актуализирована на en, zh, ru.
|
package/docs/plans/task_plan.md
CHANGED
|
@@ -1,25 +1,31 @@
|
|
|
1
|
-
# Task Plan: Issue #
|
|
1
|
+
# Task Plan: Issue #27 (v0.8.2) — Визуальная индикация шапки/поповера и стандарт локализации en/zh
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
3
|
+
## Цели
|
|
4
|
+
1. **Визуальные улучшения шапки и поповера**:
|
|
5
|
+
- Чип в шапке: точечный dot-индикатор (зеленый/янтарный/красный/серый) вместо сплошного фона, аккуратная интеграция с тулбаром DSH.
|
|
6
|
+
- Адаптивное скрытие таймера на узких экранах, сохранение суммы.
|
|
7
|
+
- Индикация экономии контекстного кэша (Cache Savings): строка `Cache saved: ≈ $X.XX (-Y%)`.
|
|
8
|
+
- Компактный список/аккордеон при нескольких моделях сессии (3+ модели).
|
|
9
|
+
- Точные нативные токены тем DSH.
|
|
10
|
+
2. **Стандарт локализации DSH**:
|
|
11
|
+
- Исходный и fallback язык: `en`.
|
|
12
|
+
- Обязательная локаль: `zh` (полный набор эквивалентных ключей).
|
|
13
|
+
- Исключение зашитого `ru` словаря из плагина.
|
|
14
|
+
- Создание Issue в `goodandready/dsh-russian-lang` со всеми строками для русского перевода.
|
|
15
|
+
3. **Документация и релиз**:
|
|
16
|
+
- Версия `0.8.2` (инкремент только `z`).
|
|
17
|
+
- Актуализация `docs/design/DESIGN.md`, `README.md` (en), `docs/README.zh.md` (zh), `docs/README.ru.md` (ru).
|
|
18
|
+
- 100% покрытие unit-тестами без внешних зависимостей.
|
|
19
|
+
- Валидация на test server (`:3082`) и на production (`:3080`).
|
|
20
|
+
- Запрос подтверждения -> публикация v0.8.2.
|
|
5
21
|
|
|
6
|
-
##
|
|
7
|
-
- [
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- [ ]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- [ ] Единая CSS-система дизайн-токенов (`.dcm-section-card`, `.dcm-badge`, `.dcm-grid-2`, `.dcm-btn`, `.dcm-alert-*`)
|
|
17
|
-
- [ ] Структурирование настроек по 3 логическим секциям с бейджами статуса в шапке
|
|
18
|
-
- [ ] Модернизация поповера шапки на классы дизайн-системы
|
|
19
|
-
- [ ] Локализация новых ключей (`ru`, `en`)
|
|
20
|
-
- [ ] 3. Обновление документации:
|
|
21
|
-
- [ ] Актуализация `docs/design/DESIGN.md`, `README.md`, `docs/README.ru.md`
|
|
22
|
-
- [ ] 4. Тестирование:
|
|
23
|
-
- [ ] Написание юнит-тестов `test/stability-and-visual.test.mjs`
|
|
24
|
-
- [ ] Прогон всех тестов (`npm test`)
|
|
25
|
-
- [ ] 5. Сборка, PR, релиз v0.7.10, верификация на MiniAI и закрытие Issue #23
|
|
22
|
+
## Статус выполнения
|
|
23
|
+
- [x] Issue #27 создана
|
|
24
|
+
- [x] Worktree `.worktrees/issue-27` развернут
|
|
25
|
+
- [x] Реализация `lib/client.js` (UI шапки/поповера, расчет cache savings, словари en/zh)
|
|
26
|
+
- [x] Обновление тестов в `test/`
|
|
27
|
+
- [x] Обновление документации (`DESIGN.md`, `README.md`, `README.zh.md`, `README.ru.md`)
|
|
28
|
+
- [ ] Регистрация Issue в `goodandready/dsh-russian-lang`
|
|
29
|
+
- [ ] Сборка и приёмка кандидата (:3082, :3080)
|
|
30
|
+
- [ ] Публикация релиза v0.8.2
|
|
31
|
+
- [ ] Закрытие Issue #27 и cleanup worktree
|