diff --git a/src/api/transform/__tests__/anthropic-filter.spec.ts b/src/api/transform/__tests__/anthropic-filter.spec.ts index 46ad1a19526..fbdb3659ad5 100644 --- a/src/api/transform/__tests__/anthropic-filter.spec.ts +++ b/src/api/transform/__tests__/anthropic-filter.spec.ts @@ -140,5 +140,61 @@ describe("anthropic-filter", () => { expect(result).toHaveLength(1) expect(result[0].content).toEqual([{ type: "text", text: "Valid text" }]) }) + + it("should handle messages with undefined content gracefully", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "Hello" }, + { role: "assistant", content: undefined as any }, + { role: "user", content: "Continue" }, + ] + + const result = filterNonAnthropicBlocks(messages) + + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Hello") + expect(result[1].content).toBe("Continue") + }) + + it("should handle messages with null content gracefully", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "Hello" }, + { role: "assistant", content: null as any }, + { role: "user", content: "Continue" }, + ] + + const result = filterNonAnthropicBlocks(messages) + + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Hello") + expect(result[1].content).toBe("Continue") + }) + + it("should handle messages with non-array content gracefully", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "Hello" }, + { role: "assistant", content: { invalid: "object" } as any }, + { role: "user", content: "Continue" }, + ] + + const result = filterNonAnthropicBlocks(messages) + + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Hello") + expect(result[1].content).toBe("Continue") + }) + + it("should handle empty array content", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "Hello" }, + { role: "assistant", content: [] }, + { role: "user", content: "Continue" }, + ] + + const result = filterNonAnthropicBlocks(messages) + + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Hello") + expect(result[1].content).toBe("Continue") + }) }) }) diff --git a/src/api/transform/anthropic-filter.ts b/src/api/transform/anthropic-filter.ts index 2bfc6dccfd0..b7ce5a98fd7 100644 --- a/src/api/transform/anthropic-filter.ts +++ b/src/api/transform/anthropic-filter.ts @@ -32,6 +32,11 @@ export function filterNonAnthropicBlocks( return message } + // Guard against undefined, null, or non-array content + if (!message.content || !Array.isArray(message.content)) { + return undefined + } + const filteredContent = message.content.filter((block) => { const blockType = (block as { type: string }).type // Only keep block types that Anthropic recognizes