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 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.2, GLM 5.3, and Kimi K3 in both unary and streaming modes
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 genuinely disables thinking (the upstream Z.ai API does not, so this differs from the canonical Z.ai map).
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.2/5.3: `thinking: {type: "enabled"|"disabled"}` toggles reasoning, `reasoning_effort` picks the depth.
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`, 15 evals per run):
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 | 14/15 ⚠️ | pending re-eval | gateway tool-call index bug is fixed upstream |
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 remaining gpt-oss quirk is model-side: it answers "Paris and London" with a single batched tool call even when `parallel_tool_calls: true` — not a gateway bug.
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.8",
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",
@@ -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 = withDeprecatedForReadme(Array.isArray(baseModels) ? baseModels : []);
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 full model list for README: (base + grace-period deprecated) → patch → custom.
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 = withDeprecatedForReadme(models);
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