# Defining Tambo Components URL: /concepts/components/defining-tambo-components Tell Tambo which components it can use in responses, what they are for, and what props they expect by defining a `TamboComponent` for each. ```tsx import { z } from "zod"; import { DataChart } from "@/components/DataChart"; import { TamboProvider } from "@tambo-ai/react"; // Define the schema with Zod export const DataChartProps = z.object({ data: z.object({ labels: z.array(z.string()), values: z.array(z.number()), }), type: z.enum(["bar", "line", "pie"]), }); const tamboComponents: TamboComponent[] = [ { component: DataChart, name: "DataChart", description: "Displays data as a chart", propsSchema: DataChartProps, }, ]; ; ``` Note that when using zod's `.optional()` on a field, tambo may not attempt to generate any value for the prop. You can also use `z.describe()` to provide extra guidance to the AI: ```tsx import { z } from "zod"; import { DataChart } from "@/components/DataChart"; import { TamboProvider } from "@tambo-ai/react"; // Define schema with descriptions for AI export const DataChartProps = z .object({ data: z .object({ labels: z .array(z.string()) .describe("Use single words or short phrases."), values: z.array(z.number()).describe("Use whole numbers."), }) .describe("A component for displaying data in various chart formats"), type: z .enum(["bar", "line", "pie"]) .describe( "Use a chart type that is appropriate for the data. Only use pie charts when less than 5 values.", ), }) .describe("A component for displaying data in various chart formats"); const tamboComponents: TamboComponent[] = [ { component: DataChart, name: "DataChart", description: "Displays data as a chart", propsSchema: DataChartProps, }, ]; ; ``` This registration approach is for components that Tambo generates from scratch. If you want to pre-place components on your page and let Tambo modify them, use [Interactable Components](./interactable-components) instead—they register themselves automatically when mounted. If you want Tambo to both modify pre-placed interactable components AND be able to generate new instances inline, register the component in the `TamboProvider` components array as well. Now when a user sends a message asking about something related to your components, Tambo can respond with the appropriate component filled with relevant data!