diff --git a/packages/core/src/session/runner/model.ts b/packages/core/src/session/runner/model.ts index 79c8bcc4dd1..a87aaed1ba1 100644 --- a/packages/core/src/session/runner/model.ts +++ b/packages/core/src/session/runner/model.ts @@ -5,6 +5,7 @@ import { LanguageModel } from "@opencode/ai" import { Model } from "@opencode/schema/model" import { Provider } from "@opencode/schema/provider" import { Context, Effect, Layer, Schema } from "effect" +import { Agent } from "../../agent.js" import { ModelResolver } from "../../model-resolver.js" import { SessionSchema } from "../schema.js" @@ -71,11 +72,18 @@ const layer = Layer.effect( Service, Effect.gen(function* () { const resolver = yield* ModelResolver.Service + const agents = yield* Agent.Service return Service.of({ resolve: Effect.fn("SessionRunnerModel.resolve")(function* (session, available) { // Location plugins populate and filter the catalog asynchronously during layer startup. if (!session.model) { - const resolved = yield* resolver.resolve() + const agent = (yield* agents.select(session.agent)).info?.model + const preferred = + agent && + (yield* available()).find((model) => model.providerID === agent.providerID && model.id === agent.id) + const resolved = preferred + ? yield* resolver.resolveModel(preferred, agent.variant) + : yield* resolver.resolve() if (resolved) return resolved return yield* new ModelNotSelectedError({ sessionID: session.id }) } @@ -93,4 +101,4 @@ const layer = Layer.effect( }), ) -export const node = makeLocationNode({ service: Service, layer, deps: [ModelResolver.node] }) +export const node = makeLocationNode({ service: Service, layer, deps: [ModelResolver.node, Agent.node] })