@yanlinglabs/winter-provider-catalog 0.0.33 → 0.0.35
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 +25 -3
- package/README.md +1 -1
- package/dist/families.d.ts +4 -1
- package/dist/families.js +3 -1
- package/dist/{index-kmd3gebk.js → index-gpcka8pe.js} +9 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +56931 -26101
- package/generated/catalog.json +56919 -26098
- package/overlay/families.json +7 -6
- package/overlay/models.json +44997 -1347
- package/overlay/pricing.json +42 -0
- package/overlay/providers.json +344 -0
- package/package.json +1 -1
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 —
|
|
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`,
|
|
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** |
|
|
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:
|
|
3
|
+
Winter's provider and model catalog as inert, validated DATA: 218 provider rows and 1296 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
|
|
package/dist/families.d.ts
CHANGED
|
@@ -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
|
-
|
|
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-
|
|
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
|
-
|
|
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";
|