pi-coralbricks-provider 1.0.8 → 1.0.10
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 +11 -9
- package/package.json +1 -1
- package/scripts/update-models.js +4 -24
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ _A [pi](https://github.com/earendil-works/pi-coding-agent) provider extension fo
|
|
|
23
23
|
- **Per-family thinking levels** — zai-style `thinking` control for GLM (including a *real* off switch), `reasoning_effort` for Kimi K3 and GPT-OSS
|
|
24
24
|
- **Accurate cost tracking** — pricing mirrors Coral's published rates, and cached reads are **$0 on every model**, so pi's computed cost matches Coral's own `usage.cost` to the token
|
|
25
25
|
- **Self-healing model sync** — stale-while-revalidate from the authenticated `/v1/models` (or the unauthenticated [public catalog](https://www.coralbricks.ai/api/public/models) before auth), hot-swapped at session start
|
|
26
|
-
- **synbad-validated** — [synbad](https://github.com/synthetic-lab/synbad) tool-calling and reasoning-parsing evals pass 15/15 on GLM 5.
|
|
26
|
+
- **synbad-validated** — [synbad](https://github.com/synthetic-lab/synbad) tool-calling and reasoning-parsing evals pass 15/15 on GLM 5.3 and Kimi K3 in both unary and streaming modes
|
|
27
27
|
|
|
28
28
|
## Installation
|
|
29
29
|
|
|
@@ -80,7 +80,6 @@ pi
|
|
|
80
80
|
|
|
81
81
|
| Model | Context | Vision | Reasoning | Input $/M | Cache Read $/M | Output $/M |
|
|
82
82
|
|-------|---------|--------|-----------|-----------|-----------------|------------|
|
|
83
|
-
| GLM 5.2 FP4 | 1.0M | ❌ | ✅ | $1.12 | — | $4.40 |
|
|
84
83
|
| GLM 5.3 Flash | 1.0M | ✅ | ✅ | $0.15 | — | $0.50 |
|
|
85
84
|
| GLM 5.3 FP4 | 1.0M | ❌ | ✅ | $1.12 | — | $4.40 |
|
|
86
85
|
| GPT-OSS 120B | 131K | ❌ | ✅ | $0.12 | — | $0.60 |
|
|
@@ -130,12 +129,12 @@ Verified against the live gateway:
|
|
|
130
129
|
|
|
131
130
|
| Model | Format | off | low | medium | high | max |
|
|
132
131
|
|-------|--------|-----|-----|--------|------|-----|
|
|
133
|
-
| GLM 5.2 FP4 | `thinking: {type}` + `reasoning_effort` | ✅ | — | ✅ | ✅ | ✅ |
|
|
134
132
|
| GLM 5.3 FP4 | `thinking: {type}` + `reasoning_effort` | ✅ | ✅ | — | ✅ | ✅ |
|
|
133
|
+
| GLM 5.3 Flash | `thinking: {type}` + `reasoning_effort` | ✅ | ✅ | — | ✅ | ✅ |
|
|
135
134
|
| Kimi K3 | `reasoning_effort` | — | ✅ | — | ✅ | ✅ |
|
|
136
135
|
| GPT-OSS 120B | `reasoning_effort` | — | ✅ | ✅ | ✅ | — |
|
|
137
136
|
|
|
138
|
-
- **GLM** accepts zai-style `thinking: {type: "disabled"}` on Coral — pi's *off* level
|
|
137
|
+
- **GLM** accepts zai-style `thinking: {type: "disabled"}` on Coral — pi's *off* level turns thinking off, though a short preamble of a few dozen tokens can still appear (the upstream Z.ai API has no off at all, so this differs from the canonical Z.ai map).
|
|
139
138
|
- **Kimi K3** always thinks: `reasoning_effort: "none"` is accepted but doesn't disable reasoning, so *off* is intentionally not offered. Assistant replays include `reasoning_content`.
|
|
140
139
|
- **GPT-OSS** exposes the standard low/medium/high reasoning efforts; reasoning arrives in `reasoning_content`.
|
|
141
140
|
- Coral streams a duplicate `reasoning` field alongside `reasoning_content`; pi dedupes these automatically.
|
|
@@ -146,7 +145,7 @@ Coral's gateway follows the OpenAI Chat Completions API:
|
|
|
146
145
|
|
|
147
146
|
- **`supportsStore: false`** / **`supportsDeveloperRole: false`** — all models; Coral serves open models on the classic roles.
|
|
148
147
|
- **`maxTokensField: "max_tokens"`** — all models.
|
|
149
|
-
- **`thinkingFormat: "zai"`** — GLM 5.
|
|
148
|
+
- **`thinkingFormat: "zai"`** — GLM 5.3: `thinking: {type: "enabled"|"disabled"}` toggles reasoning, `reasoning_effort` picks the depth.
|
|
150
149
|
- **`thinkingFormat: "openai"`** — Kimi K3 and GPT-OSS 120B: `reasoning_effort` drives thinking depth.
|
|
151
150
|
- **`supportsStrictMode: false`** — Kimi K3 (no strict JSON-schema tool definitions).
|
|
152
151
|
- **`requiresReasoningContentOnAssistantMessages: true`** — Kimi K3.
|
|
@@ -160,16 +159,19 @@ Merge order: `[live|cache|embedded] → patch.json → custom-models.json`
|
|
|
160
159
|
|
|
161
160
|
## Inference-Quality Testing
|
|
162
161
|
|
|
163
|
-
Validated with [synbad](https://github.com/synthetic-lab/synbad) — Synthetic's tool-calling and reasoning-parsing eval suite for LLM inference providers (`--count 1`, `--reasoning-effort high
|
|
162
|
+
Validated with [synbad](https://github.com/synthetic-lab/synbad) — Synthetic's tool-calling and reasoning-parsing eval suite for LLM inference providers (`--count 1`, `--reasoning-effort high`; the GLM 5.3/Kimi runs used the 15-eval suite, the GPT-OSS and GLM 5.3 Flash runs on 2026-09-15 the current 13-eval suite):
|
|
164
163
|
|
|
165
164
|
| Model | Unary | Stream | Notes |
|
|
166
165
|
|-------|-------|--------|-------|
|
|
167
|
-
| GLM 5.2 FP4 | 15/15 ✅ | 15/15 ✅ | |
|
|
168
166
|
| GLM 5.3 FP4 | 15/15 ✅ | 15/15 ✅ | |
|
|
167
|
+
| GLM 5.3 Flash | 13/13 ✅ | 12/13 ⚠️ | re-run 2026-09-15; see below |
|
|
169
168
|
| Kimi K3 | 15/15 ✅ | 15/15 ✅ | |
|
|
170
|
-
| GPT-OSS 120B |
|
|
169
|
+
| GPT-OSS 120B | 11/13 ⚠️ | 12/13 ⚠️ | re-run 2026-09-15; see below |
|
|
170
|
+
| GLM 5.2 FP4 (retired) | 15/15 ✅ | 15/15 ✅ | evaluated before Coral retired the model |
|
|
171
171
|
|
|
172
|
-
The
|
|
172
|
+
The gpt-oss misses are model-side, not transport: `tools/parallel-tool` fails in both modes because it answers "Paris and London" with one call after another instead of two parallel calls even when `parallel_tool_calls: true`; `reasoning/reasoning-claude-tool-call` (a prompt that asks the model to "put the tool call inside your thinking") occasionally gets exactly that in unary mode — the model narrates the call in its reasoning and answers in text — while streaming passed it every time.
|
|
173
|
+
|
|
174
|
+
GLM 5.3 Flash's streaming miss is `reasoning/reasoning-parsing`: on the trivial prompt it uses, Flash occasionally answers without a think block (about 1 in 5 streams and 1 in 8 unary responses in our sampling); the answer itself is unaffected, and a second full unary pass was 13/13.
|
|
173
175
|
|
|
174
176
|
Reproduce:
|
|
175
177
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-coralbricks-provider",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "CoralBricks provider extension for pi - Access GLM 5.3, GLM 5.3 Flash, Kimi K3, and GPT-OSS 120B through the Coral Inference API",
|
|
5
5
|
"author": "monotykamary",
|
|
6
6
|
"homepage": "https://github.com/monotykamary/pi-coralbricks-provider#readme",
|
package/scripts/update-models.js
CHANGED
|
@@ -478,27 +478,6 @@ function updateDeprecatedModels(modelsJsonPath, newModels) {
|
|
|
478
478
|
}
|
|
479
479
|
}
|
|
480
480
|
|
|
481
|
-
function withDeprecatedForReadme(models) {
|
|
482
|
-
const deprecatedPath = path.join(path.dirname(MODELS_JSON_PATH), 'deprecated-models.json');
|
|
483
|
-
let deprecated = {};
|
|
484
|
-
try {
|
|
485
|
-
const parsed = JSON.parse(fs.readFileSync(deprecatedPath, 'utf8'));
|
|
486
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) deprecated = parsed;
|
|
487
|
-
} catch { /* no graveyard yet */ }
|
|
488
|
-
const now = Date.now();
|
|
489
|
-
const seen = new Set(models.map((m) => m.id));
|
|
490
|
-
const extras = [];
|
|
491
|
-
for (const entry of Object.values(deprecated)) {
|
|
492
|
-
if (!entry || !entry.id || seen.has(entry.id)) continue;
|
|
493
|
-
const removedAt = Date.parse(entry.deprecatedAt || '');
|
|
494
|
-
if (Number.isNaN(removedAt) || now - removedAt > DEPRECATED_MODEL_TTL_MS) continue;
|
|
495
|
-
const m = { ...entry };
|
|
496
|
-
delete m.deprecatedAt;
|
|
497
|
-
extras.push(m);
|
|
498
|
-
}
|
|
499
|
-
return extras.length > 0 ? [...models, ...extras] : models;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
481
|
async function main() {
|
|
503
482
|
try {
|
|
504
483
|
// Regenerate the derived README table from local source data without an API
|
|
@@ -507,7 +486,7 @@ async function main() {
|
|
|
507
486
|
const baseModels = loadJson(MODELS_JSON_PATH);
|
|
508
487
|
const patchData = loadJson(PATCH_JSON_PATH);
|
|
509
488
|
const customModels = loadJson(CUSTOM_MODELS_JSON_PATH);
|
|
510
|
-
const readmeBase =
|
|
489
|
+
const readmeBase = Array.isArray(baseModels) ? baseModels : [];
|
|
511
490
|
const readmeModels = buildModels(readmeBase, Array.isArray(customModels) ? customModels : [], patchData);
|
|
512
491
|
readmeModels.sort((a, b) => a.name.localeCompare(b.name));
|
|
513
492
|
updateReadme(readmeModels);
|
|
@@ -541,10 +520,11 @@ async function main() {
|
|
|
541
520
|
updateDeprecatedModels(MODELS_JSON_PATH, models);
|
|
542
521
|
saveJson(MODELS_JSON_PATH, models);
|
|
543
522
|
|
|
544
|
-
// Build
|
|
523
|
+
// Build the README model list: base → patch → custom. Grace-period models stay
|
|
524
|
+
// servable at runtime (index.ts appends them) but are not listed as available.
|
|
545
525
|
const patchData = loadJson(PATCH_JSON_PATH);
|
|
546
526
|
const customModels = loadJson(CUSTOM_MODELS_JSON_PATH);
|
|
547
|
-
const readmeBase =
|
|
527
|
+
const readmeBase = models;
|
|
548
528
|
const readmeModels = buildModels(readmeBase, Array.isArray(customModels) ? customModels : [], patchData);
|
|
549
529
|
readmeModels.sort((a, b) => a.name.localeCompare(b.name));
|
|
550
530
|
|