fix: adjust item id stripping to happen prior to request signing (#31429)

This commit is contained in:
Aiden Cline
2026-06-08 17:43:48 -05:00
committed by GitHub
parent 6e84142b59
commit a86ecf3bba
3 changed files with 109 additions and 40 deletions
@@ -1692,26 +1692,6 @@ export const layer = Layer.effect(
const combined = signals.length === 0 ? null : signals.length === 1 ? signals[0] : AbortSignal.any(signals)
if (combined) opts.signal = combined
// Strip openai itemId metadata following what codex does
if (
(model.api.npm === "@ai-sdk/openai" ||
model.api.npm === "@ai-sdk/azure" ||
model.api.npm === "@ai-sdk/amazon-bedrock/mantle") &&
opts.body &&
opts.method === "POST"
) {
const body = JSON.parse(opts.body as string)
const keepIds = body.store === true
if (!keepIds && Array.isArray(body.input)) {
for (const item of body.input) {
if ("id" in item) {
delete item.id
}
}
opts.body = JSON.stringify(body)
}
}
const res = await fetchFn(input, {
...opts,
// @ts-ignore see here: https://github.com/oven-sh/bun/issues/16682
+32 -12
View File
@@ -409,6 +409,24 @@ function unsupportedParts(msgs: ModelMessage[], model: Provider.Model): ModelMes
})
}
function mapProviderOptions(
msgs: ModelMessage[],
transform: (options: Record<string, any> | undefined) => Record<string, any> | undefined,
) {
return msgs.map((msg) => {
if (!Array.isArray(msg.content)) return { ...msg, providerOptions: transform(msg.providerOptions) }
return {
...msg,
providerOptions: transform(msg.providerOptions),
content: msg.content.map((part) =>
part.type === "tool-approval-request" || part.type === "tool-approval-response"
? part
: { ...part, providerOptions: transform(part.providerOptions) },
),
} as typeof msg
})
}
export function message(msgs: ModelMessage[], model: Provider.Model, options: Record<string, unknown>) {
msgs = unsupportedParts(msgs, model)
msgs = normalizeMessages(msgs, model, options)
@@ -438,18 +456,20 @@ export function message(msgs: ModelMessage[], model: Provider.Model, options: Re
return result
}
msgs = msgs.map((msg) => {
if (!Array.isArray(msg.content)) return { ...msg, providerOptions: remap(msg.providerOptions) }
return {
...msg,
providerOptions: remap(msg.providerOptions),
content: msg.content.map((part) => {
if (part.type === "tool-approval-request" || part.type === "tool-approval-response") {
return { ...part }
}
return { ...part, providerOptions: remap(part.providerOptions) }
}),
} as typeof msg
msgs = mapProviderOptions(msgs, remap)
}
// Strip Responses item IDs before serialization, following Codex and keeping signed request bodies immutable.
if (
options.store !== true &&
key &&
["@ai-sdk/openai", "@ai-sdk/azure", "@ai-sdk/amazon-bedrock/mantle"].includes(model.api.npm)
) {
msgs = mapProviderOptions(msgs, (options) => {
if (!options?.[key] || !("itemId" in options[key])) return options
const metadata = { ...options[key] }
delete metadata.itemId
return { ...options, [key]: metadata }
})
}