feat(pricing): refresh catalog pricing snapshot
Add the free minimax/minimax-m3-free and minimax/minimax-m2.7-free promotional variants (free through September 5, 2026) and tencent/hy4-preview, drop the retired stealth/ox-alpha, and refresh the model-id and pricing snapshots to the current 62-model catalog verified on 2026-08-28.
This commit is contained in:
+9
-2
@@ -20,7 +20,7 @@ export interface TemporaryPricing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const PRICING_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits"
|
export const PRICING_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits"
|
||||||
export const PRICING_LAST_VERIFIED = "2026-08-25"
|
export const PRICING_LAST_VERIFIED = "2026-08-28"
|
||||||
|
|
||||||
export const ZERO_MODEL_COST: CommandCodeModelCost = {
|
export const ZERO_MODEL_COST: CommandCodeModelCost = {
|
||||||
input: 0,
|
input: 0,
|
||||||
@@ -40,10 +40,12 @@ export const ZERO_MODEL_COST: CommandCodeModelCost = {
|
|||||||
export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
|
export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
|
||||||
// Free models
|
// Free models
|
||||||
"poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
"poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
||||||
"stealth/ox-alpha": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
"minimax/minimax-m3-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
||||||
|
"minimax/minimax-m2.7-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
||||||
|
|
||||||
// Open and open-weight models
|
// Open and open-weight models
|
||||||
"tencent/hy3-paid": { input: 0.14, output: 0.58, cacheRead: 0.035, cacheWrite: 0 },
|
"tencent/hy3-paid": { input: 0.14, output: 0.58, cacheRead: 0.035, cacheWrite: 0 },
|
||||||
|
"tencent/hy4-preview": { input: 0.834, output: 2.501, cacheRead: 0.042, cacheWrite: 0 },
|
||||||
"moonshotai/Kimi-K3": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 0 },
|
"moonshotai/Kimi-K3": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 0 },
|
||||||
"moonshotai/Kimi-K2.7-Code": { input: 0.95, output: 4, cacheRead: 0.19, cacheWrite: 0 },
|
"moonshotai/Kimi-K2.7-Code": { input: 0.95, output: 4, cacheRead: 0.19, cacheWrite: 0 },
|
||||||
"moonshotai/Kimi-K2.7-Code-Highspeed": {
|
"moonshotai/Kimi-K2.7-Code-Highspeed": {
|
||||||
@@ -233,4 +235,9 @@ export const TEMPORARY_PRICING: readonly TemporaryPricing[] = [
|
|||||||
expiresOn: "2026-12-31",
|
expiresOn: "2026-12-31",
|
||||||
description: "50% promotional pricing",
|
description: "50% promotional pricing",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
models: ["minimax/minimax-m3-free", "minimax/minimax-m2.7-free"],
|
||||||
|
expiresOn: "2026-09-05",
|
||||||
|
description: "free promotional pricing",
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
+4
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"fetchedAt": "2026-08-25T13:32:11.631Z",
|
"fetchedAt": "2026-08-28T09:27:52.554Z",
|
||||||
"source": "https://api.commandcode.ai/provider/v1/models",
|
"source": "https://api.commandcode.ai/provider/v1/models",
|
||||||
"modelIds": [
|
"modelIds": [
|
||||||
"claude-sonnet-5",
|
"claude-sonnet-5",
|
||||||
@@ -32,6 +32,8 @@
|
|||||||
"zai-org/GLM-5",
|
"zai-org/GLM-5",
|
||||||
"MiniMaxAI/MiniMax-M3",
|
"MiniMaxAI/MiniMax-M3",
|
||||||
"MiniMaxAI/MiniMax-M2.7",
|
"MiniMaxAI/MiniMax-M2.7",
|
||||||
|
"minimax/minimax-m3-free",
|
||||||
|
"minimax/minimax-m2.7-free",
|
||||||
"MiniMaxAI/MiniMax-M2.5",
|
"MiniMaxAI/MiniMax-M2.5",
|
||||||
"xiaomi/mimo-v2.5-pro",
|
"xiaomi/mimo-v2.5-pro",
|
||||||
"xiaomi/mimo-v2.5",
|
"xiaomi/mimo-v2.5",
|
||||||
@@ -46,6 +48,7 @@
|
|||||||
"stepfun/Step-3.7-Flash",
|
"stepfun/Step-3.7-Flash",
|
||||||
"stepfun/Step-3.5-Flash",
|
"stepfun/Step-3.5-Flash",
|
||||||
"tencent/hy3-paid",
|
"tencent/hy3-paid",
|
||||||
|
"tencent/hy4-preview",
|
||||||
"google/gemini-3.7-flash",
|
"google/gemini-3.7-flash",
|
||||||
"google/gemini-3.6-flash",
|
"google/gemini-3.6-flash",
|
||||||
"google/gemini-3.5-flash",
|
"google/gemini-3.5-flash",
|
||||||
@@ -55,7 +58,6 @@
|
|||||||
"nvidia/nemotron-3-ultra-550b-a55b",
|
"nvidia/nemotron-3-ultra-550b-a55b",
|
||||||
"thinkingmachines/inkling",
|
"thinkingmachines/inkling",
|
||||||
"thinkingmachines/inkling-small",
|
"thinkingmachines/inkling-small",
|
||||||
"stealth/ox-alpha",
|
|
||||||
"poolside/laguna-s-2.1-free",
|
"poolside/laguna-s-2.1-free",
|
||||||
"meta/muse-spark-1.1",
|
"meta/muse-spark-1.1",
|
||||||
"meta/muse-spark-1.2",
|
"meta/muse-spark-1.2",
|
||||||
|
|||||||
+4
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"verifiedAt": "2026-08-25",
|
"verifiedAt": "2026-08-28",
|
||||||
"source": "https://commandcode.ai/docs/resources/pricing-limits",
|
"source": "https://commandcode.ai/docs/resources/pricing-limits",
|
||||||
"tierPolicy": "Use request-wide input tiers; the highest threshold exceeded by input plus cache tokens applies to the full request.",
|
"tierPolicy": "Use request-wide input tiers; the highest threshold exceeded by input plus cache tokens applies to the full request.",
|
||||||
"tiers": {
|
"tiers": {
|
||||||
@@ -40,12 +40,14 @@
|
|||||||
"Qwen/Qwen3.6-Plus": [0.5, 3, 0.1, 0],
|
"Qwen/Qwen3.6-Plus": [0.5, 3, 0.1, 0],
|
||||||
"stepfun/Step-3.7-Flash": [0.2, 1.15, 0.04, 0],
|
"stepfun/Step-3.7-Flash": [0.2, 1.15, 0.04, 0],
|
||||||
"stepfun/Step-3.5-Flash": [0.1, 0.3, 0.02, 0],
|
"stepfun/Step-3.5-Flash": [0.1, 0.3, 0.02, 0],
|
||||||
|
"minimax/minimax-m3-free": [0, 0, 0, 0],
|
||||||
|
"minimax/minimax-m2.7-free": [0, 0, 0, 0],
|
||||||
"tencent/hy3-paid": [0.14, 0.58, 0.035, 0],
|
"tencent/hy3-paid": [0.14, 0.58, 0.035, 0],
|
||||||
|
"tencent/hy4-preview": [0.834, 2.501, 0.042, 0],
|
||||||
"nvidia/nemotron-3-ultra-550b-a55b": [0.6, 2.4, 0.12, 0],
|
"nvidia/nemotron-3-ultra-550b-a55b": [0.6, 2.4, 0.12, 0],
|
||||||
"thinkingmachines/inkling": [1, 4.05, 0.17, 0],
|
"thinkingmachines/inkling": [1, 4.05, 0.17, 0],
|
||||||
"thinkingmachines/inkling-small": [0.5, 1.2, 0.1, 0],
|
"thinkingmachines/inkling-small": [0.5, 1.2, 0.1, 0],
|
||||||
"poolside/laguna-s-2.1-free": [0, 0, 0, 0],
|
"poolside/laguna-s-2.1-free": [0, 0, 0, 0],
|
||||||
"stealth/ox-alpha": [0, 0, 0, 0],
|
|
||||||
"claude-sonnet-5": [2, 10, 0.2, 2.5],
|
"claude-sonnet-5": [2, 10, 0.2, 2.5],
|
||||||
"claude-sonnet-4-6": [3, 15, 0.3, 3.75],
|
"claude-sonnet-4-6": [3, 15, 0.3, 3.75],
|
||||||
"claude-fable-5": [10, 50, 1, 12.5],
|
"claude-fable-5": [10, 50, 1, 12.5],
|
||||||
|
|||||||
+13
-3
@@ -27,7 +27,11 @@ const fixtureUrl = new URL("./fixtures/commandcode-model-ids.json", import.meta.
|
|||||||
const fixture = JSON.parse(await readFile(fixtureUrl, "utf-8")) as ModelCatalogSnapshot
|
const fixture = JSON.parse(await readFile(fixtureUrl, "utf-8")) as ModelCatalogSnapshot
|
||||||
const pricingFixtureUrl = new URL("./fixtures/commandcode-pricing.json", import.meta.url)
|
const pricingFixtureUrl = new URL("./fixtures/commandcode-pricing.json", import.meta.url)
|
||||||
const pricingFixture = JSON.parse(await readFile(pricingFixtureUrl, "utf-8")) as PricingSnapshot
|
const pricingFixture = JSON.parse(await readFile(pricingFixtureUrl, "utf-8")) as PricingSnapshot
|
||||||
const freeModels = new Set(["poolside/laguna-s-2.1-free", "stealth/ox-alpha"])
|
const freeModels = new Set([
|
||||||
|
"poolside/laguna-s-2.1-free",
|
||||||
|
"minimax/minimax-m3-free",
|
||||||
|
"minimax/minimax-m2.7-free",
|
||||||
|
])
|
||||||
|
|
||||||
function assertCost(
|
function assertCost(
|
||||||
modelId: string,
|
modelId: string,
|
||||||
@@ -50,7 +54,7 @@ function assertCost(
|
|||||||
describe("MODEL_COSTS pricing overlay", () => {
|
describe("MODEL_COSTS pricing overlay", () => {
|
||||||
it("covers the current Command Code model catalog snapshot", () => {
|
it("covers the current Command Code model catalog snapshot", () => {
|
||||||
assert.equal(fixture.source, "https://api.commandcode.ai/provider/v1/models")
|
assert.equal(fixture.source, "https://api.commandcode.ai/provider/v1/models")
|
||||||
assert.match(fixture.fetchedAt, /^2026-08-25T/)
|
assert.match(fixture.fetchedAt, /^2026-08-28T/)
|
||||||
|
|
||||||
const catalogIds = [...fixture.modelIds].sort()
|
const catalogIds = [...fixture.modelIds].sort()
|
||||||
const pricedIds = Object.keys(MODEL_COSTS).sort()
|
const pricedIds = Object.keys(MODEL_COSTS).sort()
|
||||||
@@ -156,6 +160,12 @@ describe("MODEL_COSTS pricing overlay", () => {
|
|||||||
cacheRead: 0.03,
|
cacheRead: 0.03,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
})
|
})
|
||||||
|
assertCost("tencent/hy4-preview", {
|
||||||
|
input: 0.834,
|
||||||
|
output: 2.501,
|
||||||
|
cacheRead: 0.042,
|
||||||
|
cacheWrite: 0,
|
||||||
|
})
|
||||||
assertCost("google/gemini-3.7-flash", {
|
assertCost("google/gemini-3.7-flash", {
|
||||||
input: 0.75,
|
input: 0.75,
|
||||||
output: 3.75,
|
output: 3.75,
|
||||||
@@ -208,7 +218,7 @@ describe("MODEL_COSTS pricing overlay", () => {
|
|||||||
|
|
||||||
it("tracks pricing provenance", () => {
|
it("tracks pricing provenance", () => {
|
||||||
assert.equal(PRICING_SOURCE_URL, "https://commandcode.ai/docs/resources/pricing-limits")
|
assert.equal(PRICING_SOURCE_URL, "https://commandcode.ai/docs/resources/pricing-limits")
|
||||||
assert.equal(PRICING_LAST_VERIFIED, "2026-08-25")
|
assert.equal(PRICING_LAST_VERIFIED, "2026-08-28")
|
||||||
})
|
})
|
||||||
|
|
||||||
it("fails once temporary pricing needs review", () => {
|
it("fails once temporary pricing needs review", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user