fix(ai): normalize replayed responses tool call ids closes #2328

This commit is contained in:
Mario Zechner
2026-03-18 03:37:40 +01:00
parent f951d45000
commit b2548ce489

View File

@@ -91,21 +91,22 @@ export function convertResponsesMessages<TApi extends Api>(
): ResponseInput {
const messages: ResponseInput = [];
const normalizeIdPart = (part: string): string => {
const sanitized = part.replace(/[^a-zA-Z0-9_-]/g, "_");
const normalized = sanitized.length > 64 ? sanitized.slice(0, 64) : sanitized;
return normalized.replace(/_+$/, "");
};
const normalizeToolCallId = (id: string): string => {
if (!allowedToolCallProviders.has(model.provider)) return id;
if (!id.includes("|")) return id;
if (!allowedToolCallProviders.has(model.provider)) return normalizeIdPart(id);
if (!id.includes("|")) return normalizeIdPart(id);
const [callId, itemId] = id.split("|");
const sanitizedCallId = callId.replace(/[^a-zA-Z0-9_-]/g, "_");
let sanitizedItemId = itemId.replace(/[^a-zA-Z0-9_-]/g, "_");
const normalizedCallId = normalizeIdPart(callId);
let normalizedItemId = normalizeIdPart(itemId);
// OpenAI Responses API requires item id to start with "fc"
if (!sanitizedItemId.startsWith("fc")) {
sanitizedItemId = `fc_${sanitizedItemId}`;
if (!normalizedItemId.startsWith("fc")) {
normalizedItemId = normalizeIdPart(`fc_${normalizedItemId}`);
}
// Truncate to 64 chars and strip trailing underscores (OpenAI Codex rejects them)
let normalizedCallId = sanitizedCallId.length > 64 ? sanitizedCallId.slice(0, 64) : sanitizedCallId;
let normalizedItemId = sanitizedItemId.length > 64 ? sanitizedItemId.slice(0, 64) : sanitizedItemId;
normalizedCallId = normalizedCallId.replace(/_+$/, "");
normalizedItemId = normalizedItemId.replace(/_+$/, "");
return `${normalizedCallId}|${normalizedItemId}`;
};