fix: handle undefined/null/non-array content in filterNonAnthropicBlocks

- Add guard clause to check if message.content is undefined, null, or not an array
- Prevents "Cannot read properties of undefined (reading filter)" error
- Add comprehensive tests for edge cases (undefined, null, non-array, empty array)
- Fixes issue reported in Reddit where Anthropic API calls would fail unexpectedly
This commit is contained in:
Roo Code 2026-01-25 18:04:16 +00:00
parent 953c7773c0
commit 33687d9a04
2 changed files with 61 additions and 0 deletions

View file

@ -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")
})
})
})

View file

@ -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