@oh-my-pi/pi-catalog 18.12.4 → 18.12.6
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 +16 -0
- package/dist/types/compat/prompt-cache-persistent.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +2 -2
- package/dist/types/wire/codex.d.ts +4 -2
- package/package.json +4 -4
- package/src/compat/axes.ts +7 -0
- package/src/compat/prompt-cache-persistent.ts +12 -0
- package/src/compat/rules/README.md +2 -0
- package/src/compat/rules/providers/moonshot.kdl +3 -3
- package/src/compat/rules/providers/openai-codex.kdl +3 -0
- package/src/compat/rules/providers/yolo-auto.kdl +33 -37
- package/src/compat/rules/taxonomy/qwen.kdl +1 -1
- package/src/compat/rules.json +1 -1
- package/src/models.json +1 -1
- package/src/provider-models/openai-compat.ts +3 -3
- package/src/wire/codex.ts +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.12.6] - 2026-10-21
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added the `prompt-cache-persistent` catalog axis (`isPromptCachePersistent`) for providers whose own endpoint never expires prompt caches; logged-in OpenAI Codex declares it
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Updated the bundled Yolo-Auto catalog to its current models, `qwen3.8-27b` (now the default), `yolo`, `yolo-small`, and `yolo-128k`, and removed the retired `deepseek-flash-v4` and `qwen3.8-flash`
|
|
14
|
+
|
|
15
|
+
## [18.12.5] - 2026-10-21
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- Fixed Moonshot `kimi-k3` pricing cache writes at $0; usage cost now includes cache writes at Moonshot's $3/M 5-minute rate ([#16508](https://github.com/can1357/oh-my-pi/issues/16508))
|
|
20
|
+
|
|
5
21
|
## [18.12.4] - 2026-10-20
|
|
6
22
|
|
|
7
23
|
### Added
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Model } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Whether {@link model}'s prompt-cache entries never expire
|
|
4
|
+
* (`prompt-cache-persistent` axis). Only the provider's own endpoint
|
|
5
|
+
* qualifies: a gateway or proxy reusing the provider id makes no such promise.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isPromptCachePersistent(model: Model): boolean;
|
|
@@ -475,8 +475,8 @@ export interface YoloAutoModelManagerConfig {
|
|
|
475
475
|
fetch?: FetchImpl;
|
|
476
476
|
}
|
|
477
477
|
/**
|
|
478
|
-
* Yolo-Auto model manager: OpenAI-compatible chat completions
|
|
479
|
-
*
|
|
478
|
+
* Yolo-Auto model manager: flat-rate OpenAI-compatible chat completions
|
|
479
|
+
* (`qwen3.8-27b`, `yolo`, ...). Live `/v1/models` discovery replaces the
|
|
480
480
|
* bundled seed once a key is stored or present in `YOLO_AUTO_API_KEY`. Models
|
|
481
481
|
* the provider adds later inherit metadata (reasoning, thinking, context)
|
|
482
482
|
* from the global bundled reference index, so new ids work without a per-id
|
|
@@ -78,8 +78,10 @@ export declare function getCodexAccountId(accessToken: string): string | undefin
|
|
|
78
78
|
* needed: `chatgpt_data_residency` is the authoritative claim, with
|
|
79
79
|
* `chatgpt_compute_residency` as the fallback for tokens that only carry that.
|
|
80
80
|
*
|
|
81
|
-
* Returns undefined for a non-JWT token, or for the (common) accounts
|
|
82
|
-
* claims omit residency
|
|
81
|
+
* Returns undefined for a non-JWT token, or for the (common) accounts that are
|
|
82
|
+
* not region-pinned: their claims omit residency or carry the
|
|
83
|
+
* {@link CODEX_UNCONSTRAINED_RESIDENCY} sentinel. The backend answers 404 to a
|
|
84
|
+
* declared `no_constraint`, and codex-rs never sends it.
|
|
83
85
|
*/
|
|
84
86
|
export declare function getCodexResidency(accessToken: string): string | undefined;
|
|
85
87
|
/**
|
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.6",
|
|
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.6",
|
|
97
|
+
"@oh-my-pi/pi-utils": "18.12.6"
|
|
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.6",
|
|
102
102
|
"@types/bun": "^1.3.14"
|
|
103
103
|
},
|
|
104
104
|
"engines": {
|
package/src/compat/axes.ts
CHANGED
|
@@ -560,6 +560,13 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
|
|
|
560
560
|
* Unassigned: no known lookback bound.
|
|
561
561
|
*/
|
|
562
562
|
"prompt-cache-lookback": { key: "promptCacheLookback", set: "catalog", shape: "scalar" },
|
|
563
|
+
/**
|
|
564
|
+
* The provider's own endpoint keeps prompt-cache entries indefinitely
|
|
565
|
+
* (logged-in Codex subscriptions): an idle gap never cools the prefix, so
|
|
566
|
+
* rewriting it while idle only discards a warm cache. Read through
|
|
567
|
+
* `compat/prompt-cache-persistent.ts`. Unassigned: entries expire.
|
|
568
|
+
*/
|
|
569
|
+
"prompt-cache-persistent": { key: "promptCachePersistent", set: "catalog", shape: "scalar", values: [true, false] },
|
|
563
570
|
"long-usage-limit-fallback": { key: "longUsageLimitFallback", set: "catalog", shape: "scalar" },
|
|
564
571
|
"max-context-window": { key: "maxContextWindow", set: "catalog", shape: "scalar" },
|
|
565
572
|
/**
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Model } from "../types";
|
|
2
|
+
import { isCatalogEndpointUrl } from "./catalog-endpoint";
|
|
3
|
+
import { resolveCatalogPolicy } from "./catalog-policy";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Whether {@link model}'s prompt-cache entries never expire
|
|
7
|
+
* (`prompt-cache-persistent` axis). Only the provider's own endpoint
|
|
8
|
+
* qualifies: a gateway or proxy reusing the provider id makes no such promise.
|
|
9
|
+
*/
|
|
10
|
+
export function isPromptCachePersistent(model: Model): boolean {
|
|
11
|
+
return resolveCatalogPolicy(model).promptCachePersistent === true && isCatalogEndpointUrl(model, model.baseUrl);
|
|
12
|
+
}
|
|
@@ -243,6 +243,8 @@ One object axis carries a computed form: `long-context-cost` accepts either the
|
|
|
243
243
|
|
|
244
244
|
`prompt-cache-lookback` is how many block positions back from a cache breakpoint the model's prompt cache looks for an earlier request's entry (Claude: 20, counting the breakpoint; a run of consecutive `tool_use` or `tool_result` blocks is one position). The coding agent reads it through `resolvePromptCacheLookback` and keeps warm-cache tool-result pruning inside the window; unassigned means no known bound.
|
|
245
245
|
|
|
246
|
+
`prompt-cache-persistent #true` marks a provider whose own endpoint keeps prompt-cache entries indefinitely (logged-in Codex accounts). The coding agent reads it through `isPromptCachePersistent` and skips idle compaction, which would only discard a prefix that stays warm; a custom `baseUrl` reusing the provider id does not qualify. Unassigned means entries expire.
|
|
247
|
+
|
|
246
248
|
`task-sibling-prompt-cache #true` lets Task children use an automatically derived sibling cache key on the matching request model. Missing or `#false` keeps the provider's per-child default; explicit cache keys still win. The session resolves this catalog policy against the actual model for primary turns, handoff, and ephemeral requests that reuse the live context, including model changes, without sharing conversation IDs or response state. The automatic candidate is persisted separately from explicit keys and survives full forks, `/tan`, and session reopening; new and partial sessions discard it. A fork carrying an automatic candidate uses its own conversation ID on unsupported models, and re-enables the candidate when returning to an eligible model. Ordinary forks without an automatic candidate keep their existing inherited cache routing. Conventional compaction keeps its existing cache routing because its serialized summary prompt differs from the primary context. The opt-in covers Muse Code's `muse-spark-1.3`, `muse-spark-1.3-contributor`, `muse-wonder-1.0`, `muse-wonder-1.0-contributor`, `muse-wonder-full-1.0`, and `muse-wonder-full-1.0-contributor` over `openai-responses`. Meta documents shared-prefix `prompt_cache_key` routing for Responses. Warmed sibling cache reuse was measured on Spark 1.3 Contributor; the standard Spark variant shares this scope following maintainer guidance. A bounded synthetic probe observed cache reuse on all four Wonder variants; it does not establish production or latency benefits. Auxiliary-request latency has not been measured. Provider selectors also match custom providers that declare the same `providerType`; no benefit is established for custom endpoints.
|
|
247
249
|
|
|
248
250
|
`image-max-edge` is the longest image edge, in pixels, a host passes to the model; it downscales larger images to fit first (Cursor: 1024 for Claude and GPT). Snapcompact reads it through `resolveImageMaxEdge` and renders frames no wider, so their glyphs reach the model at the size they were drawn; unassigned means the host keeps the image's size.
|
|
@@ -33,15 +33,15 @@ provider "moonshot" {
|
|
|
33
33
|
input-modalities "text" "image"
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
//
|
|
37
|
-
//
|
|
36
|
+
// Official K3 rates: cache write is billed separately by TTL ($3 for the
|
|
37
|
+
// default 5min tier, $6 for 1h). omp sends no TTL, so the 5min rate applies.
|
|
38
38
|
// https://platform.moonshot.ai/docs/pricing/chat-k3
|
|
39
39
|
models "kimi-k3" {
|
|
40
40
|
cost-patch {
|
|
41
41
|
input 3.0
|
|
42
42
|
output 15.0
|
|
43
43
|
cache-read 0.3
|
|
44
|
-
cache-write
|
|
44
|
+
cache-write 3.0
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
// The /models roster carries no modality metadata for the named vision/vl
|
|
@@ -24,6 +24,9 @@ provider "openai-codex" {
|
|
|
24
24
|
// The backend decodes zstd request bodies, as the official client sends.
|
|
25
25
|
// Its rejection body is undocumented, so any 400/415 re-checks uncompressed.
|
|
26
26
|
request-encodings "zstd"
|
|
27
|
+
// Logged-in Codex accounts keep prompt-cache entries with no TTL, so
|
|
28
|
+
// idle compaction would only discard a prefix that stays warm.
|
|
29
|
+
prompt-cache-persistent #true
|
|
27
30
|
|
|
28
31
|
seed api="openai-codex-responses" base-url="https://chatgpt.com/backend-api" bundle="always" {
|
|
29
32
|
// Label only: the Codex backend ignores `tool.model` and runs gpt-image-2-codex.
|
|
@@ -1,37 +1,27 @@
|
|
|
1
1
|
// Provider-wire compat for "yolo-auto"; wire constraints apply to every discovered model.
|
|
2
2
|
|
|
3
3
|
provider "yolo-auto" {
|
|
4
|
-
default-model "qwen3.8-
|
|
4
|
+
default-model "qwen3.8-27b"
|
|
5
5
|
env "YOLO_AUTO_API_KEY"
|
|
6
6
|
dynamic-models-authoritative #true
|
|
7
7
|
discovery label="Yolo-Auto"
|
|
8
8
|
|
|
9
|
-
// Documented Yolo-Auto catalog (yolo-auto.com/models, yolo-auto.com/docs
|
|
10
|
-
// `qwen3.8-
|
|
11
|
-
// (
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// window (1M) and misreports the
|
|
17
|
-
// the provider's documented wire
|
|
18
|
-
// chat-template dialect with
|
|
19
|
-
// `developer` role and `store`
|
|
9
|
+
// Documented Yolo-Auto catalog (yolo-auto.com/models, yolo-auto.com/docs,
|
|
10
|
+
// 2026-10): `qwen3.8-27b`, `yolo`, `yolo-small` (256K) and `yolo-128k`
|
|
11
|
+
// (128K), all paid-only. `qwen3.8-27b` is the recommended default; the
|
|
12
|
+
// `yolo` route is currently backed by the same Qwen3.8-27B deployment
|
|
13
|
+
// (its server-side target can change). The flat-rate `/v1/models`
|
|
14
|
+
// response is authoritative once discovery runs. Without provider-local
|
|
15
|
+
// seeds the bare `qwen3.8-27b` slug resolves through the global reference
|
|
16
|
+
// index, which prefers the largest bundled window (1M) and misreports the
|
|
17
|
+
// deployment cap. The compat block mirrors the provider's documented wire
|
|
18
|
+
// surface: the API speaks the Qwen chat-template dialect with
|
|
19
|
+
// `reasoning_effort` support and rejects the `developer` role and `store`
|
|
20
|
+
// param. `yolo-small` and `yolo-128k` are documented only by id and
|
|
21
|
+
// context, and their `/v1/models` rows advertise no thinking ladder, so
|
|
22
|
+
// they seed as plain text routes until the provider documents more.
|
|
20
23
|
seed api="openai-completions" base-url="https://yolo-auto.com/v1" bundle="fallback" {
|
|
21
|
-
model "
|
|
22
|
-
reasoning #true
|
|
23
|
-
input "text" "image"
|
|
24
|
-
cost input=0 output=0 cache-read=0 cache-write=0
|
|
25
|
-
limits context=131072
|
|
26
|
-
thinking-mode "effort"
|
|
27
|
-
thinking-efforts "minimal" "low" "medium" "high" "xhigh" "max"
|
|
28
|
-
thinking-effort-map { minimal "low"; low "low"; medium "high"; high "high"; xhigh "max"; max "max" }
|
|
29
|
-
supports-developer-role #false
|
|
30
|
-
supports-store #false
|
|
31
|
-
supports-reasoning-effort #true
|
|
32
|
-
thinking-format "chat-template"
|
|
33
|
-
}
|
|
34
|
-
model "qwen3.8-flash" name="Qwen3.8 Flash" {
|
|
24
|
+
model "qwen3.8-27b" name="Qwen3.8-27B" {
|
|
35
25
|
reasoning #true
|
|
36
26
|
input "text" "image"
|
|
37
27
|
cost input=0 output=0 cache-read=0 cache-write=0
|
|
@@ -57,6 +47,22 @@ provider "yolo-auto" {
|
|
|
57
47
|
thinking-format "qwen-chat-template"
|
|
58
48
|
template-reasoning-effort #true
|
|
59
49
|
}
|
|
50
|
+
model "yolo-small" name="Yolo Small" {
|
|
51
|
+
reasoning #false
|
|
52
|
+
input "text"
|
|
53
|
+
cost input=0 output=0 cache-read=0 cache-write=0
|
|
54
|
+
limits context=262144
|
|
55
|
+
supports-developer-role #false
|
|
56
|
+
supports-store #false
|
|
57
|
+
}
|
|
58
|
+
model "yolo-128k" name="Yolo 128K" {
|
|
59
|
+
reasoning #false
|
|
60
|
+
input "text"
|
|
61
|
+
cost input=0 output=0 cache-read=0 cache-write=0
|
|
62
|
+
limits context=131072
|
|
63
|
+
supports-developer-role #false
|
|
64
|
+
supports-store #false
|
|
65
|
+
}
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
supports-developer-role #false
|
|
@@ -64,17 +70,7 @@ provider "yolo-auto" {
|
|
|
64
70
|
// Live /v1/models advertises `thinking: minimal..xhigh` for the Qwen3.8
|
|
65
71
|
// rows; the cascade rule carries it into the regenerated bundle, whose
|
|
66
72
|
// thinking re-bake ignores seed-level ladders.
|
|
67
|
-
models "qwen3.8-
|
|
73
|
+
models "qwen3.8-27b" "yolo" {
|
|
68
74
|
thinking-efforts "minimal" "low" "medium" "high" "xhigh"
|
|
69
75
|
}
|
|
70
|
-
models "deepseek-flash-v4" {
|
|
71
|
-
disable-reasoning-on-tool-choice #true
|
|
72
|
-
max-tokens-field "max_completion_tokens"
|
|
73
|
-
requires-reasoning-content-for-all-assistant-turns #true
|
|
74
|
-
requires-reasoning-content-for-tool-calls #true
|
|
75
|
-
supports-reasoning-effort #true
|
|
76
|
-
thinking-efforts "minimal" "low" "medium" "high" "xhigh" "max"
|
|
77
|
-
thinking-format "chat-template"
|
|
78
|
-
thinking-mode "effort"
|
|
79
|
-
}
|
|
80
76
|
}
|
|
@@ -12,7 +12,7 @@ class "qwen" {
|
|
|
12
12
|
|
|
13
13
|
revision prefix="qwen"
|
|
14
14
|
|
|
15
|
-
override id="yolo-auto-yolo-
|
|
15
|
+
override id="yolo-auto-yolo-identity" provider="yolo-auto" model="yolo" class="qwen" revision="3.8" rationale="Yolo-Auto's paid yolo route is currently backed by the same Qwen3.8-27B deployment as qwen3.8-27b; the opaque alias carries no lineage tokens" provenance="yolo-auto.com/models (2026-10)"
|
|
16
16
|
override id="prismml-bonsai-27b-qwen-3-6" glob="*bonsai-27b*" class="qwen" revision="3.6" rationale="Reviewed PrismML Bonsai and Ternary-Bonsai 27B lineage is Qwen3.6-27B; the wire basename may carry a prefix or GGUF quantization suffix" provenance="packages/coding-agent/src/config/model-discovery.ts; original reviewed alias e3aa6594e5"
|
|
17
17
|
override id="prismml-bonsai-2-27b-qwen-3-8" glob="*bonsai-2-27b*" class="qwen" revision="3.8" rationale="Reviewed PrismML Bonsai 2 27B lineage is Qwen3.8-27B; the wire basename may carry a prefix or GGUF quantization suffix" provenance="packages/coding-agent/src/config/model-discovery.ts"
|
|
18
18
|
override id="kilo-qwq-32b-family" provider="kilo" model="qwq-32b" logical="qwen/qwq-32b" class="qwen" rationale="The reviewed Kilo QwQ deployment belongs to the Qwen family despite its opaque product spelling" provenance="fixtures/llm-oracle/catalog/models.normalized.json"
|