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 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,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.2/5.3: `thinking: {type: "enabled"|"disabled"}` toggles reasoning, `reasoning_effort` picks the depth.
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`, 15 evals per run):
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 | 14/15 ⚠️ | pending re-eval | gateway tool-call index bug is fixed upstream |
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 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.
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.8",
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",
@@ -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