From e718db624fd0694cbdd051c8d27b577560cb057c Mon Sep 17 00:00:00 2001 From: Johannes Loher Date: Mon, 16 Mar 2026 16:25:24 +0100 Subject: [PATCH] fix(core): consider code: context_length_exceeded as context overflow in API call errors (#17748) --- packages/opencode/src/provider/error.ts | 3 ++- .../opencode/test/session/message-v2.test.ts | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/provider/error.ts b/packages/opencode/src/provider/error.ts index c9f83cd8c..dd2554489 100644 --- a/packages/opencode/src/provider/error.ts +++ b/packages/opencode/src/provider/error.ts @@ -167,7 +167,8 @@ export namespace ProviderError { export function parseAPICallError(input: { providerID: ProviderID; error: APICallError }): ParsedAPICallError { const m = message(input.providerID, input.error) - if (isOverflow(m) || input.error.statusCode === 413) { + const body = json(input.error.responseBody) + if (isOverflow(m) || input.error.statusCode === 413 || body?.error?.code === "context_length_exceeded") { return { type: "context_overflow", message: m, diff --git a/packages/opencode/test/session/message-v2.test.ts b/packages/opencode/test/session/message-v2.test.ts index e9c6cb729..86c9254f1 100644 --- a/packages/opencode/test/session/message-v2.test.ts +++ b/packages/opencode/test/session/message-v2.test.ts @@ -869,6 +869,26 @@ describe("session.message-v2.fromError", () => { }) }) + test("detects context overflow from context_length_exceeded code in response body", () => { + const error = new APICallError({ + message: "Request failed", + url: "https://example.com", + requestBodyValues: {}, + statusCode: 422, + responseHeaders: { "content-type": "application/json" }, + responseBody: JSON.stringify({ + error: { + message: "Some message", + type: "invalid_request_error", + code: "context_length_exceeded", + }, + }), + isRetryable: false, + }) + const result = MessageV2.fromError(error, { providerID }) + expect(MessageV2.ContextOverflowError.isInstance(result)).toBe(true) + }) + test("does not classify 429 no body as context overflow", () => { const result = MessageV2.fromError( new APICallError({