pi-freeflow 1.9.4 → 1.9.5

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
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable changes to pi-freeflow. Public, user-visible behavior only.
4
4
 
5
+ ## 1.9.5 - 2026-09-03
6
+
7
+ ### Changes
8
+ - **Catalog refreshed against live upstream model lists (26 models: 8 OpenCode Zen + 18 KiloCode Gateway).** Re-checked both upstreams against their live endpoints and live inference probes:
9
+ - **Added** `muse-spark-1.3-contributor-free` (OpenCode Zen, Responses API, 1M context, 131K output, vision) — verified live: completes with reasoning, accepts effort levels, and answers vision queries.
10
+ - **Removed** `hy3-free` (OpenCode Zen) — upstream no longer serves it (`Model hy3-free is not supported`).
11
+ - **Removed** `tencent/hy3:free` and `meituan/longcat-2.0-free` (KiloCode Gateway) — upstream free tier dropped them (model unavailable / sign-in required).
12
+ - Pruned IDs added to the dead-model filter so a stale disk cache cannot resurrect them.
13
+
14
+ ### Validation
15
+ - `npx tsc --noEmit` clean, `npm test` full suite green on Windows.
16
+
5
17
  ## 1.9.4 - 2026-09-02
6
18
 
7
19
  ### Dependencies
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pi-freeflow 🌊
2
2
 
3
- > **28 free models. Up to 1M context. Zero API keys. Infinite scale via your own relay pool.**
3
+ > **26 free models. Up to 1M context. Zero API keys. Infinite scale via your own relay pool.**
4
4
 
5
5
  Thin by design: model list + dumb relay + log. Host `pi-ai` owns thinking, normalization & provider magic. We just make it free, fast, and unbreakable.
6
6
 
@@ -18,7 +18,7 @@ Join devs bypassing rate limits with their own relay pools. BYO, add as many as
18
18
 
19
19
  | Feature | Description | Value | Cost |
20
20
  | :--- | :--- | :--- | :--- |
21
- | **28 Curated Free Models** | 8 OpenCode Zen + 20 KiloCode Gateway models, up to 1M context & 512K output | Ceiling Unlocked | **$0** |
21
+ | **26 Curated Free Models** | 8 OpenCode Zen + 18 KiloCode Gateway models, up to 1M context & 512K output | Ceiling Unlocked | **$0** |
22
22
  | **BYO Relay Pool** | Round-robin load balancing across your Cloudflare Workers & Vercel Edges | Zero Rate Limits | **$0** (your free tiers) |
23
23
  | **Adaptive Health & Error Detection** | Auto-cooldown on 429 rate limits, 504 timeouts, and socket drops | 0ms Wasted Latency | **$0** |
24
24
  | **Stream Truncation Resilience** | Stateful SSE terminal tracking (`response.failed` / `response.incomplete` injection) | Zero Host Crashes | **$0** |
@@ -32,24 +32,25 @@ Philosophy: **Thin by design.** We only ship model list + relay proxy + log. Hos
32
32
 
33
33
  ---
34
34
 
35
- ### 28 Curated Models, One Command
35
+ ### 26 Curated Models, One Command
36
36
 
37
37
  ```bash
38
38
  /model → freeflow → pick
39
39
  ```
40
40
 
41
- #### OpenCode Zen (7 Models), Responses & Chat API
41
+ #### OpenCode Zen (8 Models), Responses & Chat API
42
42
  Optimized for deep reasoning, long-horizon coding & autonomous agentic workflows.
43
43
 
44
44
  | Model ID | Creator / Lab | Context | Max Output | Thinking | Vision |
45
45
  | :--- | :--- | :--- | :--- | :--- | :--- |
46
46
  | `muse-spark-1.2-contributor-free` | Meta Superintelligence Labs | **1M** (1.048.576) | **131K** (131.072) | `minimal … xhigh` | ✅ |
47
+ | `muse-spark-1.3-contributor-free` | Meta Superintelligence Labs | **1M** (1.048.576) | **131K** (131.072) | `minimal … xhigh` | ✅ |
47
48
  | `mimo-v2.5-free` | Xiaomi MiMo | **1M** (1.048.576) | **131K** (131.072) | `minimal … xhigh`\* | ✅ |
48
49
  | `laguna-s-2.1-free` | Poolside | **262K** (262.144) | **32K** (32.768) | `minimal … xhigh` | ❌ |
49
50
  | `nemotron-3.5-lightning-free` | NVIDIA | **1M** (1.000.000) | **262K** (262.144) | `minimal … xhigh` | ❌ |
50
51
  | `nemotron-3-ultra-free` | NVIDIA | **1M** (1.000.000) | **128K** (128.000) | `minimal … xhigh` | ❌ |
51
- | `hy3-free` | Tencent Hunyuan | **262K** (262.144) | **128K** (128.000) | `minimal … xhigh` | ❌ |
52
52
  | `big-pickle` | Big Pickle | **200K** (200.000) | **32K** (32.000) | `high / max` | ❌ |
53
+ | `ling-3.0-flash-fin-free` | Inclusion AI | **262K** (262.144) | **131K** (131.072) | `minimal … xhigh` | ❌ |
53
54
 
54
55
  #### KiloCode Gateway (18 Models), OpenRouter Compatible
55
56
  Keyless access with `Bearer kilo-free`. Clean slash-free and colon-free CLI aliases supported.
@@ -62,7 +63,6 @@ Keyless access with `Bearer kilo-free`. Clean slash-free and colon-free CLI alia
62
63
  | `nemotron-3-ultra-550b` (`nvidia/...:free`) | NVIDIA | **1M** (1.000.000) | **128K** (128.000) | `minimal…xhigh`\* | ❌ |
63
64
  | `nvidia/nemotron-3.5-lightning:free` | NVIDIA | **1M** (1.000.000) | **262K** (262.144) | `minimal…xhigh`\* | ❌ |
64
65
  | `nemotron-3-super` (`nvidia/...:free`) | NVIDIA | **262K** (262.144) | **262K** (262.144) | `minimal…xhigh`\* | ❌ |
65
- | `hy3:free` (`tencent/hy3:free`) | Tencent Hunyuan | **262K** (262.144) | **128K** (128.000) | `minimal…xhigh`\* | ❌ |
66
66
  | `north-mini-code` (`cohere/...:free`) | Cohere | **256K** (256.000) | **64K** (64.000) | `minimal…xhigh`\* | ❌ |
67
67
  | `laguna-s-2.1:free` (`poolside/...:free`) | Poolside | **262K** (262.144) | **32K** (32.768) | `minimal…xhigh`\* | ❌ |
68
68
  | `laguna-xs-2.1:free` (`poolside/...:free`) | Poolside | **262K** (262.144) | **32K** (32.768) | `minimal…xhigh`\* | ❌ |
@@ -70,12 +70,13 @@ Keyless access with `Bearer kilo-free`. Clean slash-free and colon-free CLI alia
70
70
  | `kilo-auto` (`kilo-auto/free`) | Kilo Gateway Auto | **256K** (256.000) | **10K** (10.000) | `minimal…xhigh`\* | ❌ |
71
71
  | `openrouter` (`openrouter/free`) | OpenRouter Free | **200K** (200.000) | **65K** (65.536) | `minimal…xhigh`\* | ✅ |
72
72
  | `content-safety` (`nvidia/...:free`) | NVIDIA | **128K** (128.000) | **8K** (8.192) | ❌ *(non-thinking)* | ✅ |
73
- | `longcat-2.0` (`meituan/longcat-2.0-free`) | Meituan | **1M** (1.048.756) | **262K** (262.144) | `minimal…xhigh`\* | ❌ |
74
73
  | `minimax-m2.7` (`minimax/minimax-m2.7:free`) | MiniMax | **196K** (196.608) | **196K** (196.608) | `minimal…xhigh`\* | ❌ |
75
74
  | `minimax-m3` (`minimax/minimax-m3:free`) | MiniMax | **1M** (1.048.576) | **512K** (524.288) | `minimal…xhigh`\* | ❌ |
76
75
  | `ling-3.0-flash-fin` (`inclusionai/ling-3.0-flash-fin:free`) | Inclusion AI | **262K** (262.144) | **32K** (32.768) | `minimal…xhigh`\* | ❌ |
76
+ | `inkling` (`thinkingmachines/inkling:free`) | Thinking Machines | **1M** (1.048.576) | **262K** (262.144) | `minimal…xhigh`\* | ✅ |
77
+ | `inkling-small` (`thinkingmachines/inkling-small:free`) | Thinking Machines | **1M** (1.048.576) | **262K** (262.144) | `minimal…xhigh`\* | ✅ |
77
78
 
78
- \* Levels are forwarded as-is through the OpenRouter-style nested `reasoning` parameter; effort mapping is decided by each model. (Verified live 2026-08-29: hy3 accepts flat `reasoning_effort`/nested `reasoning` and returns thinking — README previously said otherwise.) MiMo collapses `minimal→low` and `xhigh→high` upstream, so its selector shows 5 labels but only 3 distinct effort values.
79
+ \* 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.
79
80
 
80
81
  ---
81
82
 
@@ -341,7 +342,7 @@ pnpm smoke # verifies extensions/index.ts loads without crashing
341
342
  ```
342
343
  src/
343
344
  ├── index.ts # extension entry, lifecycle hooks
344
- ├── models.ts # 28-model catalog definitions
345
+ ├── models.ts # 26-model catalog definitions
345
346
  ├── catalog.ts # model catalog cache (24h disk)
346
347
  ├── proxy.ts # local proxy server (127.0.0.1:28180)
347
348
  ├── relay.ts # relay selection & round-robin
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-freeflow",
3
3
  "type": "module",
4
- "version": "1.9.4",
4
+ "version": "1.9.5",
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
@@ -31,10 +31,16 @@ import type {
31
31
  /**
32
32
  * Pruned model IDs that must never re-enter the catalog via disk cache or upstream merge.
33
33
  */
34
- export const DEAD_MODEL_IDS = new Set<string>(["deepseek-v4-flash-free", "x-preview-f-free"]);
34
+ export const DEAD_MODEL_IDS = new Set<string>([
35
+ "deepseek-v4-flash-free",
36
+ "x-preview-f-free",
37
+ "hy3-free",
38
+ "tencent/hy3:free",
39
+ "meituan/longcat-2.0-free",
40
+ ]);
35
41
  /**
36
42
  * In-memory cache of currently active/available free models.
37
- * Initialized with all 28 verified models for 0ms instant availability.
43
+ * Initialized with all 26 verified models for 0ms instant availability.
38
44
  */
39
45
  let aliveCatalog: RegisteredModel[] = ALL_MODELS.map((m) => ({
40
46
  ...m,
@@ -148,7 +154,9 @@ export function enrichModelDef(raw: RawModelItem, source: Upstream): RegisteredM
148
154
  maxTokens = 131_072;
149
155
  }
150
156
 
151
- const isResponses = raw.id === "muse-spark-1.2-contributor-free";
157
+ const isResponses =
158
+ raw.id === "muse-spark-1.2-contributor-free" ||
159
+ raw.id === "muse-spark-1.3-contributor-free";
152
160
 
153
161
  return {
154
162
  id: raw.id,
@@ -349,6 +357,6 @@ export async function refreshCatalog(force = false): Promise<RegisteredModel[]>
349
357
  } catch (err) {
350
358
  logDebug("Failed reading stale catalog cache", { error: String(err) });
351
359
  }
352
- // No valid cache — return in-memory static 28 (host will refresh if needed)
360
+ // No valid cache — return in-memory static 26 (host will refresh if needed)
353
361
  return aliveCatalog;
354
362
  }
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * pi-freeflow — Modular, high-resiliency LLM extension for Pi & Oh My Pi (OMP)
3
3
  *
4
- * Provides access to 28 free models (8 OpenCode Zen + 20 KiloCode Gateway) with:
4
+ * Provides access to 26 free models (8 OpenCode Zen + 18 KiloCode Gateway) with:
5
5
  * - Single-port daemon reuse on 28180 across concurrent subagents
6
6
  * - Multi-cloud rolling egress relays (Vercel Edge, Cloudflare, Deno)
7
7
  * - 0ms instant startup with verified static catalog and background live health checks
@@ -258,7 +258,7 @@ export default async function (pi: ExtensionAPI): Promise<void> {
258
258
  ? `Relay pool ready: ${freshRelayState.relays.length} relay(s). Run /freeflow for pool management.`
259
259
  : "Relay pool empty — direct mode. Run /freeflow deploy to add your own egress.";
260
260
  ctx.ui?.notify?.(
261
- `freeflow ready: 28 free models via local proxy 127.0.0.1:28180. ${hint}`,
261
+ `freeflow ready: ${ALL_MODELS.length} free models via local proxy 127.0.0.1:28180. ${hint}`,
262
262
  "info",
263
263
  );
264
264
  }
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 28 verified free models:
5
- * - 8 OpenCode Zen models (1 Responses API + 7 Chat Completions)
6
- * - 20 KiloCode Keyless Gateway models (19 OpenRouter format + 1 Standard format)
4
+ * Defines the 26 verified free models:
5
+ * - 8 OpenCode Zen models (2 Responses API + 6 Chat Completions)
6
+ * - 18 KiloCode Keyless Gateway models (17 OpenRouter format + 1 Standard format)
7
7
  */
8
8
 
9
9
  import type { ModelDef, ThinkingLevelMap, Upstream } from "./types.ts";
@@ -31,35 +31,36 @@ export const OPENCODE_MODELS: ModelDef[] = [
31
31
  max: null,},
32
32
  },
33
33
  {
34
- id: "mimo-v2.5-free",
35
- name: "MiMo V2.5 (1M)",
34
+ id: "muse-spark-1.3-contributor-free",
35
+ name: "Muse Spark 1.3 (1M)",
36
36
  reasoning: true,
37
37
  contextWindow: 1_048_576,
38
38
  maxTokens: 131_072,
39
+ api: "openai-responses",
39
40
  input: ["text", "image"],
40
41
  thinkingLevelMap: {
41
42
  off: null,
42
- minimal: "low",
43
+ minimal: "minimal",
43
44
  low: "low",
44
45
  medium: "medium",
45
46
  high: "high",
46
- xhigh: "high",
47
+ xhigh: "xhigh",
47
48
  max: null,},
48
49
  },
49
50
  {
50
- id: "hy3-free",
51
- name: "Hy3 (262K)",
51
+ id: "mimo-v2.5-free",
52
+ name: "MiMo V2.5 (1M)",
52
53
  reasoning: true,
53
- contextWindow: 262_144,
54
- maxTokens: 128_000,
55
- input: ["text"],
54
+ contextWindow: 1_048_576,
55
+ maxTokens: 131_072,
56
+ input: ["text", "image"],
56
57
  thinkingLevelMap: {
57
58
  off: null,
58
- minimal: "minimal",
59
+ minimal: "low",
59
60
  low: "low",
60
61
  medium: "medium",
61
62
  high: "high",
62
- xhigh: "xhigh",
63
+ xhigh: "high",
63
64
  max: null,},
64
65
  },
65
66
  {
@@ -226,16 +227,6 @@ export const KILO_MODELS: ModelDef[] = [
226
227
  thinkingFormat: "openrouter",
227
228
  thinkingLevelMap: KILO_REASONING_MAP,
228
229
  },
229
- {
230
- id: "tencent/hy3:free",
231
- name: "Tencent Hy3 (Kilo)",
232
- reasoning: true,
233
- contextWindow: 262_144,
234
- maxTokens: 128_000,
235
- input: ["text"],
236
- thinkingFormat: "openrouter",
237
- thinkingLevelMap: KILO_REASONING_MAP,
238
- },
239
230
  {
240
231
  id: "cohere/north-mini-code:free",
241
232
  name: "North Mini Code",
@@ -304,16 +295,6 @@ export const KILO_MODELS: ModelDef[] = [
304
295
  maxTokens: 8_192,
305
296
  input: ["text", "image"],
306
297
  },
307
- {
308
- id: "meituan/longcat-2.0-free",
309
- name: "LongCat 2.0 (1M)",
310
- reasoning: true,
311
- contextWindow: 1_048_756,
312
- maxTokens: 262_144,
313
- input: ["text"],
314
- thinkingFormat: "openrouter",
315
- thinkingLevelMap: KILO_REASONING_MAP,
316
- },
317
298
  {
318
299
  id: "minimax/minimax-m2.7:free",
319
300
  name: "MiniMax M2.7 (free)",
@@ -384,14 +365,12 @@ export const MODEL_ALIASES: Record<string, string> = {
384
365
  "north-mini-code": "cohere/north-mini-code:free",
385
366
  "lfm-2.5": "liquid/lfm-2.5-2.6b:free",
386
367
  "content-safety": "nvidia/nemotron-3.5-content-safety:free",
387
- "longcat-2.0": "meituan/longcat-2.0-free",
388
368
  "minimax-m2.7": "minimax/minimax-m2.7:free",
389
369
  "minimax-m3": "minimax/minimax-m3:free",
390
370
  "ling-3.0-flash-fin": "inclusionai/ling-3.0-flash-fin:free",
391
371
  "inkling": "thinkingmachines/inkling:free",
392
372
  "inkling-small": "thinkingmachines/inkling-small:free",
393
373
  // provider-prefixed short aliases (slash-normalized)
394
- "hy3:free": "tencent/hy3:free",
395
374
  "laguna-s-2.1:free": "poolside/laguna-s-2.1:free",
396
375
  "laguna-xs-2.1:free": "poolside/laguna-xs-2.1:free",
397
376
  "kilo-auto": "kilo-auto/free",
@@ -417,7 +396,7 @@ export const KILO_MODEL_IDS = new Set<string>([
417
396
  ]);
418
397
 
419
398
  /**
420
- * Combined list of all 28 static free models (canonical)
399
+ * Combined list of all 26 static free models (canonical)
421
400
  */
422
401
  export const ALL_MODELS: ModelDef[] = [...OPENCODE_MODELS, ...KILO_MODELS];
423
402