@molecule/api-resource-ai-models 1.6.2 → 1.7.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/README.md CHANGED
@@ -3,7 +3,7 @@ AUTO-GENERATED — DO NOT EDIT THIS FILE.
3
3
  Generated by `mlcl sync-docs` from the package's src/index.ts JSDoc + mlcl/registry.json.
4
4
  Edits here are overwritten on the next commit (molecule's pre-commit hook regenerates).
5
5
  To change this document, edit the module-level JSDoc in src/index.ts.
6
- Generated: 2026-09-10T11:48:36.810Z
6
+ Generated: 2026-09-23T14:26:31.162Z
7
7
  -->
8
8
 
9
9
  # @molecule/api-resource-ai-models
@@ -159,6 +159,31 @@ interface ModelDefinition {
159
159
  * both together; until then, working-without-reasoning beats 400.
160
160
  */
161
161
  toolsRequireReasoningOff?: boolean
162
+ /**
163
+ * The provider rejects a FORCED tool choice for this model — Anthropic
164
+ * `tool_choice` `any` / `tool` answer 400 on claude-fable-5-1 and
165
+ * claude-opus-5-5, and Moonshot rejects `required` while thinking is on,
166
+ * which it always is on kimi-k2.7-code (all probed live 2026-09-23). `auto`
167
+ * works and the model still calls the tool. Callers that would force a tool call (Synthase
168
+ * discovery, starting-point selection) must send `auto` for these models;
169
+ * molecule-dev resolves that in one place (`toolChoiceParam` in
170
+ * request-shape.ts) and its live dispatch check probes the forced shape for
171
+ * every model, so a new model with this restriction fails the check instead
172
+ * of every discovery turn.
173
+ */
174
+ rejectsForcedToolChoice?: boolean
175
+ /**
176
+ * The provider rejects a caller-chosen `temperature` for this model —
177
+ * Anthropic answers 400 "`temperature` is deprecated for this model" on the
178
+ * Claude 5 family and Opus 4.7/4.8 (Opus 4.6, Sonnet 4.6 and Haiku 4.5 still
179
+ * accept it), and Moonshot's native host allows only 1 on kimi-k3 and
180
+ * kimi-k2.7-code (all probed live 2026-09-23). Omitting it is always safe. Callers that set a temperature (commit
181
+ * messages, starting-point selection) must omit it for these models;
182
+ * molecule-dev resolves that in one place (`temperatureParam` in
183
+ * request-shape.ts), and its live dispatch check sends the tool-less,
184
+ * temperature-0 shape to every model.
185
+ */
186
+ rejectsTemperature?: boolean
162
187
  /**
163
188
  * Provider-specific server tool type for web search (e.g. `'web_search_20250305'`).
164
189
  * When set, the chat handler sends this as a ServerTool alongside custom tools.
@@ -265,10 +290,26 @@ interface ModelDefinition {
265
290
  * over-bill this field exists to prevent. A wrapping window belongs to the
266
291
  * day it STARTS on, so its post-midnight tail is still matched against the
267
292
  * previous day.
293
+ *
294
+ * `excludedDatesUtc` lists `YYYY-MM-DD` dates on which no window applies —
295
+ * a provider's public holidays. DeepSeek's peak excludes Chinese public
296
+ * holidays (its pricing page, 2026-09-23); without the list those days bill
297
+ * at 2× while the provider charges off-peak. A date is matched against the
298
+ * day a window STARTS on (UTC), like `daysOfWeekUtc`. The list is DATA that
299
+ * runs out: check-model-freshness warns when the coming year has no dates.
300
+ *
301
+ * `rule` is the provider's own sentence defining these windows, verbatim,
302
+ * and the page that publishes it. check-model-freshness re-reads the page on
303
+ * every run and warns the moment the sentence changes — the windows are only
304
+ * as right as the last reading, and DeepSeek has amended its rule twice
305
+ * (a weekday qualifier by 2026-08-31, a holiday exclusion by 2026-09-23)
306
+ * without anything here noticing.
268
307
  */
269
308
  peakPricing?: {
270
309
  windows: { startMinuteUtc: number; endMinuteUtc: number; daysOfWeekUtc?: number[] }[]
271
310
  multiplier: number
311
+ excludedDatesUtc?: string[]
312
+ rule?: { url: string; text: string }
272
313
  }
273
314
  /**
274
315
  * A price change the provider has ANNOUNCED with a dated effective instant,
@@ -317,6 +358,8 @@ interface ModelDefinition {
317
358
  peakPricing?: {
318
359
  windows: { startMinuteUtc: number; endMinuteUtc: number; daysOfWeekUtc?: number[] }[]
319
360
  multiplier: number
361
+ excludedDatesUtc?: string[]
362
+ rule?: { url: string; text: string }
320
363
  }
321
364
  /** Where the change was announced, for the re-verify pass after it lands. */
322
365
  source?: string
@@ -543,6 +586,8 @@ function effectivePeakPricing(
543
586
  | {
544
587
  windows: { startMinuteUtc: number; endMinuteUtc: number; daysOfWeekUtc?: number[] }[]
545
588
  multiplier: number
589
+ excludedDatesUtc?: string[]
590
+ rule?: { url: string; text: string }
546
591
  }
547
592
  | undefined
548
593
  ```
@@ -786,7 +831,8 @@ Sources (verified 2026-07-28; OpenAI re-verified 2026-07-31 after the
786
831
  `npm run check:model-freshness` from the workspace root):
787
832
 
788
833
  - Anthropic: https://platform.claude.com/docs/en/about-claude/models/overview
789
- - /docs/en/build-with-claude/effort (fable-5 / opus-5 / sonnet-5 current;
834
+ - /docs/en/build-with-claude/effort (fable-5-1 / opus-5-5 / sonnet-5
835
+ current as of 2026-09-23 — see the dated notes below; historically fable-5 / opus-5 / sonnet-5 current;
790
836
  opus-4-8 superseded by opus-5 at identical pricing but still served — it is
791
837
  the recommended refusal-fallback model; effort ladder on all three current
792
838
  models is low|medium|high|xhigh|max; budget_tokens 400s on 4.7+)
@@ -816,6 +862,17 @@ Sources (verified 2026-07-28; OpenAI re-verified 2026-07-31 after the
816
862
  any/tool now 400s, thinking blocks are model-bound, editing earlier turns
817
863
  invalidates them) — Synthase sends tool_choice auto and is append-only,
818
864
  and the pre-commit dispatch probe covers the entry as sent.)
865
+ (verified 2026-09-23 — ADDED claude-opus-5-5, released 2026-09-22 and
866
+ listed as "Active (latest)" on /docs/en/models/opus-5-5/overview; the
867
+ overview page now lists claude-opus-5 under "Legacy models (still
868
+ available)" → superseded, with opus-4-8/4-7/4-6 repointed one hop.
869
+ Pricing page: $4/$20, 5m cache write $5, cache hits $0.20 (footnote 2:
870
+ 0.05× input on Opus 5.5 only), fast mode $8/$40. 1M ctx / 128K out, text +
871
+ image input, reliable knowledge cutoff Jun 2026. Effort page: all five
872
+ levels, default MEDIUM. What's-new page: thinking always on
873
+ (disabled/budget_tokens 400), tool_choice any/tool 400, computer_20251124
874
+ 400 — Synthase sends none of those. Every other Anthropic price on the
875
+ pricing page is unchanged.)
819
876
  - OpenAI: https://developers.openai.com/api/docs/pricing (GPT-5.6 family GA
820
877
  2026-07-09; REPRICED 2026-07-30: -luna cut 80% to $0.20/$1.20, -terra cut
821
878
  20% to $2/$12, -sol unchanged $5/$30; cache read 0.1× input; gpt-5.5/
@@ -828,6 +885,26 @@ Sources (verified 2026-07-28; OpenAI re-verified 2026-07-31 after the
828
885
  never under-charges when it lapses, per KNOWN_DIVERGENCES; -terra and
829
886
  -luna unchanged and matching the page; cache-read 0.1× and cache-write
830
887
  1.25× are now published first-party for all three tiers)
888
+ (re-verified 2026-09-21 on the pricing page: every cataloged OpenAI entry
889
+ is unchanged, and the -sol promo footnote still reads "available at least
890
+ through November 21, 2026". gpt-6-astra (released 2026-09-04) is listed at
891
+ $10/$50, cached input $1, cache writes $12.50 — and, like the Gemini/Grok
892
+ tiers, a long-context band above 272K prompt tokens that reprices the WHOLE
893
+ request ($20/$75, cached $2, cache writes $25): 2× input/cache, 1.5×
894
+ output. The catalog's price fields are flat per-MTok rates with no
895
+ context-band dimension, so that band is NOT modeled, exactly as the
896
+ > 200K tiers above are not. It is moot for now — astra is deliberately NOT
897
+ > in the catalog because it cannot serve a tool-carrying request on the
898
+ > bond's /v1/chat/completions endpoint; see the DO NOT ADD block above the
899
+ > OpenAI entries for the live 400s and the condition that lifts it.)
900
+ > (re-verified 2026-09-23: ADDED gpt-6-sol ($2/$10, cached $0.20, cache
901
+ writes $2.50) and gpt-6-luna ($0.10/$0.50, cached $0.01, cache writes
902
+ $0.125), released 2026-09-22 — both with the same unmodeled >272K band,
903
+ > 1.05M ctx / 128K out, image input, knowledge cutoff Apr 20 / May 18 2026
904
+ > per their model pages. Unlike astra they serve tool-carrying requests on
905
+ > /v1/chat/completions with reasoning_effort 'none'. The 5.6 family is now
906
+ > superseded; every 5.6 price on the page is unchanged and the -sol promo
907
+ > footnote still reads "at least through November 21, 2026".)
831
908
  - Google: https://ai.google.dev/gemini-api/docs/pricing (gemini-3.6-flash GA
832
909
  2026-07-21 $1.50/$7.50 supersedes 3.5-flash as the agentic flagship;
833
910
  gemini-3.1-pro-preview still the pro tier — "3.5 Pro" has NOT shipped as
@@ -860,8 +937,16 @@ Sources (verified 2026-07-28; OpenAI re-verified 2026-07-31 after the
860
937
  not modeled; reasoning_effort low|medium|high default high, image input;
861
938
  grok-4.3 still served at $1.25/$2.50 with the bigger 1M window;
862
939
  grok-code-fast-1 no longer listed — retires 2026-08-15)
940
+ - Chinese public holidays (DeepSeek's peak excludes them):
941
+ https://www.12371.gov.cn/web/article/web/content_1451614684968525824.html
942
+ (the State Council's 2026 notice; see CHINA_PUBLIC_HOLIDAYS)
863
943
  - DeepSeek: https://api-docs.deepseek.com/quick_start/pricing +
864
- /updates/ (verified 2026-09-10; legacy deepseek-chat/-reasoner ids fully
944
+ /updates/ (verified 2026-09-23 — the announced 2026-09-14 routing of
945
+ `deepseek-v4-pro` to V4.1 Flash was WITHDRAWN: V4 Pro keeps its card
946
+ 0.66/1.98/0.022 off-peak, so its staged `scheduledPricing` was deleted.
947
+ The card now also says peak hours exclude Chinese public holidays, which
948
+ `peakPricing` cannot express — peak is billed on those weekdays too.
949
+ Earlier, 2026-09-10: legacy deepseek-chat/-reasoner ids fully
865
950
  retired 2026-07-24 — never in this catalog. The 2026-09-10 re-read caught
866
951
  the V4.1-Flash release DAY-OF: new evergreen id `deepseek-flash` at
867
952
  off-peak miss $0.15 / hit $0.003 / out $0.6 (peak ×2, same Mon-Fri UTC
@@ -946,6 +1031,14 @@ Sources (verified 2026-07-28; OpenAI re-verified 2026-07-31 after the
946
1031
  card again — $0.15/$0.50, cached input $0.03, no promo footnote. models.dev
947
1032
  still carries the expired promo rate, so the KNOWN_DIVERGENCES entry now
948
1033
  runs to a fixed 2026-12-09 re-verify date.)
1034
+ (verified 2026-09-23: glm-5.3-flashx ADDED — the ~200 tokens/s tier of the
1035
+ GLM-5.3-Flash series. Pricing page: $0.37/$1.25, cached input $0.075,
1036
+ cache storage free. Chat-completion reference: id `glm-5.3-flashx` in the
1037
+ vision request enum, 128K max output, reasoning_effort low|high|max
1038
+ (default max), function tools supported. GLM-5.3-Flash guide: 1M ctx,
1039
+ video/image/text/file input. No published knowledge cutoff. Not on
1040
+ DeepInfra (zai-org/GLM-5.3-FlashX 404s), so cn-region-only. glm-5.3 and
1041
+ glm-5.3-flash rates unchanged on the same page.)
949
1042
 
950
1043
  Knowledge-cutoff dates on non-Anthropic entries are best-effort estimates
951
1044
  where the provider doesn't publish one; the provider sources above verify
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../src/lookup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE/D;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,cAAc,CAAC,GACxD,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASvE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CAEzC,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,eAAe,EAAE,CAEtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,kBAAkB,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,SAAS,YAAY,EAAE,GACtE,SAAS,eAAe,EAAE,CAI5B;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,EAAE,GAAE,IAAiB,GACpB,eAAe,CAgBjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,EAAE,GAAE,IAAiB,GACpB,eAAe,CAAC,aAAa,CAAC,CAMhC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,EAAE,GAAE,IAAiB,GACpB,eAAe,CASjB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,EAAE,EAAE,IAAI,EACR,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAsBR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAGR;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,kBAAkB,EAAE,MAAM,CAAA;IAC1B,yDAAyD;IACzD,qBAAqB,EAAE,MAAM,CAAA;IAC7B,0DAA0D;IAC1D,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,GAAE,IAAiB,GACpB,eAAe,CAYjB"}
1
+ {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../src/lookup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE/D;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,cAAc,CAAC,GACxD,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASvE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CAEzC,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,eAAe,EAAE,CAEtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,kBAAkB,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,SAAS,YAAY,EAAE,GACtE,SAAS,eAAe,EAAE,CAI5B;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,EAAE,GAAE,IAAiB,GACpB,eAAe,CAgBjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,EAAE,GAAE,IAAiB,GACpB,eAAe,CAAC,aAAa,CAAC,CAMhC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,EAAE,GAAE,IAAiB,GACpB,eAAe,CASjB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,EAAE,EAAE,IAAI,EACR,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CA2BR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAGR;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,kBAAkB,EAAE,MAAM,CAAA;IAC1B,yDAAyD;IACzD,qBAAqB,EAAE,MAAM,CAAA;IAC7B,0DAA0D;IAC1D,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,GAAE,IAAiB,GACpB,eAAe,CAYjB"}
package/dist/lookup.js CHANGED
@@ -217,14 +217,20 @@ export function priceMultiplierAt(modelDef, at, region) {
217
217
  : minute >= w.startMinuteUtc && minute < w.endMinuteUtc;
218
218
  if (!inWindow)
219
219
  continue;
220
+ // A wrapping window belongs to the day it STARTED on, so its
221
+ // post-midnight tail is matched against the previous UTC day — a
222
+ // Friday-only 23:00-02:00 window must still be peak at Saturday 00:30.
223
+ const startedYesterday = wraps && minute < w.endMinuteUtc;
220
224
  if (w.daysOfWeekUtc && w.daysOfWeekUtc.length > 0) {
221
- // A wrapping window belongs to the day it STARTED on, so its
222
- // post-midnight tail is matched against the previous UTC day — a
223
- // Friday-only 23:00-02:00 window must still be peak at Saturday 00:30.
224
- const day = wraps && minute < w.endMinuteUtc ? (at.getUTCDay() + 6) % 7 : at.getUTCDay();
225
+ const day = startedYesterday ? (at.getUTCDay() + 6) % 7 : at.getUTCDay();
225
226
  if (!w.daysOfWeekUtc.includes(day))
226
227
  continue;
227
228
  }
229
+ if (peak.excludedDatesUtc && peak.excludedDatesUtc.length > 0) {
230
+ const started = new Date(at.getTime() - (startedYesterday ? 86_400_000 : 0));
231
+ if (peak.excludedDatesUtc.includes(started.toISOString().slice(0, 10)))
232
+ continue;
233
+ }
228
234
  return peak.multiplier;
229
235
  }
230
236
  return 1;
package/dist/models.d.ts CHANGED
@@ -54,7 +54,8 @@ import type { ModelDefinition } from './types.js';
54
54
  * 2026-07-30 GPT-5.6 repricing — cross-check prices against models.dev with
55
55
  * `npm run check:model-freshness` from the workspace root):
56
56
  * - Anthropic: https://platform.claude.com/docs/en/about-claude/models/overview
57
- * + /docs/en/build-with-claude/effort (fable-5 / opus-5 / sonnet-5 current;
57
+ * + /docs/en/build-with-claude/effort (fable-5-1 / opus-5-5 / sonnet-5
58
+ * current as of 2026-09-23 — see the dated notes below; historically fable-5 / opus-5 / sonnet-5 current;
58
59
  * opus-4-8 superseded by opus-5 at identical pricing but still served — it is
59
60
  * the recommended refusal-fallback model; effort ladder on all three current
60
61
  * models is low|medium|high|xhigh|max; budget_tokens 400s on 4.7+)
@@ -84,6 +85,17 @@ import type { ModelDefinition } from './types.js';
84
85
  * any/tool now 400s, thinking blocks are model-bound, editing earlier turns
85
86
  * invalidates them) — Synthase sends tool_choice auto and is append-only,
86
87
  * and the pre-commit dispatch probe covers the entry as sent.)
88
+ * (verified 2026-09-23 — ADDED claude-opus-5-5, released 2026-09-22 and
89
+ * listed as "Active (latest)" on /docs/en/models/opus-5-5/overview; the
90
+ * overview page now lists claude-opus-5 under "Legacy models (still
91
+ * available)" → superseded, with opus-4-8/4-7/4-6 repointed one hop.
92
+ * Pricing page: $4/$20, 5m cache write $5, cache hits $0.20 (footnote 2:
93
+ * 0.05× input on Opus 5.5 only), fast mode $8/$40. 1M ctx / 128K out, text +
94
+ * image input, reliable knowledge cutoff Jun 2026. Effort page: all five
95
+ * levels, default MEDIUM. What's-new page: thinking always on
96
+ * (disabled/budget_tokens 400), tool_choice any/tool 400, computer_20251124
97
+ * 400 — Synthase sends none of those. Every other Anthropic price on the
98
+ * pricing page is unchanged.)
87
99
  * - OpenAI: https://developers.openai.com/api/docs/pricing (GPT-5.6 family GA
88
100
  * 2026-07-09; REPRICED 2026-07-30: -luna cut 80% to $0.20/$1.20, -terra cut
89
101
  * 20% to $2/$12, -sol unchanged $5/$30; cache read 0.1× input; gpt-5.5/
@@ -96,6 +108,26 @@ import type { ModelDefinition } from './types.js';
96
108
  * never under-charges when it lapses, per KNOWN_DIVERGENCES; -terra and
97
109
  * -luna unchanged and matching the page; cache-read 0.1× and cache-write
98
110
  * 1.25× are now published first-party for all three tiers)
111
+ * (re-verified 2026-09-21 on the pricing page: every cataloged OpenAI entry
112
+ * is unchanged, and the -sol promo footnote still reads "available at least
113
+ * through November 21, 2026". gpt-6-astra (released 2026-09-04) is listed at
114
+ * $10/$50, cached input $1, cache writes $12.50 — and, like the Gemini/Grok
115
+ * tiers, a long-context band above 272K prompt tokens that reprices the WHOLE
116
+ * request ($20/$75, cached $2, cache writes $25): 2× input/cache, 1.5×
117
+ * output. The catalog's price fields are flat per-MTok rates with no
118
+ * context-band dimension, so that band is NOT modeled, exactly as the
119
+ * >200K tiers above are not. It is moot for now — astra is deliberately NOT
120
+ * in the catalog because it cannot serve a tool-carrying request on the
121
+ * bond's /v1/chat/completions endpoint; see the DO NOT ADD block above the
122
+ * OpenAI entries for the live 400s and the condition that lifts it.)
123
+ * (re-verified 2026-09-23: ADDED gpt-6-sol ($2/$10, cached $0.20, cache
124
+ * writes $2.50) and gpt-6-luna ($0.10/$0.50, cached $0.01, cache writes
125
+ * $0.125), released 2026-09-22 — both with the same unmodeled >272K band,
126
+ * 1.05M ctx / 128K out, image input, knowledge cutoff Apr 20 / May 18 2026
127
+ * per their model pages. Unlike astra they serve tool-carrying requests on
128
+ * /v1/chat/completions with reasoning_effort 'none'. The 5.6 family is now
129
+ * superseded; every 5.6 price on the page is unchanged and the -sol promo
130
+ * footnote still reads "at least through November 21, 2026".)
99
131
  * - Google: https://ai.google.dev/gemini-api/docs/pricing (gemini-3.6-flash GA
100
132
  * 2026-07-21 $1.50/$7.50 supersedes 3.5-flash as the agentic flagship;
101
133
  * gemini-3.1-pro-preview still the pro tier — "3.5 Pro" has NOT shipped as
@@ -128,8 +160,16 @@ import type { ModelDefinition } from './types.js';
128
160
  * not modeled; reasoning_effort low|medium|high default high, image input;
129
161
  * grok-4.3 still served at $1.25/$2.50 with the bigger 1M window;
130
162
  * grok-code-fast-1 no longer listed — retires 2026-08-15)
163
+ * - Chinese public holidays (DeepSeek's peak excludes them):
164
+ * https://www.12371.gov.cn/web/article/web/content_1451614684968525824.html
165
+ * (the State Council's 2026 notice; see CHINA_PUBLIC_HOLIDAYS)
131
166
  * - DeepSeek: https://api-docs.deepseek.com/quick_start/pricing +
132
- * /updates/ (verified 2026-09-10; legacy deepseek-chat/-reasoner ids fully
167
+ * /updates/ (verified 2026-09-23 — the announced 2026-09-14 routing of
168
+ * `deepseek-v4-pro` to V4.1 Flash was WITHDRAWN: V4 Pro keeps its card
169
+ * 0.66/1.98/0.022 off-peak, so its staged `scheduledPricing` was deleted.
170
+ * The card now also says peak hours exclude Chinese public holidays, which
171
+ * `peakPricing` cannot express — peak is billed on those weekdays too.
172
+ * Earlier, 2026-09-10: legacy deepseek-chat/-reasoner ids fully
133
173
  * retired 2026-07-24 — never in this catalog. The 2026-09-10 re-read caught
134
174
  * the V4.1-Flash release DAY-OF: new evergreen id `deepseek-flash` at
135
175
  * off-peak miss $0.15 / hit $0.003 / out $0.6 (peak ×2, same Mon-Fri UTC
@@ -214,6 +254,14 @@ import type { ModelDefinition } from './types.js';
214
254
  * card again — $0.15/$0.50, cached input $0.03, no promo footnote. models.dev
215
255
  * still carries the expired promo rate, so the KNOWN_DIVERGENCES entry now
216
256
  * runs to a fixed 2026-12-09 re-verify date.)
257
+ * (verified 2026-09-23: glm-5.3-flashx ADDED — the ~200 tokens/s tier of the
258
+ * GLM-5.3-Flash series. Pricing page: $0.37/$1.25, cached input $0.075,
259
+ * cache storage free. Chat-completion reference: id `glm-5.3-flashx` in the
260
+ * vision request enum, 128K max output, reasoning_effort low|high|max
261
+ * (default max), function tools supported. GLM-5.3-Flash guide: 1M ctx,
262
+ * video/image/text/file input. No published knowledge cutoff. Not on
263
+ * DeepInfra (zai-org/GLM-5.3-FlashX 404s), so cn-region-only. glm-5.3 and
264
+ * glm-5.3-flash rates unchanged on the same page.)
217
265
  *
218
266
  * Knowledge-cutoff dates on non-Anthropic entries are best-effort estimates
219
267
  * where the provider doesn't publish one; the provider sources above verify
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAQjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkNG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,eAAe,EAq1DnC,CAAA"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAwDjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkQG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,eAAe,EA2jEnC,CAAA"}
package/dist/models.js CHANGED
@@ -12,6 +12,51 @@
12
12
  * prices by business day rather than by hour alone.
13
13
  */
14
14
  const WEEKDAYS_UTC = [1, 2, 3, 4, 5];
15
+ /**
16
+ * DeepSeek's own sentence defining its peak windows, verbatim (pricing page,
17
+ * re-read 2026-09-23). check-model-freshness warns when the page stops saying
18
+ * exactly this — then the windows and CHINA_PUBLIC_HOLIDAYS need re-reading.
19
+ */
20
+ const DEEPSEEK_PEAK_RULE = {
21
+ url: 'https://api-docs.deepseek.com/quick_start/pricing',
22
+ text: 'Peak hours are 01:00 - 04:00 and 06:00 - 10:00 UTC, Monday through Friday, excluding Chinese public holidays.',
23
+ };
24
+ /**
25
+ * Every date from `from` to `to` inclusive, as YYYY-MM-DD.
26
+ *
27
+ * @param from - First date (YYYY-MM-DD).
28
+ * @param to - Last date (YYYY-MM-DD).
29
+ * @returns The dates.
30
+ */
31
+ function dateRange(from, to) {
32
+ const out = [];
33
+ for (let t = Date.parse(`${from}T00:00:00Z`); t <= Date.parse(`${to}T00:00:00Z`); t += 86_400_000)
34
+ out.push(new Date(t).toISOString().slice(0, 10));
35
+ return out;
36
+ }
37
+ /**
38
+ * Chinese public holidays (the 放假 ranges), for `peakPricing.excludedDatesUtc`
39
+ * on the DeepSeek models: their peak is "01:00 - 04:00 and 06:00 - 10:00 UTC,
40
+ * Monday through Friday, excluding Chinese public holidays" (pricing page,
41
+ * 2026-09-23). Those windows are 09:00–12:00 and 14:00–18:00 Beijing time, so
42
+ * the Beijing holiday date IS the UTC date of every window.
43
+ *
44
+ * Source — the State Council's notice for 2026 (国办发明电〔2025〕7号), read
45
+ * 2026-09-23 at https://www.12371.gov.cn/web/article/web/content_1451614684968525824.html.
46
+ * Make-up working days (调休 weekends) need no entry: the peak is Mon–Fri only.
47
+ *
48
+ * ADD NEXT YEAR'S DATES when the State Council publishes them (each November);
49
+ * check-model-freshness warns 45 days before a year with no dates here.
50
+ */
51
+ const CHINA_PUBLIC_HOLIDAYS = [
52
+ ...dateRange('2026-01-01', '2026-01-03'), // 元旦
53
+ ...dateRange('2026-02-15', '2026-02-23'), // 春节
54
+ ...dateRange('2026-04-04', '2026-04-06'), // 清明节
55
+ ...dateRange('2026-05-01', '2026-05-05'), // 劳动节
56
+ ...dateRange('2026-06-19', '2026-06-21'), // 端午节
57
+ ...dateRange('2026-09-25', '2026-09-27'), // 中秋节
58
+ ...dateRange('2026-10-01', '2026-10-07'), // 国庆节
59
+ ];
15
60
  /**
16
61
  * All available AI models, grouped by provider, ordered from most to least capable.
17
62
  *
@@ -58,7 +103,8 @@ const WEEKDAYS_UTC = [1, 2, 3, 4, 5];
58
103
  * 2026-07-30 GPT-5.6 repricing — cross-check prices against models.dev with
59
104
  * `npm run check:model-freshness` from the workspace root):
60
105
  * - Anthropic: https://platform.claude.com/docs/en/about-claude/models/overview
61
- * + /docs/en/build-with-claude/effort (fable-5 / opus-5 / sonnet-5 current;
106
+ * + /docs/en/build-with-claude/effort (fable-5-1 / opus-5-5 / sonnet-5
107
+ * current as of 2026-09-23 — see the dated notes below; historically fable-5 / opus-5 / sonnet-5 current;
62
108
  * opus-4-8 superseded by opus-5 at identical pricing but still served — it is
63
109
  * the recommended refusal-fallback model; effort ladder on all three current
64
110
  * models is low|medium|high|xhigh|max; budget_tokens 400s on 4.7+)
@@ -88,6 +134,17 @@ const WEEKDAYS_UTC = [1, 2, 3, 4, 5];
88
134
  * any/tool now 400s, thinking blocks are model-bound, editing earlier turns
89
135
  * invalidates them) — Synthase sends tool_choice auto and is append-only,
90
136
  * and the pre-commit dispatch probe covers the entry as sent.)
137
+ * (verified 2026-09-23 — ADDED claude-opus-5-5, released 2026-09-22 and
138
+ * listed as "Active (latest)" on /docs/en/models/opus-5-5/overview; the
139
+ * overview page now lists claude-opus-5 under "Legacy models (still
140
+ * available)" → superseded, with opus-4-8/4-7/4-6 repointed one hop.
141
+ * Pricing page: $4/$20, 5m cache write $5, cache hits $0.20 (footnote 2:
142
+ * 0.05× input on Opus 5.5 only), fast mode $8/$40. 1M ctx / 128K out, text +
143
+ * image input, reliable knowledge cutoff Jun 2026. Effort page: all five
144
+ * levels, default MEDIUM. What's-new page: thinking always on
145
+ * (disabled/budget_tokens 400), tool_choice any/tool 400, computer_20251124
146
+ * 400 — Synthase sends none of those. Every other Anthropic price on the
147
+ * pricing page is unchanged.)
91
148
  * - OpenAI: https://developers.openai.com/api/docs/pricing (GPT-5.6 family GA
92
149
  * 2026-07-09; REPRICED 2026-07-30: -luna cut 80% to $0.20/$1.20, -terra cut
93
150
  * 20% to $2/$12, -sol unchanged $5/$30; cache read 0.1× input; gpt-5.5/
@@ -100,6 +157,26 @@ const WEEKDAYS_UTC = [1, 2, 3, 4, 5];
100
157
  * never under-charges when it lapses, per KNOWN_DIVERGENCES; -terra and
101
158
  * -luna unchanged and matching the page; cache-read 0.1× and cache-write
102
159
  * 1.25× are now published first-party for all three tiers)
160
+ * (re-verified 2026-09-21 on the pricing page: every cataloged OpenAI entry
161
+ * is unchanged, and the -sol promo footnote still reads "available at least
162
+ * through November 21, 2026". gpt-6-astra (released 2026-09-04) is listed at
163
+ * $10/$50, cached input $1, cache writes $12.50 — and, like the Gemini/Grok
164
+ * tiers, a long-context band above 272K prompt tokens that reprices the WHOLE
165
+ * request ($20/$75, cached $2, cache writes $25): 2× input/cache, 1.5×
166
+ * output. The catalog's price fields are flat per-MTok rates with no
167
+ * context-band dimension, so that band is NOT modeled, exactly as the
168
+ * >200K tiers above are not. It is moot for now — astra is deliberately NOT
169
+ * in the catalog because it cannot serve a tool-carrying request on the
170
+ * bond's /v1/chat/completions endpoint; see the DO NOT ADD block above the
171
+ * OpenAI entries for the live 400s and the condition that lifts it.)
172
+ * (re-verified 2026-09-23: ADDED gpt-6-sol ($2/$10, cached $0.20, cache
173
+ * writes $2.50) and gpt-6-luna ($0.10/$0.50, cached $0.01, cache writes
174
+ * $0.125), released 2026-09-22 — both with the same unmodeled >272K band,
175
+ * 1.05M ctx / 128K out, image input, knowledge cutoff Apr 20 / May 18 2026
176
+ * per their model pages. Unlike astra they serve tool-carrying requests on
177
+ * /v1/chat/completions with reasoning_effort 'none'. The 5.6 family is now
178
+ * superseded; every 5.6 price on the page is unchanged and the -sol promo
179
+ * footnote still reads "at least through November 21, 2026".)
103
180
  * - Google: https://ai.google.dev/gemini-api/docs/pricing (gemini-3.6-flash GA
104
181
  * 2026-07-21 $1.50/$7.50 supersedes 3.5-flash as the agentic flagship;
105
182
  * gemini-3.1-pro-preview still the pro tier — "3.5 Pro" has NOT shipped as
@@ -132,8 +209,16 @@ const WEEKDAYS_UTC = [1, 2, 3, 4, 5];
132
209
  * not modeled; reasoning_effort low|medium|high default high, image input;
133
210
  * grok-4.3 still served at $1.25/$2.50 with the bigger 1M window;
134
211
  * grok-code-fast-1 no longer listed — retires 2026-08-15)
212
+ * - Chinese public holidays (DeepSeek's peak excludes them):
213
+ * https://www.12371.gov.cn/web/article/web/content_1451614684968525824.html
214
+ * (the State Council's 2026 notice; see CHINA_PUBLIC_HOLIDAYS)
135
215
  * - DeepSeek: https://api-docs.deepseek.com/quick_start/pricing +
136
- * /updates/ (verified 2026-09-10; legacy deepseek-chat/-reasoner ids fully
216
+ * /updates/ (verified 2026-09-23 — the announced 2026-09-14 routing of
217
+ * `deepseek-v4-pro` to V4.1 Flash was WITHDRAWN: V4 Pro keeps its card
218
+ * 0.66/1.98/0.022 off-peak, so its staged `scheduledPricing` was deleted.
219
+ * The card now also says peak hours exclude Chinese public holidays, which
220
+ * `peakPricing` cannot express — peak is billed on those weekdays too.
221
+ * Earlier, 2026-09-10: legacy deepseek-chat/-reasoner ids fully
137
222
  * retired 2026-07-24 — never in this catalog. The 2026-09-10 re-read caught
138
223
  * the V4.1-Flash release DAY-OF: new evergreen id `deepseek-flash` at
139
224
  * off-peak miss $0.15 / hit $0.003 / out $0.6 (peak ×2, same Mon-Fri UTC
@@ -218,6 +303,14 @@ const WEEKDAYS_UTC = [1, 2, 3, 4, 5];
218
303
  * card again — $0.15/$0.50, cached input $0.03, no promo footnote. models.dev
219
304
  * still carries the expired promo rate, so the KNOWN_DIVERGENCES entry now
220
305
  * runs to a fixed 2026-12-09 re-verify date.)
306
+ * (verified 2026-09-23: glm-5.3-flashx ADDED — the ~200 tokens/s tier of the
307
+ * GLM-5.3-Flash series. Pricing page: $0.37/$1.25, cached input $0.075,
308
+ * cache storage free. Chat-completion reference: id `glm-5.3-flashx` in the
309
+ * vision request enum, 128K max output, reasoning_effort low|high|max
310
+ * (default max), function tools supported. GLM-5.3-Flash guide: 1M ctx,
311
+ * video/image/text/file input. No published knowledge cutoff. Not on
312
+ * DeepInfra (zai-org/GLM-5.3-FlashX 404s), so cn-region-only. glm-5.3 and
313
+ * glm-5.3-flash rates unchanged on the same page.)
221
314
  *
222
315
  * Knowledge-cutoff dates on non-Anthropic entries are best-effort estimates
223
316
  * where the provider doesn't publish one; the provider sources above verify
@@ -235,6 +328,9 @@ export const MODELS = [
235
328
  {
236
329
  id: 'claude-fable-5-1',
237
330
  provider: 'anthropic',
331
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
332
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
333
+ rejectsTemperature: true,
238
334
  label: 'Claude Fable 5.1',
239
335
  description: 'Most capable Anthropic — frontier reasoning & long-horizon agents',
240
336
  contextWindow: 1_000_000,
@@ -248,6 +344,10 @@ export const MODELS = [
248
344
  // all five levels are supported (effort docs, verified 2026-09-01).
249
345
  // Default/recommended is high; xhigh/max for the most capability-sensitive
250
346
  // agentic work, medium/low for routine work.
347
+ // tool_choice any/tool → 400 "tool_choice: type "tool" and "any" are not
348
+ // supported for this model" (probed live 2026-09-23). Discovery and
349
+ // starting-point selection send `auto` for it instead (request-shape.ts).
350
+ rejectsForcedToolChoice: true,
251
351
  supportsVision: true,
252
352
  supportsPromptCaching: true,
253
353
  supportsTools: true,
@@ -270,6 +370,9 @@ export const MODELS = [
270
370
  {
271
371
  id: 'claude-fable-5',
272
372
  provider: 'anthropic',
373
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
374
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
375
+ rejectsTemperature: true,
273
376
  label: 'Claude Fable 5',
274
377
  description: 'Most capable Anthropic — frontier reasoning & long-horizon agents',
275
378
  contextWindow: 1_000_000,
@@ -305,9 +408,63 @@ export const MODELS = [
305
408
  deprecatedAt: '2026-09-01',
306
409
  supersededBy: 'claude-fable-5-1',
307
410
  },
411
+ {
412
+ id: 'claude-opus-5-5',
413
+ provider: 'anthropic',
414
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
415
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
416
+ rejectsTemperature: true,
417
+ label: 'Claude Opus 5.5',
418
+ description: 'Anthropic Opus flagship — long-running agentic coding, cheaper than Opus 5',
419
+ // tool_choice any/tool → 400 "tool_choice: type "tool" and "any" are not
420
+ // supported for this model" (probed live 2026-09-23). Discovery and
421
+ // starting-point selection send `auto` for it instead (request-shape.ts).
422
+ rejectsForcedToolChoice: true,
423
+ // Fast mode (research preview, Claude API only): $8/$40 per MTok (pricing
424
+ // page, fast-mode table, verified 2026-09-23). Cache multipliers stack on
425
+ // the fast input rate: read 0.05× (this model's rate), write 1.25×.
426
+ fastPricing: {
427
+ inputPricePerMTok: 8,
428
+ outputPricePerMTok: 40,
429
+ cacheReadPricePerMTok: 0.4,
430
+ cacheWritePricePerMTok: 10,
431
+ },
432
+ contextWindow: 1_000_000,
433
+ maxOutputTokens: 128_000,
434
+ supportsThinking: true,
435
+ thinkingBudgetTokens: 16_000,
436
+ thinkingConfigurable: true,
437
+ supportedEffortLevels: ['low', 'medium', 'high', 'xhigh', 'max'],
438
+ defaultEffortLevel: 'medium',
439
+ // Adaptive thinking is ALWAYS ON: thinking {type:"disabled"} and manual
440
+ // budget_tokens both 400 — effort is the only depth control. All five
441
+ // levels supported; the API default is MEDIUM (not high like opus-5).
442
+ // tool_choice any/tool 400 on this model (auto/none only), as on
443
+ // fable-5-1. 512-token prompt-cache minimum. (Model page + what's-new,
444
+ // verified 2026-09-23.)
445
+ supportsVision: true,
446
+ supportsPromptCaching: true,
447
+ supportsTools: true,
448
+ webSearchToolType: 'web_search_20260209',
449
+ // Same server-tool versions as the rest of the 4.6+ Anthropic fleet. Not
450
+ // currently sent by Synthase beyond webSearchToolType.
451
+ codeExecutionToolType: 'code_execution_20260521',
452
+ webFetchToolType: 'web_fetch_20260209',
453
+ inputPricePerMTok: 4,
454
+ outputPricePerMTok: 20,
455
+ // Cache READ is a documented exception: 0.05× input ("$0.20 / MTok",
456
+ // pricing page footnote 2). 5-minute cache write is the usual 1.25×.
457
+ cacheReadPricePerMTok: 0.2,
458
+ cacheWritePricePerMTok: 5,
459
+ // Reliable knowledge cutoff Jun 2026 (model page "Specifications").
460
+ knowledgeCutoff: '2026-06-01',
461
+ },
308
462
  {
309
463
  id: 'claude-opus-5',
310
464
  provider: 'anthropic',
465
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
466
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
467
+ rejectsTemperature: true,
311
468
  label: 'Claude Opus 5',
312
469
  description: 'Anthropic Opus flagship — step-change agentic coding at 4.8 pricing',
313
470
  // Fast mode (research preview, Claude API only): same model at up to 2.5×
@@ -350,10 +507,18 @@ export const MODELS = [
350
507
  cacheWritePricePerMTok: 6.25,
351
508
  // Not published at verification time — best-effort estimate (≥ Opus 4.8's).
352
509
  knowledgeCutoff: '2026-01-01',
510
+ // Superseded by claude-opus-5-5 (released 2026-09-22, same Opus tier,
511
+ // cheaper at $4/$20); Anthropic now lists opus-5 under "Legacy models
512
+ // (still available)". Still served and priceable, just not OFFERED.
513
+ deprecatedAt: '2026-09-22',
514
+ supersededBy: 'claude-opus-5-5',
353
515
  },
354
516
  {
355
517
  id: 'claude-opus-4-8',
356
518
  provider: 'anthropic',
519
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
520
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
521
+ rejectsTemperature: true,
357
522
  label: 'Claude Opus 4.8',
358
523
  description: 'Previous Opus — deep reasoning; the opus-5 refusal fallback',
359
524
  contextWindow: 1_000_000,
@@ -384,12 +549,16 @@ export const MODELS = [
384
549
  // Superseded by claude-opus-5 (same price, same tier); still served upstream
385
550
  // and the recommended refusal-fallback target, so it stays priceable and
386
551
  // callable by id — it is just not OFFERED, since opus-5 is a drop-in.
552
+ // `supersededBy` names the CURRENT selectable Opus (opus-5-5, one hop).
387
553
  deprecatedAt: '2026-07-28',
388
- supersededBy: 'claude-opus-5',
554
+ supersededBy: 'claude-opus-5-5',
389
555
  },
390
556
  {
391
557
  id: 'claude-sonnet-5',
392
558
  provider: 'anthropic',
559
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
560
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
561
+ rejectsTemperature: true,
393
562
  label: 'Claude Sonnet 5',
394
563
  description: 'Fast & capable — near-Opus coding at Sonnet cost',
395
564
  contextWindow: 1_000_000,
@@ -425,6 +594,9 @@ export const MODELS = [
425
594
  {
426
595
  id: 'claude-opus-4-7',
427
596
  provider: 'anthropic',
597
+ // temperature → 400 "`temperature` is deprecated for this model" (probed
598
+ // live 2026-09-23); callers omit it (request-shape.ts temperatureParam).
599
+ rejectsTemperature: true,
428
600
  label: 'Claude Opus 4.7',
429
601
  description: 'Older Opus — long-horizon agentic work, knowledge work & vision',
430
602
  contextWindow: 1_000_000,
@@ -458,10 +630,10 @@ export const MODELS = [
458
630
  // still Active upstream (deprecations page 2026-08-06: retires no sooner
459
631
  // than 2027-04-16). NO fast mode — speed:"fast" on 4.7 returns an error
460
632
  // (pricing page, fast-mode section). `supersededBy` names the CURRENT
461
- // selectable Opus (opus-5), not the also-superseded 4.8, so a saved
633
+ // selectable Opus (opus-5-5), not the also-superseded 4.8 / 5, so a saved
462
634
  // selection resolves forward in one hop.
463
635
  deprecatedAt: '2026-05-28',
464
- supersededBy: 'claude-opus-5',
636
+ supersededBy: 'claude-opus-5-5',
465
637
  },
466
638
  {
467
639
  id: 'claude-opus-4-6',
@@ -493,9 +665,9 @@ export const MODELS = [
493
665
  cacheReadPricePerMTok: 0.5,
494
666
  cacheWritePricePerMTok: 6.25,
495
667
  knowledgeCutoff: '2025-05-01',
496
- // Superseded by the current Opus (opus-5) — kept priceable, not offered.
668
+ // Superseded by the current Opus (opus-5-5) — kept priceable, not offered.
497
669
  deprecatedAt: '2026-06-16',
498
- supersededBy: 'claude-opus-5',
670
+ supersededBy: 'claude-opus-5-5',
499
671
  },
500
672
  {
501
673
  id: 'claude-sonnet-4-6',
@@ -573,7 +745,101 @@ export const MODELS = [
573
745
  // high|xhigh, default medium); re-verify. Long-context 2× price variants
574
746
  // exist upstream — not modeled (same as the Gemini/Grok >200K tiers), and
575
747
  // neither are the Batch (0.5×) or Sol "Fast mode" (2×) cards.
748
+ //
749
+ // DO NOT ADD gpt-6-astra (OpenAI's flagship since 2026-09-04) UNTIL THE BOND
750
+ // MOVES TO /v1/responses. It is deliberately absent, not overlooked. The
751
+ // openai bond posts to /v1/chat/completions, and on that endpoint this model
752
+ // rejects EVERY request Synthase can send, because Synthase always carries
753
+ // function tools (probed live 2026-09-21 on our own key):
754
+ // - tools + reasoning_effort low|medium|high|xhigh → 400 "Function tools
755
+ // with reasoning_effort are not supported for gpt-6-astra in
756
+ // /v1/chat/completions. To use function tools, use /v1/responses or set
757
+ // reasoning_effort to 'none'."
758
+ // - tools, field omitted → the same 400 (the model applies its own default)
759
+ // - tools + reasoning_effort 'none' → 400 "Unsupported value: … does not
760
+ // support 'none' with this model. Supported values are: 'low', 'medium',
761
+ // 'high', and 'xhigh'."
762
+ // So the gpt-5.6 workaround (`toolsRequireReasoningOff`, which pins an
763
+ // explicit 'none') does NOT carry over: OpenAI removed 'none' from this
764
+ // model's ladder, which closes the one door that made the 5.6 family usable.
765
+ // Nothing is wrong with the model or the account — no-tools chat and
766
+ // /v1/responses WITH tools both return 200. Both candidate entries were built
767
+ // and run through molecule-dev's verify:model-dispatch; both FAILED, so the
768
+ // entry was withheld rather than shipped broken (the glm-5.3-flash lesson:
769
+ // a catalog entry that cannot serve a Synthase-shaped turn breaks every turn
770
+ // on it). The freshness gate WILL keep listing it as a new-model candidate —
771
+ // that is correct; it becomes addable the day the bond speaks /v1/responses.
772
+ // Note also that the docs page advertises effort 'max', which
773
+ // /v1/chat/completions rejects for this model — verify the ladder against the
774
+ // endpoint, not the docs, when this is revisited.
775
+ //
776
+ // gpt-6-sol and gpt-6-luna (released 2026-09-22) are NOT astra's case: both
777
+ // still accept reasoning_effort 'none', and tools + 'none' returns 200 on
778
+ // /v1/chat/completions (probed live 2026-09-23 on our own key), so the same
779
+ // `toolsRequireReasoningOff` pin that serves the 5.6 family serves them. On
780
+ // that endpoint both accept none|low|medium|high|xhigh and reject 'max' —
781
+ // again despite the docs pages listing it. GPT-6 has no Terra tier: sol at
782
+ // $2/$10 is priced at 5.6-terra's tier and undercuts 5.6-sol, so it supersedes
783
+ // both; luna supersedes 5.6-luna at half the price.
576
784
  // ---------------------------------------------------------------------------
785
+ {
786
+ id: 'gpt-6-sol',
787
+ provider: 'openai',
788
+ label: 'GPT-6 Sol',
789
+ description: 'OpenAI for complex coding & agentic work',
790
+ // Documented as 1.05M; floored to 1M like the 5.6 entries.
791
+ contextWindow: 1_000_000,
792
+ maxOutputTokens: 128_000,
793
+ supportsThinking: true,
794
+ thinkingBudgetTokens: 16_000,
795
+ thinkingConfigurable: true,
796
+ supportedEffortLevels: ['low', 'medium', 'high', 'xhigh'],
797
+ defaultEffortLevel: 'medium',
798
+ supportsVision: true,
799
+ supportsPromptCaching: true,
800
+ supportsTools: true,
801
+ // Tools + ANY reasoning is a 400 on /v1/chat/completions for this family.
802
+ toolsRequireReasoningOff: true,
803
+ // NO webSearchToolType: see gpt-5.6-sol — the bond calls
804
+ // /v1/chat/completions, which has no web_search tool type. Re-add when the
805
+ // bond moves to /v1/responses.
806
+ codeExecutionToolType: 'code_interpreter',
807
+ // Standard tier. A long-context band above 272K prompt tokens reprices the
808
+ // whole request ($4/$15, cached $0.40, cache writes $5) — not modeled, same
809
+ // as the other >200K tiers.
810
+ inputPricePerMTok: 2,
811
+ outputPricePerMTok: 10,
812
+ cacheReadPricePerMTok: 0.2,
813
+ cacheWritePricePerMTok: 2.5,
814
+ knowledgeCutoff: '2026-04-20',
815
+ },
816
+ {
817
+ id: 'gpt-6-luna',
818
+ provider: 'openai',
819
+ label: 'GPT-6 Luna',
820
+ description: 'Fast & cheap OpenAI — light tasks & subagents',
821
+ contextWindow: 1_000_000,
822
+ maxOutputTokens: 128_000,
823
+ supportsThinking: true,
824
+ thinkingBudgetTokens: 8_000,
825
+ thinkingConfigurable: true,
826
+ supportedEffortLevels: ['low', 'medium', 'high', 'xhigh'],
827
+ defaultEffortLevel: 'medium',
828
+ supportsVision: true,
829
+ supportsPromptCaching: true,
830
+ supportsTools: true,
831
+ // Tools + ANY reasoning is a 400 on /v1/chat/completions for this family.
832
+ toolsRequireReasoningOff: true,
833
+ // NO webSearchToolType: see gpt-5.6-sol.
834
+ codeExecutionToolType: 'code_interpreter',
835
+ // Standard tier; >272K band ($0.20/$0.75, cached $0.02, writes $0.25) not
836
+ // modeled.
837
+ inputPricePerMTok: 0.1,
838
+ outputPricePerMTok: 0.5,
839
+ cacheReadPricePerMTok: 0.01,
840
+ cacheWritePricePerMTok: 0.125,
841
+ knowledgeCutoff: '2026-05-18',
842
+ },
577
843
  {
578
844
  id: 'gpt-5.6-sol',
579
845
  provider: 'openai',
@@ -612,6 +878,10 @@ export const MODELS = [
612
878
  cacheWritePricePerMTok: 6.25,
613
879
  // Not published — best-effort estimate.
614
880
  knowledgeCutoff: '2026-03-01',
881
+ // Superseded by gpt-6-sol ($2/$10 vs $5/$30 list). Still served and
882
+ // priceable — just not offered in the picker.
883
+ deprecatedAt: '2026-09-23',
884
+ supersededBy: 'gpt-6-sol',
615
885
  },
616
886
  {
617
887
  id: 'gpt-5.6-terra',
@@ -644,6 +914,10 @@ export const MODELS = [
644
914
  cacheWritePricePerMTok: 2.5,
645
915
  // Not published — best-effort estimate.
646
916
  knowledgeCutoff: '2026-03-01',
917
+ // Superseded by gpt-6-sol: GPT-6 has no Terra tier, and sol sits at this
918
+ // tier's price ($2/$10 vs $2/$12).
919
+ deprecatedAt: '2026-09-23',
920
+ supersededBy: 'gpt-6-sol',
647
921
  },
648
922
  {
649
923
  id: 'gpt-5.6-luna',
@@ -681,6 +955,9 @@ export const MODELS = [
681
955
  // note for the same removal pattern).
682
956
  // Not published — best-effort estimate.
683
957
  knowledgeCutoff: '2026-03-01',
958
+ // Superseded by gpt-6-luna ($0.10/$0.50 — half the price).
959
+ deprecatedAt: '2026-09-23',
960
+ supersededBy: 'gpt-6-luna',
684
961
  },
685
962
  {
686
963
  id: 'gpt-5.5',
@@ -713,10 +990,11 @@ export const MODELS = [
713
990
  cacheReadPricePerMTok: 0.5,
714
991
  cacheWritePricePerMTok: 5,
715
992
  knowledgeCutoff: '2025-12-01',
716
- // Superseded by gpt-5.6-sol (same frontier tier, same $5/$30); still listed
717
- // as current by OpenAI, so it stays priceable — it is just not offered.
993
+ // Superseded by gpt-5.6-sol (same frontier tier, same $5/$30), and since
994
+ // 2026-09-23 points one hop to gpt-6-sol, 5.6-sol's own successor. Still
995
+ // listed as current by OpenAI, so it stays priceable — just not offered.
718
996
  deprecatedAt: '2026-07-09',
719
- supersededBy: 'gpt-5.6-sol',
997
+ supersededBy: 'gpt-6-sol',
720
998
  },
721
999
  {
722
1000
  id: 'gpt-5.4',
@@ -750,9 +1028,10 @@ export const MODELS = [
750
1028
  // OpenAI still lists gpt-5.4 as current, but gpt-5.6-terra covers this
751
1029
  // balanced tier for LESS ($2/$12 vs $2.50/$15) — superseded, so the picker
752
1030
  // offers only the 5.6 generation (this is OUR taxonomy, not OpenAI's
753
- // deprecations page; the model stays priceable).
1031
+ // deprecations page; the model stays priceable). Points one hop to
1032
+ // gpt-6-sol since 2026-09-23, when 5.6-terra was itself superseded.
754
1033
  deprecatedAt: '2026-07-28',
755
- supersededBy: 'gpt-5.6-terra',
1034
+ supersededBy: 'gpt-6-sol',
756
1035
  },
757
1036
  {
758
1037
  id: 'gpt-5.4-mini',
@@ -786,9 +1065,10 @@ export const MODELS = [
786
1065
  // Superseded by gpt-5.6-luna, which IS the newer cheap/fast tier and is
787
1066
  // strictly better on every axis that made this the budget pick: $0.20/$1.20
788
1067
  // vs $0.75/$4.50 after the 2026-07-30 repricing, and a 1M window vs 400K.
789
- // Hiding it therefore costs OpenAI no cheap option. Stays priceable.
1068
+ // Hiding it therefore costs OpenAI no cheap option. Stays priceable. Points
1069
+ // one hop to gpt-6-luna since 2026-09-23, when 5.6-luna was superseded.
790
1070
  deprecatedAt: '2026-08-01',
791
- supersededBy: 'gpt-5.6-luna',
1071
+ supersededBy: 'gpt-6-luna',
792
1072
  },
793
1073
  // ---------------------------------------------------------------------------
794
1074
  // Google
@@ -1174,8 +1454,10 @@ export const MODELS = [
1174
1454
  // leans on that "temporary" routing until molecule-dev's default ids
1175
1455
  // move to `deepseek-flash`.
1176
1456
  // 2. From 2026-09-14 12:00 Beijing (04:00 UTC), until V4.1 Pro ships, ALL
1177
- // `deepseek-v4-pro` requests route to V4.1 Flash at Flash prices —
1178
- // staged as `scheduledPricing` on the pro entry below.
1457
+ // `deepseek-v4-pro` requests were to route to V4.1 Flash at Flash
1458
+ // prices. WITHDRAWN before it landed (re-read 2026-09-23): V4 Pro keeps
1459
+ // being served after 2026-09-14 "with the billing method remaining
1460
+ // unchanged", so the staged `scheduledPricing` was deleted.
1179
1461
  // 2026-08-13: V4-Pro GA — and with it the price rise that the "coming soon"
1180
1462
  // note below had been waiting on. It was staged as `scheduledPricing`
1181
1463
  // effective 2026-08-16T16:00Z; that instant has PASSED and the rates are now
@@ -1276,33 +1558,25 @@ export const MODELS = [
1276
1558
  { startMinuteUtc: 360, endMinuteUtc: 600, daysOfWeekUtc: WEEKDAYS_UTC },
1277
1559
  ],
1278
1560
  multiplier: 2,
1561
+ excludedDatesUtc: CHINA_PUBLIC_HOLIDAYS,
1562
+ rule: DEEPSEEK_PEAK_RULE,
1279
1563
  },
1280
- // ANNOUNCED 2026-09-10 (updates page): from 2026-09-14 12:00 Beijing time
1281
- // (04:00 UTC), and until V4.1 Pro ships, every `deepseek-v4-pro` request is
1282
- // routed to V4.1 Flash and billed at the V4.1 FLASH price — so the base
1283
- // rates become the flash card below (the peak windows are identical, so
1284
- // they carry through unchanged). The US `regionPricing` above is DeepInfra's
1285
- // own card for its V4-Pro copy and is NOT touched by the native routing.
1286
- // Fold into the base fields once the instant has passed (the freshness
1287
- // gate gives models.dev its scheduled-landing grace meanwhile).
1288
- scheduledPricing: {
1289
- effectiveFrom: '2026-09-14T04:00:00Z',
1290
- inputPricePerMTok: 0.15,
1291
- outputPricePerMTok: 0.6,
1292
- cacheReadPricePerMTok: 0.003,
1293
- cacheWritePricePerMTok: 0.15,
1294
- source: 'https://api-docs.deepseek.com/updates/ (2026-09-10): deepseek-v4-pro → V4.1 Flash at Flash prices from 2026-09-14 12:00 Beijing',
1295
- },
1564
+ // The 2026-09-10 announcement that this id would route to V4.1 Flash at
1565
+ // Flash prices from 2026-09-14 was WITHDRAWN: the updates page now reads
1566
+ // "we have decided to continue providing API services for DeepSeek V4 Pro
1567
+ // after September 14, 2026, with the billing method remaining unchanged",
1568
+ // and the pricing page still lists `deepseek-v4-pro` (V4-Pro-0813) at
1569
+ // 0.66/1.98, cache hit 0.022 off-peak (both re-read 2026-09-23). So the
1570
+ // staged `scheduledPricing` flash card was deleted rather than folded in —
1571
+ // the base rates above are what DeepSeek bills. The US `regionPricing` is
1572
+ // DeepInfra's own card and was never affected.
1296
1573
  // Not published by DeepSeek — best-effort estimate.
1297
1574
  knowledgeCutoff: '2025-07-01',
1298
- // Deprecated the day it stops being itself: DeepSeek's own testing has
1299
- // V4.1 Flash "comprehensively surpassing" Pro on performance/cost/speed,
1300
- // and from 2026-09-14 12:00 Beijing every `deepseek-v4-pro` request routes
1301
- // to V4.1 Flash at Flash prices (see scheduledPricing above) until V4.1 Pro
1302
- // ships — at which point this becomes a new entry's succession problem, not
1303
- // this one's. Until the 14th it still serves real V4-Pro-0813 weights at
1304
- // the Pro card, so it stays selectable for existing selections.
1305
- deprecatedAt: '2026-09-14',
1575
+ // Was deprecated 2026-09-14 on the expectation that the id would stop
1576
+ // being itself (routed to V4.1 Flash). DeepSeek withdrew that routing — V4
1577
+ // Pro continues "with the billing method remaining unchanged" (updates
1578
+ // page, re-read 2026-09-23) — so it is offered again (owner, 2026-09-23:
1579
+ // "keep offering deepseek pro if it is available").
1306
1580
  },
1307
1581
  {
1308
1582
  id: 'deepseek-v4-flash',
@@ -1385,6 +1659,8 @@ export const MODELS = [
1385
1659
  { startMinuteUtc: 360, endMinuteUtc: 600, daysOfWeekUtc: WEEKDAYS_UTC },
1386
1660
  ],
1387
1661
  multiplier: 2,
1662
+ excludedDatesUtc: CHINA_PUBLIC_HOLIDAYS,
1663
+ rule: DEEPSEEK_PEAK_RULE,
1388
1664
  },
1389
1665
  // Not published by DeepSeek — best-effort estimate.
1390
1666
  knowledgeCutoff: '2025-07-01',
@@ -1449,6 +1725,8 @@ export const MODELS = [
1449
1725
  { startMinuteUtc: 360, endMinuteUtc: 600, daysOfWeekUtc: WEEKDAYS_UTC },
1450
1726
  ],
1451
1727
  multiplier: 2,
1728
+ excludedDatesUtc: CHINA_PUBLIC_HOLIDAYS,
1729
+ rule: DEEPSEEK_PEAK_RULE,
1452
1730
  },
1453
1731
  // Not published by DeepSeek — best-effort estimate (family estimate; the
1454
1732
  // V4.1 announcement lists benchmarks but no training cutoff).
@@ -1475,6 +1753,9 @@ export const MODELS = [
1475
1753
  {
1476
1754
  id: 'kimi-k3',
1477
1755
  provider: 'moonshot',
1756
+ // Native Moonshot host: temperature 0 → 400 "invalid temperature: only 1 is
1757
+ // allowed for this model" (probed 2026-09-23); callers omit it.
1758
+ rejectsTemperature: true,
1478
1759
  label: 'Kimi K3',
1479
1760
  description: 'Moonshot flagship — 2.8T open weights, 1M context, multimodal',
1480
1761
  contextWindow: 1_000_000,
@@ -1518,6 +1799,12 @@ export const MODELS = [
1518
1799
  {
1519
1800
  id: 'kimi-k2.7-code',
1520
1801
  provider: 'moonshot',
1802
+ // Native Moonshot host (probed 2026-09-23): temperature 0 → 400 "only 1 is
1803
+ // allowed"; and tool_choice 'required' → 400 "incompatible with thinking
1804
+ // enabled" — thinking cannot be turned off on this model, so a forced tool
1805
+ // call goes out as `auto` (request-shape.ts).
1806
+ rejectsTemperature: true,
1807
+ rejectsForcedToolChoice: true,
1521
1808
  label: 'Kimi K2.7 Code',
1522
1809
  description: 'Moonshot coding specialist — token-efficient agentic coding',
1523
1810
  contextWindow: 262_144,
@@ -1964,6 +2251,43 @@ export const MODELS = [
1964
2251
  // publishes no cutoff.
1965
2252
  knowledgeCutoff: '2025-06-01',
1966
2253
  },
2254
+ {
2255
+ // The high-speed serving tier of the GLM-5.3-Flash series (~200 tokens/s
2256
+ // per the GLM-5.3-Flash guide) — same series surface, higher rate card.
2257
+ // Same 5.3 generation as glm-5.3-flash, so neither supersedes the other.
2258
+ id: 'glm-5.3-flashx',
2259
+ provider: 'zhipu',
2260
+ label: 'GLM-5.3 FlashX',
2261
+ description: 'High-speed native multimodal coding + agents — 1M context',
2262
+ contextWindow: 1_048_576,
2263
+ // "GLM-5.3-Flash series supports a maximum output length of 128K" —
2264
+ // chat-completion API reference, checked 2026-09-23.
2265
+ maxOutputTokens: 131_072,
2266
+ supportsThinking: true,
2267
+ thinkingBudgetTokens: 8_000,
2268
+ thinkingConfigurable: true,
2269
+ // Same surface as glm-5.3-flash: low|high|max only, default max, thinking
2270
+ // cannot be disabled. high is the balanced tier we default to.
2271
+ supportedEffortLevels: ['low', 'high', 'max'],
2272
+ defaultEffortLevel: 'high',
2273
+ // Series input: text, images, video, files (glm-5.3-flashx appears in the
2274
+ // chat-completion reference's image examples).
2275
+ supportsVision: true,
2276
+ supportsPromptCaching: true,
2277
+ supportsTools: true,
2278
+ webSearchToolType: 'web_search',
2279
+ // List card, verified 2026-09-23 on the Z.ai pricing page.
2280
+ inputPricePerMTok: 0.37,
2281
+ outputPricePerMTok: 1.25,
2282
+ // GLM context cache: read ≈0.2× input, no write premium (storage free).
2283
+ cacheReadPricePerMTok: 0.075,
2284
+ cacheWritePricePerMTok: 0.37,
2285
+ // Native host only: api.deepinfra.com/models/zai-org/GLM-5.3-FlashX is a
2286
+ // 404 (checked 2026-09-23), so there is no US re-host to map.
2287
+ regions: ['cn'],
2288
+ // Not published by Z.ai — best-effort estimate for the 5.3 generation.
2289
+ knowledgeCutoff: '2025-06-01',
2290
+ },
1967
2291
  {
1968
2292
  id: 'glm-5.3-flash',
1969
2293
  provider: 'zhipu',
package/dist/types.d.ts CHANGED
@@ -131,6 +131,31 @@ export interface ModelDefinition {
131
131
  * both together; until then, working-without-reasoning beats 400.
132
132
  */
133
133
  toolsRequireReasoningOff?: boolean;
134
+ /**
135
+ * The provider rejects a FORCED tool choice for this model — Anthropic
136
+ * `tool_choice` `any` / `tool` answer 400 on claude-fable-5-1 and
137
+ * claude-opus-5-5, and Moonshot rejects `required` while thinking is on,
138
+ * which it always is on kimi-k2.7-code (all probed live 2026-09-23). `auto`
139
+ * works and the model still calls the tool. Callers that would force a tool call (Synthase
140
+ * discovery, starting-point selection) must send `auto` for these models;
141
+ * molecule-dev resolves that in one place (`toolChoiceParam` in
142
+ * request-shape.ts) and its live dispatch check probes the forced shape for
143
+ * every model, so a new model with this restriction fails the check instead
144
+ * of every discovery turn.
145
+ */
146
+ rejectsForcedToolChoice?: boolean;
147
+ /**
148
+ * The provider rejects a caller-chosen `temperature` for this model —
149
+ * Anthropic answers 400 "`temperature` is deprecated for this model" on the
150
+ * Claude 5 family and Opus 4.7/4.8 (Opus 4.6, Sonnet 4.6 and Haiku 4.5 still
151
+ * accept it), and Moonshot's native host allows only 1 on kimi-k3 and
152
+ * kimi-k2.7-code (all probed live 2026-09-23). Omitting it is always safe. Callers that set a temperature (commit
153
+ * messages, starting-point selection) must omit it for these models;
154
+ * molecule-dev resolves that in one place (`temperatureParam` in
155
+ * request-shape.ts), and its live dispatch check sends the tool-less,
156
+ * temperature-0 shape to every model.
157
+ */
158
+ rejectsTemperature?: boolean;
134
159
  /**
135
160
  * Provider-specific server tool type for web search (e.g. `'web_search_20250305'`).
136
161
  * When set, the chat handler sends this as a ServerTool alongside custom tools.
@@ -234,6 +259,20 @@ export interface ModelDefinition {
234
259
  * over-bill this field exists to prevent. A wrapping window belongs to the
235
260
  * day it STARTS on, so its post-midnight tail is still matched against the
236
261
  * previous day.
262
+ *
263
+ * `excludedDatesUtc` lists `YYYY-MM-DD` dates on which no window applies —
264
+ * a provider's public holidays. DeepSeek's peak excludes Chinese public
265
+ * holidays (its pricing page, 2026-09-23); without the list those days bill
266
+ * at 2× while the provider charges off-peak. A date is matched against the
267
+ * day a window STARTS on (UTC), like `daysOfWeekUtc`. The list is DATA that
268
+ * runs out: check-model-freshness warns when the coming year has no dates.
269
+ *
270
+ * `rule` is the provider's own sentence defining these windows, verbatim,
271
+ * and the page that publishes it. check-model-freshness re-reads the page on
272
+ * every run and warns the moment the sentence changes — the windows are only
273
+ * as right as the last reading, and DeepSeek has amended its rule twice
274
+ * (a weekday qualifier by 2026-08-31, a holiday exclusion by 2026-09-23)
275
+ * without anything here noticing.
237
276
  */
238
277
  peakPricing?: {
239
278
  windows: {
@@ -242,6 +281,11 @@ export interface ModelDefinition {
242
281
  daysOfWeekUtc?: number[];
243
282
  }[];
244
283
  multiplier: number;
284
+ excludedDatesUtc?: string[];
285
+ rule?: {
286
+ url: string;
287
+ text: string;
288
+ };
245
289
  };
246
290
  /**
247
291
  * A price change the provider has ANNOUNCED with a dated effective instant,
@@ -294,6 +338,11 @@ export interface ModelDefinition {
294
338
  daysOfWeekUtc?: number[];
295
339
  }[];
296
340
  multiplier: number;
341
+ excludedDatesUtc?: string[];
342
+ rule?: {
343
+ url: string;
344
+ text: string;
345
+ };
297
346
  };
298
347
  /** Where the change was announced, for the re-verify pass after it lands. */
299
348
  source?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@molecule/api-resource-ai-models",
3
- "version": "1.6.2",
3
+ "version": "1.7.0",
4
4
  "description": "AI model catalog — server-side source of truth plus an authentication-gated discovery endpoint",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",