Merge agent and mode into one (#1689)

The concept of mode has been deprecated, there is now only the agent field in the config.

An agent can be cycled through as your primary agent with <tab> or you can spawn a subagent by @ mentioning it. if you include a description of when to use it, the primary agent will try to automatically use it

Full docs here: https://opencode.ai/docs/agents/
This commit is contained in:
Dax
2025-08-07 16:32:12 -04:00
committed by GitHub
parent 12f1ad521f
commit c34aec060f
42 changed files with 1755 additions and 930 deletions

View File

@@ -641,7 +641,7 @@ export const GithubRunCommand = cmd({
messageID: Identifier.ascending("message"),
providerID,
modelID,
mode: "build",
agent: "build",
parts: [
{
id: Identifier.ascending("part"),

View File

@@ -8,8 +8,8 @@ import { Flag } from "../../flag/flag"
import { Config } from "../../config/config"
import { bootstrap } from "../bootstrap"
import { MessageV2 } from "../../session/message-v2"
import { Mode } from "../../session/mode"
import { Identifier } from "../../id/id"
import { Agent } from "../../agent/agent"
const TOOL: Record<string, [string, string]> = {
todowrite: ["Todo", UI.Style.TEXT_WARNING_BOLD],
@@ -54,9 +54,9 @@ export const RunCommand = cmd({
alias: ["m"],
describe: "model to use in the format of provider/model",
})
.option("mode", {
.option("agent", {
type: "string",
describe: "mode to use",
describe: "agent to use",
})
},
handler: async (args) => {
@@ -103,8 +103,19 @@ export const RunCommand = cmd({
}
UI.empty()
const mode = args.mode ? await Mode.get(args.mode) : await Mode.list().then((x) => x[0])
const { providerID, modelID } = args.model ? Provider.parseModel(args.model) : mode.model ?? await Provider.defaultModel()
const agent = await (async () => {
if (args.agent) return Agent.get(args.agent)
const build = Agent.get("build")
if (build) return build
return Agent.list().then((x) => x[0])
})()
const { providerID, modelID } = await (() => {
if (args.model) return Provider.parseModel(args.model)
if (agent.model) return agent.model
return Provider.defaultModel()
})()
UI.println(UI.Style.TEXT_NORMAL_BOLD + "@ ", UI.Style.TEXT_NORMAL + `${providerID}/${modelID}`)
UI.empty()
@@ -157,14 +168,17 @@ export const RunCommand = cmd({
UI.error(err)
})
const messageID = Identifier.ascending("message")
const result = await Session.chat({
sessionID: session.id,
messageID,
providerID,
modelID,
mode: mode.name,
...(agent.model
? agent.model
: {
providerID,
modelID,
}),
agent: agent.name,
parts: [
{
id: Identifier.ascending("part"),

View File

@@ -11,8 +11,8 @@ import { Config } from "../../config/config"
import { Bus } from "../../bus"
import { Log } from "../../util/log"
import { FileWatcher } from "../../file/watch"
import { Mode } from "../../session/mode"
import { Ide } from "../../ide"
import { Agent } from "../../agent/agent"
declare global {
const OPENCODE_TUI_PATH: string
@@ -115,7 +115,7 @@ export const TuiCommand = cmd({
CGO_ENABLED: "0",
OPENCODE_SERVER: server.url.toString(),
OPENCODE_APP_INFO: JSON.stringify(app),
OPENCODE_MODES: JSON.stringify(await Mode.list()),
OPENCODE_AGENTS: JSON.stringify(await Agent.list()),
},
onExit: () => {
server.stop()