refactor(session): simplify model preparation (#43966)

This commit is contained in:
Kit Langton
2026-08-21 15:21:04 -04:00
committed by GitHub
parent 9a4bd2ba16
commit 79d5436d2a
4 changed files with 50 additions and 11 deletions
+1 -4
View File
@@ -354,10 +354,7 @@ export const layer = Layer.effect(
: undefined
const options: StreamOptions = {
...(http ? { http } : {}),
...(input.webSocket === "session" &&
webSocket &&
!hasHttpHooks &&
resolved.capabilities.responsesWebsockets === true
...(input.webSocket === "session" && webSocket && !hasHttpHooks
? { webSocket: transport.bind(session.id) }
: {}),
}
@@ -181,7 +181,7 @@ const assistant = (message: SessionMessage.Assistant, model: Model.Ref, provider
item,
reuseToolProviderMetadata
? providerMetadata(providerMetadataKey, item.providerResultState ?? item.providerState)
: sameProvider && item.executed === true && item.providerResultState !== undefined
: sameProvider && item.providerResultState !== undefined
? providerMetadata(providerMetadataKey, item.providerResultState)
: undefined,
)
+7 -4
View File
@@ -78,7 +78,7 @@ const attempt = Effect.fn("SessionTitle.attempt")(function* (
},
contextHooks: false,
})
const streamed = yield* dependencies.llm.stream(prepared.request, prepared.options).pipe(
yield* dependencies.llm.stream(prepared.request, prepared.options).pipe(
Stream.runForEach((event) => {
if (LLMEvent.is.providerError(event)) failed = true
if (LLMEvent.is.textDelta(event)) chunks.push(event.text)
@@ -88,12 +88,15 @@ const attempt = Effect.fn("SessionTitle.attempt")(function* (
}
return Effect.void
}),
Effect.as(true),
Effect.catchTag("AI.Error", () => Effect.succeed(false)),
Effect.catchTag("AI.Error", () =>
Effect.sync(() => {
failed = true
}),
),
Effect.onInterrupt(() => recordUsage.pipe(Effect.asVoid)),
)
yield* recordUsage
if (!streamed || failed) return
if (failed) return
return chunks
.join("")
.split("\n")
+41 -2
View File
@@ -1,5 +1,13 @@
import { beforeEach, expect } from "bun:test"
import { LLMClient, LLMEvent, LanguageModel, SystemPart, type LLMRequest } from "@opencode-ai/ai"
import {
AIError,
LLMClient,
LLMEvent,
LanguageModel,
SystemPart,
TransportReason,
type LLMRequest,
} from "@opencode-ai/ai"
import { OpenAIChat } from "@opencode-ai/ai/protocols"
import { Agent } from "@opencode-ai/core/agent"
import { Catalog } from "@opencode-ai/core/catalog"
@@ -69,7 +77,7 @@ const successfulTitle = () =>
reason: { normalized: "stop" },
}),
)
let titleStream: () => Stream.Stream<LLMEvent> = successfulTitle
let titleStream: () => Stream.Stream<LLMEvent, AIError> = successfulTitle
const client = Layer.mock(LLMClient.Service)({
stream: (request: LLMRequest) => {
requests.push(request)
@@ -460,6 +468,37 @@ it.effect("retries after a failed title request", () =>
}),
)
it.effect("does not rename after a failed title stream", () =>
Effect.gen(function* () {
const agentService = yield* Agent.Service
yield* agentService.transform((editor) => {
editor.update(Agent.ID.make("title"), (agent) => {
agent.mode = "primary"
agent.hidden = true
agent.system = "You are a title generator."
})
})
const sessionID = Session.ID.make("ses_title_stream_failure")
yield* insertSession(sessionID)
yield* prompt(sessionID, "Fail this title stream")
titleStream = () =>
Stream.fail(
new AIError({
module: "test",
method: "stream",
reason: new TransportReason({ message: "Disconnected", transport: "http", operation: "request" }),
}),
)
const title = yield* SessionTitle.Service
yield* title.generateForFirstPrompt(sessionID)
const store = yield* SessionStore.Service
expect(requests).toHaveLength(1)
expect((yield* store.get(sessionID))?.title).toBeUndefined()
}),
)
it.effect("keeps session context hooks away from title requests", () =>
Effect.gen(function* () {
requests = []