pi-freeflow 1.39.0 → 1.40.1
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/CHANGELOG.md +31 -0
- package/README.md +36 -36
- package/package.json +1 -1
- package/src/catalog.ts +13 -1
- package/src/health.ts +3 -0
- package/src/models.ts +152 -133
- package/src/proxy.ts +26 -9
- package/src/relay.ts +95 -15
- package/src/stream-pipe.ts +198 -31
- package/src/types.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.40.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Long streams are no longer cut at the five-minute ceiling mid-turn; a stalled relay is cut and re-fired instead.
|
|
8
|
+
|
|
9
|
+
Relay attempts carried a single deadline for the whole request. When a heavy reasoning turn ran past five minutes — big-pickle and long deepseek sessions routinely do — the deadline fired on live bytes, the proxy saw the dead stream as an upstream truncation, and silently re-fired the turn on another relay: on the screen the answer suddenly stopped and then continued as a fresh full generation, with the earlier partial content above it. The deadline now bounds only the header wait and is released the moment headers arrive, so a streaming body lives as long as bytes keep flowing — exactly like the other proxy paths that already cleared their timer on headers.
|
|
10
|
+
|
|
11
|
+
A body that stops flowing entirely is cut by a per-turn idle watchdog (120s of byte silence on a live socket is a wedged tunnel, not a thinking pause) and follows the existing one-refire truncation path, so a hung relay leg still hands the turn to a sibling instead of stalling until the host gives up.
|
|
12
|
+
|
|
13
|
+
## 1.40.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- Streaming turns now survive a relay rate limit: a 429 error frame that arrives before any tool call is held, the relay is cooled, and the same turn resumes once on a sibling relay. Pre-stream 429s still roll before any client bytes, and tool-call turns keep the authentic verdict to avoid duplicate execution.
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Reconcile the remaining free-model specs with the highest published twin values, keeping lane hard caps authoritative:
|
|
22
|
+
|
|
23
|
+
- Cat Jam now advertises its 1,048,576-token window: the endpoint refuses a 1.05M prompt with `context_length_exceeded` (max 1,048,576), and a 900,337-token needle probe recalled correctly.
|
|
24
|
+
- Nemotron 3 Ultra (both lanes) now declares the 1,000,000-token lane cap; larger prompts are refused.
|
|
25
|
+
- Nemotron 3.5 and Super now carry the highest published 235,929 output ceiling below the window.
|
|
26
|
+
- Thinking selectors now expose only the depths published by the free or paid twin's datasheet; unlisted rungs stay locked off. The 3.6/3.8 Qwens add `minimal`, the other OVH reasoning rows expose `medium`, Inkling Small adds `max`, and Exo follows its paid twin's `minimal..xhigh` union.
|
|
27
|
+
- OVH output ceilings follow the highest published twin value below the window: 235,929 for the 397B and 3.8 Qwens, 65,536 for the 9B, 3.6 and both gpt-oss models, and 32,768 for Mistral and Llama.
|
|
28
|
+
- Remove Space Bunny: the free endpoint answers `410 ModelDeprecated` and points at `minimax-m3.1-flash-free`.
|
|
29
|
+
- Declare only text and image inputs. The host catalog has no video or audio input type, so upstream video/audio/PDF support (MiMo, GLM 5.3 Flash, Nemotron Super VL, Nano Omni) is documented in the README instead of being advertised in the picker.
|
|
30
|
+
- Rate-limit rotation is now silent: a relay that answers 429 is cooled and deprioritized without a per-relay warning toast or per-relay WARN line while the pool still has a candidate. A pool-wide 429 burst alert still warns when many relays rate-limit in one minute. The rate-limit message appears only when no relay or direct fallback served the turn, including the existing 403-salvage path.
|
|
31
|
+
- Model specs refreshed against the latest upstream catalogs. Free and paid variants of the same model now share the highest published context window, output ceiling, and input modalities, so a picker entry no longer understates what the model accepts.
|
|
32
|
+
- Drop two Kilo models that stopped answering, so the picker only offers what is actually served: `nvidia/nemotron-3-super-120b-a12b:free` answers `404 Function ... Not found for account ...` from its Nvidia provider, and `thinkingmachines/inkling-small:free` answers `404 The requested model is currently unavailable`. Both verdicts reproduce from two independent egress IPs while the sibling Nvidia ids answer `200` with the same request shape. The catalog is 32 models; both ids stay on the retired list so a stale cache cannot bring them back.
|
|
33
|
+
|
|
3
34
|
## 1.39.0
|
|
4
35
|
|
|
5
36
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# pi-freeflow
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 32 free models with up to 1M context. No API keys to manage. Add your own relays to spread requests across more IPs.
|
|
4
4
|
|
|
5
5
|
Thin by design: a model list, a relay proxy, and a log. The host (`pi-ai`) handles thinking, normalization, and provider behavior.
|
|
6
6
|
|
|
@@ -16,7 +16,7 @@ Thin by design: a model list, a relay proxy, and a log. The host (`pi-ai`) handl
|
|
|
16
16
|
|
|
17
17
|
| Feature | What it does | Cost |
|
|
18
18
|
| :--- | :--- | :--- |
|
|
19
|
-
| **
|
|
19
|
+
| **32 free models** | 11 from OpenCode Zen, 11 from KiloCode Gateway, 2 from Cline, 8 from OVHcloud AI Endpoints, context windows up to 1M. Full list below. | **$0** |
|
|
20
20
|
| **Relay pool** | Route requests through your own relays: a self-hosted egress pool (many egress IPs on one small host) or Cloudflare Workers / Deno Deploy / Vercel Edge workers. Traffic spreads across the pool, or stays on one sticky relay. A relay that rate-limits, times out, or drops the connection cools down while healthy ones take its traffic. | **$0** beyond your host or platforms' free tiers |
|
|
21
21
|
| **Automatic fallback** | When every relay is cooling down, requests go direct to upstream instead of failing. | **$0** |
|
|
22
22
|
| **Short model names** | Most models have a slash-free, colon-free alias, plus an optional `:effort` suffix for thinking depth. You type `freeflow/<name>`; the two Cline models have no alias and must be typed in full. | **$0** |
|
|
@@ -54,7 +54,7 @@ omp
|
|
|
54
54
|
**OMP, one shot:**
|
|
55
55
|
```bash
|
|
56
56
|
omp -p --model freeflow/deepseek-v4.1-flash-free "build me a SaaS"
|
|
57
|
-
omp -p --model freeflow/
|
|
57
|
+
omp -p --model freeflow/longcat:high "solve this bug" # alias + thinking level
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
**Pi, interactive:**
|
|
@@ -65,7 +65,7 @@ pi
|
|
|
65
65
|
|
|
66
66
|
**Pi, one shot:**
|
|
67
67
|
```bash
|
|
68
|
-
pi -p --model freeflow/
|
|
68
|
+
pi -p --model freeflow/longcat:high "solve this bug"
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
Model IDs accept a full canonical ID, a short alias (see the tables below),
|
|
@@ -213,51 +213,51 @@ The same command set works identically in OMP and Pi:
|
|
|
213
213
|
|
|
214
214
|
---
|
|
215
215
|
|
|
216
|
-
###
|
|
216
|
+
### 32 models, one command
|
|
217
217
|
|
|
218
218
|
```bash
|
|
219
219
|
/model → freeflow → pick
|
|
220
220
|
```
|
|
221
221
|
|
|
222
|
-
Every model specification is reconciled against [models.dev](https://models.dev/), [OpenRouter](https://openrouter.ai/), and OMP's built-in catalog
|
|
223
|
-
|
|
222
|
+
Every model specification is reconciled against [models.dev](https://models.dev/), [OpenRouter](https://openrouter.ai/), and OMP's built-in catalog on 2026-10-20: a free and a non-free variant of the same model share the highest published context window, output ceiling, and input modalities across its twins. The catalog follows that published spec even where a free lane enforces a lower runtime cap; the authentic upstream error is surfaced above it. (Measured runtime caps: MiMo ~348K, GLM 5.3 Flash ~297K, Laguna S 262K.) Lane-published hard caps stay authoritative where the lane refuses above them: OVH's advertised context windows, the 1,000,000-token Nemotron 3 Ultra ceiling, and Dots3-Note's 393,216 served window (its only provider refused a 460,800 output budget on 2026-10-20).
|
|
223
|
+
|
|
224
|
+
The host catalog carries text and image inputs only. Upstream video and audio support (MiMo: audio + video; GLM 5.3 Flash: video + PDF; Nemotron Super VL and Nano Omni: video) is therefore not selectable from the picker and is not declared in `input`.
|
|
225
|
+
|
|
226
|
+
#### OpenCode Zen (11 models), Chat Completions API
|
|
224
227
|
|
|
225
228
|
Good defaults for long coding sessions and agentic work.
|
|
226
229
|
|
|
227
230
|
| Model ID | Creator / Lab | Context | Max Output | Thinking | Vision |
|
|
228
231
|
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
229
|
-
| `cat-jam-free` | Cat Jam | **
|
|
230
|
-
| `mimo-v2.6-flash-free` | Xiaomi MiMo | **1M** (1.048.576) | **
|
|
231
|
-
| `nemotron-3.5-lightning-free` | NVIDIA | **1M** (1.000.000) | **
|
|
232
|
-
| `nemotron-3.5-super-vl-free` | NVIDIA | **1M** (1.
|
|
233
|
-
| `nemotron-3-ultra-free` | NVIDIA | **1M** (1.000.000) | **
|
|
232
|
+
| `cat-jam-free` | Cat Jam | **1M** (1.048.576) | **131K** (131.072) | `low … max` | ❌ |
|
|
233
|
+
| `mimo-v2.6-flash-free` | Xiaomi MiMo | **1M** (1.048.576) | **128K** (131.072) | `minimal … xhigh`\* | ✅ |
|
|
234
|
+
| `nemotron-3.5-lightning-free` | NVIDIA | **1M** (1.000.000) | **235K** (235.929) | `minimal … xhigh` | ❌ |
|
|
235
|
+
| `nemotron-3.5-super-vl-free` | NVIDIA | **1M** (1.048.576) | **235K** (235.929) | `minimal … xhigh` | ✅ |
|
|
236
|
+
| `nemotron-3-ultra-free` | NVIDIA | **1M** (1.000.000) | **182K** (182.520) | `minimal … xhigh` | ❌ |
|
|
234
237
|
| `big-pickle` | Big Pickle | **200K** (200.000) | **32K** (32.000) | `high / max` | ❌ |
|
|
235
|
-
| `
|
|
236
|
-
| `
|
|
237
|
-
| `glm-5.3-flash-free` | Zhipu AI | **1M** (1.000.000) | **32K** (32.000) | `minimal … max` | ✅ |
|
|
238
|
+
| `longcat-2.5-preview-free` | Meituan LongCat | **1M** (1.048.576) | **131K** (131.072) | `minimal … xhigh` | ✅ |
|
|
239
|
+
| `glm-5.3-flash-free` | Zhipu AI | **1M** (1.048.576) | **131K** (131.072) | `low / high / max` | ✅ |
|
|
238
240
|
| `beam-free` | Reflection AI | **1M** (1.048.576) | **131K** (131.072) | `low … max` | ❌ |
|
|
239
|
-
| `exo-free` | Undisclosed | **1M** (1.048.576) | **131K** (131.072) | `
|
|
240
|
-
| `deepseek-v4.1-flash-free` | DeepSeek | **1M** (1.
|
|
241
|
+
| `exo-free` | Undisclosed | **1M** (1.048.576) | **131K** (131.072) | `minimal … xhigh` | ✅ |
|
|
242
|
+
| `deepseek-v4.1-flash-free` | DeepSeek | **1M** (1.048.576) | **393K** (393.216) | `low / high / max` | ✅ |
|
|
241
243
|
|
|
242
|
-
#### KiloCode Gateway (
|
|
244
|
+
#### KiloCode Gateway (11 models), OpenRouter compatible
|
|
243
245
|
|
|
244
246
|
Keyless access. Short aliases work for every row (the full ID is in parentheses).
|
|
245
247
|
|
|
246
248
|
| Model ID | Creator / Lab | Context | Max Output | Thinking | Vision |
|
|
247
249
|
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
248
|
-
| `dots-3-note-preview` (`dots-studio/...:free`) | Dots Studio | **
|
|
249
|
-
| `nemotron-3-nano-omni` (`nvidia/...:free`) | NVIDIA | **
|
|
250
|
-
| `nemotron-3-ultra-550b` (`nvidia/...:free`) | NVIDIA | **1M** (1.000.000) | **
|
|
251
|
-
| `nvidia/nemotron-3.5-lightning:free` | NVIDIA | **1M** (1.000.000) | **
|
|
252
|
-
| `nemotron-3-super` (`nvidia/...:free`) | NVIDIA | **262K** (262.144) | **262K** (262.144) | `minimal…xhigh`\* | ❌ |
|
|
250
|
+
| `dots-3-note-preview` (`dots-studio/...:free`) | Dots Studio | **384K** (393.216) | **256K** (262.144) | `minimal…xhigh`\* | ✅ |
|
|
251
|
+
| `nemotron-3-nano-omni` (`nvidia/...:free`) | NVIDIA | **262K** (262.144) | **65K** (65.536) | `minimal…xhigh`\* | ✅ |
|
|
252
|
+
| `nemotron-3-ultra-550b` (`nvidia/...:free`) | NVIDIA | **1M** (1.000.000) | **182K** (182.520) | `minimal…xhigh`\* | ❌ |
|
|
253
|
+
| `nvidia/nemotron-3.5-lightning:free` | NVIDIA | **1M** (1.000.000) | **235K** (235.929) | `minimal…xhigh`\* | ❌ |
|
|
253
254
|
| `north-mini-code` (`cohere/...:free`) | Cohere | **256K** (256.000) | **64K** (64.000) | `minimal…xhigh`\* | ❌ |
|
|
254
|
-
| `laguna-s-2.1:free` (`poolside/...:free`) | Poolside | **
|
|
255
|
+
| `laguna-s-2.1:free` (`poolside/...:free`) | Poolside | **1M** (1.048.576) | **131K** (131.072) | `minimal…xhigh`\* | ❌ |
|
|
255
256
|
| `laguna-xs-2.1:free` (`poolside/...:free`) | Poolside | **262K** (262.144) | **32K** (32.768) | `minimal…xhigh`\* | ❌ |
|
|
256
|
-
| `lfm-2.5` (`liquid/lfm-2.5-2.6b:free`) | Liquid AI | **
|
|
257
|
+
| `lfm-2.5` (`liquid/lfm-2.5-2.6b:free`) | Liquid AI | **128K** (128.000) | **32K** (32.768) | `minimal…xhigh`\* | ❌ |
|
|
257
258
|
| `kilo-auto` (`kilo-auto/free`) | Kilo Gateway Auto | **256K** (256.000) | **10K** (10.000) | `minimal…xhigh`\* | ❌ |
|
|
258
259
|
| `openrouter` (`openrouter/free`) | OpenRouter Free | **200K** (200.000) | **65K** (65.536) | `minimal…xhigh`\* | ✅ |
|
|
259
260
|
| `glyph-cluster` (`stealth/glyph-cluster`) | Stealth preview (lab undisclosed) | **256K** (256.000) | **256K** (256.000) | `minimal…xhigh`\* | ❌ |
|
|
260
|
-
| `inkling-small` (`thinkingmachines/inkling-small:free`) | Thinking Machines | **1M** (1.048.576) | **262K** (262.144) | `minimal…xhigh`\* | ✅ |
|
|
261
261
|
|
|
262
262
|
\* Levels are forwarded as-is through the OpenRouter-style nested `reasoning` parameter; effort mapping is decided by each model. MiMo collapses `minimal→low` and `xhigh→high` upstream, so its selector shows 5 labels but only 3 distinct effort values.
|
|
263
263
|
|
|
@@ -277,19 +277,19 @@ Each account can only be saved once: an extra login for an account you already h
|
|
|
277
277
|
|
|
278
278
|
Anonymous access — no account, no key, nothing to sign in to. Direct only (never through the relay pool), because OVH has no per-IP gate for relays to route around. OVH rate-limits anonymous callers per IP, so a burst of parallel subagents can hit `429 API rate limit exceeded`; the model list itself never costs anything.
|
|
279
279
|
|
|
280
|
-
Pick them with the slash-free short name (the full ID is in parentheses).
|
|
280
|
+
Pick them with the slash-free short name (the full ID is in parentheses). The lane's rows publish `low`/`medium`/`high`; the 3.6 and 3.8 Qwens add `minimal`, and nothing on this lane offers `xhigh`/`max`.
|
|
281
281
|
All eight talk the normal chat API. Hosts that prefer the responses API work too — the proxy maps that shape to chat and maps the answer back, so tool calls and streamed output behave exactly as they do on the other providers.
|
|
282
282
|
|
|
283
283
|
| Model ID | Creator / Lab | Context | Max Output | Thinking | Vision |
|
|
284
284
|
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
285
|
-
| `gpt-oss-120b` (`ovh-free/gpt-oss-120b`) | OpenAI | **128K** (131.072) | **
|
|
286
|
-
| `gpt-oss-20b` (`ovh-free/gpt-oss-20b`) | OpenAI | **128K** (131.072) | **
|
|
287
|
-
| `qwen3.5-397b` (`ovh-free/Qwen3.5-397B-A17B`) | Alibaba Qwen | **256K** (262.144) | **
|
|
288
|
-
| `qwen3.5-9b` (`ovh-free/Qwen3.5-9B`) | Alibaba Qwen | **256K** (262.144) | **
|
|
289
|
-
| `qwen3.6-27b` (`ovh-free/Qwen3.6-27B`) | Alibaba Qwen | **256K** (262.144) | **
|
|
290
|
-
| `qwen3.8-27b` (`ovh-free/Qwen3.8-27B`) | Alibaba Qwen | **256K** (262.144) | **
|
|
291
|
-
| `mistral-small-3.2` (`ovh-free/Mistral-Small-3.2-24B-Instruct-2506`) | Mistral AI | **128K** (131.072) | **
|
|
292
|
-
| `llama-3.3-70b` (`ovh-free/Meta-Llama-3_3-70B-Instruct`) | Meta | **128K** (131.072) | **
|
|
285
|
+
| `gpt-oss-120b` (`ovh-free/gpt-oss-120b`) | OpenAI | **128K** (131.072) | **65K** (65.536) | `low/medium/high` | ❌ |
|
|
286
|
+
| `gpt-oss-20b` (`ovh-free/gpt-oss-20b`) | OpenAI | **128K** (131.072) | **65K** (65.536) | `low/medium/high` | ❌ |
|
|
287
|
+
| `qwen3.5-397b` (`ovh-free/Qwen3.5-397B-A17B`) | Alibaba Qwen | **256K** (262.144) | **235K** (235.929) | `low/medium/high` | ✅ |
|
|
288
|
+
| `qwen3.5-9b` (`ovh-free/Qwen3.5-9B`) | Alibaba Qwen | **256K** (262.144) | **65K** (65.536) | `low/medium/high` | ✅ |
|
|
289
|
+
| `qwen3.6-27b` (`ovh-free/Qwen3.6-27B`) | Alibaba Qwen | **256K** (262.144) | **65K** (65.536) | `minimal … high` | ✅ |
|
|
290
|
+
| `qwen3.8-27b` (`ovh-free/Qwen3.8-27B`) | Alibaba Qwen | **256K** (262.144) | **235K** (235.929) | `minimal … high` | ✅ |
|
|
291
|
+
| `mistral-small-3.2` (`ovh-free/Mistral-Small-3.2-24B-Instruct-2506`) | Mistral AI | **128K** (131.072) | **32K** (32.768) | ❌ | ✅ |
|
|
292
|
+
| `llama-3.3-70b` (`ovh-free/Meta-Llama-3_3-70B-Instruct`) | Meta | **128K** (131.072) | **32K** (32.768) | ❌ | ❌ |
|
|
293
293
|
|
|
294
294
|
---
|
|
295
295
|
|
|
@@ -382,7 +382,7 @@ pnpm smoke # verifies extensions/index.ts loads without crashing
|
|
|
382
382
|
#### Project structure
|
|
383
383
|
|
|
384
384
|
```
|
|
385
|
-
├── models.ts #
|
|
385
|
+
├── models.ts # 32-model catalog definitions
|
|
386
386
|
├── index.ts # extension entry, lifecycle hooks
|
|
387
387
|
├── catalog.ts # model catalog cache (24h disk)
|
|
388
388
|
├── proxy.ts # local proxy server (127.0.0.1:28180)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-freeflow",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.40.1",
|
|
5
5
|
"description": "Thin provider for OMP/Pi — model list + dumb relay proxy + log; host pi-ai owns thinking/normalization",
|
|
6
6
|
"main": "extensions/index.ts",
|
|
7
7
|
"types": "src/index.ts",
|
package/src/catalog.ts
CHANGED
|
@@ -101,6 +101,9 @@ export const DEAD_MODEL_IDS = new Set<string>([
|
|
|
101
101
|
"inclusionai/ling-3.0-flash-fin:free",
|
|
102
102
|
"mimo-v2.5-free",
|
|
103
103
|
"stealth/space-bunny-alpha",
|
|
104
|
+
// space-bunny-free: deprecated on the Zen free tier (2026-10-20) — the
|
|
105
|
+
// endpoint answers 410 ModelDeprecated and points at minimax-m3.1-flash-free.
|
|
106
|
+
"space-bunny-free",
|
|
104
107
|
"qwen/qwen3.8-27b:free",
|
|
105
108
|
"nvidia/nemotron-3.5-content-safety:free",
|
|
106
109
|
"fledge-alpha-free",
|
|
@@ -135,6 +138,15 @@ export const DEAD_MODEL_IDS = new Set<string>([
|
|
|
135
138
|
// same request shape on the surviving Zen models answers 200. Retired from the
|
|
136
139
|
// static catalog the same day; the Cline Muse Spark 1.3 entry is unaffected.
|
|
137
140
|
"muse-spark-1.2-contributor-free",
|
|
141
|
+
// nvidia/nemotron-3-super-120b-a12b:free: dead route (2026-10-21) — Kilo answers
|
|
142
|
+
// 404 "Function '<uuid>': Not found for account ..." from its Nvidia provider on
|
|
143
|
+
// every attempt, from two independent egress IPs, while sibling Nvidia ids answer
|
|
144
|
+
// 200 with the same request shape.
|
|
145
|
+
"nvidia/nemotron-3-super-120b-a12b:free",
|
|
146
|
+
// thinkingmachines/inkling-small:free: gone upstream (2026-10-21) — Kilo answers
|
|
147
|
+
// HTTP 404 "The requested model is currently unavailable" (unavailable_model) on
|
|
148
|
+
// every attempt, from two independent egress IPs; it is no longer served.
|
|
149
|
+
"thinkingmachines/inkling-small:free",
|
|
138
150
|
]);
|
|
139
151
|
/**
|
|
140
152
|
* Free-tier allowlist for anything entering the picker via network or stale disk.
|
|
@@ -174,7 +186,7 @@ export function sanitizeCatalogModels(models: RegisteredModel[]): RegisteredMode
|
|
|
174
186
|
}
|
|
175
187
|
/**
|
|
176
188
|
* In-memory cache of currently active/available free models.
|
|
177
|
-
* Initialized with all
|
|
189
|
+
* Initialized with all 32 verified models for 0ms instant availability.
|
|
178
190
|
*/
|
|
179
191
|
let aliveCatalog: RegisteredModel[] = ALL_MODELS.map((m) => ({
|
|
180
192
|
...m,
|
package/src/health.ts
CHANGED
|
@@ -47,6 +47,8 @@ interface HealthData {
|
|
|
47
47
|
lastBytesAt: number;
|
|
48
48
|
/** Mid-stream turns the upstream model itself failed (model fault, never a relay fault). */
|
|
49
49
|
midStreamModelFaults: number;
|
|
50
|
+
/** Mid-stream turns held on a retriable rate-limit frame (whether or not the rescue served). */
|
|
51
|
+
midStreamRateLimitFaults: number;
|
|
50
52
|
/** Mid-stream turns cut by the relay/transport (relay fault, rotated away from). */
|
|
51
53
|
midStreamRelayTruncations: number;
|
|
52
54
|
}
|
|
@@ -104,6 +106,7 @@ export function getHealthData(portOverride?: number, activeRequests = 0): Health
|
|
|
104
106
|
sseDegraded: sse.degraded,
|
|
105
107
|
lastBytesAt: getLastForwardedByteAt(),
|
|
106
108
|
midStreamModelFaults: midStreamFaults.modelFaults,
|
|
109
|
+
midStreamRateLimitFaults: midStreamFaults.rateLimitFaults,
|
|
107
110
|
midStreamRelayTruncations: midStreamFaults.relayTruncations,
|
|
108
111
|
};
|
|
109
112
|
}
|