From 30d140008fcd05489885c51b1fdc7a241ab0edce Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 6 Aug 2026 01:10:34 -0400 Subject: [PATCH] feat(cli): add models command --- packages/cli/src/commands/commands.ts | 4 +++ packages/cli/src/commands/handlers/models.ts | 26 ++++++++++++++++++++ packages/cli/src/index.ts | 1 + 3 files changed, 31 insertions(+) create mode 100644 packages/cli/src/commands/handlers/models.ts diff --git a/packages/cli/src/commands/commands.ts b/packages/cli/src/commands/commands.ts index 140a213b2e4..c5ecca6fc53 100644 --- a/packages/cli/src/commands/commands.ts +++ b/packages/cli/src/commands/commands.ts @@ -133,6 +133,10 @@ export const Commands = Spec.make(typeof OPENCODE_CLI_NAME === "string" ? OPENCO description: "Manage plugins", commands: [Spec.make("list", { description: "List active plugins" })], }), + Spec.make("models", { + description: "List all available models", + params: ServerParams, + }), Spec.make("mini", { description: "Start the minimal interactive interface", params: { diff --git a/packages/cli/src/commands/handlers/models.ts b/packages/cli/src/commands/handlers/models.ts new file mode 100644 index 00000000000..9b23c6d0c36 --- /dev/null +++ b/packages/cli/src/commands/handlers/models.ts @@ -0,0 +1,26 @@ +import { OpenCode } from "@opencode-ai/client" +import { Service } from "@opencode-ai/client/effect/service" +import { Effect, Option } from "effect" +import { EOL } from "node:os" +import { Commands } from "../commands" +import { Runtime } from "../../framework/runtime" +import { ServerConnection } from "../../services/server-connection" + +export default Runtime.handler( + Commands.commands.models, + Effect.fn("cli.models")(function* (input) { + const server = yield* ServerConnection.resolve({ + server: Option.getOrUndefined(input.server), + standalone: input.standalone, + }) + const client = OpenCode.make({ + baseUrl: server.endpoint.url, + headers: Service.headers(server.endpoint), + }) + const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } })) + const models = response.data + .map((model) => `${model.providerID}/${model.id}`) + .toSorted((a, b) => a.localeCompare(b)) + if (models.length > 0) process.stdout.write(models.join(EOL) + EOL) + }), +) diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index fc011e14ac5..38c837b1bf6 100755 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -35,6 +35,7 @@ const Handlers = Runtime.handlers(Commands, { plugin: { list: () => import("./commands/handlers/plugin/list"), }, + models: () => import("./commands/handlers/models"), mini: () => import("./commands/handlers/mini"), run: () => import("./commands/handlers/run"), pair: () => import("./commands/handlers/pair"),