Skip to content

dsh-glm-meter

Verified

dsh-glm-meter · v0.2.0-rc.2-v0.2 · MIT · Web UI

Provider quota widget for the DSH web surface, built for the 0.2.0-rc.2 host line: collapsed capsule expanding into a Harness-native card. Host half resolves keys via ctx.credentials and queries zai-coding-cn / zai / zhipu / deepseek quota endpoints over

Install

dsh plugin add dsh-glm-meter

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Creators

Readme

dsh-glm-meter

GLM Coding Plan(智谱 zai-coding-cn)套餐额度仪表 —— 深度集成 DeepSeek Harness (DSH) 的双面插件,按 DSH 0.2.0-rc.2 宿主线的真实接缝契约实现。

在 设置 → 模型 的供应商卡片和 输入框下方 各提供一个配置/展示面:

┌─────────────────────────────────────────────┐
│  输入框 (composer)                           │
│  ┌───────────────────────────────────────┐  │
│  │  GLM-5.3-Flash 企业 ▍输入消息…    ➤   │  │
│  └───────────────────────────────────────┘  │
│  GLM 企业 ● 2%          ← 额度条跟随选中模型 │
└─────────────────────────────────────────────┘

功能

  • 输入框内嵌额度条(conversation.composer.dock 槽位):
    • 收起态:名称 ● 百分比,跟随输入框当前选中的模型 —— 选 GLM 企业模型只显示企业行、选个人模型只显示个人行、选非 GLM 模型整条隐藏;
    • 点击原地展开完整卡片:每个供应商一行(5h / 周 / MCP 月度窗口、进度条、重置时间),↻ 手动刷新、⚙ 设置面板(显示行 / 刷新间隔 / 预警阈值 / 收起态取值窗口);
  • 设置 → 模型 卡片扩展(settings.models.provider-card 槽位):GLM 供应商卡片上直接配置 组织 ID / 项目 ID(团队版查询必需)和 按供应商独立的查询间隔,存本浏览器、实时生效,无需改文件或重启;
  • 双 key 并排:企业 key 与个人 key 各一行独立显示;
  • 模型名自带套餐标识:模型选择器与输入框按钮显示 GLM-5.3-Flash 企业 / GLM-5.3-Flash 个人,一眼可辨;
  • 安全:API key 只在宿主侧经 ctx.credentials 按请求实时解析,绝不进浏览器;上游 JSON 在宿主侧归一化,浏览器只收渲染视图。

系统要求

  • DSH 0.2.0-rc.2(peerDependencies 按宿主线精确 pin,其他宿主线会被版本门禁拒绝);
  • 智谱 GLM Coding Plan(国内 open.bigmodel.cn)或 Z.AI(api.z.ai)的 API key。

安装

# npm 安装(推荐):
npm i dsh-glm-meter
# 然后在 DSH 的插件管理中添加本地目录:
#   link:<npm 包位置>/node_modules/dsh-glm-meter
# 安装后重启 DSH 使客户端模块图生效。

# 或直接链接本地目录(开发调试):
#   link:C:/Users/<你>/Desktop/dsh-glm-meter

配置

1. API key(二选一,同一存储)

  • ~/.dsh/.credentials.yaml:

    refs:
      ZAI_CODING_CN_API_KEY: <企业 key>
      ZAI_CODING_CN_API_KEY_PERSONAL: <个人 key>
    
  • 或 设置 → 模型 对应供应商卡片(写的是同一 refs)。

2. 模型路由(设置 → 模型 出现 GLM 模型的前提)

~/.dsh/profiles/<profile>/cordis.patch.yml:

- id: llm-pi-ai
  name: "@deepseek-ai/dsh-llm-pi-ai"
  config:
    providers:
      zai-coding-cn:                      # 企业 key 路由(内置目录自动带模型列表)
        displayName: GLM Coding 企业
        apiKeyEnv: ZAI_CODING_CN_API_KEY
        modelOverrides:                   # 模型名带套餐标识,选择器可辨
          glm-5.3-flash:
            name: GLM-5.3-Flash 企业
      zai-coding-cn-personal:             # 个人 key 路由(自定义路由需声明模型)
        displayName: GLM Coding 个人
        apiKeyEnv: ZAI_CODING_CN_API_KEY_PERSONAL
        api: openai-completions
        baseURL: https://open.bigmodel.cn/api/coding/paas/v4
        models:
          - id: glm-5.3-flash
            name: GLM-5.3-Flash 个人
            contextWindow: 1000000
            maxTokens: 131072
            reasoning: true
            input: [text, image]          # 手写模型必须声明;缺省视为纯文本,发图会被拦
            compat:
              thinkingFormat: zai
              maxTokensField: max_tokens

3. 额度行(本插件的 config)

同一个 cordis.patch.yml,行 id 必须与模型路由 id 一致(卡片扩展字段的行级覆盖按 id 匹配):

- id: glm-meter
  name: "dsh-glm-meter"
  config:
    refreshMs: 60000        # 全局默认刷新间隔(>= 5000)
    auto: true              # 自动发现:凭据能解析的目录行自动上板
    hide: []                # 需要隐藏的行 id
    providers:
      - id: zai-coding-cn               # 企业行(覆盖目录行,id 与模型路由一致)
        label: GLM 企业
        credential: ZAI_CODING_CN_API_KEY
        endpoint: https://open.bigmodel.cn/api/monitor/usage/quota/limit
        format: zai-coding-quota
        team: true                      # 团队版查询:?type=2 + 组织/项目头
        organization: ""                # ← 组织 ID(也可在模型卡片上填,实时生效)
        project: ""                     # ← 项目 ID(同上)
        windowLabels: { rolling: 5h, weekly: 周, monthly: 月 }
      - id: zai-coding-cn-personal      # 个人行
        label: GLM 个人
        credential: ZAI_CODING_CN_API_KEY_PERSONAL
        endpoint: https://open.bigmodel.cn/api/monitor/usage/quota/limit
        format: zai-coding-quota

内置目录(auto: true 时凭据可解析即自动显示):deepseek(余额)、zhipu(文本配额)、zai-coding-cn、zai。

4. 模型设置卡片上的字段(推荐,实时生效)

字段 适用 说明
组织 ID / 项目 ID 仅企业(团队)key bigmodel.cn 控制台 → 组织与项目;缺省时该行提示需要填写
查询间隔 所有行 只作用于该供应商;留空跟随 refreshMs

团队版(企业 key)与个人版的查询差异

个人 key 团队/企业 key
端点 GET /api/monitor/usage/quota/limit 同路径 + ?type=2
请求头 Authorization: <key> 同左 + bigmodel-organization / bigmodel-project
缺组织/项目 正常返回 返回空 data(行内提示需填写)

窗口语义(与 cc-switch / glm-plan-usage2 交叉验证):TOKENS_LIMIT/CREDIT_LIMIT 的 unit=3 → 5h 窗口、unit=6 → 周窗口、TIME_LIMIT → MCP 月度;百分比优先取 percentage 字段。

宿主侧 RPC

POST /api/dsh-glm-meter/specs、POST /api/dsh-glm-meter/fetch-all(Connection Fetch 注册表 + /api 信任主机/浏览器会话围栏;信封与 Connection 客户端 RPC 助手兼容)。

  • specs → 行渲染提示(label / kind / 阈值 / 窗口标签)+ refreshMs;
  • fetch-all → { ids?: string[], team?: { [rowId]: { organization, project } } },返回宿主归一化视图(balance / usage / info)。

本地验证

node test-host.mjs    # 宿主半边 e2e:真实凭据 + 真实 quota 端点 + ids/team 覆盖
node test-client.mjs  # 客户端 bundle 离线校验:复刻 DSH 加载契约,输出 CLIENT-BUNDLE-OK

改动 lib/client.js 后务必跑 test-client.mjs —— 它能在不重启 DSH 的情况下抓住 "exports is not defined" 这类会让 整个 web boot 失败 的问题(v0.1 踩过的坑)。

故障排查

现象 处理
DSH 启动报 web boot: N entries did not activate 看 %APPDATA%\@deepseek-ai\dsh-desktop\logs\crash-*-web-boot.log,日志会点名失败的插件
输入框下方没有额度条 客户端模块图启动时组装,安装/改动后需重启 DSH 并刷新页面
企业行显示"需要 organization / project ID" 在 设置→模型 的企业卡片上填写(或填 cordis.patch.yml 后重载)
企业行显示"data.limits 为空" 组织/项目 ID 不正确——已发出团队查询但智谱返回了空数据
改了 key/间隔没生效 key 与卡片字段均按请求实时生效;模型路由(llm-pi-ai)改动需重载配置或重启

已知边界

  • 一次只支持一条宿主线(peer 精确 pin 0.2.0-rc.2);
  • 额度条对当前模型的识别基于模型按钮文本(模型名已按套餐区分),改名后需保持「企业/个人」字样;
  • 卡片扩展字段的值存浏览器 localStorage(清浏览器数据会丢失,企业行会退回行内提示)。

License

MIT