diff --git a/flake.lock b/flake.lock index 33aae38122b..6aaa22e94ea 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1764290847, - "narHash": "sha256-VwPgoDgnd628GdE3KyLqTyPF1WWh0VwT5UoKygoi8sg=", + "lastModified": 1764947035, + "narHash": "sha256-EYHSjVM4Ox4lvCXUMiKKs2vETUSL5mx+J2FfutM7T9w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cd5fedfc384cb98d9fd3827b55f4522f49efda42", + "rev": "a672be65651c80d3f592a89b3945466584a22069", "type": "github" }, "original": { 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/src/index.ts b/packages/plugin/src/index.ts index ab7aac251b3..db1e925d04b 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -13,6 +13,7 @@ import type { import type { BunShell } from "./shell" import { type ToolDefinition } from "./tool" +import { dir } from "console" export * from "./tool" @@ -169,4 +170,10 @@ export interface Hooks { metadata: any }, ) => Promise + "chat.messages.transform"?: ( + input: {}, + output: { + messages: any[] + }, + ) => Promise }