Chuyển đến nội dung chính

dsh-glm-meter

Đã xác minh

dsh-glm-meter · v0.2.0-rc.2-v0.2 · MIT · Giao diện web

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

Cài đặt

dsh plugin add dsh-glm-meter

Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.

Mã nguồn

Phát hành lên npm mà không có repository công khai. Hãy kiểm tra nội dung package trước khi cài.

Thẻ

Tác giả

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