@fish-under-sea/magpie-neartoken 0.2.5 → 0.4.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/index.mjs CHANGED
@@ -97,18 +97,41 @@ function text(quota, cur) {
97
97
  }
98
98
 
99
99
  /** 倍率的写法:0.1 → 0.1,1 → 1。 */
100
- function ratioText(v) {
101
- return String(Math.round(v * 10000) / 10000)
102
- }
100
+ const ratioText = (v) => String(Math.round(v * 10000) / 10000)
103
101
 
104
- /** 生图模型的名字词。 */
105
- const DRAWS = ['image', 'imagen', 'imagine', 'dall-e', 'flux', 'seedream', 'cogview', 'stable-diffusion', 'sdxl', 'wanx', 'kolors', 'hidream', 'banana', 'midjourney', 'mj-', 'qwen-image']
106
- /** 视频模型的名字词。 */
107
- const FILMS = ['veo', 'sora', 'kling', 'seedance', 'hailuo', 'vidu', 'pixverse', 'runway', 'luma', 'wan2', 'wanx-video', 'minimax-video', 'movie', 'video', 't2v', 'i2v']
108
- /** 既不聊也不画不拍的名字。 */
109
- const SKIP = ['embedding', 'embed-', 'text-embedding', 'tts', 'transcribe', 'asr', 'rerank', 'moderation', 'whisper', 'speech']
102
+ /** ratioOf 是分组倍率,没给就是 0。 */
103
+ const ratioOf = (ratios, name) => (Number(ratios?.[name]) > 0 ? Number(ratios[name]) : 0)
110
104
 
111
- const hasWord = (id, words) => words.some((w) => id.toLowerCase().includes(w))
105
+ /** 站点自己的约定:带 -c 后缀的模型工具调用不可靠,一律不给。 */
106
+ /**
107
+ * kindOf 按站点给的字段判断一个模型属于哪一类。
108
+ *
109
+ * 站点在 /api/pricing 里已经标好了端点类型和分组名,不需要猜模型名字:
110
+ * image-generation → 生图,openai-video → 视频(omni / sd2.0 / sd2.5 /
111
+ * minimax-h3 都是这一类,名字里一个视频关键词都没有),分组里的 TTS /
112
+ * ASR / Suno → 语音,向量模型分组 → 向量,其余 → 对话。
113
+ */
114
+ function kindOf(row) {
115
+ const ends = Array.isArray(row?.supported_endpoint_types) ? row.supported_endpoint_types : []
116
+ const groups = Array.isArray(row?.enable_groups) ? row.enable_groups.join(' ') : ''
117
+ const text = (String(row?.model_name || '') + ' ' + groups + ' ' + String(row?.description || '')).toLowerCase()
118
+ if (ends.includes('image-generation')) return 'image'
119
+ if (ends.includes('openai-video') || /(^|[-_])video([-_]|$)|veo|seedance|sora|kling/i.test(text)) return 'video'
120
+ if (/tts|text-to-speech|asr|speech|whisper|suno|audio|语音|转文字/i.test(text)) return 'audio'
121
+ if (/embedding|embed|rerank|向量/i.test(text)) return 'embedding'
122
+ return 'chat'
123
+ }
124
+
125
+ /** kindOutput 是 magpie 的 capabilities.output:分区靠它认。 */
126
+ function kindOutput(kind) {
127
+ switch (kind) {
128
+ case 'image': return { image: true, text: true }
129
+ case 'video': return { video: true, text: true }
130
+ case 'audio': return { audio: true, text: true }
131
+ case 'embedding': return { embedding: true, text: true }
132
+ default: return { text: true }
133
+ }
134
+ }
112
135
 
113
136
  /**
114
137
  * 目录:把 /api/pricing 展开成 magpie 的模型表。
@@ -117,23 +140,19 @@ const hasWord = (id, words) => words.some((w) => id.toLowerCase().includes(w))
117
140
  * 「站点原文组名 + 倍率 + 模型」。每行带自己的 x-neartoken-group 头,请求
118
141
  * 按那一行走那一组——这就是"模型后面跟着它的分组"。
119
142
  */
120
- async function catalog(disabled = new Set()) {
121
- // 同时把「全部分组」抄一份给页面:页面在沙箱里发不出网络请求,但能加载自己
122
- // 目录下的脚本,所以这里写 page/groups.js,模型广场按它重绘。
143
+ async function catalog(disabledGroups = new Set(), disabledModels = new Set()) {
123
144
  const groupsOut = new Map()
124
145
  const env = await call('/api/pricing')
125
146
  const rows = Array.isArray(env?.data) ? env.data : []
126
147
  const refs = env?.group_refs && typeof env.group_refs === 'object' ? env.group_refs : {}
127
148
  const ratios = env?.group_ratio && typeof env.group_ratio === 'object' ? env.group_ratio : {}
149
+ // 完整快照给模型广场:页面按它一比一重绘站点 /pricing
150
+ writePricing(env)
128
151
  const out = {}
129
152
  for (const row of rows) {
130
153
  const model = String(row?.model_name ?? '').trim()
131
- if (!model || hasWord(model, SKIP) || model.toLowerCase().endsWith('-c')) continue
132
- const ends = Array.isArray(row?.supported_endpoint_types) ? row.supported_endpoint_types : []
133
- const chat = ends.length === 0 || ends.some((e) => ['openai', 'openai-response', 'anthropic', 'gemini'].includes(e))
134
- const drawer = hasWord(model, DRAWS) || ends.includes('image-generation')
135
- const film = hasWord(model, FILMS)
136
- if (!chat && !drawer && !film) continue
154
+ if (!model || disabledModels.has(model)) continue
155
+ const kind = kindOf(row)
137
156
  const all = Array.isArray(row?.enable_groups) && row.enable_groups.length ? row.enable_groups : ['']
138
157
  // 先按「全部分组」计数(关掉的也算),模型广场要显示它有多少个模型
139
158
  for (const raw of all) {
@@ -142,12 +161,12 @@ async function catalog(disabled = new Set()) {
142
161
  const had = groupsOut.get(g)
143
162
  groupsOut.set(g, { name: g, ratio: 0, models: (had?.models || 0) + 1, ref: '' })
144
163
  }
145
- const groups = all.filter((g) => !disabled.has(String(g ?? '').trim()))
164
+ const groups = all.filter((g) => !disabledGroups.has(String(g ?? '').trim()))
146
165
  if (!groups.length) continue
147
166
  for (const raw of groups) {
148
167
  const group = String(raw ?? '').trim()
149
168
  const ref = group && refs[group] ? String(refs[group]) : ''
150
- const ratio = group && Number(ratios[group]) > 0 ? Number(ratios[group]) : 0
169
+ const ratio = ratioOf(ratios, group)
151
170
  const id = ref ? `${ref}::${model}` : model
152
171
  const label = group ? (ratio > 0 ? `${group} ${ratioText(ratio)}x` : group) + ' · ' + model : model
153
172
  out[id] = {
@@ -158,35 +177,91 @@ async function catalog(disabled = new Set()) {
158
177
  output: Number(row?.max_tokens) > 0 ? Number(row.max_tokens) : 0,
159
178
  },
160
179
  ...(ref ? { headers: { 'x-neartoken-group': ref } } : {}),
180
+ // 站点自己的分类,交给 magpie 的四个分区(图像/视频/语音/向量)
181
+ ...(kind === 'chat' ? {} : { kind }),
161
182
  capabilities: {
162
183
  toolcall: true,
163
- ...(drawer ? { output: { image: true, text: true } } : {}),
164
- ...(film ? { output: { video: true, text: true } } : {}),
184
+ output: kindOutput(kind),
165
185
  },
166
186
  }
167
187
  }
168
188
  }
169
189
  writeGroups([...groupsOut.values()].map((g) => ({
170
190
  ...g,
171
- ratio: Number(ratios[g.name]) > 0 ? Number(ratios[g.name]) : 0,
191
+ ratio: ratioOf(ratios, g.name),
172
192
  ref: refs[g.name] ? String(refs[g.name]) : '',
173
193
  })).sort((a, b) => a.name.localeCompare(b.name, 'zh')))
174
194
  return out
175
195
  }
176
196
 
177
197
  /**
178
- * writeGroups 把分组表写成 page/groups.js,给沙箱里的页面用。
198
+ * writeGroups 把分组表写成 page/groups.js;writePricing 把整份站点目录写成
199
+ * page/pricing.js,给沙箱里的页面用。
179
200
  *
180
201
  * 页面发不出网络请求(CSP connect-src 'none'),但能加载自己目录下的脚本,
181
- * 所以这里不推数据、只落一个文件:`<script src="groups.js?t=…">` 一引就有。
182
- * 写不进去(插件目录只读)就跳过,页面退回它自己的说明。
202
+ * 所以这里不推数据、只落文件:`<script src="pricing.js?t=…">` 一引就有。
203
+ * 写不进去(插件目录只读)就跳过,页面用包内那份静态快照。
183
204
  */
205
+ function writeGroups(groups) {
206
+ try {
207
+ const js = 'self.NEARTOKEN_GROUPS = ' + JSON.stringify(groups) + '\nself.NEARTOKEN_GROUPS_AT = ' + Date.now() + '\n'
208
+ writeFileSync(join(here, 'page', 'groups.js'), js, 'utf8')
209
+ } catch {
210
+ /* 只读安装:页面自己会说没拿到明细 */
211
+ }
212
+ }
213
+
184
214
  /**
185
- * stampLatest 把 npm 上的最新版本写进 page/latest.js。
186
- *
187
- * 页面自己查不了(沙箱禁联网),但插件能:这里顺手问一次 registry,页面
188
- * 「检查更新」时加载这个脚本就知道新不新。一分钟内不重复问。
215
+ * writePricing 把 /api/pricing 原样裁成模型广场需要的形状,写成 page/pricing.js。
216
+ * 与包内那份静态快照同形状,页面优先用这份(实时),静态那份只是首次兜底。
189
217
  */
218
+ function writePricing(env) {
219
+ try {
220
+ const keep = ['description', 'tags', 'icon', 'vendor_id', 'enable_groups', 'supported_endpoint_types',
221
+ 'model_ratio', 'model_price', 'completion_ratio', 'cache_ratio', 'create_cache_ratio',
222
+ 'quota_type', 'billing_mode', 'billing_expr', 'context_window', 'max_tokens',
223
+ 'input_modalities', 'reasoning_levels']
224
+ // 包内快照里带了一批站点 /pricing 页面的描述与运行状态(/api/pricing 没给)。
225
+ // 实时刷新时把它们并回来,别让刷新把首屏说明冲掉。
226
+ const extra = new Map()
227
+ try {
228
+ const old = readFileSync(join(here, 'page', 'pricing.js'), 'utf8')
229
+ const raw = old.slice(old.indexOf('=') + 1).trim().replace(/;\s*$/, '')
230
+ const prev = JSON.parse(raw)
231
+ for (const m of prev?.models || []) {
232
+ const x = {}
233
+ for (const k of ['description', 'status', 'latency', 'throughput']) if (m[k] !== undefined) x[k] = m[k]
234
+ if (Object.keys(x).length) extra.set(m.name, x)
235
+ }
236
+ } catch { /* 没有旧快照就只用 API 字段 */ }
237
+ const models = (Array.isArray(env?.data) ? env.data : []).map((m) => {
238
+ const name = String(m?.model_name ?? '')
239
+ const o = { name }
240
+ for (const k of keep) if (m[k] !== undefined && m[k] !== null && m[k] !== '') o[k] = m[k]
241
+ // API 里没有 description 时,用页面快照里的那段说明
242
+ if (!o.description && extra.get(name)?.description) o.description = extra.get(name).description
243
+ return Object.assign(o, extra.get(name) || {})
244
+ })
245
+ const snap = {
246
+ at: Date.now(),
247
+ source: 'https://neartoken.cc/api/pricing',
248
+ version: env?.pricing_version ?? '',
249
+ models,
250
+ groups: env?.group_ratio ?? {},
251
+ refs: env?.group_refs ?? {},
252
+ notes: env?.usable_group ?? {},
253
+ auto: env?.auto_groups ?? [],
254
+ vendors: env?.vendors ?? [],
255
+ endpoints: env?.supported_endpoint ?? {},
256
+ }
257
+ writeFileSync(join(here, 'page', 'pricing.js'),
258
+ '// 由插件运行时从 /api/pricing 写入\nself.NEARTOKEN_PRICING = ' + JSON.stringify(snap) + '\n', 'utf8')
259
+ } catch {
260
+ /* 只读安装:用包内静态快照 */
261
+ }
262
+ }
263
+
264
+ /** stampLatest 把 npm 上的最新版本写进 page/latest.js,一分钟内不重复问。 */
190
265
  let latestAskedAt = 0
191
266
  async function stampLatest() {
192
267
  if (Date.now() - latestAskedAt < 60_000) return
@@ -208,31 +283,25 @@ async function stampLatest() {
208
283
  /* 问不到就保持原样:页面会说「没查到」 */
209
284
  }
210
285
  }
211
- function writeGroups(groups) {
212
- try {
213
- const js = 'self.NEARTOKEN_GROUPS = ' + JSON.stringify(groups) + '\nself.NEARTOKEN_GROUPS_AT = ' + Date.now() + '\n'
214
- writeFileSync(join(here, 'page', 'groups.js'), js, 'utf8')
215
- } catch {
216
- /* 只读安装:页面自己会说没拿到明细 */
217
- }
218
- }
219
286
 
220
287
  export default async function neartoken(input, options) {
221
- // 页面写进来的开关:关掉的分组,它们的模型不再出现在 magpie 的列表里。
222
- // 走的是 magpie 的 plugin options(页面 magpie.options.set),不碰宿主代码。
223
- const disabled = (() => {
224
- const raw = options?.disabledGroups
225
- if (Array.isArray(raw)) return new Set(raw.filter((g) => typeof g === 'string'))
288
+ // 页面写进来的开关:关掉的分组,以及关掉的模型。
289
+ // 走 magpie 的 plugin options(页面 magpie.options.set),不碰宿主代码。
290
+ // 默认全选:options 里没有 disabledModels 时,一个都不关。
291
+ const asSet = (raw) => {
292
+ if (Array.isArray(raw)) return new Set(raw.filter((x) => typeof x === 'string'))
226
293
  if (typeof raw === 'string' && raw.trim()) {
227
294
  try {
228
295
  const parsed = JSON.parse(raw)
229
- return new Set(Array.isArray(parsed) ? parsed.filter((g) => typeof g === 'string') : [])
296
+ return new Set(Array.isArray(parsed) ? parsed.filter((x) => typeof x === 'string') : [])
230
297
  } catch {
231
298
  return new Set()
232
299
  }
233
300
  }
234
301
  return new Set()
235
- })()
302
+ }
303
+ const disabledGroups = asSet(options?.disabledGroups)
304
+ const disabledModels = asSet(options?.disabledModels)
236
305
  return {
237
306
  auth: {
238
307
  provider: PROVIDER_ID,
@@ -351,7 +420,7 @@ export default async function neartoken(input, options) {
351
420
  */
352
421
  async models() {
353
422
  await stampLatest()
354
- return catalog(disabled)
423
+ return catalog(disabledGroups, disabledModels)
355
424
  },
356
425
  },
357
426
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fish-under-sea/magpie-neartoken",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "NearToken for magpie: a provider whose sign-in is the site's own device authorization, models listed per billing group with their multiplier, balance and vouchers on magpie's usage card, plus a page for spending and top-ups.",
5
5
  "type": "module",
6
6
  "main": "index.mjs",
@@ -39,7 +39,7 @@
39
39
  "access": "public"
40
40
  },
41
41
  "magpie": {
42
- "icon": "page/icon.png",
42
+ "icon": "page/star.png",
43
43
  "page": {
44
44
  "title": "NearToken",
45
45
  "titles": {
@@ -49,7 +49,7 @@
49
49
  "de": "NearToken"
50
50
  },
51
51
  "file": "page/index.html",
52
- "icon": "page/icon.svg"
52
+ "icon": "page/star.png"
53
53
  },
54
54
  "calls": [
55
55
  "neartoken:state",
package/page/app.js CHANGED
@@ -18,9 +18,9 @@
18
18
  const windows = new Map()
19
19
  /** 充值面:档位、渠道、当前选择。 */
20
20
  let topupInfo = null
21
- /** 插件自己的开关:关掉的分组(写进 magpie 的 plugin options,provider 插件按它过滤)。 */
21
+ /** 插件自己的开关:关掉的模型(写进 magpie 的 plugin options,provider 插件按它过滤)。 */
22
22
  let options = {}
23
- let disabledGroups = new Set()
23
+ let disabledModels = new Set()
24
24
  /** 当前视角:home / market / logs。 */
25
25
  let tab = 'home'
26
26
  /** 插件写下的分组快照(page/groups.js),页面加载脚本取到。 */
@@ -118,13 +118,15 @@
118
118
  }
119
119
  try {
120
120
  await bridge.ready
121
- // 插件自己的开关(关掉的分组):写在这里,provider 插件按它过滤模型
121
+ // 插件自己的开关:关掉的模型。默认全选(options 里没有这个字段时一个都不关)
122
122
  try {
123
123
  options = (await bridge.options.get()) || {}
124
124
  } catch {
125
125
  options = {}
126
126
  }
127
- disabledGroups = new Set(Array.isArray(options.disabledGroups) ? options.disabledGroups : [])
127
+ const raw = options.disabledModels
128
+ disabledModels = Array.isArray(raw) ? new Set(raw)
129
+ : (typeof raw === 'string' && raw.trim() ? new Set((() => { try { return JSON.parse(raw) } catch { return [] } })()) : new Set())
128
130
  await load()
129
131
  clock = setInterval(tick, 1000)
130
132
  bridge.onVisibility((visible) => {
@@ -192,7 +194,8 @@
192
194
  frag.append(tabsBar())
193
195
  if (tab === 'market') frag.append(marketCard())
194
196
  else if (tab === 'logs') frag.append(logsCard())
195
- else frag.append(accountCard(), boardCard(), groupsCard(), topupCard(), providerCard())
197
+ else frag.append(el('div', { class: 'home-grid' },
198
+ accountCard(), boardCard(), topupCard(), providerCard()))
196
199
  } else {
197
200
  setStatus('未连接')
198
201
  frag.append(connectCard())
@@ -219,9 +222,8 @@
219
222
  if (key !== 'home' && view.configured && !windows.has(span)) {
220
223
  call('neartoken:usage', { range: span }).then((w) => { windows.set(span, w); render() }).catch(showError)
221
224
  }
222
- if (key === 'market' && !groupSnapshot) {
223
- loadGroups().then((got) => { if (got) render() })
224
- }
225
+ // 模型广场的数据在 page/pricing.js(包内快照 + 插件运行时覆盖),
226
+ // 页面加载时就已就位,不需要再动态取。
225
227
  },
226
228
  }, label)))
227
229
  }
@@ -421,68 +423,301 @@
421
423
  await loadGroups(true)
422
424
  render()
423
425
  }
424
- /** 分组落在哪一类:低价 / 满血 / 图片 / 视频 / 语音 / 向量 / 其他。 */
425
- function bucketOf(name) {
426
- const n = String(name || '')
427
- if (/生图|图片|image|画/i.test(n)) return '图片'
428
- if (/视频|video/i.test(n)) return '视频'
429
- if (/语音|tts|asr|转写|whisper|speech/i.test(n)) return '语音'
430
- if (/向量|embedding/i.test(n)) return '向量'
431
- if (/低价/.test(n)) return '低价'
432
- if (/满血|官key|pro/i.test(n)) return '满血'
433
- return '其他'
426
+ // ---------- 模型广场:一比一复刻 neartoken.cc/pricing ----------
427
+
428
+ let marketQuery = ''
429
+ let marketGroup = ''
430
+ let marketKind = 'all'
431
+ let marketUnit = 'M'
432
+ let marketMode = 'standard'
433
+ let marketSort = 'default'
434
+ let marketLayout = 'grid'
435
+ const marketVendors = new Set()
436
+ const MARKET_KINDS = [['all', '全部'], ['chat', '对话'], ['image', '生图'], ['video', '视频'], ['audio', '语音'], ['embedding', '向量']]
437
+
438
+ /** pricing 是包内静态快照(插件运行时会把实时目录覆盖进同一个文件)。 */
439
+ function pricing() {
440
+ const p = self.NEARTOKEN_PRICING
441
+ return p && Array.isArray(p.models) && p.models.length ? p : null
434
442
  }
435
- const BUCKET_ORDER = ['低价', '满血', '图片', '视频', '语音', '向量', '其他']
436
443
 
437
- /** 模型广场:按站点返回的分组重绘,分组即为开关。 */
438
- function marketCard() {
439
- const list = Array.isArray(view.groupList) && view.groupList.length ? view.groupList : groupSnapshot
440
- const head = el('div', { class: 'row' },
441
- el('h2', { class: 'grow', text: '分组', style: 'margin:0' }),
442
- el('a', { class: 'link', href: 'https://neartoken.cc/pricing', target: '_blank', rel: 'noreferrer' }, '站点广场 ↗'))
443
- if (!list || !list.length) {
444
- return card(null, head,
445
- el('p', { class: 'note' },
446
- '还没拿到分组表。点「重新读取」——插件会去站点拉一次 /api/pricing,',
447
- '写成 page/groups.js,页面加载它就有数据(不需要宿主改动)。'),
448
- el('div', { class: 'row', style: 'margin-top:10px' },
449
- el('button', { class: 'ghost', onclick: () => retryGroups() }, '重新读取'),
450
- el('a', { class: 'link', href: 'https://neartoken.cc/pricing', target: '_blank', rel: 'noreferrer', style: 'align-self:center' }, '站点广场 ↗')) )
451
- }
452
- const buckets = new Map()
453
- for (const g of list) {
454
- const key = bucketOf(g?.name)
455
- if (!buckets.has(key)) buckets.set(key, [])
456
- buckets.get(key).push(g)
444
+ /** marketKindOf 与 index.mjs 的分类同源:按站点端点判,不猜名字。 */
445
+ function marketKindOf(m) {
446
+ const ends = m?.supported_endpoint_types || []
447
+ const text = [m?.name, (m?.enable_groups || []).join(' '), m?.description].join(' ').toLowerCase()
448
+ if (ends.includes('image-generation')) return 'image'
449
+ if (ends.includes('openai-video') || /(^|[-_])video([-_]|$)|veo|seedance|sora|kling/i.test(text)) return 'video'
450
+ if (/tts|text-to-speech|asr|speech|whisper|suno|audio|语音|转文字/i.test(text)) return 'audio'
451
+ if (/embedding|embed|rerank|向量/i.test(text)) return 'embedding'
452
+ return 'chat'
453
+ }
454
+
455
+ function vendorOf(id) {
456
+ const v = (pricing()?.vendors || []).find((x) => String(x.id) === String(id))
457
+ return v ? v.name : '其他'
458
+ }
459
+
460
+ /** 第一级:模型功能。第二级:价格与品质(低价 / 满血 / 备用 / 官Key …)。 */
461
+ const FUNC_TAGS = [
462
+ ['生图', /生图|图片|image|GPT Image|Gemini.*Image/i],
463
+ ['视频', /视频|video|Veo|Seedance|Suno|即梦/i],
464
+ ['语音', /语音|TTS|ASR|转文字|合成/i],
465
+ ['向量', /向量|embedding|embed/i],
466
+ ['对话', /.*/],
467
+ ]
468
+ const PRICE_TAGS = ['低价', '满血', '促销', '备用', '官Key', '官key', '国模', '自有', '反重力', '神秘折扣', 'CC', 'Kiro', '灵车', 'Argon', 'GPT Pro', 'Claude', 'DeepSeek', 'GLM', 'Gemini', 'Kimi', 'GPT', 'Suno', 'AIS']
469
+
470
+ /** groupTags 把 [低价][生图] 生图特惠 拆成功能 / 价格 / 余下文字,供排序与重绘。 */
471
+ function groupTags(name) {
472
+ const raw = String(name || '')
473
+ const parts = (raw.match(/\[[^\]]+\]/g) || []).map((p) => p.slice(1, -1))
474
+ const rest = raw.replace(/\[[^\]]+\]/g, '').trim()
475
+ const all = parts.concat(rest ? [rest] : []).join(' ')
476
+ let func = '对话'
477
+ for (const [label, re] of FUNC_TAGS) { if (re.test(all)) { func = label; break } }
478
+ const price = parts.filter((p) => PRICE_TAGS.some((k) => p.toLowerCase().includes(k.toLowerCase())))
479
+ return { func, price, rest }
480
+ }
481
+
482
+ /** groupBadge 按「功能 → 价格 → 组名」两级重绘:功能标签在前、价格标签在后。 */
483
+ function groupBadge(name) {
484
+ const t = groupTags(name)
485
+ const tone = { '生图': 'pink', '视频': 'blue', '语音': 'purple', '向量': 'teal', '对话': 'plain' }
486
+ const colorOf = (w) => {
487
+ if (/低价|反重力|神秘|自有|国模/i.test(w)) return 'green'
488
+ if (/满血|原生|特惠/i.test(w)) return 'red'
489
+ if (/促销|生图|Kiro|灵车/i.test(w)) return 'pink'
490
+ if (/备用|官Key|官key|CC|Argon|GPT Pro|视频|向量/i.test(w)) return 'blue'
491
+ return 'plain'
457
492
  }
458
- const parts = [head]
459
- for (const key of BUCKET_ORDER) {
460
- const groups = buckets.get(key)
461
- if (!groups || !groups.length) continue
462
- const chips = groups.map((g) => groupChip(g))
463
- parts.push(el('div', { class: 'bucket' },
464
- el('div', { class: 'bucket-name' }, key, el('span', { class: 'n', text: String(groups.length) })),
465
- el('div', { class: 'groups' }, chips)))
493
+ return el('span', { class: 'gb' },
494
+ // 功能标签只在非对话类显示;对话是默认,不重复挂
495
+ t.func === '对话' ? null : el('span', { class: 'gb-tag lvl1 ' + (tone[t.func] || 'plain'), text: t.func }),
496
+ t.price.map((w) => el('span', { class: 'gb-tag lvl2 ' + colorOf(w), text: w })),
497
+ t.rest ? el('span', { class: 'gb-rest', text: t.rest }) : null)
498
+ }
499
+
500
+ /**
501
+ * priceOf 反推站点卡片上的价格:
502
+ * 计费表达式里 p/c/cr 的系数 × 该模型最低分组倍率(站点按最低档展示)。
503
+ * 没有表达式(按量计费)时系数 = model_ratio × 2、× completion_ratio、× cache_ratio。
504
+ * 逐个与站点 SSR 卡片核对过:gpt-6-astra ¥2/¥10/¥0.2、claude-sonnet-5-5
505
+ * ¥3/¥15/¥0.15、glm-5.3 ¥2/¥7/¥0.5、gpt-6.1-terra ¥0.26/¥1.3/¥0.013。
506
+ */
507
+ function priceOf(m) {
508
+ const expr = String(m?.billing_expr || '')
509
+ const coef = (v) => { const x = expr.match(new RegExp('\\b' + v + '\\s*\\*\\s*([\\d.]+)')); return x ? Number(x[1]) : null }
510
+ const ratios = (m?.enable_groups || []).map((g) => Number(pricing()?.groups?.[g])).filter((v) => v > 0)
511
+ const min = ratios.length ? Math.min(...ratios) : 1
512
+ // 生图/音乐这类按次计费:表达式里是 fixed(单价) × 张数,不是 token 系数
513
+ const fixed = expr.match(/fixed\(\s*([\d.]+)\s*\)/)
514
+ if (fixed) return { perCall: Number(fixed[1]) * min, perLabel: '张', tiered: true }
515
+ if (Number(m?.quota_type) === 1 && Number(m?.model_price) > 0) {
516
+ return { perCall: Number(m.model_price), perLabel: '次', tiered: false }
466
517
  }
467
- const off = disabledGroups.size
468
- parts.push(el('p', { class: 'note', text: off
469
- ? '已关掉 ' + off + ' 个分组:它们的模型不再出现在 magpie 的模型列表里。'
470
- : '全部开着。点一下关掉一组,它的模型就不再出现在 magpie 的模型列表里。' }))
471
- return card(null, ...parts)
518
+ const p0 = coef('p') ?? (Number(m?.model_ratio) || 0) * 2
519
+ const c0 = coef('c') ?? p0 * (Number(m?.completion_ratio) || 0)
520
+ const r0 = coef('cr') ?? p0 * (Number(m?.cache_ratio) || 0)
521
+ return { input: p0 * min, output: c0 * min, cache: r0 * min, tiered: !!expr }
522
+ }
523
+
524
+ /** money 是价格写法:¥2、¥0.02;/1K 时把每 1M 的价除以 1000。 */
525
+ function money(v, unit) {
526
+ const x = unit === 'K' ? v / 1000 : v
527
+ if (!x) return '¥0'
528
+ const s = String(Math.round(x * 1e8) / 1e8)
529
+ return '¥' + s
472
530
  }
473
531
 
474
- /** groupChip 是一枚分组开关:站点原文组名 + 倍率 + 模型数。 */
475
- function groupChip(g) {
476
- const name = String(g?.name ?? '')
477
- const on = !disabledGroups.has(name)
478
- const ratio = Number(g?.ratio) || 0
479
- const label = ratio > 0 ? name + ' ' + ratioText(ratio) + 'x' : name
480
- return el('button', {
481
- class: 'group-chip',
532
+ /** modelCard:点击整张卡切换启用;高亮就是启用,只有启用的进 magpie 模型清单。 */
533
+ function modelCard(m) {
534
+ const p = priceOf(m)
535
+ const ends = (m?.supported_endpoint_types || []).join(', ')
536
+ const groups = m?.enable_groups || []
537
+ const shownGroups = groups.slice(0, 2)
538
+ const more = groups.length - shownGroups.length
539
+ const kind = marketKindOf(m)
540
+ const on = !disabledModels.has(m.name)
541
+ const priceRow = p.perCall !== undefined
542
+ ? el('div', { class: 'mc-prices one' },
543
+ el('div', null, el('span', { text: '按次计费' }), el('b', { text: money(p.perCall, 'M') + ' / ' + p.perLabel })))
544
+ : el('div', { class: 'mc-prices' },
545
+ el('div', null, el('span', { text: '输入' }), el('b', { text: money(p.input, marketUnit) + ' / 1' + marketUnit })),
546
+ el('div', null, el('span', { text: '输出' }), el('b', { text: money(p.output, marketUnit) + ' / 1' + marketUnit })),
547
+ el('div', null, el('span', { text: '缓存读取' }), el('b', { text: money(p.cache, marketUnit) + ' / 1' + marketUnit })))
548
+ const hasStatus = m.status !== undefined && m.status !== null
549
+ const bars = el('span', { class: 'mc-bar' }, Array.from({ length: 10 }, (_, i) =>
550
+ el('i', { class: hasStatus ? (i < Math.round((Number(m.status) || 0) / 10) ? 'ok' : 'bad') : '' })))
551
+ return el('article', {
552
+ class: 'mc' + (kind !== 'chat' ? ' mc-' + kind : '') + (on ? ' on' : ' off'),
482
553
  'aria-pressed': String(on),
483
- title: g?.models ? g.models + ' 个模型' : '',
484
- onclick: () => toggleGroup(name),
485
- }, label, el('span', { class: 'n', text: String(g?.models || 0) }))
554
+ title: on ? '已启用 · 点一下停用' : '已停用 · 点一下启用',
555
+ onclick: () => toggleModel(m.name),
556
+ },
557
+ el('div', { class: 'mc-head' },
558
+ el('span', { class: 'mc-vicon', text: vendorOf(m.vendor_id).slice(0, 1) }),
559
+ el('div', { class: 'grow' },
560
+ el('div', { class: 'mc-name', text: m.name }),
561
+ el('div', { class: 'mc-vendor', text: vendorOf(m.vendor_id) })),
562
+ el('span', { class: 'mc-flag', text: on ? '✓ 已启用' : '○ 未启用' }),
563
+ el('button', {
564
+ class: 'mc-copy', title: '复制模型 ID',
565
+ onclick: (e) => { e.stopPropagation(); copy(m.name) },
566
+ }, '⧉')),
567
+ el('p', { class: 'mc-desc', text: m.description || '暂无描述。' }),
568
+ el('div', { class: 'mc-billing ' + (p.tiered ? 'dyn' : 'flat'), text: p.tiered ? '动态计费' : '按量计费' }),
569
+ priceRow,
570
+ el('div', { class: 'mc-line' },
571
+ el('span', { class: 'k', text: '分组' }),
572
+ shownGroups.map((g) => groupBadge(g)),
573
+ more > 0 ? el('span', { class: 'mc-more', text: '+' + more }) : null),
574
+ el('div', { class: 'mc-line' },
575
+ el('span', { class: 'k', text: '端点' }),
576
+ el('span', { class: 'v', text: ends || '—' })),
577
+ el('div', { class: 'mc-stats' },
578
+ el('span', null, el('span', { class: 'k', text: '状态' }),
579
+ el('span', { class: 'v', text: hasStatus ? Number(m.status).toFixed(2) + '%' : '—' })),
580
+ bars,
581
+ el('span', null, el('span', { class: 'k', text: '延迟' }),
582
+ el('span', { class: 'v', text: m.latency || '—s' })),
583
+ el('span', null, el('span', { class: 'k', text: '吞吐' }),
584
+ el('span', { class: 'v', text: m.throughput || '—t/s' }))),
585
+ el('div', { class: 'mc-foot' },
586
+ el('a', { class: 'link', href: 'https://neartoken.cc/pricing', target: '_blank', rel: 'noreferrer' }, '详情 ›')))
587
+ }
588
+
589
+ /** 站点 /pricing 首屏的推荐顺序(抓自它的服务端渲染),默认排序时置顶。 */
590
+ const SITE_FIRST = ['gpt-6-astra', 'gpt-6.1-sol', 'gpt-6-sol', 'gpt-6.1-terra', 'gpt-6-luna',
591
+ 'claude-fable-5-1', 'claude-fable-5', 'claude-opus-5-5', 'claude-opus-5',
592
+ 'claude-sonnet-5-5', 'claude-sonnet-5', 'glm-5.3']
593
+
594
+ /** filteredModels 把搜索、分组、类型、厂商筛选叠起来。 */
595
+ function filteredModels() {
596
+ const p = pricing()
597
+ if (!p) return []
598
+ let list = p.models.slice()
599
+ if (marketSort !== 'latest') {
600
+ // 默认按站点首屏顺序置顶,其余保持目录原序
601
+ list.sort((a, b) => {
602
+ const ia = SITE_FIRST.indexOf(a.name), ib = SITE_FIRST.indexOf(b.name)
603
+ if (ia !== -1 || ib !== -1) return (ia === -1 ? 999 : ia) - (ib === -1 ? 999 : ib)
604
+ return 0
605
+ })
606
+ }
607
+ if (marketGroup) list = list.filter((m) => (m.enable_groups || []).includes(marketGroup))
608
+ if (marketKind !== 'all') list = list.filter((m) => marketKindOf(m) === marketKind)
609
+ if (marketVendors.size) list = list.filter((m) => marketVendors.has(String(m.vendor_id)))
610
+ const q = marketQuery.trim().toLowerCase()
611
+ if (q) list = list.filter((m) => [m.name, vendorOf(m.vendor_id), m.description, m.tags,
612
+ (m.enable_groups || []).join(' '), (m.supported_endpoint_types || []).join(' ')].join(' ').toLowerCase().includes(q))
613
+ if (marketSort === 'latest') list = list.slice().reverse()
614
+ return list
615
+ }
616
+
617
+ /** refreshMarketList 只重画右侧列表,不整页 render(保住搜索框焦点)。 */
618
+ function refreshMarketList() {
619
+ const box = $('market-list')
620
+ const count = $('market-count')
621
+ if (!box) return
622
+ const list = filteredModels()
623
+ if (count) count.textContent = list.length + ' 个模型'
624
+ box.className = 'model-grid' + (marketLayout === 'list' ? ' as-list' : '')
625
+ box.replaceChildren(...(list.length ? list.map(modelCard) : [el('p', { class: 'note', text: '没有符合条件的模型。' })]))
626
+ }
627
+
628
+ /** marketCard 是广场整页:顶部工具条 + 左筛选 + 右卡片网格。 */
629
+ function marketCard() {
630
+ const p = pricing()
631
+ const groups = Object.keys(p?.groups || {}).sort((a, b) => (p.groups[a] - p.groups[b]) || a.localeCompare(b, 'zh'))
632
+ const vendors = (p?.vendors || []).slice().sort((a, b) => String(a.name).localeCompare(String(b.name), 'zh'))
633
+ const search = el('input', {
634
+ class: 'market-search', type: 'search', placeholder: '搜索模型名称、供应商、端点或标签...',
635
+ value: marketQuery,
636
+ oninput: (e) => { marketQuery = e.target.value; refreshMarketList() },
637
+ })
638
+ const seg = (items, cur, onPick) => el('div', { class: 'market-seg' },
639
+ items.map(([k, label]) => el('button', {
640
+ 'aria-pressed': String(cur === k), onclick: () => { onPick(k); render() },
641
+ }, label)))
642
+ const total = p?.models?.length || 0
643
+ const allOn = disabledModels.size === 0
644
+ const allOff = total > 0 && disabledModels.size >= total
645
+ const tools = el('div', { class: 'market-tools' },
646
+ el('div', { class: 'market-seg' },
647
+ el('button', {
648
+ 'aria-pressed': String(allOn), class: allOn ? 'on' : '',
649
+ title: '启用全部模型', onclick: () => setAll(true),
650
+ }, '全选'),
651
+ el('button', {
652
+ 'aria-pressed': String(allOff), class: allOff ? 'on' : '',
653
+ title: '停用全部模型', onclick: () => setAll(false),
654
+ }, '全不选')),
655
+ seg([['standard', '标准'], ['topup', '充值']], marketMode, (k) => { marketMode = k }),
656
+ seg([['M', '/1M'], ['K', '/1K']], marketUnit, (k) => { marketUnit = k }),
657
+ el('button', { class: 'market-tool' + (marketSort === 'latest' ? ' on' : ''), onclick: () => { marketSort = marketSort === 'latest' ? 'default' : 'latest'; refreshMarketList() } }, '↑ 最新版本'),
658
+ el('div', { class: 'market-seg' },
659
+ el('button', { 'aria-pressed': String(marketLayout === 'grid'), title: '网格', onclick: () => { marketLayout = 'grid'; refreshMarketList() } }, '▦'),
660
+ el('button', { 'aria-pressed': String(marketLayout === 'list'), title: '列表', onclick: () => { marketLayout = 'list'; refreshMarketList() } }, '☰')))
661
+ // 分组按两级排:先功能(生图/视频/语音/向量/对话),再价格倍率
662
+ const byFunc = new Map()
663
+ for (const g of groups) {
664
+ const f = groupTags(g).func
665
+ if (!byFunc.has(f)) byFunc.set(f, [])
666
+ byFunc.get(f).push(g)
667
+ }
668
+ const FUNC_ORDER = ['对话', '生图', '视频', '语音', '向量']
669
+ const groupChips = el('div', { class: 'market-chips' },
670
+ el('button', {
671
+ class: 'market-chip' + (!marketGroup ? ' on' : ''), onclick: () => { marketGroup = ''; render() },
672
+ }, '所有分组'),
673
+ FUNC_ORDER.filter((f) => byFunc.has(f)).map((f) => el('div', { class: 'chip-group' },
674
+ el('div', { class: 'chip-group-name', text: f }),
675
+ el('div', { class: 'market-chips' }, byFunc.get(f).map((g) => {
676
+ const ratio = Number(p.groups[g]) || 0
677
+ return el('button', {
678
+ class: 'market-chip' + (marketGroup === g ? ' on' : ''),
679
+ title: '按这个分组筛选',
680
+ onclick: () => { marketGroup = marketGroup === g ? '' : g; render() },
681
+ }, groupBadge(g), ratio > 0 ? el('span', { class: 'ratio', text: 'x' + ratioText(ratio) }) : null)
682
+ })))))
683
+ const kinds = el('div', { class: 'market-chips' },
684
+ MARKET_KINDS.map(([k, label]) => el('button', {
685
+ class: 'market-chip' + (marketKind === k ? ' on' : ''),
686
+ onclick: () => { marketKind = k; render() },
687
+ }, label)))
688
+ const vendorChips = el('div', { class: 'market-chips' },
689
+ vendors.map((v) => el('button', {
690
+ class: 'market-chip' + (marketVendors.has(String(v.id)) ? ' on' : ''),
691
+ onclick: () => {
692
+ const id = String(v.id)
693
+ if (marketVendors.has(id)) marketVendors.delete(id)
694
+ else marketVendors.add(id)
695
+ render()
696
+ },
697
+ }, v.name)))
698
+ const aside = el('aside', { class: 'market-aside' },
699
+ el('div', { class: 'ma-head' },
700
+ el('h3', { text: '筛选' }),
701
+ el('button', { class: 'link', onclick: () => { marketQuery = ''; marketGroup = ''; marketKind = 'all'; marketVendors.clear(); render() } }, '↺ 重置')),
702
+ el('p', { class: 'note', text: '按供应商、分组、类型和标签细化搜索模型。' }),
703
+ el('h4', { text: '分组' }), groupChips,
704
+ el('h4', { text: '类型' }), kinds,
705
+ el('h4', { text: '供应商' }), vendorChips)
706
+ const off = disabledModels.size
707
+ const body = el('div', { class: 'market-body' },
708
+ aside,
709
+ el('div', { class: 'market-main' },
710
+ el('div', { class: 'market-count', id: 'market-count', text: (p?.models?.length || 0) + ' 个模型' }),
711
+ el('div', { class: 'model-grid', id: 'market-list' }),
712
+ el('p', { class: 'note', text: off
713
+ ? '已停用 ' + off + ' 个模型:它们不会进 magpie 的模型清单。点卡片可重新启用,或按「全选」。'
714
+ : '默认全选。点卡片切换启用状态,高亮 = 已启用;只有启用的模型才进 magpie 的模型清单。' })))
715
+ const wrap = el('section', { class: 'market' },
716
+ el('div', { class: 'market-top' }, search, tools),
717
+ body)
718
+ // 首帧填一次列表
719
+ queueMicrotask(refreshMarketList)
720
+ return wrap
486
721
  }
487
722
 
488
723
  /** 使用日志:这个窗口里每个模型花了多少、用了多少 token。 */
@@ -509,56 +744,51 @@
509
744
  el('span', { class: 'num', text: compact(m.tokens) }),
510
745
  el('span', { class: 'num', text: m.costText || '' }),
511
746
  el('span', { class: 'num', text: Math.round((m.tokens / total) * 100) + '%' }))))
512
- return card(null, head,
513
- el('div', { class: 'stats' },
514
- el('div', { class: 'stat' }, el('div', { class: 'k', text: '消耗' }), el('div', { class: 'v', text: data.spent })),
515
- el('div', { class: 'stat' }, el('div', { class: 'k', text: '当前余额' }), el('div', { class: 'v', text: data.balance || '—' })),
516
- el('div', { class: 'stat' }, el('div', { class: 'k', text: 'Token' }), el('div', { class: 'v', text: compact(data.tokens) }))),
517
- table,
518
- el('p', { class: 'note', text: '数字来自站点用量端点;这个窗口里没有调用就不列模型。' }))
519
- }
520
- /** 分组墙:站点原文组名 + 倍率 + 模型数,点一下启停(写进插件 options)。 */
521
- function groupsCard() {
522
- const list = Array.isArray(view.groupList) ? view.groupList : null
523
- const head = el('div', { class: 'row' },
524
- el('h2', { class: 'grow', text: '分组', style: 'margin:0' }),
525
- el('a', { class: 'link', href: 'https://neartoken.cc/pricing', target: '_blank', rel: 'noreferrer' }, '站点广场 ↗'))
526
- if (!list || !list.length) {
527
- return card(null, head,
528
- el('p', { class: 'note' },
529
- '宿主还没把分组明细交给页面。开关已经接好(写进 magpie 的 plugin options,provider 插件按它滤模型),',
530
- '宿主一回 groupList,这里就是一墙可点的分组。先去 ',
531
- el('a', { class: 'link', href: 'https://neartoken.cc/pricing', target: '_blank', rel: 'noreferrer' }, '站点广场'),
532
- ' 看分组与倍率。'))
533
- }
534
- const chips = list.map((g) => {
535
- const name = String(g?.name ?? '')
536
- const on = !disabledGroups.has(name)
537
- const ratio = Number(g?.ratio) || 0
538
- const label = ratio > 0 ? name + ' ' + ratioText(ratio) + 'x' : name
539
- return el('button', {
540
- class: 'group-chip',
541
- 'aria-pressed': String(on),
542
- title: g?.models ? g.models + ' 个模型' : '',
543
- onclick: () => toggleGroup(name),
544
- }, label, el('span', { class: 'n', text: String(g?.models || 0) }))
545
- })
546
- const off = disabledGroups.size
547
- return card(null, head,
548
- el('div', { class: 'groups' }, chips),
549
- el('p', { class: 'note', text: off
550
- ? '已关掉 ' + off + ' 个分组:它们的模型不再出现在 magpie 的模型列表里。'
551
- : '全部开着。点一下关掉一组,它的模型就不再出现在 magpie 的模型列表里。' }))
747
+ const names = rows.slice(0, 8)
748
+ const palette = ['#5b8def', '#43b8a4', '#9b7ce0', '#54b26a', '#e0a44a', '#d47a9a', '#6fa8d6', '#c08bd0']
749
+ const dist = el('div', { class: 'log-dist' },
750
+ el('h3', { text: '按模型分布' }),
751
+ names.map((m, i) => el('div', { class: 'dist-row' },
752
+ el('div', { class: 'dist-name', title: m.model, text: m.model }),
753
+ el('div', { class: 'dist-track' },
754
+ el('i', { style: 'width:' + Math.max(2, Math.round((m.tokens / total) * 100)) + '%;background:' + palette[i % palette.length] })),
755
+ el('div', { class: 'dist-val', text: compact(m.tokens) + ' · ' + Math.round((m.tokens / total) * 100) + '%' }))))
756
+ return el('section', { class: 'logs' },
757
+ el('div', { class: 'logs-head' }, head),
758
+ el('div', { class: 'logs-body' },
759
+ el('div', { class: 'card' },
760
+ el('div', { class: 'stats' },
761
+ el('div', { class: 'stat' }, el('div', { class: 'k', text: '消耗' }), el('div', { class: 'v', text: data.spent })),
762
+ el('div', { class: 'stat' }, el('div', { class: 'k', text: '当前余额' }), el('div', { class: 'v', text: data.balance || '—' })),
763
+ el('div', { class: 'stat' }, el('div', { class: 'k', text: 'Token' }), el('div', { class: 'v', text: compact(data.tokens) }))),
764
+ table,
765
+ el('p', { class: 'note', text: '数字来自站点用量端点;这个窗口里没有调用就不列模型。' })),
766
+ el('div', { class: 'card' }, dist,
767
+ el('p', { class: 'note', text: '按 token 占比排,最多列前 8 个模型。' }))))
552
768
  }
553
-
554
- /** toggleGroup 翻转一个分组,并写回插件 options(provider 插件按它过滤)。 */
555
- async function toggleGroup(name) {
769
+ /** toggleModel 翻转一个模型的启用状态,并写回 plugin options。 */
770
+ async function toggleModel(name) {
556
771
  if (!name) return
557
- if (disabledGroups.has(name)) disabledGroups.delete(name)
558
- else disabledGroups.add(name)
772
+ if (disabledModels.has(name)) disabledModels.delete(name)
773
+ else disabledModels.add(name)
774
+ refreshMarketList()
775
+ await saveDisabled()
776
+ }
777
+
778
+ /** setAll 全选 / 全不选:双状态按钮都走这里。 */
779
+ async function setAll(enable) {
780
+ const p = pricing()
781
+ if (!p) return
782
+ if (enable) disabledModels.clear()
783
+ else p.models.forEach((m) => disabledModels.add(m.name))
559
784
  render()
785
+ await saveDisabled()
786
+ }
787
+
788
+ /** saveDisabled 把「关掉的模型」写进 plugin options,provider 插件按它过滤清单。 */
789
+ async function saveDisabled() {
560
790
  try {
561
- const next = await bridge.options.set({ ...options, disabledGroups: [...disabledGroups] })
791
+ const next = await bridge.options.set({ ...options, disabledModels: [...disabledModels] })
562
792
  if (next && typeof next === 'object') options = next
563
793
  } catch (error) {
564
794
  showError(error)
package/page/groups.js CHANGED
@@ -1,2 +1,2 @@
1
- // 由插件在拉取目录时覆盖写入;这里只是占位,免得页面加载时报 404。
2
- self.NEARTOKEN_GROUPS = self.NEARTOKEN_GROUPS || null
1
+ self.NEARTOKEN_GROUPS = [{"name":"[低价] 灵车 K3.1 Pro 专用","ratio":0.3,"models":1,"ref":"#49"},{"name":"[低价] 神秘折扣模型","ratio":0.12,"models":7,"ref":"#24"},{"name":"[低价] 视频分组","ratio":1.5,"models":2,"ref":"#31"},{"name":"[低价] 语音合成 TTS","ratio":0.3,"models":5,"ref":"#35"},{"name":"[低价] 语音转文字 ASR","ratio":1,"models":1,"ref":"#27"},{"name":"[低价] DeepSeek","ratio":0.4,"models":3,"ref":"#16"},{"name":"[低价] GPT 福利","ratio":0.2,"models":6,"ref":"#56"},{"name":"[低价] Grok","ratio":0.1,"models":13,"ref":"#37"},{"name":"[低价] Seedance","ratio":1,"models":2,"ref":"#19"},{"name":"[低价][备用] GPT Pro","ratio":0.3,"models":8,"ref":"#13"},{"name":"[低价][促销] GPT Image","ratio":0.5,"models":2,"ref":"#39"},{"name":"[低价][反重力] Gemini","ratio":0.5,"models":18,"ref":"#5"},{"name":"[低价][满血] 国模","ratio":0.6,"models":9,"ref":"#6"},{"name":"[低价][满血] Claude 特惠","ratio":1.1,"models":6,"ref":"#22"},{"name":"[低价][满血] Claude 原生","ratio":1.5,"models":6,"ref":"#61"},{"name":"[低价][满血] DeepSeek 1017","ratio":0.5,"models":2,"ref":"#38"},{"name":"[低价][满血] GPT Pro 2","ratio":0.26,"models":8,"ref":"#14"},{"name":"[低价][满血][自有] GLM 官方","ratio":0.25,"models":2,"ref":"#17"},{"name":"[低价][生图] 生图特惠","ratio":0.2,"models":14,"ref":"#9"},{"name":"[低价][Kiro] 高智企业 Claude","ratio":1,"models":6,"ref":"#42"},{"name":"[官key] GPT","ratio":0.9,"models":5,"ref":"#28"},{"name":"[满血] Argon 专用","ratio":1,"models":1,"ref":"#47"},{"name":"[满血] CC 不降智精选","ratio":1.8,"models":10,"ref":"#7"},{"name":"[满血] GPT 不降智精选","ratio":0.35,"models":8,"ref":"#2"},{"name":"[满血] GPT Pro 500 高速","ratio":0.5,"models":2,"ref":"#57"},{"name":"[满血] Kimi K3.1 Pro 专用","ratio":0.6,"models":1,"ref":"#48"},{"name":"[满血] Suno","ratio":1,"models":5,"ref":"#67"},{"name":"[满血][官Key] DeepSeek","ratio":0.8,"models":2,"ref":"#15"},{"name":"[满血][官Key] Gemini","ratio":2,"models":6,"ref":"#8"},{"name":"[生图] Gemini","ratio":1,"models":7,"ref":"#29"},{"name":"[生图] GPT Image","ratio":1,"models":2,"ref":"#4"},{"name":"[AIS] Gemini 向量模型","ratio":1,"models":3,"ref":"#34"}]
2
+ self.NEARTOKEN_GROUPS_AT = 1793780165230
package/page/icon.svg CHANGED
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" color="#a2acbb" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
2
- <!-- 空心五角星:外五点、内五点交替,只描边不填充 -->
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#a2acbb" stroke-width="1.35" stroke-linecap="round" stroke-linejoin="round">
2
+ <!-- 空心五角星:只描边,不填充 -->
3
3
  <path d="M12 3 L14.12 9.09 L20.56 9.22 L15.42 13.11 L17.29 19.28 L12 15.6 L6.71 19.28 L8.58 13.11 L3.44 9.22 L9.88 9.09 Z"/>
4
4
  </svg>
package/page/index.html CHANGED
@@ -5,6 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>NearToken</title>
7
7
  <link rel="stylesheet" href="style.css">
8
+ <link rel="stylesheet" href="market.css">
8
9
  </head>
9
10
  <body>
10
11
  <div class="wrap">
@@ -28,6 +29,7 @@
28
29
  </div>
29
30
  <script src="_magpie/bridge.js"></script>
30
31
  <script src="version.js"></script>
32
+ <script src="pricing.js"></script>
31
33
  <script src="app.js"></script>
32
34
  </body>
33
35
  </html>
package/page/latest.js CHANGED
@@ -1,2 +1,2 @@
1
- // 由插件在拉取目录时覆盖写入;这里只是占位。
2
- self.NEARTOKEN_LATEST = self.NEARTOKEN_LATEST || ''
1
+ self.NEARTOKEN_LATEST = "0.3.0"
2
+ self.NEARTOKEN_LATEST_AT = 1793779995515
@@ -0,0 +1,166 @@
1
+
2
+ /* ---------- 模型广场(一比一复刻 neartoken.cc/pricing) ---------- */
3
+
4
+ .market { display: block; }
5
+
6
+ .market-top {
7
+ display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
8
+ padding: 10px 12px; margin: 14px 0 10px;
9
+ border: 1px solid var(--nt-line); border-radius: 12px; background: rgba(255,255,255,.02);
10
+ }
11
+
12
+ .market-search {
13
+ flex: 1 1 220px; min-width: 160px; height: 30px; padding: 0 10px;
14
+ border: 1px solid var(--nt-line); border-radius: 9px;
15
+ background: rgba(0,0,0,.22); color: var(--nt-ink); font-size: 12px;
16
+ }
17
+ .market-search::placeholder { color: var(--nt-faint); }
18
+ .market-search:focus { outline: 1px solid var(--nt-accent); }
19
+
20
+ .market-tools { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
21
+
22
+ .market-seg { display: inline-flex; border: 1px solid var(--nt-line); border-radius: 9px; overflow: hidden; }
23
+ .market-seg button {
24
+ height: 28px; padding: 0 9px; border: 0; background: transparent;
25
+ color: var(--nt-muted); font-size: 11.5px;
26
+ }
27
+ .market-seg button + button { border-left: 1px solid var(--nt-line); }
28
+ .market-seg button[aria-pressed="true"] { color: var(--nt-ink); background: var(--nt-accent-soft); }
29
+
30
+ .market-tool {
31
+ height: 28px; padding: 0 10px; border: 1px solid var(--nt-line); border-radius: 9px;
32
+ background: transparent; color: var(--nt-muted); font-size: 11.5px;
33
+ }
34
+ .market-tool.on { color: var(--nt-ink); border-color: var(--nt-accent); }
35
+
36
+ .market-body { display: grid; grid-template-columns: 210px minmax(0, 1fr); gap: 14px; align-items: start; }
37
+ .market { width: 100%; }
38
+ .model-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; }
39
+
40
+ .market-aside {
41
+ position: sticky; top: 10px; max-height: calc(100vh - 130px); overflow-y: auto;
42
+ padding: 12px; border: 1px solid var(--nt-line); border-radius: 12px;
43
+ background: rgba(255,255,255,.02);
44
+ }
45
+ .market-aside h3 { margin: 0; font-size: 13px; }
46
+ .market-aside h4 { margin: 14px 0 7px; font-size: 11px; color: var(--nt-muted); font-weight: 600; }
47
+ .market-aside .note { font-size: 10.5px; line-height: 1.5; margin: 6px 0 0; }
48
+ .ma-head { display: flex; align-items: baseline; justify-content: space-between; }
49
+ .ma-head .link { border: 0; background: transparent; padding: 0; }
50
+
51
+ .market-chips { display: flex; flex-wrap: wrap; gap: 5px; }
52
+
53
+ .market-chip-wrap { position: relative; display: inline-flex; align-items: center; }
54
+ .market-chip {
55
+ display: inline-flex; align-items: center; gap: 5px;
56
+ min-height: 25px; padding: 0 8px; border: 1px solid var(--nt-line); border-radius: 999px;
57
+ background: transparent; color: var(--nt-muted); font-size: 10.5px; white-space: nowrap;
58
+ }
59
+ .market-chip.on, .market-chip-wrap.on > .market-chip {
60
+ color: var(--nt-ink); border-color: var(--nt-accent); background: var(--nt-accent-soft);
61
+ }
62
+ .market-chip .ratio { font-family: var(--nt-code); color: var(--nt-faint); font-size: 10px; }
63
+ .market-chip .gb { display: inline-flex; align-items: center; gap: 3px; }
64
+ .gb-tag { padding: 1px 4px; border-radius: 4px; font-size: 9.5px; color: #fff; }
65
+ .gb-tag.green { background: #2f8f68; }
66
+ .gb-tag.red { background: #b0475c; }
67
+ .gb-tag.pink { background: #8b4f9e; }
68
+ .gb-tag.blue { background: #3f6fa8; }
69
+ .gb-tag.plain { background: #5a6270; }
70
+ .gb-rest { color: var(--nt-ink); }
71
+
72
+ .chip-toggle {
73
+ width: 16px; height: 24px; padding: 0; border: 0; background: transparent;
74
+ color: var(--nt-faint); font-size: 10px; line-height: 1;
75
+ }
76
+ .chip-toggle.on { color: #4cc38a; }
77
+
78
+ .market-main { min-width: 0; }
79
+ .market-count { font-size: 13px; font-weight: 600; margin: 2px 0 10px; }
80
+ .market-main > .note { margin-top: 10px; }
81
+
82
+ .model-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(238px, 1fr)); gap: 10px; }
83
+ .model-grid.as-list { grid-template-columns: 1fr; }
84
+
85
+ .mc {
86
+ display: flex; flex-direction: column; min-width: 0; cursor: pointer;
87
+ padding: 12px; border: 1px solid var(--nt-line); border-radius: 12px;
88
+ background: rgba(255,255,255,.02); transition: border-color .12s, background .12s, opacity .12s;
89
+ }
90
+ .mc:hover { border-color: var(--nt-accent); }
91
+ .mc.on { border-color: var(--nt-accent); background: var(--nt-accent-soft); }
92
+ .mc.off { opacity: .48; }
93
+ .mc.off:hover { opacity: .8; }
94
+ .mc-flag { flex: none; font-size: 9.5px; color: var(--nt-muted); white-space: nowrap; }
95
+ .mc.on .mc-flag { color: var(--nt-accent); font-weight: 600; }
96
+
97
+ /* 两级标签:功能在前(饱和色),价格/品质在后(柔和色) */
98
+ .gb-tag.lvl1 { font-weight: 700; box-shadow: 0 0 0 1px rgba(255,255,255,.12); }
99
+ .gb-tag.lvl2 { opacity: .82; }
100
+ .gb-tag.purple { background: #7b52b8; }
101
+ .gb-tag.teal { background: #2f8f8a; }
102
+ .chip-group { width: 100%; margin: 2px 0 4px; }
103
+ .chip-group-name { font-size: 10px; color: var(--nt-faint); margin: 6px 0 3px; letter-spacing: .04em; }
104
+ .mc-image { border-color: rgba(139,79,158,.5); }
105
+ .mc-video { border-color: rgba(214,140,60,.5); }
106
+ .mc-audio { border-color: rgba(63,111,168,.5); }
107
+ .mc-embedding { border-color: rgba(47,143,104,.5); }
108
+
109
+ .mc-head { display: flex; align-items: center; gap: 8px; }
110
+ .mc-vicon {
111
+ flex: none; width: 26px; height: 26px; border-radius: 8px;
112
+ display: inline-flex; align-items: center; justify-content: center;
113
+ background: var(--nt-accent-soft); color: var(--nt-accent); font-size: 12px; font-weight: 700;
114
+ }
115
+ .mc-name { font-size: 12.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
116
+ .mc-vendor { font-size: 10px; color: var(--nt-muted); }
117
+ .mc-copy { border: 0; background: transparent; color: var(--nt-faint); font-size: 13px; padding: 2px 4px; }
118
+ .mc-copy:hover { color: var(--nt-accent); }
119
+
120
+ .mc-desc {
121
+ margin: 9px 0 8px; font-size: 10.5px; line-height: 1.55; color: var(--nt-muted);
122
+ min-height: 32px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
123
+ }
124
+ .mc-billing { font-size: 10.5px; font-weight: 600; margin-bottom: 7px; }
125
+ .mc-billing.dyn { color: #e0a44a; }
126
+ .mc-billing.flat { color: #5aa9e6; }
127
+
128
+ .mc-prices { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; margin-bottom: 9px; }
129
+ .mc-prices.one { grid-template-columns: 1fr; }
130
+ .mc-prices > div { display: flex; flex-direction: column; gap: 2px; }
131
+ .mc-prices span { font-size: 10px; color: var(--nt-muted); }
132
+ .mc-prices b { font-family: var(--nt-code); font-size: 11.5px; font-weight: 600; color: var(--nt-ink); }
133
+
134
+ .mc-line { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin: 5px 0; font-size: 10px; }
135
+ .mc-line .k, .mc-stats .k { color: var(--nt-muted); margin-right: 4px; }
136
+ .mc-line .v, .mc-stats .v { color: var(--nt-ink); font-family: var(--nt-code); font-size: 10px; }
137
+ .mc-more { color: var(--nt-faint); font-family: var(--nt-code); }
138
+
139
+ .mc-stats {
140
+ display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
141
+ margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--nt-line); font-size: 10px;
142
+ }
143
+ .mc-stats > span { display: inline-flex; align-items: baseline; gap: 3px; }
144
+ .mc-bar { display: inline-flex; gap: 1px; height: 8px; align-items: center; }
145
+ .mc-bar i { width: 2px; height: 8px; background: var(--nt-line); border-radius: 1px; }
146
+ .mc-bar i.ok { background: #3fbf85; }
147
+ .mc-bar i.bad { background: #d08a3c; }
148
+ .mc-foot { margin-top: 8px; text-align: right; }
149
+
150
+ @media (max-width: 900px) {
151
+ .market-body { grid-template-columns: 1fr; }
152
+ .market-aside { position: static; max-height: none; }
153
+ .logs-body { grid-template-columns: 1fr; }
154
+ }
155
+
156
+ /* 使用日志:两栏铺满 */
157
+ .logs { width: 100%; }
158
+ .logs-head > .row { padding: 12px 14px; border: 1px solid var(--nt-line); border-radius: 12px; margin-bottom: 12px; }
159
+ .logs-body { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); gap: 12px; align-items: start; }
160
+ .logs-body > .card { margin: 0; }
161
+ .log-dist h3 { font-size: 12px; margin: 0 0 12px; }
162
+ .dist-row { display: grid; grid-template-columns: 110px minmax(0, 1fr) 92px; gap: 8px; align-items: center; margin: 8px 0; font-size: 10.5px; }
163
+ .dist-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--nt-muted); }
164
+ .dist-track { height: 8px; background: rgba(255,255,255,.05); border-radius: 5px; overflow: hidden; }
165
+ .dist-track i { display: block; height: 100%; border-radius: 5px; }
166
+ .dist-val { text-align: right; font-family: var(--nt-code); color: var(--nt-muted); font-variant-numeric: tabular-nums; }
@@ -0,0 +1,2 @@
1
+ // 由插件运行时从 /api/pricing 写入
2
+ self.NEARTOKEN_PRICING = {"at":1793780165229,"source":"https://neartoken.cc/api/pricing","version":"a42d372ccf0b5dd13ecf71203521f9d2","models":[{"name":"omni","description":"统一视频生成模型,可根据模式、时长和分辨率自动选择合适的处理路径。","tags":"video,unified","vendor_id":3,"enable_groups":["[低价] 视频分组"],"supported_endpoint_types":["openai-video"],"model_ratio":0,"model_price":0.066666666667,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"base\", u(\"seconds\") * 0.066666666667)"},{"name":"gemini-3.6-flash-c","description":"【按次计费】","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0,"model_price":0.096,"completion_ratio":0,"quota_type":1,"context_window":1000000,"max_tokens":64000,"input_modalities":["text"]},{"name":"gpt-6-luna","vendor_id":1,"enable_groups":["[低价][备用] GPT Pro","[低价][满血] GPT Pro 2","[满血] GPT 不降智精选","[低价] GPT 福利","[官key] GPT"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":2,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"(len <= 272000 ? tier(\"0_272k\", p * 0.1 + cr * 0.01 + cc * 0.125 + c * 0.5) : tier(\"272k_plus\", p * 0.2 + cr * 0.02 + cc * 0.25 + c * 0.75)) * (param(\"service_tier\") == \"fast\" ? 2 : 1) * (param(\"service_tier\") == \"ultrafast\" ? 8 : 1)","context_window":272000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"GPT-6 Luna 是 GPT-6 家族中最轻量的一员:快速、经济,适合规模化。","status":98.82,"latency":"26.77s","throughput":"54.9t/s"},{"name":"sd2.0","description":"sd2.0 标准档视频生成。seedance 分组按秒计费:480p ¥0.8/秒、720p ¥1/秒;其余分辨率暂未开放。通过 resolution 选择分辨率,费用=对应每秒单价×duration 秒;默认 480p、5 秒,n=1。不支持的档位返回参数错误,不自动降级。支持文本生成,参考素材用 images/videos/audios 数组传入;可通过 /v1/images/upload 上传素材(单文件≤20 MiB)。POST /v1/videos 或 /v1/video/generations,GET 同路径/{task_id} 查询。","tags":"video,per-second","vendor_id":11,"enable_groups":["[低价] Seedance"],"supported_endpoint_types":["openai-video"],"model_ratio":0,"model_price":0.55,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"u(\"resolution\") == \"480P\" && u(\"size\") == \"720x1280\" ? tier(\"480P·720x1280\", u(\"seconds\") * 0.8) : u(\"resolution\") == \"480P\" && u(\"size\") == \"1280x720\" ? tier(\"480P·1280x720\", u(\"seconds\") * 0.8) : u(\"resolution\") == \"480P\" && u(\"size\") == \"1792x1024\" ? tier(\"480P·1792x1024\", u(\"seconds\") * 0.8) : u(\"resolution\") == \"480P\" && u(\"size\") == \"1024x1792\" ? tier(\"480P·1024x1792\", u(\"seconds\") * 0.8) : u(\"resolution\") == \"720P\" && u(\"size\") == \"720x1280\" ? tier(\"720P·720x1280\", u(\"seconds\") * 1) : u(\"resolution\") == \"720P\" && u(\"size\") == \"1280x720\" ? tier(\"720P·1280x720\", u(\"seconds\") * 1) : u(\"resolution\") == \"720P\" && u(\"size\") == \"1792x1024\" ? tier(\"720P·1792x1024\", u(\"seconds\") * 1) : u(\"resolution\") == \"720P\" && u(\"size\") == \"1024x1792\" ? tier(\"720P·1024x1792\", u(\"seconds\") * 1) : u(\"resolution\") == \"768P\" && u(\"size\") == \"720x1280\" ? tier(\"768P·720x1280\", u(\"seconds\") * 999) : u(\"resolution\") == \"768P\" && u(\"size\") == \"1280x720\" ? tier(\"768P·1280x720\", u(\"seconds\") * 999) : u(\"resolution\") == \"768P\" && u(\"size\") == \"1792x1024\" ? tier(\"768P·1792x1024\", u(\"seconds\") * 999) : u(\"resolution\") == \"768P\" && u(\"size\") == \"1024x1792\" ? tier(\"768P·1024x1792\", u(\"seconds\") * 999) : u(\"resolution\") == \"1080P\" && u(\"size\") == \"720x1280\" ? tier(\"1080P·720x1280\", u(\"seconds\") * 999) : u(\"resolution\") == \"1080P\" && u(\"size\") == \"1280x720\" ? tier(\"1080P·1280x720\", u(\"seconds\") * 999) : u(\"resolution\") == \"1080P\" && u(\"size\") == \"1792x1024\" ? tier(\"1080P·1792x1024\", u(\"seconds\") * 999) : u(\"resolution\") == \"1080P\" && u(\"size\") == \"1024x1792\" ? tier(\"1080P·1024x1792\", u(\"seconds\") * 999) : u(\"resolution\") == \"2K\" && u(\"size\") == \"720x1280\" ? tier(\"2K·720x1280\", u(\"seconds\") * 999) : u(\"resolution\") == \"2K\" && u(\"size\") == \"1280x720\" ? tier(\"2K·1280x720\", u(\"seconds\") * 999) : u(\"resolution\") == \"2K\" && u(\"size\") == \"1792x1024\" ? tier(\"2K·1792x1024\", u(\"seconds\") * 999) : tier(\"2K·1024x1792\", u(\"seconds\") * 999)"},{"name":"kimi-k3.1-pro","description":"Kimi K3.1 Pro 是 Moonshot 对标 Opus 5.5 的强大模型","icon":"Kimi","vendor_id":7,"enable_groups":["[低价] 灵车 K3.1 Pro 专用","[满血] Kimi K3.1 Pro 专用"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"base\", p * 13 + c * 68 + cr * 1.3 + cc * 13 + cc1h * 26)","context_window":1000000,"max_tokens":65535,"input_modalities":["text","image"],"reasoning_levels":["low","high","max"]},{"name":"gemini-3.1-flash-lite","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":4,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.25 + cr * 0.025 + ai * 0.5 + c * 1.5)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"suno_stems_by_url","enable_groups":["[满血] Suno"],"supported_endpoint_types":["openai"],"model_ratio":0,"model_price":1.5435,"completion_ratio":0,"quota_type":1},{"name":"gemini-3.8-flash-low","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.75,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"context_window":1000000,"max_tokens":64000,"input_modalities":["text"]},{"name":"claude-fable-5-1","vendor_id":2,"enable_groups":["[低价][满血] Claude 特惠","[低价][满血] Claude 原生","[满血] CC 不降智精选","[低价][Kiro] 高智企业 Claude"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":5,"model_price":0,"completion_ratio":5,"cache_ratio":0.025,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 10 + cr * 0.25 + cc * 12.5 + cc1h * 20 + c * 50)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["xhigh","max"],"description":"Anthropic 旗舰 Claude 模型,1M Token 上下文,面向最艰难的长时间编码与知识工作。"},{"name":"gemini-3.8-flash","vendor_id":3,"enable_groups":["[满血][官Key] Gemini","[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.75,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.75 + cr * 0.075 + ai * 0.75 + c * 3.75)","context_window":1000000,"max_tokens":64000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"codex-auto-review","vendor_id":1,"enable_groups":["[低价][备用] GPT Pro","[低价][满血] GPT Pro 2","[满血] GPT 不降智精选"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1.25,"model_price":0,"completion_ratio":6,"cache_ratio":0.2,"create_cache_ratio":0.2,"quota_type":0,"context_window":1050000,"input_modalities":["text"]},{"name":"gemini-3-flash","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.25,"model_price":0,"completion_ratio":6,"cache_ratio":0.1,"quota_type":0,"context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-3.7-flash-c","description":"【按次计费】","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0,"model_price":0.096,"completion_ratio":0,"quota_type":1,"context_window":1000000,"max_tokens":64000,"input_modalities":["text"]},{"name":"flux-2-pro","description":"FLUX 2 Pro 图像生成模型,按生成图片张数计费。","icon":"Flux","vendor_id":15,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.1)) * image_count"},{"name":"sd2.5","description":"sd2.5 标准档视频生成。seedance 分组按秒计费:720p ¥1.2/秒;其他分辨率档位暂未开放。通过 resolution 选择分辨率,费用=对应每秒单价×duration 秒;默认 720p、5 秒,n=1。不支持的档位返回参数错误,不自动降级。支持文本生成,参考素材用 images/videos/audios 数组传入;可通过 /v1/images/upload 上传素材(单文件≤20 MiB)。POST /v1/videos 或 /v1/video/generations,GET 同路径/{task_id} 查询。","tags":"video,per-second","vendor_id":11,"enable_groups":["[低价] Seedance"],"supported_endpoint_types":["openai-video"],"model_ratio":0,"model_price":0.65,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"base\", u(\"seconds\") * 1.2)"},{"name":"claude-sonnet-5","vendor_id":2,"enable_groups":["[低价][满血] Claude 原生","[满血] CC 不降智精选","[低价][Kiro] 高智企业 Claude","[低价][满血] Claude 特惠"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":1,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 2 + cr * 0.2 + cc * 2.5 + cc1h * 4 + c * 10)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["xhigh","max"],"description":"Claude 的均衡档位,适合边界清晰的日常工作:开发功能、修 bug、产出精修内容。"},{"name":"grok-4.5量","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"create_cache_ratio":1,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"minimax-h3","description":"H3 视频生成,视频分组。resolution=720p:¥0.07/秒,费用为单价×duration;resolution=2K:¥2.50/条,4~15 秒同价。未传 resolution 默认 2K,未传 duration 默认 4 秒;专属价格以账户实际价格为准。支持 16:9、9:16,n=1;images 最多9张,audios最多3段且需同时传图片,不支持参考视频。使用 JSON 提交 POST /v1/videos 或 /v1/video/generations,GET 同路径/{task_id} 查询。非法分辨率返回参数错误,不自动降级。","tags":"video,text-to-video,image-to-video,resolution-billing","icon":"Minimax","vendor_id":9,"enable_groups":["[低价] 视频分组"],"supported_endpoint_types":["openai-video"],"model_ratio":0,"model_price":1.6666666666666667,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"u(\"resolution\") == \"768P\" ? tier(\"768P\", u(\"seconds\") * 0.046666666667) : tier(\"2K\", 1.666666666667)"},{"name":"suno_sound","enable_groups":["[满血] Suno"],"supported_endpoint_types":["openai"],"model_ratio":0,"model_price":0.308,"completion_ratio":0,"quota_type":1},{"name":"nano-banana-2","description":"Nano Banana 2 图像生成模型,按生成图片张数计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[低价][生图] 生图特惠","[生图] Gemini"],"supported_endpoint_types":["image-generation","openai","openai-response","gemini"],"model_ratio":0,"model_price":0.1,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.1)) * image_count"},{"name":"gpt-6-sol","vendor_id":1,"enable_groups":["[低价] GPT 福利","[满血] GPT 不降智精选","[官key] GPT","[低价][备用] GPT Pro","[低价][满血] GPT Pro 2"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":2,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"(len <= 272000 ? tier(\"0_272k\", p * 2 + cr * 0.2 + cc * 2.5 + c * 10) : tier(\"272k_plus\", p * 4 + cr * 0.4 + cc * 5 + c * 15)) * (param(\"service_tier\") == \"fast\" ? 2 : 1) * (param(\"service_tier\") == \"ultrafast\" ? 8 : 1)","context_window":272000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"GPT-6 Sol 把 Astra 的能力带到更快、更便宜的模型上,适合规模化使用。"},{"name":"claude-opus-5-5","vendor_id":2,"enable_groups":["[低价][满血] Claude 原生","[满血] CC 不降智精选","[低价][Kiro] 高智企业 Claude","[低价][满血] Claude 特惠"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":2,"model_price":0,"completion_ratio":5,"cache_ratio":0.05,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 4 + cr * 0.2 + cc * 5 + cc1h * 8 + c * 20)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"旗舰级表现的 Claude,价格更低,面向智能体工程与长时间编码会话。","status":97.63,"latency":"26.47s","throughput":"72.9t/s"},{"name":"grok-4.6-low","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"gpt-image-2.5-sunburst","description":"GPT Image 2.5 Sunburst 图像生成模型,按生成图片张数计费。","icon":"OpenAI","vendor_id":1,"enable_groups":["[生图] GPT Image","[低价][促销] GPT Image"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":0,"model_price":0.15,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.15)) * image_count"},{"name":"claude-opus-4-7","vendor_id":2,"enable_groups":["[满血] CC 不降智精选"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":2.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 5 + cr * 0.5 + cc * 6.25 + cc1h * 10 + c * 25)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["xhigh","max"]},{"name":"z-image-turbo","description":"Z-Image Turbo 高速图像生成模型,按生成图片张数计费。","icon":"Qwen.Color","vendor_id":8,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"base\", u(\"image_count\") * 0.2)"},{"name":"gemini-3.1-flash-tts-preview","vendor_id":3,"enable_groups":["[低价] 语音合成 TTS"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.5,"model_price":0,"completion_ratio":20,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 1 + c * 20)"},{"name":"gemini-3.5-flash","vendor_id":3,"enable_groups":["[满血][官Key] Gemini","[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.75,"model_price":0,"completion_ratio":6,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 1.5 + cr * 0.15 + ai * 1.5 + c * 9)","context_window":200000,"max_tokens":64000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-4.5-fast","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"create_cache_ratio":1,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"gemini-3-pro-image","description":"Gemini 3 Pro Image 图像生成模型,按 token 计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[生图] Gemini"],"supported_endpoint_types":["gemini","openai","image-generation"],"model_ratio":0,"model_price":0.07,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 2 + c * 120)"},{"name":"gemini-3.1-flash-image","description":"Gemini 3.1 Flash Image 图像生成模型,按 token 计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[生图] Gemini"],"supported_endpoint_types":["gemini","openai","image-generation"],"model_ratio":0,"model_price":0.07,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.5 + c * 60)"},{"name":"gemini-3.1-flash-lite-image","description":"Gemini 3.1 Flash Lite Image 图像生成模型,按 token 计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[生图] Gemini"],"supported_endpoint_types":["gemini","openai","image-generation"],"model_ratio":0,"model_price":0.07,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.25 + c * 30)"},{"name":"gpt-5.6-terra","vendor_id":1,"enable_groups":["[低价][备用] GPT Pro","[低价][满血] GPT Pro 2","[低价] GPT 福利","[满血] GPT 不降智精选"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":8,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"(len <= 272000 ? tier(\"0_272k\", p * 2 + cr * 0.2 + cc * 2.5 + c * 12) : tier(\"272k_plus\", p * 4 + cr * 0.4 + cc * 5 + c * 18)) * (param(\"service_tier\") == \"fast\" ? 2 : 1) * (param(\"service_tier\") == \"ultrafast\" ? 8 : 1)","context_window":272000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-embedding-2","vendor_id":3,"enable_groups":["[AIS] Gemini 向量模型"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.1,"model_price":0,"completion_ratio":4,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.2 + ai * 6.5 + c * 0)"},{"name":"gemini-3.5-flash-lite","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":4,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.3 + cr * 0.03 + c * 2.5)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-4.7","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"len <= 200000 ? tier(\"0_200k\", p * 2 + cr * 0.5 + c * 6) : tier(\"200k_plus\", p * 4 + cr * 1 + c * 12)","context_window":500000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gpt-6.1-terra","vendor_id":1,"enable_groups":["[满血] GPT 不降智精选","[低价][备用] GPT Pro","[低价][满血] GPT Pro 2"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.05,"create_cache_ratio":1.25,"quota_type":0,"context_window":922000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"暂无描述。","status":76.12,"latency":"14.22s","throughput":"98.3t/s"},{"name":"glm-5.3","vendor_id":6,"enable_groups":["[低价][满血][自有] GLM 官方","[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":4,"model_price":0,"completion_ratio":3.5,"cache_ratio":0.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 8 + cr * 2 + cc * 0 + c * 28)","context_window":1000000,"max_tokens":131072,"input_modalities":["text"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"GLM-5.3,Z.ai 的智能体编码旗舰,1M 上下文并支持结构化工具调用。","status":100,"latency":"2.97s","throughput":"52.6t/s"},{"name":"suno_lyrics","enable_groups":["[满血] Suno"],"supported_endpoint_types":["openai"],"model_ratio":0,"model_price":0.175,"completion_ratio":0,"quota_type":1},{"name":"gemini-3.1-pro","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":1,"model_price":0,"completion_ratio":6,"cache_ratio":0.1,"quota_type":0,"context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-3.8-flash-tts","vendor_id":3,"enable_groups":["[低价] 语音合成 TTS"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0,"model_price":0.08,"completion_ratio":0,"quota_type":1},{"name":"gpt-5.6-sol","vendor_id":1,"enable_groups":["[低价] GPT 福利","[满血] GPT 不降智精选","[官key] GPT","[低价][备用] GPT Pro","[低价][满血] GPT Pro 2"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":8,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"(len <= 272000 ? tier(\"0_272k\", p * 4 + cr * 0.4 + cc * 5 + c * 20) : tier(\"272k_plus\", p * 8 + cr * 0.8 + cc * 10 + c * 30)) * (param(\"service_tier\") == \"fast\" ? 2 : 1) * (param(\"service_tier\") == \"ultrafast\" ? 8 : 1)","context_window":272000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"hy3","vendor_id":10,"enable_groups":["[低价] 神秘折扣模型"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.5,"model_price":0,"completion_ratio":4,"cache_ratio":0.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0 + cr * 0 + cc * 0 + c * 0)","context_window":256000,"max_tokens":128000,"input_modalities":["text"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"nano-banana-2.1","description":"Nano Banana 2.1 图像生成模型,按生成图片张数计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[生图] Gemini"],"supported_endpoint_types":["image-generation","gemini","openai"],"model_ratio":0,"model_price":0.12,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.12)) * image_count"},{"name":"minimax-m3","vendor_id":9,"enable_groups":["[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1.09,"model_price":0,"completion_ratio":4,"cache_ratio":0.2,"create_cache_ratio":1,"quota_type":0,"context_window":512000,"max_tokens":128000,"input_modalities":["text","image"]},{"name":"claude-sonnet-4-6","vendor_id":2,"enable_groups":["[满血] CC 不降智精选"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":1.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 3 + cr * 0.3 + cc * 3.75 + cc1h * 6 + c * 15)","context_window":1000000,"max_tokens":64000,"input_modalities":["text","image"],"reasoning_levels":["max"]},{"name":"gemini-2.5-pro","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.625,"model_price":0,"completion_ratio":8,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"len <= 200000 ? tier(\"0_200k\", p * 1.25 + cr * 0.125 + c * 10) : tier(\"200k_plus\", p * 2.5 + cr * 0.25 + c * 15)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"]},{"name":"gemini-3.8-flash-high","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.75,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"context_window":1000000,"max_tokens":64000,"input_modalities":["text"]},{"name":"claude-sonnet-4.6","vendor_id":2,"enable_groups":["[低价][Kiro] 高智企业 Claude","[低价][满血] Claude 特惠"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":1.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"context_window":1000000,"input_modalities":["text","image"],"reasoning_levels":["minimal","max"]},{"name":"gemini-2.5-flash-preview-tts","vendor_id":3,"enable_groups":["[低价] 语音合成 TTS"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.25,"model_price":0,"completion_ratio":20,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.5 + c * 10)"},{"name":"seedream-5.0-lite","description":"Seedream 5.0 Lite 图像生成模型,按生成图片张数计费。","icon":"ByteDance","vendor_id":14,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":0,"model_price":1,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(1)) * image_count"},{"name":"qwen-image","description":"Qwen Image 图像生成模型,按生成图片张数计费。","icon":"Qwen.Color","vendor_id":8,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"base\", u(\"image_count\") * 0.25)"},{"name":"nano-banana-pro","description":"Nano Banana Pro 图像生成模型,按生成图片张数计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[低价][生图] 生图特惠","[生图] Gemini"],"supported_endpoint_types":["image-generation","openai","openai-response","gemini"],"model_ratio":0,"model_price":0.05,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.05)) * image_count"},{"name":"z-image","description":"Z-Image 图像生成模型,按生成图片张数计费。","icon":"Qwen.Color","vendor_id":8,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.3)) * image_count"},{"name":"glm-5.2","vendor_id":6,"enable_groups":["[低价] 神秘折扣模型","[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":4,"model_price":0,"completion_ratio":3.5,"cache_ratio":0.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 1.4 + cr * 0.26 + cc * 0 + c * 4.4)","context_window":1000000,"max_tokens":131072,"input_modalities":["text"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-3.5-transcribe","vendor_id":3,"enable_groups":["[低价] 语音转文字 ASR"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0,"model_price":0.005,"completion_ratio":0,"quota_type":1},{"name":"gemini-3.8-flash-lite-tts","vendor_id":3,"enable_groups":["[低价] 语音合成 TTS"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0,"model_price":0.08,"completion_ratio":0,"quota_type":1},{"name":"claude-haiku-4.5","vendor_id":2,"enable_groups":["[低价][Kiro] 高智企业 Claude","[低价][满血] Claude 特惠"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":0.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"context_window":200000,"input_modalities":["text","image"],"reasoning_levels":["low","medium","high","max"]},{"name":"gemini-3.1-flash-lite-preview","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":4,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.25 + cr * 0.025 + ai * 0.5 + c * 1.5)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-4.5-low","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"grok-4.6","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"len <= 200000 ? tier(\"0_200k\", p * 2 + cr * 0.5 + c * 6) : tier(\"200k_plus\", p * 4 + cr * 1 + c * 12)","context_window":500000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"claude-opus-4-8","vendor_id":2,"enable_groups":["[满血] CC 不降智精选"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":2.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 5 + cr * 0.5 + cc * 6.25 + cc1h * 10 + c * 25)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["xhigh","max"]},{"name":"suno_music","enable_groups":["[满血] Suno"],"supported_endpoint_types":["openai"],"model_ratio":0,"model_price":1.5435,"completion_ratio":0,"quota_type":1},{"name":"gemini-3.8-flash-c","description":"【按次计费】","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0,"model_price":0.096,"completion_ratio":0,"quota_type":1,"context_window":1000000,"max_tokens":64000,"input_modalities":["text"]},{"name":"ideogram-v3","description":"Ideogram V3 图像生成模型,按生成图片张数计费。","icon":"Ideogram","vendor_id":17,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.1)) * image_count"},{"name":"gpt-image-2.5-flare","description":"GPT Image 2.5 Flare 图像生成模型,按生成图片张数计费。","icon":"OpenAI","vendor_id":1,"enable_groups":["[低价][生图] 生图特惠","[低价][促销] GPT Image","[生图] GPT Image"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":0,"model_price":0.12,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.2)) * image_count"},{"name":"gemini-4-argon","vendor_id":3,"enable_groups":["[满血][官Key] Gemini","[满血] Argon 专用"],"supported_endpoint_types":["gemini","openai"],"model_ratio":1,"model_price":0,"completion_ratio":5,"cache_ratio":0.05,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 2 + cr * 0.1 + ai * 2 + c * 10)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["low","medium","high"]},{"name":"gemini-2.5-pro-preview-tts","vendor_id":3,"enable_groups":["[低价] 语音合成 TTS"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.5,"model_price":0,"completion_ratio":20,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 1 + c * 20)"},{"name":"mimo-v2.6-flash","vendor_id":12,"enable_groups":["[低价] 神秘折扣模型"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.5,"model_price":0,"completion_ratio":2,"cache_ratio":0.02,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.14 + cr * 0.0028 + c * 0.28)","context_window":1048576,"max_tokens":131072,"input_modalities":["text","image"]},{"name":"qwen3.8-27b","vendor_id":8,"enable_groups":["[低价] 神秘折扣模型"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1.5,"model_price":0,"completion_ratio":4,"cache_ratio":0.2,"quota_type":0,"context_window":1000000,"max_tokens":131072,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"claude-opus-5","vendor_id":2,"enable_groups":["[低价][满血] Claude 原生","[满血] CC 不降智精选","[低价][Kiro] 高智企业 Claude","[低价][满血] Claude 特惠"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":2.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 5 + cr * 0.5 + cc * 6.25 + cc1h * 10 + c * 25)","context_window":1000000,"max_tokens":64000,"input_modalities":["text","image"],"reasoning_levels":["minimal","xhigh","max"],"description":"Claude Opus 5 旗舰,effort 参数可在思考深度与延迟、成本之间取舍。","status":0,"latency":"1.23s"},{"name":"claude-sonnet-5-5","vendor_id":2,"enable_groups":["[低价][满血] Claude 原生","[满血] CC 不降智精选"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":1,"model_price":0,"completion_ratio":5,"cache_ratio":0.05,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 2 + cr * 0.1 + cc * 2.5 + cc1h * 4 + c * 10)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"Claude 的均衡档位,适合边界清晰的日常工作:开发功能、修 bug、产出精修内容。"},{"name":"seedream-4","description":"Seedream 4 图像生成模型,按生成图片张数计费。","icon":"ByteDance","vendor_id":14,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":0,"model_price":1,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(1)) * image_count"},{"name":"claude-fable-5","vendor_id":2,"enable_groups":["[低价][满血] Claude 原生","[满血] CC 不降智精选"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 10 + cr * 1 + cc * 12.5 + cc1h * 20 + c * 50)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["xhigh","max"],"description":"Anthropic 旗舰 Claude 模型,1M Token 上下文,面向最艰难的长时间编码与知识工作。"},{"name":"gemini-3.6-flash","vendor_id":3,"enable_groups":["[满血][官Key] Gemini","[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.75,"model_price":0,"completion_ratio":5,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.75 + cr * 0.075 + ai * 0.75 + c * 3.75)","context_window":1000000,"max_tokens":64000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-3.7-flash","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.75,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.75 + cr * 0.075 + ai * 0.75 + c * 3.75)","context_window":1000000,"max_tokens":64000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-4.6-medium","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"glm-5.3-flash","vendor_id":6,"enable_groups":["[低价][满血][自有] GLM 官方","[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.4,"model_price":0,"completion_ratio":3.5,"cache_ratio":0.2875,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.8 + cr * 0.23 + cc * 0 + c * 2.8)","context_window":1000000,"max_tokens":131072,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"claude-opus-4-6","vendor_id":2,"enable_groups":["[满血] CC 不降智精选"],"supported_endpoint_types":["anthropic","openai"],"model_ratio":2.5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 5 + cr * 0.5 + cc * 6.25 + cc1h * 10 + c * 25)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["max"]},{"name":"gemini-embedding-001","vendor_id":3,"enable_groups":["[AIS] Gemini 向量模型"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.075,"model_price":0,"completion_ratio":4,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.15 + c * 0)"},{"name":"grok-4.6-xhigh","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"gemini-2.5-flash-image","description":"Gemini 2.5 Flash Image 图像生成模型,按 token 计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[生图] Gemini"],"supported_endpoint_types":["gemini","openai","image-generation"],"model_ratio":0,"model_price":0.04,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.3 + cr * 0.075 + c * 30)"},{"name":"deepseek-v4-pro","vendor_id":4,"enable_groups":["[满血][官Key] DeepSeek","[低价] DeepSeek","[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"weekday(\"UTC\") >= 1 && weekday(\"UTC\") <= 5 && ((hour(\"UTC\") >= 1 && hour(\"UTC\") < 4) || (hour(\"UTC\") >= 6 && hour(\"UTC\") < 10)) ? tier(\"peak\", p * 1.32 + cr * 0.044 + c * 3.96) : tier(\"off_peak\", p * 0.66 + cr * 0.022 + c * 1.98)","context_window":1000000,"max_tokens":384000,"input_modalities":["text"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-3.8-flash-medium","vendor_id":3,"enable_groups":["[低价][反重力] Gemini"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.75,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"context_window":1000000,"max_tokens":64000,"input_modalities":["text"]},{"name":"gemini-embedding-2-preview","vendor_id":3,"enable_groups":["[AIS] Gemini 向量模型"],"supported_endpoint_types":["gemini","openai"],"model_ratio":0.1,"model_price":0,"completion_ratio":4,"quota_type":0},{"name":"gpt-6-astra","vendor_id":1,"enable_groups":["[低价][备用] GPT Pro","[低价][满血] GPT Pro 2","[低价] GPT 福利","[满血] GPT 不降智精选","[满血] GPT Pro 500 高速","[官key] GPT"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":5,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"(len <= 272000 ? tier(\"0_272k\", p * 10 + cr * 1 + cc * 12.5 + c * 50) : tier(\"272k_plus\", p * 20 + cr * 2 + cc * 25 + c * 75)) * (param(\"service_tier\") == \"fast\" ? 2 : 1) * (param(\"service_tier\") == \"ultrafast\" ? 8 : 1)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"OpenAI 前沿 GPT-6 模型,擅长计算机操作、编码、科学、网络安全与长上下文检索。","status":99.05,"latency":"26.64s","throughput":"52.3t/s"},{"name":"jev-1.13","vendor_id":13,"enable_groups":["[低价] 神秘折扣模型"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.21,"model_price":0,"completion_ratio":1,"cache_ratio":1,"quota_type":0,"context_window":64000,"input_modalities":["text"]},{"name":"grok-4.5","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"create_cache_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"len <= 200000 ? tier(\"0_200k\", p * 2 + cr * 0.3 + c * 6) : tier(\"200k_plus\", p * 4 + cr * 0.6 + c * 12)","context_window":500000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-4.5-medium","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"veo-3.1","description":"高质量视频生成模型,支持文生视频、图生视频和参考素材输入。","tags":"video,unified","vendor_id":3,"enable_groups":["[低价] 视频分组"],"supported_endpoint_types":["openai-video"],"model_ratio":0,"model_price":0.066666666667,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"base\", u(\"seconds\") * 0.066666666667)"},{"name":"qwen3.8-max","vendor_id":8,"enable_groups":["[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 2 + cr * 0.25 + cc * 2.5 + c * 6)","context_window":1000000,"max_tokens":131072,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"nano-banana-2-lite","description":"Nano Banana 2 Lite 图像生成模型,按生成图片张数计费。","icon":"Gemini.Color","vendor_id":3,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.1)) * image_count"},{"name":"kimi-k3","vendor_id":7,"enable_groups":["[低价] 神秘折扣模型","[低价][满血] 国模"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":10,"model_price":0,"completion_ratio":5,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 3 + cr * 0.3 + cc * 3 + c * 15)","context_window":1048576,"max_tokens":131072,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-4.5-high","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"grok-4.6-high","vendor_id":5,"enable_groups":["[低价] Grok"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":3,"cache_ratio":0.25,"quota_type":0,"context_window":500000,"max_tokens":128000,"input_modalities":["text"]},{"name":"seedream-4-5","description":"Seedream 4.5 图像生成模型,按生成图片张数计费。","icon":"ByteDance","vendor_id":14,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":0,"model_price":1,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(1)) * image_count"},{"name":"gpt-6.1-sol","vendor_id":1,"enable_groups":["[官key] GPT","[低价][备用] GPT Pro","[低价][满血] GPT Pro 2","[低价] GPT 福利","[满血] GPT 不降智精选","[满血] GPT Pro 500 高速"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":5,"cache_ratio":0.05,"create_cache_ratio":1.25,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"(len <= 272000 ? tier(\"0_272k\", p * 2 + cr * 0.1 + cc * 2.5 + c * 10) : tier(\"272k_plus\", p * 4 + cr * 0.2 + cc * 5 + c * 15)) * (param(\"service_tier\") == \"fast\" ? 2 : 1) * (param(\"service_tier\") == \"ultrafast\" ? 8 : 1)","context_window":1000000,"max_tokens":128000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"],"description":"GPT-6.1 Sol 在 Sol 基础上升级智能体编码与计算机操作,接近 Astra 水平。","status":97.42,"latency":"22.62s","throughput":"51.3t/s"},{"name":"deepseek-flash","description":"当前为 DeepSeek v4.1 Flash 模型,具体检查点看分组,官 Key 为 1017 检查点","icon":"DeepSeek.Color","vendor_id":4,"enable_groups":["[低价] 神秘折扣模型","[满血][官Key] DeepSeek","[低价] DeepSeek","[低价][满血] 国模","[低价][满血] DeepSeek 1017"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"weekday(\"UTC\") >= 1 && weekday(\"UTC\") <= 5 && ((hour(\"UTC\") >= 1 && hour(\"UTC\") < 4) || (hour(\"UTC\") >= 6 && hour(\"UTC\") < 10)) ? tier(\"peak\", p * 2 + cr * 0.04 + c * 8) : tier(\"off_peak\", p * 1 + cr * 0.02 + c * 4)","context_window":1000000,"max_tokens":384000,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","max"]},{"name":"suno_timing","enable_groups":["[满血] Suno"],"supported_endpoint_types":["openai"],"model_ratio":0,"model_price":0.7718,"completion_ratio":0,"quota_type":1},{"name":"kimseek-r1","enable_groups":["[低价][满血] 国模","[低价][满血] DeepSeek 1017","[低价] DeepSeek"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0},{"name":"gemini-3-flash-preview","vendor_id":3,"enable_groups":["[满血][官Key] Gemini","[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":0.25,"model_price":0,"completion_ratio":6,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"standard\", p * 0.5 + cr * 0.05 + ai * 1 + c * 3)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"gemini-3.1-pro-preview","vendor_id":3,"enable_groups":["[满血][官Key] Gemini","[低价][反重力] Gemini"],"supported_endpoint_types":["openai","openai-response"],"model_ratio":1,"model_price":0,"completion_ratio":6,"cache_ratio":0.1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"len <= 200000 ? tier(\"0_200k\", p * 2 + cr * 0.2 + c * 12) : tier(\"200k_plus\", p * 4 + cr * 0.4 + c * 18)","context_window":1048576,"max_tokens":65536,"input_modalities":["text","image"],"reasoning_levels":["minimal","low","medium","high","xhigh","max"]},{"name":"grok-imagine-image-2.0","description":"Grok Imagine Image 2.0 图像生成模型,按生成图片张数计费。","icon":"XAI","vendor_id":5,"enable_groups":["[低价][生图] 生图特惠"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":37.5,"model_price":0,"completion_ratio":1,"quota_type":0,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.1)) * image_count"},{"name":"grok-imagine-image","description":"Grok Imagine Image 图像生成模型,按生成图片张数计费。","icon":"XAI","vendor_id":5,"enable_groups":["[低价][生图] 生图特惠","[低价] Grok"],"supported_endpoint_types":["image-generation","openai","openai-response"],"model_ratio":0,"model_price":0.4,"completion_ratio":0,"quota_type":1,"billing_mode":"tiered_expr","billing_expr":"tier(\"image\", fixed(0.4)) * image_count"}],"groups":{"[AIS] Gemini 向量模型":1,"[低价] DeepSeek":0.4,"[低价] GPT 福利":0.2,"[低价] Grok":0.1,"[低价] Seedance":1,"[低价] 灵车 K3.1 Pro 专用":0.3,"[低价] 神秘折扣模型":0.12,"[低价] 视频分组":1.5,"[低价] 语音合成 TTS":0.3,"[低价] 语音转文字 ASR":1,"[低价][Kiro] 高智企业 Claude":1,"[低价][促销] GPT Image":0.5,"[低价][反重力] Gemini":0.5,"[低价][备用] GPT Pro":0.3,"[低价][满血] Claude 原生":1.5,"[低价][满血] Claude 特惠":1.1,"[低价][满血] DeepSeek 1017":0.5,"[低价][满血] GPT Pro 2":0.26,"[低价][满血] Gemini Ultra":0.5,"[低价][满血] 国模":0.6,"[低价][满血][自有] GLM 官方":0.25,"[低价][生图] 生图特惠":0.2,"[官key] GPT":0.9,"[满血] Argon 专用":1,"[满血] CC 不降智精选":1.8,"[满血] GPT Pro 500 高速":0.5,"[满血] GPT 不降智精选":0.35,"[满血] Kimi K3.1 Pro 专用":0.6,"[满血] Suno":1,"[满血][官Key] DeepSeek":0.8,"[满血][官Key] Gemini":2,"[生图] GPT Image":1,"[生图] Gemini":1},"refs":{"[AIS] Gemini 向量模型":"#34","[低价] DeepSeek":"#16","[低价] GPT 福利":"#56","[低价] Grok":"#37","[低价] Seedance":"#19","[低价] 灵车 K3.1 Pro 专用":"#49","[低价] 神秘折扣模型":"#24","[低价] 视频分组":"#31","[低价] 语音合成 TTS":"#35","[低价] 语音转文字 ASR":"#27","[低价][Kiro] 高智企业 Claude":"#42","[低价][促销] GPT Image":"#39","[低价][反重力] Gemini":"#5","[低价][备用] GPT Pro":"#13","[低价][满血] Claude 原生":"#61","[低价][满血] Claude 特惠":"#22","[低价][满血] DeepSeek 1017":"#38","[低价][满血] GPT Pro 2":"#14","[低价][满血] Gemini Ultra":"#12","[低价][满血] 国模":"#6","[低价][满血][自有] GLM 官方":"#17","[低价][生图] 生图特惠":"#9","[官key] GPT":"#28","[满血] Argon 专用":"#47","[满血] CC 不降智精选":"#7","[满血] GPT Pro 500 高速":"#57","[满血] GPT 不降智精选":"#2","[满血] Kimi K3.1 Pro 专用":"#48","[满血] Suno":"#67","[满血][官Key] DeepSeek":"#15","[满血][官Key] Gemini":"#8","[生图] GPT Image":"#4","[生图] Gemini":"#29"},"notes":{"[AIS] Gemini 向量模型":"Gemini 文本向量与嵌入模型(AIStudio 渠道)","[低价] DeepSeek":"DeepSeek 正式版,超低折扣,此分组为 v4 Flash 0731","[低价] GPT 福利":"GPT 低价福利分组,不保障满智力","[低价] Grok":"Grok 系列模型,低价通道","[低价] Seedance":"Seedance 视频生成(低价)","[低价] 灵车 K3.1 Pro 专用":"Kimi K3.1 Pro 灵车渠道","[低价] 神秘折扣模型":"神秘折扣模型合集,低价通道,deepseek flash 为 v4.1 旧版","[低价] 视频分组":"Veo / Minimax / Omni 视频生成,低价通道","[低价] 语音合成 TTS":"语音合成(TTS),低价通道","[低价] 语音转文字 ASR":"语音转文字(ASR),低价通道","[低价][Kiro] 高智企业 Claude":"90% Claude Max","[低价][促销] GPT Image":"降智 GPT Pro 号再上岗","[低价][反重力] Gemini":"Gemini 全系模型(反重力渠道)","[低价][备用] GPT Pro":"GPT Pro 账号反代,低价通道","[低价][满血] Claude 原生":"0 注入,神秘渠道","[低价][满血] Claude 特惠":"特惠,尽量保证满血","[低价][满血] DeepSeek 1017":"最新最热满血 DeepSeek v4.1 Flash 1017 专用特价分组","[低价][满血] GPT Pro 2":"GPT Pro 反代,低价 2 号通道","[低价][满血] Gemini Ultra":"反重力 Ultra 套餐反代,支持 Argon","[低价][满血] 国模":"国产大模型满血版,超低折扣","[低价][满血][自有] GLM 官方":"GLM Coding Plan 转发","[低价][生图] 生图特惠":"","[官key] GPT":"OpenAI 官方 Key 通道,支持 UltraFast","[满血] Argon 专用":"不知道从哪来的,质量比 Ultra 好点","[满血] CC 不降智精选":"Claude 满血满智精选,不降智","[满血] GPT Pro 500 高速":"","[满血] GPT 不降智精选":"GPT 满血不降智精选","[满血] Kimi K3.1 Pro 专用":"Kimi K3.1 Pro 专用渠道","[满血] Suno":"Suno 音乐生成(歌词/整曲/音效/分轨/时间轴),按次计费","[满血][官Key] DeepSeek":"","[满血][官Key] Gemini":"Gemini 官方 API Key 通道","[生图] GPT Image":"GPT Image 图像生成","[生图] Gemini":"Gemini 图像生成"},"auto":["[低价][满血] Gemini Ultra","[满血] CC 不降智精选","[满血] GPT 不降智精选","[低价][生图] 生图特惠","[低价] DeepSeek","[低价][备用] GPT Pro","[低价] Grok","[低价] Seedance","[低价] 视频分组","[低价] 语音合成 TTS","[低价] 语音转文字 ASR","[低价][满血] 国模","[低价] 神秘折扣模型","[AIS] Gemini 向量模型","[满血][官Key] Gemini","[官key] GPT","[生图] GPT Image","[生图] Gemini"],"vendors":[{"id":2,"name":"Anthropic","icon":"Claude.Color"},{"id":7,"name":"Moonshot","icon":"Moonshot"},{"id":10,"name":"腾讯","icon":"Hunyuan.Color"},{"id":1,"name":"OpenAI","icon":"OpenAI"},{"id":5,"name":"xAI","icon":"XAI"},{"id":9,"name":"MiniMax","icon":"Minimax.Color"},{"id":12,"name":"小米","icon":"XiaomiMiMo"},{"id":16,"name":"Midjourney","description":"Midjourney 图像生成服务","icon":"Midjourney"},{"id":6,"name":"智谱","icon":"Zhipu.Color"},{"id":13,"name":"TypeSafe"},{"id":14,"name":"字节跳动","description":"字节跳动 Seedream 图像生成系列","icon":"ByteDance"},{"id":15,"name":"Black Forest Labs","description":"Black Forest Labs FLUX 图像生成系列","icon":"Flux"},{"id":17,"name":"Ideogram","description":"Ideogram 图像生成服务","icon":"Ideogram"},{"id":3,"name":"Google","icon":"Gemini.Color"},{"id":4,"name":"DeepSeek","icon":"DeepSeek.Color"},{"id":8,"name":"阿里巴巴","icon":"Qwen.Color"},{"id":11,"name":"即梦","icon":"Jimeng.Color"}],"endpoints":{"anthropic":{"path":"/v1/messages","method":"POST"},"gemini":{"path":"/v1beta/models/{model}:generateContent","method":"POST"},"image-generation":{"path":"/v1/images/generations","method":"POST"},"openai":{"path":"/v1/chat/completions","method":"POST"},"openai-response":{"path":"/v1/responses","method":"POST"}}}
package/page/star.png ADDED
Binary file
package/page/style.css CHANGED
@@ -36,11 +36,17 @@ html, body {
36
36
  }
37
37
 
38
38
  .wrap {
39
- max-width: 760px;
40
- margin: 0 auto;
39
+ max-width: none;
40
+ width: 100%;
41
+ margin: 0;
41
42
  padding: 20px 22px 48px;
42
43
  }
43
44
 
45
+ /* 首页铺满:两张卡一行,随窗口宽度伸缩 */
46
+ .home-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start; }
47
+ .home-grid > .card { margin: 0; }
48
+ @media (max-width: 720px) { .home-grid { grid-template-columns: 1fr; } }
49
+
44
50
  /* 顶部:品牌 + 连接状态。整页只这里允许一点装饰。 */
45
51
  .head {
46
52
  display: flex;
package/page/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // 由 scripts/stamp.mjs 生成,别手改:版本号在 package.json。
2
- self.NEARTOKEN_VERSION = "0.2.5"
2
+ self.NEARTOKEN_VERSION = "0.4.0"