bowenliang123/dsh-context
bowenliang123/dsh-contextDSH 上下文洞察面板:Context 仪表盘 + /context命令 + Context 浏览器,查看 Context的分类组成、内容详情、演进趋势、压缩/注入事件、统计等一站式 Context 全生命周期管理。
在输入框坞区显示以卢布计的当前会话费用:当前时段与倒计时、该时段的 API 费用、央行汇率、含 subagent 的合计、缓存节省与 DeepSeek 平台余额。
A DeepSeek Harness plugin: it shows the cost of the current session in rubles in
the conversation dock, next to the built-in token counters
(conversation.composer.dock).

The capture above still shows the former "API cost" row, which the card replaced with the price list; swap in a fresh screenshot the next time the card is opened.
The pill is a button. Clicking it opens a card styled after the built-in "Token usage" popover; a second click, a click outside the card, or Escape closes it. During peak hours the ruble amount on the pill is printed in amber — the same warning colour the tariff row uses.
Published on npm as @stmol/dsh-rub-cost.
Any DSH bundle source works: an npm package, a Git repository, a tarball, or a
local folder.
@stmol/dsh-rub-cost, or the
repository address.dsh plugin add @stmol/dsh-rub-cost.The install name is the name field in package.json; the name in
cordis.patch.yml and the factory id in client.js have to match it, or the
bundle will not build. There are no automatic updates: remove the plugin and add
it again. The plugin runs with your own privileges.
Model, the current tariff and the countdown to its switch, the API price list in dollars per 1M output tokens at the tariff in effect, the CBR rate with its publication date, the cost of the session including subagents, the same session without a cache and the savings, and the DeepSeek Platform wallet balances. The session cost itself is the ruble amount on the pill and in the card header; the card does not repeat it in dollars.
Every ruble amount is shown with two decimals. The price list also keeps two and adds a third or fourth digit when needed to preserve a finer rate. The token breakdown stays out of the card, because the neighbouring "Token usage" cell already prints it.
Peak hours cost twice the off-peak rate. The tariff row names only the window in
effect, for example peak hours (04:00-07:00) highlighted in amber, or
off-peak. Peak hours are Beijing weekdays 09:00-12:00 and 14:00-18:00, printed
in your browser's timezone — 04:00-07:00 and 09:00-13:00 at UTC+3, and the same
windows shifted by your own offset; weekends are off-peak around the
clock. The tariff itself is never computed in your zone: the rule stays in
Beijing time, and only the printed clock moves, so the amount is the same
wherever the card is opened. The countdown follows from that rule alone, so on a
Friday it runs into the next week: 63h 00m just after 13:00 MSK, 61h 47m at
14:13 MSK. The rule assumes the following Monday is an ordinary working day; a
PRC holiday moves the real switch, as the first limitation below explains.
cost = (uncachedInput + cacheWrite) × cacheMiss + cacheRead × cacheHit + output × output
Tokens are priced with DeepSeek's official dollar list per 1M tokens, then converted at the CBR USD/RUB rate. The account is billed in dollars, so the dollar list is the basis; the yuan list on the Chinese documentation page is the same list at the fixed 20/3 ¥/$ rate. A usage report can show amounts in CNY while a granted yuan balance is being spent, which is that same list again.
Tokens come from the host tokenUsage projection and the model from
modelSelection.lastUsed; the plugin never folds the session journal itself. The
price rows print the same model's MODEL_PRICES entry for the tariff in effect,
so they move only when the tariff or the model does. The rate comes from a mirror
of the CBR rates and is cached in localStorage: with no network the last known
rate is used, and with no cache the cell shows a dash and the reason in the
tooltip.
The pill and the card header are a running total: the cost of the current session, not of the account and not a per-request price. Subagents are priced from their own route and summed into a separate "Total with subagents" row; while the card is open their spend is polled every 15 seconds. If even one child cannot be read, that row is hidden rather than shown incomplete.
tokenUsage holds a whole-session total with no per-route split, so after a
mid-session model change everything is estimated with the last used model.x-client-version. The version is hardcoded in
client.js and has to be updated by hand after a DSH upgrade.remote.account.getProfile) exposes no timezone. When the
browser reports no zone at all, the card falls back to DEFAULT_OFFSET_MS
(UTC+3).MODEL_PRICES, BILLING_CURRENCY and RATE_URL sit at the top of client.js;
DEFAULT_OFFSET_MS next to them is the fallback clock offset (UTC+3) for a
browser that reports none. After an edit the bundle has to be reinstalled: remove
and add the plugin in the UI, or dsh plugin add <path-to-plugin-directory>.
MIT, see LICENSE.