@oh-my-pi/pi-catalog 18.12.5 → 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 CHANGED
@@ -2,6 +2,16 @@
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
+
5
15
  ## [18.12.5] - 2026-10-21
6
16
 
7
17
  ### Fixed
@@ -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 at the
479
- * flat-rate `deepseek-flash-v4` endpoint. Live `/v1/models` discovery replaces the
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.12.5",
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.5",
97
- "@oh-my-pi/pi-utils": "18.12.5"
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.5",
101
+ "@oh-my-pi/pi-ai": "18.12.6",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
@@ -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.
@@ -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-flash"
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-flash` is the default model on Free and paid plans at a 256K
11
- // (262144) context window, and the paid `yolo` route is initially backed by
12
- // the same Flash deployment. The flat-rate `/v1/models` response carries
13
- // bare ids with no limit fields and is authoritative once discovery runs.
14
- // Without provider-local seeds the bare `qwen3.8-flash` slug resolves
15
- // through the global reference index, which prefers the largest bundled
16
- // window (1M) and misreports the deployment cap. The compat block mirrors
17
- // the provider's documented wire surface: the API speaks the Qwen
18
- // chat-template dialect with `reasoning_effort` support and rejects the
19
- // `developer` role and `store` param.
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 "deepseek-flash-v4" name="DeepSeek Flash V4" {
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-flash" "yolo" "qwen3.8-27b" {
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-flash-identity" provider="yolo-auto" model="yolo" class="qwen" revision="3.8" rationale="Yolo-Auto's paid yolo route is initially backed by the same Qwen3.8 Flash deployment as qwen3.8-flash; the opaque alias carries no lineage tokens" provenance="yolo-auto.com/models (2026-09)"
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"