pi-free 2.0.15 โ 2.1.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 +100 -3
- package/README.md +64 -79
- package/banner.svg +21 -36
- package/config.ts +123 -9
- package/constants.ts +3 -9
- package/index.ts +14 -15
- package/lib/built-in-toggle.ts +29 -56
- package/lib/json-persistence.ts +90 -22
- package/lib/logger.ts +21 -12
- package/lib/model-detection.ts +2 -12
- package/lib/model-enhancer.ts +11 -2
- package/lib/model-metadata.ts +387 -0
- package/lib/open-browser.ts +74 -24
- package/lib/paths.ts +90 -0
- package/lib/probe-cache.ts +19 -19
- package/lib/provider-cache.ts +74 -28
- package/lib/provider-compat.ts +53 -37
- package/lib/provider-probe.ts +188 -0
- package/lib/registry.ts +1 -5
- package/lib/session-start-metrics.ts +46 -0
- package/lib/telemetry.ts +115 -86
- package/lib/types.ts +22 -2
- package/lib/util.ts +80 -21
- package/package.json +7 -2
- package/provider-failover/benchmark-lookup.ts +17 -5
- package/provider-helper.ts +12 -27
- package/providers/cline/cline-models.ts +7 -1
- package/providers/cline/cline-xml-bridge.ts +1471 -0
- package/providers/cline/cline.ts +67 -199
- package/providers/codestral/codestral.ts +0 -11
- package/providers/crofai/crofai.ts +6 -1
- package/providers/deepinfra/deepinfra.ts +69 -2
- package/providers/dynamic-built-in/index.ts +237 -22
- package/providers/kilo/kilo-models.ts +3 -1
- package/providers/kilo/kilo.ts +270 -60
- package/providers/model-fetcher.ts +18 -55
- package/providers/novita/novita.ts +69 -2
- package/providers/ollama/ollama.ts +47 -36
- package/providers/opencode-session.ts +67 -2
- package/providers/routeway/routeway.ts +25 -17
- package/providers/sambanova/sambanova.ts +67 -1
- package/providers/together/together.ts +69 -2
- package/providers/tokenrouter/tokenrouter.ts +634 -0
- package/providers/zenmux/zenmux.ts +6 -1
- package/scripts/check-extensions.mjs +32 -16
- package/providers/nvidia/nvidia.ts +0 -510
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,103 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.1.1] - 2026-06-15
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Cline XML bridge**:
|
|
15
|
+
- Preserve JSON file content as string in `write_to_file` XML โ prevents file bodies from being parsed as JSON objects and corrupted ([#244](https://github.com/apmantza/pi-free/pull/244)).
|
|
16
|
+
- Recover heredoc file writes (Model `cat << 'EOF'` pattern in `execute_command`) as `write`/`write_to_file` tool calls ([#246](https://github.com/apmantza/pi-free/pull/246)).
|
|
17
|
+
- Recover XML tool calls from the reasoning stream when MiMo nests tools inside thinking blocks ([#249](https://github.com/apmantza/pi-free/pull/249)).
|
|
18
|
+
- Surface reasoning-only responses: when MiMo puts the entire answer in reasoning with no visible text, surface it as best-effort visible output instead of a blank stop ([#251](https://github.com/apmantza/pi-free/pull/251)).
|
|
19
|
+
- Strip Unicode math-italic XML tag decorations (`<๐๐๐ก๐๐:thinking>`, `<๐๐๐ก๐๐:read_file>`) that MiMo emits instead of standard Cline XML tags ([#252](https://github.com/apmantza/pi-free/pull/252)).
|
|
20
|
+
- Hide internal planning phrases and restrict hidden-tool recovery to the reasoning channel only โ never leak raw LLM planning as user-visible text ([#252](https://github.com/apmantza/pi-free/pull/252)).
|
|
21
|
+
- Retry MiMo stream errors with reasoning disabled on the second attempt ([#252](https://github.com/apmantza/pi-free/pull/252)).
|
|
22
|
+
- Parse MiMo Pi SDK `<function=name>` tool-call syntax directly โ no double conversion through Cline XML ([#255](https://github.com/apmantza/pi-free/pull/255)).
|
|
23
|
+
- Auto-retry reasoning-only MiMo responses with a "continue" nudge instead of showing a dead-end error to the user ([#256](https://github.com/apmantza/pi-free/pull/256)).
|
|
24
|
+
|
|
25
|
+
- **TokenRouter**:
|
|
26
|
+
- Patch nested MiniMax `<think>` blocks that appear inside `reasoning_content` deltas ([#247](https://github.com/apmantza/pi-free/pull/247)).
|
|
27
|
+
- Scope MiniMax thinking patches to active MiniMax models only, avoiding interference with other model families ([#248](https://github.com/apmantza/pi-free/pull/248)).
|
|
28
|
+
- Patch MiniMax payloads in the stream wrapper to prevent malformed SSE from breaking the parser ([#250](https://github.com/apmantza/pi-free/pull/250)).
|
|
29
|
+
- Retry high-load 2064 errors from TokenRouter with automatic backoff ([#254](https://github.com/apmantza/pi-free/pull/254)).
|
|
30
|
+
|
|
31
|
+
- **UI**: Remove provider-count footer status text unconditionally โ reduces status bar clutter ([#245](https://github.com/apmantza/pi-free/pull/245)).
|
|
32
|
+
|
|
33
|
+
## [2.1.0] - 2026-06-15
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **Cline XML tool bridge** โ Replaced Cline's native OpenAI tool-message path with a custom `streamSimple` XML bridge. Cline-trained models now receive Cline-style XML tool instructions and emit XML tool calls that pi-free converts back to Pi `toolCall` blocks. This fixes strict upstream errors such as `Tool message must have tool_call_id` and `missing field "tool_call_id"` on models like `xiaomi/mimo-v2.5` and `nex-agi/nex-n2-pro:free` ([#232](https://github.com/apmantza/pi-free/pull/232)).
|
|
38
|
+
|
|
39
|
+
- **Cline-native tool name mapping** โ The XML bridge maps Cline-native tool names to Pi runtime tools:
|
|
40
|
+
- `read_file` โ `read`
|
|
41
|
+
- `write_to_file` โ `write`
|
|
42
|
+
- `replace_in_file` โ `edit` (supports multi-block SEARCH/REPLACE diffs as one Pi `edit` call with multiple edits)
|
|
43
|
+
- `execute_command` โ `bash`
|
|
44
|
+
- `list_files`, `search_files`, `list_code_definition_names` โ `bash` (safe command generation)
|
|
45
|
+
- Unknown Pi tools pass through by their original names ([#235](https://github.com/apmantza/pi-free/pull/235), [#237](https://github.com/apmantza/pi-free/pull/237)).
|
|
46
|
+
|
|
47
|
+
- **Cline XML thinking-tag hardening** โ Strips `<thinking>...</thinking>` blocks, orphan `</thinking>` close tags, and dangling planning text before tool parsing, so Cline models don't emit visible plan text instead of tool calls ([#239](https://github.com/apmantza/pi-free/pull/239), [#240](https://github.com/apmantza/pi-free/pull/240)).
|
|
48
|
+
|
|
49
|
+
- **Live Cline smoke test** โ Added `npm run smoke:cline` gated test that hits the real Cline API and verifies Cline `read_file` XML is converted into a Pi `read` tool call ([#232](https://github.com/apmantza/pi-free/pull/232)).
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- **TokenRouter MiniMax-M3 `<think>` leak** โ The model sometimes emits DeepSeek-style `<think>` reasoning tags inline in assistant text. Added a `message_end` handler scoped to TokenRouter that extracts these blocks (including unclosed dangling tags) and promotes them to proper `ThinkingContent`, so Pi renders them as reasoning instead of visible text ([#243](https://github.com/apmantza/pi-free/pull/243)).
|
|
54
|
+
|
|
55
|
+
- **TokenRouter provider** โ OpenAI-compatible API gateway at `api.tokenrouter.com/v1` with 88 text chat models. 1 free via hardcoded `KNOWN_FREE_MODELS` + 1 `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free` model. Set `TOKENROUTER_API_KEY` or add `tokenrouter_api_key` to `~/.pi/free.json` ([#222](https://github.com/apmantza/pi-free/pull/222)).
|
|
56
|
+
|
|
57
|
+
- **Generic probe system** โ New `lib/provider-probe.ts` factory `createProviderProbe()` handles batching, probe-cache integration, auto-hiding, and re-registration. Enables consistent probe commands across providers ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
58
|
+
|
|
59
|
+
- **Probe commands** โ New `/probe-deepinfra`, `/probe-sambanova`, `/probe-together`, `/probe-novita` commands test model availability and auto-hide broken models ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
60
|
+
|
|
61
|
+
- **OpenCode probe commands** โ `/probe-opencode` and `/probe-opencode-go` detect expired free promotions (reports only, no auto-hide) ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
62
|
+
|
|
63
|
+
- **Session timing metrics** โ `wrapSessionStartHandler()` logs wall-clock time per handler in `lib/session-start-metrics.ts`. Wrapped: cline, kilo, routeway, built-in-toggle, dynamic-built-in auto-probe ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
|
|
67
|
+
- **Refactored `recordModelCall` signature** โ Replaced 5 positional args with an options object (`RecordModelCallOptions`) for `success`, `stopReason`, and `errorMessage` ([#221](https://github.com/apmantza/pi-free/pull/221)).
|
|
68
|
+
|
|
69
|
+
- **Extracted `sleep` helper and simplified `cleanModelName`** โ Shared utilities in `lib/util.ts` ([#221](https://github.com/apmantza/pi-free/pull/221)).
|
|
70
|
+
|
|
71
|
+
- **Cleanup pass on `lib/` utilities (Sprint B)** โ 8 categories of code-quality refactors in [#224](https://github.com/apmantza/pi-free/pull/224):
|
|
72
|
+
- `open-browser.ts`: `rundll32 url.dll,FileProtocolHandler` replaces `cmd /c start` (CodeQL fix) + strict URL validation (`isSafeUrl`)
|
|
73
|
+
- `logger.ts`: `parseLogLevel()` validates `LOG_LEVEL` / `PI_FREE_LOG_LEVEL` env vars
|
|
74
|
+
- `telemetry.ts`: 1h TTL cleanup for `_inFlight` map; migrated to `createJSONStore` (drops ~80 LOC of `load`/`save`/`Lock` boilerplate)
|
|
75
|
+
- `util.ts`: `OpenAIModelCallbacks` parameter decouples `fetchOpenAICompatibleModels` from `lib/provider-compat.ts` (DIP fix)
|
|
76
|
+
- `provider-compat.ts`: extracted `isDeepSeekStyleModel()` and `isKimiModel()` predicates + new `KIMI_PROXY_COMPAT` constant
|
|
77
|
+
- `model-detection.ts`: removed duplicate `isModelFree` (canonical `isFreeModel` in `registry.ts` already exists)
|
|
78
|
+
- `registry.ts`: removed dead `_pi` parameter from `applyGlobalFilter`
|
|
79
|
+
- `built-in-toggle.ts`: lazy `_opencodeSession` initialisation (only created when an OpenCode provider is actually captured)
|
|
80
|
+
|
|
81
|
+
### Removed
|
|
82
|
+
|
|
83
|
+
- **NVIDIA NIM provider** โ Now a built-in Pi provider. Set `NVIDIA_API_KEY` to use directly. Removed `providers/nvidia/`, constants, config re-exports, and tests ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
84
|
+
|
|
85
|
+
### Security
|
|
86
|
+
|
|
87
|
+
- **CI/release hardening** โ Added production dependency audit, lockfile drift check, tarball content/artifact verification, installed entry smoke-load, and pinned-action workflows. Added Dependabot config for npm and GitHub Actions. Hardened helper scripts against PATH-lookup Sonar hotspots by resolving `npm` and `tar` to fixed locations (#236).
|
|
88
|
+
|
|
89
|
+
- **open-browser: `rundll32` + strict URL validation** โ Replaced `cmd /c start "" <url>` with `rundll32 url.dll,FileProtocolHandler <url>` to fix GitHub Advanced Security CodeQL `js/uncontrolled-command-line` (Critical). rundll32 does NOT parse the command line, so the URL is handed to ShellExecute as a literal. Defense-in-depth: `isSafeUrl()` allows only `http`/`https`, rejects control characters, malformed URLs, and overlong URLs (>2048 chars) ([#223](https://github.com/apmantza/pi-free/pull/223), [#224](https://github.com/apmantza/pi-free/pull/224)).
|
|
90
|
+
|
|
91
|
+
- **Path-validate env-var file overrides** โ New `lib/paths.ts` centralises `PI_DATA_DIR`, `ensureDir()`, and `resolveSafeDataFile()` (rejects path separators, null bytes, dot-only, >128-char). Applied to `PI_FREE_LOG_PATH`, `PI_FREE_PROVIDER_CACHE`, `PI_FREE_TELEMETRY_FILE` ([#223](https://github.com/apmantza/pi-free/pull/223)).
|
|
92
|
+
|
|
93
|
+
- **json-persistence: lock `save`/`load` + atomic `update()`** โ `Lock` mutex serialises RMW operations. `clearProviderCache` / `clearAllProviderCaches` now async, use `_cache.update()` ([#218](https://github.com/apmantza/pi-free/pull/218), [#223](https://github.com/apmantza/pi-free/pull/223)).
|
|
94
|
+
|
|
95
|
+
- **JSONL `append`/`clear` lock** โ `createJSONLStore` operations are now async and lock-serialised, preventing `clear` from truncating mid-`append` ([#223](https://github.com/apmantza/pi-free/pull/223)).
|
|
96
|
+
|
|
97
|
+
- **telemetry: concurrent-write safety** โ `Lock` mutex around telemetry writes; `recordModelCall` and `clearTelemetry` are now async and serialized. File path overridable via `PI_FREE_TELEMETRY_FILE` ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
98
|
+
|
|
99
|
+
- **provider-cache: isolated copies** โ `loadProviderCache` returns `structuredClone(cached.models)`; `saveProviderCache` uses `update()` for atomic RMW ([#218](https://github.com/apmantza/pi-free/pull/218)).
|
|
100
|
+
|
|
101
|
+
- **provider-probe: config RMW lock** โ `config.ts` `updateConfig()` uses internal `ConfigLock` (promise-chained mutex); provider-probe auto-hide now uses it ([#223](https://github.com/apmantza/pi-free/pull/223)).
|
|
102
|
+
|
|
103
|
+
- **Prototype pollution reviver** โ `safeJsonReviver()` strips `__proto__` / `constructor` keys at every `JSON.parse` level. Applied in `lib/json-persistence.ts`, `config.ts`, `lib/telemetry.ts` ([#223](https://github.com/apmantza/pi-free/pull/223)).
|
|
104
|
+
|
|
105
|
+
- **Log sanitization** โ `scripts/update-benchmarks.ts` now sanitizes external API data before passing to `console.log`/error, preventing log injection (SonarCloud S5693) ([#219](https://github.com/apmantza/pi-free/pull/219)).
|
|
106
|
+
|
|
10
107
|
## [2.0.15] - 2026-06-02
|
|
11
108
|
|
|
12
109
|
### Fixed
|
|
@@ -275,9 +372,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
275
372
|
- If ANY model has cost > 0, assumes pricing exposed โ uses Route A
|
|
276
373
|
- All providers (Cline, Kilo, NVIDIA, Ollama, dynamic built-in) now use this consistent helper
|
|
277
374
|
|
|
278
|
-
- **CrofAI provider (PAID)** โ Added new **paid** provider for CrofAI (https://crof.ai), an OpenAI-compatible LLM inference API. **Note: CrofAI is a paid provider** โ users must have a CrofAI API key with credits. The provider uses Route B detection (name-only) since CrofAI's API doesn't expose per-model pricing. Only models with `"free"` in their names are marked as free (none currently).
|
|
375
|
+
- **CrofAI provider (PAID)** โ Added new **paid** provider for CrofAI (<https://crof.ai>), an OpenAI-compatible LLM inference API. **Note: CrofAI is a paid provider** โ users must have a CrofAI API key with credits. The provider uses Route B detection (name-only) since CrofAI's API doesn't expose per-model pricing. Only models with `"free"` in their names are marked as free (none currently).
|
|
279
376
|
|
|
280
|
-
- **ZenMux provider (PAID)** โ Added new **paid** provider for ZenMux AI gateway (https://zenmux.ai), a unified API for 200+ models from OpenAI, Anthropic, Google, etc. **Note: ZenMux is a paid provider** โ users must have a ZenMux API key with credits. The provider uses Route A detection (OR logic) since ZenMux exposes pricing. Models marked as free only if `cost === 0` OR `"free"` in name (2 free models identified: GLM 4.7 Flash Free, GLM 4.6v Flash Free).
|
|
377
|
+
- **ZenMux provider (PAID)** โ Added new **paid** provider for ZenMux AI gateway (<https://zenmux.ai>), a unified API for 200+ models from OpenAI, Anthropic, Google, etc. **Note: ZenMux is a paid provider** โ users must have a ZenMux API key with credits. The provider uses Route A detection (OR logic) since ZenMux exposes pricing. Models marked as free only if `cost === 0` OR `"free"` in name (2 free models identified: GLM 4.7 Flash Free, GLM 4.6v Flash Free).
|
|
281
378
|
|
|
282
379
|
- **Comprehensive `isFreeModel` test suite** โ Added 30+ unit tests covering Route A, Route B, freemium behavior, and edge cases. Tests verify correct classification on actual OpenRouter API data (371 models, 30 free).
|
|
283
380
|
|
|
@@ -479,7 +576,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
479
576
|
- **$0.011 per 1,000 Neurons** beyond free allocation
|
|
480
577
|
- Only requires `CLOUDFLARE_API_TOKEN` โ account ID auto-derived from token
|
|
481
578
|
- Toggle with `/cloudflare-toggle`
|
|
482
|
-
- Create token at https://dash.cloudflare.com/profile/api-tokens
|
|
579
|
+
- Create token at <https://dash.cloudflare.com/profile/api-tokens>
|
|
483
580
|
|
|
484
581
|
- **Unified dynamic built-in providers module** โ New `providers/dynamic-built-in/` module that dynamically fetches models from Pi's built-in providers when users have API keys:
|
|
485
582
|
- **Mistral** (`MISTRAL_API_KEY`) โ Fetches from `api.mistral.ai/v1/models`
|
package/README.md
CHANGED
|
@@ -14,19 +14,21 @@ Free and paid AI model providers for [Pi](https://pi.dev). Access **free and pai
|
|
|
14
14
|
|
|
15
15
|
When you install pi-free, it:
|
|
16
16
|
|
|
17
|
-
1. **Registers free-tier providers** with Pi's model picker โ Kilo (free), Cline (free),
|
|
17
|
+
1. **Registers free-tier providers** with Pi's model picker โ Kilo (free), Cline (free), LLM7 (free), TokenRouter (1 free model), ZenMux (paid), CrofAI (paid), Ollama Cloud (freemium), SambaNova (freemium), Codestral (freemium), DeepInfra (trial credit), Together AI (trial credit), Novita (paid), Routeway (paid), and more
|
|
18
18
|
|
|
19
|
-
2. **
|
|
19
|
+
2. **Captures Pi's built-in OpenCode and OpenRouter providers** with a free/paid toggle โ OpenCode and OpenRouter are now built into Pi; pi-free adds `/toggle-opencode` and `/toggle-openrouter` so you can switch between free-only and all models without restart
|
|
20
20
|
|
|
21
|
-
3. **
|
|
21
|
+
3. **Fetches models dynamically** from provider APIs โ ZenMux, CrofAI, and Pi's built-in providers (Mistral, Groq, Cerebras, xAI, Hugging Face, OpenRouter) when API keys are configured
|
|
22
22
|
|
|
23
|
-
4. **
|
|
23
|
+
4. **Filters to show only free models by default** for providers that expose pricing โ You see only the models that cost $0 to use. Paid models are hidden until you explicitly toggle them on.
|
|
24
24
|
|
|
25
|
-
5. **
|
|
25
|
+
5. **Provides per-provider toggle commands** โ Run `/toggle-{provider}` (e.g., `/toggle-kilo`) to switch between free-only mode and showing all models including paid ones. Changes apply immediately and your preference is saved for the next Pi restart.
|
|
26
26
|
|
|
27
|
-
6. **
|
|
27
|
+
6. **Handles authentication for you** โ OAuth flows (Kilo, Cline) open your browser automatically; API keys are read from `~/.pi/free.json` or environment variables
|
|
28
28
|
|
|
29
|
-
7. **
|
|
29
|
+
7. **Adds Coding Index scores** โ Model names include a coding benchmark score (CI: 45.2) to help you pick capable coding models at a glance
|
|
30
|
+
|
|
31
|
+
8. **Persists your preferences** โ Your toggle choices (free vs all models) are saved to `~/.pi/free.json` and remembered across Pi restarts
|
|
30
32
|
|
|
31
33
|
---
|
|
32
34
|
|
|
@@ -50,21 +52,22 @@ Free models are shown by default โ look for the provider prefixes:
|
|
|
50
52
|
- `openrouter/` โ OpenRouter models (free account required)
|
|
51
53
|
- `cline/` โ Cline models (run `/login cline` to use)
|
|
52
54
|
- `llm7/` โ LLM7 gateway models (free tier: default/fast selectors, 100 req/hr)
|
|
55
|
+
- `tokenrouter/` โ TokenRouter gateway (1 free model: `MiniMax-M3`; requires API key with credits for the rest)
|
|
53
56
|
|
|
54
57
|
**๐ Freemium (free tier with limits, then paid):**
|
|
55
58
|
|
|
56
|
-
- `nvidia/` โ NVIDIA NIM models (1,000 free requests/month, then credits)
|
|
57
59
|
- `ollama-cloud/` โ Ollama Cloud models (usage-based free tier, resets every 5 hours + 7 days)
|
|
58
60
|
- `sambanova/` โ SambaNova Cloud models (20-480 RPM free, no credit card required)
|
|
61
|
+
- `codestral/` โ Codestral via Mistral (free Experiment plan: 2 req/min, 1B tokens/month)
|
|
59
62
|
|
|
60
63
|
**๐ณ Paid Providers (API key with credits required):**
|
|
61
64
|
|
|
62
65
|
- `zenmux/` โ ZenMux AI gateway (200+ models from OpenAI, Anthropic, Google, etc.)
|
|
63
66
|
- `crofai/` โ CrofAI OpenAI-compatible API (streaming, reasoning models)
|
|
64
|
-
- `codestral/` โ Codestral via Mistral (free Experiment plan: 2 req/min, 1B tokens/month)
|
|
65
67
|
- `deepinfra/` โ DeepInfra inference cloud ($5 one-time trial credit, no credit card)
|
|
66
68
|
- `novita/` โ Novita AI (100+ open-source models, OpenAI-compatible, 3 free models)
|
|
67
69
|
- `routeway/` โ Routeway AI gateway (OpenAI-compatible, `:free` models)
|
|
70
|
+
- `together/` โ Together AI ($1 one-time trial credit, 200+ open-source models)
|
|
68
71
|
|
|
69
72
|
> **Note:** Paid providers may occasionally offer free models or promotional credits. The `isFreeModel` helper automatically detects free models based on provider pricing data or model names containing "free". For providers that don't expose pricing (like CrofAI), only models with "free" in their names are marked as free.
|
|
70
73
|
|
|
@@ -78,7 +81,7 @@ Free models are shown by default โ look for the provider prefixes:
|
|
|
78
81
|
- `openrouter/` โ OpenRouter models (fetched from openrouter.ai, when `OPENROUTER_API_KEY` set)
|
|
79
82
|
- `fastrouter/` โ FastRouter models (always discovered, 170+ models, no auth for listing)
|
|
80
83
|
|
|
81
|
-
**Note:** Fireworks
|
|
84
|
+
**Note:** Fireworks and NVIDIA NIM are now [built-in Pi providers](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/CHANGELOG.md#0681---2026-04-22) โ no extension needed. Set `FIREWORKS_API_KEY` or `NVIDIA_API_KEY` to use them directly.
|
|
82
85
|
|
|
83
86
|
### 3. Toggle between free and paid models
|
|
84
87
|
|
|
@@ -87,8 +90,8 @@ Want to see paid models too? Run the toggle command for your provider:
|
|
|
87
90
|
```
|
|
88
91
|
/toggle-kilo # Toggle Kilo (โ
offers free models)
|
|
89
92
|
/toggle-openrouter # Toggle OpenRouter (โ
offers free models)
|
|
93
|
+
/toggle-opencode # Toggle OpenCode (โ
offers free models)
|
|
90
94
|
/toggle-cline # Toggle Cline (โ
offers free models)
|
|
91
|
-
/toggle-nvidia # Toggle NVIDIA (๐ freemium)
|
|
92
95
|
/toggle-ollama # Toggle Ollama Cloud (๐ freemium)
|
|
93
96
|
/toggle-mistral # Toggle Mistral (๐ง dynamic - needs API key)
|
|
94
97
|
/toggle-groq # Toggle Groq (๐ง dynamic - needs API key)
|
|
@@ -97,7 +100,7 @@ Want to see paid models too? Run the toggle command for your provider:
|
|
|
97
100
|
/toggle-huggingface # Toggle Hugging Face (๐ง dynamic - needs HF_TOKEN)
|
|
98
101
|
/toggle-zenmux # Toggle ZenMux (๐ณ paid - needs API key with credits)
|
|
99
102
|
/toggle-crofai # Toggle CrofAI (๐ณ paid - needs API key with credits)
|
|
100
|
-
/toggle-codestral # Toggle Codestral (
|
|
103
|
+
/toggle-codestral # Toggle Codestral (๐ free Experiment plan)
|
|
101
104
|
/toggle-deepinfra # Toggle DeepInfra (๐ณ trial credit provider)
|
|
102
105
|
/toggle-together # Toggle Together AI (๐ณ trial credit provider)
|
|
103
106
|
/toggle-sambanova # Toggle SambaNova (๐ freemium)
|
|
@@ -105,6 +108,7 @@ Want to see paid models too? Run the toggle command for your provider:
|
|
|
105
108
|
/toggle-novita # Toggle Novita AI (๐ณ paid โ 3 free models)
|
|
106
109
|
/toggle-routeway # Toggle Routeway AI (๐ณ paid โ has :free models)
|
|
107
110
|
/toggle-fastrouter # Toggle FastRouter (๐ง dynamic โ always discovered)
|
|
111
|
+
/toggle-tokenrouter # Toggle TokenRouter (๐ณ paid โ 1 free model)
|
|
108
112
|
```
|
|
109
113
|
|
|
110
114
|
**Notes:**
|
|
@@ -126,7 +130,6 @@ Add your API keys to this file:
|
|
|
126
130
|
|
|
127
131
|
```json
|
|
128
132
|
{
|
|
129
|
-
"nvidia_api_key": "nvapi-...",
|
|
130
133
|
"ollama_api_key": "...",
|
|
131
134
|
"mistral_api_key": "...",
|
|
132
135
|
"codestral_api_key": "...",
|
|
@@ -139,7 +142,7 @@ Add your API keys to this file:
|
|
|
139
142
|
}
|
|
140
143
|
```
|
|
141
144
|
|
|
142
|
-
Or set environment variables instead (same names, uppercase: `OPENROUTER_API_KEY`, `
|
|
145
|
+
Or set environment variables instead (same names, uppercase: `OPENROUTER_API_KEY`, `OLLAMA_API_KEY`, etc.)
|
|
143
146
|
|
|
144
147
|
If `~/.pi/free.json` contains invalid JSON, pi-free now logs the parse error to `~/.pi/free.log` so you can fix the file quickly.
|
|
145
148
|
|
|
@@ -147,27 +150,35 @@ See the [Providers That Need Authentication](#providers-that-need-authentication
|
|
|
147
150
|
|
|
148
151
|
### 5. Quick commands reference
|
|
149
152
|
|
|
150
|
-
| Command
|
|
151
|
-
|
|
|
152
|
-
| `/toggle-{provider}`
|
|
153
|
-
| `/toggle-free`
|
|
154
|
-
| `/free-providers`
|
|
155
|
-
| `/
|
|
156
|
-
| `/
|
|
157
|
-
| `/
|
|
158
|
-
| `/
|
|
153
|
+
| Command | What it does |
|
|
154
|
+
| -------------------------- | --------------------------------------------------------- |
|
|
155
|
+
| `/toggle-{provider}` | Switch between free-only and all models for that provider |
|
|
156
|
+
| `/toggle-free` | Toggle global free-only mode for ALL providers |
|
|
157
|
+
| `/free-providers` | Show free/paid model counts for all providers |
|
|
158
|
+
| `/free-telemetry` | Show real-world performance data (tokens/s, latency, success rate) for free models |
|
|
159
|
+
| `/clear-free-telemetry` | Clear all stored telemetry data |
|
|
160
|
+
| `/login kilo` | Start OAuth flow for Kilo |
|
|
161
|
+
| `/login cline` | Start OAuth flow for Cline |
|
|
162
|
+
| `/logout kilo` | Clear Kilo OAuth credentials |
|
|
163
|
+
| `/logout cline` | Clear Cline OAuth credentials |
|
|
159
164
|
|
|
160
165
|
---
|
|
161
166
|
|
|
162
167
|
## Features
|
|
163
168
|
|
|
164
|
-
### ๐
|
|
169
|
+
### ๐ Model Availability Probing
|
|
170
|
+
|
|
171
|
+
Some provider APIs list models that return errors when you try to use them (expired free promotions, decommissioned models, server spin-down). pi-free automatically detects and hides broken models:
|
|
165
172
|
|
|
166
|
-
|
|
173
|
+
- **Ollama Cloud**: `/probe-ollama` โ probes for 403 errors, auto-hides inaccessible models
|
|
174
|
+
- **Routeway**: `/probe-routeway` โ probes for 5xx/404 errors, auto-hides broken models
|
|
175
|
+
- **OpenCode**: `/probe-opencode`, `/probe-opencode-go` โ probes for expired free promotions (reports only, no auto-hide)
|
|
176
|
+
- **DeepInfra**: `/probe-deepinfra` โ probes for 404/5xx errors, auto-hides broken models
|
|
177
|
+
- **SambaNova**: `/probe-sambanova` โ probes for 404/5xx errors, auto-hides broken models
|
|
178
|
+
- **Together AI**: `/probe-together` โ probes for 404/5xx errors, auto-hides broken models
|
|
179
|
+
- **Novita AI**: `/probe-novita` โ probes for 404/5xx errors, auto-hides broken models
|
|
167
180
|
|
|
168
|
-
|
|
169
|
-
- **Auto-discovery from NVIDIA's API** โ Queries `integrate.api.nvidia.com/v1/models` directly for the ground-truth list
|
|
170
|
-
- **`/probe-nvidia` command** โ On-demand health check: tests every model with a minimal request, auto-hides new 404s, and re-registers immediately
|
|
181
|
+
All probes use a **24-hour probe cache** to avoid re-checking recently-verified models. Run any probe command manually to force a full re-check, or let the lazy auto-probe on first `session_start` handle it.
|
|
171
182
|
|
|
172
183
|
### ๐ฏ Coding Index (CI) Scores
|
|
173
184
|
|
|
@@ -175,13 +186,13 @@ Every model shows a **Coding Index score** (e.g., `CI: 52.3`) in the model picke
|
|
|
175
186
|
|
|
176
187
|
- **Benchmark-based** โ Scores derived from Artificial Analysis coding benchmarks (HumanEval, MBPP, etc.)
|
|
177
188
|
- **Quality indicator** โ Higher scores = better coding performance
|
|
178
|
-
- **All providers** โ Applied to every model from every provider (
|
|
189
|
+
- **All providers** โ Applied to every model from every provider (Mistral, Groq, Cerebras, etc.)
|
|
179
190
|
|
|
180
191
|
**Missing CI scores?** Provider model IDs often don't match benchmark database keys exactly. pi-free applies provider-specific normalization to improve matching:
|
|
181
192
|
|
|
182
193
|
| Provider | Normalization Applied |
|
|
183
194
|
| ------------ | ------------------------------------------------------------------ |
|
|
184
|
-
| **
|
|
195
|
+
| **Fireworks** | Strips vendor prefixes (`meta/`, `mistralai/`, `microsoft/`, etc.) |
|
|
185
196
|
| **Groq** | Removes `-versatile` and numeric suffixes (`-32768`) |
|
|
186
197
|
| **Cerebras** | Normalizes `llama3.1` โ `llama-3.1`, adds `instruct` suffix |
|
|
187
198
|
| **Mistral** | Strips `-latest` suffix |
|
|
@@ -194,6 +205,7 @@ Every model shows a **Coding Index score** (e.g., `CI: 52.3`) in the model picke
|
|
|
194
205
|
Providers have different pricing models. pi-free handles them all:
|
|
195
206
|
|
|
196
207
|
- **Free-only by default** โ Shows only zero-cost models initially
|
|
208
|
+
- **Auto-probe on session_start** โ Lazy background probes detect broken models automatically on your first session; no manual command needed
|
|
197
209
|
- **Per-provider toggles** โ Run `/toggle-{provider}` to switch between "free only" vs "all models"
|
|
198
210
|
- **Persists across sessions** โ Your preference is saved to `~/.pi/free.json`
|
|
199
211
|
- **Instant updates** โ Changes apply immediately; no Pi restart needed
|
|
@@ -201,7 +213,7 @@ Providers have different pricing models. pi-free handles them all:
|
|
|
201
213
|
**Provider types:**
|
|
202
214
|
|
|
203
215
|
- โ
**Free providers** (Kilo, Cline) โ Toggle between free-only vs paid models
|
|
204
|
-
- ๐ **Freemium** (
|
|
216
|
+
- ๐ **Freemium** (Ollama, SambaNova) โ Free tier with limits, toggle shows all
|
|
205
217
|
- ๐ง **Dynamic API** (Mistral, Groq, Cerebras, xAI) โ Fetched when API key configured, toggle filters the list
|
|
206
218
|
|
|
207
219
|
### ๐ OAuth + API Key Handling
|
|
@@ -283,44 +295,9 @@ Then use `/toggle-openrouter` to switch between free-only and all models.
|
|
|
283
295
|
|
|
284
296
|
**Note:** `openrouter_api_key` in `~/.pi/free.json` is ignored. OpenRouter always reads from Pi's auth system to avoid stale keys.
|
|
285
297
|
|
|
286
|
-
### NVIDIA NIM (
|
|
287
|
-
|
|
288
|
-
NVIDIA provides **free monthly credits** (1000 requests/month) at [build.nvidia.com](https://build.nvidia.com).
|
|
289
|
-
|
|
290
|
-
**Important:** Models have different "costs" per token:
|
|
291
|
-
|
|
292
|
-
- **Zero-cost models**: Don't consume your credit balance (shown by default)
|
|
293
|
-
- **Credit-costing models**: Consume credits faster (hidden by default)
|
|
294
|
-
|
|
295
|
-
Get your API key and optionally enable all models:
|
|
296
|
-
|
|
297
|
-
**Option A: Show only free models (default)**
|
|
298
|
-
|
|
299
|
-
```bash
|
|
300
|
-
export NVIDIA_API_KEY="nvapi-..."
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
Uses only zero-cost models โ your 1000 credits last the full month
|
|
298
|
+
### NVIDIA NIM (now built-in)
|
|
304
299
|
|
|
305
|
-
**
|
|
306
|
-
|
|
307
|
-
```bash
|
|
308
|
-
export NVIDIA_API_KEY="nvapi-..."
|
|
309
|
-
export NVIDIA_SHOW_PAID=true
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
Or in `~/.pi/free.json`:
|
|
313
|
-
|
|
314
|
-
```json
|
|
315
|
-
{
|
|
316
|
-
"nvidia_api_key": "nvapi-...",
|
|
317
|
-
"nvidia_show_paid": true
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
Toggle anytime with `/toggle-nvidia`
|
|
322
|
-
|
|
323
|
-
**Models available:** Llama 4/3.x, Mistral Small 3.1, DeepSeek R1, Gemma 4, Kimi K2.5/2.6, Qwen 3/2.5, OpenAI GPT-OSS, and more.
|
|
300
|
+
NVIDIA NIM is now a **built-in Pi provider** โ no extension needed. Set `NVIDIA_API_KEY` to use it directly with Pi's built-in model picker.
|
|
324
301
|
|
|
325
302
|
### Ollama Cloud
|
|
326
303
|
|
|
@@ -437,21 +414,25 @@ Each provider has toggle commands to switch between free and all models:
|
|
|
437
414
|
| ----------------------- | -------------------------------------------------------- |
|
|
438
415
|
| `/toggle-kilo` | Toggle between free/all Kilo models |
|
|
439
416
|
| `/toggle-openrouter` | Toggle between free/all OpenRouter models |
|
|
417
|
+
| `/toggle-opencode` | Toggle between free/all OpenCode models |
|
|
440
418
|
| `/toggle-cline` | Toggle between free/all Cline models |
|
|
441
|
-
| `/toggle-nvidia` | Toggle between free/all NVIDIA models |
|
|
442
419
|
| `/toggle-ollama` | Toggle between free/all Ollama Cloud models |
|
|
443
420
|
| `/toggle-mistral` | Toggle between free/all Mistral models (๐ง dynamic) |
|
|
444
421
|
| `/toggle-groq` | Toggle between free/all Groq models (๐ง dynamic) |
|
|
445
422
|
| `/toggle-cerebras` | Toggle between free/all Cerebras models (๐ง dynamic) |
|
|
446
423
|
| `/toggle-xai` | Toggle between free/all xAI models (๐ง dynamic) |
|
|
447
|
-
| `/toggle-huggingface` | Toggle between free/all Hugging Face models (๐ง dynamic)
|
|
448
|
-
| `/toggle-codestral` | Toggle Codestral (
|
|
424
|
+
| `/toggle-huggingface` | Toggle between free/all Hugging Face models (๐ง dynamic) |
|
|
425
|
+
| `/toggle-codestral` | Toggle Codestral (๐ freemium) |
|
|
449
426
|
| `/toggle-deepinfra` | Toggle DeepInfra (๐ณ trial credit) |
|
|
450
427
|
| `/toggle-together` | Toggle Together AI (๐ณ trial credit) |
|
|
451
428
|
| `/toggle-sambanova` | Toggle SambaNova (๐ freemium) |
|
|
452
429
|
| `/toggle-llm7` | Toggle LLM7 (โ
free gateway) |
|
|
453
430
|
| `/toggle-zenmux` | Toggle ZenMux (๐ณ paid) |
|
|
454
431
|
| `/toggle-crofai` | Toggle CrofAI (๐ณ paid) |
|
|
432
|
+
| `/toggle-novita` | Toggle Novita AI (๐ณ paid) |
|
|
433
|
+
| `/toggle-routeway` | Toggle Routeway AI (๐ณ paid) |
|
|
434
|
+
| `/toggle-fastrouter` | Toggle FastRouter (๐ง dynamic) |
|
|
435
|
+
| `/toggle-tokenrouter` | Toggle TokenRouter (๐ณ paid โ 1 free model) |
|
|
455
436
|
| `/ollama-cloud-refresh` | Re-fetch Ollama Cloud models live (no restart needed) |
|
|
456
437
|
| `/probe-ollama` | Test Ollama Cloud models for 403 errors (auto-hide) |
|
|
457
438
|
|
|
@@ -465,13 +446,18 @@ Each provider has toggle commands to switch between free and all models:
|
|
|
465
446
|
|
|
466
447
|
### Probe Commands (Health Check)
|
|
467
448
|
|
|
468
|
-
Test models for
|
|
449
|
+
Test models for errors and auto-hide broken ones:
|
|
469
450
|
|
|
470
|
-
| Command
|
|
471
|
-
|
|
|
472
|
-
| `/probe-
|
|
473
|
-
| `/probe-
|
|
474
|
-
| `/probe-
|
|
451
|
+
| Command | What it does |
|
|
452
|
+
| ---------------------- | ----------------------------------------------------------- |
|
|
453
|
+
| `/probe-ollama` | Test all Ollama Cloud models, auto-hide 403s |
|
|
454
|
+
| `/probe-routeway` | Test all Routeway models, auto-hide 5xx/404s |
|
|
455
|
+
| `/probe-opencode` | Test all OpenCode free models for expired promotions |
|
|
456
|
+
| `/probe-opencode-go` | Test all OpenCode Go free models for expired promotions |
|
|
457
|
+
| `/probe-deepinfra` | Test all DeepInfra models for availability, auto-hide broken|
|
|
458
|
+
| `/probe-sambanova` | Test all SambaNova models for availability, auto-hide broken|
|
|
459
|
+
| `/probe-together` | Test all Together AI models for availability, auto-hide broken|
|
|
460
|
+
| `/probe-novita` | Test all Novita AI models for availability, auto-hide broken|
|
|
475
461
|
|
|
476
462
|
**How it works:**
|
|
477
463
|
|
|
@@ -491,7 +477,6 @@ Create `~/.pi/free.json` in your home directory:
|
|
|
491
477
|
|
|
492
478
|
```json
|
|
493
479
|
{
|
|
494
|
-
"nvidia_api_key": "YOUR_NVIDIA_KEY",
|
|
495
480
|
"mistral_api_key": "YOUR_MISTRAL_KEY",
|
|
496
481
|
"ollama_api_key": "YOUR_OLLAMA_KEY",
|
|
497
482
|
"ollama_show_paid": true,
|
|
@@ -502,8 +487,8 @@ Create `~/.pi/free.json` in your home directory:
|
|
|
502
487
|
Or use environment variables (same names, uppercase):
|
|
503
488
|
|
|
504
489
|
```bash
|
|
505
|
-
export NVIDIA_API_KEY="..."
|
|
506
490
|
export MISTRAL_API_KEY="..."
|
|
491
|
+
export OLLAMA_API_KEY="..."
|
|
507
492
|
```
|
|
508
493
|
|
|
509
494
|
---
|
package/banner.svg
CHANGED
|
@@ -23,14 +23,6 @@
|
|
|
23
23
|
<stop offset="0%" stop-color="#06b6d4" stop-opacity="0.15"/>
|
|
24
24
|
<stop offset="100%" stop-color="#06b6d4" stop-opacity="0.05"/>
|
|
25
25
|
</linearGradient>
|
|
26
|
-
<linearGradient id="card3" x1="0" y1="0" x2="0" y2="1">
|
|
27
|
-
<stop offset="0%" stop-color="#10b981" stop-opacity="0.15"/>
|
|
28
|
-
<stop offset="100%" stop-color="#10b981" stop-opacity="0.05"/>
|
|
29
|
-
</linearGradient>
|
|
30
|
-
<linearGradient id="card4" x1="0" y1="0" x2="0" y2="1">
|
|
31
|
-
<stop offset="0%" stop-color="#f59e0b" stop-opacity="0.15"/>
|
|
32
|
-
<stop offset="100%" stop-color="#f59e0b" stop-opacity="0.05"/>
|
|
33
|
-
</linearGradient>
|
|
34
26
|
<filter id="glow">
|
|
35
27
|
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
36
28
|
<feMerge>
|
|
@@ -74,61 +66,54 @@
|
|
|
74
66
|
Free & Paid AI Model Providers for Pi
|
|
75
67
|
</text>
|
|
76
68
|
|
|
77
|
-
<!--
|
|
78
|
-
<text x="160" y="178" font-family="system-ui, -apple-system, sans-serif" font-size="13" fill="#7c8a9a" letter-spacing="0.02em">
|
|
79
|
-
</text>
|
|
80
|
-
|
|
81
|
-
<!-- Provider badges -->
|
|
69
|
+
<!-- Provider category badges -->
|
|
82
70
|
<g transform="translate(160, 200)">
|
|
83
|
-
<!-- Free -->
|
|
84
71
|
<rect x="0" y="0" width="90" height="28" rx="6" fill="#10b981" opacity="0.15" stroke="#10b981" stroke-width="0.5" stroke-opacity="0.3"/>
|
|
85
|
-
<text x="45" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#6ee7b7" text-anchor="middle" font-weight="600"
|
|
72
|
+
<text x="45" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#6ee7b7" text-anchor="middle" font-weight="600">Free</text>
|
|
86
73
|
</g>
|
|
87
74
|
|
|
88
75
|
<g transform="translate(260, 200)">
|
|
89
76
|
<rect x="0" y="0" width="100" height="28" rx="6" fill="#f59e0b" opacity="0.15" stroke="#f59e0b" stroke-width="0.5" stroke-opacity="0.3"/>
|
|
90
|
-
<text x="50" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#fcd34d" text-anchor="middle" font-weight="600"
|
|
77
|
+
<text x="50" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#fcd34d" text-anchor="middle" font-weight="600">Freemium</text>
|
|
91
78
|
</g>
|
|
92
79
|
|
|
93
80
|
<g transform="translate(370, 200)">
|
|
94
|
-
<rect x="0" y="0" width="
|
|
95
|
-
<text x="
|
|
81
|
+
<rect x="0" y="0" width="100" height="28" rx="6" fill="#7c3aed" opacity="0.15" stroke="#7c3aed" stroke-width="0.5" stroke-opacity="0.3"/>
|
|
82
|
+
<text x="50" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#a78bfa" text-anchor="middle" font-weight="600">Dynamic</text>
|
|
96
83
|
</g>
|
|
97
84
|
|
|
98
|
-
<g transform="translate(
|
|
85
|
+
<g transform="translate(480, 200)">
|
|
99
86
|
<rect x="0" y="0" width="90" height="28" rx="6" fill="#ef4444" opacity="0.15" stroke="#ef4444" stroke-width="0.5" stroke-opacity="0.3"/>
|
|
100
|
-
<text x="45" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#fca5a5" text-anchor="middle" font-weight="600"
|
|
87
|
+
<text x="45" y="18" font-family="system-ui, sans-serif" font-size="11" fill="#fca5a5" text-anchor="middle" font-weight="600">Paid</text>
|
|
101
88
|
</g>
|
|
102
89
|
|
|
103
90
|
<!-- Provider cards (right side) -->
|
|
104
91
|
<g transform="translate(700, 55)">
|
|
105
|
-
<!-- Card 1: Custom Providers -->
|
|
106
92
|
<rect x="0" y="0" width="250" height="170" rx="12" fill="url(#card1)" stroke="#7c3aed" stroke-width="0.5" stroke-opacity="0.2" filter="url(#shadow)"/>
|
|
107
93
|
<rect x="0" y="0" width="250" height="170" rx="12" fill="none" stroke="url(#accent)" stroke-width="0.5" opacity="0.1"/>
|
|
108
|
-
<text x="20" y="28" font-family="system-ui, sans-serif" font-size="13" font-weight="700" fill="#c4b5fd">
|
|
109
|
-
<text x="20" y="50" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Kilo ยท Cline ยท
|
|
110
|
-
<text x="20" y="70" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Ollama Cloud ยท
|
|
111
|
-
<text x="20" y="90" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">
|
|
112
|
-
<text x="20" y="110" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">
|
|
113
|
-
<text x="20" y="130" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Together ยท
|
|
94
|
+
<text x="20" y="28" font-family="system-ui, sans-serif" font-size="13" font-weight="700" fill="#c4b5fd">Providers</text>
|
|
95
|
+
<text x="20" y="50" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Kilo ยท Cline ยท OpenCode</text>
|
|
96
|
+
<text x="20" y="70" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Ollama Cloud ยท SambaNova</text>
|
|
97
|
+
<text x="20" y="90" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Codestral ยท LLM7 ยท Novita</text>
|
|
98
|
+
<text x="20" y="110" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">ZenMux ยท CrofAI ยท DeepInfra</text>
|
|
99
|
+
<text x="20" y="130" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Together ยท TokenRouter ยท FastRouter</text>
|
|
114
100
|
</g>
|
|
115
101
|
|
|
116
102
|
<g transform="translate(970, 55)">
|
|
117
|
-
<!-- Card 2: Features -->
|
|
118
103
|
<rect x="0" y="0" width="250" height="170" rx="12" fill="url(#card2)" stroke="#06b6d4" stroke-width="0.5" stroke-opacity="0.2" filter="url(#shadow)"/>
|
|
119
104
|
<rect x="0" y="0" width="250" height="170" rx="12" fill="none" stroke="url(#accent2)" stroke-width="0.5" opacity="0.1"/>
|
|
120
105
|
<text x="20" y="28" font-family="system-ui, sans-serif" font-size="13" font-weight="700" fill="#67e8f9">Features</text>
|
|
121
|
-
<text x="20" y="50" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
122
|
-
<text x="20" y="68" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
123
|
-
<text x="20" y="86" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
124
|
-
<text x="20" y="104" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
125
|
-
<text x="20" y="122" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
126
|
-
<text x="20" y="140" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
127
|
-
<text x="20" y="158" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa"
|
|
106
|
+
<text x="20" y="50" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Free model auto-detection</text>
|
|
107
|
+
<text x="20" y="68" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Per-provider toggles</text>
|
|
108
|
+
<text x="20" y="86" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">OAuth flows (Kilo, Cline)</text>
|
|
109
|
+
<text x="20" y="104" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Coding Index (CI) scores</text>
|
|
110
|
+
<text x="20" y="122" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Model health probes</text>
|
|
111
|
+
<text x="20" y="140" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">Thinking level maps</text>
|
|
112
|
+
<text x="20" y="158" font-family="system-ui, sans-serif" font-size="11" fill="#8b9aaa">404/403 auto-hide on probe</text>
|
|
128
113
|
</g>
|
|
129
114
|
|
|
130
115
|
<!-- Bottom tagline -->
|
|
131
116
|
<text x="640" y="305" font-family="system-ui, -apple-system, sans-serif" font-size="12" fill="#5a6a7a" text-anchor="middle" letter-spacing="0.04em">
|
|
132
|
-
|
|
117
|
+
pi install git:github.com/apmantza/pi-free
|
|
133
118
|
</text>
|
|
134
119
|
</svg>
|