Overview
useRenderTool registers a chat renderer for tool calls.
You can target a specific tool name (with a typed Zod parameters schema) or use a wildcard ("*") fallback renderer.
This is part of the v2 tool rendering hook set with useComponent, useDefaultRenderTool, and useRenderToolCall.
This hook only handles rendering. It does not register a frontend handler.
Signature
Wildcard overload
useRenderTool(
{
name: "*",
render: (props) => React.ReactElement,
agentId?: string,
},
deps?: ReadonlyArray<unknown>,
);
Named overload
useRenderTool(
{
name: string,
parameters: z.ZodTypeAny,
render: (props) => React.ReactElement,
agentId?: string,
},
deps?: ReadonlyArray<unknown>,
);
Render Props
render receives one of these states:
{ status: "inProgress", parameters: Partial<T>, result: undefined }{ status: "executing", parameters: T, result: undefined }{ status: "complete", parameters: T, result: string }
name is always present in all states.
Behavior
- Builds a renderer entry with
defineToolCallRenderer. - Deduplicates by
agentId:namekey (latest registration wins). - Intentionally does not remove the renderer on cleanup so previous chat history can still render.
- Tracks updates by
config.nameplus values indeps(include changing captures indeps).
Usage
Named tool renderer
function App() {
useRenderTool(
{
name: "searchDocs",
parameters: z.object({ query: z.string() }),
render: ({ name, parameters, status, result }) => {
if (status === "inProgress") return <div>Preparing {name}…</div>;
if (status === "executing")
return <div>Searching for: {parameters.query}</div>;
return <div>Done: {result}</div>;
},
},
[],
);
return null;
}
Wildcard fallback renderer
function App() {
useRenderTool(
{
name: "*",
render: ({ name, status }) => (
<div>
{status === "complete" ? "✓" : "⏳"} {name}
</div>
),
},
[],
);
return null;
}