pi-freeflow 1.38.1 → 1.38.2

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.38.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Add Exo to the OpenCode free tier — a live preview model with chat, tools, reasoning, and image input that the official free lineup lists.
8
+ - Add GLM-5.3 Flash and LL Alpha to the OpenCode free tier, and retire Step 5 Preview — it is gone from the Zen lineup and demoted to paid on the Kilo lane, so those entries can no longer be selected.
9
+
3
10
  ## 1.38.1
4
11
 
5
12
  ### Patch Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pi-freeflow
2
2
 
3
- > 36 free models with up to 1M context. No API keys to manage. Add your own relays to spread requests across more IPs.
3
+ > 37 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
- | **36 free models** | 12 from OpenCode Zen, 14 from KiloCode Gateway, 2 from Cline, 8 from OVHcloud AI Endpoints, context windows up to 1M. Full list below. | **$0** |
19
+ | **37 free models** | 14 from OpenCode Zen, 13 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 Cloudflare Workers, Deno Deploy, and Vercel Edge relays. 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 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** |
@@ -197,14 +197,14 @@ The same command set works identically in OMP and Pi:
197
197
 
198
198
  ---
199
199
 
200
- ### 36 models, one command
200
+ ### 37 models, one command
201
201
 
202
202
  ```bash
203
203
  /model → freeflow → pick
204
204
  ```
205
205
 
206
206
  Every model specification is reconciled against [models.dev](https://models.dev/), [OpenRouter](https://openrouter.ai/), and OMP's built-in catalog, configured with the highest verified context, output ceiling, and reasoning capabilities across twin models.
207
- #### OpenCode Zen (12 models), Responses and Chat API
207
+ #### OpenCode Zen (14 models), Responses and Chat API
208
208
 
209
209
  Good defaults for long coding sessions and agentic work.
210
210
 
@@ -220,10 +220,12 @@ Good defaults for long coding sessions and agentic work.
220
220
  | `big-pickle` | Big Pickle | **200K** (200.000) | **32K** (32.000) | `high / max` | ❌ |
221
221
  | `space-bunny-free` | Stealth preview (lab undisclosed) | **1M** (1.048.576) | **512K** (524.288) | `low … max` | ✅ |
222
222
  | `longcat-2.5-preview-free` | Meituan LongCat | **1M** (1.000.000) | **131K** (131.072) | `minimal … max` | ✅ |
223
- | `step-5-preview-free` | StepFun | **1M** (1.000.000) | **64K** (65.536) | `low … high` | ✅ |
223
+ | `glm-5.3-flash-free` | Zhipu AI | **1M** (1.000.000) | **32K** (32.000) | `minimal … max` | ✅ |
224
+ | `ll-alpha-free` | Undisclosed | **262K** (262.144) | **64K** (65.536) | `low … max` | ❌ |
225
+ | `exo-free` | Undisclosed | **1M** (1.048.576) | **131K** (131.072) | `high` | ✅ |
224
226
  | `deepseek-v4.1-flash-free` | DeepSeek | **1M** (1.000.000) | **384K** (384.000) | `minimal … max` | ✅ |
225
227
 
226
- #### KiloCode Gateway (14 models), OpenRouter compatible
228
+ #### KiloCode Gateway (13 models), OpenRouter compatible
227
229
 
228
230
  Keyless access. Short aliases work for every row (the full ID is in parentheses).
229
231
 
@@ -241,7 +243,6 @@ Keyless access. Short aliases work for every row (the full ID is in parentheses)
241
243
  | `kilo-auto` (`kilo-auto/free`) | Kilo Gateway Auto | **256K** (256.000) | **10K** (10.000) | `minimal…xhigh`\* | ❌ |
242
244
  | `openrouter` (`openrouter/free`) | OpenRouter Free | **200K** (200.000) | **65K** (65.536) | `minimal…xhigh`\* | ✅ |
243
245
  | `glyph-cluster` (`stealth/glyph-cluster`) | Stealth preview (lab undisclosed) | **256K** (256.000) | **256K** (256.000) | `minimal…xhigh`\* | ❌ |
244
- | `step-5-preview:kilo` (`stepfun/...:free`) | StepFun | **1M** (1.000.000) | **64K** (65.536) | `minimal…xhigh`\* | ✅ |
245
246
  | `inkling-small` (`thinkingmachines/inkling-small:free`) | Thinking Machines | **1M** (1.048.576) | **262K** (262.144) | `minimal…xhigh`\* | ✅ |
246
247
 
247
248
  \* 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.
@@ -367,7 +368,7 @@ pnpm smoke # verifies extensions/index.ts loads without crashing
367
368
  #### Project structure
368
369
 
369
370
  ```
370
- ├── models.ts # 36-model catalog definitions
371
+ ├── models.ts # 37-model catalog definitions
371
372
  ├── index.ts # extension entry, lifecycle hooks
372
373
  ├── catalog.ts # model catalog cache (24h disk)
373
374
  ├── 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.38.1",
4
+ "version": "1.38.2",
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
@@ -43,8 +43,14 @@ import type {
43
43
  * - inclusionai/ling-3.0-flash-fin:free: gone from Kilo (2026-10-01) — keyless chat 404
44
44
  * "The requested model ... does not exist".
45
45
  * - mimo-v2.5-free: decommissioned upstream (2026-10-07) — HTTP 401 "Model mimo-v2.5-free is not supported".
46
- * - exo-free: deprecated upstream (2026-10-09) — HTTP 410 "Model exo-free has
47
- * been deprecated." (was 503 "Endpoint is unavailable" on 2026-10-07).
46
+ * Re-probed 2026-10-16: 410 "Model mimo-v2.5-free has been deprecated. Use
47
+ * mimo-v2.6-flash-free instead." The docs still list it as free; they are stale.
48
+ * - exo-free: dead-listed 2026-10-09 (410 "Model exo-free has been deprecated")
49
+ * but revived upstream on 2026-10-16 — back on the official free lineup and
50
+ * answering live through the proxy (chat 200 with tools, stream, reasoning,
51
+ * vision; dual-canary recall at ~520K tokens; a 1.2M-word prompt draws the
52
+ * empty-bodied 400). Re-registered statically the same day: do NOT add this
53
+ * id back to this set unless it dies again.
48
54
  * - fledge-alpha-free: withdrawn upstream (2026-10-09) — absent from the live
49
55
  * Zen list, chat 401 "Model fledge-alpha-free is not supported".
50
56
  * - inclusionai/ling-3.0-flash-sante:free: demoted to paid on Kilo (2026-10-09) —
@@ -94,7 +100,6 @@ export const DEAD_MODEL_IDS = new Set<string>([
94
100
  "ling-3.0-flash-fin-free",
95
101
  "inclusionai/ling-3.0-flash-fin:free",
96
102
  "mimo-v2.5-free",
97
- "exo-free",
98
103
  "stealth/space-bunny-alpha",
99
104
  "qwen/qwen3.8-27b:free",
100
105
  "nvidia/nemotron-3.5-content-safety:free",
@@ -110,6 +115,15 @@ export const DEAD_MODEL_IDS = new Set<string>([
110
115
  "inclusionai/ling-3.1-flash",
111
116
  // ovh-free/Mistral-7B-Instruct-v0.3: removed upstream by OVH (2026-10-15) — answers 404 no route matched.
112
117
  "ovh-free/Mistral-7B-Instruct-v0.3",
118
+ // step-5-preview-free: removed from the Zen free docs (2026-10-16 drift,
119
+ // v1.19.2) and the endpoint answers 400 "Model is unavailable" on both the
120
+ // chat and the responses shape — the same retirement signature as
121
+ // deepseek-v4-flash-free.
122
+ "step-5-preview-free",
123
+ // stepfun/step-5-preview-free: demoted to paid on Kilo (2026-10-16) —
124
+ // answers 401 PAID_MODEL_AUTH_REQUIRED while the sibling z-ai/glm-5.3-flash
125
+ // answers 200 keyless with the same request shape.
126
+ "stepfun/step-5-preview-free",
113
127
  ]);
114
128
  /**
115
129
  * Free-tier allowlist for anything entering the picker via network or stale disk.
@@ -149,7 +163,7 @@ export function sanitizeCatalogModels(models: RegisteredModel[]): RegisteredMode
149
163
  }
150
164
  /**
151
165
  * In-memory cache of currently active/available free models.
152
- * Initialized with all 36 verified models for 0ms instant availability.
166
+ * Initialized with all 37 verified models for 0ms instant availability.
153
167
  */
154
168
  let aliveCatalog: RegisteredModel[] = ALL_MODELS.map((m) => ({
155
169
  ...m,
package/src/models.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Static model definitions and upstream routing catalogs for pi-freeflow
3
3
  *
4
- * Defines the 36 verified free models (live-verified 2026-10-16):
5
- * - 12 OpenCode Zen models (2 Responses API + 10 Chat Completions)
6
- * - 14 KiloCode Keyless Gateway models (OpenRouter format)
4
+ * Defines the 37 verified free models (live-verified 2026-10-16):
5
+ * - 14 OpenCode Zen models (2 Responses API + 12 Chat Completions)
6
+ * - 13 KiloCode Keyless Gateway models (OpenRouter format)
7
7
  * - 2 Cline direct-only models (per-user pool)
8
8
  * - 8 OVHcloud AI Endpoints models (keyless, direct-only)
9
9
  */
@@ -216,30 +216,100 @@ export const OPENCODE_MODELS: ModelDef[] = [
216
216
  },
217
217
  },
218
218
  {
219
- // Added 2026-10-09: replaces fledge-alpha-free (withdrawn upstream —
220
- // absent from the live list, chat 401 "not supported"). Live on the Zen
221
- // list; gated-lane 403 matches the working models from a refused egress,
222
- // so it rides the same fingerprint path. Specs per models.dev
223
- // (opencode/step-5-preview-free) + StepFun docs, NOT the enrichModelDef
224
- // substring heuristic (which yields reasoning:false / 262K / text-only):
225
- // 1M ctx, 64K max output, text+image+video, efforts low/medium/high only.
226
- // minimal is explicitly null (omitting the key leaves it selectable in
227
- // the host); xhigh/max are unsupported upstream.
228
- id: "step-5-preview-free",
229
- name: "Step 5 Preview [OpenCode]",
230
- reasoning: true,
231
- contextWindow: 1_000_000,
232
- maxTokens: 65_536,
233
- input: ["text", "image", "video"],
234
- thinkingLevelMap: {
235
- off: null,
236
- minimal: null,
237
- low: "low",
238
- medium: "medium",
239
- high: "high",
240
- xhigh: null,
241
- max: null,
219
+ // Added 2026-10-16 (issue #71 drift): Zen v1.19.2 added this free id;
220
+ // served through the fingerprint path (chat 200 with tools + stream).
221
+ // Not published on pi.dev yet, and models.dev's 200,000 context is
222
+ // contradicted by probe: a marker planted at 90% depth (~250K words) is
223
+ // recalled, and only above ~1M words does the gateway refuse with
224
+ // context_length_exceeded. Declared 1,000,000 like its Zen siblings and
225
+ // the Kilo twin (z-ai/glm-5.3-flash, 1,048,576 in this catalog); the
226
+ // 450K/700K-word recall probes timed out upstream and stayed inconclusive.
227
+ // maxTokens 32,000 per models.dev — the gateway accepted up to 131,072,
228
+ // and acceptance is not a cap, so the published figure stays the budget.
229
+ // Effort ladder probed level-by-level 2026-10-16: minimal/low/medium/high/
230
+ // xhigh/max all answer 200 (an unsupported value answers 400
231
+ // [invalid_value], so the gateway validates per model), and minimal vs max
232
+ // visibly changes reasoning length. Chat is the only native shape
233
+ // (/v1/responses answers 400 "Model does not support this protocol"),
234
+ // so `api` stays unset. Vision verified live (a 1x1 PNG reads back as a
235
+ // colour); video/pdf from the published entry stay unverified and are not
236
+ // offered.
237
+ id: "glm-5.3-flash-free",
238
+ name: "GLM-5.3 Flash [OpenCode]",
239
+ reasoning: true,
240
+ contextWindow: 1_000_000,
241
+ maxTokens: 32_000,
242
+ input: ["text", "image"],
243
+ thinkingLevelMap: {
244
+ off: null,
245
+ minimal: "minimal",
246
+ low: "low",
247
+ medium: "medium",
248
+ high: "high",
249
+ xhigh: "xhigh",
250
+ max: "max",
251
+ },
242
252
  },
253
+ {
254
+ // Added 2026-10-16 (issue #71 drift): Zen v1.19.2 added this free id.
255
+ // Specs agree across pi.dev and models.dev (262,144 ctx / 65,536 max,
256
+ // text-only) and the boundary probe matches: a marker at 90% depth is
257
+ // recalled at ~220K words and the gateway refuses ~250K words (400), with
258
+ // a silent no-recall at ~240K — the window ends right about there.
259
+ // maxTokens 65,536 published; the gateway accepted 131,072, which is
260
+ // acceptance, not a cap. Effort ladder: low/medium/high/xhigh/max probed
261
+ // 200 with visibly different reasoning lengths; `minimal` answers 200 too
262
+ // but stays hidden because the published ladder starts at low (same class
263
+ // as nemotron's tolerated-but-hidden `max`); `off` is null like everywhere.
264
+ // Chat-only (/v1/responses 400 protocol). Text-only: an image probe
265
+ // produced no answer.
266
+ id: "ll-alpha-free",
267
+ name: "LL Alpha [OpenCode]",
268
+ reasoning: true,
269
+ contextWindow: 262_144,
270
+ maxTokens: 65_536,
271
+ input: ["text"],
272
+ thinkingLevelMap: {
273
+ off: null,
274
+ minimal: null,
275
+ low: "low",
276
+ medium: "medium",
277
+ high: "high",
278
+ xhigh: "xhigh",
279
+ max: "max",
280
+ },
281
+ },
282
+ {
283
+ // Added 2026-10-16 (recheck): live free id on the Zen lane, listed on the
284
+ // official free lineup while models.dev already tags it deprecated — the
285
+ // tag also sits on live ids (muse-spark-1.2-contributor-free) and on
286
+ // already-dead ones (mimo-v2.5-free), so the live answer decides: chat 200
287
+ // with tools + stream, and the tool call round-trips. Chat is the only
288
+ // native shape (/v1/responses answers 400 "Model does not support this
289
+ // protocol"), so `api` stays unset. Reasoning: the published ladder lists
290
+ // `high` only; high streams thinking and the unavailable rungs stay null
291
+ // so the picker never offers them. Vision verified live (a 1x1 PNG reads
292
+ // back as "Pink"). Context: published 1,048,576; a dual-canary prompt at
293
+ // ~400K words (~520K tokens, canaries at ~30%/~97% depth) recalls both
294
+ // markers, and a 1.2M-word prompt (~1.56M tokens) draws an empty-bodied
295
+ // 400 — the wall sits between, matching the published figure. maxTokens
296
+ // 131,072 published; 131,073 accepted (acceptance is not a cap, so the
297
+ // published figure stays the budget).
298
+ id: "exo-free",
299
+ name: "Exo [OpenCode]",
300
+ reasoning: true,
301
+ contextWindow: 1_048_576,
302
+ maxTokens: 131_072,
303
+ input: ["text", "image"],
304
+ thinkingLevelMap: {
305
+ off: null,
306
+ minimal: null,
307
+ low: null,
308
+ medium: null,
309
+ high: "high",
310
+ xhigh: null,
311
+ max: null,
312
+ },
243
313
  },
244
314
  {
245
315
  // Added 2026-10-15: new free model on the OpenCode Zen lane. Live-verified by
@@ -409,19 +479,6 @@ export const KILO_MODELS: ModelDef[] = [
409
479
  thinkingFormat: "openrouter",
410
480
  thinkingLevelMap: KILO_REASONING_MAP,
411
481
  },
412
- {
413
- // Added 2026-10-09: replaces step-3.7-flash (demoted to paid upstream —
414
- // :free ID 404s keyless). Live on Kilo free list (isFree:true, 0/0
415
- // pricing, 1M ctx) + keyless chat served (429 provider concurrency).
416
- id: "stepfun/step-5-preview-free",
417
- name: "Step 5 Preview [Kilo]",
418
- reasoning: true,
419
- contextWindow: 1_000_000,
420
- maxTokens: 65_536,
421
- input: ["text", "image", "video"],
422
- thinkingFormat: "openrouter",
423
- thinkingLevelMap: KILO_REASONING_MAP,
424
- },
425
482
  {
426
483
  id: "thinkingmachines/inkling-small:free",
427
484
  name: "Inkling Small [Kilo]",
@@ -656,7 +713,8 @@ export const MODEL_ALIASES: Record<string, string> = {
656
713
  "nemotron-3-super": "nvidia/nemotron-3-super-120b-a12b:free",
657
714
  "north-mini-code": "cohere/north-mini-code:free",
658
715
  "lfm-2.5": "liquid/lfm-2.5-2.6b:free",
659
- "step-5-preview:kilo": "stepfun/step-5-preview-free",
716
+ "glm-5.3-flash": "glm-5.3-flash-free",
717
+ "exo": "exo-free",
660
718
  "glyph-cluster": "stealth/glyph-cluster",
661
719
  "inkling-small": "thinkingmachines/inkling-small:free",
662
720
  "mimo-v2.6-flash": "mimo-v2.6-flash-free",
@@ -664,7 +722,7 @@ export const MODEL_ALIASES: Record<string, string> = {
664
722
  "space-bunny": "space-bunny-free",
665
723
  "longcat-2.5-preview": "longcat-2.5-preview-free",
666
724
  "longcat": "longcat-2.5-preview-free",
667
- "step-5-preview": "step-5-preview-free",
725
+ "ll-alpha": "ll-alpha-free",
668
726
  "deepseek-v4.1-flash": "deepseek-v4.1-flash-free",
669
727
  // provider-prefixed short aliases (slash-normalized)
670
728
  "laguna-s-2.1:free": "poolside/laguna-s-2.1:free",
@@ -719,7 +777,7 @@ export const OVH_MODEL_IDS = new Set<string>([
719
777
  .map(([alias]) => alias),
720
778
  ]);
721
779
  /**
722
- * Combined list of all 36 static free models (canonical)
780
+ * Combined list of all 37 static free models (canonical)
723
781
  */
724
782
  export const ALL_MODELS: ModelDef[] = [...OPENCODE_MODELS, ...KILO_MODELS, ...CLINE_MODELS, ...OVH_MODELS];
725
783