magpie-plugin-msmoli 0.1.0 → 0.3.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 +586 -331
- package/bin/sync.mjs +1569 -148
- package/index.mjs +2492 -261
- package/package.json +3 -4
- package/README.zh-CN.md +0 -340
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "magpie-plugin-msmoli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "ModelScope
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "ModelScope daily credits check-in and balance for magpie, for modelscope.cn and modelscope.ai — one check-in a day instead of opening the site",
|
|
5
5
|
"author": "MisonL",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"index.mjs",
|
|
22
22
|
"bin/sync.mjs",
|
|
23
23
|
"README.md",
|
|
24
|
-
"README.zh-CN.md",
|
|
25
24
|
"LICENSE"
|
|
26
25
|
],
|
|
27
26
|
"keywords": [
|
|
@@ -42,6 +41,6 @@
|
|
|
42
41
|
"scripts": {
|
|
43
42
|
"test": "node --test",
|
|
44
43
|
"test:clock": "node --import ./tools/ticking-clock.mjs --test",
|
|
45
|
-
"prepublishOnly": "node
|
|
44
|
+
"prepublishOnly": "node tools/prepublish.mjs"
|
|
46
45
|
}
|
|
47
46
|
}
|
package/README.zh-CN.md
DELETED
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
# magpie-plugin-msmoli
|
|
2
|
-
|
|
3
|
-
一个 [magpie](https://github.com/yetone/magpie) 插件,替你领取 ModelScope(魔搭)的每日**魔粒**——每天自动签到一次,代替人工打开网页——并在账号卡片上显示余额与今日消耗。
|
|
4
|
-
|
|
5
|
-
## 魔粒是什么
|
|
6
|
-
|
|
7
|
-
ModelScope 的 API-Inference 是免费的,用魔粒结算:
|
|
8
|
-
|
|
9
|
-
| 发放项 | 额度 | 有效期 |
|
|
10
|
-
|---|---|---|
|
|
11
|
-
| 每日登录 | 200 | 24 小时 |
|
|
12
|
-
| 绑定阿里云账号,每日 | 50 | 24 小时 |
|
|
13
|
-
| 邮箱验证 / 个人介绍 / 主页 | 各 50 | 90 天,一次性 |
|
|
14
|
-
|
|
15
|
-
**每日发放的魔粒只有 24 小时。** 不累积,当天不用就作废。旗舰模型 2 魔粒一次(主流 1、轻量 0.5),所以每天 250 大约相当于 125 次调用。
|
|
16
|
-
|
|
17
|
-
## 安装
|
|
18
|
-
|
|
19
|
-
需要先装好 magpie(<https://usemagpie.ai>)。macOS 上用 `magpie --version` 确认命令在 `PATH` 上;
|
|
20
|
-
不在的话用 app 里的完整路径 `/Applications/magpie.app/Contents/MacOS/magpie`。
|
|
21
|
-
|
|
22
|
-
### 方式一:直接从 GitHub 装(不用 clone,能跟着更新)
|
|
23
|
-
|
|
24
|
-
装进 magpie 自己的插件目录(安装版是 `~/.config/magpie/plugins`,便携版是 data 目录下的 `plugins`),
|
|
25
|
-
以后 `magpie plugin update` 就能更新:
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
magpie plugin add github:MisonL/magpie-plugin-msmoli
|
|
29
|
-
printf 'ms-你的令牌\n' | magpie plugin login msmoli
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### 方式二:clone 到本地再装
|
|
33
|
-
|
|
34
|
-
留一份自己的副本,打算改代码就用这种。magpie 是**按位置引用**这个文件夹而不是拷走,
|
|
35
|
-
所以文件夹不在(比如外置盘没挂)插件就加载不了,更新也得先 pull 再 add 一次:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
git clone https://github.com/MisonL/magpie-plugin-msmoli.git
|
|
39
|
-
cd magpie-plugin-msmoli
|
|
40
|
-
magpie plugin add "$PWD"
|
|
41
|
-
printf 'ms-你的令牌\n' | magpie plugin login msmoli
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
两种方式结果一样:设置 → 用量 → 插件 里多出 `msmoli` 一行。登录态是按 provider 名
|
|
45
|
-
(`msmoli`)存的、不绑文件夹,所以两种方式之间切换、或把 clone 挪个位置,都不用重新登录。
|
|
46
|
-
|
|
47
|
-
### 已经在 magpie 里配好 ModelScope?几条命令把 key 同步给插件
|
|
48
|
-
|
|
49
|
-
如果你之前为了聊天已经把 ModelScope 加进「供应商」(`providers.json` 里有 key),
|
|
50
|
-
本包自带一个小工具可以把同一把令牌登录给插件,不用再找一遍。
|
|
51
|
-
|
|
52
|
-
用 GitHub 方式装的,magpie 会在自己的插件目录里放一份:
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
node ~/.config/magpie/plugins/node_modules/magpie-plugin-msmoli/bin/sync.mjs --status # 先看两边状态
|
|
56
|
-
node ~/.config/magpie/plugins/node_modules/magpie-plugin-msmoli/bin/sync.mjs --to-plugin # 执行同步
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
用 clone 方式装的,跑 clone 里那份(`./bin/sync.mjs`;Windows 或 WSL 上文件可能没有
|
|
60
|
-
可执行位,用 `node bin/sync.mjs` 跑)——magpie 只是按位置引用那个文件夹,并不会拷走。
|
|
61
|
-
便携版的目录结构相同,只是根目录是它的 `data` 文件夹;探测不到时用 `--dir <magpie 的配置
|
|
62
|
-
目录>`(安装版是 `~/.config/magpie`,便携版是它的 `data` 目录)和 `--magpie <magpie 可执行
|
|
63
|
-
文件的路径>` 指明。`--magpie` 要的是一个路径,绝对或相对都行;裸名 `magpie` 会被拒绝——
|
|
64
|
-
那个是按 `PATH` 解析的,PATH 上第一个 magpie 会拿到令牌。`npx magpie-plugin-msmoli` 要等
|
|
65
|
-
包发布到 npm 之后才能用——npm 12 默认禁用 `npx github:…`,别从那条路开始。
|
|
66
|
-
|
|
67
|
-
`--dir` 只决定**读**哪里;magpie 的 CLI 没有这个参数,写入永远落在可执行文件自己的目录。
|
|
68
|
-
两个都给了而指向**不同的地方**时,工具会在写之前停下,而不是读一个 magpie、写进另一个。
|
|
69
|
-
「不同」指的是文件夹不同,不是两个字符串不同:shell 补全会给目录带上末尾斜杠,macOS 上
|
|
70
|
-
`/private/tmp` 和 `/tmp` 是同一个文件夹,`data/.` 就是 `data`——这些都指向可执行文件自己的
|
|
71
|
-
目录,都会被放行。
|
|
72
|
-
|
|
73
|
-
- 它只读 magpie 的两个文件;写入交给 magpie 自己的 CLI(`plugin login`、
|
|
74
|
-
`plugin logout`、`provider key`)完成,输出里不会出现令牌,失败信息也一样;
|
|
75
|
-
- 插件已经用同一把令牌登录时它什么都不改;两边是**不同**的令牌时它默认拒绝
|
|
76
|
-
——直接 login 会新增第二个账号,换一把则需要 `--force`,且只在插件**只有一个账号**时
|
|
77
|
-
才放行(logout 会一次登出该 provider 的全部账号);
|
|
78
|
-
- 反向也有:`--to-preset` 把插件主账号的令牌写回内置预设(要 `--force`,因为那把
|
|
79
|
-
key 是聊天正在用的);
|
|
80
|
-
- 内置侧若有多个可能的 provider(比如自己搭的同域名中转),它不猜,用
|
|
81
|
-
`--from <id>` 指定;`--dry-run` 只打印要执行的命令,不真跑。带值的参数给两次
|
|
82
|
-
(`--dir a --dir b`)会被拒绝,不会静默以后者为准;`--dir=<目录>` 也认。
|
|
83
|
-
`--from` 和多余的参数回显时,看起来像密钥的值会先掩码——粘错位置的令牌
|
|
84
|
-
不管什么形状都不会被完整打印。这补上了 `ms-…` 之外的那几种:GitHub / Slack
|
|
85
|
-
令牌、带 `/` 的 AWS secret、UUID、hex 摘要、base64 本体——长的,或短到
|
|
86
|
-
只靠结尾的 `=`(或一个旁边还夹着大小写混排的 `+`)才认得出来的。判据逐词跑:一个词
|
|
87
|
-
本身就是一把 key 时整词掩掉、露出的只有它自己的前 4 与后 4,词与词之间的
|
|
88
|
-
文字照旧——所以 key 后面粘了空格或换行(从终端、聊天窗口复制最常见的样子)、
|
|
89
|
-
或者被引号框在一句话里,都还是那个词。被 `- _ .` 拆成短段的也算一把:
|
|
90
|
-
带连字符的 hex 摘要、写成 `AbCdEfGh.IjKlMnOp…` 的 key,以及 AWS secret——
|
|
91
|
-
它的两段 12 位以上、大小写混排的组件就是标记。key 中间被夹进不可见字符
|
|
92
|
-
(零宽空格、`\x01` 这类,从聊天窗口复制常见)也一样:掩码前先把夹在密钥
|
|
93
|
-
字母之间的控制/格式字符去掉,两半重新接成一整把再判,否则每一半都不到
|
|
94
|
-
长度下限、原样漏出。以 / ~ . 、盘符或 UNC 起头的值算
|
|
95
|
-
路径,保留形状、只掩其中像密钥的那一段,于是 `--dir /tmp/ghp_16C7…` 仍
|
|
96
|
-
看得出读的是哪个目录;粘在路径前缀后面的 key(`~/keys/sk-ant-…`)会跟着
|
|
97
|
-
路径一起读出来,这是保留路径形状的代价。同一个目录在点名的每一行都同样掩,
|
|
98
|
-
magpie 自己的输出也走同一道门——子进程报错里带着别家的 key 一样会被掩,
|
|
99
|
-
不再只认 `ms-` 这一种形状。provider id 与账号名同样读自 magpie 自己的文件、
|
|
100
|
-
也过这道门:粘进这两个字段的 key,在工具点名它的每一行都是掩过的。
|
|
101
|
-
|
|
102
|
-
把签到打开:设置 → 用量 → 插件 → `msmoli` 那一行,或者改 `settings.json`
|
|
103
|
-
(在 magpie 自己的目录里,安装版是 `~/.config/magpie`):
|
|
104
|
-
|
|
105
|
-
```json
|
|
106
|
-
{
|
|
107
|
-
"pluginCheckins": {
|
|
108
|
-
"msmoli": true
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
令牌在 <https://modelscope.cn/my/myaccesstoken> 创建。同一把 `ms-` 令牌既是推理的 `Authorization: Bearer`,也是网页站的会话 Cookie,不需要另外配置。
|
|
114
|
-
|
|
115
|
-
之后 magpie 每天(北京日)每账号领取一次,失败当天稍后重试,结果直接显示在账号卡片上:
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
● msmoli API key …a1b2 · 魔搭社区 魔粒 1% (今日用 2 / 领 250 · 余额 249.5) ↻14h24m tomorrow 09:31 249.5 魔粒可用 left
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## 签到是怎么做的
|
|
122
|
-
|
|
123
|
-
ModelScope 没有公开的签到端点。它有的是一个副作用:`GET /api/v1/users/login/info` 会被服务端记成一次登录,当天第一次调用就发放 `daily_active` 200 与 `aliyun_bindlogin` 50。同一天重复调用不再发放。
|
|
124
|
-
|
|
125
|
-
只调一次无法区分「本次领取」和「几小时前就领过了」,所以这个钩子在它前后读账单:
|
|
126
|
-
|
|
127
|
-
1. 先读今天的 `EARN` 记录——`daily_active` 在不在?
|
|
128
|
-
2. 触达 `login/info`
|
|
129
|
-
3. 再读一次账单
|
|
130
|
-
|
|
131
|
-
`claimed` 需要触达前后账本真的长出一条此前没有的发放。触达通了、账本里却还
|
|
132
|
-
是空的时,插件会让 magpie 半小时后再看一次(`until`),只补一次——北京
|
|
133
|
-
时间 12 点起宿主本来会把 `inactive` 当天了结,晚几秒写出来的发放会被记成
|
|
134
|
-
「账号可能不在活动范围」。12 点前宿主自己的暂定重问(每 30 分钟)已经管着。
|
|
135
|
-
|
|
136
|
-
于是有四种结果:
|
|
137
|
-
|
|
138
|
-
| 结果 | 含义 |
|
|
139
|
-
|---|---|
|
|
140
|
-
| `done` | 今天已经领过,带上当日合计 |
|
|
141
|
-
| `claimed` | 这次领到了,带上金额——只算本次新出现的发放,触发前账本里已有的行不算 |
|
|
142
|
-
| `inactive` | 登录通了,但没有到账(12 点起会先要一次半小时后的复查,第二次才代表当天) |
|
|
143
|
-
| `failed` | 什么也没领到——包括下面的「还没到点」 |
|
|
144
|
-
|
|
145
|
-
用到的接口都在 `modelscope.cn`,请求头 `Cookie: m_session_id=ms-…`,外加浏览器 UA 和 `Referer` 即可,不需要 CSRF 令牌:
|
|
146
|
-
|
|
147
|
-
| 用途 | 路径 |
|
|
148
|
-
|---|---|
|
|
149
|
-
| 登录 / 签到触发 | `GET /api/v1/users/login/info` |
|
|
150
|
-
| 余额 | `GET /openapi/v1/magicubes/balance` |
|
|
151
|
-
| 账单 | `GET /openapi/v1/magicubes/transactions?page=1&page_size=50` |
|
|
152
|
-
|
|
153
|
-
账单里的 `type` 见到过 `EARN` 与 `SPEND_CONFIRM`,另有一种 `EXPIRE`(本插件忽略它)。
|
|
154
|
-
记录按「日期 + 类型 + 规则 + 模型档位」聚合——某天用了几个档位,当天就有几条消耗记录——
|
|
155
|
-
每条带 `count`,列表按日期倒序。让「一页 50 条」够用的是**倒序**:今天的行排在所有更早
|
|
156
|
-
的行前面。实测一个账号每天 3~7 行,所以一页大约覆盖两周、而不是 50 天;真正会出问题的是
|
|
157
|
-
「单日超过 50 行」那种情况。加大每页条数也没用——服务端把 `page_size=200` 也按 50 回。
|
|
158
|
-
|
|
159
|
-
### 什么时候领:签到时段
|
|
160
|
-
|
|
161
|
-
领取会等到一天里的某个时刻,默认落在 **北京时间 08:30–10:00** 之间——
|
|
162
|
-
每个账号在窗口里有自己的一分钟,由「日期 + 账号」算出,宿主重试时不会变。
|
|
163
|
-
这样请求看起来像人早上打开网站,而不是零点整被脚本点一下。
|
|
164
|
-
|
|
165
|
-
晚领不吃亏:每日魔粒**自到账起 24 小时过期**(15:35 到账就 15:35 过期),
|
|
166
|
-
所以 9 点领的额度能用第二天 9 点。
|
|
167
|
-
|
|
168
|
-
在 magpie 自己的目录里放一个 `msmoli.json`(安装版是 `~/.config/magpie`,
|
|
169
|
-
便携版是它的 data 目录)改:
|
|
170
|
-
|
|
171
|
-
```json
|
|
172
|
-
{ "checkinWindow": ["08:30", "10:00"] }
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
写成一个字符串也一样:`{ "checkinWindow": "08:30-10:00" }`。
|
|
176
|
-
|
|
177
|
-
`false` 关掉时段(宿主一问就领),写成 `"off"` 也一样。值写坏了
|
|
178
|
-
(`08:30`–`08:00`、不是时刻)会退回默认,而不是永远不领。结束时刻晚于
|
|
179
|
-
**23:00** 会被截到那里:宿主并不会在目标时刻上问,它按自己每 30 分钟的相位
|
|
180
|
-
来,目标之后的第一次询问可能晚到近半小时,失败后的重试再晚半小时——目标
|
|
181
|
-
时刻需要这两次都还落在同一天。截到 23:00,任何目标都还有这份余量;再晚就
|
|
182
|
-
可能只剩一次,甚至一次都没有。
|
|
183
|
-
整段都落在 23:00 之后的窗口同样退回默认窗口,因为已经没有地方放目标时刻了。
|
|
184
|
-
文件每次被问都重读,改完不用重启 magpie。
|
|
185
|
-
|
|
186
|
-
与宿主调度的衔接:magpie 在北京日切换时问一次,之后每 30 分钟问一次——失败
|
|
187
|
-
一定再问;`done`/`inactive`/`ineligible` 这类「还没见到领取」的回答,在北京
|
|
188
|
-
时间 12 点前也会被当作暂定答案再问(厂商那边的「今天」可能还没翻篇)。所以到了
|
|
189
|
-
窗口里的时刻之前,插件回答 `failed` 并说明几点领取,**一个请求都不发**。
|
|
190
|
-
`failed` 仍是唯一保证会被再问的结果,其余只在当天还没被证实前才会被重问。
|
|
191
|
-
|
|
192
|
-
代价要说清楚,因为插件没有别的办法表达「晚点再问」:真正领到之前,卡片上是
|
|
193
|
-
红点和 magpie 自己的「签到失败;magpie 稍后重试」;这段时间每次询问都会重写
|
|
194
|
-
`plugin-checkin.json`;窗口前执行 `magpie accounts checkin` 退出码非零。
|
|
195
|
-
把这三点都去掉的办法是把时段关掉。
|
|
196
|
-
|
|
197
|
-
红点持续多久,取决于 magpie 下一次什么时候问,而不只看目标时刻。实测某天:
|
|
198
|
-
目标 09:01,magpie 在 09:00:57 问(差三秒,答 `failed`),真正领取落在下一次
|
|
199
|
-
询问 09:31——从零点算约 9.5 小时,而不是只看窗口起点 08:30 会以为的 8.5 小时。
|
|
200
|
-
这也是卡片写「magpie 每半小时问一次」而不写倒计时的原因:宿主会把那一行留在
|
|
201
|
-
卡片上,直到半小时后的下一次询问,倒计时(「约 8 分钟后」)在它上屏的大部分
|
|
202
|
-
时间里都是错的。
|
|
203
|
-
|
|
204
|
-
### 上游
|
|
205
|
-
|
|
206
|
-
magpie 没有给插件定时器、时钟,也不能决定自己什么时候被调用:
|
|
207
|
-
`auth.checkin(getAuth, info)` 只能返回一个结果,什么时候再问由宿主定。
|
|
208
|
-
上面这些都是在那个契约里绕出来的,绕得别扭的两处(把「还没到点」说成失败、
|
|
209
|
-
卡片只有整天的粒度)值得在
|
|
210
|
-
[这个 issue](https://github.com/yetone/magpie/issues/3245) 里要一个插件能用的
|
|
211
|
-
定时器和 `recheck`。
|
|
212
|
-
|
|
213
|
-
同一个「没有定时器」还带来两个要知道的后果:目标时刻只能靠宿主自己的询问去够,
|
|
214
|
-
机器睡眠期间错过的那次会在醒来后的下一次询问补上(只有睡过午夜才会丢当天);
|
|
215
|
-
两次询问之间插件也没法自己重试——上面那个时段上限买到的那次重试,就是为此存在的。
|
|
216
|
-
|
|
217
|
-
### 多个账号
|
|
218
|
-
|
|
219
|
-
插件是按账号写的,不是按令牌。magpie 把每个登录的令牌存成各自的 key——第一个
|
|
220
|
-
是 `msmoli`,之后的叫 `msmoli#xxxxxx`——并且**按账号逐个**问签到,每次通过
|
|
221
|
-
`getAuth` 交给插件这个账号自己的令牌。所以两把令牌时:
|
|
222
|
-
|
|
223
|
-
- 两个账号当天**各有自己的目标分钟**(哈希用的是「日期 + 这个账号的令牌」),
|
|
224
|
-
通常不在同一时刻——极小概率会撞上,代价只是两个账号共用那一分钟;
|
|
225
|
-
- 每个账号的签到结果、重试、卡片显示都是分开记在 `plugin-checkin.json` 里的;
|
|
226
|
-
- 签到读到的昵称按令牌缓存,一个账号的名字不会跑到另一个账号那行上。
|
|
227
|
-
|
|
228
|
-
加第二个账号的方式一样,加完可以看两行:
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
printf 'ms-第二个令牌\n' | magpie plugin login msmoli
|
|
232
|
-
magpie accounts # 两行,各自带自己的魔粒窗口
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
卡片用魔搭给的名字称呼账号。api 型登录本身没有名字,所以签到会把昵称写回去
|
|
236
|
-
——还是同一条登录记录,令牌仍然只存一份,只是旁边多了 `accountId`。
|
|
237
|
-
|
|
238
|
-
写回发生在宿主进程里**真正跑了一次签到**的时候。刚装好时卡片显示令牌末四位
|
|
239
|
-
(`API key …a1b2`)。当天已经签过的账号不会再被问(magpie 直接复用记录),
|
|
240
|
-
所以升级后要等**下一次**签到才会出现名字。
|
|
241
|
-
|
|
242
|
-
如果你想自己起名,magpie 自己的 alias 优先:
|
|
243
|
-
|
|
244
|
-
```bash
|
|
245
|
-
magpie accounts alias msmoli "API key …a1b2" 主号
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
第二个参数是账号**现在**显示的名字:第一次签到之前是令牌末四位,之后是签到
|
|
249
|
-
写回的魔搭昵称。你起过名的账号不会被改掉——签到不会把昵称盖到你的 alias 上
|
|
250
|
-
——所以两个名字都能用,alias 优先于昵称。
|
|
251
|
-
|
|
252
|
-
另外,每日额度属于**魔搭账号**,不属于 key:领取在服务端按「账号 + 当天」幂等,
|
|
253
|
-
所以同一个魔搭用户的第二把令牌拿到的是 `done`,不会再多 250。
|
|
254
|
-
|
|
255
|
-
## 为什么是独立的 provider,且不注册模型
|
|
256
|
-
|
|
257
|
-
插件注册的是 `msmoli`,而不是内置的 `modelscope` 预设,原因有两个:
|
|
258
|
-
|
|
259
|
-
1. 与预设撞名的插件 id 会被 magpie 命名空间化成 `<id>-plugin`,本来也就不是同一个 provider 了;叫 `modelscope` 只会和预设并排显示,让人误以为是同一个账号。
|
|
260
|
-
2. **安全。** 用量窗口读到「已用尽」时,magpie 网关会跳过该账号。如果签到插件挂在推理实际路由的那个 provider 上,一旦报 100% 就会把整条聊天链路从 magpie 里摘掉。
|
|
261
|
-
|
|
262
|
-
所以聊天继续走 `providers.json` 里带 API key 的 `modelscope` 预设,本插件只承载签到所需的登录态。
|
|
263
|
-
|
|
264
|
-
### 两条 ModelScope 行,为什么不会打架
|
|
265
|
-
|
|
266
|
-
供应商页会出现两条:`ModelScope`(预设,带模型)和 `ModelScope 魔粒`(本插件,0 模型)。
|
|
267
|
-
它们是两个独立 provider,共用同一把令牌,但互不干扰:
|
|
268
|
-
|
|
269
|
-
| | `modelscope` 预设 | `msmoli`(本插件) |
|
|
270
|
-
|---|---|---|
|
|
271
|
-
| 提供聊天模型 | 是 | 否——`magpie models` 里从不出现 |
|
|
272
|
-
| 用量卡片 | 无(预设没有余额接口) | 魔粒余额与今日消耗 |
|
|
273
|
-
| 签到 | 魔搭没有内置签到 | 本插件,每天一次 |
|
|
274
|
-
| 网关可达 | 是 | 否,所以卡片读到 100% 也不会导致绕路 |
|
|
275
|
-
|
|
276
|
-
同一把令牌出现在两处是 magpie 的设计:预设在 `providers.json` 存 key,插件在
|
|
277
|
-
`plugin-auth.json` 存登录态。两边填同一个 `ms-` 令牌是正常的。没有任何逻辑会
|
|
278
|
-
拿插件那张卡去决定聊天走哪里——独立 id 的意义就在这里。
|
|
279
|
-
|
|
280
|
-
预设那张空卡片有一个后果值得知道:魔搭的推理接口没有余额端点,magpie 看不到
|
|
281
|
-
这把 key 的魔粒已经用完,只能从服务端自己的 `429 insufficient balance` 学到,
|
|
282
|
-
再让这把 key 休息 30 分钟——在那之前每个请求都会先在它身上白试一次。余额其实
|
|
283
|
-
是账号的,`modelscope.cn` 也答得出,所以可以告诉预设:在它的编辑器里把
|
|
284
|
-
Balance URL 填 `https://modelscope.cn/openapi/v1/magicubes/balance`、Balance
|
|
285
|
-
field 填 `data.available_balance`(同一把令牌就答得出来,之后
|
|
286
|
-
`magpie quota modelscope` 读到的是数字,而不是 `no balance endpoint known
|
|
287
|
-
for it`)。
|
|
288
|
-
|
|
289
|
-
真正要知道的一点:**两行都不产生额外开销**;删掉插件的登录态,聊天照常;
|
|
290
|
-
删掉预设,签到照常。它们各自独立失败。
|
|
291
|
-
|
|
292
|
-
## 隐私
|
|
293
|
-
|
|
294
|
-
`login/info` 的响应里有 `Email`、`GitlabAccessToken` 等字段。本插件只读 `NickName` / `Name`,其余在解析后即丢弃。令牌只存在 magpie 自己的 `plugin-auth.json` 里——插件不输出、不发给 `modelscope.cn` 以外的任何地方。
|
|
295
|
-
|
|
296
|
-
唯一写回的是那个昵称,写成已有登录记录上的 `accountId`,好让 magpie 的卡片能称呼账号。它走宿主自己的 `client.auth.set`(这个接口是整条替换),所以插件把宿主交给它的内容原样交回、只多加一个名字,令牌仍然只存一份。
|
|
297
|
-
|
|
298
|
-
它还会读 `providers.json`(magpie 自己的 provider 列表),只为一件事:这个账号你是不是已经自己起过名了。起过就什么都不写,你的名字保持原样,昵称不会盖上去。
|
|
299
|
-
|
|
300
|
-
## 范围与边界
|
|
301
|
-
|
|
302
|
-
- 只领你自己账号的每日额度,幂等:一次签到先读账单、触达登录、再读账单——三个请求。
|
|
303
|
-
今天已经领过的(重试或下午再问时)两个请求就答 `done`;触达了却还没到账的,
|
|
304
|
-
再读一次账单确认,是四个。每天一次。
|
|
305
|
-
窗口开启之前的询问一个请求都不发。
|
|
306
|
-
用量读取只发两个请求,且永不触达登录端点,所以菜单栏的轮询不会变成签到。
|
|
307
|
-
- 每个请求 8 秒超时,响应体最多读 256 KiB,既拖不住宿主,也不会无限增长。
|
|
308
|
-
超时同时罩着响应体:代理回了一半就停,同样在 8 秒被截断,并且说的是自己的话,
|
|
309
|
-
而不是把运行时的原话透出来(Node 是 `terminated`,Bun 是一整句关于
|
|
310
|
-
`verbose: true` 的说明)。一次签到整体 25 秒放弃,一次用量读取 18 秒——magpie
|
|
311
|
-
把所有 provider 的签到放在同一个两分钟预算里、账号逐个问,一个钩子超时会挤掉
|
|
312
|
-
后面的账号。被截断的钩子回答 `failed`,宿主半小时后重试,而重试会先读账单再领,
|
|
313
|
-
所以不会丢额度。
|
|
314
|
-
- **读不懂的响应一律失败,绝不读成 0。** 没有 `data`、`data` 是列表而不是对象、
|
|
315
|
-
余额里没有 `available_balance` 或它不是数字——每一种都是带原因的失败,因为
|
|
316
|
-
「0 魔粒可用」是一个确定但错误的答案。服务端自己的文字同理:message 或账单行的
|
|
317
|
-
title 或服务端的报错里如果带着一把密钥——本账号的令牌,或别家的(本插件从没拿过、
|
|
318
|
-
没法逐字比对,只能按形状认)——进卡片和 magpie 日志之前会先被掩码。那里「像密钥」
|
|
319
|
-
的判据与 `--from` 那一处相同,所以由普通词语组成的账本标题和服务端文案原样保留。
|
|
320
|
-
- `MAGPIE_MSMOLI_CONFIG` 可以覆盖配置文件路径。它是为了让测试不碰真实文件而存在的,生产环境同样生效。
|
|
321
|
-
- 每天另外 170 魔粒来自「喜欢 10 次(20)+ 发 AIGC 作品(100)+ 发 AIGC 模型(50)」。这些都没有 API,自动化等于驱动网页界面,本插件不碰。
|
|
322
|
-
|
|
323
|
-
## 排障
|
|
324
|
-
|
|
325
|
-
| 症状 | 处理 |
|
|
326
|
-
|---|---|
|
|
327
|
-
| `not signed in` | `printf 'ms-令牌\n' \| magpie plugin login msmoli` |
|
|
328
|
-
| 卡片上没有魔粒窗口,或签到没跑 | 重启 magpie(插件宿主有缓存) |
|
|
329
|
-
| `failed` + HTTP 401 | 令牌被吊销,重新生成并登录 |
|
|
330
|
-
| `failed` + HTTP 403 | 魔搭风控拒了这次请求,令牌本身没问题,30 分钟后会重试 |
|
|
331
|
-
| 窗口前卡片写着 failed,附一行「09:56 后自动领取(magpie 每半小时问一次,无需操作)」 | 正常现象——卡片以领取时刻开头,见上面的「什么时候领」 |
|
|
332
|
-
| 一直是 `inactive` | 登录通了但当天账单里没有记录:账号可能不在活动范围,或者发放还没写出来(别处领过的会显示成 `done`)。北京时间 12 点前 magpie 会每 30 分钟再问一次;过了 12 点插件自己会再要一次半小时后的复查(卡片写「半小时后再核对一次」),第二次的 `inactive` 才代表今天 |
|
|
333
|
-
| 聊天走 `modelscope` 预设时报 `429 insufficient balance`,路由日志里能看到 | 账号当天的 250 魔粒花光了——旗舰模型一次 2 魔粒,约 125 次就没了,之后服务端拒答。不是本插件的问题:它不注册任何模型。想让 magpie 在预设的卡片上也看到余额,照上面「两条 ModelScope」那节把 Balance URL / Balance field 填上即可;**填了之后网关会不会提前避开空余额的 key,未验证**,能确定的只有 429 之后的 30 分钟休息 |
|
|
334
|
-
| 两个账号用的是同一个魔搭昵称,只有一个在签到 | 2026-10-20 之前的 magpie 把插件的签到按「显示名」记账而不是按登录,同名的账号会被并成一个。升级 magpie 即可:上游在 2026-10-20 修掉了(magpie-community/plugins#254) |
|
|
335
|
-
| 改了插件代码没生效 | 路径式插件按位置引用,改完要重启 magpie |
|
|
336
|
-
| 两种方式都装了一遍,`magpie plugin list` 说 msmoli "served by" 其中一个 | 这是 magpie 在提醒同一个 provider id 有两份。删掉一份:`magpie plugin rm github:MisonL/magpie-plugin-msmoli` 或 `magpie plugin rm <路径>`。magpie 把 alias 挂在当初设它的那个包名下,所以删掉一份可能连带把显示名也收走——重新 add 那个包,或者再设一次 alias 就回来 |
|
|
337
|
-
|
|
338
|
-
## License
|
|
339
|
-
|
|
340
|
-
MIT
|