fix(core): use the agent's model when a session has none (#58355)

This commit is contained in:
Aiden Cline
2026-10-23 00:53:53 -05:00
committed by GitHub
Unverified
parent 8ecd6add75
commit 4d30794bcf
+10 -2
View File
@@ -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] })