@jeffreycao/copilot-api 2.7.11 → 2.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/README.md +2 -2
  2. package/README.zh-CN.md +2 -2
  3. package/dist/{auth-qC1GSLdS.js → auth--x4CIFvT.js} +4 -4
  4. package/dist/{auth-qC1GSLdS.js.map → auth--x4CIFvT.js.map} +1 -1
  5. package/dist/auth-1hGXVwvW.js +2 -0
  6. package/dist/{config-Cd0U5gXz.js → config-BKA4Y1t8.js} +237 -28
  7. package/dist/config-BKA4Y1t8.js.map +1 -0
  8. package/dist/{config-store-C6GAtKLz.js → config-store-CC5TNG7V.js} +2 -2
  9. package/dist/{config-store-C6GAtKLz.js.map → config-store-CC5TNG7V.js.map} +1 -1
  10. package/dist/{copilot-runtime-Dg3ywZkl.js → copilot-runtime-CW4zUahm.js} +3 -3
  11. package/dist/{copilot-runtime-Dg3ywZkl.js.map → copilot-runtime-CW4zUahm.js.map} +1 -1
  12. package/dist/{debug-CmL-V7Ov.js → debug-BPNjSHgl.js} +3 -3
  13. package/dist/{debug-CmL-V7Ov.js.map → debug-BPNjSHgl.js.map} +1 -1
  14. package/dist/main.js +4 -4
  15. package/dist/{provider-CzziTLqX.js → provider-Dg-3-rrN.js} +2 -2
  16. package/dist/{provider-CzziTLqX.js.map → provider-Dg-3-rrN.js.map} +1 -1
  17. package/dist/{provider-management-DOfLC7WX.js → provider-management-CBrc2nDg.js} +2 -2
  18. package/dist/{provider-management-DOfLC7WX.js.map → provider-management-CBrc2nDg.js.map} +1 -1
  19. package/dist/{server-Dvvc9z2P.js → server-DqfE4x5m.js} +154 -565
  20. package/dist/server-DqfE4x5m.js.map +1 -0
  21. package/dist/{start-Dqv75dA4.js → start-Mpyr_cO_.js} +7 -7
  22. package/dist/{start-Dqv75dA4.js.map → start-Mpyr_cO_.js.map} +1 -1
  23. package/dist/{token-kSGCOmTG.js → token-BdwhXP3l.js} +3 -3
  24. package/dist/{token-kSGCOmTG.js.map → token-BdwhXP3l.js.map} +1 -1
  25. package/package.json +1 -1
  26. package/dist/auth-BzYvzeW0.js +0 -2
  27. package/dist/config-Cd0U5gXz.js.map +0 -1
  28. package/dist/server-Dvvc9z2P.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { S as PATHS, c as getConfig, n as defaultConfig, r as defaultContextManagement, t as SUPPORTED_PROVIDER_TYPES, v as readEditableConfigFromDisk, x as writeConfigToDisk, y as reloadConfig } from "./config-store-C6GAtKLz.js";
1
+ import { S as PATHS, c as getConfig, n as defaultConfig, r as defaultContextManagement, t as SUPPORTED_PROVIDER_TYPES, v as readEditableConfigFromDisk, x as writeConfigToDisk, y as reloadConfig } from "./config-store-CC5TNG7V.js";
2
2
  import consola from "consola";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import path from "node:path";
@@ -106,6 +106,7 @@ const MODELS_DEV_URL = "https://models.dev/api.json";
106
106
  const REFRESH_INTERVAL_MS = 3e5;
107
107
  const FETCH_TIMEOUT_MS = 15e3;
108
108
  const OPENCODE_GO = "opencode-go";
109
+ const MIN_RELEASE_DATE = Date.parse("2026-05-01");
109
110
  const REASONING_EFFORTS = /* @__PURE__ */ new Set([
110
111
  "none",
111
112
  "minimal",
@@ -127,6 +128,10 @@ let activeRefresh = null;
127
128
  function isRecord(value) {
128
129
  return typeof value === "object" && value !== null && !Array.isArray(value);
129
130
  }
131
+ function isVisibleModel(model) {
132
+ if (!isRecord(model) || model.status === "deprecated") return false;
133
+ return !((typeof model.release_date === "string" ? Date.parse(model.release_date) : NaN) < MIN_RELEASE_DATE);
134
+ }
130
135
  function getMetadataPath(cachePath) {
131
136
  const extension = path.extname(cachePath);
132
137
  return path.join(path.dirname(cachePath), `${path.basename(cachePath, extension)}.meta.json`);
@@ -196,17 +201,28 @@ function mapModelConfig(model) {
196
201
  const inputModalities = mapInputModalities(model.modalities);
197
202
  const reasoningField = mapReasoningField(model);
198
203
  const pricing = mapPricing(model.cost);
199
- const defaultReasoningEffort = (model.family === "Hy" || model.family === "grok") && reasoningEfforts.includes("high") ? "high" : void 0;
200
204
  return {
201
205
  ...contextWindow && { contextWindow },
202
206
  ...maxOutputTokens && { maxOutputTokens },
203
207
  ...inputModalities.length > 0 && { inputModalities },
204
208
  ...reasoningEfforts.length > 0 && { reasoningEfforts },
205
- ...defaultReasoningEffort && { defaultReasoningEffort },
206
209
  ...reasoningField && { reasoningField },
207
210
  ...pricing && { pricing }
208
211
  };
209
212
  }
213
+ function mapModelRecord(provider, id, model, config = mapModelConfig(model)) {
214
+ return {
215
+ id,
216
+ name: typeof model.name === "string" && model.name.trim() ? model.name : id,
217
+ object: "model",
218
+ created: 0,
219
+ owned_by: provider,
220
+ ...config.contextWindow && { context_window: config.contextWindow },
221
+ ...config.maxOutputTokens && { max_output_tokens: config.maxOutputTokens },
222
+ ...config.inputModalities && { input_modalities: config.inputModalities },
223
+ ...config.reasoningEfforts && { reasoning_efforts: config.reasoningEfforts }
224
+ };
225
+ }
210
226
  function mapProviderType(model, providerNpm) {
211
227
  switch (model.provider?.npm || providerNpm) {
212
228
  case "@ai-sdk/anthropic": return "anthropic";
@@ -230,7 +246,6 @@ function parseSelectableProviders(data) {
230
246
  const selectableProviders = [];
231
247
  const selectableProviderModelTypes = Object.create(null);
232
248
  const selectableProviderModelApis = Object.create(null);
233
- const selectableProviderModelPricing = Object.create(null);
234
249
  for (const [id, value] of Object.entries(data)) {
235
250
  if (id === "openrouter" || id === "github-copilot" || id === "opencode-go" || id === "copilot" || id === "codex" || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(id) || !isRecord(value) || value.npm !== "@ai-sdk/openai-compatible" && value.npm !== "@ai-sdk/openai" && value.npm !== "@ai-sdk/anthropic") continue;
236
251
  const api = normalizeCatalogApi(value.api);
@@ -243,28 +258,23 @@ function parseSelectableProviders(data) {
243
258
  });
244
259
  const modelTypes = Object.create(null);
245
260
  const modelApis = Object.create(null);
246
- const modelPricing = Object.create(null);
247
261
  if (isRecord(value.models)) for (const [modelId, model] of Object.entries(value.models)) {
248
- if (!isRecord(model) || model.status === "deprecated") continue;
262
+ if (!isVisibleModel(model)) continue;
249
263
  const modelProvider = isRecord(model.provider) ? model.provider : null;
250
264
  const modelNpm = modelProvider?.npm ?? value.npm;
251
265
  if (modelNpm !== "@ai-sdk/openai-compatible" && modelNpm !== "@ai-sdk/openai" && modelNpm !== "@ai-sdk/anthropic") continue;
252
266
  modelTypes[modelId] = mapProviderType(model, value.npm);
253
267
  const modelApi = normalizeCatalogApi(modelProvider?.api);
254
268
  if (modelApi) modelApis[modelId] = modelApi;
255
- const pricing = mapPricing(model.cost);
256
- if (pricing) modelPricing[modelId] = pricing;
257
269
  }
258
270
  selectableProviderModelTypes[id] = modelTypes;
259
271
  selectableProviderModelApis[id] = modelApis;
260
- selectableProviderModelPricing[id] = modelPricing;
261
272
  }
262
273
  selectableProviders.sort((a, b) => a.name.localeCompare(b.name, "en") || a.id.localeCompare(b.id, "en"));
263
274
  return {
264
275
  selectableProviders,
265
276
  selectableProviderModelTypes,
266
- selectableProviderModelApis,
267
- selectableProviderModelPricing
277
+ selectableProviderModelApis
268
278
  };
269
279
  }
270
280
  function parseModelOutputTokens(data) {
@@ -273,7 +283,7 @@ function parseModelOutputTokens(data) {
273
283
  if (!isRecord(provider) || !isRecord(provider.models)) continue;
274
284
  const models = Object.create(null);
275
285
  for (const [modelId, model] of Object.entries(provider.models)) {
276
- if (!isRecord(model) || model.status === "deprecated") continue;
286
+ if (!isVisibleModel(model)) continue;
277
287
  const output = positiveNumber(model.limit?.output);
278
288
  if (output !== void 0 && Number.isInteger(output)) models[modelId] = output;
279
289
  }
@@ -292,21 +302,11 @@ function parseCatalog(data) {
292
302
  const typedModels = models;
293
303
  for (const id of Object.keys(typedModels).sort()) {
294
304
  const value = typedModels[id];
295
- if (!id.trim() || !isRecord(value) || value.id !== id || value.status === "deprecated") continue;
305
+ if (!id.trim() || !isVisibleModel(value) || value.id !== id) continue;
296
306
  const config = mapModelConfig(value);
297
307
  configs[id] = config;
298
308
  providerTypes[id] = mapProviderType(value, providerNpm);
299
- records.push({
300
- id,
301
- name: typeof value.name === "string" && value.name.trim() ? value.name : id,
302
- object: "model",
303
- created: 0,
304
- owned_by: OPENCODE_GO,
305
- ...config.contextWindow && { context_window: config.contextWindow },
306
- ...config.maxOutputTokens && { max_output_tokens: config.maxOutputTokens },
307
- ...config.inputModalities && { input_modalities: config.inputModalities },
308
- ...config.reasoningEfforts && { reasoning_efforts: config.reasoningEfforts }
309
- });
309
+ records.push(mapModelRecord(OPENCODE_GO, id, value, config));
310
310
  }
311
311
  if (records.length === 0) throw new Error("models.dev response has no valid opencode-go models");
312
312
  return {
@@ -335,9 +335,26 @@ function getOpencodeGoModelProviderType(modelId) {
335
335
  function getOpencodeGoModelRecords() {
336
336
  return snapshot?.records ?? [];
337
337
  }
338
+ function getModelsDevProviderModelRecords(providerId) {
339
+ const models = snapshot?.catalog[providerId]?.models;
340
+ if (!isRecord(models)) return [];
341
+ return Object.keys(models).sort().flatMap((id) => {
342
+ const model = models[id];
343
+ if (!id.trim() || !isVisibleModel(model) || model.id !== id) return [];
344
+ return [mapModelRecord(providerId, id, model)];
345
+ });
346
+ }
338
347
  function getModelsDevProviderOptions() {
339
348
  return snapshot?.selectableProviders ?? [];
340
349
  }
350
+ function getModelsDevModelConfig(providerId, modelId) {
351
+ const model = getModelsDevModel(providerId, modelId);
352
+ return isVisibleModel(model) ? mapModelConfig(model) : void 0;
353
+ }
354
+ function isModelsDevModelVisible(providerId, modelId) {
355
+ const model = getModelsDevModel(providerId, modelId);
356
+ return model === void 0 || isVisibleModel(model);
357
+ }
341
358
  function getModelsDevProviderApi(providerId) {
342
359
  return snapshot?.selectableProviders.find((provider) => provider.id === providerId)?.api;
343
360
  }
@@ -348,7 +365,7 @@ function getModelsDevModelApi(providerId, modelId) {
348
365
  return snapshot?.selectableProviderModelApis[providerId]?.[modelId];
349
366
  }
350
367
  function getModelsDevModelPricing(providerId, modelId) {
351
- return snapshot?.selectableProviderModelPricing[providerId]?.[modelId];
368
+ return getModelsDevModelConfig(providerId, modelId)?.pricing;
352
369
  }
353
370
  function getModelsDevModel(providerId, modelId) {
354
371
  const model = snapshot?.catalog[providerId]?.models?.[modelId];
@@ -503,6 +520,198 @@ async function startModelsDevCache(options = {}) {
503
520
  }
504
521
  }
505
522
  //#endregion
523
+ //#region src/lib/builtin-provider-models.ts
524
+ const CODEX_LUNA_PRICING = { tiers: [{
525
+ cacheCreationInput: .125,
526
+ cachedInput: .01,
527
+ input: .1,
528
+ maxInputTokens: 272e3,
529
+ output: .5
530
+ }, {
531
+ cacheCreationInput: .25,
532
+ cachedInput: .02,
533
+ input: .2,
534
+ output: .75
535
+ }] };
536
+ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
537
+ static providerDefaults = { codex: { supportPdf: true } };
538
+ static catalog = { codex: {
539
+ "codex-auto-review": { pricing: CODEX_LUNA_PRICING },
540
+ "gpt-reserve": { pricing: CODEX_LUNA_PRICING },
541
+ "gpt-5.5": { pricing: { tiers: [{
542
+ cachedInput: .5,
543
+ input: 5,
544
+ maxInputTokens: 272e3,
545
+ output: 30
546
+ }, {
547
+ cachedInput: 1,
548
+ input: 10,
549
+ output: 45
550
+ }] } },
551
+ "gpt-5.6-sol": { pricing: { tiers: [{
552
+ cacheCreationInput: 5,
553
+ cachedInput: .4,
554
+ input: 4,
555
+ maxInputTokens: 272e3,
556
+ output: 20
557
+ }, {
558
+ cacheCreationInput: 10,
559
+ cachedInput: .8,
560
+ input: 8,
561
+ output: 30
562
+ }] } },
563
+ "gpt-5.6-terra": { pricing: { tiers: [{
564
+ cacheCreationInput: 2.5,
565
+ cachedInput: .2,
566
+ input: 2,
567
+ maxInputTokens: 272e3,
568
+ output: 12
569
+ }, {
570
+ cacheCreationInput: 5,
571
+ cachedInput: .4,
572
+ input: 4,
573
+ output: 18
574
+ }] } },
575
+ "gpt-5.6-luna": { pricing: { tiers: [{
576
+ cacheCreationInput: .25,
577
+ cachedInput: .02,
578
+ input: .2,
579
+ maxInputTokens: 272e3,
580
+ output: 1.2
581
+ }, {
582
+ cacheCreationInput: .5,
583
+ cachedInput: .04,
584
+ input: .4,
585
+ output: 1.8
586
+ }] } },
587
+ "gpt-6-astra": { pricing: { tiers: [{
588
+ cacheCreationInput: 12.5,
589
+ cachedInput: 1,
590
+ input: 10,
591
+ maxInputTokens: 272e3,
592
+ output: 50
593
+ }, {
594
+ cacheCreationInput: 25,
595
+ cachedInput: 2,
596
+ input: 20,
597
+ output: 75
598
+ }] } },
599
+ "gpt-6-luna": { pricing: CODEX_LUNA_PRICING },
600
+ "gpt-6-sol": { pricing: { tiers: [{
601
+ cacheCreationInput: 2.5,
602
+ cachedInput: .2,
603
+ input: 2,
604
+ maxInputTokens: 272e3,
605
+ output: 10
606
+ }, {
607
+ cacheCreationInput: 5,
608
+ cachedInput: .4,
609
+ input: 4,
610
+ output: 15
611
+ }] } },
612
+ "gpt-6.1-sol": { pricing: { tiers: [{
613
+ cacheCreationInput: 2.5,
614
+ cachedInput: .1,
615
+ input: 2,
616
+ maxInputTokens: 272e3,
617
+ output: 10
618
+ }, {
619
+ cacheCreationInput: 5,
620
+ cachedInput: .2,
621
+ input: 4,
622
+ output: 15
623
+ }] } }
624
+ } };
625
+ modelCatalog;
626
+ constructor() {
627
+ this.modelCatalog = BuiltinProviderModelRegistry.catalog;
628
+ }
629
+ getModelConfig(providerName, modelName) {
630
+ const provider = this.normalizeKey(providerName);
631
+ if (provider === "opencode-go") return getOpencodeGoModelConfig(modelName);
632
+ const models = this.modelCatalog[provider];
633
+ return models?.[modelName.trim()] ?? models?.[this.normalizeKey(modelName)];
634
+ }
635
+ getModelIds(providerName) {
636
+ const provider = this.normalizeKey(providerName);
637
+ if (provider === "opencode-go") return getOpencodeGoModelIds();
638
+ return Object.keys(this.modelCatalog[provider] ?? {});
639
+ }
640
+ getProviderDefaults(providerName) {
641
+ return BuiltinProviderModelRegistry.providerDefaults[this.normalizeKey(providerName)];
642
+ }
643
+ normalizeKey(value) {
644
+ return value.trim().toLowerCase();
645
+ }
646
+ }();
647
+ function getBuiltinProviderModelRecords(provider) {
648
+ return builtinProviderModelRegistry.getModelIds(provider).map((id) => {
649
+ const config = builtinProviderModelRegistry.getModelConfig(provider, id);
650
+ return {
651
+ id,
652
+ name: id,
653
+ object: "model",
654
+ context_window: config?.contextWindow,
655
+ max_output_tokens: config?.maxOutputTokens,
656
+ input_modalities: config?.inputModalities,
657
+ reasoning_efforts: config?.reasoningEfforts
658
+ };
659
+ });
660
+ }
661
+ //#endregion
662
+ //#region src/lib/provider-model-catalog.ts
663
+ const CATALOG_PROVIDERS = /* @__PURE__ */ new Set([
664
+ "xai",
665
+ "openrouter",
666
+ "deepseek",
667
+ "kimi",
668
+ "dashscope"
669
+ ]);
670
+ const CATALOG_ALIASES = {
671
+ kimi: {
672
+ id: "kimi-code-plan-cn",
673
+ hosts: {
674
+ "api.kimi.ai": "kimi-code-plan-global",
675
+ "api.moonshot.ai": "moonshotai",
676
+ "api.moonshot.cn": "moonshotai-cn"
677
+ }
678
+ },
679
+ dashscope: {
680
+ id: "alibaba-cn",
681
+ hosts: {
682
+ "dashscope-intl.aliyuncs.com": "alibaba",
683
+ "coding.dashscope.aliyuncs.com": "alibaba-coding-plan-cn",
684
+ "coding-intl.dashscope.aliyuncs.com": "alibaba-coding-plan",
685
+ "token-plan.cn-beijing.maas.aliyuncs.com": "alibaba-token-plan-cn",
686
+ "token-plan.ap-southeast-1.maas.aliyuncs.com": "alibaba-token-plan"
687
+ }
688
+ }
689
+ };
690
+ function usesModelsDevModelCatalog(provider) {
691
+ return CATALOG_PROVIDERS.has(provider);
692
+ }
693
+ function resolveProviderModelsDevId(provider, config) {
694
+ if (config?.modelsDevProviderId) return config.modelsDevProviderId;
695
+ const alias = CATALOG_ALIASES[provider];
696
+ if (!alias) return provider;
697
+ const baseUrl = config?.baseUrl;
698
+ if (baseUrl) try {
699
+ return alias.hosts[new URL(baseUrl).hostname] ?? alias.id;
700
+ } catch {}
701
+ return alias.id;
702
+ }
703
+ function isProviderModelVisible(provider, modelId, config) {
704
+ return isModelsDevModelVisible(resolveProviderModelsDevId(provider, config), modelId);
705
+ }
706
+ function getLocalProviderModelRecords(provider, config) {
707
+ if (provider === "opencode-go") return getOpencodeGoModelRecords();
708
+ if (!usesModelsDevModelCatalog(provider)) return void 0;
709
+ return getModelsDevProviderModelRecords(resolveProviderModelsDevId(provider, config));
710
+ }
711
+ function getProviderModelConfig(provider, model, config) {
712
+ return getModelsDevModelConfig(resolveProviderModelsDevId(provider, config), model) ?? builtinProviderModelRegistry.getModelConfig(provider, model);
713
+ }
714
+ //#endregion
506
715
  //#region src/lib/provider-config.ts
507
716
  function normalizeProviderBaseUrl(url) {
508
717
  return url.trim().replace(/\/+$/u, "");
@@ -603,7 +812,7 @@ function resolveProviderConfigForModel(providerConfig, model) {
603
812
  const type = resolveEffectiveProviderType(providerConfig, model);
604
813
  const modelApi = providerConfig.modelsDevProviderId && providerConfig.baseUrl === getModelsDevProviderApi(providerConfig.modelsDevProviderId) ? getModelsDevModelApi(providerConfig.modelsDevProviderId, model) : void 0;
605
814
  const configuredModel = providerConfig.models?.[model];
606
- const catalogPricing = providerConfig.modelsDevProviderId ? getModelsDevModelPricing(providerConfig.modelsDevProviderId, model) : void 0;
815
+ const catalogPricing = providerConfig.modelsDevProviderId || usesModelsDevModelCatalog(providerConfig.name) ? getModelsDevModelPricing(resolveProviderModelsDevId(providerConfig.name, providerConfig), model) : void 0;
607
816
  const useCatalogPricing = catalogPricing !== void 0 && configuredModel?.pricing === void 0;
608
817
  if (type === providerConfig.type && !modelApi && !useCatalogPricing) return providerConfig;
609
818
  return {
@@ -632,6 +841,6 @@ function isReservedProviderName(name) {
632
841
  return name.trim() === "copilot" || name.trim() === "github-copilot";
633
842
  }
634
843
  //#endregion
635
- export { isContextManagementEnabledForResponses as C, setModelMappings as E, isContextManagementEnabledForMessages as S, resolveMappedModel as T, getModelMappings as _, normalizeProviderBaseUrl as a, getSmallModel as b, setProviderConfig as c, getOpencodeGoModelConfig as d, getOpencodeGoModelIds as f, getExtraPromptForModel as g, startModelsDevCache as h, listEnabledProviders as i, getModelsDevModel as l, loadModelsDevProviderOptions as m, getRawProviderConfig as n, resolveEffectiveProviderType as o, getOpencodeGoModelRecords as p, isSupportedProviderType as r, resolveProviderConfigForModel as s, getProviderConfig as t, getModelsDevModelMaxOutputTokens as u, getModelResponsesApiCompactThreshold as v, isGpt56OrAbove as w, getSmallModelForProvider as x, getReasoningEffortForModel as y };
844
+ export { resolveMappedModel as A, getModelResponsesApiCompactThreshold as C, isContextManagementEnabledForMessages as D, getSmallModelForProvider as E, isContextManagementEnabledForResponses as O, getModelMappings as S, getSmallModel as T, getModelsDevModelMaxOutputTokens as _, normalizeProviderBaseUrl as a, startModelsDevCache as b, setProviderConfig as c, isProviderModelVisible as d, resolveProviderModelsDevId as f, getModelsDevModel as g, getBuiltinProviderModelRecords as h, listEnabledProviders as i, setModelMappings as j, isGpt56OrAbove as k, getLocalProviderModelRecords as l, builtinProviderModelRegistry as m, getRawProviderConfig as n, resolveEffectiveProviderType as o, usesModelsDevModelCatalog as p, isSupportedProviderType as r, resolveProviderConfigForModel as s, getProviderConfig as t, getProviderModelConfig as u, getModelsDevModelPricing as v, getReasoningEffortForModel as w, getExtraPromptForModel as x, loadModelsDevProviderOptions as y };
636
845
 
637
- //# sourceMappingURL=config-Cd0U5gXz.js.map
846
+ //# sourceMappingURL=config-BKA4Y1t8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BKA4Y1t8.js","names":[],"sources":["../src/lib/model-policy.ts","../src/lib/models-dev-cache.ts","../src/lib/builtin-provider-models.ts","../src/lib/provider-model-catalog.ts","../src/lib/provider-config.ts"],"sourcesContent":["import {\n defaultConfig,\n defaultContextManagement,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n} from \"./config-store\"\n\nconst GPT_MODEL_PATTERN = /^gpt-(\\d+)(?:\\.(\\d+))?/\n\nfunction isGpt53OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 3\n}\n\nexport function isGpt56OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 6\n}\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n const userPrompt = config.extraPrompts?.[model]\n if (userPrompt !== undefined) {\n return userPrompt\n }\n return isGpt53OrAbove(model) ? gpt5CommentaryPrompt : \"\"\n}\n\nexport function getModelMappings(): Record<string, string> {\n const config = getConfig()\n const modelMappings = config.modelMappings\n if (!modelMappings) {\n return { ...defaultConfig.modelMappings }\n }\n\n const validMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (\n !sourceModel\n || typeof targetModel !== \"string\"\n || targetModel.length === 0\n ) {\n continue\n }\n validMappings[sourceModel] = targetModel\n }\n\n return validMappings\n}\n\nfunction validateModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const validatedMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (!sourceModel || !targetModel) {\n throw new Error(\n \"Each model mapping must use non-empty source and target values.\",\n )\n }\n validatedMappings[sourceModel] = targetModel\n }\n\n return validatedMappings\n}\n\nexport function setModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const nextConfig = {\n ...readEditableConfigFromDisk(),\n modelMappings: validateModelMappings(modelMappings),\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getModelMappings()\n}\n\nexport function resolveMappedModel(model: string): string {\n return getModelMappings()[model] ?? model\n}\n\nexport function getSmallModel(): string {\n return getSmallModelForProvider(\"copilot\") ?? \"gpt-6-luna\"\n}\n\nexport function getSmallModelForProvider(provider: string): string | undefined {\n const providerName = provider.trim()\n const configuredModels = getConfig().smallModels\n const model =\n configuredModels && Object.hasOwn(configuredModels, providerName) ?\n configuredModels[providerName]\n : defaultConfig.smallModels?.[providerName]\n\n return typeof model === \"string\" ? model.trim() || undefined : undefined\n}\n\nexport function isContextManagementEnabledForMessages(): boolean {\n const config = getConfig()\n return config.contextManagement?.messages ?? defaultContextManagement.messages\n}\n\nexport function isContextManagementEnabledForResponses(): boolean {\n const config = getConfig()\n return (\n config.contextManagement?.responses ?? defaultContextManagement.responses\n )\n}\n\nexport function getModelResponsesApiCompactThreshold(\n model: string,\n): number | undefined {\n const config = getConfig()\n const threshold = config.modelResponsesApiCompactThresholds?.[model]\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" {\n const config = getConfig()\n const userEffort = config.modelReasoningEfforts?.[model]\n if (userEffort !== undefined) {\n return userEffort\n }\n return isGpt53OrAbove(model) ? \"xhigh\" : \"high\"\n}\n","import { createHash, randomUUID } from \"node:crypto\"\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type {\n Cost as ModelsDevCost,\n Model as ModelsDevModel,\n ModelCost as ModelsDevModelCost,\n ProviderMap as ModelsDevProviderMap,\n} from \"@opencode-ai/models\"\nimport consola from \"consola\"\n\nimport type {\n BuiltinProviderInputModality,\n BuiltinProviderModelConfig,\n} from \"./builtin-provider-models\"\nimport type {\n CodexReasoningEffort,\n ModelReasoningField,\n ProviderType,\n} from \"./config-store\"\nimport { PATHS } from \"./paths\"\nimport type {\n TokenUsagePricingConfig,\n TokenUsagePricingTier,\n} from \"./token-usage/pricing\"\n\nconst MODELS_DEV_URL = \"https://models.dev/api.json\"\nconst REFRESH_INTERVAL_MS = 5 * 60 * 1000\nconst FETCH_TIMEOUT_MS = 15_000\nconst OPENCODE_GO = \"opencode-go\"\nconst MIN_RELEASE_DATE = Date.parse(\"2026-05-01\")\nconst REASONING_EFFORTS = new Set<CodexReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n])\n\ninterface ModelRecord {\n [key: string]: string | number | Array<string> | undefined\n id: string\n name: string\n object: \"model\"\n created: number\n owned_by: string\n context_window?: number\n max_output_tokens?: number\n input_modalities?: Array<BuiltinProviderInputModality>\n reasoning_efforts?: Array<CodexReasoningEffort>\n}\ntype ModelsDevFetcher = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>\n\ninterface CatalogSnapshot {\n catalog: ModelsDevProviderMap\n configs: Record<string, BuiltinProviderModelConfig>\n providerTypes: Record<string, ProviderType>\n records: Array<ModelRecord>\n modelOutputTokens: Record<string, Record<string, number>>\n selectableProviders: Array<ModelsDevProviderOption>\n selectableProviderModelTypes: Record<string, Record<string, ProviderType>>\n selectableProviderModelApis: Record<string, Record<string, string>>\n}\n\nexport interface ModelsDevProviderOption {\n id: string\n name: string\n api: string\n type: ProviderType\n}\n\ninterface ResponseValidator {\n etag?: string\n lastModified?: string\n}\n\nexport interface ModelsDevCacheOptions {\n cachePath?: string\n fetcher?: ModelsDevFetcher\n intervalMs?: number\n}\n\nlet snapshot: CatalogSnapshot | null = null\nlet refreshTimer: ReturnType<typeof setTimeout> | null = null\nlet refreshGeneration = 0\nlet responseValidator: ResponseValidator | null = null\nlet cachedBodyHash: string | null = null\nlet activeCachePath: string | null = null\nlet refreshAbortController: AbortController | null = null\nlet activeRefresh: Promise<void> | null = null\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isVisibleModel(model: unknown): model is ModelsDevModel {\n if (!isRecord(model) || model.status === \"deprecated\") return false\n const releaseDate =\n typeof model.release_date === \"string\" ?\n Date.parse(model.release_date)\n : NaN\n return !(releaseDate < MIN_RELEASE_DATE)\n}\n\nfunction getMetadataPath(cachePath: string): string {\n const extension = path.extname(cachePath)\n return path.join(\n path.dirname(cachePath),\n `${path.basename(cachePath, extension)}.meta.json`,\n )\n}\n\nfunction hashBody(body: string): string {\n return createHash(\"sha256\").update(body).digest(\"hex\")\n}\n\nfunction nonNegativeNumber(value: number | undefined): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : undefined\n}\n\nfunction positiveNumber(value: number | undefined): number | undefined {\n const number = nonNegativeNumber(value)\n return number && number > 0 ? number : undefined\n}\n\nfunction mapPriceTier(value: ModelsDevCost): TokenUsagePricingTier {\n const input = nonNegativeNumber(value.input)\n const output = nonNegativeNumber(value.output)\n const cachedInput = nonNegativeNumber(value.cache_read)\n const cacheCreationInput = nonNegativeNumber(value.cache_write)\n return {\n ...(input !== undefined && { input }),\n ...(output !== undefined && { output }),\n ...(cachedInput !== undefined && { cachedInput }),\n ...(cacheCreationInput !== undefined && { cacheCreationInput }),\n }\n}\n\nfunction mapPricing(\n value: ModelsDevModelCost | undefined,\n): TokenUsagePricingConfig | undefined {\n if (!isRecord(value)) return undefined\n\n const base = mapPriceTier(value)\n const higherTiers = (Array.isArray(value.tiers) ? value.tiers : [])\n .flatMap((tier) => {\n const threshold = positiveNumber(tier?.tier?.size)\n return threshold && threshold >= 1 && tier.tier.type === \"context\" ?\n [{ threshold, price: mapPriceTier(tier) }]\n : []\n })\n .sort((a, b) => a.threshold - b.threshold)\n\n if (higherTiers.length === 0) return base\n\n const firstTierMax = Math.ceil(higherTiers[0].threshold) - 1\n const tiers: Array<TokenUsagePricingTier> = [\n ...(firstTierMax > 0 ? [{ ...base, maxInputTokens: firstTierMax }] : []),\n ...higherTiers.map((tier, index) => ({\n ...tier.price,\n ...(higherTiers[index + 1] && {\n maxInputTokens: Math.ceil(higherTiers[index + 1].threshold) - 1,\n }),\n })),\n ]\n return { tiers }\n}\n\nfunction mapReasoningEfforts(\n value: ModelsDevModel[\"reasoning_options\"],\n): Array<CodexReasoningEffort> {\n if (!Array.isArray(value)) return []\n const efforts: Array<string | null> = []\n for (const option of value) {\n if (option?.type === \"effort\" && Array.isArray(option.values)) {\n efforts.push(...option.values)\n }\n }\n return [\n ...new Set(\n efforts.filter(\n (effort): effort is CodexReasoningEffort =>\n typeof effort === \"string\"\n && REASONING_EFFORTS.has(effort as CodexReasoningEffort),\n ),\n ),\n ]\n}\n\nfunction mapInputModalities(\n value: ModelsDevModel[\"modalities\"],\n): Array<BuiltinProviderInputModality> {\n if (!isRecord(value) || !Array.isArray(value.input)) return []\n return [\n ...new Set(\n value.input.filter(\n (modality): modality is BuiltinProviderInputModality =>\n modality === \"text\" || modality === \"image\",\n ),\n ),\n ]\n}\n\nfunction mapReasoningField(\n model: ModelsDevModel,\n): ModelReasoningField | undefined {\n const interleaved = model.interleaved\n const field = isRecord(interleaved) ? interleaved.field : interleaved\n if (field === \"reasoning_content\") return field\n // models.dev omits `interleaved` for the Hy family, whose Chat Completions\n // history expects the OpenRouter-style `reasoning` field.\n if (model.family === \"Hy\") return \"reasoning\"\n return undefined\n}\n\nfunction mapModelConfig(model: ModelsDevModel): BuiltinProviderModelConfig {\n const contextWindow = positiveNumber(model.limit?.context)\n const maxOutputTokens = positiveNumber(model.limit?.output)\n const reasoningEfforts = mapReasoningEfforts(model.reasoning_options)\n const inputModalities = mapInputModalities(model.modalities)\n const reasoningField = mapReasoningField(model)\n const pricing = mapPricing(model.cost)\n return {\n ...(contextWindow && { contextWindow }),\n ...(maxOutputTokens && { maxOutputTokens }),\n ...(inputModalities.length > 0 && { inputModalities }),\n ...(reasoningEfforts.length > 0 && { reasoningEfforts }),\n ...(reasoningField && { reasoningField }),\n ...(pricing && { pricing }),\n }\n}\n\nfunction mapModelRecord(\n provider: string,\n id: string,\n model: ModelsDevModel,\n config = mapModelConfig(model),\n): ModelRecord {\n return {\n id,\n name: typeof model.name === \"string\" && model.name.trim() ? model.name : id,\n object: \"model\",\n created: 0,\n owned_by: provider,\n ...(config.contextWindow && { context_window: config.contextWindow }),\n ...(config.maxOutputTokens && {\n max_output_tokens: config.maxOutputTokens,\n }),\n ...(config.inputModalities && { input_modalities: config.inputModalities }),\n ...(config.reasoningEfforts && {\n reasoning_efforts: config.reasoningEfforts,\n }),\n }\n}\n\nfunction mapProviderType(\n model: ModelsDevModel,\n providerNpm: string | undefined,\n): ProviderType {\n switch (model.provider?.npm || providerNpm) {\n case \"@ai-sdk/anthropic\":\n return \"anthropic\"\n case \"@ai-sdk/openai\":\n return model.provider?.shape === \"completions\" ?\n \"openai-compatible\"\n : \"openai-responses\"\n case \"@ai-sdk/openai-compatible\":\n default:\n return \"openai-compatible\"\n }\n}\n\nfunction normalizeCatalogApi(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.includes(\"${\")) return undefined\n const api = value.trim().replace(/\\/+$/u, \"\")\n let url: URL\n try {\n url = new URL(api)\n } catch {\n return undefined\n }\n if (\n (url.protocol !== \"https:\" && url.protocol !== \"http:\")\n || url.username\n || url.password\n || url.search\n || url.hash\n ) {\n return undefined\n }\n return api\n}\n\nfunction parseSelectableProviders(\n data: Record<string, unknown>,\n): Pick<\n CatalogSnapshot,\n | \"selectableProviders\"\n | \"selectableProviderModelTypes\"\n | \"selectableProviderModelApis\"\n> {\n const selectableProviders: Array<ModelsDevProviderOption> = []\n const selectableProviderModelTypes: Record<\n string,\n Record<string, ProviderType>\n > = Object.create(null) as Record<string, Record<string, ProviderType>>\n const selectableProviderModelApis: Record<\n string,\n Record<string, string>\n > = Object.create(null) as Record<string, Record<string, string>>\n\n for (const [id, value] of Object.entries(data)) {\n if (\n id === \"openrouter\"\n || id === \"github-copilot\"\n || id === \"opencode-go\"\n || id === \"copilot\"\n || id === \"codex\"\n || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(id)\n || !isRecord(value)\n || (value.npm !== \"@ai-sdk/openai-compatible\"\n && value.npm !== \"@ai-sdk/openai\"\n && value.npm !== \"@ai-sdk/anthropic\")\n ) {\n continue\n }\n\n const api = normalizeCatalogApi(value.api)\n if (!api) continue\n\n selectableProviders.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ?\n value.name.trim()\n : id,\n api,\n type:\n value.npm === \"@ai-sdk/openai\" ? \"openai-responses\"\n : value.npm === \"@ai-sdk/anthropic\" ? \"anthropic\"\n : \"openai-compatible\",\n })\n\n const modelTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const modelApis: Record<string, string> = Object.create(null) as Record<\n string,\n string\n >\n if (isRecord(value.models)) {\n for (const [modelId, model] of Object.entries(value.models)) {\n if (!isVisibleModel(model)) continue\n const modelProvider = isRecord(model.provider) ? model.provider : null\n const modelNpm = modelProvider?.npm ?? value.npm\n if (\n modelNpm !== \"@ai-sdk/openai-compatible\"\n && modelNpm !== \"@ai-sdk/openai\"\n && modelNpm !== \"@ai-sdk/anthropic\"\n ) {\n continue\n }\n const type = mapProviderType(model, value.npm)\n modelTypes[modelId] = type\n const modelApi = normalizeCatalogApi(modelProvider?.api)\n if (modelApi) modelApis[modelId] = modelApi\n }\n }\n selectableProviderModelTypes[id] = modelTypes\n selectableProviderModelApis[id] = modelApis\n }\n\n selectableProviders.sort(\n (a, b) =>\n a.name.localeCompare(b.name, \"en\") || a.id.localeCompare(b.id, \"en\"),\n )\n return {\n selectableProviders,\n selectableProviderModelTypes,\n selectableProviderModelApis,\n }\n}\n\nfunction parseModelOutputTokens(\n data: Record<string, unknown>,\n): CatalogSnapshot[\"modelOutputTokens\"] {\n const providers = Object.create(null) as CatalogSnapshot[\"modelOutputTokens\"]\n for (const [providerId, provider] of Object.entries(data)) {\n if (!isRecord(provider) || !isRecord(provider.models)) continue\n const models = Object.create(null) as Record<string, number>\n for (const [modelId, model] of Object.entries(provider.models)) {\n if (!isVisibleModel(model)) continue\n const output = positiveNumber(model.limit?.output)\n if (output !== undefined && Number.isInteger(output)) {\n models[modelId] = output\n }\n }\n providers[providerId] = models\n }\n return providers\n}\n\nfunction parseCatalog(data: unknown): CatalogSnapshot {\n const provider = isRecord(data) ? data[OPENCODE_GO] : undefined\n const models = isRecord(provider) ? provider.models : undefined\n if (!isRecord(models)) {\n throw new Error(\"models.dev response has no opencode-go models\")\n }\n const providerNpm =\n isRecord(provider) && typeof provider.npm === \"string\" ?\n provider.npm\n : undefined\n\n const configs: Record<string, BuiltinProviderModelConfig> = Object.create(\n null,\n ) as Record<string, BuiltinProviderModelConfig>\n const providerTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const records: Array<ModelRecord> = []\n const typedModels = models as ModelsDevProviderMap[string][\"models\"]\n for (const id of Object.keys(typedModels).sort()) {\n const value = typedModels[id]\n if (!id.trim() || !isVisibleModel(value) || value.id !== id) continue\n const config = mapModelConfig(value)\n configs[id] = config\n providerTypes[id] = mapProviderType(value, providerNpm)\n records.push(mapModelRecord(OPENCODE_GO, id, value, config))\n }\n\n if (records.length === 0) {\n throw new Error(\"models.dev response has no valid opencode-go models\")\n }\n return {\n catalog: data as ModelsDevProviderMap,\n configs,\n providerTypes,\n records,\n modelOutputTokens: parseModelOutputTokens(data as Record<string, unknown>),\n ...parseSelectableProviders(data as Record<string, unknown>),\n }\n}\n\nexport function installModelsDevCatalog(data: unknown): number {\n snapshot = parseCatalog(data)\n return snapshot.records.length\n}\n\nexport function getOpencodeGoModelIds(): Array<string> {\n return snapshot?.records.map((model) => model.id) ?? []\n}\n\nexport function getOpencodeGoModelConfig(\n modelId: string,\n): BuiltinProviderModelConfig | undefined {\n return (\n snapshot?.configs[modelId.trim()]\n ?? snapshot?.configs[modelId.trim().toLowerCase()]\n )\n}\n\nexport function getOpencodeGoModelProviderType(modelId: string): ProviderType {\n const id = modelId.trim()\n return (\n snapshot?.providerTypes[id]\n ?? snapshot?.providerTypes[id.toLowerCase()]\n ?? \"openai-compatible\"\n )\n}\n\nexport function getOpencodeGoModelRecords(): Array<ModelRecord> {\n return snapshot?.records ?? []\n}\n\nexport function getModelsDevProviderModelRecords(\n providerId: string,\n): Array<ModelRecord> {\n const models = snapshot?.catalog[providerId]?.models\n if (!isRecord(models)) return []\n\n return Object.keys(models)\n .sort()\n .flatMap((id) => {\n const model = models[id]\n if (!id.trim() || !isVisibleModel(model) || model.id !== id) {\n return []\n }\n return [mapModelRecord(providerId, id, model)]\n })\n}\n\nexport function getModelsDevProviderOptions(): Array<ModelsDevProviderOption> {\n return snapshot?.selectableProviders ?? []\n}\n\nexport function getModelsDevModelConfig(\n providerId: string,\n modelId: string,\n): BuiltinProviderModelConfig | undefined {\n const model = getModelsDevModel(providerId, modelId)\n return isVisibleModel(model) ? mapModelConfig(model) : undefined\n}\n\nexport function isModelsDevModelVisible(\n providerId: string,\n modelId: string,\n): boolean {\n const model = getModelsDevModel(providerId, modelId)\n return model === undefined || isVisibleModel(model)\n}\n\nexport function getModelsDevProviderModelIds(\n providerId: string,\n): Array<string> {\n return getModelsDevProviderModelRecords(providerId).map((model) => model.id)\n}\n\nexport async function loadCachedModelsDevCatalog(): Promise<void> {\n if (!snapshot) {\n await loadDiskCache(\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\"),\n )\n }\n}\n\nexport function getModelsDevProviderApi(\n providerId: string,\n): string | undefined {\n return snapshot?.selectableProviders.find(\n (provider) => provider.id === providerId,\n )?.api\n}\n\nexport function getModelsDevModelProviderType(\n providerId: string,\n modelId: string,\n): ProviderType | undefined {\n return snapshot?.selectableProviderModelTypes[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelApi(\n providerId: string,\n modelId: string,\n): string | undefined {\n return snapshot?.selectableProviderModelApis[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelPricing(\n providerId: string,\n modelId: string,\n): TokenUsagePricingConfig | undefined {\n return getModelsDevModelConfig(providerId, modelId)?.pricing\n}\n\nexport function getModelsDevModel(\n providerId: string,\n modelId: string,\n): ModelsDevModel | undefined {\n const model = snapshot?.catalog[providerId]?.models?.[modelId]\n return isRecord(model) ? model : undefined\n}\n\nexport function getModelsDevModelMaxOutputTokens(\n providerId: string,\n modelId: string,\n): number | undefined {\n return snapshot?.modelOutputTokens[providerId]?.[modelId]\n}\n\nexport async function loadModelsDevProviderOptions(): Promise<\n Array<ModelsDevProviderOption>\n> {\n if (!snapshot) {\n const cachePath =\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n await loadDiskCache(cachePath)\n if (!snapshot) {\n await refreshCatalog(\n cachePath,\n fetch,\n new AbortController().signal,\n refreshGeneration,\n )\n activeCachePath = cachePath\n }\n }\n return getModelsDevProviderOptions()\n}\n\nexport async function stopModelsDevRefreshLoop(): Promise<void> {\n refreshGeneration += 1\n if (refreshTimer) clearTimeout(refreshTimer)\n refreshTimer = null\n refreshAbortController?.abort()\n await activeRefresh?.catch(() => undefined)\n activeRefresh = null\n}\n\nasync function loadDiskCache(cachePath: string): Promise<void> {\n let body: string\n try {\n body = await fs.readFile(cachePath, \"utf8\")\n installModelsDevCatalog(JSON.parse(body))\n cachedBodyHash = hashBody(body)\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev disk cache.\", error)\n return\n }\n\n try {\n const metadata = JSON.parse(\n await fs.readFile(getMetadataPath(cachePath), \"utf8\"),\n ) as unknown\n if (isRecord(metadata) && metadata.sha256 === cachedBodyHash) {\n responseValidator = {\n etag:\n typeof metadata.etag === \"string\" && metadata.etag.trim() ?\n metadata.etag\n : undefined,\n lastModified:\n (\n typeof metadata.lastModified === \"string\"\n && metadata.lastModified.trim()\n ) ?\n metadata.lastModified\n : undefined,\n }\n }\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev cache metadata.\", error)\n }\n}\n\nasync function persistMetadata(\n cachePath: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n const metadataPath = getMetadataPath(cachePath)\n const temporaryPath = `${metadataPath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(\n temporaryPath,\n JSON.stringify({ sha256, ...validator }),\n { mode: 0o600 },\n )\n await fs.rename(temporaryPath, metadataPath)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function persistCache(\n cachePath: string,\n body: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n const temporaryPath = `${cachePath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(temporaryPath, body, { mode: 0o600 })\n await fs.rename(temporaryPath, cachePath)\n await persistMetadata(cachePath, sha256, validator)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function refreshCatalog(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n signal: AbortSignal,\n generation: number,\n): Promise<void> {\n const headers = new Headers({ accept: \"application/json\" })\n if (snapshot && responseValidator?.etag) {\n headers.set(\"if-none-match\", responseValidator.etag)\n } else if (snapshot && responseValidator?.lastModified) {\n headers.set(\"if-modified-since\", responseValidator.lastModified)\n }\n const response = await fetcher(MODELS_DEV_URL, {\n headers,\n signal: AbortSignal.any([signal, AbortSignal.timeout(FETCH_TIMEOUT_MS)]),\n })\n if (signal.aborted || generation !== refreshGeneration) return\n if (response.status === 304) {\n if (!snapshot) {\n throw new Error(\"models.dev returned HTTP 304 without a cached catalog\")\n }\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? responseValidator?.etag,\n lastModified:\n response.headers.get(\"last-modified\")\n ?? responseValidator?.lastModified,\n }\n if (cachedBodyHash) {\n try {\n await persistMetadata(cachePath, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev cache metadata.\", error)\n }\n }\n consola.debug(\"models.dev catalog is unchanged\")\n return\n }\n if (!response.ok) {\n throw new Error(`models.dev returned HTTP ${response.status}`)\n }\n\n const body = await response.text()\n if (signal.aborted || generation !== refreshGeneration) return\n const nextSnapshot = parseCatalog(JSON.parse(body))\n snapshot = nextSnapshot\n cachedBodyHash = hashBody(body)\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? undefined,\n lastModified: response.headers.get(\"last-modified\") ?? undefined,\n }\n try {\n await persistCache(cachePath, body, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev disk cache.\", error)\n }\n consola.debug(\n `Loaded ${nextSnapshot.records.length} OpenCode Go models from models.dev`,\n )\n}\n\nfunction scheduleRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n): void {\n refreshTimer = setTimeout(() => {\n refreshTimer = null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n false,\n )\n }, intervalMs)\n}\n\nasync function runRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n required: boolean,\n): Promise<void> {\n const controller = new AbortController()\n refreshAbortController = controller\n let refreshed = false\n try {\n await refreshCatalog(cachePath, fetcher, controller.signal, generation)\n refreshed = true\n } catch (error) {\n if (required) {\n throw new Error(\n `Failed to fetch initial models.dev catalog: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n )\n }\n if (generation === refreshGeneration && !controller.signal.aborted) {\n consola.warn(\n \"Failed to refresh models.dev catalog; keeping cached models.\",\n error,\n )\n }\n } finally {\n if (refreshAbortController === controller) refreshAbortController = null\n if (generation === refreshGeneration && (!required || refreshed)) {\n scheduleRefresh(cachePath, fetcher, intervalMs, generation)\n }\n }\n}\n\nexport async function startModelsDevCache(\n options: ModelsDevCacheOptions = {},\n): Promise<void> {\n await stopModelsDevRefreshLoop()\n responseValidator = null\n const generation = refreshGeneration\n const cachePath =\n options.cachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n if (activeCachePath !== cachePath) {\n snapshot = null\n cachedBodyHash = null\n }\n activeCachePath = cachePath\n const fetcher = options.fetcher ?? fetch\n const intervalMs = options.intervalMs ?? REFRESH_INTERVAL_MS\n await loadDiskCache(cachePath)\n if (generation === refreshGeneration) {\n const required = snapshot === null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n required,\n )\n if (required) await activeRefresh\n }\n}\n","import type { TokenUsagePricingConfig } from \"./token-usage/pricing\"\nimport type { CodexReasoningEffort, ModelReasoningField } from \"./config-store\"\nimport {\n getOpencodeGoModelConfig,\n getOpencodeGoModelIds,\n} from \"./models-dev-cache\"\n\nexport type BuiltinProviderInputModality = \"text\" | \"image\"\n\nexport interface BuiltinProviderModelConfig {\n contextWindow?: number\n defaultReasoningEffort?: CodexReasoningEffort\n inputModalities?: Array<BuiltinProviderInputModality>\n maxOutputTokens?: number\n pricing?: TokenUsagePricingConfig\n reasoningEfforts?: Array<CodexReasoningEffort>\n supportPdf?: boolean\n // Message field carrying assistant thinking text in upstream requests,\n // for models that do not follow the default \"reasoning_content\"\n // convention (e.g. opencode-go hy3/hy4 use the OpenRouter-style\n // \"reasoning\" field)\n reasoningField?: ModelReasoningField\n}\n\ntype BuiltinProviderModelCatalog = Record<\n string,\n Record<string, BuiltinProviderModelConfig>\n>\n\nconst CODEX_LUNA_PRICING: TokenUsagePricingConfig = {\n tiers: [\n {\n cacheCreationInput: 0.125,\n cachedInput: 0.01,\n input: 0.1,\n maxInputTokens: 272_000,\n output: 0.5,\n },\n {\n cacheCreationInput: 0.25,\n cachedInput: 0.02,\n input: 0.2,\n output: 0.75,\n },\n ],\n}\n\nexport class BuiltinProviderModelRegistry {\n private static readonly providerDefaults: Record<\n string,\n Readonly<BuiltinProviderModelConfig>\n > = {\n codex: { supportPdf: true },\n }\n\n private static readonly catalog: BuiltinProviderModelCatalog = {\n codex: {\n \"codex-auto-review\": { pricing: CODEX_LUNA_PRICING },\n \"gpt-reserve\": { pricing: CODEX_LUNA_PRICING },\n \"gpt-5.5\": {\n pricing: {\n tiers: [\n {\n cachedInput: 0.5,\n input: 5,\n maxInputTokens: 272_000,\n output: 30,\n },\n {\n cachedInput: 1,\n input: 10,\n output: 45,\n },\n ],\n },\n },\n \"gpt-5.6-sol\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 5,\n cachedInput: 0.4,\n input: 4,\n maxInputTokens: 272_000,\n output: 20,\n },\n {\n cacheCreationInput: 10,\n cachedInput: 0.8,\n input: 8,\n output: 30,\n },\n ],\n },\n },\n \"gpt-5.6-terra\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 2.5,\n cachedInput: 0.2,\n input: 2,\n maxInputTokens: 272_000,\n output: 12,\n },\n {\n cacheCreationInput: 5,\n cachedInput: 0.4,\n input: 4,\n output: 18,\n },\n ],\n },\n },\n \"gpt-5.6-luna\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 0.25,\n cachedInput: 0.02,\n input: 0.2,\n maxInputTokens: 272_000,\n output: 1.2,\n },\n {\n cacheCreationInput: 0.5,\n cachedInput: 0.04,\n input: 0.4,\n output: 1.8,\n },\n ],\n },\n },\n \"gpt-6-astra\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 12.5,\n cachedInput: 1,\n input: 10,\n maxInputTokens: 272_000,\n output: 50,\n },\n {\n cacheCreationInput: 25,\n cachedInput: 2,\n input: 20,\n output: 75,\n },\n ],\n },\n },\n \"gpt-6-luna\": {\n pricing: CODEX_LUNA_PRICING,\n },\n \"gpt-6-sol\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 2.5,\n cachedInput: 0.2,\n input: 2,\n maxInputTokens: 272_000,\n output: 10,\n },\n {\n cacheCreationInput: 5,\n cachedInput: 0.4,\n input: 4,\n output: 15,\n },\n ],\n },\n },\n \"gpt-6.1-sol\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 2.5,\n cachedInput: 0.1,\n input: 2,\n maxInputTokens: 272_000,\n output: 10,\n },\n {\n cacheCreationInput: 5,\n cachedInput: 0.2,\n input: 4,\n output: 15,\n },\n ],\n },\n },\n },\n }\n\n private readonly modelCatalog: BuiltinProviderModelCatalog\n\n constructor() {\n this.modelCatalog = BuiltinProviderModelRegistry.catalog\n }\n\n getModelConfig(\n providerName: string,\n modelName: string,\n ): BuiltinProviderModelConfig | undefined {\n const provider = this.normalizeKey(providerName)\n if (provider === \"opencode-go\") return getOpencodeGoModelConfig(modelName)\n const models = this.modelCatalog[provider]\n return models?.[modelName.trim()] ?? models?.[this.normalizeKey(modelName)]\n }\n\n getModelIds(providerName: string): Array<string> {\n const provider = this.normalizeKey(providerName)\n if (provider === \"opencode-go\") return getOpencodeGoModelIds()\n return Object.keys(this.modelCatalog[provider] ?? {})\n }\n\n getProviderDefaults(\n providerName: string,\n ): Readonly<BuiltinProviderModelConfig> | undefined {\n return BuiltinProviderModelRegistry.providerDefaults[\n this.normalizeKey(providerName)\n ]\n }\n\n private normalizeKey(value: string): string {\n return value.trim().toLowerCase()\n }\n}\n\nexport const builtinProviderModelRegistry = new BuiltinProviderModelRegistry()\n\nexport function getBuiltinProviderModelRecords(\n provider: string,\n): Array<Record<string, unknown>> {\n return builtinProviderModelRegistry.getModelIds(provider).map((id) => {\n const config = builtinProviderModelRegistry.getModelConfig(provider, id)\n return {\n id,\n name: id,\n object: \"model\",\n context_window: config?.contextWindow,\n max_output_tokens: config?.maxOutputTokens,\n input_modalities: config?.inputModalities,\n reasoning_efforts: config?.reasoningEfforts,\n }\n })\n}\n","import type { ProviderConfig } from \"./config-store\"\nimport { builtinProviderModelRegistry } from \"./builtin-provider-models\"\nimport {\n getModelsDevModelConfig,\n getModelsDevProviderModelRecords,\n getOpencodeGoModelRecords,\n isModelsDevModelVisible,\n} from \"./models-dev-cache\"\n\nconst CATALOG_PROVIDERS = new Set([\n \"xai\",\n \"openrouter\",\n \"deepseek\",\n \"kimi\",\n \"dashscope\",\n])\nconst CATALOG_ALIASES: Record<\n string,\n { id: string; hosts: Record<string, string> }\n> = {\n kimi: {\n id: \"kimi-code-plan-cn\",\n hosts: {\n \"api.kimi.ai\": \"kimi-code-plan-global\",\n \"api.moonshot.ai\": \"moonshotai\",\n \"api.moonshot.cn\": \"moonshotai-cn\",\n },\n },\n dashscope: {\n id: \"alibaba-cn\",\n hosts: {\n \"dashscope-intl.aliyuncs.com\": \"alibaba\",\n \"coding.dashscope.aliyuncs.com\": \"alibaba-coding-plan-cn\",\n \"coding-intl.dashscope.aliyuncs.com\": \"alibaba-coding-plan\",\n \"token-plan.cn-beijing.maas.aliyuncs.com\": \"alibaba-token-plan-cn\",\n \"token-plan.ap-southeast-1.maas.aliyuncs.com\": \"alibaba-token-plan\",\n },\n },\n}\n\nexport function usesModelsDevModelCatalog(provider: string): boolean {\n return CATALOG_PROVIDERS.has(provider)\n}\n\ntype CatalogProviderConfig = Pick<\n ProviderConfig,\n \"baseUrl\" | \"modelsDevProviderId\"\n>\n\nexport function resolveProviderModelsDevId(\n provider: string,\n config?: CatalogProviderConfig | null,\n): string {\n if (config?.modelsDevProviderId) return config.modelsDevProviderId\n const alias = CATALOG_ALIASES[provider]\n if (!alias) return provider\n\n const baseUrl = config?.baseUrl\n if (baseUrl) {\n try {\n return alias.hosts[new URL(baseUrl).hostname] ?? alias.id\n } catch {\n // Custom proxies and invalid URLs use the provider's default catalog.\n }\n }\n return alias.id\n}\n\nexport function isProviderModelVisible(\n provider: string,\n modelId: string,\n config?: CatalogProviderConfig | null,\n): boolean {\n return isModelsDevModelVisible(\n resolveProviderModelsDevId(provider, config),\n modelId,\n )\n}\n\nexport function getLocalProviderModelRecords(\n provider: string,\n config?: CatalogProviderConfig | null,\n): Array<Record<string, unknown>> | undefined {\n if (provider === \"opencode-go\") return getOpencodeGoModelRecords()\n if (!usesModelsDevModelCatalog(provider)) return undefined\n return getModelsDevProviderModelRecords(\n resolveProviderModelsDevId(provider, config),\n )\n}\n\nexport function getProviderModelConfig(\n provider: string,\n model: string,\n config?: CatalogProviderConfig | null,\n) {\n return (\n getModelsDevModelConfig(resolveProviderModelsDevId(provider, config), model)\n ?? builtinProviderModelRegistry.getModelConfig(provider, model)\n )\n}\n","import consola from \"consola\"\n\nimport {\n SUPPORTED_PROVIDER_TYPES,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n type ModelConfig,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./config-store\"\nimport {\n getModelsDevModelApi,\n getModelsDevModelPricing,\n getModelsDevModelProviderType,\n getModelsDevProviderApi,\n getOpencodeGoModelProviderType,\n} from \"./models-dev-cache\"\nimport {\n resolveProviderModelsDevId,\n usesModelsDevModelCatalog,\n} from \"./provider-model-catalog\"\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n modelsDevProviderId?: string\n apiKey: string\n authType: ProviderAuthType\n authTypeExplicit?: boolean\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n agentsModels?: Array<string>\n}\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nexport function isSupportedProviderType(value: string): value is ProviderType {\n return SUPPORTED_PROVIDER_TYPES.includes(value as ProviderType)\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nexport function resolveProviderAuthType(\n providerName: string,\n authType: string | undefined,\n providerType: ProviderType,\n): ProviderAuthType {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n if (authType === undefined) {\n return defaultAuthType\n }\n\n if (authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"oauth2\") {\n if (providerName === \"codex\" || providerName === \"xai\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has authType 'oauth2', which is only supported by the builtin codex and xai providers, falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n }\n\n if (authType === \"authorization\" || authType === \"azure-entra\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n}\n\nfunction isProviderApiKeyRequired(\n providerName: string,\n authType: ProviderAuthType,\n): boolean {\n return (\n authType !== \"azure-entra\"\n && !(\n (providerName === \"codex\" || providerName === \"xai\")\n && authType === \"oauth2\"\n )\n )\n}\n\nexport function getRawProviderConfig(name: string): ProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n return config.providers?.[providerName] ?? null\n}\n\nexport function setProviderConfig(\n name: string,\n provider: ProviderConfig,\n): ProviderConfig {\n const providerName = name.trim()\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (isReservedProviderName(providerName)) {\n throw new Error(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const nextConfig = {\n ...editableConfig,\n providers: {\n ...editableConfig.providers,\n [providerName]: provider,\n },\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getRawProviderConfig(providerName) ?? provider\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n if (isReservedProviderName(providerName)) {\n consola.warn(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n return null\n }\n\n const provider = getRawProviderConfig(providerName)\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? \"anthropic\"\n if (!isSupportedProviderType(type)) {\n consola.warn(\n `Provider ${providerName} is ignored because type '${type}' is not supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const authType = resolveProviderAuthType(\n providerName,\n provider.authType,\n type,\n )\n const apiKey = (provider.apiKey ?? \"\").trim()\n const missingFields = [\n ...(baseUrl ? [] : [\"baseUrl\"]),\n ...(isProviderApiKeyRequired(providerName, authType) && !apiKey ?\n [\"apiKey\"]\n : []),\n ]\n\n if (missingFields.length > 0) {\n consola.warn(\n `Provider ${providerName} is enabled but missing ${missingFields.join(\" or \")}`,\n )\n return null\n }\n\n return {\n name: providerName,\n type,\n baseUrl,\n modelsDevProviderId: provider.modelsDevProviderId,\n apiKey,\n authType,\n authTypeExplicit: provider.authType !== undefined,\n pricingCurrency: normalizePricingCurrency(provider.pricingCurrency),\n models: provider.models,\n agentsModels: provider.agentsModels,\n }\n}\n\nexport function resolveEffectiveProviderType(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ProviderType {\n const modelConfig = providerConfig.models?.[model]\n if (modelConfig?.type && isSupportedProviderType(modelConfig.type)) {\n return modelConfig.type\n }\n\n if (providerConfig.name === \"opencode-go\") {\n return getOpencodeGoModelProviderType(model)\n }\n\n if (providerConfig.modelsDevProviderId) {\n const catalogType = getModelsDevModelProviderType(\n providerConfig.modelsDevProviderId,\n model,\n )\n if (catalogType) return catalogType\n }\n\n if (providerConfig.name === \"openrouter\") {\n if (model.includes(\"gpt-\")) {\n return \"openai-responses\"\n }\n }\n\n return providerConfig.type\n}\n\nexport function resolveProviderConfigForModel(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ResolvedProviderConfig {\n const type = resolveEffectiveProviderType(providerConfig, model)\n const modelApi =\n (\n providerConfig.modelsDevProviderId\n && providerConfig.baseUrl\n === getModelsDevProviderApi(providerConfig.modelsDevProviderId)\n ) ?\n getModelsDevModelApi(providerConfig.modelsDevProviderId, model)\n : undefined\n const configuredModel = providerConfig.models?.[model]\n const catalogPricing =\n (\n providerConfig.modelsDevProviderId\n || usesModelsDevModelCatalog(providerConfig.name)\n ) ?\n getModelsDevModelPricing(\n resolveProviderModelsDevId(providerConfig.name, providerConfig),\n model,\n )\n : undefined\n const useCatalogPricing =\n catalogPricing !== undefined && configuredModel?.pricing === undefined\n if (type === providerConfig.type && !modelApi && !useCatalogPricing) {\n return providerConfig\n }\n\n return {\n ...providerConfig,\n type,\n baseUrl: modelApi ?? providerConfig.baseUrl,\n models:\n useCatalogPricing ?\n {\n ...providerConfig.models,\n [model]: { ...configuredModel, pricing: catalogPricing },\n }\n : providerConfig.models,\n pricingCurrency: useCatalogPricing ? \"USD\" : providerConfig.pricingCurrency,\n authType:\n (\n type !== providerConfig.type\n && !providerConfig.authTypeExplicit\n && providerConfig.authType !== \"azure-entra\"\n && providerConfig.authType !== \"oauth2\"\n ) ?\n resolveProviderAuthType(providerConfig.name, undefined, type)\n : providerConfig.authType,\n }\n}\n\nfunction normalizePricingCurrency(\n value: string | undefined,\n): string | undefined {\n const currency = value?.trim().toUpperCase()\n return currency || undefined\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter(\n (name) => !isReservedProviderName(name) && getProviderConfig(name) !== null,\n )\n}\n\nexport function isReservedProviderName(name: string): boolean {\n return name.trim() === \"copilot\" || name.trim() === \"github-copilot\"\n}\n"],"mappings":"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"}
@@ -180,7 +180,7 @@ const defaultContextManagement = {
180
180
  messages: true,
181
181
  responses: false
182
182
  };
183
- const defaultOpencodeModelContextWindow = 3e5;
183
+ const defaultOpencodeModelContextWindow = 4e5;
184
184
  const defaultConfig = {
185
185
  auth: { apiKeys: [] },
186
186
  providers: {},
@@ -491,4 +491,4 @@ function getClaudeTokenMultiplier() {
491
491
  //#endregion
492
492
  export { UpstreamStreamInactivityTimeoutError as A, ensurePaths as C, state as D, isGitHubCopilotEnabled as E, writeFileAtomically as M, HTTPError as O, PATHS as S, assertGitHubCopilotEnabled as T, mergeConfigWithDefaults as _, getAnthropicApiKey as a, setConfiguredApiKeys as b, getConfig as c, getUpstreamTransportConfig as d, invalidateConfigCache as f, isResponsesApiWebSocketEnabled as g, isResponsesApiWebSearchEnabled as h, getAlphaSearchModel as i, forwardError as j, UpstreamHeadersTimeoutError as k, getMessageApiWebSearchModel as l, isMessagesApiEnabled as m, defaultConfig as n, getClaudeAutoModel as o, isAlphaSearchCodexPriorityEnabled as p, defaultContextManagement as r, getClaudeTokenMultiplier as s, SUPPORTED_PROVIDER_TYPES as t, getOpencodeModelContextWindow as u, readEditableConfigFromDisk as v, GITHUB_COPILOT_PROVIDER as w, writeConfigToDisk as x, reloadConfig as y };
493
493
 
494
- //# sourceMappingURL=config-store-C6GAtKLz.js.map
494
+ //# sourceMappingURL=config-store-CC5TNG7V.js.map