pi-freeflow 1.3.0 → 1.3.3
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 +132 -229
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,279 +1,182 @@
|
|
|
1
|
-
# pi-freeflow
|
|
1
|
+
# pi-freeflow 🌊
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **23 free models. Up to 1M context (66K–1M per model). Zero API keys. Infinite scale via your own cloud relay.**
|
|
4
|
+
|
|
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
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/pi-freeflow)
|
|
8
|
+
[](https://www.npmjs.com/package/pi-freeflow)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://omp.sh)
|
|
11
|
+
|
|
12
|
+
> **Join devs bypassing rate limits with their own relay pools — BYO, add as many as you need.**
|
|
13
|
+
|
|
14
|
+
## Why you’re here
|
|
15
|
+
|
|
16
|
+
You love Pi. You love free models. You hate:
|
|
17
|
+
|
|
18
|
+
- `429 Rate Limit` killing your 10-parallel subagent fleet
|
|
19
|
+
- `Paid model leaked` into your picker
|
|
20
|
+
- `Thinking` silently disabled because `reasoning_effort: max` was rejected
|
|
21
|
+
- Paying for `1M context` you should get for free
|
|
22
|
+
|
|
23
|
+
**FreeFlow fixes all three — in 17 files, 102KB.**
|
|
4
24
|
|
|
5
25
|
---
|
|
6
26
|
|
|
7
|
-
##
|
|
27
|
+
## What you get (and what you don’t pay for)
|
|
8
28
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- 🔇 **Full Quiet Mode**: Clean status bar indicators without intrusive console overlays in the TUI.
|
|
18
|
-
- 📝 **Persistent Background Logging**: Automatic diagnostic logs recorded to `~/.pi/agent/pi-freeflow.log` with 5MB auto-rotation.
|
|
19
|
-
- 🤖 **Sub-Agent Ready**: Seamlessly shared across concurrent parallel sub-agent tasks.
|
|
29
|
+
| You get | Value | Cost |
|
|
30
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ---- |
|
|
31
|
+
| **23 curated free models** — 9 OpenCode Zen + 14 Kilo, Up to 1M (66K–1M per model), vision-ready | $0 | $0 |
|
|
32
|
+
| **BYO relay pool** — Cloudflare Workers + Vercel Edge, round-robin, seamless `429→next` (default ships direct, add via `/freeflow use <url>` / `deploy`) | $0 (your free tiers) | $0 |
|
|
33
|
+
| **Dumb proxy that never breaks** — `127.0.0.1:18080`, host-normalized, pathname-guarded `/v1/models` | $0 | $0 |
|
|
34
|
+
| **Real logs** — `~/.pi/agent/pi-freeflow.log` 5MB rotate, debug toggle | $0 | $0 |
|
|
35
|
+
|
|
36
|
+
> **Thin by design:** `model list + relay proxy + log` — host `pi-ai` owns thinking & normalization.
|
|
20
37
|
|
|
21
38
|
---
|
|
22
39
|
|
|
23
|
-
##
|
|
40
|
+
## 23 Models — One Command
|
|
24
41
|
|
|
25
|
-
### Oh My Pi (OMP)
|
|
26
42
|
```bash
|
|
27
|
-
|
|
43
|
+
/model → freeflow → pick
|
|
28
44
|
```
|
|
29
45
|
|
|
30
|
-
###
|
|
31
|
-
```bash
|
|
32
|
-
pi install npm:pi-freeflow
|
|
33
|
-
```
|
|
46
|
+
### OpenCode Zen (9) — Responses & Chat
|
|
34
47
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
| Model | Context | Max | Thinking | Vision |
|
|
49
|
+
| --------------------------------- | -------- | ---- | ----------------- | ------ |
|
|
50
|
+
| `muse-spark-1.2-contributor-free` | **1M** | 131K | `minimal→max` | ✅ |
|
|
51
|
+
| `deepseek-v4-flash-free` | **1M** | 384K | `minimal→max` | ❌ |
|
|
52
|
+
| `x-preview-f-free` | **1M** | 131K | `low/high/max` | ✅ |
|
|
53
|
+
| `mimo-v2.5-free` | **1M** | 131K | `low/medium/high` | ✅ |
|
|
54
|
+
| `laguna-s-2.1-free` | **1M** | 131K | `minimal→max` | ❌ |
|
|
55
|
+
| `nemotron-3.5-lightning-free` | **1M** | 262K | `minimal→max` | ❌ |
|
|
56
|
+
| `nemotron-3-ultra-free` | **1M** | 128K | `minimal→max` | ❌ |
|
|
57
|
+
| `hy3-free` | **262K** | 128K | `minimal→max` | ❌ |
|
|
58
|
+
| `big-pickle` | **200K** | 32K | `high/max` | ❌ |
|
|
39
59
|
|
|
40
|
-
|
|
60
|
+
### Kilo Gateway (14) — OpenRouter
|
|
41
61
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
omp
|
|
47
|
-
```
|
|
48
|
-
2. Select a model via `/model` $\to$ **`freeflow`** $\to$ choose your model (e.g. `mimo-v2.5-free` or `x-preview-f-free`).
|
|
49
|
-
3. Manage relays with the `/freeflow` command:
|
|
50
|
-
```text
|
|
51
|
-
/freeflow status # Check relay status and active proxy
|
|
52
|
-
/freeflow list # View all saved relay proxies
|
|
53
|
-
/freeflow on # Enable relay proxying
|
|
54
|
-
/freeflow off # Disable relay (use direct upstream)
|
|
55
|
-
/freeflow use <URL> # Activate a specific relay proxy
|
|
56
|
-
/freeflow logs # Show recent 25 lines of debug logs
|
|
57
|
-
```
|
|
62
|
+
`dots-3-note-preview:free` **512K**, `step-3.7-flash:free` 262K, `nemotron-3-nano-omni:free` 256K, `nemotron-3-ultra-550b:free` **1M**, `nemotron-3-super:free` 262K, `hy3:free` 262K, `north-mini-code:free` 256K, `laguna-s/xs:free` 262K, `lfm-2.5:free` 66K, `kilo-auto/free`, `openrouter/free`, `content-safety:free` + 2 more.
|
|
63
|
+
|
|
64
|
+
All `off→null` (hidden) — host decides budgets, not us.
|
|
58
65
|
|
|
59
66
|
---
|
|
60
67
|
|
|
61
|
-
##
|
|
62
|
-
|
|
63
|
-
### OpenCode Zen Models (9 Models)
|
|
64
|
-
|
|
65
|
-
| Model ID | Name | Context Window | Max Output | Reasoning / Thinking | Vision (Images) |
|
|
66
|
-
| :--- | :--- | :---: | :---: | :---: | :---: |
|
|
67
|
-
| `deepseek-v4-flash-free` | DeepSeek V4 Flash (1M) | **1M** (1,000,000) | **384K** | `minimal..max` | ❌ No |
|
|
68
|
-
| `x-preview-f-free` | Ox Alpha (1M) | **1M** (1,048,576) | 131K | `low, high, max` | ✅ Yes |
|
|
69
|
-
| `muse-spark-1.2-contributor-free` | Muse Spark 1.2 (1M) | **1M** (1,048,576) | 131K | `minimal..max` | ✅ Yes |
|
|
70
|
-
| `mimo-v2.5-free` | MiMo V2.5 (1M) | **1M** (1,048,576) | 131K | `low, medium, high` | ✅ Yes |
|
|
71
|
-
| `laguna-s-2.1-free` | Laguna S 2.1 (1M) | **1M** (1,048,576) | 131K | `minimal..max` | ❌ No |
|
|
72
|
-
| `nemotron-3.5-lightning-free` | Nemotron 3.5 Lightning (1M) | **1M** (1,000,000) | 262K | `minimal..max` | ❌ No |
|
|
73
|
-
| `nemotron-3-ultra-free` | Nemotron 3 Ultra (1M) | **1M** (1,000,000) | 128K | `minimal..max` | ❌ No |
|
|
74
|
-
| `hy3-free` | Hy3 (262K) | **262K** (262,144) | 128K | `minimal..max` | ❌ No |
|
|
75
|
-
| `big-pickle` | Big Pickle | **200K** (200,000) | 32K | `high, max` | ❌ No |
|
|
76
|
-
### KiloCode Gateway Models (14 Models)
|
|
77
|
-
|
|
78
|
-
| Model ID | Name | Context Window | Max Output | Reasoning / Thinking | Vision (Images) |
|
|
79
|
-
| :--- | :--- | :---: | :---: | :---: | :---: |
|
|
80
|
-
| `dots-studio/dots-3-note-preview:free` | Dots3-Note Preview (512K) | **512K** (512,000) | 512K | OpenRouter format | ✅ Yes |
|
|
81
|
-
| `stepfun/step-3.7-flash:free` | Step 3.7 Flash | **262K** (262,144) | 262K | OpenRouter format | ✅ Yes |
|
|
82
|
-
| `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free` | Nemotron 3 Nano Omni | **256K** (256,000) | 65K | OpenRouter format | ✅ Yes |
|
|
83
|
-
| `nvidia/nemotron-3-ultra-550b-a55b:free` | Nemotron 3 Ultra 550B (1M) | **1M** (1,000,000) | 65K | OpenRouter format | ❌ No |
|
|
84
|
-
| `nvidia/nemotron-3.5-lightning:free` | Nemotron 3.5 Lightning (Kilo) | **1M** (1,000,000) | 65K | OpenRouter format | ❌ No |
|
|
85
|
-
| `nvidia/nemotron-3-super-120b-a12b:free` | Nemotron 3 Super 120B | **262K** (262,144) | 262K | OpenRouter format | ❌ No |
|
|
86
|
-
| `tencent/hy3:free` | Tencent Hy3 (Kilo) | **262K** (262,144) | 128K | OpenRouter format | ❌ No |
|
|
87
|
-
| `cohere/north-mini-code:free` | North Mini Code | **256K** (256,000) | 64K | OpenRouter format | ❌ No |
|
|
88
|
-
| `poolside/laguna-s-2.1:free` | Laguna S 2.1 (Kilo) | **262K** (262,144) | 33K | OpenRouter format | ❌ No |
|
|
89
|
-
| `poolside/laguna-xs-2.1:free` | Laguna XS 2.1 | **262K** (262,144) | 33K | OpenRouter format | ❌ No |
|
|
90
|
-
| `liquid/lfm-2.5-2.6b:free` | Liquid LFM 2.5 | **66K** (65,536) | 8K | OpenRouter format | ❌ No |
|
|
91
|
-
| `kilo-auto/free` | Kilo Auto | **256K** (256,000) | 10K | Standard | ❌ No |
|
|
92
|
-
| `openrouter/free` | OpenRouter Auto | **200K** (200,000) | 65K | Standard | ❌ No |
|
|
93
|
-
| `nvidia/nemotron-3.5-content-safety:free` | Nemotron Content Safety | **128K** (128,000) | 8K | Standard | ❌ No |
|
|
68
|
+
## The magic: BYO relays, 0 rate limits
|
|
94
69
|
|
|
95
|
-
|
|
70
|
+
```text
|
|
71
|
+
You → 127.0.0.1:18080 (dumb) → x-relay-target → N egress IPs (your pool) → opencode.ai / api.kilo.ai
|
|
72
|
+
↑ host already normalized thinking → proxy just forwards
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- **Round-robin per request** — 10 parallel subagents hit N different primaries (your pool size), no thundering herd
|
|
76
|
+
- **Seamless 429** — `429/502/503/504` → instant roll to next, never `429` to agent
|
|
77
|
+
- **Exhausted? Direct fallback** — if all relays are 429 (global limit), transparent `direct fetch` — host shows `rate limit` only when truly global
|
|
78
|
+
- **No live catalog fetch** — `24h DISK_CACHE_ONLY`, never `fetch` from subagent → no `Unable to connect`
|
|
96
79
|
|
|
97
|
-
|
|
80
|
+
**Real log (1.3.1 thin):**
|
|
98
81
|
|
|
99
|
-
|
|
82
|
+
```text
|
|
83
|
+
candidates:N → relay-A 429 rolling → relay-B 200 in 1.2s → 98 chunks 663KB done
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
You bring the relays (free tiers). We bring the rolling.
|
|
100
87
|
|
|
101
88
|
---
|
|
102
89
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
"Access-Control-Allow-Methods": "GET, POST, OPTIONS, HEAD",
|
|
120
|
-
"Access-Control-Allow-Headers": "*",
|
|
121
|
-
"Access-Control-Max-Age": "86400",
|
|
122
|
-
},
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const target = request.headers.get("x-relay-target");
|
|
127
|
-
const relayPath = request.headers.get("x-relay-path") || "/";
|
|
128
|
-
|
|
129
|
-
if (!target || !ALLOWED_TARGETS.includes(target.replace(/\/$/, ""))) {
|
|
130
|
-
return new Response(JSON.stringify({ error: "Forbidden target" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const targetUrl = target.replace(/\/$/, "") + relayPath;
|
|
134
|
-
const headers = new Headers(request.headers);
|
|
135
|
-
headers.delete("x-relay-target");
|
|
136
|
-
headers.delete("x-relay-path");
|
|
137
|
-
headers.delete("host");
|
|
138
|
-
headers.delete("cf-connecting-ip");
|
|
139
|
-
headers.delete("cf-ray");
|
|
140
|
-
|
|
141
|
-
try {
|
|
142
|
-
const response = await fetch(targetUrl, {
|
|
143
|
-
method: request.method,
|
|
144
|
-
headers,
|
|
145
|
-
body: request.method !== "GET" && request.method !== "HEAD" ? request.body : undefined,
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
const outHeaders = new Headers(response.headers);
|
|
149
|
-
outHeaders.set("Access-Control-Allow-Origin", "*");
|
|
150
|
-
return new Response(response.body, { status: response.status, headers: outHeaders });
|
|
151
|
-
} catch (err) {
|
|
152
|
-
return new Response(JSON.stringify({ error: "Upstream failed", details: String(err) }), { status: 502, headers: { "content-type": "application/json" } });
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
};
|
|
90
|
+
## 30-second Setup
|
|
91
|
+
|
|
92
|
+
### 1. Install (pick your host)
|
|
93
|
+
|
|
94
|
+
**Oh My Pi (recommended):**
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
omp plugin install pi-freeflow
|
|
98
|
+
# or local dev
|
|
99
|
+
omp plugin link /path/to/pi-freeflow
|
|
100
|
+
````
|
|
101
|
+
|
|
102
|
+
**Pi:**
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
pi install npm:pi-freeflow
|
|
156
106
|
```
|
|
157
107
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
108
|
+
### 2. Pick a model
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
omp
|
|
112
|
+
/model → freeflow → muse-spark-1.2 (1M) → max
|
|
113
|
+
# or CLI
|
|
114
|
+
omp -p --model freeflow/muse-spark-1.2-contributor-free "build me a SaaS"
|
|
161
115
|
```
|
|
162
116
|
|
|
163
|
-
|
|
117
|
+
### 3. (Optional but 🔥) Add your free relays — BYO, scale as you add
|
|
164
118
|
|
|
165
|
-
|
|
166
|
-
> **Free Tier**: 1,000,000 requests/month.
|
|
119
|
+
**One Cloudflare Worker (100k req/day, no 25s timeout):**
|
|
167
120
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
121
|
+
1. `dash.cloudflare.com → Workers → Create → Deploy → Edit code` → paste the Worker relay snippet below → Deploy
|
|
122
|
+
2. `omp` → `/freeflow use https://your.workers.dev`
|
|
123
|
+
|
|
124
|
+
**Six Vercel Edges (1M req/mo):**
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
/freeflow deploy # prompts token in-memory, auto-adds to pool
|
|
128
|
+
# or manual: vercel.json → api/relay.js
|
|
173
129
|
```
|
|
174
|
-
*(Prompts for your token in-memory, provisions a private Edge Function, and adds it to your relay pool automatically).*
|
|
175
|
-
|
|
176
|
-
#### Method B: Manual Git Deploy
|
|
177
|
-
Deploy a Git repository with these 3 files:
|
|
178
|
-
* **`api/relay.js`**:
|
|
179
|
-
```javascript
|
|
180
|
-
const ALLOWED_TARGETS = ["https://opencode.ai", "https://api.kilo.ai"];
|
|
181
|
-
export const config = { runtime: "edge" };
|
|
182
|
-
export default async function handler(req) {
|
|
183
|
-
const target = req.headers.get("x-relay-target");
|
|
184
|
-
const relayPath = req.headers.get("x-relay-path") || "/";
|
|
185
|
-
if (!target || !ALLOWED_TARGETS.includes(target.replace(/\/$/, ""))) return new Response(JSON.stringify({ error: "Forbidden" }), { status: 403 });
|
|
186
|
-
const targetUrl = target.replace(/\/$/, "") + relayPath;
|
|
187
|
-
const headers = new Headers(req.headers);
|
|
188
|
-
headers.delete("x-relay-target"); headers.delete("x-relay-path"); headers.delete("host");
|
|
189
|
-
const response = await fetch(targetUrl, { method: req.method, headers, body: req.method !== "GET" && req.method !== "HEAD" ? req.body : undefined, duplex: "half" });
|
|
190
|
-
return new Response(response.body, { status: response.status, headers: response.headers });
|
|
191
|
-
}
|
|
192
|
-
```
|
|
193
|
-
* **`package.json`**: `{ "name": "freeflow-relay", "version": "1.0.0" }`
|
|
194
|
-
* **`vercel.json`**: `{ "rewrites": [{ "source": "/(.*)", "destination": "/api/relay" }] }`
|
|
195
130
|
|
|
196
|
-
|
|
131
|
+
**Check pooling:**
|
|
197
132
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
2. Paste the following TypeScript code:
|
|
203
|
-
|
|
204
|
-
```typescript
|
|
205
|
-
const ALLOWED_TARGETS = ["https://opencode.ai", "https://api.kilo.ai"];
|
|
206
|
-
|
|
207
|
-
Deno.serve(async (req) => {
|
|
208
|
-
if (req.method === "OPTIONS") {
|
|
209
|
-
return new Response(null, {
|
|
210
|
-
headers: {
|
|
211
|
-
"Access-Control-Allow-Origin": "*",
|
|
212
|
-
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
213
|
-
"Access-Control-Allow-Headers": "*",
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const target = req.headers.get("x-relay-target");
|
|
219
|
-
const relayPath = req.headers.get("x-relay-path") || "/";
|
|
220
|
-
if (!target || !ALLOWED_TARGETS.includes(target.replace(/\/$/, ""))) {
|
|
221
|
-
return new Response(JSON.stringify({ error: "Forbidden target" }), { status: 403 });
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
const targetUrl = target.replace(/\/$/, "") + relayPath;
|
|
225
|
-
const headers = new Headers(req.headers);
|
|
226
|
-
headers.delete("x-relay-target");
|
|
227
|
-
headers.delete("x-relay-path");
|
|
228
|
-
headers.delete("host");
|
|
229
|
-
|
|
230
|
-
const response = await fetch(targetUrl, {
|
|
231
|
-
method: req.method,
|
|
232
|
-
headers,
|
|
233
|
-
body: req.method !== "GET" && req.method !== "HEAD" ? req.body : undefined,
|
|
234
|
-
});
|
|
235
|
-
return new Response(response.body, { status: response.status, headers: response.headers });
|
|
236
|
-
});
|
|
133
|
+
```bash
|
|
134
|
+
/freeflow status # relay-A 1/N (ON) → candidates:N
|
|
135
|
+
/freeflow logs # tail -25
|
|
136
|
+
cat ~/.pi/agent/pi-freeflow.log | tail -n 20
|
|
237
137
|
```
|
|
238
|
-
|
|
138
|
+
|
|
139
|
+
Done. Subagents now follow parent proxy — `Unable to connect` is history.
|
|
239
140
|
|
|
240
141
|
---
|
|
241
142
|
|
|
242
|
-
##
|
|
143
|
+
## Thin vs Fat
|
|
243
144
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
/
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
/
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
/freeflow remove <URL> # Remove an inactive relay from pool
|
|
253
|
-
/freeflow logs # Show last 25 lines of debug logs
|
|
254
|
-
```
|
|
145
|
+
| Fat plugin (before) | Thin FreeFlow (now) |
|
|
146
|
+
| ------------------------------------------- | --------------------------------------------------- |
|
|
147
|
+
| `src/normalizer.ts` 200 LOC duplicates host | **Deleted** — host `pi-ai` owns 11 `thinkingFormat` |
|
|
148
|
+
| Live `fetch` 10s in subagent → timeout | **Disk-only 24h**, proxy-only |
|
|
149
|
+
| `400` loops N× relays | **Narrow 429/5xx only**, `400` surfaces instantly |
|
|
150
|
+
| `GET /v1/models?foo` leaks paid | **Pathname-guarded** |
|
|
151
|
+
|
|
152
|
+
Result: **<500 LOC core, 29 tests PASS, typecheck PASS**.
|
|
255
153
|
|
|
256
154
|
---
|
|
257
155
|
|
|
258
|
-
##
|
|
156
|
+
## FAQ
|
|
259
157
|
|
|
260
|
-
|
|
261
|
-
By default, `pi-freeflow` uses a **Single Shared Master Port** (`18080`). All concurrent sub-agents automatically reuse this master proxy without spawning redundant servers or extra sockets.
|
|
158
|
+
**Do I need API keys?** No. `Kilo` uses `Bearer kilo-free`, `OpenCode` uses `opencodeHeaders()`.
|
|
262
159
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
160
|
+
**What if all relays 429?** Proxy tries direct. If that’s also 429, Pi shows `rate limit` — that means global upstream limit, even without relay you’d be 429.
|
|
161
|
+
|
|
162
|
+
**Can I use without relays?** Yes. `/freeflow off` → direct. Add relays later to scale.
|
|
163
|
+
|
|
164
|
+
**Where’s `normalizer`?** Deleted in `1.3.0`. If `zai/qwen/deepseek` thinking broke before, it’s fixed now because host handles it.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Sell yourself, not the plugin
|
|
169
|
+
|
|
170
|
+
> “I shipped 10 parallel subagents on 1M context, zero keys, zero 429s. FreeFlow did the rolling, Pi did the thinking.”
|
|
171
|
+
|
|
172
|
+
**Start now:**
|
|
267
173
|
|
|
268
|
-
### Zero Configuration Required
|
|
269
|
-
FreeFlow registers with the local proxy daemon automatically. No external API keys or environment variables are required to use the free model catalog. If you wish to set a custom daemon port, you can optionally define `FREEFLOW_PORT=19000` in your environment.
|
|
270
|
-
### Live Logs
|
|
271
174
|
```bash
|
|
272
|
-
|
|
175
|
+
omp plugin install pi-freeflow && omp --model freeflow/muse-spark-1.2-contributor-free --thinking max "make it sell"
|
|
273
176
|
```
|
|
274
177
|
|
|
275
178
|
---
|
|
276
179
|
|
|
277
|
-
##
|
|
180
|
+
## License
|
|
278
181
|
|
|
279
|
-
MIT © trefeon
|
|
182
|
+
MIT © trefeon — PRs welcome. `reference/` holds `pi`, `oh-my-pi`, `opencode`, `kilocode` shallow clones for audit (gitignored).
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-freeflow",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.3.
|
|
5
|
-
"description": "
|
|
4
|
+
"version": "1.3.3",
|
|
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",
|
|
8
8
|
"keywords": [
|