Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/llm/src/provider-error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ const patterns = [
/exceeded model token limit/i,
/context[_ ]length[_ ]exceeded/i,
/request entity too large/i,
/content length exceeded/i,
/maximum number of images/i,
/context length is only \d+ tokens/i,
/input length.*exceeds.*context length/i,
/prompt too long; exceeded (?:max )?context length/i,
Expand Down
15 changes: 15 additions & 0 deletions packages/llm/test/provider-error.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,21 @@ describe("provider error classification", () => {
expect(messages.every(isContextOverflow)).toBe(true)
})

test("classifies provider request payload and media caps as context overflow", () => {
const messages = [
// Azure OpenAI request payload byte cap, returned as a 400 (not a 413)
"Request content length exceeded 32 MB limit.",
'400 status code: {"error":{"message":"Request content length exceeded 32 MB limit.","type":"invalid_request_error","param":null,"code":null}}',
// Azure OpenAI per-request image cap
"Exceeded maximum number of images (50) allowed in the request.",
// OpenRouter double-wraps the upstream provider body as an escaped string in metadata.raw
'{"error":{"message":"Provider returned error","code":400,"metadata":{"raw":"{\\"error\\": {\\"message\\": \\"Request content length exceeded 32 MB limit.\\"}}","provider_name":"Azure"}}}',
'{"error":{"message":"Provider returned error","code":400,"metadata":{"raw":"{\\"error\\": {\\"message\\": \\"Exceeded maximum number of images (50) allowed in the request.\\"}}","provider_name":"Azure"}}}',
]

expect(messages.every(isContextOverflow)).toBe(true)
})

test("does not classify rate limits as context overflow", () => {
const messages = [
"Throttling error: Too many tokens, please wait before trying again.",
Expand Down
Loading