core: fix issue when switching models (mainly between providers) where past reasoning/metadata would be sent to server and cause 400 errors since they came from another account/provider

This commit is contained in:
Aiden Cline
2026-01-20 16:39:00 -06:00
parent 0c4ffec857
commit 021e42c0bb
4 changed files with 164 additions and 30 deletions

View File

@@ -11,6 +11,7 @@ import { ProviderTransform } from "@/provider/transform"
import { STATUS_CODES } from "http"
import { iife } from "@/util/iife"
import { type SystemError } from "bun"
import type { Provider } from "@/provider/provider"
export namespace MessageV2 {
export const OutputLengthError = NamedError.create("MessageOutputLengthError", z.object({}))
@@ -432,7 +433,7 @@ export namespace MessageV2 {
})
export type WithParts = z.infer<typeof WithParts>
export function toModelMessages(input: WithParts[]): ModelMessage[] {
export function toModelMessages(input: WithParts[], model: Provider.Model): ModelMessage[] {
const result: UIMessage[] = []
for (const msg of input) {
@@ -476,6 +477,8 @@ export namespace MessageV2 {
}
if (msg.info.role === "assistant") {
const differentModel = `${model.providerID}/${model.api.id}` !== `${msg.info.providerID}/${msg.info.modelID}`
if (
msg.info.error &&
!(
@@ -495,7 +498,7 @@ export namespace MessageV2 {
assistantMessage.parts.push({
type: "text",
text: part.text,
providerMetadata: part.metadata,
...(differentModel ? {} : { providerMetadata: part.metadata }),
})
if (part.type === "step-start")
assistantMessage.parts.push({
@@ -527,7 +530,7 @@ export namespace MessageV2 {
toolCallId: part.callID,
input: part.state.input,
output: part.state.time.compacted ? "[Old tool result content cleared]" : part.state.output,
callProviderMetadata: part.metadata,
...(differentModel ? {} : { callProviderMetadata: part.metadata }),
})
}
if (part.state.status === "error")
@@ -537,7 +540,7 @@ export namespace MessageV2 {
toolCallId: part.callID,
input: part.state.input,
errorText: part.state.error,
callProviderMetadata: part.metadata,
...(differentModel ? {} : { callProviderMetadata: part.metadata }),
})
// Handle pending/running tool calls to prevent dangling tool_use blocks
// Anthropic/Claude APIs require every tool_use to have a corresponding tool_result
@@ -548,14 +551,14 @@ export namespace MessageV2 {
toolCallId: part.callID,
input: part.state.input,
errorText: "[Tool execution was interrupted]",
callProviderMetadata: part.metadata,
...(differentModel ? {} : { callProviderMetadata: part.metadata }),
})
}
if (part.type === "reasoning") {
assistantMessage.parts.push({
type: "reasoning",
text: part.text,
providerMetadata: part.metadata,
...(differentModel ? {} : { providerMetadata: part.metadata }),
})
}
}