pi-freeflow 1.3.1 โ 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 +131 -226
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,277 +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
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
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/pi-freeflow)
|
|
8
|
+
[](https://www.npmjs.com/package/pi-freeflow)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://omp.sh)
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
> **Join devs bypassing rate limits with their own relay pools โ BYO, add as many as you need.**
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
## Why youโre here
|
|
10
15
|
|
|
11
|
-
|
|
12
|
-
- ๐ **Dumb Relay Proxy** โ `http://127.0.0.1:18080` dumb pipe: `x-relay-target/path` โ 7-pool (CF Workers + Vercel Edge) round-robin seamless `429` roll โ direct fallback; host already normalized `reasoning_effort`/`thinking`
|
|
13
|
-
- ๐ **Persistent Log** โ `~/.pi/agent/pi-freeflow.log` 5MB rotate, `pi-freeflow-debug.json` toggle, `GET /v1/models` pathname-guarded (no `?query` paid leak)
|
|
14
|
-
- ๐ค **Sub-agent Ready** โ shared daemon `18080` (or `18081` fallback) reused across parallel subagents; round-robin primary + `willUseRelay` bypass prevents local `127.0.0.1` 429
|
|
15
|
-
- โก **SSE Streaming** โ zero-buffer chunk pipe, `thinking_delta` pass-through (host parses)
|
|
16
|
+
You love Pi. You love free models. You hate:
|
|
16
17
|
|
|
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.**
|
|
18
24
|
|
|
19
25
|
---
|
|
20
26
|
|
|
21
|
-
##
|
|
27
|
+
## What you get (and what you donโt pay for)
|
|
22
28
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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 |
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
> **Thin by design:** `model list + relay proxy + log` โ host `pi-ai` owns thinking & normalization.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 23 Models โ One Command
|
|
32
41
|
|
|
33
|
-
### From Local / Git Repo
|
|
34
42
|
```bash
|
|
35
|
-
|
|
43
|
+
/model โ freeflow โ pick
|
|
36
44
|
```
|
|
37
45
|
|
|
38
|
-
|
|
46
|
+
### OpenCode Zen (9) โ Responses & Chat
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
1.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
3.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/freeflow on # Enable relay proxying
|
|
52
|
-
/freeflow off # Disable relay (use direct upstream)
|
|
53
|
-
/freeflow use <URL> # Activate a specific relay proxy
|
|
54
|
-
/freeflow logs # Show recent 25 lines of debug logs
|
|
55
|
-
```
|
|
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` | โ |
|
|
56
59
|
|
|
57
|
-
|
|
60
|
+
### Kilo Gateway (14) โ OpenRouter
|
|
61
|
+
|
|
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.
|
|
58
63
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
### OpenCode Zen Models (9 Models)
|
|
62
|
-
|
|
63
|
-
| Model ID | Name | Context Window | Max Output | Reasoning / Thinking | Vision (Images) |
|
|
64
|
-
| :--- | :--- | :---: | :---: | :---: | :---: |
|
|
65
|
-
| `deepseek-v4-flash-free` | DeepSeek V4 Flash (1M) | **1M** (1,000,000) | **384K** | `minimal..max` | โ No |
|
|
66
|
-
| `x-preview-f-free` | Ox Alpha (1M) | **1M** (1,048,576) | 131K | `low, high, max` | โ
Yes |
|
|
67
|
-
| `muse-spark-1.2-contributor-free` | Muse Spark 1.2 (1M) | **1M** (1,048,576) | 131K | `minimal..max` | โ
Yes |
|
|
68
|
-
| `mimo-v2.5-free` | MiMo V2.5 (1M) | **1M** (1,048,576) | 131K | `low, medium, high` | โ
Yes |
|
|
69
|
-
| `laguna-s-2.1-free` | Laguna S 2.1 (1M) | **1M** (1,048,576) | 131K | `minimal..max` | โ No |
|
|
70
|
-
| `nemotron-3.5-lightning-free` | Nemotron 3.5 Lightning (1M) | **1M** (1,000,000) | 262K | `minimal..max` | โ No |
|
|
71
|
-
| `nemotron-3-ultra-free` | Nemotron 3 Ultra (1M) | **1M** (1,000,000) | 128K | `minimal..max` | โ No |
|
|
72
|
-
| `hy3-free` | Hy3 (262K) | **262K** (262,144) | 128K | `minimal..max` | โ No |
|
|
73
|
-
| `big-pickle` | Big Pickle | **200K** (200,000) | 32K | `high, max` | โ No |
|
|
74
|
-
### KiloCode Gateway Models (14 Models)
|
|
75
|
-
|
|
76
|
-
| Model ID | Name | Context Window | Max Output | Reasoning / Thinking | Vision (Images) |
|
|
77
|
-
| :--- | :--- | :---: | :---: | :---: | :---: |
|
|
78
|
-
| `dots-studio/dots-3-note-preview:free` | Dots3-Note Preview (512K) | **512K** (512,000) | 512K | OpenRouter format | โ
Yes |
|
|
79
|
-
| `stepfun/step-3.7-flash:free` | Step 3.7 Flash | **262K** (262,144) | 262K | OpenRouter format | โ
Yes |
|
|
80
|
-
| `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free` | Nemotron 3 Nano Omni | **256K** (256,000) | 65K | OpenRouter format | โ
Yes |
|
|
81
|
-
| `nvidia/nemotron-3-ultra-550b-a55b:free` | Nemotron 3 Ultra 550B (1M) | **1M** (1,000,000) | 65K | OpenRouter format | โ No |
|
|
82
|
-
| `nvidia/nemotron-3.5-lightning:free` | Nemotron 3.5 Lightning (Kilo) | **1M** (1,000,000) | 65K | OpenRouter format | โ No |
|
|
83
|
-
| `nvidia/nemotron-3-super-120b-a12b:free` | Nemotron 3 Super 120B | **262K** (262,144) | 262K | OpenRouter format | โ No |
|
|
84
|
-
| `tencent/hy3:free` | Tencent Hy3 (Kilo) | **262K** (262,144) | 128K | OpenRouter format | โ No |
|
|
85
|
-
| `cohere/north-mini-code:free` | North Mini Code | **256K** (256,000) | 64K | OpenRouter format | โ No |
|
|
86
|
-
| `poolside/laguna-s-2.1:free` | Laguna S 2.1 (Kilo) | **262K** (262,144) | 33K | OpenRouter format | โ No |
|
|
87
|
-
| `poolside/laguna-xs-2.1:free` | Laguna XS 2.1 | **262K** (262,144) | 33K | OpenRouter format | โ No |
|
|
88
|
-
| `liquid/lfm-2.5-2.6b:free` | Liquid LFM 2.5 | **66K** (65,536) | 8K | OpenRouter format | โ No |
|
|
89
|
-
| `kilo-auto/free` | Kilo Auto | **256K** (256,000) | 10K | Standard | โ No |
|
|
90
|
-
| `openrouter/free` | OpenRouter Auto | **200K** (200,000) | 65K | Standard | โ No |
|
|
91
|
-
| `nvidia/nemotron-3.5-content-safety:free` | Nemotron Content Safety | **128K** (128,000) | 8K | Standard | โ No |
|
|
64
|
+
All `offโnull` (hidden) โ host decides budgets, not us.
|
|
92
65
|
|
|
93
66
|
---
|
|
94
67
|
|
|
95
|
-
##
|
|
68
|
+
## The magic: BYO relays, 0 rate limits
|
|
96
69
|
|
|
97
|
-
|
|
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
|
+
```
|
|
98
74
|
|
|
99
|
-
|
|
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`
|
|
100
79
|
|
|
101
|
-
|
|
102
|
-
> **Free Tier**: 100,000 requests/day ยท Low latency ยท No 25-second execution timeout.
|
|
103
|
-
|
|
104
|
-
1. Go to [dash.cloudflare.com](https://dash.cloudflare.com) $\to$ **Workers & Pages** $\to$ **Create application** $\to$ **Create Worker**.
|
|
105
|
-
2. Name your worker (e.g. `my-freeflow-relay`) $\to$ click **Deploy**.
|
|
106
|
-
3. Click **Edit code**, paste this JavaScript, and click **Save and Deploy**:
|
|
107
|
-
|
|
108
|
-
```javascript
|
|
109
|
-
const ALLOWED_TARGETS = ["https://opencode.ai", "https://api.kilo.ai"];
|
|
110
|
-
|
|
111
|
-
export default {
|
|
112
|
-
async fetch(request) {
|
|
113
|
-
if (request.method === "OPTIONS") {
|
|
114
|
-
return new Response(null, {
|
|
115
|
-
headers: {
|
|
116
|
-
"Access-Control-Allow-Origin": "*",
|
|
117
|
-
"Access-Control-Allow-Methods": "GET, POST, OPTIONS, HEAD",
|
|
118
|
-
"Access-Control-Allow-Headers": "*",
|
|
119
|
-
"Access-Control-Max-Age": "86400",
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const target = request.headers.get("x-relay-target");
|
|
125
|
-
const relayPath = request.headers.get("x-relay-path") || "/";
|
|
126
|
-
|
|
127
|
-
if (!target || !ALLOWED_TARGETS.includes(target.replace(/\/$/, ""))) {
|
|
128
|
-
return new Response(JSON.stringify({ error: "Forbidden target" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const targetUrl = target.replace(/\/$/, "") + relayPath;
|
|
132
|
-
const headers = new Headers(request.headers);
|
|
133
|
-
headers.delete("x-relay-target");
|
|
134
|
-
headers.delete("x-relay-path");
|
|
135
|
-
headers.delete("host");
|
|
136
|
-
headers.delete("cf-connecting-ip");
|
|
137
|
-
headers.delete("cf-ray");
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
const response = await fetch(targetUrl, {
|
|
141
|
-
method: request.method,
|
|
142
|
-
headers,
|
|
143
|
-
body: request.method !== "GET" && request.method !== "HEAD" ? request.body : undefined,
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
const outHeaders = new Headers(response.headers);
|
|
147
|
-
outHeaders.set("Access-Control-Allow-Origin", "*");
|
|
148
|
-
return new Response(response.body, { status: response.status, headers: outHeaders });
|
|
149
|
-
} catch (err) {
|
|
150
|
-
return new Response(JSON.stringify({ error: "Upstream failed", details: String(err) }), { status: 502, headers: { "content-type": "application/json" } });
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
```
|
|
80
|
+
**Real log (1.3.1 thin):**
|
|
155
81
|
|
|
156
|
-
4. Copy your Worker URL and register it inside OMP:
|
|
157
82
|
```text
|
|
158
|
-
|
|
83
|
+
candidates:N โ relay-A 429 rolling โ relay-B 200 in 1.2s โ 98 chunks 663KB done
|
|
159
84
|
```
|
|
160
85
|
|
|
86
|
+
You bring the relays (free tiers). We bring the rolling.
|
|
87
|
+
|
|
161
88
|
---
|
|
162
89
|
|
|
163
|
-
|
|
164
|
-
> **Free Tier**: 1,000,000 requests/month.
|
|
90
|
+
## 30-second Setup
|
|
165
91
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
171
106
|
```
|
|
172
|
-
*(Prompts for your token in-memory, provisions a private Edge Function, and adds it to your relay pool automatically).*
|
|
173
|
-
|
|
174
|
-
#### Method B: Manual Git Deploy
|
|
175
|
-
Deploy a Git repository with these 3 files:
|
|
176
|
-
* **`api/relay.js`**:
|
|
177
|
-
```javascript
|
|
178
|
-
const ALLOWED_TARGETS = ["https://opencode.ai", "https://api.kilo.ai"];
|
|
179
|
-
export const config = { runtime: "edge" };
|
|
180
|
-
export default async function handler(req) {
|
|
181
|
-
const target = req.headers.get("x-relay-target");
|
|
182
|
-
const relayPath = req.headers.get("x-relay-path") || "/";
|
|
183
|
-
if (!target || !ALLOWED_TARGETS.includes(target.replace(/\/$/, ""))) return new Response(JSON.stringify({ error: "Forbidden" }), { status: 403 });
|
|
184
|
-
const targetUrl = target.replace(/\/$/, "") + relayPath;
|
|
185
|
-
const headers = new Headers(req.headers);
|
|
186
|
-
headers.delete("x-relay-target"); headers.delete("x-relay-path"); headers.delete("host");
|
|
187
|
-
const response = await fetch(targetUrl, { method: req.method, headers, body: req.method !== "GET" && req.method !== "HEAD" ? req.body : undefined, duplex: "half" });
|
|
188
|
-
return new Response(response.body, { status: response.status, headers: response.headers });
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
* **`package.json`**: `{ "name": "freeflow-relay", "version": "1.0.0" }`
|
|
192
|
-
* **`vercel.json`**: `{ "rewrites": [{ "source": "/(.*)", "destination": "/api/relay" }] }`
|
|
193
107
|
|
|
194
|
-
|
|
108
|
+
### 2. Pick a model
|
|
195
109
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
2
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
const ALLOWED_TARGETS = ["https://opencode.ai", "https://api.kilo.ai"];
|
|
204
|
-
|
|
205
|
-
Deno.serve(async (req) => {
|
|
206
|
-
if (req.method === "OPTIONS") {
|
|
207
|
-
return new Response(null, {
|
|
208
|
-
headers: {
|
|
209
|
-
"Access-Control-Allow-Origin": "*",
|
|
210
|
-
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
211
|
-
"Access-Control-Allow-Headers": "*",
|
|
212
|
-
},
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const target = req.headers.get("x-relay-target");
|
|
217
|
-
const relayPath = req.headers.get("x-relay-path") || "/";
|
|
218
|
-
if (!target || !ALLOWED_TARGETS.includes(target.replace(/\/$/, ""))) {
|
|
219
|
-
return new Response(JSON.stringify({ error: "Forbidden target" }), { status: 403 });
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const targetUrl = target.replace(/\/$/, "") + relayPath;
|
|
223
|
-
const headers = new Headers(req.headers);
|
|
224
|
-
headers.delete("x-relay-target");
|
|
225
|
-
headers.delete("x-relay-path");
|
|
226
|
-
headers.delete("host");
|
|
227
|
-
|
|
228
|
-
const response = await fetch(targetUrl, {
|
|
229
|
-
method: req.method,
|
|
230
|
-
headers,
|
|
231
|
-
body: req.method !== "GET" && req.method !== "HEAD" ? req.body : undefined,
|
|
232
|
-
});
|
|
233
|
-
return new Response(response.body, { status: response.status, headers: response.headers });
|
|
234
|
-
});
|
|
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"
|
|
235
115
|
```
|
|
236
|
-
3. Click **Deploy** and copy your Deno project URL (`https://project-name.deno.dev`).
|
|
237
116
|
|
|
238
|
-
|
|
117
|
+
### 3. (Optional but ๐ฅ) Add your free relays โ BYO, scale as you add
|
|
239
118
|
|
|
240
|
-
|
|
119
|
+
**One Cloudflare Worker (100k req/day, no 25s timeout):**
|
|
241
120
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
/freeflow
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Check pooling:**
|
|
132
|
+
|
|
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
|
|
252
137
|
```
|
|
253
138
|
|
|
139
|
+
Done. Subagents now follow parent proxy โ `Unable to connect` is history.
|
|
140
|
+
|
|
254
141
|
---
|
|
255
142
|
|
|
256
|
-
##
|
|
143
|
+
## Thin vs Fat
|
|
257
144
|
|
|
258
|
-
|
|
259
|
-
|
|
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** |
|
|
260
151
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
152
|
+
Result: **<500 LOC core, 29 tests PASS, typecheck PASS**.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## FAQ
|
|
157
|
+
|
|
158
|
+
**Do I need API keys?** No. `Kilo` uses `Bearer kilo-free`, `OpenCode` uses `opencodeHeaders()`.
|
|
159
|
+
|
|
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:**
|
|
265
173
|
|
|
266
|
-
### Zero Configuration Required
|
|
267
|
-
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.
|
|
268
|
-
### Live Logs
|
|
269
174
|
```bash
|
|
270
|
-
|
|
175
|
+
omp plugin install pi-freeflow && omp --model freeflow/muse-spark-1.2-contributor-free --thinking max "make it sell"
|
|
271
176
|
```
|
|
272
177
|
|
|
273
178
|
---
|
|
274
179
|
|
|
275
|
-
##
|
|
180
|
+
## License
|
|
276
181
|
|
|
277
|
-
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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-freeflow",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.3",
|
|
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",
|