From c5e096c76a1435473667c4a2e99dc5c10b8fd6cb Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Tue, 11 Nov 2025 13:58:14 -0800 Subject: [PATCH] fix: costs being 0 when using custom model id overrides (#4219) --- packages/opencode/src/cli/cmd/models.ts | 46 +++++++++++++++++++--- packages/opencode/src/provider/provider.ts | 2 +- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/packages/opencode/src/cli/cmd/models.ts b/packages/opencode/src/cli/cmd/models.ts index 268ed5ff..f7da2462 100644 --- a/packages/opencode/src/cli/cmd/models.ts +++ b/packages/opencode/src/cli/cmd/models.ts @@ -1,21 +1,57 @@ +import type { Argv } from "yargs" import { Instance } from "../../project/instance" import { Provider } from "../../provider/provider" import { cmd } from "./cmd" +import { UI } from "../ui" +import { EOL } from "os" export const ModelsCommand = cmd({ - command: "models", + command: "models [provider]", describe: "list all available models", - handler: async () => { + builder: (yargs: Argv) => { + return yargs + .positional("provider", { + describe: "provider ID to filter models by", + type: "string", + array: false, + }) + .option("verbose", { + describe: "use more verbose model output (includes metadata like costs)", + type: "boolean", + }) + }, + handler: async (args) => { await Instance.provide({ directory: process.cwd(), async fn() { const providers = await Provider.list() - for (const [providerID, provider] of Object.entries(providers)) { - for (const modelID of Object.keys(provider.info.models)) { - console.log(`${providerID}/${modelID}`) + function printModels(providerID: string, verbose?: boolean) { + const provider = providers[providerID] + for (const [modelID, model] of Object.entries(provider.info.models)) { + process.stdout.write(`${providerID}/${modelID}`) + process.stdout.write(EOL) + if (verbose) { + process.stdout.write(JSON.stringify(model, null, 2)) + process.stdout.write(EOL) + } } } + + if (args.provider) { + const provider = providers[args.provider] + if (!provider) { + UI.error(`Provider not found: ${args.provider}`) + return + } + + printModels(args.provider, args.verbose) + return + } + + for (const providerID of Object.keys(providers)) { + printModels(providerID, args.verbose) + } }, }) }, diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index ed0c1dac..e30576bf 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -289,7 +289,7 @@ export namespace Provider { } for (const [modelID, model] of Object.entries(provider.models ?? {})) { - const existing = parsed.models[modelID] + const existing = parsed.models[model.id ?? modelID] const parsedModel: ModelsDev.Model = { id: modelID, name: model.name ?? existing?.name ?? modelID,