Revert "fix: ensure that tool attachments arent sent as user messages (#8944)"

This reverts commit 8fd1b92e6e.
This commit is contained in:
Aiden Cline
2026-01-16 15:49:39 -06:00
parent 6e00348bd7
commit f5a6a4af7f
3 changed files with 43 additions and 89 deletions

View File

@@ -1,14 +1,7 @@
import { BusEvent } from "@/bus/bus-event"
import z from "zod"
import { NamedError } from "@opencode-ai/util/error"
import {
APICallError,
convertToModelMessages,
LoadAPIKeyError,
type ModelMessage,
type ToolSet,
type UIMessage,
} from "ai"
import { APICallError, convertToModelMessages, LoadAPIKeyError, type ModelMessage, type UIMessage } from "ai"
import { Identifier } from "../id/id"
import { LSP } from "../lsp"
import { Snapshot } from "@/snapshot"
@@ -439,7 +432,7 @@ export namespace MessageV2 {
})
export type WithParts = z.infer<typeof WithParts>
export function toModelMessage(input: WithParts[], options?: { tools?: ToolSet }): ModelMessage[] {
export function toModelMessage(input: WithParts[]): ModelMessage[] {
const result: UIMessage[] = []
for (const msg of input) {
@@ -510,14 +503,30 @@ export namespace MessageV2 {
})
if (part.type === "tool") {
if (part.state.status === "completed") {
if (part.state.attachments?.length) {
result.push({
id: Identifier.ascending("message"),
role: "user",
parts: [
{
type: "text",
text: `Tool ${part.tool} returned an attachment:`,
},
...part.state.attachments.map((attachment) => ({
type: "file" as const,
url: attachment.url,
mediaType: attachment.mime,
filename: attachment.filename,
})),
],
})
}
assistantMessage.parts.push({
type: ("tool-" + part.tool) as `tool-${string}`,
state: "output-available",
toolCallId: part.callID,
input: part.state.input,
output: part.state.time.compacted
? { output: "[Old tool result content cleared]" }
: { output: part.state.output, attachments: part.state.attachments },
output: part.state.time.compacted ? "[Old tool result content cleared]" : part.state.output,
callProviderMetadata: part.metadata,
})
}
@@ -556,10 +565,7 @@ export namespace MessageV2 {
}
}
return convertToModelMessages(
result.filter((msg) => msg.parts.some((part) => part.type !== "step-start")),
{ tools: options?.tools },
)
return convertToModelMessages(result.filter((msg) => msg.parts.some((part) => part.type !== "step-start")))
}
export const stream = fn(Identifier.schema("session"), async function* (sessionID) {

View File

@@ -597,7 +597,7 @@ export namespace SessionPrompt {
sessionID,
system: [...(await SystemPrompt.environment()), ...(await SystemPrompt.custom())],
messages: [
...MessageV2.toModelMessage(sessionMessages, { tools }),
...MessageV2.toModelMessage(sessionMessages),
...(isLastStep
? [
{
@@ -718,22 +718,8 @@ export namespace SessionPrompt {
},
toModelOutput(result) {
return {
type: "content",
value: [
{
type: "text",
text: result.output,
},
...(result.attachments?.map((attachment: MessageV2.FilePart) => {
const base64 = attachment.url.startsWith("data:") ? attachment.url.split(",", 2)[1] : attachment.url
return {
type: "media",
data: base64,
mediaType: attachment.mime,
}
}) ?? []),
],
type: "text",
value: result.output,
}
},
})
@@ -822,22 +808,8 @@ export namespace SessionPrompt {
}
item.toModelOutput = (result) => {
return {
type: "content",
value: [
{
type: "text",
text: result.output,
},
...(result.attachments?.map((attachment: MessageV2.FilePart) => {
const base64 = attachment.url.startsWith("data:") ? attachment.url.split(",", 2)[1] : attachment.url
return {
type: "media",
data: base64,
mediaType: attachment.mime,
}
}) ?? []),
],
type: "text",
value: result.output,
}
}
tools[key] = item