diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 7f0d53448..02012e56f 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - Fixed `deepseek-v4` family models (e.g. `deepseek-v4-flash-0731`) discovered dynamically by `alibaba-token-plan` missing reasoning configuration and the `max` thinking effort. +- Fixed GitHub Copilot dynamic discovery retaining stale bundled prices for default-context models instead of using the provider's reported default-tier prices ([#7471](https://github.com/can1357/oh-my-pi/issues/7471)). ## [17.2.5] - 2026-08-03 diff --git a/packages/catalog/src/provider-models/openai-compat.ts b/packages/catalog/src/provider-models/openai-compat.ts index 585f63dc7..9153c208b 100644 --- a/packages/catalog/src/provider-models/openai-compat.ts +++ b/packages/catalog/src/provider-models/openai-compat.ts @@ -5183,6 +5183,11 @@ export function githubCopilotModelManagerOptions(config?: GithubCopilotModelMana } : {}), }; + const defaultCost = copilotTierCost(tokenPrices.defaultTier); + if (defaultCost) { + // Cache writes are not reported per tier; retain the bundled provider rate. + base.cost = { ...defaultCost, cacheWrite: base.cost.cacheWrite }; + } const variant = createCopilotLongContextVariant( base, contextWindow, diff --git a/packages/catalog/test/github-copilot-model-limits.test.ts b/packages/catalog/test/github-copilot-model-limits.test.ts index 76abb2198..2e9749a66 100644 --- a/packages/catalog/test/github-copilot-model-limits.test.ts +++ b/packages/catalog/test/github-copilot-model-limits.test.ts @@ -545,6 +545,28 @@ describe("github copilot tiered context windows", () => { expect(variant?.cost).toEqual({ input: 4, output: 18, cacheRead: 0.4, cacheWrite: 0 }); }); + it("prices the base model from its default tier", async () => { + const { models } = await discoverCopilotModels({ + data: [ + tieredCopilotEntry({ + id: "gpt-5.6-luna", + name: "GPT-5.6 Luna", + window: 1_050_000, + maxOutput: 50_000, + defaultContextMax: 200_000, + longContextMax: 1_000_000, + defaultPrices: { input: 20, output: 120, cache: 2 }, + longPrices: { input: 40, output: 180, cache: 4 }, + }), + ], + }); + + const base = models.find(candidate => candidate.id === "gpt-5.6-luna"); + expect(base?.cost).toMatchObject({ input: 0.2, output: 1.2, cacheRead: 0.02 }); + const variant = models.find(candidate => candidate.id === "gpt-5.6-luna-1m"); + expect(variant?.cost).toMatchObject({ input: 0.4, output: 1.8, cacheRead: 0.04 }); + }); + it("keeps legacy tier-capped responses unchanged and synthesizes no variant", async () => { const { models } = await discoverCopilotModels({ data: [