summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/src/acp/agent.ts54
1 files changed, 46 insertions, 8 deletions
diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts
index bab4d2b82..a161b7908 100644
--- a/packages/opencode/src/acp/agent.ts
+++ b/packages/opencode/src/acp/agent.ts
@@ -34,13 +34,9 @@ import type { OpencodeClient, SessionMessageResponse } from "@opencode-ai/sdk/v2
export namespace ACP {
const log = Log.create({ service: "acp-agent" })
- export async function init({ sdk }: { sdk: OpencodeClient }) {
- const model = await defaultModel({ sdk })
+ export async function init({ sdk: _sdk }: { sdk: OpencodeClient }) {
return {
create: (connection: AgentSideConnection, fullConfig: ACPConfig) => {
- if (!fullConfig.defaultModel) {
- fullConfig.defaultModel = model
- }
return new Agent(connection, fullConfig)
},
}
@@ -988,8 +984,10 @@ export namespace ACP {
const configured = config.defaultModel
if (configured) return configured
- const model = await sdk.config
- .get({ directory: cwd }, { throwOnError: true })
+ const directory = cwd ?? process.cwd()
+
+ const specified = await sdk.config
+ .get({ directory }, { throwOnError: true })
.then((resp) => {
const cfg = resp.data
if (!cfg || !cfg.model) return undefined
@@ -1004,7 +1002,47 @@ export namespace ACP {
return undefined
})
- return model ?? { providerID: "opencode", modelID: "big-pickle" }
+ const providers = await sdk.config
+ .providers({ directory }, { throwOnError: true })
+ .then((x) => x.data?.providers ?? [])
+ .catch((error) => {
+ log.error("failed to list providers for default model", { error })
+ return []
+ })
+
+ if (specified && providers.length) {
+ const provider = providers.find((p) => p.id === specified.providerID)
+ if (provider && provider.models[specified.modelID]) return specified
+ }
+
+ if (specified && !providers.length) return specified
+
+ const opencodeProvider = providers.find((p) => p.id === "opencode")
+ if (opencodeProvider) {
+ if (opencodeProvider.models["big-pickle"]) {
+ return { providerID: "opencode", modelID: "big-pickle" }
+ }
+ const [best] = Provider.sort(Object.values(opencodeProvider.models))
+ if (best) {
+ return {
+ providerID: best.providerID,
+ modelID: best.id,
+ }
+ }
+ }
+
+ const models = providers.flatMap((p) => Object.values(p.models))
+ const [best] = Provider.sort(models)
+ if (best) {
+ return {
+ providerID: best.providerID,
+ modelID: best.id,
+ }
+ }
+
+ if (specified) return specified
+
+ return { providerID: "opencode", modelID: "big-pickle" }
}
function parseUri(