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 +35 -0
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/desktop-core.cjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
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.
|
|
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.
|
|
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";
|
package/dist/desktop-core.cjs
CHANGED
|
@@ -291781,7 +291781,7 @@ function reconcilePrice(model, live) {
|
|
|
291781
291781
|
}
|
|
291782
291782
|
|
|
291783
291783
|
// src/constants.ts
|
|
291784
|
-
var CASCADE_VERSION = "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.
|
|
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.
|
|
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";
|