summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJohannes Loher <[email protected]>2026-03-16 16:25:24 +0100
committerGitHub <[email protected]>2026-03-16 10:25:24 -0500
commite718db624fd0694cbdd051c8d27b577560cb057c (patch)
treec79fcb286c4177919596f37744e87dd29c10d61e
parent15b27e0d182b0b5db0eae45d2cc9ac1c670dd381 (diff)
downloadopencode-e718db624fd0694cbdd051c8d27b577560cb057c.tar.gz
opencode-e718db624fd0694cbdd051c8d27b577560cb057c.zip
fix(core): consider code: context_length_exceeded as context overflow in API call errors (#17748)
-rw-r--r--packages/opencode/src/provider/error.ts3
-rw-r--r--packages/opencode/test/session/message-v2.test.ts20
2 files changed, 22 insertions, 1 deletions
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({