opencode-cmd-provider 1.6.1 → 1.6.3
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 +85 -1
- package/README.md +19 -4
- package/dist/src/catalog/classification.d.ts +7 -0
- package/dist/src/catalog/classification.js +89 -0
- package/dist/src/catalog/facts.d.ts +4 -4
- package/dist/src/catalog/facts.js +21 -7
- package/dist/src/catalog/snapshot.js +7 -2
- package/dist/src/deals/catalog.d.ts +1 -1
- package/dist/src/deals/catalog.js +9 -4
- package/dist/src/provider/reasoning.d.ts +20 -0
- package/dist/src/provider/reasoning.js +35 -31
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,88 @@
|
|
|
1
|
-
|
|
1
|
+
## 1.6.3 - 2026-09-02
|
|
2
|
+
|
|
3
|
+
### Model catalog
|
|
4
|
+
|
|
5
|
+
## Model catalog
|
|
6
|
+
|
|
7
|
+
- **FACTS_LAST_REFRESHED**: `2026-09-01` → `2026-09-01`
|
|
8
|
+
|
|
9
|
+
No changes.
|
|
10
|
+
|
|
11
|
+
### Reasoning classification
|
|
12
|
+
|
|
13
|
+
## Reasoning classification
|
|
14
|
+
|
|
15
|
+
- **CLASSIFICATION_LAST_REFRESHED**: `` → `2026-09-02`
|
|
16
|
+
|
|
17
|
+
_first refresh — no classification data on the before side._
|
|
18
|
+
|
|
19
|
+
### Deals intelligence
|
|
20
|
+
|
|
21
|
+
## Deals intelligence
|
|
22
|
+
|
|
23
|
+
- **DEAL_LAST_REFRESHED**: `2026-09-01` → `2026-09-01`
|
|
24
|
+
|
|
25
|
+
No changes.
|
|
26
|
+
|
|
27
|
+
### Full changeset
|
|
28
|
+
|
|
29
|
+
The generated-catalog diff above is only the data layer (the new classification module — first refresh). This PR carries the whole derived-classification implementation (#109–#116): the shared RSC record source (scripts/rsc-source.mjs), the classification generator in the refresh ladder, the derived runtime (src/provider/reasoning.ts), the semantic diff sections + classificationChanged boolean, the meaningful-change drift detection (date-only churn opens no PR), ADR-0006/0007 + glossary + docs, and the auto-release workflow. npm test green on the head commit; per-ticket summary in the commit trail.
|
|
30
|
+
|
|
31
|
+
### Maintainer actions before merge (ADR-0007)
|
|
32
|
+
|
|
33
|
+
1. Add the RELEASE_PUSH_TOKEN secret (fine-grained PAT, this repo only, Contents: Read and write) so the tag push triggers the release pipeline — a default-token push does not start other workflows.
|
|
34
|
+
2. Branch protection is currently off, so the bot push lands freely; when you enable it, add a bypass for the pushing identity (ruleset bypass list).
|
|
35
|
+
|
|
36
|
+
_Opened from `catalog-refresh/2026-09-02` so merging exercises the new merge-to-release path: the auto-release workflow cuts `chore(release): 1.6.3` + tags v1.6.3, and release.yml publishes._
|
|
37
|
+
|
|
38
|
+
## 1.6.2 - 2026-09-01
|
|
39
|
+
|
|
40
|
+
Patch release. Make the daily catalog-refresh cron self-sustainable against
|
|
41
|
+
upstream data changes (refs issue #89) and ship the 2026-09-01 catalog
|
|
42
|
+
refresh.
|
|
43
|
+
|
|
44
|
+
- **Self-sustainable cron tests** — the daily catalog-refresh cron has been
|
|
45
|
+
failing every day since 2026-08-28 because its shape-pinning tests pinned
|
|
46
|
+
upstream-managed data (deal pcts, benchmark throughput, plan allowances,
|
|
47
|
+
effort-classification lists). Any legitimate upstream change — a deal
|
|
48
|
+
expiring, a benchmark value moving, a free variant being retired — failed
|
|
49
|
+
`npm test` and blocked the refresh PR until a human updated the pins.
|
|
50
|
+
This release separates **shape** from **value** in those tests, so the
|
|
51
|
+
cron can land upstream changes without manual intervention:
|
|
52
|
+
- `tests/refresh-deals.test.ts`: the five real-RSC `modelDealEntry`
|
|
53
|
+
value pins (Gemini 3.7 Flash, Qwen 3.6 Plus, MiniMax M3, DeepSeek V4
|
|
54
|
+
Flash, Laguna) are replaced with nine synthetic-record tests that own
|
|
55
|
+
every value they assert. A companion test exercises the "deal ended"
|
|
56
|
+
case the cron hit on 2026-08-31. The end-to-end real-RSC smoke test
|
|
57
|
+
still runs the parser over every per-plan slug record to catch
|
|
58
|
+
shape/contract regressions, but no longer pins values.
|
|
59
|
+
- `tests/refresh-deals-rsc.test.ts`: the "emitted catalog has parity
|
|
60
|
+
with the shipped catalog" test asserts structural fields (discount
|
|
61
|
+
exists, benchmark exists, allowance has both goat/pro keys,
|
|
62
|
+
peakOffPeak exists) instead of exact MiniMax / Kimi values. Value
|
|
63
|
+
semantics now live in the synthetic `modelDealEntry` tests.
|
|
64
|
+
- `tests/catalog-metadata.test.ts`: `EFFORTS_MODELS` is now derived
|
|
65
|
+
from the auto-generated `MODEL_EFFORTS` (the npm package's
|
|
66
|
+
`models.md` is the source of truth for which models expose effort
|
|
67
|
+
levels), so a new efforts model — like `deepseek/deepseek-v4-flash-fast`
|
|
68
|
+
added 2026-08-31 — lands in `MODEL_EFFORTS` on the next refresh and
|
|
69
|
+
the reasoning-classification test follows automatically. The
|
|
70
|
+
"exactly once" gate becomes a "no model is in both `MODEL_EFFORTS`
|
|
71
|
+
and `REASONING_MODELS`" invariant (a real misclassification signal)
|
|
72
|
+
plus an advisory check that `isReasoningModel` agrees with the
|
|
73
|
+
union and respects `NON_REASONING_MODELS`.
|
|
74
|
+
- `tests/plugin-models.test.ts`: the "free variants get a `(free)`
|
|
75
|
+
suffix" test pins on `poolside/laguna-s-2.1-free` (still in the
|
|
76
|
+
snapshot) instead of the MiniMax name-collision pair retired
|
|
77
|
+
from upstream.
|
|
78
|
+
- `src/provider/reasoning.ts`: drop `minimax/minimax-m3-free` from
|
|
79
|
+
`REASONING_MODELS` — the variant was retired from upstream's
|
|
80
|
+
`models.md` alongside the free model itself, so the entry was stale.
|
|
81
|
+
- **Catalog refresh — 2026-09-01** — snapshot + capability facts +
|
|
82
|
+
RSC fixtures refreshed to current upstream values (see PR #105).
|
|
83
|
+
- **Issue #89** — the broader question of how to lock down shape-pinning
|
|
84
|
+
value pins remains open; this release is the cron-side half of that
|
|
85
|
+
fix. The deals-value-pin half is still tracked in #89.
|
|
2
86
|
|
|
3
87
|
## 1.6.1 - 2026-08-29
|
|
4
88
|
|
package/README.md
CHANGED
|
@@ -161,6 +161,11 @@ auto-registered models only.
|
|
|
161
161
|
- Snapshot — `src/catalog/snapshot.ts` (model ids, names, context lengths) plus
|
|
162
162
|
`src/catalog/facts.ts` (reasoning efforts, per-1M-token rates, input
|
|
163
163
|
modalities). Regenerated from the live catalog via `npm run refresh:snapshot`.
|
|
164
|
+
- Classification — `src/catalog/classification.ts` (per-model reasoning
|
|
165
|
+
capability, derived from the `reasoning` flag on the docs' RSC slug
|
|
166
|
+
records; ADR-0006). Regenerated via `npm run refresh:classification`; the
|
|
167
|
+
runtime derives its reasoning metadata from this module, so upstream
|
|
168
|
+
classification changes land as data, never as hand edits.
|
|
164
169
|
- Deals — `src/deals/catalog.ts` (per-model tier, benchmarks, deal
|
|
165
170
|
discounts, `was`/`now` rates, peak/off-peak windows, and GOAT/Pro monthly
|
|
166
171
|
allowances for every model). Extracted from the Command Code docs' RSC
|
|
@@ -173,12 +178,16 @@ auto-registered models only.
|
|
|
173
178
|
Run `npm run refresh` to regenerate everything at once: the snapshot and
|
|
174
179
|
facts come from the live Command Code catalog, the RSC fixtures are
|
|
175
180
|
re-captured from the live docs pages (`npm run refresh:fixtures`), and the
|
|
176
|
-
deals catalog
|
|
177
|
-
and tests stay in lockstep. A daily GitHub
|
|
181
|
+
classification module and deals catalog are regenerated from the fresh
|
|
182
|
+
fixtures — so fixtures, catalogs, and tests stay in lockstep. A daily GitHub
|
|
183
|
+
Actions cron
|
|
178
184
|
(`.github/workflows/catalog-refresh.yml`, 06:00 UTC, also manually
|
|
179
185
|
triggerable via `workflow_dispatch`) runs the same pipeline: when upstream
|
|
180
186
|
moved it opens a `chore: catalog refresh` PR whose body is the human-readable
|
|
181
|
-
diff from `scripts/diff-catalog.mjs
|
|
187
|
+
diff from `scripts/diff-catalog.mjs` — model catalog, reasoning
|
|
188
|
+
classification (flips, new reasoning models, retirements, active overrides),
|
|
189
|
+
and deals sections; when nothing meaningful drifted it exits silently (a
|
|
190
|
+
run whose only change is the refreshed-date stamps opens no PR).
|
|
182
191
|
|
|
183
192
|
Auto-registration adds no network latency to OpenCode startup — the snapshot is
|
|
184
193
|
bundled, and the plugin never contacts the Command Code API to list models. The
|
|
@@ -199,7 +208,13 @@ compatible API endpoints:
|
|
|
199
208
|
|
|
200
209
|
### Reasoning support
|
|
201
210
|
|
|
202
|
-
Reasoning metadata is
|
|
211
|
+
Reasoning metadata is derived from the generated catalogs (ADR-0006): models
|
|
212
|
+
upstream flags as reasoning-capable advertise `reasoning: true`
|
|
213
|
+
automatically — with explicit effort variants when the generated facts list
|
|
214
|
+
effort levels, and without variants otherwise. Supported levels are sent as
|
|
215
|
+
the documented `reasoning_effort` request field; `off`, unsupported levels,
|
|
216
|
+
and newly discovered models without metadata do not add reasoning fields to
|
|
217
|
+
the request. No prompt instructions are injected.
|
|
203
218
|
|
|
204
219
|
Reasoning blocks from completed assistant turns are not replayed to Command Code in later requests; only the user-visible text and completed tool calls are sent back as history. This prevents prior private reasoning traces from interfering with reasoning on follow-up turns.
|
|
205
220
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const CLASSIFICATION_SOURCE_URLS: ReadonlyArray<string>;
|
|
2
|
+
export declare const CLASSIFICATION_LAST_REFRESHED = "2026-09-02";
|
|
3
|
+
export declare const CLASSIFICATION_OVERRIDES: Readonly<Record<string, {
|
|
4
|
+
capability: boolean;
|
|
5
|
+
justification: string;
|
|
6
|
+
}>>;
|
|
7
|
+
export declare const MODEL_REASONING_CAPABILITY: Readonly<Record<string, boolean>>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// src/catalog/classification.ts — GENERATED by scripts/refresh-classification.mjs. Do not edit.
|
|
2
|
+
//
|
|
3
|
+
// Per-model reasoning capability, derived from the `reasoning` flag on
|
|
4
|
+
// the Command Code docs' RSC slug records (plans/goat + plans/pro,
|
|
5
|
+
// slug-id aliasing applied, keyed by snapshot id) — the same
|
|
6
|
+
// snapshot-keyed records the Deals catalog consumes. Classification is
|
|
7
|
+
// upstream-managed and derived, never hand-maintained; the only human
|
|
8
|
+
// seam is CLASSIFICATION_OVERRIDES, whose entries each carry a written
|
|
9
|
+
// justification naming the upstream disagreement (see ADR-0006).
|
|
10
|
+
// Regenerate with `npm run refresh` (offline:
|
|
11
|
+
// `npm run refresh:classification -- --fixtures`).
|
|
12
|
+
export const CLASSIFICATION_SOURCE_URLS = [
|
|
13
|
+
"https://commandcode.ai/docs/plans/goat",
|
|
14
|
+
"https://commandcode.ai/docs/plans/pro",
|
|
15
|
+
];
|
|
16
|
+
export const CLASSIFICATION_LAST_REFRESHED = "2026-09-02";
|
|
17
|
+
// Active capability overrides. Empty = upstream data is truth.
|
|
18
|
+
// Every entry requires a written justification naming the upstream
|
|
19
|
+
// disagreement; entries are rendered into the refresh PR body.
|
|
20
|
+
export const CLASSIFICATION_OVERRIDES = {};
|
|
21
|
+
export const MODEL_REASONING_CAPABILITY = {
|
|
22
|
+
"claude-fable-5": true,
|
|
23
|
+
"claude-fable-5-1": true,
|
|
24
|
+
"claude-haiku-4-5-20251001": false,
|
|
25
|
+
"claude-opus-4-7": true,
|
|
26
|
+
"claude-opus-4-8": true,
|
|
27
|
+
"claude-opus-5": true,
|
|
28
|
+
"claude-sonnet-4-6": true,
|
|
29
|
+
"claude-sonnet-5": true,
|
|
30
|
+
"deepseek/deepseek-v4-flash": true,
|
|
31
|
+
"deepseek/deepseek-v4-flash-fast": true,
|
|
32
|
+
"deepseek/deepseek-v4-flash-vision-exp": true,
|
|
33
|
+
"deepseek/deepseek-v4-pro": true,
|
|
34
|
+
"google/gemini-3.1-flash-lite": true,
|
|
35
|
+
"google/gemini-3.5-flash": true,
|
|
36
|
+
"google/gemini-3.5-flash-lite": true,
|
|
37
|
+
"google/gemini-3.6-flash": true,
|
|
38
|
+
"google/gemini-3.7-flash": true,
|
|
39
|
+
"google/gemini-3.8-flash": true,
|
|
40
|
+
"gpt-5.3-codex": true,
|
|
41
|
+
"gpt-5.4": true,
|
|
42
|
+
"gpt-5.4-mini": true,
|
|
43
|
+
"gpt-5.5": true,
|
|
44
|
+
"gpt-5.6-luna": true,
|
|
45
|
+
"gpt-5.6-sol": true,
|
|
46
|
+
"gpt-5.6-terra": true,
|
|
47
|
+
"meituan/LongCat-2.0:free": true,
|
|
48
|
+
"meta/muse-spark-1.1": true,
|
|
49
|
+
"meta/muse-spark-1.2": true,
|
|
50
|
+
"meta/muse-spark-1.2-contributor": true,
|
|
51
|
+
"meta/muse-spark-1.3": true,
|
|
52
|
+
"meta/muse-spark-1.3-contributor": true,
|
|
53
|
+
"MiniMaxAI/MiniMax-M2.5": false,
|
|
54
|
+
"MiniMaxAI/MiniMax-M2.7": false,
|
|
55
|
+
"MiniMaxAI/MiniMax-M3": true,
|
|
56
|
+
"moonshotai/Kimi-K2.5": false,
|
|
57
|
+
"moonshotai/Kimi-K2.6": false,
|
|
58
|
+
"moonshotai/Kimi-K2.7-Code": true,
|
|
59
|
+
"moonshotai/Kimi-K2.7-Code-Highspeed": true,
|
|
60
|
+
"moonshotai/Kimi-K3": true,
|
|
61
|
+
"nvidia/nemotron-3-ultra-550b-a55b": true,
|
|
62
|
+
"poolside/laguna-s-2.1-free": true,
|
|
63
|
+
"Qwen/Qwen3.6-Max-Preview": true,
|
|
64
|
+
"Qwen/Qwen3.6-Plus": true,
|
|
65
|
+
"Qwen/Qwen3.7-Flash": true,
|
|
66
|
+
"Qwen/Qwen3.7-Max": true,
|
|
67
|
+
"Qwen/Qwen3.7-Plus": true,
|
|
68
|
+
"Qwen/Qwen3.8-27B": true,
|
|
69
|
+
"Qwen/Qwen3.8-Flash": true,
|
|
70
|
+
"Qwen/Qwen3.8-Max": true,
|
|
71
|
+
"Qwen/Qwen3.8-Max-0902": true,
|
|
72
|
+
"sakana/fugu-ultra": true,
|
|
73
|
+
"stepfun/Step-3.5-Flash": true,
|
|
74
|
+
"stepfun/Step-3.7-Flash": true,
|
|
75
|
+
"tencent/hy3-paid": true,
|
|
76
|
+
"tencent/hy4-preview": true,
|
|
77
|
+
"thinkingmachines/inkling": true,
|
|
78
|
+
"thinkingmachines/inkling-small": true,
|
|
79
|
+
"xai/grok-4.5": true,
|
|
80
|
+
"xai/grok-4.6": true,
|
|
81
|
+
"xiaomi/mimo-v2.5": false,
|
|
82
|
+
"xiaomi/mimo-v2.5-pro": false,
|
|
83
|
+
"z-ai/glm-5.3-flash": true,
|
|
84
|
+
"zai-org/GLM-5": false,
|
|
85
|
+
"zai-org/GLM-5.1": false,
|
|
86
|
+
"zai-org/GLM-5.2": true,
|
|
87
|
+
"zai-org/GLM-5.2-Fast": false,
|
|
88
|
+
"zai-org/GLM-5.3": true,
|
|
89
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export declare const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.
|
|
2
|
-
export declare const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.
|
|
3
|
-
export declare const FACTS_PACKAGE_VERSION = "1.
|
|
4
|
-
export declare const FACTS_LAST_REFRESHED = "2026-
|
|
1
|
+
export declare const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/bundled/command-code-knowledge/reference/models.md";
|
|
2
|
+
export declare const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/cli.mjs";
|
|
3
|
+
export declare const FACTS_PACKAGE_VERSION = "1.44.0";
|
|
4
|
+
export declare const FACTS_LAST_REFRESHED = "2026-09-02";
|
|
5
5
|
export declare const MODEL_EFFORTS: Readonly<Record<string, readonly string[]>>;
|
|
6
6
|
export declare const MODEL_COSTS: Readonly<Record<string, {
|
|
7
7
|
input: number;
|
|
@@ -4,23 +4,27 @@
|
|
|
4
4
|
// command-code npm package's bundled model catalog (models.md), plus input
|
|
5
5
|
// modalities parsed from its CLI bundle (dist/cli.mjs). Regenerate
|
|
6
6
|
// with `npm run refresh:snapshot`.
|
|
7
|
-
export const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.
|
|
8
|
-
export const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.
|
|
9
|
-
export const FACTS_PACKAGE_VERSION = "1.
|
|
10
|
-
export const FACTS_LAST_REFRESHED = "2026-
|
|
7
|
+
export const FACTS_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/bundled/command-code-knowledge/reference/models.md";
|
|
8
|
+
export const MODALITIES_SOURCE_URL = "https://unpkg.com/command-code@1.44.0/dist/cli.mjs";
|
|
9
|
+
export const FACTS_PACKAGE_VERSION = "1.44.0";
|
|
10
|
+
export const FACTS_LAST_REFRESHED = "2026-09-02";
|
|
11
11
|
export const MODEL_EFFORTS = {
|
|
12
12
|
"deepseek/deepseek-v4-pro": ["high", "max"],
|
|
13
13
|
"deepseek/deepseek-v4-flash": ["high", "max"],
|
|
14
14
|
"deepseek/deepseek-v4-flash-vision-exp": ["high", "max"],
|
|
15
|
+
"deepseek/deepseek-v4-flash-fast": ["low", "high", "max"],
|
|
16
|
+
"moonshotai/Kimi-K3": ["low", "high", "max"],
|
|
15
17
|
"z-ai/glm-5.3-flash": ["low", "high", "max"],
|
|
16
18
|
"zai-org/GLM-5.3": ["low", "high", "max"],
|
|
17
19
|
"zai-org/GLM-5.2": ["high", "max"],
|
|
20
|
+
"Qwen/Qwen3.8-Max-0902": ["low", "medium", "xhigh"],
|
|
18
21
|
"Qwen/Qwen3.8-Max": ["low", "medium", "xhigh"],
|
|
19
22
|
"Qwen/Qwen3.8-27B": ["low", "medium", "xhigh"],
|
|
20
23
|
"Qwen/Qwen3.8-Flash": ["low", "medium", "xhigh"],
|
|
21
24
|
"tencent/hy4-preview": ["low", "medium", "high"],
|
|
22
25
|
"claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"],
|
|
23
26
|
"claude-sonnet-4-6": ["low", "medium", "high", "xhigh", "max"],
|
|
27
|
+
"claude-fable-5-1": ["low", "medium", "high", "xhigh", "max"],
|
|
24
28
|
"claude-fable-5": ["low", "medium", "high", "xhigh", "max"],
|
|
25
29
|
"claude-opus-5": ["low", "medium", "high", "xhigh", "max"],
|
|
26
30
|
"claude-opus-4-8": ["low", "medium", "high", "xhigh", "max"],
|
|
@@ -32,6 +36,7 @@ export const MODEL_EFFORTS = {
|
|
|
32
36
|
"gpt-5.4": ["low", "medium", "high", "xhigh"],
|
|
33
37
|
"gpt-5.3-codex": ["low", "medium", "high", "xhigh"],
|
|
34
38
|
"gpt-5.4-mini": ["low", "medium", "high"],
|
|
39
|
+
"google/gemini-3.8-flash": ["low", "medium", "high"],
|
|
35
40
|
"google/gemini-3.7-flash": ["low", "medium", "high"],
|
|
36
41
|
"google/gemini-3.6-flash": ["low", "medium", "high"],
|
|
37
42
|
"google/gemini-3.5-flash": ["low", "medium", "high"],
|
|
@@ -45,6 +50,7 @@ export const MODEL_COSTS = {
|
|
|
45
50
|
"deepseek/deepseek-v4-pro": { input: 0.66, output: 1.98, cacheRead: 0.022, cacheWrite: 0 },
|
|
46
51
|
"deepseek/deepseek-v4-flash": { input: 0.22, output: 0.66, cacheRead: 0.007, cacheWrite: 0 },
|
|
47
52
|
"deepseek/deepseek-v4-flash-vision-exp": { input: 0.22, output: 0.66, cacheRead: 0.007, cacheWrite: 0 },
|
|
53
|
+
"deepseek/deepseek-v4-flash-fast": { input: 0.28, output: 0.56, cacheRead: 0.07, cacheWrite: 0 },
|
|
48
54
|
"moonshotai/Kimi-K3": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 0 },
|
|
49
55
|
"moonshotai/Kimi-K2.7-Code": { input: 0.95, output: 4, cacheRead: 0.19, cacheWrite: 0 },
|
|
50
56
|
"moonshotai/Kimi-K2.7-Code-Highspeed": { input: 1.9, output: 8, cacheRead: 0.38, cacheWrite: 0 },
|
|
@@ -58,11 +64,10 @@ export const MODEL_COSTS = {
|
|
|
58
64
|
"zai-org/GLM-5": { input: 1, output: 3.2, cacheRead: 0.2, cacheWrite: 0 },
|
|
59
65
|
"MiniMaxAI/MiniMax-M3": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 },
|
|
60
66
|
"MiniMaxAI/MiniMax-M2.7": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 },
|
|
61
|
-
"minimax/minimax-m3-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
62
|
-
"minimax/minimax-m2.7-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
63
67
|
"MiniMaxAI/MiniMax-M2.5": { input: 0.3, output: 1.2, cacheRead: 0.03, cacheWrite: 0 },
|
|
64
68
|
"xiaomi/mimo-v2.5-pro": { input: 0.435, output: 0.87, cacheRead: 0.0036, cacheWrite: 0 },
|
|
65
69
|
"xiaomi/mimo-v2.5": { input: 0.14, output: 0.28, cacheRead: 0.0028, cacheWrite: 0 },
|
|
70
|
+
"Qwen/Qwen3.8-Max-0902": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 0 },
|
|
66
71
|
"Qwen/Qwen3.8-Max": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 2.5 },
|
|
67
72
|
"Qwen/Qwen3.8-27B": { input: 0.4, output: 3, cacheRead: 0.04, cacheWrite: 0 },
|
|
68
73
|
"Qwen/Qwen3.8-Flash": { input: 0.16, output: 0.47, cacheRead: 0.016, cacheWrite: 0 },
|
|
@@ -71,6 +76,7 @@ export const MODEL_COSTS = {
|
|
|
71
76
|
"Qwen/Qwen3.7-Flash": { input: 0.03, output: 0.13, cacheRead: 0.006, cacheWrite: 0.038 },
|
|
72
77
|
"Qwen/Qwen3.6-Max-Preview": { input: 1.3, output: 7.8, cacheRead: 0.26, cacheWrite: 1.63 },
|
|
73
78
|
"Qwen/Qwen3.6-Plus": { input: 0.5, output: 3, cacheRead: 0.1, cacheWrite: 0 },
|
|
79
|
+
"meituan/LongCat-2.0:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
74
80
|
"stepfun/Step-3.7-Flash": { input: 0.2, output: 1.15, cacheRead: 0.04, cacheWrite: 0 },
|
|
75
81
|
"stepfun/Step-3.5-Flash": { input: 0.1, output: 0.3, cacheRead: 0.02, cacheWrite: 0 },
|
|
76
82
|
"tencent/hy3-paid": { input: 0.14, output: 0.58, cacheRead: 0.035, cacheWrite: 0 },
|
|
@@ -81,6 +87,7 @@ export const MODEL_COSTS = {
|
|
|
81
87
|
"poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
82
88
|
"claude-sonnet-5": { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
|
|
83
89
|
"claude-sonnet-4-6": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
|
|
90
|
+
"claude-fable-5-1": { input: 10, output: 50, cacheRead: 0.25, cacheWrite: 12.5 },
|
|
84
91
|
"claude-fable-5": { input: 10, output: 50, cacheRead: 1, cacheWrite: 12.5 },
|
|
85
92
|
"claude-opus-5": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
|
|
86
93
|
"claude-opus-4-8": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
|
|
@@ -93,6 +100,7 @@ export const MODEL_COSTS = {
|
|
|
93
100
|
"gpt-5.4": { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 },
|
|
94
101
|
"gpt-5.3-codex": { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 },
|
|
95
102
|
"gpt-5.4-mini": { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 },
|
|
103
|
+
"google/gemini-3.8-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 },
|
|
96
104
|
"google/gemini-3.7-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0.08334 },
|
|
97
105
|
"google/gemini-3.6-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 },
|
|
98
106
|
"google/gemini-3.5-flash": { input: 1.5, output: 9, cacheRead: 0.15, cacheWrite: 0 },
|
|
@@ -102,6 +110,8 @@ export const MODEL_COSTS = {
|
|
|
102
110
|
"meta/muse-spark-1.1": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 },
|
|
103
111
|
"meta/muse-spark-1.2": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 },
|
|
104
112
|
"meta/muse-spark-1.2-contributor": { input: 0.1, output: 0.2, cacheRead: 0.002, cacheWrite: 0 },
|
|
113
|
+
"meta/muse-spark-1.3": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 },
|
|
114
|
+
"meta/muse-spark-1.3-contributor": { input: 0.1, output: 0.2, cacheRead: 0.002, cacheWrite: 0 },
|
|
105
115
|
"xai/grok-4.5": { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },
|
|
106
116
|
"xai/grok-4.6": { input: 2, output: 6, cacheRead: 0.5, cacheWrite: 0 },
|
|
107
117
|
};
|
|
@@ -113,7 +123,9 @@ export const MODEL_INPUT_MODALITIES = {
|
|
|
113
123
|
"Qwen/Qwen3.8-27B": ["text", "image"],
|
|
114
124
|
"Qwen/Qwen3.8-Flash": ["text", "image"],
|
|
115
125
|
"Qwen/Qwen3.8-Max": ["text", "image"],
|
|
126
|
+
"Qwen/Qwen3.8-Max-0902": ["text", "image"],
|
|
116
127
|
"claude-fable-5": ["text", "image"],
|
|
128
|
+
"claude-fable-5-1": ["text", "image"],
|
|
117
129
|
"claude-haiku-4-5-20251001": ["text", "image"],
|
|
118
130
|
"claude-opus-4-7": ["text", "image"],
|
|
119
131
|
"claude-opus-4-8": ["text", "image"],
|
|
@@ -126,6 +138,7 @@ export const MODEL_INPUT_MODALITIES = {
|
|
|
126
138
|
"google/gemini-3.5-flash-lite": ["text", "image"],
|
|
127
139
|
"google/gemini-3.6-flash": ["text", "image"],
|
|
128
140
|
"google/gemini-3.7-flash": ["text", "image"],
|
|
141
|
+
"google/gemini-3.8-flash": ["text", "image"],
|
|
129
142
|
"gpt-5.3-codex": ["text", "image"],
|
|
130
143
|
"gpt-5.4": ["text", "image"],
|
|
131
144
|
"gpt-5.4-mini": ["text", "image"],
|
|
@@ -136,7 +149,8 @@ export const MODEL_INPUT_MODALITIES = {
|
|
|
136
149
|
"meta/muse-spark-1.1": ["text", "image"],
|
|
137
150
|
"meta/muse-spark-1.2": ["text", "image"],
|
|
138
151
|
"meta/muse-spark-1.2-contributor": ["text", "image"],
|
|
139
|
-
"
|
|
152
|
+
"meta/muse-spark-1.3": ["text", "image"],
|
|
153
|
+
"meta/muse-spark-1.3-contributor": ["text", "image"],
|
|
140
154
|
"moonshotai/Kimi-K2.5": ["text", "image"],
|
|
141
155
|
"moonshotai/Kimi-K2.6": ["text", "image"],
|
|
142
156
|
"moonshotai/Kimi-K2.7-Code": ["text", "image"],
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export const MODEL_SNAPSHOT = [
|
|
7
7
|
{ id: "claude-sonnet-5", name: "Claude Sonnet 5", contextLength: 1000000 },
|
|
8
8
|
{ id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", contextLength: 1000000 },
|
|
9
|
+
{ id: "claude-fable-5-1", name: "Claude Fable 5.1", contextLength: 1000000 },
|
|
9
10
|
{ id: "claude-fable-5", name: "Claude Fable 5", contextLength: 1000000 },
|
|
10
11
|
{ id: "claude-opus-5", name: "Claude Opus 5", contextLength: 1000000 },
|
|
11
12
|
{ id: "claude-opus-4-8", name: "Claude Opus 4.8", contextLength: 1000000 },
|
|
@@ -21,6 +22,7 @@ export const MODEL_SNAPSHOT = [
|
|
|
21
22
|
{ id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro (latest)", contextLength: 1000000 },
|
|
22
23
|
{ id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash (latest)", contextLength: 1000000 },
|
|
23
24
|
{ id: "deepseek/deepseek-v4-flash-vision-exp", name: "DeepSeek V4 Flash Vision (exp)", contextLength: 1000000 },
|
|
25
|
+
{ id: "deepseek/deepseek-v4-flash-fast", name: "DeepSeek V4 Flash Fast", contextLength: 1000000 },
|
|
24
26
|
{ id: "moonshotai/Kimi-K3", name: "Kimi K3", contextLength: 1000000 },
|
|
25
27
|
{ id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", contextLength: 256000 },
|
|
26
28
|
{ id: "moonshotai/Kimi-K2.7-Code-Highspeed", name: "Kimi K2.7 Code HighSpeed", contextLength: 262000 },
|
|
@@ -34,11 +36,10 @@ export const MODEL_SNAPSHOT = [
|
|
|
34
36
|
{ id: "zai-org/GLM-5", name: "GLM-5", contextLength: 200000 },
|
|
35
37
|
{ id: "MiniMaxAI/MiniMax-M3", name: "MiniMax M3", contextLength: 1000000 },
|
|
36
38
|
{ id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax M2.7", contextLength: 200000 },
|
|
37
|
-
{ id: "minimax/minimax-m3-free", name: "MiniMax M3", contextLength: 1000000 },
|
|
38
|
-
{ id: "minimax/minimax-m2.7-free", name: "MiniMax M2.7", contextLength: 197000 },
|
|
39
39
|
{ id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", contextLength: 200000 },
|
|
40
40
|
{ id: "xiaomi/mimo-v2.5-pro", name: "MiMo V2.5 Pro", contextLength: 1000000 },
|
|
41
41
|
{ id: "xiaomi/mimo-v2.5", name: "MiMo V2.5", contextLength: 1000000 },
|
|
42
|
+
{ id: "Qwen/Qwen3.8-Max-0902", name: "Qwen 3.8 Max 0902", contextLength: 1000000 },
|
|
42
43
|
{ id: "Qwen/Qwen3.8-Max", name: "Qwen 3.8 Max", contextLength: 1000000 },
|
|
43
44
|
{ id: "Qwen/Qwen3.8-27B", name: "Qwen 3.8 27B", contextLength: 262144 },
|
|
44
45
|
{ id: "Qwen/Qwen3.8-Flash", name: "Qwen 3.8 Flash", contextLength: 1000000 },
|
|
@@ -47,10 +48,12 @@ export const MODEL_SNAPSHOT = [
|
|
|
47
48
|
{ id: "Qwen/Qwen3.7-Flash", name: "Qwen 3.7 Flash", contextLength: 1000000 },
|
|
48
49
|
{ id: "Qwen/Qwen3.6-Max-Preview", name: "Qwen 3.6 Max Preview", contextLength: 200000 },
|
|
49
50
|
{ id: "Qwen/Qwen3.6-Plus", name: "Qwen 3.6 Plus", contextLength: 200000 },
|
|
51
|
+
{ id: "meituan/LongCat-2.0:free", name: "LongCat 2.0", contextLength: 1048576 },
|
|
50
52
|
{ id: "stepfun/Step-3.7-Flash", name: "Step 3.7 Flash", contextLength: 256000 },
|
|
51
53
|
{ id: "stepfun/Step-3.5-Flash", name: "Step 3.5 Flash", contextLength: 1000000 },
|
|
52
54
|
{ id: "tencent/hy3-paid", name: "Tencent Hy3", contextLength: 262144 },
|
|
53
55
|
{ id: "tencent/hy4-preview", name: "Tencent Hy4 Preview", contextLength: 1048576 },
|
|
56
|
+
{ id: "google/gemini-3.8-flash", name: "Gemini 3.8 Flash", contextLength: 1000000 },
|
|
54
57
|
{ id: "google/gemini-3.7-flash", name: "Gemini 3.7 Flash", contextLength: 1048576 },
|
|
55
58
|
{ id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", contextLength: 1000000 },
|
|
56
59
|
{ id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", contextLength: 1000000 },
|
|
@@ -64,6 +67,8 @@ export const MODEL_SNAPSHOT = [
|
|
|
64
67
|
{ id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", contextLength: 1048576 },
|
|
65
68
|
{ id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", contextLength: 1048576 },
|
|
66
69
|
{ id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", contextLength: 1048576 },
|
|
70
|
+
{ id: "meta/muse-spark-1.3", name: "Muse Spark 1.3", contextLength: 1048576 },
|
|
71
|
+
{ id: "meta/muse-spark-1.3-contributor", name: "Muse Spark 1.3 Contributor", contextLength: 1048576 },
|
|
67
72
|
{ id: "xai/grok-4.5", name: "Grok 4.5", contextLength: 500000 },
|
|
68
73
|
{ id: "xai/grok-4.6", name: "Grok 4.6", contextLength: 500000 },
|
|
69
74
|
];
|
|
@@ -51,5 +51,5 @@ export interface ModelDeals {
|
|
|
51
51
|
export declare const MODEL_DEALS: Readonly<Record<string, ModelDeals>>;
|
|
52
52
|
export declare const PLAN_CATALOG: Readonly<Record<PlanId, PlanInfo>>;
|
|
53
53
|
export declare const DEAL_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits";
|
|
54
|
-
export declare const DEAL_LAST_REFRESHED = "2026-
|
|
54
|
+
export declare const DEAL_LAST_REFRESHED = "2026-09-02";
|
|
55
55
|
export declare const DEAL_PACKAGE_VERSION = "docs";
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// without network access at runtime. Regenerate with `npm run refresh:deals`.
|
|
7
7
|
export const MODEL_DEALS = {
|
|
8
8
|
"claude-fable-5": { tier: "premium", benchmark: { "intelligence": 62.1, "tokPerSec": 67.8 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
9
|
+
"claude-fable-5-1": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
9
10
|
"claude-haiku-4-5-20251001": { tier: "premium", benchmark: { "intelligence": 24.1, "tokPerSec": 103.9 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
10
11
|
"claude-opus-4-7": { tier: "premium", benchmark: { "intelligence": 55 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
11
12
|
"claude-opus-4-8": { tier: "premium", benchmark: { "intelligence": 57.3 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
@@ -13,13 +14,15 @@ export const MODEL_DEALS = {
|
|
|
13
14
|
"claude-sonnet-4-6": { tier: "premium", benchmark: { "intelligence": 48.4 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
14
15
|
"claude-sonnet-5": { tier: "premium", benchmark: { "intelligence": 55.3, "tokPerSec": 89.6 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
15
16
|
"deepseek/deepseek-v4-flash": { tier: "opensource", benchmark: { "intelligence": 51.8, "tokPerSec": 129 }, peakOffPeak: { "peak": { "input": 0.44, "output": 1.32, "cacheRead": 0.014, "cacheWrite": 0 }, "offPeak": { "input": 0.22, "output": 0.66, "cacheRead": 0.007, "cacheWrite": 0 }, "windows": "01–04 & 06–10 UTC" }, free: false, allowance: { "goat": 60, "pro": 70 } },
|
|
17
|
+
"deepseek/deepseek-v4-flash-fast": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
16
18
|
"deepseek/deepseek-v4-flash-vision-exp": { tier: "opensource", peakOffPeak: { "peak": { "input": 0.44, "output": 1.32, "cacheRead": 0.014, "cacheWrite": 0 }, "offPeak": { "input": 0.22, "output": 0.66, "cacheRead": 0.007, "cacheWrite": 0 }, "windows": "01–04 & 06–10 UTC" }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
17
19
|
"deepseek/deepseek-v4-pro": { tier: "opensource", benchmark: { "intelligence": 53.2, "tokPerSec": 61 }, peakOffPeak: { "peak": { "input": 1.32, "output": 3.96, "cacheRead": 0.044, "cacheWrite": 0 }, "offPeak": { "input": 0.66, "output": 1.98, "cacheRead": 0.022, "cacheWrite": 0 }, "windows": "01–04 & 06–10 UTC" }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
18
20
|
"google/gemini-3.1-flash-lite": { tier: "premium", benchmark: { "intelligence": 25.6 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
19
21
|
"google/gemini-3.5-flash": { tier: "premium", benchmark: { "intelligence": 52 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
20
22
|
"google/gemini-3.5-flash-lite": { tier: "premium", benchmark: { "intelligence": 37.4, "tokPerSec": 368.8 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
21
23
|
"google/gemini-3.6-flash": { tier: "premium", benchmark: { "intelligence": 51.6, "tokPerSec": 197.3 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
22
|
-
"google/gemini-3.7-flash": { tier: "opensource",
|
|
24
|
+
"google/gemini-3.7-flash": { tier: "opensource", benchmark: { "intelligence": 56, "tokPerSec": 365.9 }, free: false, allowance: { "goat": 40, "pro": 50 } },
|
|
25
|
+
"google/gemini-3.8-flash": { tier: "premium", free: false, allowance: { "goat": 40, "pro": 50 } },
|
|
23
26
|
"gpt-5.3-codex": { tier: "premium", benchmark: { "intelligence": 45.5, "tokPerSec": 121.4 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
24
27
|
"gpt-5.4": { tier: "premium", benchmark: { "intelligence": 53.1 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
25
28
|
"gpt-5.4-mini": { tier: "premium", benchmark: { "intelligence": 40.9 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
@@ -27,11 +30,12 @@ export const MODEL_DEALS = {
|
|
|
27
30
|
"gpt-5.6-luna": { tier: "opensource", benchmark: { "intelligence": 52.3, "tokPerSec": 124.1 }, overContext: { "input": 0.4, "output": 1.8, "cacheRead": 0.04, "cacheWrite": 0.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
28
31
|
"gpt-5.6-sol": { tier: "opensource", benchmark: { "intelligence": 60.9, "tokPerSec": 69.6 }, overContext: { "input": 10, "output": 45, "cacheRead": 1, "cacheWrite": 12.5 }, free: false, allowance: { "goat": 70, "pro": 80 } },
|
|
29
32
|
"gpt-5.6-terra": { tier: "premium", benchmark: { "intelligence": 56.6, "tokPerSec": 112.8 }, overContext: { "input": 4, "output": 18, "cacheRead": 0.4, "cacheWrite": 5 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
33
|
+
"meituan/LongCat-2.0:free": { tier: "opensource", free: true },
|
|
30
34
|
"meta/muse-spark-1.1": { tier: "premium", benchmark: { "intelligence": 53.2 }, free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
31
35
|
"meta/muse-spark-1.2": { tier: "opensource", benchmark: { "intelligence": 56.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
32
36
|
"meta/muse-spark-1.2-contributor": { tier: "opensource", benchmark: { "intelligence": 56.8 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
33
|
-
"
|
|
34
|
-
"
|
|
37
|
+
"meta/muse-spark-1.3": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
38
|
+
"meta/muse-spark-1.3-contributor": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
35
39
|
"MiniMaxAI/MiniMax-M2.5": { tier: "opensource", benchmark: { "intelligence": 34.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
36
40
|
"MiniMaxAI/MiniMax-M2.7": { tier: "opensource", benchmark: { "intelligence": 38.9 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
37
41
|
"MiniMaxAI/MiniMax-M3": { tier: "opensource", discount: { "pct": 50 }, was: { "input": 0.6, "output": 2.4, "cacheRead": 0.12 }, now: { "input": 0.3, "output": 1.2, "cacheRead": 0.06 }, benchmark: { "intelligence": 45.4, "tokPerSec": 111.3 }, free: false, allowance: { "goat": 47, "pro": 57 } },
|
|
@@ -50,6 +54,7 @@ export const MODEL_DEALS = {
|
|
|
50
54
|
"Qwen/Qwen3.8-27B": { tier: "opensource", benchmark: { "intelligence": 52, "tokPerSec": 50.5 }, free: false, allowance: { "goat": 70, "pro": 80 } },
|
|
51
55
|
"Qwen/Qwen3.8-Flash": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
52
56
|
"Qwen/Qwen3.8-Max": { tier: "opensource", benchmark: { "intelligence": 58.1, "tokPerSec": 23.6 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
57
|
+
"Qwen/Qwen3.8-Max-0902": { tier: "opensource", free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
53
58
|
"sakana/fugu-ultra": { tier: "premium", free: false, allowance: { "goat": 20, "pro": 20 } },
|
|
54
59
|
"stepfun/Step-3.5-Flash": { tier: "opensource", benchmark: { "intelligence": 26.5 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
55
60
|
"stepfun/Step-3.7-Flash": { tier: "opensource", benchmark: { "intelligence": 30.9, "tokPerSec": 94.1 }, free: false, allowance: { "goat": 20, "pro": 30 } },
|
|
@@ -78,5 +83,5 @@ export const PLAN_CATALOG = {
|
|
|
78
83
|
provider: { price: 15, credits: 0, window5h: 0, windowWeek: 0, display: "Provider" },
|
|
79
84
|
};
|
|
80
85
|
export const DEAL_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits";
|
|
81
|
-
export const DEAL_LAST_REFRESHED = "2026-
|
|
86
|
+
export const DEAL_LAST_REFRESHED = "2026-09-02";
|
|
82
87
|
export const DEAL_PACKAGE_VERSION = "docs";
|
|
@@ -4,10 +4,25 @@
|
|
|
4
4
|
export declare const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasoningEffort[]>>;
|
|
5
5
|
export type PiThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
6
6
|
type CommandCodeReasoningEffort = Exclude<PiThinkingLevel, "off">;
|
|
7
|
+
/**
|
|
8
|
+
* Derives the reasoning-without-efforts set from a capability map and an
|
|
9
|
+
* efforts table: a model is reasoning-capable without explicit efforts
|
|
10
|
+
* when upstream's capability flag is true AND the facts carry no efforts
|
|
11
|
+
* entry for it. Efforts precedence holds by construction — an efforts
|
|
12
|
+
* model never appears in this set, so the "a model is classified exactly
|
|
13
|
+
* once" invariant is true by construction rather than asserted after
|
|
14
|
+
* regeneration (spec #108 / issue #111). Exported for the derivation
|
|
15
|
+
* checks; the runtime consumes the derived REASONING_MODELS below.
|
|
16
|
+
*/
|
|
17
|
+
export declare function deriveReasoningWithoutEfforts(capability: Readonly<Record<string, boolean>>, efforts: Readonly<Record<string, readonly string[]>>): ReadonlySet<string>;
|
|
7
18
|
/**
|
|
8
19
|
* Models Command Code advertises as reasoning-capable without exposing
|
|
9
20
|
* explicit effort levels (Command Code chooses the reasoning depth). These
|
|
10
21
|
* advertise `reasoning: true` in opencode but never generate `variants`.
|
|
22
|
+
*
|
|
23
|
+
* Derived from the generated classification module + the generated efforts
|
|
24
|
+
* facts — upstream data is the source of truth, so upstream classification
|
|
25
|
+
* changes land on the next catalog refresh with zero human edits.
|
|
11
26
|
*/
|
|
12
27
|
export declare const REASONING_MODELS: ReadonlySet<string>;
|
|
13
28
|
export interface ThinkingMetadata {
|
|
@@ -19,6 +34,11 @@ export interface ThinkingMetadata {
|
|
|
19
34
|
};
|
|
20
35
|
}
|
|
21
36
|
export declare function thinkingMetadataForModel(modelId: string): ThinkingMetadata | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* A model is reasoning-capable when it has an explicit efforts entry OR
|
|
39
|
+
* upstream's capability flag is true. Derived entirely from the generated
|
|
40
|
+
* catalogs — no hand-maintained set remains.
|
|
41
|
+
*/
|
|
22
42
|
export declare function isReasoningModel(modelId: string): boolean;
|
|
23
43
|
/**
|
|
24
44
|
* opencode model `variants` for the Command Code model: one entry per supported
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
// src/provider/reasoning.ts — reasoning-effort metadata tables (PLAN #5 Part A,
|
|
2
|
-
// port of pi's models.ts:67-150). Reasoning metadata
|
|
3
|
-
// generated catalog facts (`src/catalog/facts.ts
|
|
4
|
-
// classification
|
|
2
|
+
// port of pi's models.ts:67-150). Reasoning metadata comes from the
|
|
3
|
+
// generated catalog facts (`src/catalog/facts.ts`, the efforts table) and
|
|
4
|
+
// the generated classification module (`src/catalog/classification.ts`,
|
|
5
|
+
// the per-model capability flag the docs' RSC records carry). There is no
|
|
6
|
+
// hand-maintained reasoning set: classification is **derived** (ADR-0006) —
|
|
7
|
+
// reasoning-without-efforts = capability flag true AND no efforts entry;
|
|
8
|
+
// isReasoningModel = has an efforts entry OR capability flag true.
|
|
9
|
+
// The only human seam is the classification override map baked into the
|
|
10
|
+
// generated module at refresh time.
|
|
5
11
|
import { MODEL_EFFORTS as GENERATED_MODEL_EFFORTS } from "../catalog/facts.js";
|
|
12
|
+
import { MODEL_REASONING_CAPABILITY } from "../catalog/classification.js";
|
|
6
13
|
/**
|
|
7
14
|
* Models omitted here let Command Code choose their reasoning depth.
|
|
8
15
|
*/
|
|
@@ -14,39 +21,31 @@ import { MODEL_EFFORTS as GENERATED_MODEL_EFFORTS } from "../catalog/facts.js";
|
|
|
14
21
|
// column is constrained to those levels; the release gate catches drift). Do
|
|
15
22
|
// NOT "simplify" this back to a direct re-export — it breaks the build.
|
|
16
23
|
export const MODEL_EFFORTS = GENERATED_MODEL_EFFORTS;
|
|
24
|
+
/**
|
|
25
|
+
* Derives the reasoning-without-efforts set from a capability map and an
|
|
26
|
+
* efforts table: a model is reasoning-capable without explicit efforts
|
|
27
|
+
* when upstream's capability flag is true AND the facts carry no efforts
|
|
28
|
+
* entry for it. Efforts precedence holds by construction — an efforts
|
|
29
|
+
* model never appears in this set, so the "a model is classified exactly
|
|
30
|
+
* once" invariant is true by construction rather than asserted after
|
|
31
|
+
* regeneration (spec #108 / issue #111). Exported for the derivation
|
|
32
|
+
* checks; the runtime consumes the derived REASONING_MODELS below.
|
|
33
|
+
*/
|
|
34
|
+
export function deriveReasoningWithoutEfforts(capability, efforts) {
|
|
35
|
+
return new Set(Object.entries(capability)
|
|
36
|
+
.filter(([id, flag]) => flag === true && efforts[id] === undefined)
|
|
37
|
+
.map(([id]) => id));
|
|
38
|
+
}
|
|
17
39
|
/**
|
|
18
40
|
* Models Command Code advertises as reasoning-capable without exposing
|
|
19
41
|
* explicit effort levels (Command Code chooses the reasoning depth). These
|
|
20
42
|
* advertise `reasoning: true` in opencode but never generate `variants`.
|
|
43
|
+
*
|
|
44
|
+
* Derived from the generated classification module + the generated efforts
|
|
45
|
+
* facts — upstream data is the source of truth, so upstream classification
|
|
46
|
+
* changes land on the next catalog refresh with zero human edits.
|
|
21
47
|
*/
|
|
22
|
-
export const REASONING_MODELS =
|
|
23
|
-
"MiniMaxAI/MiniMax-M3",
|
|
24
|
-
"Qwen/Qwen3.6-Max-Preview",
|
|
25
|
-
"Qwen/Qwen3.6-Plus",
|
|
26
|
-
"Qwen/Qwen3.7-Flash",
|
|
27
|
-
"Qwen/Qwen3.7-Max",
|
|
28
|
-
"Qwen/Qwen3.7-Plus",
|
|
29
|
-
"meta/muse-spark-1.1",
|
|
30
|
-
"meta/muse-spark-1.2",
|
|
31
|
-
"meta/muse-spark-1.2-contributor",
|
|
32
|
-
"minimax/minimax-m3-free",
|
|
33
|
-
"moonshotai/Kimi-K2.7-Code",
|
|
34
|
-
"moonshotai/Kimi-K2.7-Code-Highspeed",
|
|
35
|
-
"moonshotai/Kimi-K3",
|
|
36
|
-
"nvidia/nemotron-3-ultra-550b-a55b",
|
|
37
|
-
"poolside/laguna-s-2.1-free",
|
|
38
|
-
"stepfun/Step-3.7-Flash",
|
|
39
|
-
"tencent/hy3-paid",
|
|
40
|
-
// tencent/hy4-preview is reasoning-capable with explicit efforts
|
|
41
|
-
// (models.md lists `low, medium, high` since command-code@1.38.0,
|
|
42
|
-
// 2026-08-28) — it belongs in MODEL_EFFORTS, not here. Keeping it here
|
|
43
|
-
// would leave a snapshot model classified in both REASONING_MODELS and
|
|
44
|
-
// MODEL_EFFORTS, which breaks the dedicated
|
|
45
|
-
// `tencent/hy4-preview is an efforts model` pin in
|
|
46
|
-
// tests/catalog-metadata.test.ts.
|
|
47
|
-
"thinkingmachines/inkling",
|
|
48
|
-
"thinkingmachines/inkling-small",
|
|
49
|
-
]);
|
|
48
|
+
export const REASONING_MODELS = deriveReasoningWithoutEfforts(MODEL_REASONING_CAPABILITY, GENERATED_MODEL_EFFORTS);
|
|
50
49
|
const PI_THINKING_LEVELS = [
|
|
51
50
|
"off",
|
|
52
51
|
"minimal",
|
|
@@ -75,6 +74,11 @@ export function thinkingMetadataForModel(modelId) {
|
|
|
75
74
|
},
|
|
76
75
|
};
|
|
77
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* A model is reasoning-capable when it has an explicit efforts entry OR
|
|
79
|
+
* upstream's capability flag is true. Derived entirely from the generated
|
|
80
|
+
* catalogs — no hand-maintained set remains.
|
|
81
|
+
*/
|
|
78
82
|
export function isReasoningModel(modelId) {
|
|
79
83
|
return MODEL_EFFORTS[modelId] !== undefined || REASONING_MODELS.has(modelId);
|
|
80
84
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-cmd-provider",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.3",
|
|
4
4
|
"description": "Command Code provider + plugin for opencode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,9 +20,10 @@
|
|
|
20
20
|
"typecheck": "tsc --noEmit",
|
|
21
21
|
"refresh:snapshot": "node scripts/refresh-snapshot.mjs",
|
|
22
22
|
"refresh:deals": "node scripts/refresh-deals.mjs",
|
|
23
|
-
"refresh": "
|
|
23
|
+
"refresh:classification": "node scripts/refresh-classification.mjs",
|
|
24
|
+
"refresh": "npm run refresh:snapshot && npm run refresh:fixtures && npm run refresh:classification -- --fixtures && npm run refresh:deals -- --fixtures",
|
|
24
25
|
"test": "npm run typecheck && npm run test:unit && npm run test:integration && npm run test:contract && npm run format:check",
|
|
25
|
-
"test:unit": "tsx tests/env.test.ts && tsx tests/auth-key.test.ts && tsx tests/converters.test.ts && tsx tests/stream.test.ts && tsx tests/provider-codecs.test.ts && tsx tests/provider-transport.test.ts && tsx tests/provider-parity.test.ts && tsx tests/provider-upgrade-fallback.test.ts && tsx tests/provider-zdr.test.ts && tsx tests/redact.test.ts && tsx tests/cost.test.ts && tsx tests/retry.test.ts && tsx tests/reasoning.test.ts && tsx tests/modalities.test.ts && tsx tests/snapshot.test.ts && tsx tests/refresh-snapshot.test.ts && tsx tests/oauth.test.ts && tsx tests/auth-mirror.test.ts && tsx tests/parse-facts.test.ts && tsx tests/parse-modalities.test.ts && tsx tests/catalog-metadata.test.ts && tsx tests/plugin-models.test.ts && tsx tests/vendor.test.ts && tsx tests/deals-enrichment.test.ts && tsx tests/deals-coverage.test.ts && tsx tests/plan-summary.test.ts && tsx tests/html-tables.test.ts && tsx tests/parse-docs.test.ts && tsx tests/parse-rsc.test.ts && tsx tests/mock-cc-rsc.test.ts && tsx tests/capture-rsc-fixtures.test.ts && tsx tests/refresh-deals.test.ts && tsx tests/refresh-deals-rsc.test.ts && tsx tests/tier-overrides.test.ts && tsx tests/tui-deals-panel.test.ts && tsx tests/diff-catalog.test.ts && tsx tests/catalog-refresh-extract.test.ts && tsx tests/catalog-refresh-push.test.ts && tsx tests/plugin-install.test.ts",
|
|
26
|
+
"test:unit": "tsx tests/env.test.ts && tsx tests/auth-key.test.ts && tsx tests/converters.test.ts && tsx tests/stream.test.ts && tsx tests/provider-codecs.test.ts && tsx tests/provider-transport.test.ts && tsx tests/provider-parity.test.ts && tsx tests/provider-upgrade-fallback.test.ts && tsx tests/provider-zdr.test.ts && tsx tests/redact.test.ts && tsx tests/cost.test.ts && tsx tests/retry.test.ts && tsx tests/reasoning.test.ts && tsx tests/modalities.test.ts && tsx tests/snapshot.test.ts && tsx tests/refresh-snapshot.test.ts && tsx tests/oauth.test.ts && tsx tests/auth-mirror.test.ts && tsx tests/parse-facts.test.ts && tsx tests/parse-modalities.test.ts && tsx tests/catalog-metadata.test.ts && tsx tests/plugin-models.test.ts && tsx tests/vendor.test.ts && tsx tests/deals-enrichment.test.ts && tsx tests/deals-coverage.test.ts && tsx tests/plan-summary.test.ts && tsx tests/html-tables.test.ts && tsx tests/parse-docs.test.ts && tsx tests/parse-rsc.test.ts && tsx tests/rsc-source.test.ts && tsx tests/classification-overrides.test.ts && tsx tests/refresh-classification.test.ts && tsx tests/classification.test.ts && tsx tests/mock-cc-rsc.test.ts && tsx tests/capture-rsc-fixtures.test.ts && tsx tests/refresh-deals.test.ts && tsx tests/refresh-deals-rsc.test.ts && tsx tests/tier-overrides.test.ts && tsx tests/tui-deals-panel.test.ts && tsx tests/diff-catalog.test.ts && tsx tests/catalog-refresh-extract.test.ts && tsx tests/catalog-refresh-drift.test.ts && tsx tests/catalog-refresh-push.test.ts && tsx tests/auto-release.test.ts && tsx tests/replay-verification.test.ts && tsx tests/plugin-install.test.ts",
|
|
26
27
|
"test:integration": "tsx tests/integration-do-stream.test.ts && tsx tests/integration-do-generate.test.ts",
|
|
27
28
|
"test:contract": "tsx tests/contract.test.ts",
|
|
28
29
|
"test:e2e": "node tests/e2e-opencode.mjs",
|