|
# Custom Components in 5 minutes
|
|
|
|
Gradio 4.0 introduces Custom Components -- the ability for developers to create their own custom components and use them in Gradio apps.
|
|
You can publish your components as Python packages so that other users can use them as well.
|
|
Users will be able to use all of Gradio's existing functions, such as `gr.Blocks`, `gr.Interface`, API usage, themes, etc. with Custom Components.
|
|
This guide will cover how to get started making custom components.
|
|
|
|
## Installation
|
|
|
|
You will need to have:
|
|
|
|
* Python 3.8+ (<a href="https://www.python.org/downloads/" target="_blank">install here</a>)
|
|
* pip 21.3+ (`python -m pip install --upgrade pip`)
|
|
* Node.js v16.14+ (<a href="https://nodejs.dev/en/download/package-manager/" target="_blank">install here</a>)
|
|
* npm 9+ (<a href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm/" target="_blank">install here</a>)
|
|
* Gradio 4.0+ (`pip install --upgrade gradio`)
|
|
|
|
## The Workflow
|
|
|
|
The Custom Components workflow consists of 4 steps: create, dev, build, and publish.
|
|
|
|
1. create: creates a template for you to start developing a custom component.
|
|
2. dev: launches a development server with a sample app & hot reloading allowing you to easily develop your custom component
|
|
3. build: builds a python package containing to your custom component's Python and JavaScript code -- this makes things official!
|
|
4. publish: uploads your package to [PyPi](https://pypi.org/) and/or a sample app to [HuggingFace Spaces](https://hf.co/spaces).
|
|
|
|
Each of these steps is done via the Custom Component CLI. You can invoke it with `gradio cc` or `gradio component`
|
|
|
|
Tip: Run `gradio cc --help` to get a help menu of all available commands. There are some commands that are not covered in this guide. You can also append `--help` to any command name to bring up a help page for that command, e.g. `gradio cc create --help`.
|
|
|
|
## 1. create
|
|
|
|
Bootstrap a new template by running the following in any working directory:
|
|
|
|
```bash
|
|
gradio cc create MyComponent --template SimpleTextbox
|
|
```
|
|
|
|
Instead of `MyComponent`, give your component any name.
|
|
|
|
Instead of `SimpleTextbox`, you can use any Gradio component as a template. `SimpleTextbox` is actually a special component that a stripped-down version of the `Textbox` component that makes it particularly useful when creating your first custom component.
|
|
Some other components that are good if you are starting out: `SimpleDropdown`, `SimpleImage`, or `File`.
|
|
|
|
Tip: Run `gradio cc show` to get a list of available component templates.
|
|
|
|
The `create` command will:
|
|
|
|
1. Create a directory with your component's name in lowercase with the following structure:
|
|
```directory
|
|
- backend/ <- The python code for your custom component
|
|
- frontend/ <- The javascript code for your custom component
|
|
- demo/ <- A sample app using your custom component. Modify this to develop your component!
|
|
- pyproject.toml <- Used to build the package and specify package metadata.
|
|
```
|
|
|
|
2. Install the component in development mode
|
|
|
|
Each of the directories will have the code you need to get started developing!
|
|
|
|
## 2. dev
|
|
|
|
Once you have created your new component, you can start a development server by `entering the directory` and running
|
|
|
|
```bash
|
|
gradio cc dev
|
|
```
|
|
|
|
You'll see several lines that are printed to the console.
|
|
The most important one is the one that says:
|
|
|
|
> Frontend Server (Go here): http://localhost:7861/
|
|
|
|
The port number might be different for you.
|
|
Click on that link to launch the demo app in hot reload mode.
|
|
Now, you can start making changes to the backend and frontend you'll see the results reflected live in the sample app!
|
|
We'll go through a real example in a later guide.
|
|
|
|
Tip: You don't have to run dev mode from your custom component directory. The first argument to `dev` mode is the path to the directory. By default it uses the current directory.
|
|
|
|
## 3. build
|
|
|
|
Once you are satisfied with your custom component's implementation, you can `build` it to use it outside of the development server.
|
|
|
|
From your component directory, run:
|
|
|
|
```bash
|
|
gradio cc build
|
|
```
|
|
|
|
This will create a `tar.gz` and `.whl` file in a `dist/` subdirectory.
|
|
If you or anyone installs that `.whl` file (`pip install <path-to-whl>`) they will be able to use your custom component in any gradio app!
|
|
|
|
The `build` command will also generate documentation for your custom component. This takes the form of an interactive space and a static `README.md`. You can disable this by passing `--no-generate-docs`. You can read more about the documentation generator in [the dedicated guide](https://gradio.app/guides/documenting-custom-components).
|
|
|
|
## 4. publish
|
|
|
|
Right now, your package is only available on a `.whl` file on your computer.
|
|
You can share that file with the world with the `publish` command!
|
|
|
|
Simply run the following command from your component directory:
|
|
|
|
```bash
|
|
gradio cc publish
|
|
```
|
|
|
|
This will guide you through the following process:
|
|
|
|
1. Upload your distribution files to PyPi. This is optional. If you decide to upload to PyPi, you will need a PyPI username and password. You can get one [here](https://pypi.org/account/register/).
|
|
2. Upload a demo of your component to hugging face spaces. This is also optional.
|
|
|
|
|
|
Here is an example of what publishing looks like:
|
|
|
|
<video autoplay muted loop>
|
|
<source src="https://gradio-builds.s3.amazonaws.com/assets/text_with_attachments_publish.mov" type="video/mp4" />
|
|
</video>
|
|
|
|
|
|
## Conclusion
|
|
|
|
Now that you know the high-level workflow of creating custom components, you can go in depth in the next guides!
|
|
After reading the guides, check out this [collection](https://huggingface.co/collections/gradio/custom-components-65497a761c5192d981710b12) of custom components on the HuggingFace Hub so you can learn from other's code.
|
|
|
|
Tip: If you want to start off from someone else's custom component see this [guide](./frequently-asked-questions#do-i-always-need-to-start-my-component-from-scratch).
|
|
|