diff --git a/.changeset/fix-deduplicate-openai-output.md b/.changeset/fix-deduplicate-openai-output.md new file mode 100644 index 00000000000..9d694a62b3b --- /dev/null +++ b/.changeset/fix-deduplicate-openai-output.md @@ -0,0 +1,5 @@ +--- +"@effect/ai-openai": patch +--- + +fix(ai-openai): deduplicate response.output items to prevent invalid JSON concatenation diff --git a/packages/ai/openai/src/OpenAiLanguageModel.ts b/packages/ai/openai/src/OpenAiLanguageModel.ts index c4fef761467..e9b56820874 100644 --- a/packages/ai/openai/src/OpenAiLanguageModel.ts +++ b/packages/ai/openai/src/OpenAiLanguageModel.ts @@ -567,7 +567,16 @@ const makeResponse: ( timestamp: DateTime.formatIso(DateTime.unsafeFromDate(createdAt)) }) + // Deduplicate output items by ID to handle OpenAI Responses API bug + // where duplicate OutputMessage items appear in response.output + const seenOutputIds = new Set() for (const part of response.output) { + if (part.id && seenOutputIds.has(part.id)) { + continue + } + if (part.id) { + seenOutputIds.add(part.id) + } switch (part.type) { case "message": { for (const contentPart of part.content) {