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.
package/dist/cli.js CHANGED
@@ -63,7 +63,7 @@ var __export = (target, all) => {
63
63
  var CASCADE_VERSION, CASCADE_CONFIG_FILE, CASCADE_DB_FILE, CASCADE_DASHBOARD_SECRET_FILE, GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE, GLOBAL_KEYSTORE_FILE, GLOBAL_CREDENTIALS_FILE, GLOBAL_RUNTIME_DB_FILE, DEFAULT_DASHBOARD_PORT, DEFAULT_CONTEXT_LIMIT, DEFAULT_AUTO_SUMMARIZE_AT, MODELS, T1_MODEL_PRIORITY, T2_MODEL_PRIORITY, T3_MODEL_PRIORITY, VISION_MODEL_PRIORITY, COMPLEXITY_T2_COUNT, THEME_NAMES, DEFAULT_THEME, OLLAMA_BASE_URL, LM_STUDIO_BASE_URL, AZURE_BASE_URL_TEMPLATE, TOOL_NAMES, DEFAULT_APPROVAL_REQUIRED;
64
64
  var init_constants = __esm({
65
65
  "src/constants.ts"() {
66
- CASCADE_VERSION = "0.46.0";
66
+ CASCADE_VERSION = "0.48.0";
67
67
  CASCADE_CONFIG_FILE = ".cascade/config.json";
68
68
  CASCADE_DB_FILE = ".cascade/memory.db";
69
69
  CASCADE_DASHBOARD_SECRET_FILE = ".cascade/dashboard-secret";
@@ -542,6 +542,60 @@ var init_base = __esm({
542
542
  }
543
543
  });
544
544
 
545
+ // src/providers/model-filter.ts
546
+ function isChatModel(id, methods) {
547
+ if (methods && methods.length > 0) {
548
+ const canGenerate = methods.some((m) => /generatecontent|generatemessage|chat|completion/i.test(m));
549
+ if (!canGenerate) return false;
550
+ }
551
+ return !NON_CHAT.test(id);
552
+ }
553
+ var NON_CHAT_PATTERNS, NON_CHAT;
554
+ var init_model_filter = __esm({
555
+ "src/providers/model-filter.ts"() {
556
+ NON_CHAT_PATTERNS = [
557
+ "embed",
558
+ // text-embedding-3, nomic-embed, mxbai-embed, snowflake-arctic-embed
559
+ "(?:^|[-_/])tts(?:[-_/]|$)",
560
+ "text-to-speech",
561
+ "speech",
562
+ // text-to-speech
563
+ "whisper",
564
+ "transcrib",
565
+ "(?:^|[-_/])stt(?:[-_/]|$)",
566
+ // speech-to-text
567
+ "dall[-]?e",
568
+ "imagen",
569
+ "image-generation",
570
+ "gpt-image",
571
+ "(?:^|[-_/])image(?:[-_/]|$)",
572
+ "stable-diffusion",
573
+ "sdxl",
574
+ "flux",
575
+ // image gen
576
+ "moderation",
577
+ "(?:^|[-_/])guard(?:[-_/]|$)",
578
+ // moderation / safety
579
+ "rerank",
580
+ "(?:^|[-_/])audio(?:[-_/]|$)",
581
+ "native-audio",
582
+ "realtime",
583
+ // audio / realtime
584
+ "veo",
585
+ "sora",
586
+ "(?:^|[-_/])video(?:[-_/]|$)",
587
+ // video
588
+ "(?:^|[-_/])aqa(?:[-_/]|$)",
589
+ // attributed QA
590
+ "(?:^|[-_/])live(?:[-_/]|$)",
591
+ // live-audio variants
592
+ "(?:^|[-_/])(?:davinci|babbage)(?:[-_/]|$)"
593
+ // legacy completion-only base models
594
+ ];
595
+ NON_CHAT = new RegExp(NON_CHAT_PATTERNS.join("|"), "i");
596
+ }
597
+ });
598
+
545
599
  // src/providers/anthropic.ts
546
600
  var anthropic_exports = {};
547
601
  __export(anthropic_exports, {
@@ -558,6 +612,7 @@ var init_anthropic = __esm({
558
612
  "src/providers/anthropic.ts"() {
559
613
  init_constants();
560
614
  init_base();
615
+ init_model_filter();
561
616
  AnthropicProvider = class extends BaseProvider {
562
617
  client;
563
618
  constructor(config, model) {
@@ -664,7 +719,7 @@ var init_anthropic = __esm({
664
719
  if (!Array.isArray(data?.data)) {
665
720
  return Object.values(MODELS).filter((m) => m.provider === "anthropic");
666
721
  }
667
- return data.data.map((m) => {
722
+ return data.data.filter((m) => isChatModel(m.id)).map((m) => {
668
723
  const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === "anthropic");
669
724
  if (known) return known;
670
725
  return {
@@ -773,6 +828,7 @@ var init_openai = __esm({
773
828
  "src/providers/openai.ts"() {
774
829
  init_constants();
775
830
  init_base();
831
+ init_model_filter();
776
832
  OpenAIProvider = class extends BaseProvider {
777
833
  client;
778
834
  /** Once we learn (from the model id or an API error) that this deployment
@@ -894,7 +950,7 @@ var init_openai = __esm({
894
950
  async listModels() {
895
951
  try {
896
952
  const response = await this.client.models.list();
897
- return response.data.map((m) => {
953
+ return response.data.filter((m) => isChatModel(m.id)).map((m) => {
898
954
  const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === "openai");
899
955
  if (known) return known;
900
956
  return {
@@ -1102,6 +1158,7 @@ var init_gemini = __esm({
1102
1158
  "src/providers/gemini.ts"() {
1103
1159
  init_constants();
1104
1160
  init_base();
1161
+ init_model_filter();
1105
1162
  GeminiProvider = class extends BaseProvider {
1106
1163
  client;
1107
1164
  constructor(config, model) {
@@ -1195,7 +1252,7 @@ var init_gemini = __esm({
1195
1252
  if (!Array.isArray(data?.models)) {
1196
1253
  return Object.values(MODELS).filter((m) => m.provider === "gemini");
1197
1254
  }
1198
- return data.models.map((m) => {
1255
+ return data.models.filter((m) => isChatModel(m.name.replace("models/", ""), m.supportedGenerationMethods)).map((m) => {
1199
1256
  const id = m.name.replace("models/", "");
1200
1257
  const known = Object.values(MODELS).find(
1201
1258
  (km) => km.id === id && km.provider === "gemini"
@@ -1418,6 +1475,7 @@ var init_ollama = __esm({
1418
1475
  init_constants();
1419
1476
  init_net();
1420
1477
  init_base();
1478
+ init_model_filter();
1421
1479
  TOOL_CAPABLE_FAMILIES = [
1422
1480
  "llama3.1",
1423
1481
  "llama3.2",
@@ -1570,10 +1628,10 @@ var init_ollama = __esm({
1570
1628
  const response = await fetch(`${this.baseUrl}/api/tags`);
1571
1629
  if (!response.ok) return [];
1572
1630
  const data = await response.json();
1573
- const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code", "nomic-embed"];
1631
+ const supportedKeywords = ["llama3", "llama2", "gemma", "mistral", "mixtral", "qwen", "phi3", "codellama", "deepseek", "llava", "starcoder", "stable-code"];
1574
1632
  const entries = data.models.filter((m) => {
1575
1633
  const name = m.name.toLowerCase();
1576
- return supportedKeywords.some((k) => name.includes(k));
1634
+ return supportedKeywords.some((k) => name.includes(k)) && isChatModel(name);
1577
1635
  });
1578
1636
  const shows = await Promise.all(entries.map((m) => this.showModel(m.name)));
1579
1637
  return entries.map((m, i) => {
@@ -1673,6 +1731,7 @@ var OpenAICompatibleProvider;
1673
1731
  var init_openai_compatible = __esm({
1674
1732
  "src/providers/openai-compatible.ts"() {
1675
1733
  init_openai();
1734
+ init_model_filter();
1676
1735
  init_net();
1677
1736
  OpenAICompatibleProvider = class extends OpenAIProvider {
1678
1737
  constructor(config, model) {
@@ -1706,7 +1765,8 @@ var init_openai_compatible = __esm({
1706
1765
  return typeof m === "string" ? m : void 0;
1707
1766
  }).filter((x) => typeof x === "string" && x.length > 0);
1708
1767
  if (ids.length === 0) return [this.model];
1709
- return ids.map((id) => ({
1768
+ const chatIds = ids.filter((id) => isChatModel(id));
1769
+ return (chatIds.length ? chatIds : ids).map((id) => ({
1710
1770
  id,
1711
1771
  name: id,
1712
1772
  provider: "openai-compatible",
@@ -14457,7 +14517,7 @@ function clearCloudSession(dir = globalDir()) {
14457
14517
  }
14458
14518
 
14459
14519
  // src/cloud/client.ts
14460
- var DEFAULT_CLOUD_URL = "https://app.cascadeai.in";
14520
+ var DEFAULT_CLOUD_URL = "https://cascadeai.in";
14461
14521
  var REFRESH_MARGIN_MS = 6e4;
14462
14522
  var FileCloudSessionStore = class {
14463
14523
  constructor(dir) {