summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-06-19 12:29:34 -0400
committerDax Raad <[email protected]>2025-06-19 13:00:57 -0400
commit7d1a1663c8342cdcdfccfa78c897b6a42dba06f7 (patch)
tree0640ba0135e68cd3b826b6c91bc98ffbf0fa285c /packages
parent24c0ce6e53d05356c637ac0e6da3b04e344f7f21 (diff)
downloadopencode-7d1a1663c8342cdcdfccfa78c897b6a42dba06f7.tar.gz
opencode-7d1a1663c8342cdcdfccfa78c897b6a42dba06f7.zip
allow selecting model and continuing previous session for opencode run
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/cli/cmd/run.ts34
-rw-r--r--packages/opencode/src/cli/ui.ts4
-rw-r--r--packages/opencode/src/provider/provider.ts15
3 files changed, 48 insertions, 5 deletions
diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts
index ccf4b50c9..092c11345 100644
--- a/packages/opencode/src/cli/cmd/run.ts
+++ b/packages/opencode/src/cli/cmd/run.ts
@@ -33,7 +33,13 @@ export const RunCommand = cmd({
array: true,
default: [],
})
+ .option("continue", {
+ alias: ["c"],
+ describe: "Continue the last session",
+ type: "boolean",
+ })
.option("session", {
+ alias: ["s"],
describe: "Session ID to continue",
type: "string",
})
@@ -41,6 +47,11 @@ export const RunCommand = cmd({
type: "boolean",
describe: "Share the session",
})
+ .option("model", {
+ type: "string",
+ alias: ["m"],
+ describe: "Model to use in the format of provider/model",
+ })
},
handler: async (args) => {
const message = args.message.join(" ")
@@ -50,9 +61,22 @@ export const RunCommand = cmd({
},
async () => {
await Share.init()
- const session = args.session
- ? await Session.get(args.session)
- : await Session.create()
+ const session = await (async () => {
+ if (args.continue) {
+ const first = await Session.list().next()
+ if (first.done) return
+ return first.value
+ }
+
+ if (args.session) return Session.get(args.session)
+
+ return Session.create()
+ })()
+
+ if (!session) {
+ UI.error("Session not found")
+ return
+ }
UI.empty()
UI.println(UI.logo())
@@ -71,7 +95,9 @@ export const RunCommand = cmd({
}
UI.empty()
- const { providerID, modelID } = await Provider.defaultModel()
+ const { providerID, modelID } = args.model
+ ? Provider.parseModel(args.model)
+ : await Provider.defaultModel()
UI.println(
UI.Style.TEXT_NORMAL_BOLD + "@ ",
UI.Style.TEXT_NORMAL + `${providerID}/${modelID}`,
diff --git a/packages/opencode/src/cli/ui.ts b/packages/opencode/src/cli/ui.ts
index f449a31a4..cc4a7453f 100644
--- a/packages/opencode/src/cli/ui.ts
+++ b/packages/opencode/src/cli/ui.ts
@@ -71,4 +71,8 @@ export namespace UI {
})
})
}
+
+ export function error(message: string) {
+ println(Style.TEXT_DANGER_BOLD + "Error: " + Style.TEXT_NORMAL + message)
+ }
}
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index 2c0aa2470..37eb7841e 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -272,9 +272,14 @@ export namespace Provider {
export async function defaultModel() {
const cfg = await Config.get()
+ if (cfg.model) return parseModel(cfg.model)
const provider = await list()
.then((val) => Object.values(val))
- .then((x) => x.find((p) => !cfg.provider || Object.keys(cfg.provider).includes(p.info.id)))
+ .then((x) =>
+ x.find(
+ (p) => !cfg.provider || Object.keys(cfg.provider).includes(p.info.id),
+ ),
+ )
if (!provider) throw new Error("no providers found")
const [model] = sort(Object.values(provider.info.models))
if (!model) throw new Error("no models found")
@@ -284,6 +289,14 @@ export namespace Provider {
}
}
+ export function parseModel(model: string) {
+ const [providerID, ...rest] = model.split("/")
+ return {
+ providerID: providerID,
+ modelID: rest.join("/"),
+ }
+ }
+
const TOOLS = [
BashTool,
EditTool,