@oh-my-pi/pi-catalog 18.12.0 → 18.12.2
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 +12 -0
- package/dist/types/compat/request-compression.d.ts +4 -2
- package/dist/types/provider-models/special.d.ts +6 -1
- package/package.json +4 -4
- package/src/compat/axes.ts +5 -3
- package/src/compat/request-compression.ts +4 -2
- package/src/compat/rules/README.md +1 -1
- package/src/compat/rules/providers/anthropic.kdl +4 -2
- package/src/compat/rules/providers/openrouter.kdl +8 -1
- package/src/compat/rules/providers/typesafe.kdl +11 -1
- package/src/compat/rules/providers/web.kdl +7 -0
- package/src/compat/rules/runtime/behavior.kdl +3 -2
- package/src/compat/rules.json +1 -1
- package/src/models.json +1 -1
- package/src/provider-models/special.ts +14 -9
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.12.2] - 2026-10-18
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Seeded TypeSafe `jev-1.14.0` and OpenRouter `typesafe/jev-1.14`, and made them the `judge` role defaults and TypeSafe's default model; TypeSafe discovery keeps seeded ids its alias-only `/v1/models` listing omits
|
|
10
|
+
|
|
11
|
+
## [18.12.1] - 2026-10-17
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Anthropic's `request-encoding-rejection` now also matches the API's "request body is not valid JSON" 400, which a gzip body gets when a proxy drops its `Content-Encoding` header ([#16108](https://github.com/can1357/oh-my-pi/pull/16108) by [@alphastorm](https://github.com/alphastorm))
|
|
16
|
+
|
|
5
17
|
## [18.12.0] - 2026-10-17
|
|
6
18
|
|
|
7
19
|
### Added
|
|
@@ -6,8 +6,10 @@ export interface RequestCompressionPolicy {
|
|
|
6
6
|
/** Accepted encodings, most preferred first. */
|
|
7
7
|
readonly encodings: readonly RequestBodyEncoding[];
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
* treats every 400/415 as a possible rejection.
|
|
9
|
+
* Pattern of a JSON 400/415 error body that rejects the encoding;
|
|
10
|
+
* `undefined` treats every JSON 400/415 as a possible rejection. A
|
|
11
|
+
* 400/403/415 whose body is not JSON (presumed a proxy's answer, not the
|
|
12
|
+
* host's) is a possible rejection either way.
|
|
11
13
|
*/
|
|
12
14
|
readonly rejection: RegExp | undefined;
|
|
13
15
|
}
|
|
@@ -73,7 +73,12 @@ export interface TypeSafeModelManagerConfig {
|
|
|
73
73
|
baseUrl?: string;
|
|
74
74
|
fetch?: FetchImpl;
|
|
75
75
|
}
|
|
76
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Discover account-visible judge models while keeping the bundled offline seed. `GET /v1/models` lists
|
|
78
|
+
* only aliases, yet TypeSafe accepts versioned ids whether or not they are listed, so a successful
|
|
79
|
+
* discovery is extended with the seed rows it omits (the pinned default judge, `jev-1.14.0`) instead of
|
|
80
|
+
* pruning them as `dynamicModelsAuthoritative` otherwise would.
|
|
81
|
+
*/
|
|
77
82
|
export declare function typesafeModelManagerOptions(config?: TypeSafeModelManagerConfig): ModelManagerOptions<"typesafe">;
|
|
78
83
|
export interface ZaiModelManagerConfig {
|
|
79
84
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oh-my-pi/pi-catalog",
|
|
3
|
-
"version": "18.12.
|
|
3
|
+
"version": "18.12.2",
|
|
4
4
|
"description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -93,12 +93,12 @@
|
|
|
93
93
|
"gen:proto": "bun scripts/generate-protocols.ts"
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
|
-
"@oh-my-pi/omptype": "18.12.
|
|
97
|
-
"@oh-my-pi/pi-utils": "18.12.
|
|
96
|
+
"@oh-my-pi/omptype": "18.12.2",
|
|
97
|
+
"@oh-my-pi/pi-utils": "18.12.2"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@bgotink/kdl": "0.4.0",
|
|
101
|
-
"@oh-my-pi/pi-ai": "18.12.
|
|
101
|
+
"@oh-my-pi/pi-ai": "18.12.2",
|
|
102
102
|
"@types/bun": "^1.3.14"
|
|
103
103
|
},
|
|
104
104
|
"engines": {
|
package/src/compat/axes.ts
CHANGED
|
@@ -513,9 +513,11 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
|
|
|
513
513
|
*/
|
|
514
514
|
"endpoint-hosts": { key: "endpointHosts", set: "catalog", shape: "array" },
|
|
515
515
|
/**
|
|
516
|
-
* Pattern of the 400/415 error body the host returns when it cannot
|
|
517
|
-
* a compressed request body. Unassigned: every 400/415 is a
|
|
518
|
-
* rejection and is re-checked with an uncompressed resend.
|
|
516
|
+
* Pattern of the JSON 400/415 error body the host returns when it cannot
|
|
517
|
+
* decode a compressed request body. Unassigned: every JSON 400/415 is a
|
|
518
|
+
* possible rejection and is re-checked with an uncompressed resend. Either
|
|
519
|
+
* way, a 400/403/415 whose body is not JSON (presumed a proxy's answer, not
|
|
520
|
+
* the host's) is re-checked too.
|
|
519
521
|
*/
|
|
520
522
|
"request-encoding-rejection": { key: "requestEncodingRejection", set: "catalog", shape: "scalar" },
|
|
521
523
|
/**
|
|
@@ -10,8 +10,10 @@ export interface RequestCompressionPolicy {
|
|
|
10
10
|
/** Accepted encodings, most preferred first. */
|
|
11
11
|
readonly encodings: readonly RequestBodyEncoding[];
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
* treats every 400/415 as a possible rejection.
|
|
13
|
+
* Pattern of a JSON 400/415 error body that rejects the encoding;
|
|
14
|
+
* `undefined` treats every JSON 400/415 as a possible rejection. A
|
|
15
|
+
* 400/403/415 whose body is not JSON (presumed a proxy's answer, not the
|
|
16
|
+
* host's) is a possible rejection either way.
|
|
15
17
|
*/
|
|
16
18
|
readonly rejection: RegExp | undefined;
|
|
17
19
|
}
|
|
@@ -231,7 +231,7 @@ One object axis carries a computed form: `long-context-cost` accepts either the
|
|
|
231
231
|
|
|
232
232
|
`endpoint-hosts` lists the HTTPS hostnames a provider serves besides its bundled base URL's host, such as Copilot's per-plan `api.<plan>.githubcopilot.com` hosts. That host plus these define the provider's own endpoint (`isCatalogEndpointUrl`), which separates first-party traffic from a custom model or provider override that keeps a catalog provider id but points `baseUrl` at a gateway, proxy, or local server. Connection prewarming and request compression act only on the provider's own endpoint.
|
|
233
233
|
|
|
234
|
-
`request-encodings` lists the `Content-Encoding`s (`zstd`, `gzip`) a provider's own endpoint decodes on request bodies, most preferred first; pi-ai's `wrapFetchForRequestCompression` reads them through `resolveRequestCompression` and compresses bodies of 1 KiB or more. A proxy, relay, or `ANTHROPIC_BASE_URL` reroute never receives bytes it cannot read. `request-encoding-rejection` is a regular expression for the 400/415 error body the host returns when it cannot decode the body; unassigned, every 400/415 is re-checked with an uncompressed resend. A rejected encoding is dropped for that host only after the uncompressed resend succeeds. Assign them only from a live probe of every endpoint host: a compressed body, the same plain JSON mislabeled as compressed (a decoding host must reject it), and a real request.
|
|
234
|
+
`request-encodings` lists the `Content-Encoding`s (`zstd`, `gzip`) a provider's own endpoint decodes on request bodies, most preferred first; pi-ai's `wrapFetchForRequestCompression` reads them through `resolveRequestCompression` and compresses bodies of 1 KiB or more. A proxy, relay, or `ANTHROPIC_BASE_URL` reroute never receives bytes it cannot read. `request-encoding-rejection` is a regular expression for the JSON 400/415 error body the host returns when it cannot decode the body; unassigned, every JSON 400/415 is re-checked with an uncompressed resend. A 400/403/415 whose body is not JSON (empty included) is presumed to come from a proxy in front of the host, such as a TLS-inspecting gateway that refuses compressed uploads, and is re-checked either way, until the uncompressed resend draws the same status from that host. A rejected encoding is dropped for that host only after the uncompressed resend succeeds. Assign them only from a live probe of every endpoint host: a compressed body, the same plain JSON mislabeled as compressed (a decoding host must reject it), and a real request.
|
|
235
235
|
|
|
236
236
|
`judgment-questions-max` is the most questions one System One judgment request may carry (razorback16/openjev: 256; Cloudflare Clef on Workers AI and through OpenRouter Decisions: 64; unidentified `*openjev*` deployments: 16). The coding agent reads it through `resolveJudgmentQuestionsMax` and `NativeJudge` splits larger requests into parallel chunks; unassigned means the endpoint takes any batch size. [`providers/judgment-questions.kdl`](providers/judgment-questions.kdl) lists the servers verified uncapped or not isolatable.
|
|
237
237
|
|
|
@@ -93,9 +93,11 @@ provider "anthropic" {
|
|
|
93
93
|
image-count-budget 90
|
|
94
94
|
official-image-count-budget 600
|
|
95
95
|
// The Messages API decodes gzip request bodies and rejects zstd and br
|
|
96
|
-
// with a 400 (`request_body_encoding_invalid`).
|
|
96
|
+
// with a 400 (`request_body_encoding_invalid`). Gzip bytes that arrive
|
|
97
|
+
// without their `Content-Encoding` (a proxy dropped the header) get a 400
|
|
98
|
+
// "The request body is not valid JSON" (live, 2026-10-17).
|
|
97
99
|
request-encodings "gzip"
|
|
98
|
-
request-encoding-rejection "request_body_encoding_invalid|Unsupported Content-Encoding"
|
|
100
|
+
request-encoding-rejection "request_body_encoding_invalid|Unsupported Content-Encoding|request body is not valid JSON"
|
|
99
101
|
class "anthropic" {
|
|
100
102
|
revision "<4.6" {
|
|
101
103
|
official-image-count-budget 100
|
|
@@ -17,7 +17,8 @@ provider "openrouter" {
|
|
|
17
17
|
|
|
18
18
|
// TypeSafe's Jev answers only through the Decisions API (`/api/alpha/decisions`,
|
|
19
19
|
// System One wire shape); the default `/models` roster omits `text->decisions`
|
|
20
|
-
// rows, so the alias
|
|
20
|
+
// rows, so the alias and the pinned default judge are authored here and
|
|
21
|
+
// discovery refreshes the family.
|
|
21
22
|
seed api="openrouter-decisions" base-url="https://openrouter.ai/api/alpha" bundle="always" {
|
|
22
23
|
model "~typesafe/jev-latest" name="TypeSafe: Jev Latest" {
|
|
23
24
|
reasoning #false
|
|
@@ -25,6 +26,12 @@ provider "openrouter" {
|
|
|
25
26
|
cost input=0.042 output=0 cache-read=0 cache-write=0
|
|
26
27
|
limits context=32000 max-tokens=28800
|
|
27
28
|
}
|
|
29
|
+
model "typesafe/jev-1.14" name="TypeSafe: Jev 1.14" {
|
|
30
|
+
reasoning #false
|
|
31
|
+
input "text"
|
|
32
|
+
cost input=0.042 output=0 cache-read=0 cache-write=0
|
|
33
|
+
limits context=32000 max-tokens=28800
|
|
34
|
+
}
|
|
28
35
|
|
|
29
36
|
// OpenRouter's STT roster mixes per-token and duration-based prices.
|
|
30
37
|
// Token-priced GPT rows map per-token rates to catalog per-million costs;
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
// TypeSafe System One judgment models.
|
|
2
2
|
|
|
3
3
|
provider "typesafe" {
|
|
4
|
-
default-model "jev-
|
|
4
|
+
default-model "jev-1.14.0"
|
|
5
5
|
env "TYPESAFE_API_KEY"
|
|
6
6
|
|
|
7
|
+
// `GET /v1/models` lists only the aliases: `jev-latest` is the newest stable
|
|
8
|
+
// release (jev-1.13.0) and `jev-preview` the newest of any kind. The pinned
|
|
9
|
+
// default judge is authored here so it resolves without discovery.
|
|
7
10
|
seed api="typesafe" base-url="https://api.typesafe.ai" bundle="always" {
|
|
11
|
+
model "jev-1.14.0" name="TypeSafe Jev 1.14" {
|
|
12
|
+
reasoning #false
|
|
13
|
+
input "text"
|
|
14
|
+
cost input=0.042 output=0 cache-read=0 cache-write=0
|
|
15
|
+
limits
|
|
16
|
+
supports-tools #false
|
|
17
|
+
}
|
|
8
18
|
model "jev-latest" name="TypeSafe jev" {
|
|
9
19
|
reasoning #false
|
|
10
20
|
input "text"
|
|
@@ -83,6 +83,13 @@ provider "web" {
|
|
|
83
83
|
limits
|
|
84
84
|
supports-tools #false
|
|
85
85
|
}
|
|
86
|
+
model "deepseek" name="DeepSeek" {
|
|
87
|
+
reasoning #false
|
|
88
|
+
input "text"
|
|
89
|
+
cost input=0 output=0 cache-read=0 cache-write=0
|
|
90
|
+
limits
|
|
91
|
+
supports-tools #false
|
|
92
|
+
}
|
|
86
93
|
model "kimi" name="Kimi" {
|
|
87
94
|
reasoning #false
|
|
88
95
|
input "text"
|
|
@@ -485,9 +485,10 @@ behavior {
|
|
|
485
485
|
role-defaults "dictation" {
|
|
486
486
|
model "local/parakeet-tdt-0.6b-v3"
|
|
487
487
|
}
|
|
488
|
+
// Pinned: TypeSafe's `jev-latest` alias trails the newest release (it answers as jev-1.13.0).
|
|
488
489
|
role-defaults "judge" {
|
|
489
|
-
model "typesafe/jev-
|
|
490
|
-
model "openrouter
|
|
490
|
+
model "typesafe/jev-1.14.0"
|
|
491
|
+
model "openrouter/typesafe/jev-1.14"
|
|
491
492
|
model "@tiny"
|
|
492
493
|
model "@smol"
|
|
493
494
|
model "@default"
|