cascade-ai 0.69.0 → 0.70.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/README.md CHANGED
@@ -43,6 +43,8 @@ Other AI CLIs run a single agent. Cascade runs a visible **organization** — an
43
43
  - [Features](#features)
44
44
  - [Installation](#installation)
45
45
  - [Quick Start](#quick-start)
46
+ - [Self-host](#self-host)
47
+ - [OpenAI-compatible API](#openai-compatible-api)
46
48
  - [Configuration](#configuration)
47
49
  - [AI Providers](#ai-providers)
48
50
  - [Tools](#tools)
@@ -246,6 +248,39 @@ See the [Dockerfile](Dockerfile) and [docker-compose.yml](docker-compose.yml) fo
246
248
 
247
249
  ---
248
250
 
251
+ ## OpenAI-compatible API
252
+
253
+ Anything that already talks to OpenAI can talk to Cascade. Point the client's `base_url` at your server's `/v1` and use a Cascade access token as the API key — `POST /v1/chat/completions` and `GET /v1/models` work with the official SDKs, streaming and not.
254
+
255
+ ```python
256
+ from openai import OpenAI
257
+
258
+ client = OpenAI(api_key=CASCADE_ACCESS_TOKEN, base_url="http://localhost:8787/v1")
259
+
260
+ reply = client.chat.completions.create(
261
+ model="cascade", # a routing mode, not a model
262
+ messages=[{"role": "user", "content": "Compare Postgres and SQLite for a CLI tool."}],
263
+ )
264
+ print(reply.choices[0].message.content)
265
+ print(reply.cascade) # which tier + model actually served it, and what routing saved
266
+ ```
267
+
268
+ `model` names a **routing mode**, because Cascade picks a model per subtask — that is the product:
269
+
270
+ | `model` | what runs |
271
+ | --- | --- |
272
+ | `cascade` | full orchestration, balanced quality against cost |
273
+ | `cascade-fast` | one mid-tier model, no orchestration |
274
+ | `cascade-quality` | full orchestration, biased to quality |
275
+
276
+ Anything else returns `404 model_not_found` rather than quietly running something you didn't ask for. Unsupported parameters (`n > 1`, `logprobs`, `tools`, `response_format`, …) are **rejected**, not ignored — a silently dropped parameter returns a response that looks successful and is wrong. `temperature` and `max_tokens` are honoured, applied across tiers.
277
+
278
+ **Provider keys.** On a **single-account** instance — a self-host, where the operator and the caller are the same person — the endpoint uses the provider keys in your `.env` (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, …; the same names the CLI reads). The moment a second account exists this stops automatically, because the operator's key would otherwise pay for everyone else's runs. Any instance can also take keys per request via the SDK's `extra_body={"providers": [...]}`.
279
+
280
+ `/v1` is for server-side clients: `Authorization` is not allowed cross-origin, so a browser-side SDK is deliberately not served. Tools/function calling and image inputs are not in v1 — Cascade's tools run server-side, and attachments go through `POST /api/uploads`.
281
+
282
+ ---
283
+
249
284
  ## Configuration
250
285
 
251
286
  Cascade loads config from `.cascade/config.json` in your project directory.
package/dist/cli.cjs CHANGED
@@ -1810,7 +1810,7 @@ var CASCADE_VERSION, CASCADE_CONFIG_FILE, CASCADE_DB_FILE, CASCADE_DASHBOARD_SEC
1810
1810
  var init_constants = __esm({
1811
1811
  "src/constants.ts"() {
1812
1812
  init_pricing();
1813
- CASCADE_VERSION = "0.69.0";
1813
+ CASCADE_VERSION = "0.70.0";
1814
1814
  CASCADE_CONFIG_FILE = ".cascade/config.json";
1815
1815
  CASCADE_DB_FILE = ".cascade/memory.db";
1816
1816
  CASCADE_DASHBOARD_SECRET_FILE = ".cascade/dashboard-secret";
package/dist/cli.js CHANGED
@@ -1757,7 +1757,7 @@ var CASCADE_VERSION, CASCADE_CONFIG_FILE, CASCADE_DB_FILE, CASCADE_DASHBOARD_SEC
1757
1757
  var init_constants = __esm({
1758
1758
  "src/constants.ts"() {
1759
1759
  init_pricing();
1760
- CASCADE_VERSION = "0.69.0";
1760
+ CASCADE_VERSION = "0.70.0";
1761
1761
  CASCADE_CONFIG_FILE = ".cascade/config.json";
1762
1762
  CASCADE_DB_FILE = ".cascade/memory.db";
1763
1763
  CASCADE_DASHBOARD_SECRET_FILE = ".cascade/dashboard-secret";
@@ -291781,7 +291781,7 @@ function reconcilePrice(model, live) {
291781
291781
  }
291782
291782
 
291783
291783
  // src/constants.ts
291784
- var CASCADE_VERSION = "0.69.0";
291784
+ var CASCADE_VERSION = "0.70.0";
291785
291785
  var CASCADE_CONFIG_DIR = ".cascade";
291786
291786
  var CASCADE_MD_FILE = "CASCADE.md";
291787
291787
  var CASCADE_IGNORE_FILE = ".cascadeignore";
package/dist/index.cjs CHANGED
@@ -1908,7 +1908,7 @@ function reconcilePrice(model, live) {
1908
1908
  }
1909
1909
 
1910
1910
  // src/constants.ts
1911
- var CASCADE_VERSION = "0.69.0";
1911
+ var CASCADE_VERSION = "0.70.0";
1912
1912
  var CASCADE_CONFIG_DIR = ".cascade";
1913
1913
  var CASCADE_MD_FILE = "CASCADE.md";
1914
1914
  var CASCADE_IGNORE_FILE = ".cascadeignore";
package/dist/index.js CHANGED
@@ -1862,7 +1862,7 @@ function reconcilePrice(model, live) {
1862
1862
  }
1863
1863
 
1864
1864
  // src/constants.ts
1865
- var CASCADE_VERSION = "0.69.0";
1865
+ var CASCADE_VERSION = "0.70.0";
1866
1866
  var CASCADE_CONFIG_DIR = ".cascade";
1867
1867
  var CASCADE_MD_FILE = "CASCADE.md";
1868
1868
  var CASCADE_IGNORE_FILE = ".cascadeignore";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cascade-ai",
3
- "version": "0.69.0",
3
+ "version": "0.70.0",
4
4
  "description": "Multi-tier AI orchestration CLI — T1/T2/T3 hierarchical agent system",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",