fix: adjust item id stripping to happen prior to request signing (#31429)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 }
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user