@fish-under-sea/opencode-meoo-auth 1.1.0 → 1.2.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.
Files changed (3) hide show
  1. package/README.md +24 -0
  2. package/index.mjs +51 -9
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -40,6 +40,30 @@ OpenCode & Magpie provider plugin for **Meoo 秒悟**(`meoo.com`)。npm 包
40
40
  - **`qwen3-vl-plus` 不在网关 `/models` 里**,但 Meoo 文档给了、网关也接(实测可调)。插件拉目录时会用一次 1-token 的探针试它,接了就补进目录,否则不提——不写死一个调不通的模型。
41
41
  - **目录里出现表外的新模型**按保守值给(200K 上下文 / 64K 输出、纯文本),不会把 1M 随手许出去;要正式支持就把它加进 `MODEL_SPECS`。
42
42
 
43
+ ### 为什么 Kimi K3 / GLM-5.3 / MiniMax 没出现
44
+
45
+ Meoo 文档的「支持模型介绍」把 Kimi K3、Kimi K3.1 Pro、GLM-5.3、GLM-5.3-Flash、MiniMax M3.1 Flash、Qwen3.8-Max-0902 都算作平台模型,但**项目的 OpenAI 兼容网关只收这 9 个文本 id**(2026-11 实测,其余一律 400):
46
+
47
+ ```
48
+ 当前仅支持配置模型: qwen3.8-flash、qwen3.8-max、qwen3.7-max、qwen3.7-plus、
49
+ deepseek-v4.1-flash-1017、deepseek-v4-pro-0813、deepseek-v4-flash-0731、
50
+ glm-5.2-fast-preview、glm-5.2
51
+ ```
52
+
53
+ Kimi / GLM-5.3 / MiniMax 在 Meoo 的 **Agent 产品**里(`/open/v1/projects/<id>/agent/runs`,SSE 协议,不是 OpenAI 兼容),想用它们装 [`magpie-plugin-meoo-agent`](https://github.com/RexVane/magpie-plugin-meoo-agent)。两个插件可以并存:`meoo` 与 `meoo-agent` 是两个 provider id,不抢同名 key。
54
+
55
+ 插件仍然会把上面这些候选逐个探一遍(并发 4 条、1 token、结果随目录缓存 10 分钟):**Meoo 哪天在网关放开哪个,下次拉目录就自动出现**,不用等发版。
56
+
57
+ ### 自己加模型
58
+
59
+ 网关接了但目录没列、插件也不认识的 id,用环境变量塞进去(仍然要过那一探,不接的不进目录):
60
+
61
+ ```bash
62
+ MEOO_EXTRA_MODELS=my-model-a,my-model-b
63
+ ```
64
+
65
+ 未知 id 一律按 200K / 64K、纯文本处理;想给它正确的上下文,就往 `MODEL_SPECS` 里加一条。
66
+
43
67
  ## 余额
44
68
 
45
69
  浏览器授权登录后,供应商卡片会带一张积分卡(控制面 `/open/v1/cli-compat/account/points`):
package/index.mjs CHANGED
@@ -71,12 +71,37 @@ const MODEL_SPECS = [
71
71
  ]
72
72
 
73
73
  /**
74
- * 文档里写了、网关 /models 却不一定列出来的模型:拉目录时用一次 1-token 的
75
- * 请求探一下,网关接了才放进目录。
76
- * qwen3-vl-plus 就是这样:Meoo 文档「视觉理解」一节里的唯一模型,2026-11 实测
77
- * 网关可调,但 /models 只回 9 个文本 id,不探就永远看不见。
74
+ * 候选模型:文档里写了、网关 /models 却不一定列出来的 id。
75
+ *
76
+ * 2026-11 实测:Meoo 文档「支持模型介绍」把 Kimi K3 / K3.1 Pro、GLM-5.3 / 5.3-Flash、
77
+ * MiniMax M3.1 Flash、Qwen3.8-Max-0902 都算作平台模型,但项目的 OpenAI 兼容网关
78
+ * (/meoo-ai/compatible-mode/v1)只收 9 个文本 id:
79
+ * qwen3.8-flash、qwen3.8-max、qwen3.7-max、qwen3.7-plus、deepseek-v4.1-flash-1017、
80
+ * deepseek-v4-pro-0813、deepseek-v4-flash-0731、glm-5.2-fast-preview、glm-5.2
81
+ * 其余一律 400「当前仅支持配置模型: …」。Kimi / GLM-5.3 / MiniMax 走的是 Meoo 的
82
+ * Agent 产品(/open/v1/projects/<id>/agent/runs),不是这个网关——那是
83
+ * magpie-plugin-meoo-agent 的活。
84
+ *
85
+ * 所以这里逐个探:网关接了才进目录,不接就当它不存在。Meoo 哪天放开,插件下次
86
+ * 拉目录就自动带上,不需要发版。qwen3-vl-plus 就是这样被探出来的(文档写了、
87
+ * /models 不列、网关可调)。
78
88
  */
79
- const SUPPLEMENT_MODELS = ["qwen3-vl-plus"]
89
+ const SUPPLEMENT_MODELS = [
90
+ "qwen3-vl-plus", // 视觉理解:实测可用
91
+ "qwen3.8-max-0902",
92
+ "glm-5.3",
93
+ "glm-5.3-flash",
94
+ "kimi-k3",
95
+ "kimi-k3.1-pro",
96
+ "minimax-m3.1-flash",
97
+ ]
98
+
99
+ /** 用户自己往目录里塞 id:逗号分隔。仍然要过网关那一探,不接的不进目录。 */
100
+ const extraModels = () =>
101
+ String(process.env.MEOO_EXTRA_MODELS || "")
102
+ .split(",")
103
+ .map((s) => s.trim())
104
+ .filter(Boolean)
80
105
 
81
106
  const MODEL_BY_ID = new Map(MODEL_SPECS.map((m) => [m.id, m]))
82
107
 
@@ -411,6 +436,21 @@ async function acceptsModel(ak, id) {
411
436
  }
412
437
  }
413
438
 
439
+ /** 并发探多个 id,限速 4 条同时,别把网关打满。 */
440
+ async function probeModels(ak, ids) {
441
+ const out = []
442
+ const queue = [...ids]
443
+ const worker = async () => {
444
+ for (;;) {
445
+ const id = queue.shift()
446
+ if (!id) return
447
+ if (await acceptsModel(ak, id)) out.push(id)
448
+ }
449
+ }
450
+ await Promise.all(Array.from({ length: Math.min(4, ids.length) }, worker))
451
+ return out
452
+ }
453
+
414
454
  async function fetchGatewayModels(ak) {
415
455
  const base = gatewayBase()
416
456
  if (catalogCache.models && catalogCache.origin === base && Date.now() - catalogCache.at < CATALOG_TTL_MS) {
@@ -424,9 +464,9 @@ async function fetchGatewayModels(ak) {
424
464
  const models = parseGatewayModels(await res.json())
425
465
  if (!models.length) throw new Error("empty catalog")
426
466
  const seen = new Set(models.map((m) => m.id))
427
- for (const id of SUPPLEMENT_MODELS) {
428
- if (seen.has(id)) continue
429
- if (!(await acceptsModel(ak, id))) continue
467
+ // 文档里有、目录里没有的 id 逐个探;接了就补进目录,不接的不进。
468
+ const missing = [...new Set([...SUPPLEMENT_MODELS, ...extraModels()])].filter((id) => !seen.has(id))
469
+ for (const id of await probeModels(ak, missing)) {
430
470
  const spec = specOf(id)
431
471
  models.push({ id, name: spec.name, context: spec.context, output: spec.output, image: !!spec.image })
432
472
  }
@@ -834,7 +874,9 @@ export const MeooAuthPlugin = async ({ client }) => {
834
874
  const used = int(acc.totalConsumed)
835
875
  const frozen = int(acc.frozenBalance)
836
876
  const fmt = (n) => new Intl.NumberFormat("en-US").format(n)
837
- const wallet = { name: "积分", balance: left, unit: "积分" }
877
+ // 钱包窗口:新版 magpie 认 window.balance(不画百分比条、只显示数字);
878
+ // 旧版会把它当纯文本窗口,所以同时给 display —— 两种宿主都能看到余额。
879
+ const wallet = { name: "积分", balance: left, unit: "积分", display: `${fmt(left)} 积分` }
838
880
  const lapse = soonestLapse(data?.activeGrants)
839
881
  if (lapse) wallet.runsOutAt = lapse
840
882
  const windows = [wallet]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fish-under-sea/opencode-meoo-auth",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Meoo 秒悟 (meoo.com) in OpenCode and Magpie: PKCE sign-in, reuse of a local dsh-meoo-connect state or a project service AK, a live catalog with each model's real context window, and the account's points balance",
5
5
  "type": "module",
6
6
  "main": "./opencode.mjs",