| title | useFrontendTool |
|---|---|
| description | The useFrontendTool hook allows the Copilot to execute tools in the frontend. |
useFrontendTool allows you to define executable actions that the AI can call with a handler function.
This is the primary way to give your AI agent the ability to perform actions in your application—whether
that's updating state, making API calls, or triggering side effects.
The hook requires three main pieces:
- A name and description so the AI knows when to call it
- A parameters definition describing what inputs the tool accepts
- A handler function that executes when the AI calls the tool
Optionally, you can provide a render function to display custom UI showing the tool's execution
status and results in the chat interface.
import { useFrontendTool } from "@copilotkit/react-core";
useFrontendTool({
name: "sayHello",
description: "Say hello to someone.",
parameters: [
{
name: "name",
type: "string",
description: "name of the person to greet",
required: true,
},
],
handler: async ({ name }) => {
alert(`Hello, ${name}!`);
},
});import { useFrontendTool } from "@copilotkit/react-core";
useFrontendTool({
name: "showWeatherCard",
description: "Display weather information for a location",
parameters: [
{
name: "location",
type: "string",
description: "The location to show weather for",
required: true,
},
{
name: "temperature",
type: "number",
description: "Temperature in celsius",
required: true,
},
],
handler: async ({ location, temperature }) => {
// Fetch and return weather data
return { location, temperature, conditions: "Sunny" };
},
render: ({ args, status, result }) => {
if (status === "inProgress") {
return <div>Loading weather for {args.location}...</div>;
}
if (status === "complete" && result) {
return (
<WeatherCard
location={result.location}
temperature={result.temperature}
conditions={result.conditions}
/>
);
}
return null;
},
});This hook enables you to dynamically generate UI elements and render them in the copilot chat. For more information, check out the Generative UI page.
If you're migrating from useCopilotAction, here are the key differences:
- The render component props include
nameanddescription
// Before with useCopilotAction
useCopilotAction({
name: "addTodo",
parameters: [
{
name: "text",
type: "string",
description: "The todo text",
required: true,
},
],
handler: ({ text }) => {
addTodo(text);
},
});
// After with useFrontendTool
useFrontendTool({
name: "addTodo",
parameters: [
{
name: "text",
type: "string",
description: "The todo text",
required: true,
},
],
handler: ({ text }) => {
addTodo(text);
},
});Simple example: [{ name: "query", type: "string", description: "The search query", required: true }]
Nested example:
[
{
name: "user",
type: "object",
description: "User information",
required: true,
properties: [
{ name: "name", type: "string", description: "User's name", required: true },
{ name: "age", type: "number", description: "User's age", required: false }
]
}
]