cascade-ai 0.46.0 → 0.48.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.
@@ -222595,7 +222595,7 @@ Anthropic.Models = Models2;
222595
222595
  Anthropic.Beta = Beta;
222596
222596
 
222597
222597
  // src/constants.ts
222598
- var CASCADE_VERSION = "0.46.0";
222598
+ var CASCADE_VERSION = "0.48.0";
222599
222599
  var CASCADE_CONFIG_DIR = ".cascade";
222600
222600
  var CASCADE_MD_FILE = "CASCADE.md";
222601
222601
  var CASCADE_IGNORE_FILE = ".cascadeignore";
@@ -223077,6 +223077,55 @@ var BaseProvider = class {
223077
223077
  }
223078
223078
  };
223079
223079
 
223080
+ // src/providers/model-filter.ts
223081
+ var NON_CHAT_PATTERNS = [
223082
+ "embed",
223083
+ // text-embedding-3, nomic-embed, mxbai-embed, snowflake-arctic-embed
223084
+ "(?:^|[-_/])tts(?:[-_/]|$)",
223085
+ "text-to-speech",
223086
+ "speech",
223087
+ // text-to-speech
223088
+ "whisper",
223089
+ "transcrib",
223090
+ "(?:^|[-_/])stt(?:[-_/]|$)",
223091
+ // speech-to-text
223092
+ "dall[-]?e",
223093
+ "imagen",
223094
+ "image-generation",
223095
+ "gpt-image",
223096
+ "(?:^|[-_/])image(?:[-_/]|$)",
223097
+ "stable-diffusion",
223098
+ "sdxl",
223099
+ "flux",
223100
+ // image gen
223101
+ "moderation",
223102
+ "(?:^|[-_/])guard(?:[-_/]|$)",
223103
+ // moderation / safety
223104
+ "rerank",
223105
+ "(?:^|[-_/])audio(?:[-_/]|$)",
223106
+ "native-audio",
223107
+ "realtime",
223108
+ // audio / realtime
223109
+ "veo",
223110
+ "sora",
223111
+ "(?:^|[-_/])video(?:[-_/]|$)",
223112
+ // video
223113
+ "(?:^|[-_/])aqa(?:[-_/]|$)",
223114
+ // attributed QA
223115
+ "(?:^|[-_/])live(?:[-_/]|$)",
223116
+ // live-audio variants
223117
+ "(?:^|[-_/])(?:davinci|babbage)(?:[-_/]|$)"
223118
+ // legacy completion-only base models
223119
+ ];
223120
+ var NON_CHAT = new RegExp(NON_CHAT_PATTERNS.join("|"), "i");
223121
+ function isChatModel(id, methods) {
223122
+ if (methods && methods.length > 0) {
223123
+ const canGenerate = methods.some((m3) => /generatecontent|generatemessage|chat|completion/i.test(m3));
223124
+ if (!canGenerate) return false;
223125
+ }
223126
+ return !NON_CHAT.test(id);
223127
+ }
223128
+
223080
223129
  // src/providers/anthropic.ts
223081
223130
  function anthropicThinkingParam(modelId, maxTokens) {
223082
223131
  if (!/claude-(opus|sonnet)-4/i.test(modelId)) return {};
@@ -223190,7 +223239,7 @@ var AnthropicProvider = class extends BaseProvider {
223190
223239
  if (!Array.isArray(data?.data)) {
223191
223240
  return Object.values(MODELS).filter((m3) => m3.provider === "anthropic");
223192
223241
  }
223193
- return data.data.map((m3) => {
223242
+ return data.data.filter((m3) => isChatModel(m3.id)).map((m3) => {
223194
223243
  const known = Object.values(MODELS).find((km) => km.id === m3.id && km.provider === "anthropic");
223195
223244
  if (known) return known;
223196
223245
  return {
@@ -231278,7 +231327,7 @@ var OpenAIProvider = class extends BaseProvider {
231278
231327
  async listModels() {
231279
231328
  try {
231280
231329
  const response = await this.client.models.list();
231281
- return response.data.map((m3) => {
231330
+ return response.data.filter((m3) => isChatModel(m3.id)).map((m3) => {
231282
231331
  const known = Object.values(MODELS).find((km) => km.id === m3.id && km.provider === "openai");
231283
231332
  if (known) return known;
231284
231333
  return {
@@ -249583,7 +249632,7 @@ var GeminiProvider = class extends BaseProvider {
249583
249632
  if (!Array.isArray(data?.models)) {
249584
249633
  return Object.values(MODELS).filter((m3) => m3.provider === "gemini");
249585
249634
  }
249586
- return data.models.map((m3) => {
249635
+ return data.models.filter((m3) => isChatModel(m3.name.replace("models/", ""), m3.supportedGenerationMethods)).map((m3) => {
249587
249636
  const id = m3.name.replace("models/", "");
249588
249637
  const known = Object.values(MODELS).find(
249589
249638
  (km) => km.id === id && km.provider === "gemini"
@@ -249941,10 +249990,10 @@ var OllamaProvider = class extends BaseProvider {
249941
249990
  const response = await fetch(`${this.baseUrl}/api/tags`);
249942
249991
  if (!response.ok) return [];
249943
249992
  const data = await response.json();
249944
- const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code", "nomic-embed"];
249993
+ const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code"];
249945
249994
  const entries = data.models.filter((m3) => {
249946
249995
  const name = m3.name.toLowerCase();
249947
- return supportedKeywords.some((k4) => name.includes(k4));
249996
+ return supportedKeywords.some((k4) => name.includes(k4)) && isChatModel(name);
249948
249997
  });
249949
249998
  const shows = await Promise.all(entries.map((m3) => this.showModel(m3.name)));
249950
249999
  return entries.map((m3, i4) => {
@@ -250066,7 +250115,8 @@ var OpenAICompatibleProvider = class extends OpenAIProvider {
250066
250115
  return typeof m3 === "string" ? m3 : void 0;
250067
250116
  }).filter((x5) => typeof x5 === "string" && x5.length > 0);
250068
250117
  if (ids.length === 0) return [this.model];
250069
- return ids.map((id) => ({
250118
+ const chatIds = ids.filter((id) => isChatModel(id));
250119
+ return (chatIds.length ? chatIds : ids).map((id) => ({
250070
250120
  id,
250071
250121
  name: id,
250072
250122
  provider: "openai-compatible",
@@ -305184,7 +305234,7 @@ function clearCloudSession(dir = globalDir()) {
305184
305234
  }
305185
305235
 
305186
305236
  // src/cloud/client.ts
305187
- var DEFAULT_CLOUD_URL = "https://app.cascadeai.in";
305237
+ var DEFAULT_CLOUD_URL = "https://cascadeai.in";
305188
305238
  var REFRESH_MARGIN_MS = 6e4;
305189
305239
  var FileCloudSessionStore = class {
305190
305240
  constructor(dir) {
package/dist/index.cjs CHANGED
@@ -239,7 +239,7 @@ var init_audit_logger = __esm({
239
239
  });
240
240
 
241
241
  // src/constants.ts
242
- var CASCADE_VERSION = "0.46.0";
242
+ var CASCADE_VERSION = "0.48.0";
243
243
  var CASCADE_CONFIG_DIR = ".cascade";
244
244
  var CASCADE_MD_FILE = "CASCADE.md";
245
245
  var CASCADE_IGNORE_FILE = ".cascadeignore";
@@ -721,6 +721,55 @@ var BaseProvider = class {
721
721
  }
722
722
  };
723
723
 
724
+ // src/providers/model-filter.ts
725
+ var NON_CHAT_PATTERNS = [
726
+ "embed",
727
+ // text-embedding-3, nomic-embed, mxbai-embed, snowflake-arctic-embed
728
+ "(?:^|[-_/])tts(?:[-_/]|$)",
729
+ "text-to-speech",
730
+ "speech",
731
+ // text-to-speech
732
+ "whisper",
733
+ "transcrib",
734
+ "(?:^|[-_/])stt(?:[-_/]|$)",
735
+ // speech-to-text
736
+ "dall[-]?e",
737
+ "imagen",
738
+ "image-generation",
739
+ "gpt-image",
740
+ "(?:^|[-_/])image(?:[-_/]|$)",
741
+ "stable-diffusion",
742
+ "sdxl",
743
+ "flux",
744
+ // image gen
745
+ "moderation",
746
+ "(?:^|[-_/])guard(?:[-_/]|$)",
747
+ // moderation / safety
748
+ "rerank",
749
+ "(?:^|[-_/])audio(?:[-_/]|$)",
750
+ "native-audio",
751
+ "realtime",
752
+ // audio / realtime
753
+ "veo",
754
+ "sora",
755
+ "(?:^|[-_/])video(?:[-_/]|$)",
756
+ // video
757
+ "(?:^|[-_/])aqa(?:[-_/]|$)",
758
+ // attributed QA
759
+ "(?:^|[-_/])live(?:[-_/]|$)",
760
+ // live-audio variants
761
+ "(?:^|[-_/])(?:davinci|babbage)(?:[-_/]|$)"
762
+ // legacy completion-only base models
763
+ ];
764
+ var NON_CHAT = new RegExp(NON_CHAT_PATTERNS.join("|"), "i");
765
+ function isChatModel(id, methods) {
766
+ if (methods && methods.length > 0) {
767
+ const canGenerate = methods.some((m) => /generatecontent|generatemessage|chat|completion/i.test(m));
768
+ if (!canGenerate) return false;
769
+ }
770
+ return !NON_CHAT.test(id);
771
+ }
772
+
724
773
  // src/providers/anthropic.ts
725
774
  function anthropicThinkingParam(modelId, maxTokens) {
726
775
  if (!/claude-(opus|sonnet)-4/i.test(modelId)) return {};
@@ -834,7 +883,7 @@ var AnthropicProvider = class extends BaseProvider {
834
883
  if (!Array.isArray(data?.data)) {
835
884
  return Object.values(MODELS).filter((m) => m.provider === "anthropic");
836
885
  }
837
- return data.data.map((m) => {
886
+ return data.data.filter((m) => isChatModel(m.id)).map((m) => {
838
887
  const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === "anthropic");
839
888
  if (known) return known;
840
889
  return {
@@ -1049,7 +1098,7 @@ var OpenAIProvider = class extends BaseProvider {
1049
1098
  async listModels() {
1050
1099
  try {
1051
1100
  const response = await this.client.models.list();
1052
- return response.data.map((m) => {
1101
+ return response.data.filter((m) => isChatModel(m.id)).map((m) => {
1053
1102
  const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === "openai");
1054
1103
  if (known) return known;
1055
1104
  return {
@@ -1324,7 +1373,7 @@ var GeminiProvider = class extends BaseProvider {
1324
1373
  if (!Array.isArray(data?.models)) {
1325
1374
  return Object.values(MODELS).filter((m) => m.provider === "gemini");
1326
1375
  }
1327
- return data.models.map((m) => {
1376
+ return data.models.filter((m) => isChatModel(m.name.replace("models/", ""), m.supportedGenerationMethods)).map((m) => {
1328
1377
  const id = m.name.replace("models/", "");
1329
1378
  const known = Object.values(MODELS).find(
1330
1379
  (km) => km.id === id && km.provider === "gemini"
@@ -1682,10 +1731,10 @@ var OllamaProvider = class extends BaseProvider {
1682
1731
  const response = await fetch(`${this.baseUrl}/api/tags`);
1683
1732
  if (!response.ok) return [];
1684
1733
  const data = await response.json();
1685
- const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code", "nomic-embed"];
1734
+ const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code"];
1686
1735
  const entries = data.models.filter((m) => {
1687
1736
  const name = m.name.toLowerCase();
1688
- return supportedKeywords.some((k) => name.includes(k));
1737
+ return supportedKeywords.some((k) => name.includes(k)) && isChatModel(name);
1689
1738
  });
1690
1739
  const shows = await Promise.all(entries.map((m) => this.showModel(m.name)));
1691
1740
  return entries.map((m, i) => {
@@ -1805,7 +1854,8 @@ var OpenAICompatibleProvider = class extends OpenAIProvider {
1805
1854
  return typeof m === "string" ? m : void 0;
1806
1855
  }).filter((x) => typeof x === "string" && x.length > 0);
1807
1856
  if (ids.length === 0) return [this.model];
1808
- return ids.map((id) => ({
1857
+ const chatIds = ids.filter((id) => isChatModel(id));
1858
+ return (chatIds.length ? chatIds : ids).map((id) => ({
1809
1859
  id,
1810
1860
  name: id,
1811
1861
  provider: "openai-compatible",
@@ -15835,7 +15885,7 @@ function clearCloudSession(dir = globalDir()) {
15835
15885
  }
15836
15886
 
15837
15887
  // src/cloud/client.ts
15838
- var DEFAULT_CLOUD_URL = "https://app.cascadeai.in";
15888
+ var DEFAULT_CLOUD_URL = "https://cascadeai.in";
15839
15889
  var REFRESH_MARGIN_MS = 6e4;
15840
15890
  var FileCloudSessionStore = class {
15841
15891
  constructor(dir) {