Просмотр исходного кода

fix: limit LSP diagnostics to prevent context window waste (#5480)

Co-authored-by: Aiden Cline <[email protected]>
Tommy D. Rossi 2 месяцев назад
Родитель
Сommit
aedb5550a8
2 измененных файлов с 19 добавлено и 6 удалено
  1. 7 4
      packages/opencode/src/tool/edit.ts
  2. 12 2
      packages/opencode/src/tool/write.ts

+ 7 - 4
packages/opencode/src/tool/edit.ts

@@ -18,6 +18,8 @@ import { Instance } from "../project/instance"
 import { Agent } from "../agent/agent"
 import { Agent } from "../agent/agent"
 import { Snapshot } from "@/snapshot"
 import { Snapshot } from "@/snapshot"
 
 
+const MAX_DIAGNOSTICS_PER_FILE = 20
+
 function normalizeLineEndings(text: string): string {
 function normalizeLineEndings(text: string): string {
   return text.replaceAll("\r\n", "\n")
   return text.replaceAll("\r\n", "\n")
 }
 }
@@ -141,10 +143,11 @@ export const EditTool = Tool.define("edit", {
     for (const [file, issues] of Object.entries(diagnostics)) {
     for (const [file, issues] of Object.entries(diagnostics)) {
       if (issues.length === 0) continue
       if (issues.length === 0) continue
       if (file === filePath) {
       if (file === filePath) {
-        output += `\nThis file has errors, please fix\n<file_diagnostics>\n${issues
-          .filter((item) => item.severity === 1)
-          .map(LSP.Diagnostic.pretty)
-          .join("\n")}\n</file_diagnostics>\n`
+        const errors = issues.filter((item) => item.severity === 1)
+        const limited = errors.slice(0, MAX_DIAGNOSTICS_PER_FILE)
+        const suffix =
+          errors.length > MAX_DIAGNOSTICS_PER_FILE ? `\n... and ${errors.length - MAX_DIAGNOSTICS_PER_FILE} more` : ""
+        output += `\nThis file has errors, please fix\n<file_diagnostics>\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</file_diagnostics>\n`
         continue
         continue
       }
       }
     }
     }

+ 12 - 2
packages/opencode/src/tool/write.ts

@@ -11,6 +11,9 @@ import { Filesystem } from "../util/filesystem"
 import { Instance } from "../project/instance"
 import { Instance } from "../project/instance"
 import { Agent } from "../agent/agent"
 import { Agent } from "../agent/agent"
 
 
+const MAX_DIAGNOSTICS_PER_FILE = 20
+const MAX_PROJECT_DIAGNOSTICS_FILES = 5
+
 export const WriteTool = Tool.define("write", {
 export const WriteTool = Tool.define("write", {
   description: DESCRIPTION,
   description: DESCRIPTION,
   parameters: z.object({
   parameters: z.object({
@@ -77,13 +80,20 @@ export const WriteTool = Tool.define("write", {
     let output = ""
     let output = ""
     await LSP.touchFile(filepath, true)
     await LSP.touchFile(filepath, true)
     const diagnostics = await LSP.diagnostics()
     const diagnostics = await LSP.diagnostics()
+    let projectDiagnosticsCount = 0
     for (const [file, issues] of Object.entries(diagnostics)) {
     for (const [file, issues] of Object.entries(diagnostics)) {
       if (issues.length === 0) continue
       if (issues.length === 0) continue
+      const sorted = issues.toSorted((a, b) => (a.severity ?? 4) - (b.severity ?? 4))
+      const limited = sorted.slice(0, MAX_DIAGNOSTICS_PER_FILE)
+      const suffix =
+        issues.length > MAX_DIAGNOSTICS_PER_FILE ? `\n... and ${issues.length - MAX_DIAGNOSTICS_PER_FILE} more` : ""
       if (file === filepath) {
       if (file === filepath) {
-        output += `\nThis file has errors, please fix\n<file_diagnostics>\n${issues.map(LSP.Diagnostic.pretty).join("\n")}\n</file_diagnostics>\n`
+        output += `\nThis file has errors, please fix\n<file_diagnostics>\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</file_diagnostics>\n`
         continue
         continue
       }
       }
-      output += `\n<project_diagnostics>\n${file}\n${issues.map(LSP.Diagnostic.pretty).join("\n")}\n</project_diagnostics>\n`
+      if (projectDiagnosticsCount >= MAX_PROJECT_DIAGNOSTICS_FILES) continue
+      projectDiagnosticsCount++
+      output += `\n<project_diagnostics>\n${file}\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</project_diagnostics>\n`
     }
     }
 
 
     return {
     return {