dsh-totonai 0.1.3 → 0.1.5

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
@@ -1,8 +1,8 @@
1
1
  # dsh-totonai
2
2
 
3
- 把 ToTonAI AI 中转站接进 DeepSeek Harness 的官方插件:账号登录、80+ 主流模型直连、站内扫码充值开通会员。
3
+ 把 ToTonAI AI 中转站接进 DeepSeek Harness 的官方插件:账号登录、65 个主流模型直连、站内扫码充值开通会员。
4
4
 
5
- > 支持 **GPT / ChatGPT / Claude / Gemini / DeepSeek / 豆包 / Grok / GLM** 等 80+ 主流模型。
5
+ > 支持 **GPT / ChatGPT / Claude / Gemini / DeepSeek / 豆包 / Grok / GLM** 等 65 个主流模型。
6
6
  > 在 DSH 插件市场搜索栏输入 `GPT`、`Claude`、`DeepSeek`、`Gemini` 或 `ToTonAI` 都能搜到本插件。
7
7
 
8
8
  - **账号制,不接触上游 Key**:在 DSH **设置 → ToTonAI** 面板里用账号密码登录(或填插件配置),插件自动登录换令牌,你的上游 API Key 永远不会出现在插件包或对话里。
@@ -15,7 +15,7 @@
15
15
  | 能力 | 说明 |
16
16
  | --- | --- |
17
17
  | 图形面板 | 设置 → ToTonAI:登录 / 注册、会员状态与剩余额度、选档位与月年卡出收款码、"我已付款"申报、刷新状态 |
18
- | 模型接入 | OpenAI / Anthropic / Google / DeepSeek / 豆包 / Grok / GLM 等 80+ 文本模型 |
18
+ | 模型接入 | OpenAI / Anthropic / Google / DeepSeek / 豆包 / Grok / GLM 等 65 个文本模型 |
19
19
  | 账号注册 | `totonai_register` 在对话里直接注册站点账号,不用打开网页 |
20
20
  | 账号登录 | 配置账号密码后自动换取令牌,令牌 7 天有效,过期自动静默续期 |
21
21
  | 自动重试 | 令牌失效(401)时自动重新登录并重试本次请求 |
package/client/index.js CHANGED
@@ -131,10 +131,7 @@ window.__ModuleLoader__.load({
131
131
  h('div', { key: 'lv', style: { fontSize: 12, padding: '2px 8px', borderRadius: 999, border: '1px solid ' + C.border, color: d.active ? C.ok : C.warn } }, d.active ? d.displayName || d.level : L('未开通', 'Inactive')),
132
132
  ]),
133
133
  d.active
134
- ? h('div', { key: 'kv', style: Object.assign({}, S.kv, { marginTop: 8 }) }, [
135
- h('div', { key: 'a' }, L('总额度 ', 'Quota ') + tok(d.tokenQuota) + ' token'),
136
- h('div', { key: 'b' }, L('已用 ', 'Used ') + tok(d.usedToken) + ' token · ' + L('剩余 ', 'Left ') + tok(d.remainToken) + ' token'),
137
- ])
134
+ ? null
138
135
  : h('div', { key: 'kv', style: Object.assign({}, S.kv, { marginTop: 8 }) }, L('当前是免费档,充值后即可调用模型。', 'Free tier: recharge to unlock models.')),
139
136
  h('div', { key: 'act', style: { marginTop: 10, display: 'flex', gap: 8 } }, [
140
137
  h('button', { key: 'r', type: 'button', style: S.btn, disabled: refreshing, onClick: async () => { setRefreshing(true); try { await props.onRefresh() } finally { setRefreshing(false) } } }, refreshing ? L('刷新中…', 'Refreshing…') : L('刷新状态', 'Refresh')),
@@ -198,7 +195,7 @@ window.__ModuleLoader__.load({
198
195
  onClick: () => setPick(Object.assign({}, pick, { level: k })),
199
196
  }, [
200
197
  h('div', { key: 'n', style: { fontSize: 13, fontWeight: 600 } }, p.display_name || k),
201
- h('div', { key: 'p', style: { fontSize: 12, color: C.sub, marginTop: 4 } }, '¥' + (p.month_price || 0) + L(' / 月', ' / mo') + ' · ' + tok(p.token_quota) + ' token'),
198
+ h('div', { key: 'p', style: { fontSize: 12, color: C.sub, marginTop: 4 } }, '¥' + (p.month_price || 0) + L(' / 月', ' / mo')),
202
199
  ])
203
200
  })),
204
201
  h('div', { key: 'per', style: Object.assign({}, S.row, { marginTop: 10 }) }, [
package/lib/index.js CHANGED
@@ -5013,15 +5013,10 @@ var TEXT_MODEL_IDS = [
5013
5013
  "openai/gpt-5.4",
5014
5014
  "openai/gpt-5.4-mini",
5015
5015
  "openai/gpt-5.4-nano",
5016
- "openai/gpt-5.3-codex",
5017
- "openai/gpt-5.2-codex",
5018
- "openai/gpt-5.2-chat",
5019
5016
  "openai/gpt-5.2",
5020
- "openai/gpt-5-pro",
5021
5017
  "openai/gpt-5-nano",
5022
5018
  "openai/gpt-5-mini",
5023
5019
  "openai/gpt-5",
5024
- "gpt-oss-120b",
5025
5020
  // Anthropic
5026
5021
  "anthropic/claude-opus-5.5",
5027
5022
  "anthropic/claude-sonnet-5.5",
@@ -5053,7 +5048,6 @@ var TEXT_MODEL_IDS = [
5053
5048
  "deepseek/deepseek-v4-pro",
5054
5049
  "deepseek/deepseek-v4-flash-20260731",
5055
5050
  "deepseek/deepseek-v4-pro-0813",
5056
- "deepseek/deepseek-v3.2-251201",
5057
5051
  // Bytedance
5058
5052
  "bytedance/doubao-seed-2-1-pro",
5059
5053
  "bytedance/doubao-seed-2-1-turbo",
@@ -5061,7 +5055,6 @@ var TEXT_MODEL_IDS = [
5061
5055
  "doubao-seed-2.0-mini",
5062
5056
  "doubao-seed-2.0-lite",
5063
5057
  "doubao-seed-2.0-code",
5064
- "doubao-1.5-pro-32k",
5065
5058
  // X-AI Grok
5066
5059
  "x-ai/grok-4.7",
5067
5060
  "x-ai/grok-4.6",
@@ -9766,7 +9759,6 @@ async function doStatus(deps) {
9766
9759
  }
9767
9760
  const level = String(info.level ?? "free");
9768
9761
  const quota = Number(info.token_quota ?? 0);
9769
- const used = Number(info.used_token ?? 0);
9770
9762
  return {
9771
9763
  ok: true,
9772
9764
  loggedIn: true,
@@ -9774,9 +9766,6 @@ async function doStatus(deps) {
9774
9766
  level,
9775
9767
  displayName: TIER_NAMES[level] ?? level,
9776
9768
  active: level !== "free" && quota > 0,
9777
- tokenQuota: quota,
9778
- usedToken: used,
9779
- remainToken: Math.max(0, quota - used),
9780
9769
  baseURL: deps.baseURL,
9781
9770
  qr: {
9782
9771
  wechat: `${deps.baseURL}/qrcode/wechat`,
@@ -9811,7 +9800,16 @@ async function doRegister(deps, body) {
9811
9800
  }
9812
9801
  async function doQuote(deps) {
9813
9802
  const cfg = await apiJson(deps.baseURL, "/api/package_config", { timeoutMs: deps.requestTimeoutMs });
9814
- return { ok: true, packages: cfg?.packages ?? {} };
9803
+ const raw = cfg?.packages ?? {};
9804
+ const packages = {};
9805
+ for (const [level, info] of Object.entries(raw)) {
9806
+ packages[level] = {
9807
+ display_name: String(info?.display_name ?? level),
9808
+ month_price: Number(info?.month_price ?? 0),
9809
+ year_price: Number(info?.year_price ?? 0)
9810
+ };
9811
+ }
9812
+ return { ok: true, packages };
9815
9813
  }
9816
9814
  async function doClaim(deps, body) {
9817
9815
  const level = String(body?.level ?? "");
package/lib/models.js CHANGED
@@ -20,15 +20,10 @@ const TEXT_MODEL_IDS = [
20
20
  'openai/gpt-5.4',
21
21
  'openai/gpt-5.4-mini',
22
22
  'openai/gpt-5.4-nano',
23
- 'openai/gpt-5.3-codex',
24
- 'openai/gpt-5.2-codex',
25
- 'openai/gpt-5.2-chat',
26
23
  'openai/gpt-5.2',
27
- 'openai/gpt-5-pro',
28
24
  'openai/gpt-5-nano',
29
25
  'openai/gpt-5-mini',
30
26
  'openai/gpt-5',
31
- 'gpt-oss-120b',
32
27
  // Anthropic
33
28
  'anthropic/claude-opus-5.5',
34
29
  'anthropic/claude-sonnet-5.5',
@@ -60,7 +55,6 @@ const TEXT_MODEL_IDS = [
60
55
  'deepseek/deepseek-v4-pro',
61
56
  'deepseek/deepseek-v4-flash-20260731',
62
57
  'deepseek/deepseek-v4-pro-0813',
63
- 'deepseek/deepseek-v3.2-251201',
64
58
  // Bytedance
65
59
  'bytedance/doubao-seed-2-1-pro',
66
60
  'bytedance/doubao-seed-2-1-turbo',
@@ -68,7 +62,6 @@ const TEXT_MODEL_IDS = [
68
62
  'doubao-seed-2.0-mini',
69
63
  'doubao-seed-2.0-lite',
70
64
  'doubao-seed-2.0-code',
71
- 'doubao-1.5-pro-32k',
72
65
  // X-AI Grok
73
66
  'x-ai/grok-4.7',
74
67
  'x-ai/grok-4.6',
package/lib/panel.js CHANGED
@@ -43,7 +43,6 @@ async function doStatus(deps) {
43
43
  }
44
44
  const level = String(info.level ?? 'free');
45
45
  const quota = Number(info.token_quota ?? 0);
46
- const used = Number(info.used_token ?? 0);
47
46
  return {
48
47
  ok: true,
49
48
  loggedIn: true,
@@ -51,9 +50,6 @@ async function doStatus(deps) {
51
50
  level,
52
51
  displayName: TIER_NAMES[level] ?? level,
53
52
  active: level !== 'free' && quota > 0,
54
- tokenQuota: quota,
55
- usedToken: used,
56
- remainToken: Math.max(0, quota - used),
57
53
  baseURL: deps.baseURL,
58
54
  qr: {
59
55
  wechat: `${deps.baseURL}/qrcode/wechat`,
@@ -93,7 +89,17 @@ async function doRegister(deps, body) {
93
89
  }
94
90
  async function doQuote(deps) {
95
91
  const cfg = await apiJson(deps.baseURL, '/api/package_config', { timeoutMs: deps.requestTimeoutMs });
96
- return { ok: true, packages: cfg?.packages ?? {} };
92
+ // 只向面板暴露档位名称与价格:套餐里的 token 额度属于运营内部参数,不下发到客户端
93
+ const raw = (cfg?.packages ?? {});
94
+ const packages = {};
95
+ for (const [level, info] of Object.entries(raw)) {
96
+ packages[level] = {
97
+ display_name: String(info?.display_name ?? level),
98
+ month_price: Number(info?.month_price ?? 0),
99
+ year_price: Number(info?.year_price ?? 0),
100
+ };
101
+ }
102
+ return { ok: true, packages };
97
103
  }
98
104
  async function doClaim(deps, body) {
99
105
  const level = String(body?.level ?? '');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-totonai",
3
- "version": "0.1.3",
4
- "description": "ToTonAI AI 中转站账号接入插件:账号登录、80+ 模型直连、设置页面板内充值开通会员。账号制,不接触上游 API Key。",
3
+ "version": "0.1.5",
4
+ "description": "ToTonAI AI 中转站账号接入插件:账号登录、65 个模型直连、设置页面板内充值开通会员。账号制,不接触上游 API Key。",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
7
7
  "exports": {