@namzu/zen 2.3.0 → 2.5.0
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/CHANGELOG.md +30 -0
- package/README.md +36 -15
- package/dist/catalogue/catalogue.d.ts +106 -0
- package/dist/catalogue/catalogue.d.ts.map +1 -0
- package/dist/catalogue/catalogue.js +325 -0
- package/dist/catalogue/catalogue.js.map +1 -0
- package/dist/catalogue/derive.d.ts +203 -0
- package/dist/catalogue/derive.d.ts.map +1 -0
- package/dist/catalogue/derive.js +485 -0
- package/dist/catalogue/derive.js.map +1 -0
- package/dist/catalogue/fetch.d.ts +63 -0
- package/dist/catalogue/fetch.d.ts.map +1 -0
- package/dist/catalogue/fetch.js +180 -0
- package/dist/catalogue/fetch.js.map +1 -0
- package/dist/catalogue/index.d.ts +17 -0
- package/dist/catalogue/index.d.ts.map +1 -0
- package/dist/catalogue/index.js +17 -0
- package/dist/catalogue/index.js.map +1 -0
- package/dist/client.d.ts +5 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -8
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +6 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +63 -10
- package/dist/models.js.map +1 -1
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +4 -1
- package/dist/options.js.map +1 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +46 -0
- package/dist/prompt.js.map +1 -1
- package/dist/types.d.ts +11 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
- package/src/catalogue/catalogue.ts +462 -0
- package/src/catalogue/derive.ts +638 -0
- package/src/catalogue/fetch.ts +229 -0
- package/src/catalogue/index.ts +37 -0
- package/src/client.ts +47 -9
- package/src/index.ts +2 -1
- package/src/models.review.json +4 -0
- package/src/models.ts +64 -10
- package/src/options.ts +4 -1
- package/src/prompt.ts +51 -0
- package/src/types.ts +11 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @namzu/zen
|
|
2
2
|
|
|
3
|
+
## 2.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ab9108b: Derive the Zen and Go model catalogue at run time, opt-in. The new `@namzu/zen/catalogue` subpath exports `fetchZenCatalogue()`, which reads the same five sources the bundled snapshot is generated from (both documentation pages, models.dev and both `/models` answers) with a deadline and byte limit per source, and returns a whole validated catalogue plus a report, or rejects. It never returns a partial list. `buildZenCatalogue()` does the same derivation from texts you fetched yourself, and `parseZenCatalogue()` re-admits a stored copy strictly. A derivation is held to the same checks as a stored copy, so a result is never one its own saved copy would fail to read back.
|
|
8
|
+
|
|
9
|
+
Pass the result as the new `ZenConfig.catalogue`, or a function returning it, and the provider checks it before the bundled snapshot for routing, anonymous admission, listing, context windows and effort levels. With a runtime catalogue, a served id that no source gives a wire format for is listed as `<id> (no known wire format)` and can be called only with an explicit `protocol`; the bundled snapshot's entry for such an id, if it has one, is not used. A model name carrying a control, format or line-separator character is refused, in a derivation and in a stored copy.
|
|
10
|
+
|
|
11
|
+
Nothing changes unless you opt in. Importing the package, constructing a provider and `getZenModels`/`findZenModel` still read the bundled snapshot and make no network request. Without `catalogue`, `listModels()` returns what it did before. `ZEN_OMITTED_MODELS` (the reviewed omissions the snapshot was generated under) is now exported from `@namzu/zen` and `@namzu/zen/models`. The bundled roster is unchanged: 61 Zen and 28 Go models.
|
|
12
|
+
|
|
13
|
+
## 2.4.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- 3e43fc2: The Go catalogue carries `grok-4.7` on the Responses protocol, as the Go page
|
|
18
|
+
routes it. Four ids that both pages route but models.dev does not describe yet —
|
|
19
|
+
`zen/grok-4.7`, `zen/mimo-v2.6-flash-free`, `go/mimo-v2.6-flash` and
|
|
20
|
+
`go/mimo-v2.6-pro` — are not carried, because their limits cannot be derived. A
|
|
21
|
+
caller that needs one names the protocol and limits itself.
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- 3641102: On the Messages protocol, a cache request now places block-level breakpoints —
|
|
26
|
+
after the static system text, and on the last message before request-only
|
|
27
|
+
context — instead of the request-level `cacheControl` option, which the native
|
|
28
|
+
adapter sends as a top-level `cache_control`. That is Anthropic's automatic
|
|
29
|
+
caching, which puts its breakpoint on the last block: the request-only context
|
|
30
|
+
at the tail, which the next request replaces, so no later request read the
|
|
31
|
+
cached history. Other protocols are unchanged.
|
|
32
|
+
|
|
3
33
|
## 2.3.0
|
|
4
34
|
|
|
5
35
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -22,7 +22,9 @@ Free (`muse-spark-1.3-contributor-free`). Zen Go still requires its own API key.
|
|
|
22
22
|
pnpm add @namzu/sdk @namzu/zen zod@^3
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Requires Node.js 20+ and `@namzu/sdk >=36.0.0
|
|
25
|
+
Requires Node.js 20+ and `@namzu/sdk >=36.0.0`; the example below uses the
|
|
26
|
+
`turn` field `runAgent` returns from `@namzu/sdk` 44 on (earlier versions call
|
|
27
|
+
it `run`). The optional package uses the
|
|
26
28
|
official AI SDK provider adapters directly through `LanguageModelV3.doStream`;
|
|
27
29
|
it does not depend on the `ai` orchestration package or another Namzu provider.
|
|
28
30
|
|
|
@@ -32,7 +34,7 @@ import { ZenProvider } from '@namzu/zen'
|
|
|
32
34
|
|
|
33
35
|
const sessionId = generateSessionId()
|
|
34
36
|
const provider = new ZenProvider({ sessionId })
|
|
35
|
-
const { output,
|
|
37
|
+
const { output, turn, identity } = await runAgent({
|
|
36
38
|
provider,
|
|
37
39
|
model: 'muse-spark-1.3-contributor-free',
|
|
38
40
|
sessionId,
|
|
@@ -41,7 +43,7 @@ const { output, run, identity } = await runAgent({
|
|
|
41
43
|
})
|
|
42
44
|
|
|
43
45
|
console.log(output)
|
|
44
|
-
console.log(
|
|
46
|
+
console.log(turn.stopReason)
|
|
45
47
|
console.log(identity)
|
|
46
48
|
```
|
|
47
49
|
|
|
@@ -122,25 +124,44 @@ controls also depend on the wire. See the [SDK guide](../../../docs/sdk/zen.md)
|
|
|
122
124
|
for configuration and refusal details.
|
|
123
125
|
|
|
124
126
|
`listModels(signal?)` intersects the live service catalogue with supported
|
|
125
|
-
|
|
126
|
-
Static limits and USD-per-million-token prices are
|
|
127
|
-
services' own documentation pages
|
|
128
|
-
are estimates rather than invoices: context tiers, caches, Go
|
|
129
|
-
rates, subscription allowances and promotions can change the
|
|
130
|
-
charge.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
127
|
+
models and restricts anonymous results to the explicit public set.
|
|
128
|
+
Static limits and USD-per-million-token prices are derived from the
|
|
129
|
+
services' own documentation pages, models.dev and the services' `/models`
|
|
130
|
+
answers, and are estimates rather than invoices: context tiers, caches, Go
|
|
131
|
+
peak/off-peak rates, subscription allowances and promotions can change the
|
|
132
|
+
effective charge.
|
|
133
|
+
|
|
134
|
+
The package ships a bundled snapshot of that catalogue and never reaches the
|
|
135
|
+
network for it on its own. A host that wants a fresher roster opts in:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
import { ZenProvider } from '@namzu/zen'
|
|
139
|
+
import { fetchZenCatalogue } from '@namzu/zen/catalogue'
|
|
140
|
+
|
|
141
|
+
const { catalogue, report } = await fetchZenCatalogue({ timeoutMs: 10_000 })
|
|
142
|
+
const provider = new ZenProvider({ apiKey: process.env.OPENCODE_API_KEY, catalogue })
|
|
143
|
+
console.log(report.servedUndocumented)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`fetchZenCatalogue` reads the five sources with per-source deadlines and byte
|
|
147
|
+
limits, applies the same rules the snapshot is generated with, and either
|
|
148
|
+
returns a whole catalogue or rejects — never a partial list. A runtime
|
|
149
|
+
catalogue takes precedence over the bundled snapshot; an id the service serves
|
|
150
|
+
with no known wire is listed as `<id> (no known wire format)` and is callable
|
|
151
|
+
only with an explicit `protocol`. `parseZenCatalogue` re-admits a stored copy
|
|
152
|
+
with the same strictness. The Namzu CLI refreshes it this way in the
|
|
153
|
+
background on every launch. The bundled snapshot is regenerated by hand with
|
|
154
|
+
`scripts/generate-zen-models.mjs`.
|
|
134
155
|
|
|
135
156
|
Tests use the real provider adapters with local HTTP/SSE fixtures, including
|
|
136
157
|
tool continuations, signatures, cancellation and error classification.
|
|
137
158
|
An SDK kernel test executes a registered tool and feeds its result into the
|
|
138
|
-
next model request before completing the
|
|
159
|
+
next model request before completing the turn.
|
|
139
160
|
On 2026-09-08, live text inference on `muse-spark-1.3-contributor-free`
|
|
140
161
|
succeeded without an account key through installed OpenCode and Namzu's
|
|
141
|
-
driver. A live Namzu `run-stream` call with low effort and production tools
|
|
162
|
+
driver. A live Namzu `run-stream` call (the command is now `namzu exec --json`) with low effort and production tools
|
|
142
163
|
also read `verification.txt`, then returned its exact nonce, absent from
|
|
143
|
-
the prompt, after two model requests. The read succeeded and the
|
|
164
|
+
the prompt, after two model requests. The read succeeded and the turn ended
|
|
144
165
|
with `end_turn`. This validates that model's public text and file-tool path;
|
|
145
166
|
it does not establish every public or paid model, Go access, or billing.
|
|
146
167
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Zen catalogue assembled at run time from the same sources, by the same
|
|
3
|
+
* rules, as the bundled snapshot in `models.ts`.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here reaches the network. `buildZenCatalogue` turns source TEXTS
|
|
6
|
+
* into a catalogue; `fetch.ts` is the one place those texts are fetched, and
|
|
7
|
+
* only when a caller asks. `parseZenCatalogue` re-admits a catalogue a host
|
|
8
|
+
* stored earlier, with the same strictness a fresh derivation has: a document
|
|
9
|
+
* that is not exactly a catalogue is refused whole, never read in part.
|
|
10
|
+
*/
|
|
11
|
+
import { type ZenModel, type ZenService } from '../models.js';
|
|
12
|
+
import { type ZenOmissions } from './derive.js';
|
|
13
|
+
/** The stored shape's version. A document carrying any other is refused. */
|
|
14
|
+
export declare const ZEN_CATALOGUE_VERSION = 1;
|
|
15
|
+
/**
|
|
16
|
+
* A complete Zen and Go roster.
|
|
17
|
+
*
|
|
18
|
+
* `unrouted` lists, per service, the ids the service's own `/models` answer
|
|
19
|
+
* serves that this catalogue neither carries nor omits by review: no source
|
|
20
|
+
* states a wire for them (or the rest of what carrying needs), so a driver
|
|
21
|
+
* lists them as having no known wire format and calls one only when its host
|
|
22
|
+
* names the protocol explicitly.
|
|
23
|
+
*/
|
|
24
|
+
export interface ZenCatalogue {
|
|
25
|
+
readonly version: typeof ZEN_CATALOGUE_VERSION;
|
|
26
|
+
/** When the sources were read, as an ISO 8601 timestamp. */
|
|
27
|
+
readonly fetchedAt: string;
|
|
28
|
+
readonly zen: readonly ZenModel[];
|
|
29
|
+
readonly go: readonly ZenModel[];
|
|
30
|
+
readonly unrouted: Readonly<Record<ZenService, readonly string[]>>;
|
|
31
|
+
}
|
|
32
|
+
/** What a derivation found and did not carry. Informational: none of it fails a build. */
|
|
33
|
+
export interface ZenCatalogueReport {
|
|
34
|
+
/** `service/id`: served by the service, documented on no page, omitted by nothing. */
|
|
35
|
+
readonly servedUndocumented: readonly string[];
|
|
36
|
+
/** `[service/id, why]`: documented, not carryable, omitted by nothing. */
|
|
37
|
+
readonly undecided: readonly (readonly [string, string])[];
|
|
38
|
+
/** `service/id`: omissions upstream neither documents nor serves any more. */
|
|
39
|
+
readonly stale: readonly string[];
|
|
40
|
+
/** `service: name`: price rows no route row names. */
|
|
41
|
+
readonly orphanPrices: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
/** The five upstream documents, as the texts they were served as. */
|
|
44
|
+
export interface ZenCatalogueSources {
|
|
45
|
+
readonly docs: Readonly<Record<ZenService, string>>;
|
|
46
|
+
/** `https://models.dev/api.json`. */
|
|
47
|
+
readonly modelsDev: string;
|
|
48
|
+
/** Each service's own `/models` answer. */
|
|
49
|
+
readonly served: Readonly<Record<ZenService, string>>;
|
|
50
|
+
}
|
|
51
|
+
export interface BuildZenCatalogueOptions {
|
|
52
|
+
/**
|
|
53
|
+
* Reviewed omissions, as `service/id` keys or the review file's record.
|
|
54
|
+
* Defaults to the decisions the bundled snapshot was generated under.
|
|
55
|
+
*/
|
|
56
|
+
readonly omissions?: ZenOmissions;
|
|
57
|
+
/**
|
|
58
|
+
* The roster a result is measured against for collapse: fewer than 80% of
|
|
59
|
+
* its models on either service refuses the result. Defaults to the bundled
|
|
60
|
+
* snapshot.
|
|
61
|
+
*/
|
|
62
|
+
readonly baseline?: Readonly<Record<ZenService, readonly unknown[]>>;
|
|
63
|
+
/** Stamped as `fetchedAt`. Defaults to now. */
|
|
64
|
+
readonly fetchedAt?: Date;
|
|
65
|
+
}
|
|
66
|
+
export interface ZenCatalogueResult {
|
|
67
|
+
readonly catalogue: ZenCatalogue;
|
|
68
|
+
readonly report: ZenCatalogueReport;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Derive a catalogue from upstream texts, or throw `ZenCatalogueSourceError`.
|
|
72
|
+
*
|
|
73
|
+
* All or nothing: a page that moved, a models.dev that changed shape, a served
|
|
74
|
+
* answer with no ids or a roster that collapsed past the floor refuses the
|
|
75
|
+
* whole result, so a caller holding an older catalogue keeps it rather than
|
|
76
|
+
* receiving part of a new one.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildZenCatalogue(sources: ZenCatalogueSources, options?: BuildZenCatalogueOptions): ZenCatalogueResult;
|
|
79
|
+
/** A stored catalogue that is not exactly a catalogue. */
|
|
80
|
+
export declare class ZenCatalogueFormatError extends Error {
|
|
81
|
+
readonly name = "ZenCatalogueFormatError";
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Re-admit a catalogue a host stored — the output of `JSON.parse` on what
|
|
85
|
+
* `JSON.stringify(catalogue)` wrote — or throw `ZenCatalogueFormatError`.
|
|
86
|
+
*
|
|
87
|
+
* Every field is checked as strictly as a derivation checks its sources, and a
|
|
88
|
+
* document with one bad field is refused whole: a cache someone edited, a
|
|
89
|
+
* truncated write or a file from another version never becomes a partial
|
|
90
|
+
* roster.
|
|
91
|
+
*/
|
|
92
|
+
export declare function parseZenCatalogue(value: unknown): ZenCatalogue;
|
|
93
|
+
/**
|
|
94
|
+
* Exact lookup with the runtime catalogue first and the bundled snapshot
|
|
95
|
+
* second. `catalogue` undefined is the bundled snapshot alone.
|
|
96
|
+
*
|
|
97
|
+
* An id the runtime catalogue lists in `unrouted` is found in neither: the
|
|
98
|
+
* newer sources say the service serves it and state no wire for it, and the
|
|
99
|
+
* bundled snapshot's older entry is not allowed to answer for them. Falling
|
|
100
|
+
* back would route the model on a wire nobody states any more, anonymously
|
|
101
|
+
* too if the old entry said so, and without saying anything.
|
|
102
|
+
*/
|
|
103
|
+
export declare function findZenCatalogueModel(catalogue: ZenCatalogue | undefined, service: ZenService, id: string): ZenModel | undefined;
|
|
104
|
+
/** Whether a runtime catalogue lists `id` as served with no known wire format. */
|
|
105
|
+
export declare function isUnroutedZenModel(catalogue: ZenCatalogue | undefined, service: ZenService, id: string): boolean;
|
|
106
|
+
//# sourceMappingURL=catalogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../src/catalogue/catalogue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAEN,KAAK,QAAQ,EAEb,KAAK,UAAU,EAGf,MAAM,cAAc,CAAA;AACrB,OAAO,EAKN,KAAK,YAAY,EAMjB,MAAM,aAAa,CAAA;AAEpB,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,qBAAqB,CAAA;IAC9C,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAA;IACjC,QAAQ,CAAC,EAAE,EAAE,SAAS,QAAQ,EAAE,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;CAClE;AAED,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IAClC,sFAAsF;IACtF,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9C,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAA;IAC1D,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAED,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;IACnD,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;CACrD;AAED,MAAM,WAAW,wBAAwB;IACxC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAAA;IACpE,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,wBAA6B,GACpC,kBAAkB,CAiFpB;AA6ED,0DAA0D;AAC1D,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,SAAkB,IAAI,6BAA4B;CAClD;AAsGD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAmD9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACpC,SAAS,EAAE,YAAY,GAAG,SAAS,EACnC,OAAO,EAAE,UAAU,EACnB,EAAE,EAAE,MAAM,GACR,QAAQ,GAAG,SAAS,CAKtB;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,YAAY,GAAG,SAAS,EACnC,OAAO,EAAE,UAAU,EACnB,EAAE,EAAE,MAAM,GACR,OAAO,CAET"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Zen catalogue assembled at run time from the same sources, by the same
|
|
3
|
+
* rules, as the bundled snapshot in `models.ts`.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here reaches the network. `buildZenCatalogue` turns source TEXTS
|
|
6
|
+
* into a catalogue; `fetch.ts` is the one place those texts are fetched, and
|
|
7
|
+
* only when a caller asks. `parseZenCatalogue` re-admits a catalogue a host
|
|
8
|
+
* stored earlier, with the same strictness a fresh derivation has: a document
|
|
9
|
+
* that is not exactly a catalogue is refused whole, never read in part.
|
|
10
|
+
*/
|
|
11
|
+
import { ZEN_OMITTED_MODELS, findZenModel, getZenModels, } from '../models.js';
|
|
12
|
+
import { ZEN_SERVICES, ZenCatalogueSourceError, checkRosterFloor, derive, isDisplayableName, parsePage, parseServed, } from './derive.js';
|
|
13
|
+
/** The stored shape's version. A document carrying any other is refused. */
|
|
14
|
+
export const ZEN_CATALOGUE_VERSION = 1;
|
|
15
|
+
/**
|
|
16
|
+
* Derive a catalogue from upstream texts, or throw `ZenCatalogueSourceError`.
|
|
17
|
+
*
|
|
18
|
+
* All or nothing: a page that moved, a models.dev that changed shape, a served
|
|
19
|
+
* answer with no ids or a roster that collapsed past the floor refuses the
|
|
20
|
+
* whole result, so a caller holding an older catalogue keeps it rather than
|
|
21
|
+
* receiving part of a new one.
|
|
22
|
+
*/
|
|
23
|
+
export function buildZenCatalogue(sources, options = {}) {
|
|
24
|
+
const omissions = options.omissions ?? new Set(ZEN_OMITTED_MODELS);
|
|
25
|
+
const omitted = omissions instanceof Set ? omissions : new Set(Object.keys(omissions));
|
|
26
|
+
let modelsDev;
|
|
27
|
+
try {
|
|
28
|
+
modelsDev = JSON.parse(sources.modelsDev);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new ZenCatalogueSourceError(`models.dev is not JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
32
|
+
}
|
|
33
|
+
const carried = { zen: [], go: [] };
|
|
34
|
+
const unrouted = { zen: [], go: [] };
|
|
35
|
+
const servedUndocumented = [];
|
|
36
|
+
const undecided = [];
|
|
37
|
+
const stale = [];
|
|
38
|
+
const orphanPrices = [];
|
|
39
|
+
for (const { service, page, provider } of ZEN_SERVICES) {
|
|
40
|
+
const parsed = parsePage(sources.docs[service], { page, service });
|
|
41
|
+
const served = parseServed(service, sources.served[service]);
|
|
42
|
+
const entry = modelsDev !== null && typeof modelsDev === 'object'
|
|
43
|
+
? modelsDev[provider]
|
|
44
|
+
: undefined;
|
|
45
|
+
const models = entry !== null && typeof entry === 'object'
|
|
46
|
+
? entry.models
|
|
47
|
+
: undefined;
|
|
48
|
+
if (models === null || typeof models !== 'object' || Array.isArray(models)) {
|
|
49
|
+
throw new ZenCatalogueSourceError(`models.dev has no \`${provider}\` provider entry.`);
|
|
50
|
+
}
|
|
51
|
+
const derived = derive(service, parsed, provider, { models }, omitted, served);
|
|
52
|
+
carried[service] = derived.models.map(toZenModel);
|
|
53
|
+
const ids = new Set(carried[service].map((model) => model.id));
|
|
54
|
+
unrouted[service] = [...served]
|
|
55
|
+
.filter((id) => !ids.has(id) && !omitted.has(`${service}/${id}`))
|
|
56
|
+
.sort();
|
|
57
|
+
servedUndocumented.push(...derived.servedUncurried.map((id) => `${service}/${id}`));
|
|
58
|
+
undecided.push(...derived.undecided);
|
|
59
|
+
stale.push(...derived.stale.map((id) => `${service}/${id}`));
|
|
60
|
+
orphanPrices.push(...derived.orphanPrices.map((name) => `${service}: ${name}`));
|
|
61
|
+
}
|
|
62
|
+
checkRosterFloor(carried, options.baseline ?? { zen: getZenModels('zen'), go: getZenModels('go') });
|
|
63
|
+
// The result is admitted by the same checks a stored copy of it will face.
|
|
64
|
+
// A derivation that yields something `parseZenCatalogue` would refuse on the
|
|
65
|
+
// next launch — a NaN rate, a repeated id, a name no picker can show — is
|
|
66
|
+
// refused now, whole, instead of becoming this session's roster.
|
|
67
|
+
let catalogue;
|
|
68
|
+
try {
|
|
69
|
+
catalogue = parseZenCatalogue({
|
|
70
|
+
version: ZEN_CATALOGUE_VERSION,
|
|
71
|
+
fetchedAt: (options.fetchedAt ?? new Date()).toISOString(),
|
|
72
|
+
zen: carried.zen,
|
|
73
|
+
go: carried.go,
|
|
74
|
+
unrouted,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (!(error instanceof ZenCatalogueFormatError))
|
|
79
|
+
throw error;
|
|
80
|
+
throw new ZenCatalogueSourceError(`The derived catalogue is not one a stored copy could be read back as: ${error.message}`);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
catalogue,
|
|
84
|
+
report: Object.freeze({
|
|
85
|
+
servedUndocumented: Object.freeze(servedUndocumented),
|
|
86
|
+
undecided: Object.freeze(undecided.map((pair) => Object.freeze(pair))),
|
|
87
|
+
stale: Object.freeze(stale),
|
|
88
|
+
orphanPrices: Object.freeze(orphanPrices),
|
|
89
|
+
}),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** The shape the bundled snapshot uses: streaming stated, anonymity only when true. */
|
|
93
|
+
function toZenModel(model) {
|
|
94
|
+
return {
|
|
95
|
+
id: model.id,
|
|
96
|
+
name: model.name,
|
|
97
|
+
protocol: model.protocol,
|
|
98
|
+
contextWindow: model.contextWindow,
|
|
99
|
+
maxOutputTokens: model.maxOutputTokens,
|
|
100
|
+
inputModalities: [...model.inputModalities],
|
|
101
|
+
inputPrice: model.inputPrice,
|
|
102
|
+
outputPrice: model.outputPrice,
|
|
103
|
+
supportsToolUse: model.supportsToolUse,
|
|
104
|
+
supportsStreaming: true,
|
|
105
|
+
effortLevels: [...model.effortLevels],
|
|
106
|
+
...(model.supportsAnonymousAccess ? { supportsAnonymousAccess: true } : {}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function freezeCatalogue(catalogue) {
|
|
110
|
+
for (const service of ['zen', 'go']) {
|
|
111
|
+
for (const model of catalogue[service]) {
|
|
112
|
+
if (model.inputModalities)
|
|
113
|
+
Object.freeze(model.inputModalities);
|
|
114
|
+
if (model.effortLevels)
|
|
115
|
+
Object.freeze(model.effortLevels);
|
|
116
|
+
Object.freeze(model);
|
|
117
|
+
}
|
|
118
|
+
Object.freeze(catalogue[service]);
|
|
119
|
+
Object.freeze(catalogue.unrouted[service]);
|
|
120
|
+
}
|
|
121
|
+
Object.freeze(catalogue.unrouted);
|
|
122
|
+
return Object.freeze(catalogue);
|
|
123
|
+
}
|
|
124
|
+
const MODEL_ID = /^[a-z0-9][a-z0-9.-]*$/;
|
|
125
|
+
const PROTOCOLS = new Set([
|
|
126
|
+
'chat',
|
|
127
|
+
'responses',
|
|
128
|
+
'messages',
|
|
129
|
+
'google',
|
|
130
|
+
]);
|
|
131
|
+
const INPUT_MODALITIES = new Set([
|
|
132
|
+
'text',
|
|
133
|
+
'image',
|
|
134
|
+
'document',
|
|
135
|
+
]);
|
|
136
|
+
const EFFORTS = new Set([
|
|
137
|
+
'none',
|
|
138
|
+
'minimal',
|
|
139
|
+
'low',
|
|
140
|
+
'medium',
|
|
141
|
+
'high',
|
|
142
|
+
'xhigh',
|
|
143
|
+
'max',
|
|
144
|
+
'ultra',
|
|
145
|
+
]);
|
|
146
|
+
const MODEL_KEYS = new Set([
|
|
147
|
+
'id',
|
|
148
|
+
'name',
|
|
149
|
+
'protocol',
|
|
150
|
+
'contextWindow',
|
|
151
|
+
'maxOutputTokens',
|
|
152
|
+
'inputModalities',
|
|
153
|
+
'inputPrice',
|
|
154
|
+
'outputPrice',
|
|
155
|
+
'supportsToolUse',
|
|
156
|
+
'supportsStreaming',
|
|
157
|
+
'effortLevels',
|
|
158
|
+
'supportsAnonymousAccess',
|
|
159
|
+
]);
|
|
160
|
+
/** A stored catalogue that is not exactly a catalogue. */
|
|
161
|
+
export class ZenCatalogueFormatError extends Error {
|
|
162
|
+
name = 'ZenCatalogueFormatError';
|
|
163
|
+
}
|
|
164
|
+
function invalid(where, why) {
|
|
165
|
+
throw new ZenCatalogueFormatError(`${where} ${why}.`);
|
|
166
|
+
}
|
|
167
|
+
function record(value, where) {
|
|
168
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
169
|
+
invalid(where, 'is not an object');
|
|
170
|
+
}
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
function onlyKeys(value, keys, where) {
|
|
174
|
+
for (const key of Object.keys(value)) {
|
|
175
|
+
if (!keys.has(key))
|
|
176
|
+
invalid(`${where}.${key}`, 'is not a catalogue field');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function positiveInteger(value, where) {
|
|
180
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
181
|
+
invalid(where, 'is not a positive integer');
|
|
182
|
+
}
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
185
|
+
function price(value, where) {
|
|
186
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
|
|
187
|
+
invalid(where, 'is not a non-negative price');
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
function members(value, allowed, where, nonEmpty) {
|
|
192
|
+
if (!Array.isArray(value))
|
|
193
|
+
invalid(where, 'is not a list');
|
|
194
|
+
if (nonEmpty && value.length === 0)
|
|
195
|
+
invalid(where, 'is empty');
|
|
196
|
+
for (const item of value) {
|
|
197
|
+
if (typeof item !== 'string' || !allowed.has(item)) {
|
|
198
|
+
invalid(where, `names ${JSON.stringify(item)}, which is not one it may name`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (new Set(value).size !== value.length)
|
|
202
|
+
invalid(where, 'repeats an entry');
|
|
203
|
+
return [...value];
|
|
204
|
+
}
|
|
205
|
+
function parseModel(value, service, where) {
|
|
206
|
+
const raw = record(value, where);
|
|
207
|
+
onlyKeys(raw, MODEL_KEYS, where);
|
|
208
|
+
const id = raw.id;
|
|
209
|
+
if (typeof id !== 'string' || !MODEL_ID.test(id))
|
|
210
|
+
invalid(`${where}.id`, 'is not a model id');
|
|
211
|
+
const name = raw.name;
|
|
212
|
+
if (typeof name !== 'string' ||
|
|
213
|
+
name.trim().length === 0 ||
|
|
214
|
+
name.length > 200 ||
|
|
215
|
+
!isDisplayableName(name)) {
|
|
216
|
+
invalid(`${where}.name`, 'is not a model name');
|
|
217
|
+
}
|
|
218
|
+
const protocol = raw.protocol;
|
|
219
|
+
if (typeof protocol !== 'string' || !PROTOCOLS.has(protocol)) {
|
|
220
|
+
invalid(`${where}.protocol`, 'is not a Zen protocol');
|
|
221
|
+
}
|
|
222
|
+
if (typeof raw.supportsToolUse !== 'boolean') {
|
|
223
|
+
invalid(`${where}.supportsToolUse`, 'is not true or false');
|
|
224
|
+
}
|
|
225
|
+
if (raw.supportsStreaming !== true)
|
|
226
|
+
invalid(`${where}.supportsStreaming`, 'is not true');
|
|
227
|
+
const anonymous = raw.supportsAnonymousAccess;
|
|
228
|
+
if (anonymous !== undefined && (anonymous !== true || service !== 'zen')) {
|
|
229
|
+
invalid(`${where}.supportsAnonymousAccess`, 'is only ever `true`, and only on zen');
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
id,
|
|
233
|
+
name,
|
|
234
|
+
protocol: protocol,
|
|
235
|
+
contextWindow: positiveInteger(raw.contextWindow, `${where}.contextWindow`),
|
|
236
|
+
maxOutputTokens: positiveInteger(raw.maxOutputTokens, `${where}.maxOutputTokens`),
|
|
237
|
+
inputModalities: members(raw.inputModalities, INPUT_MODALITIES, `${where}.inputModalities`, true),
|
|
238
|
+
inputPrice: price(raw.inputPrice, `${where}.inputPrice`),
|
|
239
|
+
outputPrice: price(raw.outputPrice, `${where}.outputPrice`),
|
|
240
|
+
supportsToolUse: raw.supportsToolUse,
|
|
241
|
+
supportsStreaming: true,
|
|
242
|
+
effortLevels: members(raw.effortLevels, EFFORTS, `${where}.effortLevels`, false),
|
|
243
|
+
...(anonymous === true ? { supportsAnonymousAccess: true } : {}),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Re-admit a catalogue a host stored — the output of `JSON.parse` on what
|
|
248
|
+
* `JSON.stringify(catalogue)` wrote — or throw `ZenCatalogueFormatError`.
|
|
249
|
+
*
|
|
250
|
+
* Every field is checked as strictly as a derivation checks its sources, and a
|
|
251
|
+
* document with one bad field is refused whole: a cache someone edited, a
|
|
252
|
+
* truncated write or a file from another version never becomes a partial
|
|
253
|
+
* roster.
|
|
254
|
+
*/
|
|
255
|
+
export function parseZenCatalogue(value) {
|
|
256
|
+
const raw = record(value, 'catalogue');
|
|
257
|
+
onlyKeys(raw, new Set(['version', 'fetchedAt', 'zen', 'go', 'unrouted']), 'catalogue');
|
|
258
|
+
if (raw.version !== ZEN_CATALOGUE_VERSION) {
|
|
259
|
+
invalid('catalogue.version', `is not ${ZEN_CATALOGUE_VERSION}`);
|
|
260
|
+
}
|
|
261
|
+
const fetchedAt = raw.fetchedAt;
|
|
262
|
+
if (typeof fetchedAt !== 'string' ||
|
|
263
|
+
Number.isNaN(Date.parse(fetchedAt)) ||
|
|
264
|
+
new Date(fetchedAt).toISOString() !== fetchedAt) {
|
|
265
|
+
invalid('catalogue.fetchedAt', 'is not an ISO 8601 timestamp');
|
|
266
|
+
}
|
|
267
|
+
const unroutedRaw = record(raw.unrouted, 'catalogue.unrouted');
|
|
268
|
+
onlyKeys(unroutedRaw, new Set(['zen', 'go']), 'catalogue.unrouted');
|
|
269
|
+
const carried = { zen: [], go: [] };
|
|
270
|
+
const unrouted = { zen: [], go: [] };
|
|
271
|
+
for (const service of ['zen', 'go']) {
|
|
272
|
+
const list = raw[service];
|
|
273
|
+
if (!Array.isArray(list) || list.length === 0) {
|
|
274
|
+
invalid(`catalogue.${service}`, 'is not a non-empty list of models');
|
|
275
|
+
}
|
|
276
|
+
carried[service] = list.map((entry, index) => parseModel(entry, service, `catalogue.${service}[${index}]`));
|
|
277
|
+
const ids = new Set(carried[service].map((model) => model.id));
|
|
278
|
+
if (ids.size !== carried[service].length)
|
|
279
|
+
invalid(`catalogue.${service}`, 'repeats a model id');
|
|
280
|
+
const names = unroutedRaw[service];
|
|
281
|
+
if (!Array.isArray(names))
|
|
282
|
+
invalid(`catalogue.unrouted.${service}`, 'is not a list');
|
|
283
|
+
for (const id of names) {
|
|
284
|
+
if (typeof id !== 'string' || !MODEL_ID.test(id)) {
|
|
285
|
+
invalid(`catalogue.unrouted.${service}`, `names ${JSON.stringify(id)}, which is not a model id`);
|
|
286
|
+
}
|
|
287
|
+
if (ids.has(id))
|
|
288
|
+
invalid(`catalogue.unrouted.${service}`, `names the carried model "${id}"`);
|
|
289
|
+
}
|
|
290
|
+
if (new Set(names).size !== names.length) {
|
|
291
|
+
invalid(`catalogue.unrouted.${service}`, 'repeats an id');
|
|
292
|
+
}
|
|
293
|
+
unrouted[service] = [...names];
|
|
294
|
+
}
|
|
295
|
+
return freezeCatalogue({
|
|
296
|
+
version: ZEN_CATALOGUE_VERSION,
|
|
297
|
+
fetchedAt,
|
|
298
|
+
zen: carried.zen,
|
|
299
|
+
go: carried.go,
|
|
300
|
+
unrouted,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Exact lookup with the runtime catalogue first and the bundled snapshot
|
|
305
|
+
* second. `catalogue` undefined is the bundled snapshot alone.
|
|
306
|
+
*
|
|
307
|
+
* An id the runtime catalogue lists in `unrouted` is found in neither: the
|
|
308
|
+
* newer sources say the service serves it and state no wire for it, and the
|
|
309
|
+
* bundled snapshot's older entry is not allowed to answer for them. Falling
|
|
310
|
+
* back would route the model on a wire nobody states any more, anonymously
|
|
311
|
+
* too if the old entry said so, and without saying anything.
|
|
312
|
+
*/
|
|
313
|
+
export function findZenCatalogueModel(catalogue, service, id) {
|
|
314
|
+
const runtime = catalogue?.[service].find((model) => model.id === id);
|
|
315
|
+
if (runtime)
|
|
316
|
+
return runtime;
|
|
317
|
+
if (isUnroutedZenModel(catalogue, service, id))
|
|
318
|
+
return undefined;
|
|
319
|
+
return findZenModel(service, id);
|
|
320
|
+
}
|
|
321
|
+
/** Whether a runtime catalogue lists `id` as served with no known wire format. */
|
|
322
|
+
export function isUnroutedZenModel(catalogue, service, id) {
|
|
323
|
+
return catalogue?.unrouted[service].includes(id) === true;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=catalogue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../src/catalogue/catalogue.ts"],"names":[],"mappings":"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"}
|