@yanlinglabs/winter-provider-catalog 0.0.17 → 0.0.22

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/NOTICE CHANGED
@@ -1,59 +1,41 @@
1
- NOTICE — third-party material in @yanlinglabs/winter-provider-catalog
2
- ====================================================================
3
-
4
- NO THIRD-PARTY SOURCE CODE. As of this file's writing, this package contains no third-party source
5
- code, and no file in it was copied from any upstream project.
6
-
7
- Two upstream files ARE copied into this repository — but into `third_party/`, not here:
8
-
9
- third_party/omniroute-provider-source/LICENSE <- OmniRoute's root LICENSE (MIT), verbatim
10
- third_party/omniroute-provider-source/NOTICE <- OmniRoute's THIRD_PARTY_NOTICES.md, verbatim
11
-
12
- Both are registered with their upstream path, git blob id, sha256 and byte count in
13
- `third_party/omniroute-provider-source/extraction-manifest.json`, under `copiedFiles`, with
14
- `modifications: "none"`.
15
-
16
- Why the file exists anyway
17
- --------------------------
18
-
19
- WS-13 §5 permits a narrow, deliberate exception: a *pure helper* may be copied from the OmniRoute
20
- provider corpus with clean per-file provenance. WS-13 §13's acceptance list then requires "notices
21
- cover copied files". This NOTICE is that register. It is empty of code entries on purpose, and an
22
- empty register is a stronger statement than a missing one: it says the exception has not been used,
23
- rather than leaving a reader to guess.
24
-
25
- If a future lane copies such a file, it appends an entry here naming the file, the upstream project,
26
- the exact commit, the upstream path, and the licence — and the copy is not merged without it.
27
-
28
- What IS derived from upstream, and how
29
- --------------------------------------
30
-
31
- Catalog DATA (provider ids, endpoint templates, protocol families, auth kinds, model rows) is
32
- extracted from the pinned upstream tree into `generated/upstream-layer.json` and merged into
33
- `generated/catalog.json`. That is inert data, not code. Nothing in this package or anywhere in
34
- Winter imports, evaluates, or executes an upstream module: the extractor
35
- (`src/extract/literal-extractor.ts`) hands file TEXT to the TypeScript parser and walks object and
36
- array literals, rejecting every executable value into `generated/rejections.json`. WS-13 §13 states
37
- the rule directly — "no executable upstream URL builders", and "a catalog entry alone never causes
38
- code download or execution". Adapter behaviour is Winter-authored per protocol family (WS-13 §5),
39
- proven by the behavioural corpus.
40
-
41
- The extraction materialized 309 upstream files into a scratch checkout outside this repository and
42
- deleted it before the run finished. The two files listed above are the only ones that survived.
43
-
44
- The pinned source
45
- -----------------
46
-
47
- repository https://github.com/diegosouzapw/OmniRoute
48
- tag v3.8.50
49
- tag object 6f5d4e00e817bc01b2ac16fdd66db3840c296416 (the ANNOTATED TAG, not a commit)
50
- commit 5458026c216f77a3da68ea49152dc33470cfe2cb (the tag, peeled)
51
- licence MIT, Copyright (c) 2026 diegosouzapw
52
-
53
- The MIT licence covers the source it was applied to. It does NOT grant permission to use a
54
- provider's consumer subscription, to copy user credentials from another product, to reach private or
55
- reverse-engineered endpoints, or any trademark right in provider names or logos. The provider logo
56
- tree is deliberately not imported by this work (report §12), and per-file intake review remains
57
- mandatory even under an MIT root — the audited upstream head carries retirement migrations for
58
- GPL-derived and provenance-hold integrations, which at this pinned tag have not yet landed
59
- (see PROVENANCE.md).
1
+ NOTICE
2
+ ======
3
+
4
+ Third-party attributions for the Winter agent SDK.
5
+
6
+ This file records material that Winter DERIVED FROM third-party artifacts. Winter copies no source
7
+ code from any of them; what it takes is protocol facts — endpoint URLs, form-field names, client
8
+ identifiers and scope strings — which it needs in order to speak to a vendor's service at all. Each
9
+ entry names the exact commit the values were read at, so the derivation is re-checkable.
10
+
11
+
12
+ -------------------------------------------------------------------------------
13
+ xai-org/grok-build
14
+ -------------------------------------------------------------------------------
15
+
16
+ Repository: https://github.com/xai-org/grok-build
17
+ Commit: 72a61251fcffb464bcc687aeb5a998e5a98ec0c9
18
+ License: Apache License, Version 2.0
19
+ https://www.apache.org/licenses/LICENSE-2.0
20
+ Copyright: Copyright 2023-2026 SpaceXAI
21
+
22
+ Winter's `xai-oauth` provider derives the following constants and request shapes from this
23
+ repository's authentication module, in order to perform its own OAuth 2.0 device authorization
24
+ grant (RFC 8628) against xAI's public, secret-less OAuth client:
25
+
26
+ - the public OAuth client identifier
27
+ - the OAuth issuer, device-authorization endpoint and token endpoint
28
+ - the requested scope set
29
+ - the name of the form field the flow carries a client identity in
30
+ - the shape (field names) of the device-authorization and token requests
31
+
32
+ No source code from this repository is copied into Winter, and no part of Winter is a derivative
33
+ work of it. The derivation is recorded, with per-value line citations, in:
34
+
35
+ packages/conformance/compat/xai/grok-build/derived-shapes-p6b-xai.md
36
+
37
+ Winter identifies ITSELF in that flow. It sends its own `User-Agent` (`winter-agent-sdk/<version>`)
38
+ and its own name in the flow's identity field, and it does not send xAI's product-identity or
39
+ telemetry headers. Winter is not affiliated with or endorsed by SpaceXAI, and "Grok" and "Grok Build"
40
+ are the marks of their owner; they appear here and in the capture solely to identify the artifact
41
+ these values were derived from.
package/PROVENANCE.md CHANGED
@@ -7,8 +7,8 @@ The committed catalog is the merge of two layers, performed by `scripts/provider
7
7
 
8
8
  | Layer | Source | Owner | Present |
9
9
  | --- | --- | --- | --- |
10
- | upstream | `generated/upstream-layer.json`, extracted from the pinned OmniRoute tree by `scripts/provider-source-sync.ts` | the extractor | **yes** — 106 providers, 540 models |
11
- | overlay | `overlay/providers.json` + `overlay/models.json`, hand-authored and reviewed | Winter | yes — 64 providers, 65 models |
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 — 64 providers, 117 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
@@ -113,11 +113,11 @@ and wants to refresh this document by name — not a second gate.
113
113
 
114
114
  <!-- BEGIN GENERATED: admission-tier census (bun run scripts/provenance-tiers.ts) -->
115
115
 
116
- Generated from `generated/catalog.json` (`v3.8.50+winter.1`, 166 provider rows). Do not edit by hand.
116
+ Generated from `generated/catalog.json` (`v3.8.50+winter.1`, 171 provider rows). Do not edit by hand.
117
117
 
118
118
  | Tier | Rows | What it means |
119
119
  | --- | ---: | --- |
120
- | **fetched-document** | 39 | a vendor page this repository retrieved and read, on a recorded date |
120
+ | **fetched-document** | 44 | a vendor page this repository retrieved and read, on a recorded date |
121
121
  | **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 |
122
122
  | **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` |
123
123
  | **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` |
@@ -315,7 +315,7 @@ unfalsifiable against its own source.
315
315
 
316
316
  ## What was excluded, and why
317
317
 
318
- `generated/rejections.json` carries all **722** rows. The counts below are generated from the ledger
318
+ `generated/rejections.json` carries all **723** rows. The counts below are generated from the ledger
319
319
  and pinned by `catalog-integrity.test.ts` → *"PROVENANCE.md's exclusion table matches the ledger,
320
320
  row for row"*, because a hand-typed count is the line that goes stale first and nobody notices.
321
321
 
@@ -342,7 +342,7 @@ row for row"*, because a hand-typed count is the line that goes stale first and
342
342
  | `category-system` | 1 | `auto` is routing policy, which this layer bans |
343
343
  | `duplicate-id` | 1 | upstream's second `gpt-4o` |
344
344
  | `no-registry-entry` | 1 | `azure-openai` — catalogued upstream, with no backend entry |
345
- | **`out-of-scope`** | 1 | **`gemini-3.1-flash-tts-preview`** — a TEXT-TO-SPEECH model. WS-13 §4 is a MUST: `tts` rows never feed the worker-model picker, and `scope` is per PROVIDER, so a `gemini` row cannot declare itself `tts` while its provider is `llm`. Excluded through the allowlist's reviewed `modelOverrides`, never a name heuristic — a heuristic would silently drop a future model whose id happened to match |
345
+ | **`out-of-scope`** | 2 | **`gemini-3.1-flash-tts-preview`** is a TEXT-TO-SPEECH model: WS-13 §4 is a MUST, so `tts` rows never feed the worker-model picker. **`deepseek-v4-flash`** is a retired legacy id that DeepSeek temporarily routes to canonical `deepseek-flash`; it is excluded from the stale upstream layer so the catalog has one canonical row with the legacy id as its alias. Both are reviewed `modelOverrides`, never name heuristics |
346
346
 
347
347
  **`unrepresentable-protocol` is the interesting one.** Upstream's `vertex` entry lists eleven
348
348
  `claude-*` models with `targetFormat: "claude"` — Claude models served over Vertex's endpoint in the
@@ -423,7 +423,7 @@ reviewed allowlist change" a property of the pipeline instead of a promise.
423
423
  ## Pricing
424
424
 
425
425
  `overlay/models.json` carries list prices for the cohort rows below, each with the vendor's own
426
- pricing page as `sourceRef` and the observation instant. The set is pinned by name in
426
+ official pricing or model page as `sourceRef` and the observation instant. The set is pinned by name in
427
427
  `src/extract/catalog-integrity.test.ts`, so a row gaining or losing a price is a deliberate edit:
428
428
 
429
429
  | Model | Input | Output | Cache read | Cache write | Source |
@@ -436,10 +436,24 @@ pricing page as `sourceRef` and the observation instant. The set is pinned by na
436
436
  | `google/gemini-3.5-flash-lite` | 0.30 | 2.50 | 0.03 | — | ai.google.dev/gemini-api/docs/pricing |
437
437
  | `google/gemini-3.8-flash` | 0.75 | 3.75 | 0.075 | — | ai.google.dev/gemini-api/docs/pricing |
438
438
  | `openai/gpt-4.1` | 2.00 | 8.00 | 0.50 | — | developers.openai.com/api/docs/pricing |
439
+ | `openai/gpt-4.1-mini` | 0.40 | 1.60 | 0.10 | — | developers.openai.com/api/docs/models/gpt-4.1-mini |
440
+ | `openai/gpt-4.1-nano` | 0.10 | 0.40 | 0.025 | — | developers.openai.com/api/docs/models/gpt-4.1-nano |
441
+ | `openai/gpt-4o` | 2.50 | 10.00 | 1.25 | — | developers.openai.com/api/docs/models/gpt-4o |
442
+ | `openai/gpt-4o-2024-11-20` | 2.50 | 10.00 | 1.25 | — | developers.openai.com/api/docs/models/gpt-4o |
443
+ | `openai/gpt-4o-mini` | 0.15 | 0.60 | 0.075 | — | developers.openai.com/api/docs/models/gpt-4o-mini |
444
+ | `openai/gpt-5.4` | 2.50 | 15.00 | 0.25 | — | developers.openai.com/api/docs/models/gpt-5.4 |
445
+ | `openai/gpt-5.4-mini` | 0.75 | 4.50 | 0.075 | — | developers.openai.com/api/docs/models/gpt-5.4-mini |
446
+ | `openai/gpt-5.4-nano` | 0.20 | 1.25 | 0.02 | — | developers.openai.com/api/docs/models/gpt-5.4-nano |
447
+ | `openai/gpt-5.4-pro` | 30.00 | 180.00 | — | — | developers.openai.com/api/docs/models/gpt-5.4-pro |
448
+ | `openai/gpt-5.5` | 5.00 | 30.00 | 0.50 | — | developers.openai.com/api/docs/models/gpt-5.5 |
449
+ | `openai/gpt-5.5-pro` | 30.00 | 180.00 | — | — | developers.openai.com/api/docs/models/gpt-5.5-pro |
450
+ | `openai/gpt-5.6` | 4.00 | 20.00 | 0.40 | — | developers.openai.com/api/docs/models/gpt-5.6-sol |
439
451
  | `openai/gpt-5.6-luna` | 0.20 | 1.20 | 0.02 | — | developers.openai.com/api/docs/pricing |
440
452
  | `openai/gpt-5.6-sol` | 4.00 | 20.00 | 0.40 | — | developers.openai.com/api/docs/pricing |
441
453
  | `openai/gpt-5.6-terra` | 2.00 | 12.00 | 0.20 | — | developers.openai.com/api/docs/pricing |
442
454
  | `openai/gpt-6-astra` | 10.00 | 50.00 | 1.00 | 12.50 | developers.openai.com/api/docs/pricing |
455
+ | `openai/o3` | 2.00 | 8.00 | 0.50 | — | developers.openai.com/api/docs/models/o3 |
456
+ | `openai/o3-mini` | 1.10 | 4.40 | 0.55 | — | developers.openai.com/api/docs/models/o3-mini |
443
457
  | `openai/o4-mini` | 1.10 | 4.40 | 0.275 | — | developers.openai.com/api/docs/pricing |
444
458
  | `xai/grok-4.6` | 2.00 | 6.00 | 0.50 | — | docs.x.ai/docs/models |
445
459
 
@@ -596,3 +610,34 @@ document (`scanForSecrets`), and the extractor runs the **same** scan over the r
596
610
  a debug dump no output-side scan would ever see. Field names carrying credential or identity
597
611
  material (`oauth`, `anonymousApiKey`, `headers`, `extraHeaders`, `defaultHeaders`) are rejected on
598
612
  sight, whatever their shape. WS-13 §6 is categorical: descriptors never contain secrets.
613
+
614
+ ## Copied-files register (WS-13 §13)
615
+
616
+ Moved here from this package's own `NOTICE` (P7a fix wave r3 (I3)), which now ships the root
617
+ `NOTICE`'s Apache-2.0 `xai-org/grok-build` attribution byte-for-byte instead — `generated/
618
+ catalog.json` cites that same repository, at the identical pinned commit, as the `sourceRef` for
619
+ several xAI model-catalogue rows (`crates/codegen/xai-grok-models/default_models.json`), so this
620
+ package is a genuine carrier of that derivation alongside `@yanlinglabs/winter-provider-runtime` and
621
+ `@yanlinglabs/winter-provider-conformance`. This register is unrelated to that attribution; it is the
622
+ WS-13 §13 acceptance requirement that "notices cover copied files", for the OmniRoute corpus.
623
+
624
+ NO THIRD-PARTY SOURCE CODE. As of this section's writing, this package contains no third-party
625
+ source code, and no file in it was copied from any upstream project.
626
+
627
+ Two upstream files ARE copied into this repository — but into `third_party/`, not here:
628
+
629
+ third_party/omniroute-provider-source/LICENSE <- OmniRoute's root LICENSE (MIT), verbatim
630
+ third_party/omniroute-provider-source/NOTICE <- OmniRoute's THIRD_PARTY_NOTICES.md, verbatim
631
+
632
+ Both are registered with their upstream path, git blob id, sha256 and byte count in
633
+ `third_party/omniroute-provider-source/extraction-manifest.json`, under `copiedFiles`, with
634
+ `modifications: "none"`.
635
+
636
+ WS-13 §5 permits a narrow, deliberate exception: a *pure helper* may be copied from the OmniRoute
637
+ provider corpus with clean per-file provenance. WS-13 §13's acceptance list then requires "notices
638
+ cover copied files". This register is that register. It is empty of code entries on purpose, and an
639
+ empty register is a stronger statement than a missing one: it says the exception has not been used,
640
+ rather than leaving a reader to guess.
641
+
642
+ If a future lane copies such a file, it appends an entry here naming the file, the upstream project,
643
+ the exact commit, the upstream path, and the licence — and the copy is not merged without it.
package/README.md CHANGED
@@ -43,4 +43,10 @@ a patch.
43
43
 
44
44
  MIT — see [`LICENSE`](./LICENSE), which ships in the published tarball.
45
45
 
46
- Third-party attribution for the upstream catalog data this package derives from is in [`NOTICE`](./NOTICE), which ships in the tarball beside this file.
46
+ This package's generated catalog data cites the Apache-2.0 licensed `xai-org/grok-build` as the
47
+ source for several xAI model-catalogue rows; that attribution is in [`NOTICE`](./NOTICE) — identical
48
+ to the [root `NOTICE`](../../NOTICE) — which ships in the tarball beside this file.
49
+
50
+ The separate OmniRoute-corpus extraction this package's catalog **data** is built from (no code
51
+ copied, two licence/notice files registered verbatim under `third_party/`) is documented in
52
+ [`PROVENANCE.md`](./PROVENANCE.md), which also ships in the tarball.
@@ -1,4 +1,4 @@
1
- import type { AdmissionTier, ModelFamilyDescriptor, ProviderProtocol, WinterCatalog, WinterModelDescriptor, WinterProviderDescriptor } from "../types.js";
1
+ import type { AdmissionTier, CapabilityEvidence, ModelFamilyDescriptor, ModelPricing, ProviderProtocol, WinterCatalog, WinterModelDescriptor, WinterProviderDescriptor } from "../types.js";
2
2
  import type { ExclusionClass, LiteralValue, Rejection } from "./literal-extractor.js";
3
3
  export interface AllowlistProviderRow {
4
4
  upstreamId: string;
@@ -184,7 +184,15 @@ export declare function buildUpstreamLayer(input: BuildUpstreamLayerInput): Upst
184
184
  /** Total, stable rejection ordering: a ledger diff between two upstream bumps must show CHANGES, not churn. */
185
185
  export declare function compareRejections(a: LedgerRejection, b: LedgerRejection): number;
186
186
  /** The overlay files a re-sync must NEVER write. Exported so the sync script's own guard and its test read the same list. */
187
- export declare const OVERLAY_FILES: readonly ["overlay/providers.json", "overlay/models.json", "overlay/families.json"];
187
+ export declare const OVERLAY_FILES: readonly ["overlay/providers.json", "overlay/models.json", "overlay/families.json", "overlay/pricing.json"];
188
+ /** Exact provider/model price evidence. A price is not a model override: it must never erase fields extracted for the same row. */
189
+ export type ModelPricingPatches = Record<string, CapabilityEvidence<ModelPricing>>;
190
+ /**
191
+ * Applies the reviewed price-only overlay after a whole-row merge. The explicit unknown-key refusal
192
+ * makes a stale price row fail closed instead of becoming orphaned documentation after an upstream
193
+ * model rename.
194
+ */
195
+ export declare function applyPricingPatches<T extends UnstampedModelDescriptor>(models: readonly T[], pricingPatches: Readonly<ModelPricingPatches>): T[];
188
196
  /**
189
197
  * The overlay-wins merge, mirroring `scripts/provider-catalog.ts`.
190
198
  *
@@ -210,4 +218,4 @@ export declare function mergeLayers(upstream: {
210
218
  }, overlay: {
211
219
  providers: WinterProviderDescriptor[];
212
220
  models: UnstampedModelDescriptor[];
213
- }, pin: WinterCatalog["upstream"], families?: readonly ModelFamilyDescriptor[]): WinterCatalog;
221
+ }, pin: WinterCatalog["upstream"], families?: readonly ModelFamilyDescriptor[], pricingPatches?: Readonly<ModelPricingPatches>): WinterCatalog;
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export type { CapabilityEvidence, CatalogValidationResult, EvidenceConfidence, E
2
2
  export { CATALOG_VOCABULARIES, scanForSecrets, validateCatalog } from "./validate.js";
3
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";
4
4
  export type { SlotNameResolution } from "./families.js";
5
+ export { CATALOG_TAG_RENAMES } from "./tag-renames.js";
5
6
  import type { WinterCatalog } from "./types.js";
6
7
  /**
7
8
  * The catalog compiled into this build.