summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-11-18 13:09:50 -0500
committerDax Raad <[email protected]>2025-11-18 13:10:00 -0500
commit759635eefa994727b5b1af3e6fda74c17df96569 (patch)
tree5a7cc1a8f918fd0a6f4c6ab5197983603e308b24
parenta9981441ae79015816c2238cf1f8e410b7e6670b (diff)
downloadopencode-759635eefa994727b5b1af3e6fda74c17df96569.tar.gz
opencode-759635eefa994727b5b1af3e6fda74c17df96569.zip
fix gpt compaction issue
-rw-r--r--packages/opencode/src/cli/cmd/tui/thread.ts9
-rw-r--r--packages/opencode/src/session/compaction.ts44
-rw-r--r--packages/opencode/src/session/prompt.ts3
3 files changed, 48 insertions, 8 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/thread.ts b/packages/opencode/src/cli/cmd/tui/thread.ts
index bd9b9dbab..43ce08534 100644
--- a/packages/opencode/src/cli/cmd/tui/thread.ts
+++ b/packages/opencode/src/cli/cmd/tui/thread.ts
@@ -5,6 +5,7 @@ import { type rpc } from "./worker"
import path from "path"
import { UI } from "@/cli/ui"
import { iife } from "@/util/iife"
+import { Log } from "@/util/log"
declare global {
const OPENCODE_WORKER_PATH: string
@@ -79,13 +80,15 @@ export const TuiThreadCommand = cmd({
Object.entries(process.env).filter((entry): entry is [string, string] => entry[1] !== undefined),
),
})
- worker.onerror = console.error
+ worker.onerror = (e) => {
+ Log.Default.error(e)
+ }
const client = Rpc.client<typeof rpc>(worker)
process.on("uncaughtException", (e) => {
- console.error(e)
+ Log.Default.error(e)
})
process.on("unhandledRejection", (e) => {
- console.error(e)
+ Log.Default.error(e)
})
const server = await client.call("server", {
port: args.port,
diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts
index 0bb949ba9..6bad9bbad 100644
--- a/packages/opencode/src/session/compaction.ts
+++ b/packages/opencode/src/session/compaction.ts
@@ -1,4 +1,4 @@
-import { streamText, type ModelMessage } from "ai"
+import { streamText, wrapLanguageModel, type ModelMessage } from "ai"
import { Session } from "."
import { Identifier } from "../id/id"
import { Instance } from "../project/instance"
@@ -129,10 +129,17 @@ export namespace SessionCompaction {
})
const result = await processor.process(() =>
streamText({
+ onError(error) {
+ log.error("stream error", {
+ error,
+ })
+ },
// set to 0, we handle loop
maxRetries: 0,
- model: model.language,
- providerOptions: ProviderTransform.providerOptions(model.npm, model.providerID, model.info.options),
+ providerOptions: ProviderTransform.providerOptions(model.npm, model.providerID, {
+ ...ProviderTransform.options(model.providerID, model.modelID, model.npm ?? "", input.sessionID),
+ ...model.info.options,
+ }),
headers: model.info.headers,
abortSignal: input.abort,
tools: model.info.tool_call ? {} : undefined,
@@ -143,7 +150,21 @@ export namespace SessionCompaction {
content: x,
}),
),
- ...MessageV2.toModelMessage(input.messages),
+ ...MessageV2.toModelMessage(
+ input.messages.filter((m) => {
+ if (m.info.role !== "assistant" || m.info.error === undefined) {
+ return true
+ }
+ if (
+ MessageV2.AbortedError.isInstance(m.info.error) &&
+ m.parts.some((part) => part.type !== "step-start" && part.type !== "reasoning")
+ ) {
+ return true
+ }
+
+ return false
+ }),
+ ),
{
role: "user",
content: [
@@ -154,6 +175,20 @@ export namespace SessionCompaction {
],
},
],
+ model: wrapLanguageModel({
+ model: model.language,
+ middleware: [
+ {
+ async transformParams(args) {
+ if (args.type === "stream") {
+ // @ts-expect-error
+ args.params.prompt = ProviderTransform.message(args.params.prompt, model.providerID, model.modelID)
+ }
+ return args.params
+ },
+ },
+ ],
+ }),
}),
)
if (result === "continue") {
@@ -180,6 +215,7 @@ export namespace SessionCompaction {
},
})
}
+ if (processor.message.error) return "stop"
return "continue"
}
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 6b77feb37..0f9d4a50b 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -390,7 +390,7 @@ export namespace SessionPrompt {
// pending compaction
if (task?.type === "compaction") {
- await SessionCompaction.process({
+ const result = await SessionCompaction.process({
messages: msgs,
parentID: lastUser.id,
abort,
@@ -400,6 +400,7 @@ export namespace SessionPrompt {
},
sessionID,
})
+ if (result === "stop") break
continue
}