Recipes
Self-debug tool
On tool error, let the agent read the error + schema and draft corrected arguments for a retry.
Tool calls fail for boring reasons: the model hallucinated a field,
missed a required arg, or passed a string where a number was
expected. wrapToolWithSelfDebug gives your tool a feedback loop —
on failure, a user-supplied "debugger" sees the error + schema +
args and returns corrected arguments for a retry.
Install
Ships in @agentskit/core/self-debug subpath (no main-bundle weight).
Wrap any tool
import { wrapToolWithSelfDebug, createLlmSelfDebugger } from '@agentskit/core/self-debug'
import { anthropic } from '@agentskit/adapters'
import { createRuntime } from '@agentskit/runtime'
const smart = anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, model: 'claude-haiku-4-5' })
async function complete(prompt: string): Promise<string> {
const runtime = createRuntime({ adapter: smart })
const r = await runtime.run(prompt)
return r.content
}
const resilientSearch = wrapToolWithSelfDebug(
searchTool,
createLlmSelfDebugger(complete),
{ maxAttempts: 2 },
)The LLM-backed debugger sees:
- The tool's name, description, and JSON Schema.
- The previous attempt's arguments.
- The error message.
It emits corrected JSON. If it cannot recover, it returns
{"giveUp": true} and the original error is rethrown.
Custom debuggers
You don't have to use an LLM — any heuristic works:
const pinnedRetry = wrapToolWithSelfDebug(tool, ({ error, args }) => {
if (/unknown field "limit"/.test(error.message)) {
const { limit: _, ...rest } = args
return { args: rest }
}
return { args: null }
})Observability
wrapToolWithSelfDebug(tool, debugger, {
maxAttempts: 3,
onEvent: e => logger.info('[self-debug]', e),
})Events: success / failure / retry / give-up.
See also
- Tool composer — pipeline tools into a macro
- Mandatory sandbox — combine with per-tool validators