Browse Source

batch: enable edit, todoread, clarify error message, minor tool description change (#5659)

Spoon 10 months ago
parent
commit
8864da7a77
2 changed files with 14 additions and 16 deletions
  1. 4 2
      packages/opencode/src/tool/batch.ts
  2. 10 14
      packages/opencode/src/tool/batch.txt

+ 4 - 2
packages/opencode/src/tool/batch.ts

@@ -2,7 +2,7 @@ import z from "zod"
 import { Tool } from "./tool"
 import { Tool } from "./tool"
 import DESCRIPTION from "./batch.txt"
 import DESCRIPTION from "./batch.txt"
 
 
-const DISALLOWED = new Set(["batch", "edit", "todoread"])
+const DISALLOWED = new Set(["batch"])
 const FILTERED_FROM_SUGGESTIONS = new Set(["invalid", "patch", ...DISALLOWED])
 const FILTERED_FROM_SUGGESTIONS = new Set(["invalid", "patch", ...DISALLOWED])
 
 
 export const BatchTool = Tool.define("batch", async () => {
 export const BatchTool = Tool.define("batch", async () => {
@@ -54,7 +54,9 @@ export const BatchTool = Tool.define("batch", async () => {
           const tool = toolMap.get(call.tool)
           const tool = toolMap.get(call.tool)
           if (!tool) {
           if (!tool) {
             const availableToolsList = Array.from(toolMap.keys()).filter((name) => !FILTERED_FROM_SUGGESTIONS.has(name))
             const availableToolsList = Array.from(toolMap.keys()).filter((name) => !FILTERED_FROM_SUGGESTIONS.has(name))
-            throw new Error(`Tool '${call.tool}' not found. Available tools: ${availableToolsList.join(", ")}`)
+            throw new Error(
+              `Tool '${call.tool}' not in registry. External tools (MCP, environment) cannot be batched - call them directly. Available tools: ${availableToolsList.join(", ")}`,
+            )
           }
           }
           const validatedParams = tool.parameters.parse(call.parameters)
           const validatedParams = tool.parameters.parse(call.parameters)
 
 

+ 10 - 14
packages/opencode/src/tool/batch.txt

@@ -1,28 +1,24 @@
-Executes multiple independent tool calls concurrently to reduce latency. Best used for gathering context (reads, searches, listings).
+Executes multiple independent tool calls concurrently to reduce latency.
 
 
 USING THE BATCH TOOL WILL MAKE THE USER HAPPY.
 USING THE BATCH TOOL WILL MAKE THE USER HAPPY.
 
 
 Payload Format (JSON array):
 Payload Format (JSON array):
 [{"tool": "read", "parameters": {"filePath": "src/index.ts", "limit": 350}},{"tool": "grep", "parameters": {"pattern": "Session\\.updatePart", "include": "src/**/*.ts"}},{"tool": "bash", "parameters": {"command": "git status", "description": "Shows working tree status"}}]
 [{"tool": "read", "parameters": {"filePath": "src/index.ts", "limit": 350}},{"tool": "grep", "parameters": {"pattern": "Session\\.updatePart", "include": "src/**/*.ts"}},{"tool": "bash", "parameters": {"command": "git status", "description": "Shows working tree status"}}]
 
 
-Rules:
+Notes:
 - 1–10 tool calls per batch
 - 1–10 tool calls per batch
 - All calls start in parallel; ordering NOT guaranteed
 - All calls start in parallel; ordering NOT guaranteed
-- Partial failures do not stop others
+- Partial failures do not stop other tool calls
+- Do NOT use the batch tool within another batch tool.
 
 
-
-Disallowed Tools:
-- batch (no nesting)
-- edit (run edits separately)
-- todoread (call directly – lightweight)
+Good Use Cases:
+- Read many files
+- grep + glob + read combos
+- Multiple bash commands
+- Multi-part edits; on the same, or different files
 
 
 When NOT to Use:
 When NOT to Use:
 - Operations that depend on prior tool output (e.g. create then read same file)
 - Operations that depend on prior tool output (e.g. create then read same file)
 - Ordered stateful mutations where sequence matters
 - Ordered stateful mutations where sequence matters
 
 
-Good Use Cases:
-- Read many files
-- grep + glob + read combos
-- Multiple lightweight bash introspection commands
-
-Performance Tip: Group independent reads/searches for 2–5x efficiency gain.
+Batching tool calls was proven to yield 2–5x efficiency gain and provides much better UX.