cascade-ai 0.47.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.
package/dist/index.js CHANGED
@@ -193,7 +193,7 @@ var init_audit_logger = __esm({
193
193
  });
194
194
 
195
195
  // src/constants.ts
196
- var CASCADE_VERSION = "0.47.0";
196
+ var CASCADE_VERSION = "0.48.0";
197
197
  var CASCADE_CONFIG_DIR = ".cascade";
198
198
  var CASCADE_MD_FILE = "CASCADE.md";
199
199
  var CASCADE_IGNORE_FILE = ".cascadeignore";
@@ -675,6 +675,55 @@ var BaseProvider = class {
675
675
  }
676
676
  };
677
677
 
678
+ // src/providers/model-filter.ts
679
+ var NON_CHAT_PATTERNS = [
680
+ "embed",
681
+ // text-embedding-3, nomic-embed, mxbai-embed, snowflake-arctic-embed
682
+ "(?:^|[-_/])tts(?:[-_/]|$)",
683
+ "text-to-speech",
684
+ "speech",
685
+ // text-to-speech
686
+ "whisper",
687
+ "transcrib",
688
+ "(?:^|[-_/])stt(?:[-_/]|$)",
689
+ // speech-to-text
690
+ "dall[-]?e",
691
+ "imagen",
692
+ "image-generation",
693
+ "gpt-image",
694
+ "(?:^|[-_/])image(?:[-_/]|$)",
695
+ "stable-diffusion",
696
+ "sdxl",
697
+ "flux",
698
+ // image gen
699
+ "moderation",
700
+ "(?:^|[-_/])guard(?:[-_/]|$)",
701
+ // moderation / safety
702
+ "rerank",
703
+ "(?:^|[-_/])audio(?:[-_/]|$)",
704
+ "native-audio",
705
+ "realtime",
706
+ // audio / realtime
707
+ "veo",
708
+ "sora",
709
+ "(?:^|[-_/])video(?:[-_/]|$)",
710
+ // video
711
+ "(?:^|[-_/])aqa(?:[-_/]|$)",
712
+ // attributed QA
713
+ "(?:^|[-_/])live(?:[-_/]|$)",
714
+ // live-audio variants
715
+ "(?:^|[-_/])(?:davinci|babbage)(?:[-_/]|$)"
716
+ // legacy completion-only base models
717
+ ];
718
+ var NON_CHAT = new RegExp(NON_CHAT_PATTERNS.join("|"), "i");
719
+ function isChatModel(id, methods) {
720
+ if (methods && methods.length > 0) {
721
+ const canGenerate = methods.some((m) => /generatecontent|generatemessage|chat|completion/i.test(m));
722
+ if (!canGenerate) return false;
723
+ }
724
+ return !NON_CHAT.test(id);
725
+ }
726
+
678
727
  // src/providers/anthropic.ts
679
728
  function anthropicThinkingParam(modelId, maxTokens) {
680
729
  if (!/claude-(opus|sonnet)-4/i.test(modelId)) return {};
@@ -788,7 +837,7 @@ var AnthropicProvider = class extends BaseProvider {
788
837
  if (!Array.isArray(data?.data)) {
789
838
  return Object.values(MODELS).filter((m) => m.provider === "anthropic");
790
839
  }
791
- return data.data.map((m) => {
840
+ return data.data.filter((m) => isChatModel(m.id)).map((m) => {
792
841
  const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === "anthropic");
793
842
  if (known) return known;
794
843
  return {
@@ -1003,7 +1052,7 @@ var OpenAIProvider = class extends BaseProvider {
1003
1052
  async listModels() {
1004
1053
  try {
1005
1054
  const response = await this.client.models.list();
1006
- return response.data.map((m) => {
1055
+ return response.data.filter((m) => isChatModel(m.id)).map((m) => {
1007
1056
  const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === "openai");
1008
1057
  if (known) return known;
1009
1058
  return {
@@ -1278,7 +1327,7 @@ var GeminiProvider = class extends BaseProvider {
1278
1327
  if (!Array.isArray(data?.models)) {
1279
1328
  return Object.values(MODELS).filter((m) => m.provider === "gemini");
1280
1329
  }
1281
- return data.models.map((m) => {
1330
+ return data.models.filter((m) => isChatModel(m.name.replace("models/", ""), m.supportedGenerationMethods)).map((m) => {
1282
1331
  const id = m.name.replace("models/", "");
1283
1332
  const known = Object.values(MODELS).find(
1284
1333
  (km) => km.id === id && km.provider === "gemini"
@@ -1636,10 +1685,10 @@ var OllamaProvider = class extends BaseProvider {
1636
1685
  const response = await fetch(`${this.baseUrl}/api/tags`);
1637
1686
  if (!response.ok) return [];
1638
1687
  const data = await response.json();
1639
- const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code", "nomic-embed"];
1688
+ const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code"];
1640
1689
  const entries = data.models.filter((m) => {
1641
1690
  const name = m.name.toLowerCase();
1642
- return supportedKeywords.some((k) => name.includes(k));
1691
+ return supportedKeywords.some((k) => name.includes(k)) && isChatModel(name);
1643
1692
  });
1644
1693
  const shows = await Promise.all(entries.map((m) => this.showModel(m.name)));
1645
1694
  return entries.map((m, i) => {
@@ -1759,7 +1808,8 @@ var OpenAICompatibleProvider = class extends OpenAIProvider {
1759
1808
  return typeof m === "string" ? m : void 0;
1760
1809
  }).filter((x) => typeof x === "string" && x.length > 0);
1761
1810
  if (ids.length === 0) return [this.model];
1762
- return ids.map((id) => ({
1811
+ const chatIds = ids.filter((id) => isChatModel(id));
1812
+ return (chatIds.length ? chatIds : ids).map((id) => ({
1763
1813
  id,
1764
1814
  name: id,
1765
1815
  provider: "openai-compatible",