فهرست منبع

fix(core): consider code: context_length_exceeded as context overflow in API call errors (#17748)

Johannes Loher 1 ماه پیش
والد
کامیت
e718db624f
2فایلهای تغییر یافته به همراه22 افزوده شده و 1 حذف شده
  1. 2 1
      packages/opencode/src/provider/error.ts
  2. 20 0
      packages/opencode/test/session/message-v2.test.ts

+ 2 - 1
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,

+ 20 - 0
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({