@yanlinglabs/winter-provider-catalog 0.0.33 → 0.0.34

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/PROVENANCE.md CHANGED
@@ -8,7 +8,7 @@ The committed catalog is the merge of two layers, performed by `scripts/provider
8
8
  | Layer | Source | Owner | Present |
9
9
  | --- | --- | --- | --- |
10
10
  | upstream | `generated/upstream-layer.json`, extracted from the pinned OmniRoute tree by `scripts/provider-source-sync.ts` | the extractor | **yes** — 106 providers, 539 models |
11
- | overlay | `overlay/providers.json` + `overlay/models.json`, hand-authored and reviewed | Winter | yes — 125 providers, 635 models |
11
+ | overlay | `overlay/providers.json` + `overlay/models.json`, hand-authored and reviewed | Winter | yes — 134 providers, 1178 models |
12
12
 
13
13
  **The overlay always wins.** WS-13 §7: live discovery and upstream extraction never silently
14
14
  overwrite `official-doc`/`live-probe` overlay entries, so a conflicting upstream row is dropped in
@@ -123,11 +123,11 @@ and wants to refresh this document by name — not a second gate.
123
123
 
124
124
  <!-- BEGIN GENERATED: admission-tier census (bun run scripts/provenance-tiers.ts) -->
125
125
 
126
- Generated from `generated/catalog.json` (`v3.8.50+winter.1`, 213 provider rows). Do not edit by hand.
126
+ Generated from `generated/catalog.json` (`v3.8.50+winter.1`, 218 provider rows). Do not edit by hand.
127
127
 
128
128
  | Tier | Rows | What it means |
129
129
  | --- | ---: | --- |
130
- | **fetched-document** | 86 | a vendor page this repository retrieved and read, on a recorded date |
130
+ | **fetched-document** | 91 | a vendor page this repository retrieved and read, on a recorded date |
131
131
  | **pinned-upstream** | 101 | the vendor's own site as the pinned upstream product catalog records it, plus that id's own pinned entry — a real, dated reference, but NOT a page read here |
132
132
  | **spec-ruling** | 4 | a ruling in an approved spec (or a user ruling recorded in one) admits the PATH; the row's own details are carried from a reviewed ledger entry — `anthropic`, `azure-ai`, `console`, `oci` |
133
133
  | **local** | 12 | a local installation on the operator's own machine — there is no third party to be admitted by — `docker-model-runner`, `lemonade`, `llama-cpp`, `llamafile`, `lm-studio`, `mlx-gemma`, `mlx-qwen`, `ollama-local`, `oobabooga`, `triton`, `vllm`, `xinference` |
@@ -160,6 +160,13 @@ API docs, and `zai-anthropic` cited the mainland product site although the lane
160
160
  own Claude-client doc. A citation is a row's entire evidence, so a citation that resolves to nothing
161
161
  is a row with no evidence.
162
162
 
163
+ **cat34 review (2026-09-28) applied the same rule to four extracted rows whose ENDPOINT is dead**, each
164
+ moved to `blocked` with the probe on the row: `yi` (HTTP 410 `model_service_closed`), `pioneer` (HTTP 410
165
+ `host_retired`, `moved_to` api.fastino.ai — the successor is not re-admitted without its own review),
166
+ `modal` (`api.modal.ai` fails TLS; modal.ai is a parked domain, never Modal's), and `hyperbolic` (its FAQ
167
+ states the serverless inference API is retired). A blocked row has no credential slot and refuses at
168
+ resolution.
169
+
163
170
  **What decision (a) asked for and why it could not be met as written.** The P6.5 plan asked lane X2
164
171
  to upgrade five `spec:WS-13 §1` citations (`deepseek`, `openrouter`, `azure-openai`, `bedrock`,
165
172
  `vertex`) "to vendor URLs from the audit's citations". The audit's 51 citations cover the OAuth,
@@ -560,6 +567,21 @@ operator created; no document read here enumerates them, and seeding rows would
560
567
  somebody else's tenant. A host reaches models with `allowUnlisted` — both rows are
561
568
  `liveCatalogAuthority: "unknown"`, which is the door R6-F opens.
562
569
 
570
+ **cat34 (2026-09-27) added two per-tenant rows, from fetched vendor pages** (`tier:
571
+ "fetched-document"`, still `review-required` with no live gate). A third, `databricks`, was drafted and
572
+ dropped at review: its documented OpenAI-client route names models `system.ai.<name>`, no page read
573
+ enumerated them, and a per-tenant row with nothing to seed adds nothing `allowUnlisted` does not.
574
+
575
+ | row | template | model rows |
576
+ | --- | --- | --- |
577
+ | `snowflake-cortex` | `https://<account-identifier>.snowflakecomputing.com/api/v2/cortex/v1` | the Cortex REST API's generally available models (✔ in its availability table), **unpriced**: billing is in AI Credits whose USD price depends on the contract and region |
578
+ | `cloudflare-workers-ai` | `https://api.cloudflare.com/client/v4/accounts/<account-id>/ai/v1` | every text-generation model on the pricing page whose model page is live, **priced** from Cloudflare's own USD-per-1M figures |
579
+
580
+ The Snowflake and Cloudflare model rows depart from the "no model rows" rule above on purpose, and
581
+ the departure is a controller item: their ids are **platform-defined** (the vendor's own model
582
+ catalog, the same for every account), not deployments an operator names, so a row states what the
583
+ vendor serves rather than what one tenant created.
584
+
563
585
  ## Dialect siblings, and the two keyless rows (P6.5, R6b-5 / WS-13b §8.4)
564
586
 
565
587
  A provider row carries exactly one `adapterId`, so a vendor that documents **two wire dialects at two
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@yanlinglabs/winter-provider-catalog`
2
2
 
3
- Winter's provider and model catalog as inert, validated DATA: 213 provider rows and 1001 model rows
3
+ Winter's provider and model catalog as inert, validated DATA: 218 provider rows and 1293 model rows
4
4
  with their endpoints, auth kinds, pricing evidence, admission tier and provenance, plus the validator
5
5
  and the vocabularies the JSON Schema restates.
6
6
 
@@ -63,6 +63,9 @@ export declare function modelFamilyOf(catalog: WinterCatalog, providerId: string
63
63
  export declare function isSlotServableRow(row: {
64
64
  status: string;
65
65
  endpoints: readonly string[];
66
- }): boolean;
66
+ providerId?: string;
67
+ }, blockedProviderIds?: ReadonlySet<string>): boolean;
68
+ /** The ids of every provider whose `risk.class` is `blocked` -- the second argument `isSlotServableRow` takes. */
69
+ export declare function blockedProviderIdsOf(catalog: Pick<WinterCatalog, "providers">): Set<string>;
67
70
  /** Candidate rows for a slot (WS-13c §4 step 1). The SAME predicate `validateCatalog` refuses a slot on. */
68
71
  export declare function rowsForCanonicalId(catalog: WinterCatalog, canonicalModelId: string): WinterModelDescriptor[];
package/dist/families.js CHANGED
@@ -12,8 +12,9 @@ import {
12
12
  familyOfModelKey2,
13
13
  modelFamilyOf2,
14
14
  isSlotServableRow2,
15
+ blockedProviderIdsOf2,
15
16
  rowsForCanonicalId2
16
- } from "./index-kmd3gebk.js";
17
+ } from "./index-gpcka8pe.js";
17
18
  export {
18
19
  CLAUDE_FAMILY_ID2 as CLAUDE_FAMILY_ID,
19
20
  CLAUDE_RESERVED_SLOT_NAMES2 as CLAUDE_RESERVED_SLOT_NAMES,
@@ -21,6 +22,7 @@ export {
21
22
  FAMILY_ID_RE2 as FAMILY_ID_RE,
22
23
  OTHER_FAMILY_ID2 as OTHER_FAMILY_ID,
23
24
  SLOT_NAME_RE2 as SLOT_NAME_RE,
25
+ blockedProviderIdsOf2 as blockedProviderIdsOf,
24
26
  canonicalModelIdOf2 as canonicalModelIdOf,
25
27
  familyIdOf2 as familyIdOf,
26
28
  familyOfModelKey2 as familyOfModelKey,
@@ -88,11 +88,17 @@ function modelFamilyOf2(catalog, providerId, modelKey) {
88
88
  const row = catalog.models.find((m) => m.key === modelKey) ?? catalog.models.find((m) => m.key === `${providerId}/${modelKey}`);
89
89
  return row?.modelFamily;
90
90
  }
91
- function isSlotServableRow2(row) {
91
+ function isSlotServableRow2(row, blockedProviderIds = new Set) {
92
+ if (row.providerId !== undefined && blockedProviderIds.has(row.providerId))
93
+ return false;
92
94
  return row.status !== "blocked" && row.status !== "deprecated" && (row.endpoints.includes("chat") || row.endpoints.includes("responses"));
93
95
  }
96
+ function blockedProviderIdsOf2(catalog) {
97
+ return new Set(catalog.providers.filter((p) => p.risk.class === "blocked").map((p) => p.id));
98
+ }
94
99
  function rowsForCanonicalId2(catalog, canonicalModelId) {
95
- return catalog.models.filter((m) => m.canonicalModelId === canonicalModelId && isSlotServableRow2(m));
100
+ const blocked = blockedProviderIdsOf2(catalog);
101
+ return catalog.models.filter((m) => m.canonicalModelId === canonicalModelId && isSlotServableRow2(m, blocked));
96
102
  }
97
103
 
98
- export { SLOT_NAME_RE2, FAMILY_ID_RE2, CLAUDE_FAMILY_ID2, OTHER_FAMILY_ID2, CLAUDE_RESERVED_SLOT_NAMES2, CURRENCY_RE2, canonicalModelIdOf2, familyIdOf2, stampFamilyFields2, resolveSlotName2, familyOfModelKey2, modelFamilyOf2, isSlotServableRow2, rowsForCanonicalId2 };
104
+ export { SLOT_NAME_RE2, FAMILY_ID_RE2, CLAUDE_FAMILY_ID2, OTHER_FAMILY_ID2, CLAUDE_RESERVED_SLOT_NAMES2, CURRENCY_RE2, canonicalModelIdOf2, familyIdOf2, stampFamilyFields2, resolveSlotName2, familyOfModelKey2, modelFamilyOf2, isSlotServableRow2, blockedProviderIdsOf2, rowsForCanonicalId2 };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type { CapabilityEvidence, CatalogValidationResult, EvidenceConfidence, EvidenceSource, FamilySlot, ModelFamilyDescriptor, ModelPricing, ModelStatus, ProviderAuthKind, ProviderProtocol, ReasoningCapabilities, SlotBasis, SlotStatus, ToolCalling, WinterCatalog, WinterModelDescriptor, WinterProviderDescriptor, } from "./types.js";
2
2
  export { CATALOG_VOCABULARIES, scanForSecrets, validateCatalog } from "./validate.js";
3
- export { CLAUDE_FAMILY_ID, CLAUDE_RESERVED_SLOT_NAMES, CURRENCY_RE, FAMILY_ID_RE, OTHER_FAMILY_ID, SLOT_NAME_RE, canonicalModelIdOf, familyIdOf, familyOfModelKey, isSlotServableRow, modelFamilyOf, resolveSlotName, rowsForCanonicalId, stampFamilyFields, } from "./families.js";
3
+ export { CLAUDE_FAMILY_ID, CLAUDE_RESERVED_SLOT_NAMES, CURRENCY_RE, FAMILY_ID_RE, OTHER_FAMILY_ID, SLOT_NAME_RE, canonicalModelIdOf, familyIdOf, familyOfModelKey, blockedProviderIdsOf, isSlotServableRow, modelFamilyOf, resolveSlotName, rowsForCanonicalId, stampFamilyFields, } from "./families.js";
4
4
  export type { SlotNameResolution } from "./families.js";
5
5
  export { CATALOG_TAG_RENAMES } from "./tag-renames.js";
6
6
  import type { WinterCatalog } from "./types.js";