sandbase-harness
sandbaseai
Local-first, self-hosted AI agent runtime and MCP bridge with sandboxed sessions, memory, credentials, audit/replay, and a local Console.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:jianweideng0515-create/dsh-usage-stats
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
DSH Web 的 API 用量统计插件:精确统计 token、请求、轮次、缓存命中率与费用,同时监控 OpenCode 订阅配额与 DeepSeek 官方余额。装完即用,无需任何配置。
| 精确计量 | 直接读取 provider usage 报告,采用 DSH 的 (turn, step) 替换语义——非启发式估算 |
| 独立插件 | 不属于 dsh-web-ui 家族,经官方 settings.section 槽挂载为设置页专属 Tab |
| 多提供商余额 | OpenCode 配额与 DeepSeek 余额并行快照,各自失败互不影响 |
用量概览 Tab
模型与缓存 Tab
余额与配额 Tab
其他
alertDailyCost 时顶部常驻横幅
npm i @abcdefu_cja/dsh-usage-stats
dsh plugin --profile web add @abcdefu_cja/dsh-usage-stats
git clone https://github.com/jianweideng0515-create/dsh-usage-stats
dsh plugin --profile web add link:/path/to/dsh-usage-stats
安装后重启 dsh web,设置页左侧导航出现「用量统计」入口:
也可写入个人 DSH 覆盖层 ~/.dsh/config.yaml(保存即热加载):
- insert:
- id: usage-stats
name: '@abcdefu_cja/dsh-usage-stats'
config:
enabled: true
currency: CNY
balance:
mode: auto
refreshMs: 600000
所有配置项均可选,默认值见下表。
| Key | 类型 | 默认 | 含义 |
|---|---|---|---|
enabled |
boolean |
true |
总开关 |
currency |
string |
CNY |
费用与余额的显示货币(¥ / $) |
alertDailyCost |
number |
关 | 日费用阈值:今日费用达到该值时页面顶部渲染超限横幅 |
prices |
Record<string, ModelPrice> |
内置 DeepSeek 价目 | 每百万 token 单价,按模型键覆盖内置表 |
defaultPrice |
ModelPrice |
无(按 0 计) | 未在 prices 中的模型的兜底单价 |
balance.mode |
'auto' \| 'manual' \| 'off' |
auto |
auto 自动检测已知 provider;manual 固定端点;off 关闭 |
balance.baseUrl |
string |
无 | 余额端点基址(manual 必填) |
balance.path |
string |
/user/balance |
追加到基址的路径 |
balance.apiKeyEnv |
string |
DEEPSEEK_API_KEY |
存放 API key 的环境变量名 |
balance.refreshMs |
number |
600000 |
余额刷新间隔(毫秒,最小 1000) |
ModelPrice 为 { input, cacheRead, cacheWrite, output }(每百万 token,非负数)。内置 DeepSeek 价目:
| 模型 | input | cacheRead | cacheWrite | output |
|---|---|---|---|---|
deepseek-chat |
2 | 0.5 | 2 | 8 |
deepseek-reasoner |
4 | 1 | 4 | 16 |
auto 模式同时检测以下 provider(端点内置,profile 无 baseURL 也可推断):
| provider | 端点 | key 环境变量 | 展示 |
|---|---|---|---|
| OpenCode Go | GET opencode.ai/zen/go/v1/usage |
OPENCODE_GO_API_KEY |
订阅配额三窗口 |
| DeepSeek | GET api.deepseek.com/user/balance |
DEEPSEEK_API_KEY |
金额余额 + 预计可用天数 |
key 优先进程环境变量,其次 ~/.dsh/.credentials.yaml。
flowchart LR
A["session/event 流(全局)"] --> B["宿主端 UsageStatsMeter"]
B --> C[("dsh-usage-stats.json<br/>防抖落盘")]
B --> D["/api/dsh-usage-stats/*<br/>loopback 围栏"]
D --> E["浏览器端 Tab / 会话面板<br/>30s 轮询 + ETag"]
F["OpenCode /usage"] --> G["余额客户端(并行)"]
H["DeepSeek /user/balance"] --> G
G --> D
session/event(全局),把每次请求折入 UsageStatsMeter,按日(本地时区)与分模型桶聚合。落盘原子写(tmp + rename,损坏转 .bak 重建);余额客户端并行拉取全部已检测 provider,各自失败互不影响。settings.section 槽)+ 会话页用量按钮(conversation.session.header.utilities 槽)。inject / Config / apply,无默认导出;计量、计价、存储、查询与 provider 检测均为纯函数并有单元测试。pnpm install
pnpm build # tsc -b && tsdown(宿主 ESM + 浏览器闭包工厂 bundle)
pnpm test # vitest:宿主纯函数单测 + jsdom 组件测试
源码结构:
src/
├─ index.ts # 装配:事件订阅 / 落盘 / 路由注册 / 余额定时器
├─ meter.ts # 计量状态机(token / 请求 / 轮次 / 费用)
├─ query.ts # 区间聚合(补零时间轴)
├─ pricing.ts # 价目表计费
├─ balance.ts # 多 provider 快照客户端
├─ provider-detect.ts # 端点自动检测
├─ routes.ts # 只读 HTTP 路由(loopback 围栏)
├─ store.ts # 原子落盘
└─ client/ # 浏览器端(卡片 / 图表 / 会话面板 / 设置)
BSD-3-Clause,见 LICENSE。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: monitoring。