@kenkaiiii/gg-core 5.82.0 → 5.83.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/dist/index.cjs CHANGED
@@ -35,6 +35,8 @@ __export(index_exports, {
35
35
  DEFAULT_LOCAL_ENDPOINTS: () => DEFAULT_LOCAL_ENDPOINTS,
36
36
  DEFAULT_MAX_VIDEO_BYTES: () => DEFAULT_MAX_VIDEO_BYTES,
37
37
  FALLBACK_CONTEXT_WINDOW: () => FALLBACK_CONTEXT_WINDOW,
38
+ GEMINI_API_KEY: () => GEMINI_API_KEY,
39
+ GEMINI_API_KEY_BASE_URL: () => GEMINI_API_KEY_BASE_URL,
38
40
  LOCAL_API_KEY_PLACEHOLDER: () => LOCAL_API_KEY_PLACEHOLDER,
39
41
  LOCAL_AUTH_KEY_PREFIX: () => LOCAL_AUTH_KEY_PREFIX,
40
42
  MODELS: () => MODELS,
@@ -89,6 +91,7 @@ __export(index_exports, {
89
91
  isLocalModelId: () => isLocalModelId,
90
92
  isLoggerOpen: () => isLoggerOpen,
91
93
  isModelLoaded: () => isModelLoaded,
94
+ isPaidModel: () => isPaidModel,
92
95
  isThinkingLevelSupported: () => isThinkingLevelSupported,
93
96
  kimiCodeBaseUrl: () => kimiCodeBaseUrl,
94
97
  kimiCodingHeaders: () => kimiCodingHeaders,
@@ -117,13 +120,11 @@ __export(index_exports, {
117
120
  toModelInfo: () => toModelInfo,
118
121
  transcribeVoice: () => transcribeVoice,
119
122
  usesOpenAICodexTransport: () => usesOpenAICodexTransport,
120
- withFileLock: () => withFileLock
123
+ withFileLock: () => withFileLock,
124
+ withoutPaidTier: () => withoutPaidTier
121
125
  });
122
126
  module.exports = __toCommonJS(index_exports);
123
127
 
124
- // src/model-registry.ts
125
- var import_gg_ai2 = require("@kenkaiiii/gg-ai");
126
-
127
128
  // src/oauth/kimi.ts
128
129
  var import_node_child_process = require("child_process");
129
130
  var import_node_crypto = require("crypto");
@@ -1594,6 +1595,8 @@ function providerStorageKeys(provider) {
1594
1595
  return dual ? [dual.oauthKey, dual.provider] : [provider];
1595
1596
  }
1596
1597
  var XIAOMI_CREDITS_KEY = "xiaomi-credits";
1598
+ var GEMINI_API_KEY = "gemini-api";
1599
+ var GEMINI_API_KEY_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
1597
1600
  var LOCAL_AUTH_KEY_PREFIX = "local:";
1598
1601
  var LOCAL_CREDENTIAL_LIFETIME_MS = 100 * 365 * 24 * 60 * 60 * 1e3;
1599
1602
  function activeBaseUrlEntry(data, provider) {
@@ -1697,6 +1700,9 @@ var AuthStorage = class {
1697
1700
  if (provider === "xiaomi") {
1698
1701
  return Boolean(this.data["xiaomi"] || this.data[XIAOMI_CREDITS_KEY]);
1699
1702
  }
1703
+ if (provider === "gemini") {
1704
+ return Boolean(this.data["gemini"] || this.data[GEMINI_API_KEY]);
1705
+ }
1700
1706
  if (provider === "local") {
1701
1707
  return Object.keys(this.data).some((key) => key.startsWith(LOCAL_AUTH_KEY_PREFIX));
1702
1708
  }
@@ -1925,6 +1931,12 @@ var AuthStorage = class {
1925
1931
  ...opts.rejectedToken !== void 0 ? { rejectedToken: opts.rejectedToken } : {}
1926
1932
  });
1927
1933
  }
1934
+ if (key === provider) {
1935
+ return await this.resolveCredentials(provider, {
1936
+ ...opts.forceRefresh ? { forceRefresh: true } : {},
1937
+ ...opts.rejectedToken !== void 0 ? { rejectedToken: opts.rejectedToken } : {}
1938
+ });
1939
+ }
1928
1940
  return creds2;
1929
1941
  }
1930
1942
  throw new NotLoggedInError(provider);
@@ -2066,6 +2078,24 @@ var NotLoggedInError = class extends Error {
2066
2078
  };
2067
2079
 
2068
2080
  // src/model-registry.ts
2081
+ var CLAUDE_FAST_BILLING = {
2082
+ label: "bills usage credits",
2083
+ detail: "Fast mode bills your Claude usage credits ($8 in / $40 out per million tokens) from the first token, never your plan's included usage.",
2084
+ paid: true,
2085
+ standardModel: "claude-opus-5-5"
2086
+ };
2087
+ var XIAOMI_ULTRASPEED_BILLING = {
2088
+ label: "bills API Credits",
2089
+ detail: "UltraSpeed runs only on your Xiaomi API Credits, billed per token at a higher rate than MiMo-V2.6-Pro, never on the Token Plan.",
2090
+ paid: true,
2091
+ standardModel: "mimo-v2.6-pro"
2092
+ };
2093
+ var CODEX_FAST_BILLING = {
2094
+ label: "2.5x plan usage",
2095
+ detail: "Codex Fast mode uses your ChatGPT plan limits at 2.5x the standard rate (purchased credits at 2x).",
2096
+ paid: false
2097
+ };
2098
+ var GEMINI_AUTH_KEYS = [GEMINI_API_KEY, "gemini"];
2069
2099
  var MODELS = [
2070
2100
  // ── Anthropic ──────────────────────────────────────────
2071
2101
  // NOTE: Claude Mythos 5.1 (`claude-mythos-5-1`, 2026-09-01) is kept commented
@@ -2145,7 +2175,8 @@ var MODELS = [
2145
2175
  supportsVideo: false,
2146
2176
  costTier: "high",
2147
2177
  defaultThinkingLevel: "medium",
2148
- maxThinkingLevel: "max"
2178
+ maxThinkingLevel: "max",
2179
+ billing: CLAUDE_FAST_BILLING
2149
2180
  },
2150
2181
  {
2151
2182
  // Released 2026-09-28 — replaces Sonnet 5 at $2/$10 MTok, with the same
@@ -2159,9 +2190,10 @@ var MODELS = [
2159
2190
  supportsImages: true,
2160
2191
  supportsVideo: false,
2161
2192
  costTier: "medium",
2162
- // Anthropic's API and Claude Code both start the 5.5 family at medium; at a
2163
- // given level 5.5 thinks more than 5, so the ladder ceiling (max) made fresh
2164
- // sessions slow and expensive. Users can still opt up.
2193
+ // We start Sonnet 5.5 at medium like the rest of the 5.5 family (the API's
2194
+ // own default for Sonnet 5.5 is high). At a given level 5.5 thinks more
2195
+ // than 5, so the ladder ceiling (max) made fresh sessions slow and
2196
+ // expensive. Users can still opt up.
2165
2197
  defaultThinkingLevel: "medium",
2166
2198
  maxThinkingLevel: "max"
2167
2199
  },
@@ -2230,7 +2262,8 @@ var MODELS = [
2230
2262
  supportsImages: true,
2231
2263
  supportsVideo: false,
2232
2264
  costTier: "high",
2233
- maxThinkingLevel: "ultra"
2265
+ maxThinkingLevel: "ultra",
2266
+ billing: CODEX_FAST_BILLING
2234
2267
  },
2235
2268
  // GPT-6 Sol + Luna — released 2026-09-22 below Astra, replacing the whole
2236
2269
  // GPT-5.6 family (Sol/Terra/Luna; there is no GPT-6 Terra — OpenAI's Codex
@@ -2274,7 +2307,8 @@ var MODELS = [
2274
2307
  supportsImages: true,
2275
2308
  supportsVideo: false,
2276
2309
  costTier: "medium",
2277
- maxThinkingLevel: "ultra"
2310
+ maxThinkingLevel: "ultra",
2311
+ billing: CODEX_FAST_BILLING
2278
2312
  },
2279
2313
  {
2280
2314
  // Luna — "Fast and affordable model for easier tasks." (Codex priority 4,
@@ -2308,7 +2342,8 @@ var MODELS = [
2308
2342
  supportsImages: true,
2309
2343
  supportsVideo: false,
2310
2344
  costTier: "low",
2311
- maxThinkingLevel: "max"
2345
+ maxThinkingLevel: "max",
2346
+ billing: CODEX_FAST_BILLING
2312
2347
  },
2313
2348
  // ── Sakana (Fugu) ──────────────────────────────────────
2314
2349
  // Sakana Fugu is a multi-agent system surfaced as a standard LLM via the
@@ -2392,10 +2427,14 @@ var MODELS = [
2392
2427
  supportsVideo: true,
2393
2428
  maxVideoBytes: 20 * 1024 * 1024,
2394
2429
  costTier: "low",
2395
- maxThinkingLevel: "high"
2430
+ maxThinkingLevel: "high",
2431
+ authStorageKeys: GEMINI_AUTH_KEYS
2396
2432
  },
2397
2433
  // Keep 3.1 Flash Lite first for the working OAuth default and fast-model routing.
2398
- // New GA models are opt-in; Code Assist access varies by account.
2434
+ // New GA models are opt-in; Code Assist access varies by account. Gemini 3.7
2435
+ // Flash is retired: Google deprecated it on 2026-10-08 and routes every
2436
+ // `gemini-3.7-flash` request to 3.8 Flash (ai.google.dev/gemini-api/docs/
2437
+ // changelog), so a saved session on it falls back to the provider default.
2399
2438
  {
2400
2439
  id: "gemini-3.8-flash",
2401
2440
  name: "Gemini 3.8 Flash",
@@ -2407,7 +2446,8 @@ var MODELS = [
2407
2446
  supportsVideo: true,
2408
2447
  maxVideoBytes: 20 * 1024 * 1024,
2409
2448
  costTier: "low",
2410
- maxThinkingLevel: "high"
2449
+ maxThinkingLevel: "high",
2450
+ authStorageKeys: GEMINI_AUTH_KEYS
2411
2451
  },
2412
2452
  {
2413
2453
  id: "gemini-3.5-flash-lite",
@@ -2420,27 +2460,8 @@ var MODELS = [
2420
2460
  supportsVideo: true,
2421
2461
  maxVideoBytes: 20 * 1024 * 1024,
2422
2462
  costTier: "low",
2423
- maxThinkingLevel: "high"
2424
- },
2425
- {
2426
- // Gemini 3.7 Flash (released 2026-08-13) — Google's most capable Flash for
2427
- // coding, agents, and multi-step execution; GA-stable on the Gemini API as
2428
- // `gemini-3.7-flash`. 1M context, 64K output, thinking low/medium/high.
2429
- // Sent over our Code Assist (OAuth) transport ahead of gemini-cli — upstream
2430
- // hasn't listed 3.7 yet (google-gemini/gemini-cli#28802, still open) — so
2431
- // free/personal accounts 404 (entitlement-gated) while Code Assist
2432
- // Standard/Enterprise accounts get it.
2433
- id: "gemini-3.7-flash",
2434
- name: "Gemini 3.7 Flash",
2435
- provider: "gemini",
2436
- contextWindow: 1048576,
2437
- maxOutputTokens: 65536,
2438
- supportsThinking: true,
2439
- supportsImages: true,
2440
- supportsVideo: true,
2441
- maxVideoBytes: 20 * 1024 * 1024,
2442
- costTier: "low",
2443
- maxThinkingLevel: "high"
2463
+ maxThinkingLevel: "high",
2464
+ authStorageKeys: GEMINI_AUTH_KEYS
2444
2465
  },
2445
2466
  {
2446
2467
  // Wire name `gemini-3-flash` — the Code Assist (OAuth) backend rejects the
@@ -2456,7 +2477,8 @@ var MODELS = [
2456
2477
  supportsVideo: true,
2457
2478
  maxVideoBytes: 20 * 1024 * 1024,
2458
2479
  costTier: "low",
2459
- maxThinkingLevel: "high"
2480
+ maxThinkingLevel: "high",
2481
+ authStorageKeys: GEMINI_AUTH_KEYS
2460
2482
  },
2461
2483
  {
2462
2484
  // Gemini 3.1 Pro is public preview — gated behind Code Assist preview
@@ -2472,7 +2494,8 @@ var MODELS = [
2472
2494
  supportsVideo: true,
2473
2495
  maxVideoBytes: 20 * 1024 * 1024,
2474
2496
  costTier: "high",
2475
- maxThinkingLevel: "high"
2497
+ maxThinkingLevel: "high",
2498
+ authStorageKeys: GEMINI_AUTH_KEYS
2476
2499
  },
2477
2500
  // ── Moonshot (Kimi) ────────────────────────────────────
2478
2501
  // K3 is Kimi's 2.8T-parameter flagship for long-horizon coding, knowledge
@@ -2661,9 +2684,13 @@ var MODELS = [
2661
2684
  maxVideoBytes: 36 * 1024 * 1024,
2662
2685
  costTier: "high",
2663
2686
  maxThinkingLevel: "high",
2664
- authStorageKeys: [XIAOMI_CREDITS_KEY]
2687
+ authStorageKeys: [XIAOMI_CREDITS_KEY],
2688
+ billing: XIAOMI_ULTRASPEED_BILLING
2665
2689
  },
2666
2690
  // ── DeepSeek ───────────────────────────────────────────
2691
+ // Window 1,000,000 tokens (decimal "1M"), as DeepSeek's own agent sizes it
2692
+ // (deepseek-ai/deepseek-harness DEFAULT_CONTEXT_WINDOW = 1_000_000; models.dev
2693
+ // via earendil-works/pi agrees) — not 1,048,576.
2667
2694
  // The live /models list (2026-09-28) serves exactly `deepseek-flash` and
2668
2695
  // `deepseek-v4-pro`. V4 Flash and V4 Flash Vision Exp are retired; their old
2669
2696
  // ids only temporarily route to V4.1 Flash, so they are retired here too.
@@ -2677,7 +2704,7 @@ var MODELS = [
2677
2704
  id: "deepseek-v4-pro",
2678
2705
  name: "DeepSeek V4 Pro",
2679
2706
  provider: "deepseek",
2680
- contextWindow: 1048576,
2707
+ contextWindow: 1e6,
2681
2708
  maxOutputTokens: 384e3,
2682
2709
  supportsThinking: true,
2683
2710
  supportsImages: false,
@@ -2691,7 +2718,7 @@ var MODELS = [
2691
2718
  id: "deepseek-flash",
2692
2719
  name: "DeepSeek V4.1 Flash",
2693
2720
  provider: "deepseek",
2694
- contextWindow: 1048576,
2721
+ contextWindow: 1e6,
2695
2722
  maxOutputTokens: 384e3,
2696
2723
  supportsThinking: true,
2697
2724
  supportsImages: true,
@@ -2755,7 +2782,7 @@ var MODELS = [
2755
2782
  id: "deepseek-ai/DeepSeek-V4.1-Flash",
2756
2783
  name: "DeepSeek V4.1 Flash",
2757
2784
  provider: "huggingface",
2758
- contextWindow: 1048576,
2785
+ contextWindow: 1e6,
2759
2786
  maxOutputTokens: 131072,
2760
2787
  supportsThinking: false,
2761
2788
  supportsImages: true,
@@ -2802,6 +2829,19 @@ function getModel(id) {
2802
2829
  function getModelsForProvider(provider) {
2803
2830
  return getAllModels().filter((m) => m.provider === provider);
2804
2831
  }
2832
+ function isPaidModel(modelId) {
2833
+ return getModel(modelId)?.billing?.paid === true;
2834
+ }
2835
+ function withoutPaidTier(modelId) {
2836
+ const model = getModel(modelId);
2837
+ if (model?.billing?.paid !== true) return modelId;
2838
+ const usable = (id) => id !== void 0 && getModel(id) !== void 0 && !isPaidModel(id);
2839
+ const standard = model.billing.standardModel;
2840
+ if (usable(standard)) return standard;
2841
+ const providerDefault = DEFAULT_MODEL_IDS[model.provider];
2842
+ if (usable(providerDefault)) return providerDefault;
2843
+ return FALLBACK_DEFAULT_MODEL_ID;
2844
+ }
2805
2845
  function getAuthStorageKeys(provider, modelId) {
2806
2846
  const model = getAllModels().find((m) => m.id === modelId && m.provider === provider);
2807
2847
  return model?.authStorageKeys ?? [provider];
@@ -2883,9 +2923,7 @@ var SUMMARY_COST_TIER = {
2883
2923
  };
2884
2924
  function getSummaryModel(provider, currentModelId) {
2885
2925
  const tier = SUMMARY_COST_TIER[provider];
2886
- const tagged = tier ? getModelsForProvider(provider).find(
2887
- (m) => m.costTier === tier && !(0, import_gg_ai2.resolveFastModeModel)(provider, m.id).fast
2888
- ) : void 0;
2926
+ const tagged = tier ? getModelsForProvider(provider).find((m) => m.costTier === tier && m.billing === void 0) : void 0;
2889
2927
  return tagged ?? getModel(currentModelId) ?? getDefaultModel(provider);
2890
2928
  }
2891
2929
 
@@ -3303,8 +3341,28 @@ var AUTH_PROVIDERS = [
3303
3341
  {
3304
3342
  value: "gemini",
3305
3343
  label: "Gemini",
3306
- description: "Gemini 3.8 Flash, 3.5 Flash Lite, 3.7 Flash, 3.1 Flash Lite, 3.5 Flash, 3.1 Pro (Preview)",
3307
- methods: ["oauth"]
3344
+ description: "Gemini 3.8 Flash, 3.5 Flash Lite, 3.1 Flash Lite, 3.5 Flash, 3.1 Pro (Preview)",
3345
+ methods: ["oauth", "apikey"],
3346
+ apiKeyLabel: "Gemini",
3347
+ apiKeyBaseUrl: GEMINI_API_KEY_BASE_URL,
3348
+ // Stored under its own key so it never overwrites the `gemini` OAuth login.
3349
+ apiKeyVariants: [
3350
+ { key: GEMINI_API_KEY, label: "Google AI Studio", baseUrl: GEMINI_API_KEY_BASE_URL }
3351
+ ],
3352
+ methodDetails: {
3353
+ oauth: {
3354
+ method: "oauth",
3355
+ label: "Sign in with Google",
3356
+ billing: "Gemini Code Assist Standard or Enterprise licence.",
3357
+ when: "Personal Google accounts are no longer served here (Google ended it on June 18, 2026)."
3358
+ },
3359
+ apikey: {
3360
+ method: "apikey",
3361
+ label: "Gemini API key",
3362
+ billing: "Pay-per-token from a Google AI Studio key.",
3363
+ when: "Used first whenever it is set."
3364
+ }
3365
+ }
3308
3366
  },
3309
3367
  {
3310
3368
  value: "xai",
@@ -3434,6 +3492,9 @@ function describeAuthMethods(provider) {
3434
3492
  });
3435
3493
  }
3436
3494
  function authPriorityNote(provider) {
3495
+ if (provider === "gemini") {
3496
+ return "Uses the Gemini API key first when one is set; otherwise the Google sign-in.";
3497
+ }
3437
3498
  const dual = dualAuthProvider(provider);
3438
3499
  if (!dual) return void 0;
3439
3500
  return `Uses ${dual.oauthLabel} first; the ${dual.apiKeyLabel} takes over when it runs out, then switches back.`;
@@ -4180,6 +4241,8 @@ function createAutoUpdater(config) {
4180
4241
  DEFAULT_LOCAL_ENDPOINTS,
4181
4242
  DEFAULT_MAX_VIDEO_BYTES,
4182
4243
  FALLBACK_CONTEXT_WINDOW,
4244
+ GEMINI_API_KEY,
4245
+ GEMINI_API_KEY_BASE_URL,
4183
4246
  LOCAL_API_KEY_PLACEHOLDER,
4184
4247
  LOCAL_AUTH_KEY_PREFIX,
4185
4248
  MODELS,
@@ -4234,6 +4297,7 @@ function createAutoUpdater(config) {
4234
4297
  isLocalModelId,
4235
4298
  isLoggerOpen,
4236
4299
  isModelLoaded,
4300
+ isPaidModel,
4237
4301
  isThinkingLevelSupported,
4238
4302
  kimiCodeBaseUrl,
4239
4303
  kimiCodingHeaders,
@@ -4262,6 +4326,7 @@ function createAutoUpdater(config) {
4262
4326
  toModelInfo,
4263
4327
  transcribeVoice,
4264
4328
  usesOpenAICodexTransport,
4265
- withFileLock
4329
+ withFileLock,
4330
+ withoutPaidTier
4266
4331
  });
4267
4332
  //# sourceMappingURL=index.cjs.map