cascade-ai 0.12.19 → 0.12.21

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.
@@ -222452,7 +222452,7 @@ Anthropic.Models = Models2;
222452
222452
  Anthropic.Beta = Beta;
222453
222453
 
222454
222454
  // src/constants.ts
222455
- var CASCADE_VERSION = "0.12.19";
222455
+ var CASCADE_VERSION = "0.12.21";
222456
222456
  var CASCADE_CONFIG_DIR = ".cascade";
222457
222457
  var CASCADE_MD_FILE = "CASCADE.md";
222458
222458
  var CASCADE_IGNORE_FILE = ".cascadeignore";
@@ -249421,8 +249421,7 @@ try {
249421
249421
  } catch {
249422
249422
  }
249423
249423
  function preferIpv4Host(url) {
249424
- if (!url) return url;
249425
- return url.replace(/^(https?:\/\/)localhost(?=[:/]|$)/i, "$1127.0.0.1");
249424
+ return url;
249426
249425
  }
249427
249426
  var MAX_REDIRECTS = 5;
249428
249427
  async function nodeHttpFetch(input, init2 = {}, redirectCount = 0) {
@@ -249697,7 +249696,7 @@ var OllamaProvider = class extends BaseProvider {
249697
249696
  // src/providers/openai-compatible.ts
249698
249697
  var OpenAICompatibleProvider = class extends OpenAIProvider {
249699
249698
  constructor(config2, model) {
249700
- super(config2, model);
249699
+ super({ ...config2, apiKey: config2.apiKey ?? "not-required" }, model);
249701
249700
  this.client = new openai_default({
249702
249701
  apiKey: config2.apiKey ?? "not-required",
249703
249702
  baseURL: preferIpv4Host(config2.baseUrl),
@@ -250583,10 +250582,10 @@ var CascadeRouter = class _CascadeRouter extends EventEmitter__default.default {
250583
250582
  if (availableProviders.has("ollama")) {
250584
250583
  await this.discoverOllamaModels(ollamaCfg);
250585
250584
  }
250586
- if (availableProviders.has("openai-compatible")) {
250587
- await Promise.all(
250588
- config2.providers.filter((p3) => p3.type === "openai-compatible").map((cfg) => this.discoverOpenAICompatibleModels(cfg))
250589
- );
250585
+ const ocConfigs = config2.providers.filter((p3) => p3.type === "openai-compatible" && p3.baseUrl);
250586
+ if (ocConfigs.length > 0) {
250587
+ const results = await Promise.all(ocConfigs.map((cfg) => this.discoverOpenAICompatibleModels(cfg)));
250588
+ if (results.some(Boolean)) this.selector.markProviderAvailable("openai-compatible");
250590
250589
  }
250591
250590
  for (const tier of ["T1", "T2", "T3"]) {
250592
250591
  const override = tier === "T1" ? config2.models.t1 : tier === "T2" ? config2.models.t2 : config2.models.t3;
@@ -251057,6 +251056,7 @@ var CascadeRouter = class _CascadeRouter extends EventEmitter__default.default {
251057
251056
  } catch {
251058
251057
  }
251059
251058
  }
251059
+ /** Returns true when at least one real model was discovered from the endpoint. */
251060
251060
  async discoverOpenAICompatibleModels(cfg) {
251061
251061
  try {
251062
251062
  const seed = {
@@ -251076,8 +251076,10 @@ var CascadeRouter = class _CascadeRouter extends EventEmitter__default.default {
251076
251076
  for (const m3 of models) {
251077
251077
  this.selector.addDynamicModel(m3);
251078
251078
  }
251079
+ return models.length > 0;
251079
251080
  } catch (err) {
251080
251081
  console.warn("[router] OpenAI-compatible model discovery failed:", err instanceof Error ? err.message : err);
251082
+ return false;
251081
251083
  }
251082
251084
  }
251083
251085
  ensureProvider(model, configs) {
package/dist/index.cjs CHANGED
@@ -85,7 +85,7 @@ var cron__default = /*#__PURE__*/_interopDefault(cron);
85
85
 
86
86
 
87
87
  // src/constants.ts
88
- var CASCADE_VERSION = "0.12.19";
88
+ var CASCADE_VERSION = "0.12.21";
89
89
  var CASCADE_CONFIG_DIR = ".cascade";
90
90
  var CASCADE_MD_FILE = "CASCADE.md";
91
91
  var CASCADE_IGNORE_FILE = ".cascadeignore";
@@ -1151,8 +1151,7 @@ try {
1151
1151
  } catch {
1152
1152
  }
1153
1153
  function preferIpv4Host(url) {
1154
- if (!url) return url;
1155
- return url.replace(/^(https?:\/\/)localhost(?=[:/]|$)/i, "$1127.0.0.1");
1154
+ return url;
1156
1155
  }
1157
1156
  var MAX_REDIRECTS = 5;
1158
1157
  async function nodeHttpFetch(input, init = {}, redirectCount = 0) {
@@ -1425,7 +1424,7 @@ var OllamaProvider = class extends BaseProvider {
1425
1424
  };
1426
1425
  var OpenAICompatibleProvider = class extends OpenAIProvider {
1427
1426
  constructor(config, model) {
1428
- super(config, model);
1427
+ super({ ...config, apiKey: config.apiKey ?? "not-required" }, model);
1429
1428
  this.client = new OpenAI__default.default({
1430
1429
  apiKey: config.apiKey ?? "not-required",
1431
1430
  baseURL: preferIpv4Host(config.baseUrl),
@@ -2311,10 +2310,10 @@ var CascadeRouter = class _CascadeRouter extends EventEmitter__default.default {
2311
2310
  if (availableProviders.has("ollama")) {
2312
2311
  await this.discoverOllamaModels(ollamaCfg);
2313
2312
  }
2314
- if (availableProviders.has("openai-compatible")) {
2315
- await Promise.all(
2316
- config.providers.filter((p) => p.type === "openai-compatible").map((cfg) => this.discoverOpenAICompatibleModels(cfg))
2317
- );
2313
+ const ocConfigs = config.providers.filter((p) => p.type === "openai-compatible" && p.baseUrl);
2314
+ if (ocConfigs.length > 0) {
2315
+ const results = await Promise.all(ocConfigs.map((cfg) => this.discoverOpenAICompatibleModels(cfg)));
2316
+ if (results.some(Boolean)) this.selector.markProviderAvailable("openai-compatible");
2318
2317
  }
2319
2318
  for (const tier of ["T1", "T2", "T3"]) {
2320
2319
  const override = tier === "T1" ? config.models.t1 : tier === "T2" ? config.models.t2 : config.models.t3;
@@ -2785,6 +2784,7 @@ var CascadeRouter = class _CascadeRouter extends EventEmitter__default.default {
2785
2784
  } catch {
2786
2785
  }
2787
2786
  }
2787
+ /** Returns true when at least one real model was discovered from the endpoint. */
2788
2788
  async discoverOpenAICompatibleModels(cfg) {
2789
2789
  try {
2790
2790
  const seed = {
@@ -2804,8 +2804,10 @@ var CascadeRouter = class _CascadeRouter extends EventEmitter__default.default {
2804
2804
  for (const m of models) {
2805
2805
  this.selector.addDynamicModel(m);
2806
2806
  }
2807
+ return models.length > 0;
2807
2808
  } catch (err) {
2808
2809
  console.warn("[router] OpenAI-compatible model discovery failed:", err instanceof Error ? err.message : err);
2810
+ return false;
2809
2811
  }
2810
2812
  }
2811
2813
  ensureProvider(model, configs) {