diff --git a/bun.lock b/bun.lock index 4f49abe700b..400a9bf8778 100644 --- a/bun.lock +++ b/bun.lock @@ -298,6 +298,7 @@ "version": "1.0.120", "dependencies": { "@opencode-ai/sdk": "workspace:*", + "ai": "catalog:", "zod": "catalog:", }, "devDependencies": { diff --git a/flake.lock b/flake.lock index 33aae38122b..f35c345f0ba 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1764290847, - "narHash": "sha256-VwPgoDgnd628GdE3KyLqTyPF1WWh0VwT5UoKygoi8sg=", + "lastModified": 1764384123, + "narHash": "sha256-UoliURDJFaOolycBZYrjzd9Cc66zULEyHqGFH3QHEq0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cd5fedfc384cb98d9fd3827b55f4522f49efda42", + "rev": "59b6c96beacc898566c9be1052ae806f3835f87d", "type": "github" }, "original": { diff --git a/nix/hashes.json b/nix/hashes.json index 1a2d2158854..331d2d55262 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,3 +1,3 @@ { - "nodeModules": "sha256-4OrnnZy44edgShLMUrYFsO+07gAnL//pGKO/ehWu5P4=" + "nodeModules": "sha256-YQs8rwprLClmuwEkS952jTvC7QCZtAnR9NmI2Azr9jA=" } diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 9152fc99bd8..85a41609df9 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -513,6 +513,33 @@ export namespace SessionPrompt { }) } + // Build messages array for the LLM request + const messages: ModelMessage[] = [ + ...system.map( + (x): ModelMessage => ({ + role: "system", + content: x, + }), + ), + ...MessageV2.toModelMessage( + msgs.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 + }), + ), + ] + + await Plugin.trigger("chat.messages.transform", {}, { messages }) + const result = await processor.process(() => streamText({ onError(error) { @@ -564,29 +591,7 @@ export namespace SessionPrompt { stopWhen: stepCountIs(1), temperature: params.temperature, topP: params.topP, - messages: [ - ...system.map( - (x): ModelMessage => ({ - role: "system", - content: x, - }), - ), - ...MessageV2.toModelMessage( - msgs.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 - }), - ), - ], + messages, tools: model.info.tool_call === false ? undefined : tools, model: wrapLanguageModel({ model: model.language, diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 4efa3f44e33..80888cf6c5c 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -16,6 +16,7 @@ ], "dependencies": { "@opencode-ai/sdk": "workspace:*", + "ai": "catalog:", "zod": "catalog:" }, "devDependencies": { diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index ab7aac251b3..4e769847ac7 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -169,4 +169,10 @@ export interface Hooks { metadata: any }, ) => Promise + "chat.messages.transform"?: ( + input: {}, + output: { + messages: import("ai").ModelMessage[] + }, + ) => Promise }