summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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({