pi-coralbricks-provider 1.0.8 → 1.0.9
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 +6 -8
- 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,7 +129,6 @@ 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` | ✅ | ✅ | — | ✅ | ✅ |
|
|
135
133
|
| Kimi K3 | `reasoning_effort` | — | ✅ | — | ✅ | ✅ |
|
|
136
134
|
| GPT-OSS 120B | `reasoning_effort` | — | ✅ | ✅ | ✅ | — |
|
|
@@ -146,7 +144,7 @@ Coral's gateway follows the OpenAI Chat Completions API:
|
|
|
146
144
|
|
|
147
145
|
- **`supportsStore: false`** / **`supportsDeveloperRole: false`** — all models; Coral serves open models on the classic roles.
|
|
148
146
|
- **`maxTokensField: "max_tokens"`** — all models.
|
|
149
|
-
- **`thinkingFormat: "zai"`** — GLM 5.
|
|
147
|
+
- **`thinkingFormat: "zai"`** — GLM 5.3: `thinking: {type: "enabled"|"disabled"}` toggles reasoning, `reasoning_effort` picks the depth.
|
|
150
148
|
- **`thinkingFormat: "openai"`** — Kimi K3 and GPT-OSS 120B: `reasoning_effort` drives thinking depth.
|
|
151
149
|
- **`supportsStrictMode: false`** — Kimi K3 (no strict JSON-schema tool definitions).
|
|
152
150
|
- **`requiresReasoningContentOnAssistantMessages: true`** — Kimi K3.
|
|
@@ -160,16 +158,16 @@ Merge order: `[live|cache|embedded] → patch.json → custom-models.json`
|
|
|
160
158
|
|
|
161
159
|
## Inference-Quality Testing
|
|
162
160
|
|
|
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
|
|
161
|
+
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/Kimi runs used the 15-eval suite, the GPT-OSS re-run on 2026-09-15 the current 13-eval suite):
|
|
164
162
|
|
|
165
163
|
| Model | Unary | Stream | Notes |
|
|
166
164
|
|-------|-------|--------|-------|
|
|
167
|
-
| GLM 5.2 FP4 | 15/15 ✅ | 15/15 ✅ | |
|
|
168
165
|
| GLM 5.3 FP4 | 15/15 ✅ | 15/15 ✅ | |
|
|
169
166
|
| Kimi K3 | 15/15 ✅ | 15/15 ✅ | |
|
|
170
|
-
| GPT-OSS 120B |
|
|
167
|
+
| GPT-OSS 120B | 11/13 ⚠️ | 12/13 ⚠️ | re-run 2026-09-15; see below |
|
|
168
|
+
| GLM 5.2 FP4 (retired) | 15/15 ✅ | 15/15 ✅ | evaluated before Coral retired the model |
|
|
171
169
|
|
|
172
|
-
The
|
|
170
|
+
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
171
|
|
|
174
172
|
Reproduce:
|
|
175
173
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-coralbricks-provider",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
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
|
|