dsh-cmtoken-oauth 1.0.3 → 1.1.0

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 CHANGED
@@ -7,8 +7,10 @@ DeepSeek Harness(DSH)插件:在 **DSH 设置页**内一键认证广东移
7
7
  - **一键认证**:基于 OAuth 2.0 Device Authorization Grant(RFC 8628)+ PKCE (S256),扫码或输入用户码即可完成,无需配置脚本。
8
8
  - **内联二维码**:认证流程内置 QR 生成(零依赖),无需额外安装二维码工具。
9
9
  - **自动发现模型**:认证成功后自动拉取可用模型列表,写入 `llm-pi-ai` 的 `providers.cmtoken` 配置(merge,不影响其他 provider)。
10
+ - **自动配置上下文**:按模型名称关键词自动匹配各模型的上下文与最大输出长度(DeepSeek V4 / MiniMax M3 / Qwen / GLM / MiniMax 2.x / hy 等),无需手动填写。
10
11
  - **安全存储**:token 存入 DSH 凭据服务(OS keyring / env),不落盘明文。
11
12
  - **自动续期 / 注销**:令牌临近过期自动 refresh;可随时注销清空凭据。
13
+ - **订购算力豆套餐**:设置页内一键跳转广东移动 H5 订购页,直达算力豆套餐购买。
12
14
 
13
15
  零第三方运行时依赖(仅使用 Node 内置模块)。
14
16
 
@@ -33,8 +35,9 @@ dsh plugin --profile web add github:your-username/dsh-cmtoken-oauth
33
35
 
34
36
  1. 打开 DSH Web → 设置(左下角齿轮)→ 左侧导航选择「**cmtoken 认证**」。
35
37
  2. 点击「开始一键认证」→ 用手机扫描二维码(或打开链接输入用户码),在广东移动 IDaaS 页面确认授权。
36
- 3. 插件自动完成:发现模型 → 写入 `llm-pi-ai.providers.cmtoken` → 保存凭据。
37
- 4. DSH 的模型选择器中选择 cmtoken 模型即可使用。
38
+ 3. 插件自动完成:发现模型 → 按名称配置各模型上下文 → 写入 `llm-pi-ai.providers.cmtoken` → 保存凭据。
39
+ 4. 套餐不足时,点设置页里的「**订购算力豆套餐**」跳转到广东移动 H5 订购页购买。
40
+ 5. 在 DSH 的模型选择器中选择 cmtoken 模型即可使用。
38
41
 
39
42
  ## 数据与配置
40
43
 
package/lib/client.js CHANGED
@@ -12,6 +12,7 @@ window.__ModuleLoader__.load({
12
12
 
13
13
  // ==================== 工具 ====================
14
14
  const CHANNEL = "/cmtoken-oauth";
15
+ const ORDER_URL = "https://wap.gd.10086.cn/ech/h5/token-prduct/index.html";
15
16
  function unwrap(r) { if (r && r.ok) return r.value; throw new Error(r && r.error ? r.error.message : "未知错误"); }
16
17
 
17
18
  // ==================== 样式 ====================
@@ -166,6 +167,7 @@ window.__ModuleLoader__.load({
166
167
  : react.createElement("p", null, "一键认证:点击下方按钮,用手机扫描二维码即可完成广东移动 MaaS 授权(无需手动填写 API Key)。"),
167
168
  react.createElement("div", { className: "co-row" },
168
169
  react.createElement(Button, { variant: "primary", size: "md", onClick: begin }, "开始一键认证"),
170
+ react.createElement(Button, { variant: "outline", size: "md", onClick: () => window.open(ORDER_URL, "_blank", "noopener,noreferrer") }, "订购算力豆套餐"),
169
171
  status && status.hasRefresh && status.expired ? react.createElement(Button, { variant: "outline", size: "md", onClick: doRefresh }, "刷新令牌") : null
170
172
  ),
171
173
  error ? react.createElement("div", { className: "co-err" }, error) : null
package/lib/index.js CHANGED
@@ -129,6 +129,35 @@ async function refreshToken(refresh) {
129
129
  };
130
130
  }
131
131
 
132
+ // 根据模型名称关键词匹配「输入(上下文)/ 输出(最大生成)」规格。
133
+ // 规格优先级:已知关键词匹配 > 发现接口自带值 > 通用默认值。
134
+ const MODEL_SPECS = [
135
+ // DeepSeek V4 系列:deepseek-v4-pro / deepseek-v4-flash
136
+ { match: (n) => n.includes('deepseek') && n.includes('v4'), contextWindow: 1_048_576, maxTokens: 393_216 },
137
+ // MiniMax-M3(支持图片)
138
+ { match: (n) => n.includes('minimax') && /m3/.test(n), contextWindow: 1_048_576, maxTokens: 131_072 },
139
+ // Qwen 开源系列:qwen36-35b / qwen38-27b(支持图片)
140
+ { match: (n) => n.includes('qwen36') || n.includes('qwen38'), contextWindow: 262_144, maxTokens: 65_536 },
141
+ // Qwen 闭源系列:Qwen3.x-flash / plus / max(支持图片)
142
+ { match: (n) => n.includes('qwen'), contextWindow: 1_048_576, maxTokens: 65_536 },
143
+ // 智谱 GLM:glm-5.2 / glm-5.3
144
+ { match: (n) => n.includes('glm'), contextWindow: 1_048_576, maxTokens: 131_072 },
145
+ // MiniMax 2.x 系列:M2.7-highspeed / MiniMax M2.5
146
+ { match: (n) => n.startsWith('m2') || (n.includes('minimax') && /m2/.test(n)), contextWindow: 204_800, maxTokens: 65_536 },
147
+ // hy3 / hy3-preview 等
148
+ { match: (n) => /hy/.test(n), contextWindow: 262_144, maxTokens: 65_536 },
149
+ ];
150
+
151
+ const DEFAULT_MODEL_SPEC = { contextWindow: 262_144, maxTokens: 65_536 };
152
+
153
+ function modelSpecFor(id) {
154
+ const n = String(id).toLowerCase().replace(/[-_\s.]+/g, '');
155
+ for (const spec of MODEL_SPECS) {
156
+ if (spec.match(n)) return spec;
157
+ }
158
+ return DEFAULT_MODEL_SPEC;
159
+ }
160
+
132
161
  async function fetchModels(access, discoveryUrl) {
133
162
  const res = await fetch(discoveryUrl || DISCOVERY_URL, {
134
163
  signal: AbortSignal.timeout(15_000),
@@ -143,12 +172,16 @@ async function fetchModels(access, discoveryUrl) {
143
172
  }
144
173
  const json = await res.json();
145
174
  const list = Array.isArray(json.models) ? json.models : Array.isArray(json.data) ? json.data : [];
146
- return list.map((m) => ({
147
- id: m.id,
148
- name: m.name ?? m.id,
149
- contextWindow: m.contextWindow ?? 192_000,
150
- maxTokens: m.maxTokens ?? 8192,
151
- }));
175
+ return list.map((m) => {
176
+ // 已知模型按名称关键词配置最大上下文;其余回退到发现接口值或通用默认
177
+ const spec = modelSpecFor(m.id);
178
+ return {
179
+ id: m.id,
180
+ name: m.name ?? m.id,
181
+ contextWindow: spec.contextWindow,
182
+ maxTokens: spec.maxTokens,
183
+ };
184
+ });
152
185
  }
153
186
 
154
187
  function errorResult(e) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-cmtoken-oauth",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "DeepSeek Harness 插件:在 DSH 设置页一键完成广东移动 MaaS(cmtoken)的 OAuth 2.0 Device Grant + PKCE 认证,自动发现模型并写入 llm-pi-ai provider 配置,凭据安全保存并自动续期。零第三方运行时依赖。",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",