Custom Components GalleryNEW

Explore

Changelog

4.26.0

Features

  • #7811 b43055b - Lite playground design changes. Thanks @aliabd!
  • #7850 2bae1cf - Adds an “API Recorder” to the view API page, some internal methods have been made async. Thanks @abidlabs!
  • #7936 b165193 - Restore Markdown formatting for Chatbots, MarkdownCode. Thanks @aliabid94!
  • #7912 a4782f7 - Allow displaying gr.Code examples by their filename if value is a tuple. Thanks @freddyaboulton!
  • #7938 8250a1a - Handle the case of multiple headers when constructing root url. Thanks @abidlabs!
  • #7932 b78129d - Use asyncio.Event to stop stream in heartbeat route. Thanks @freddyaboulton!
  • #7961 eae97c2 - Fix task bug in python 3.9. Thanks @freddyaboulton!
  • #7967 1a7851c - Fix handling of single font name in theme. Thanks @sd109!

Fixes

  • #7963 1eb4c20 - ensure kwargs are always in sync across the whole application. Thanks @pngwn!
  • #7916 7c9a964 - Fix programmatic tab selection. Thanks @aliabid94!
  • #7754 057d171 - Correctly handle device selection in Image and ImageEditor. Thanks @hannahblair!
  • #7756 b729f10 - Bugfix: Fix color and size keys in theme builder app. Thanks @shubhamofbce!
  • #7918 be46ab1 - ensure entire dropdown is clickable. Thanks @dawoodkhan82!
  • #7966 bad3836 - Adding hint list[list] for example parameter. Thanks @WH-Yoshi!
  • #7817 867ff16 - Trigger the “clear” event of Image Editor. Thanks @uebian!
  • #7935 919afff - Adds a Guide on deploying Gradio apps with Docker. Thanks @abidlabs!
  • #7915 efd9524 - Fix gr.CheckboxGroup change event. Thanks @freddyaboulton!
  • #7926 9666854 - Fixes streaming event race condition. Thanks @aliabid94!

4.25.0

Highlights

Automatically delete state after user has disconnected from the webpage (#7829 6a4bf7a)

Gradio now automatically deletes gr.State variables stored in the server’s RAM when users close their browser tab. The deletion will happen 60 minutes after the server detected a disconnect from the user’s browser. If the user connects again in that timeframe, their state will not be deleted.

Additionally, Gradio now includes a Blocks.unload() event, allowing you to run arbitrary cleanup functions when users disconnect (this does not have a 60 minute delay). You can think of the unload event as the opposite of the load event.

with gr.Blocks() as demo:
    gr.Markdown(
"""# State Cleanup Demo
🖼️ Images are saved in a user-specific directory and deleted when the users closes the page via demo.unload.
""")
    with gr.Row():
        with gr.Column(scale=1):
            with gr.Row():
                img = gr.Image(label="Generated Image", height=300, width=300)
            with gr.Row():
                gen = gr.Button(value="Generate")
            with gr.Row():
                history = gr.Gallery(label="Previous Generations", height=500, columns=10)
                state = gr.State(value=[], delete_callback=lambda v: print("STATE DELETED"))

    demo.load(generate_random_img, [state], [img, state, history]) 
    gen.click(generate_random_img, [state], [img, state, history])
    demo.unload(delete_directory)


demo.launch(auth=lambda user,pwd: True,
            auth_message="Enter any username and password to continue")

Thanks @freddyaboulton!

Features

  • #7863 024b44c - Add support for lazy caching of examples, as well as add GRADIO_CACHE_EXAMPLES env variable. Thanks @abidlabs!
  • #7892 c7933ff - Suppress printing “Running on local URL:” when quiet is set. Thanks @dnoliver!
  • #7869 b9dbcf7 - Make buttons in gr.ChatInterface more mobile-friendly. Thanks @abidlabs!
  • #7875 e6d051d - Paste Images into MultimodalTextbox. Thanks @abidlabs!
  • #7893 f42d3e2 - Make internal event handlers of gr.Interface and gr.ChatInterface async. Thanks @freddyaboulton!

Fixes

  • #7886 ccdab9b - logout route deleting cookie fix. Thanks @MichaelPerger!
  • #7888 946487c - Cache view_api info in server and python client. Thanks @freddyaboulton!
  • #7881 5e66e01 - Fix audio streaming out. Thanks @aliabid94!
  • #7865 7bbc3b6 - JS functions break entire app if there’s no input, fixed. Thanks @aliabid94!

4.24.0

Features

  • #7849 7af3cd7 - Adds a placeholder argument to gr.Chatbot. Thanks @abidlabs!
  • #7835 ee804b2 - Stop running iterators when js client disconnects. Thanks @freddyaboulton!
  • #7852 72661e3 - Revert the minify setting in vite.config.js which was mistakingly introduced in #6261. Thanks @whitphx!
  • #7818 1a7c8d3 - Stop importing gradio.ipython_ext in Wasm mode. Thanks @whitphx!
  • #7830 75a2bf7 - Add guide on Client state and and fix default values of components. Thanks @abidlabs!
  • #7823 e0a8b7f - Exclude typer from the requirements list for Wasm env and fix gradio.cli not to be imported. Thanks @whitphx!
  • #7851 e3b1236 - Lazy-import pandas. Thanks @whitphx!
  • #7840 ecf5c52 - Fix gradio/components/dataframe.py not to import pandas.io. Thanks @whitphx!
  • #7801 05db0c4 - Refactor CORS Middleware to be much faster. Thanks @abidlabs!
  • #7810 425fd1c - Benchmark fix test. Thanks @aliabid94!

Fixes

  • #7795 1c257f5 - Bugfix: .. in filename throwing error while loading in output. Thanks @shubhamofbce!
  • #7862 0e125d7 - Trigger click event from gr.DownloadButton even when no file is present. Thanks @abidlabs!
  • #7848 8d7b3ca - Multimodal Textbox Loading + other fixes. Thanks @dawoodkhan82!

4.23.0

Features

  • #7782 2c8cd0a - Lazy-import altair. Thanks @whitphx!
  • #7800 b0a3ea9 - Small fix to client.view_api() in the case of default file values. Thanks @abidlabs!
  • #7684 755157f - Do not reload code inside gr.NO_RELOAD context. Thanks @freddyaboulton!
  • #7770 dd3e363 - Fail CI if lint or typecheck fails. Thanks @abidlabs!
  • #7796 aad209f - Decrease latency: do not run pre and postprocess in threadpool. Thanks @freddyaboulton!
  • #7744 d831040 - Remove Ruff and Uvicorn in Wasm env. Thanks @whitphx!
  • #7732 2efb05e - Adds support for kwargs and default arguments in the python client, and improves how parameter information is displayed in the “view API” page. Thanks @abidlabs!
  • #7661 c62a57e - Convert Docs Demos to Lite. Thanks @aliabd!
  • #7814 f7df92f - Improve UX of non-interactive slider. Thanks @Pythongor!
  • #7789 ff6bf3e - Remove the aiohttp mock from the Wasm worker as it’s removed in https://github.com/gradio-app/gradio/pull/5244. Thanks @whitphx!

Fixes

  • #7783 43ae23f - Fix accidental bug that prevented custom textboxes from being passed to chatinterface. Thanks @freddyaboulton!
  • #7762 e78bca4 - Trigger input event for Radio even when radio is output component. Thanks @freddyaboulton!
  • #7787 781678b - Fix root url resolution from x_forwarded_host headers. Thanks @abidlabs!
  • #7794 cf98c7e - Adds trigger_mode to gr.on. Use it to set trigger_model=“always_last” for live interfaces. Thanks @freddyaboulton!
  • #7761 ca42748 - Ensure paginate updates when samples value changes in Dataset. Thanks @hannahblair!

4.22.0

Features

  • #7743 a2badf1 - Migrate to Storybook 8. Thanks @hannahblair!
  • #7680 853d945 - Add format parameter to gr.Image, gr.Gallery, gr.AnnotatedImage, gr.Plot to control format to save image files in. Thanks @dfl!
  • #7691 84f81fe - Closing stream from the backend. Thanks @aliabid94!
  • #7420 15da39f - Multimodal Textbox (Chat Input Component). Thanks @dawoodkhan82!
  • #7712 aca4892 - More fixes for gr.load() as well as a tweaking the __str__ and __repr__ methods of components. Thanks @abidlabs!
  • #7660 f739bef - Add Playground to Lite Custom Element. Thanks @aliabd!
  • #7710 0a3870d - Call handle_darkmode() even if window.__gradio_mode__ === "website" but enforce the light theme. Thanks @whitphx!
  • #7572 7d3c868 - Detailed error message for wasm_utils.get_registered_app(). Thanks @whitphx!
  • #7734 04857bc - Add allowed_paths, blocked_paths, show_error, and favicon_path parameters to gr.mount_gradio_app. Thanks @abidlabs!
  • #7667 aba4470 - Add auth, auth_message, and root_path parameters to mount_gradio_app. Thanks @abidlabs!

Fixes

  • #7716 188b86b - Add support for object-detection models in gr.load(). Thanks @abidlabs!
  • #7564 5d1e8da - batch UI updates on a per frame basis. Thanks @pngwn!
  • #7718 6390d0b - Add support for python client connecting to gradio apps running with self-signed SSL certificates. Thanks @abidlabs!
  • #7697 a1c24db - Fix OAuth + fix OAuth documentation + undocument logout button. Thanks @Wauplin!
  • #7623 c9aba8d - Fixes: gr.Markdown is not updated properly when it has an image tag. Thanks @dawoodkhan82!
  • #7704 95c6bc8 - Fix flagged files and ensure that flagging_mode=“auto” saves output components as well. Thanks @abidlabs!
  • #7706 bc61ff6 - Several fixes to gr.load. Thanks @abidlabs!
  • #7733 7f9b291 - Cast button value as string in postprocess. Thanks @heaversm!
  • #7691 84f81fe - Fix race condition between state updates and loading_status updates. Thanks @aliabid94!
  • #7709 f67759d - Fix wasm_proxied_mount_css to not reuse an existing style element. Thanks @whitphx!
  • #7703 598ad7b - fix dev mode. Thanks @pngwn!
  • #7707 28342a2 - Fix httpx timeout issues. Thanks @freddyaboulton!

4.21.0

Features

  • #7577 7c66a29 - Fix the Lite custom element to initialize the app in the connected callback and dispose the app in the disconnected callback. Thanks @whitphx!
  • #7620 1a4b089 - Refactor example_inputs(), separating its logic into two separate methods: example_payload() and example_value(). Thanks @abidlabs!
  • #7265 6ebf0ce - Add support for diffuser pipelines in gr.Interface.from_pipeline(). Thanks @shubhamofbce!
  • #7650 048364c - downgrade contourpy. Thanks @abidlabs!
  • #7571 2edba13 - Fix CrossOriginWorkerMaker to cache the blob URL. Thanks @whitphx!

Fixes

  • #7643 9482c7a - fix: redundant meta tags that are unwanted. Thanks @qkdxorjs1002!
  • #7628 ba8cc48 - feature detect CSSStylesheet. Thanks @pngwn!
  • #7575 d0688b3 - Files should now be supplied as file(...) in the Client, and some fixes to gr.load() as well. Thanks @abidlabs!
  • #7624 a22f3e0 - Fixing root path issue with subpath being repeated twice. Thanks @abidlabs!
  • #7638 b3b0ea3 - Add —python-path, —pip-path, —gradio-path CLI arguments to let custom component developers control which executable is used. Thanks @freddyaboulton!
  • #7618 0ae1e44 - Control which files get moved to cache with gr.set_static_paths. Thanks @freddyaboulton!
  • #7641 cb3999e - Use x-forwarded-host header to determine the root url, and let users provide a full root_path to override the automatically determined root url. Thanks @abidlabs!

4.20.1

Features

4.20.0

Features

Fixes

4.19.2

Features

Fixes

4.19.1

Features

Fixes

4.19.0

Features

Fixes

4.18.0

Features

Fixes

4.17.0

Features

Fixes

4.16.0

Features

Fixes

4.15.0

Highlights

Custom component documentation generator (#7030 3a944ed)

If your custom component has type hints and docstrings for both parameters and return values, you can now automatically generate a documentation page and README.md with no additional effort. Simply run the following command:

gradio cc docs

This will generate a Gradio app that you can upload to spaces providing rich documentation for potential users. The documentation page includes:

  • Installation instructions.
  • A live embedded demo and working code snippet, pulled from your demo app.
  • An API reference for initialising the component, with types, default values and descriptions.
  • An explanation of how the component affects the user’s predict function inputs and outputs.
  • Any additional interfaces or classes that are necessary to understand the API reference.
  • Optional links to GitHub, PyPi, and Hugging Face Spaces.

A README will also be generated detailing the same information but in a format that is optimised for viewing on GitHub or PyPi!

Thanks @pngwn!

Features

Fixes

4.14.0

Features

Fixes

4.13.0

Features

Fixes

4.12.0

Features

Fixes

4.11.0

Features

Fixes

4.10.0

Features

Fixes

  • #6799 c352811 - Adds docstrings for gr.WaveformOptions, gr.Brush, and gr.Eraser, fixes examples for ImageEditor, and allows individual images to be used as the initial value for ImageEditor. Thanks @abidlabs!
  • #6808 6b130e2 - Ensure LoginButton value text is displayed. Thanks @hannahblair!
  • #6810 526fb6c - Fix gr.load() so that it works with the SSE v1 protocol. Thanks @abidlabs!

4.9.1

Features

Fixes

4.9.0

Features

Fixes

4.8.0

Features

Fixes

4.7.1

Features

Fixes

4.6.0

Features

Fixes

4.5.0

Highlights

New ImageEditor component (#6169 9caddc17b)

A brand new component, completely separate from Image that provides simple editing capabilities.

  • Set background images from file uploads, webcam, or just paste!
  • Crop images with an improved cropping UI. App authors can event set specific crop size, or crop ratios (1:1, etc)
  • Paint on top of any image (or no image) and erase any mistakes!
  • The ImageEditor supports layers, confining draw and erase actions to that layer.
  • More flexible access to data. The image component returns a composite image representing the final state of the canvas as well as providing the background and all layers as individual images.
  • Fully customisable. All features can be enabled and disabled. Even the brush color swatches can be customised.

def fn(im):
    im["composite"] # the full canvas
    im["background"] # the background image
    im["layers"] # a list of individual layers


im = gr.ImageEditor(
    # decide which sources you'd like to accept
    sources=["upload", "webcam", "clipboard"],
    # set a cropsize constraint, can either be a ratio or a concrete [width, height]
    crop_size="1:1",
    # enable crop (or disable it)
    transforms=["crop"],
    # customise the brush
    brush=Brush(
      default_size="25", # or leave it as 'auto'
      color_mode="fixed", # 'fixed' hides the user swatches and colorpicker, 'defaults' shows it
      default_color="hotpink", # html names are supported
      colors=[
        "rgba(0, 150, 150, 1)", # rgb(a)
        "#fff", # hex rgb
        "hsl(360, 120, 120)" # in fact any valid colorstring
      ]
    ),
    brush=Eraser(default_size="25")
)

Thanks @pngwn!

Fixes

  • #6497 1baed201b - Fix SourceFileReloader to watch the module with a qualified name to avoid importing a module with the same name from a different path. Thanks @whitphx!
  • #6502 070f71c93 - Ensure image editor crop and draw cursor works as expected when the scroll position changes. Thanks @pngwn!

4.4.1

Features

4.4.0

Features

Fixes

  • #6441 2f805a7dd - Small but important bugfixes for gr.Image: The upload event was not triggering at all. The paste-from-clipboard was not triggering an upload event. The clear button was not triggering a change event. The change event was triggering infinitely. Uploaded images were not preserving their original names. Uploading a new image should clear out the previous image. Thanks @freddyaboulton!
  • #6454 2777f326e - Ensure Audio ouput events are dispatched. Thanks @hannahblair!
  • #6254 f816136a0 - Add volume control to Audio. Thanks @hannahblair!
  • #6457 d00fcf89d - Gradio custom component dev mode now detects changes to Example.svelte file. Thanks @freddyaboulton!
  • #6418 bce6ca109 - Send more than one heartbeat message. Thanks @freddyaboulton!
  • #6425 b3ba17dd1 - Update the selected indices in Dropdown when value changes programmatically. Thanks @abidlabs!

4.3.0

Features

Fixes

4.2.0

Features

Fixes

4.1.2

Features

Fixes

4.1.1

Fixes

4.1.0

Features

Fixes

4.0.2

Fixes

4.0.1

Features

4.0.0

Highlights

4.0 is a big release, so here are the main highlights:

1. Custom Components: We’ve introduced the ability to create and publish you own custom gradio components. A custom Gradio component is a combination of Python and JavaScript (specifically, Svelte) that you can write to fully customize a Gradio component. A custom component can be used just like a regular Gradio component (with gr.Interface, gr.Blocks, etc.) and can be published so that other users can use it within their apps. To get started with Custom Components, read our quickstart guide here.

2. Redesigned Media Components and Accessibility:

We redesigned our media components (gr.Audio, gr.Image, and gr.Video) from scratch and improved accessibilty across the board. All components are now keyboard navigable and include better colors to be usable by a wider audience.

3. Server Side Events:

Gradio’s built-in queuing system is now the default for every Gradio app. We now use Server Side Events instead of Websockets for the queue. SSE means everything is served over HTTP and has better device support and better scaling than websockets.

4. Custom Share Servers:

Gradio share links can now run on custom domains. You can now set up your own server to serve Gradio share links. To get started, read our guide here.

  1. We now support adding arbitrary JS to your apps using the js parameter in Blocks, and arbitrary modifications to the of your app using the head parameter in Blocks

  2. We no longer expose a user’s working directory by default when you release a Gradio app. There are some other improvements around security as well.

  3. Previously, a Gradio app’s API endpoints were exposed, allowing you to bypass the queue. As a Gradio developer, you needed to set api_open=False to prevent this misuse. We’ve now made this the default.

  4. You can now control whether a user should be able to trigger the same event multiple times (by using the trigger_mode parameter of each event)

  5. You now have fine-grained control over how many times each event can be running concurrently in the backend (using the concurrency_limit parameter of each event)

  6. We no longer serialize images into base64 before sending them to the server or on the way back. This should make any Gradio app that includes gr.Image components much faster.

Breaking Changes

Gradio 4.0 is a new major version, and includes breaking changes from 3.x. Here’s a list of all the breaking changes, along with migration steps where appropriate.

Components:

  • Removes **kwarg from every component, meaning that components cannot accept arbitrary (unused) parameters. Previously, warnings would be thrown.
  • Removes deprecated parameters. For example, plain is no longer an alias for secondary for the variant argument in the gr.Button class
  • Removes the deprecated Carousel class and StatusTracker class and Box layout class
  • Removes the deprecated Variable alias for State
  • Removes the deprecated .style() methods from component classes
  • Removes the deprecated .update() method from component classes
  • Removes get_interpretation_neighbors() and get_interpretation_scores() from component classes
  • Removes deprecation.py — this was designed for internal usage so unlikely to break gradio apps
  • Moves save to cache methods from component methods to standalone functions in processing_utils
  • Renames source param in gr.Audio and gr.Video to sources
  • Removes show_edit_button param from gr.Audio
  • The tool= argument in gr.Image() has been removed. As of gradio==4.5.0, we have a new gr.ImageEditor component that takes its place. The ImageEditor component is a streamlined component that allows you to do basic manipulation of images. It supports setting a background image (which can be uploaded, pasted, or recorded through a webcam), as well the ability to “edit” the background image by using a brush to create strokes and an eraser to erase strokes in layers on top of the background image. See the Migrating to Gradio 4.0 section below.

Other changes related to the gradio library:

  • Removes the deprecated status_tracker parameter from events
  • Removes the deprecated HuggingFaceDatasetJSONSaver class
  • Now Blocks.load() can only be use an is instance method to attach an event that runs when the page loads. To use the class method, use gr.load() instead
  • Similarly, Interface.load() has been removed
  • If you are runnin Gradio 4.x, you can not gr.load a Space that is running Gradio 3.x. However, you can still use the client libraries (see changes to the client libraries below).
  • Removes deprecated parameters, such as enable_queue from launch()
  • Many of the positional arguments in launch() are now keyword only, and show_tips has been removed
  • Changes the format of flagged data to json instead of filepath for media and chatbot
  • Removes gr.Series and gr.Parallel
  • All API endpoints are named by deafult. If api_name=None, the api name is the name of the python function.

Changes related to the Client libraries:

  • When using the gradio Client libraries in 3.x with any component that returned JSON data (including gr.Chatbot, gr.Label, and gr.JSON), the data would get saved to a file and the filepath would be returned. Similarly, you would have to pass input JSON as a filepath. Now, the JSON data is passed and returned directly, making it easier to work with these components using the clients.

Migrating to Gradio 4.0

Here are some concrete tips to help migrate to Gradio 4.0:

Using allowed_paths

Since the working directory is now not served by default, if you reference local files within your CSS or in a gr.HTML component using the /file= route, you will need to explicitly allow access to those files (or their parent directories) using the allowed_paths parameter in launch()

For example, if your code looks like this:

import gradio as gr

with gr.Blocks() as demo:
    gr.HTML("<img src='/file=image.png' alt='image One'>")
    
demo.launch()

In order for the HTML component to be able to serve image.png, you will need to add image.png in allowed_paths like this:

import gradio as gr

with gr.Blocks() as demo:
    gr.HTML("<img src='/file=image.png' alt='image One'>")
    
demo.launch(allowed_paths=["image.png"])

or if you want to expose all files in your working directory as was the case in Gradio 3.x (not recommended if you plan to share your app with others), you could do:

import gradio as gr

with gr.Blocks() as demo:
    gr.HTML("<img src='/file=image.png' alt='image One'>")
    
demo.launch(allowed_paths=["."])

Using concurrency_limit instead of concurrency_count

Previously, in Gradio 3.x, there was a single global concurrency_count parameter that controlled how many threads could execute tasks from the queue simultaneously. By default concurrency_count was 1, which meant that only a single event could be executed at a time (to avoid OOM errors when working with prediction functions that utilized a large amount of memory or GPU usage). You could bypass the queue by setting queue=False.

In Gradio 4.0, the concurrency_count parameter has been removed. You can still control the number of total threads by using the max_threads parameter. The default value of this parameter is 40, but you don’t have worry (as much) about OOM errors, because even though there are 40 threads, we use a single-worker-single-event model, which means each worker thread only executes a specific function. So effectively, each function has its own “concurrency count” of 1. If you’d like to change this behavior, you can do so by setting a parameter concurrency_limit, which is now a parameter of each event, not a global parameter. By default this is 1 for each event, but you can set it to a higher value, or to None if you’d like to allow an arbitrary number of executions of this event simultaneously. Events can also be grouped together using the concurrency_id parameter so that they share the same limit, and by default, events that call the same function share the same concurrency_id.

Lastly, it should be noted that the default value of the concurrency_limit of all events in a Blocks (which is normally 1) can be changed using the default_concurrency_limit parameter in Blocks.queue(). You can set this to a higher integer or to None. This in turn sets the concurrency_limit of all events that don’t have an explicit conurrency_limit specified.

To summarize migration:

  • For events that execute quickly or don’t use much CPU or GPU resources, you should set concurrency_limit=None in Gradio 4.0. (Previously you would set queue=False.)
  • For events that take significant resources (like the prediction function of your machine learning model), and you only want 1 execution of this function at a time, you don’t have to set any parameters.
  • For events that take significant resources (like the prediction function of your machine learning model), and you only want X executions of this function at a time, you should set concurrency_limit=X parameter in the event trigger.(Previously you would set a global concurrency_count=X.)

The new ImageEditor component

In Gradio 4.0, the tool= argument in gr.Image() was removed. It has been replaced, as of Gradio 4.5.0, with a new gr.ImageEditor() component. The ImageEditor component is a streamlined component that allows you to do basic manipulation of images. It supports setting a background image (which can be uploaded, pasted, or recorded through a webcam), as well the ability to “edit” the background by using a brush to create strokes and an eraser to erase strokes in layers on top of the background image.

The ImageEditor component is much more performant and also offers much more flexibility to customize the component, particularly through the new brush and eraser arguments, which take Brush and Eraser objects respectively.

Here are some examples of how you might migrate from Image(tool=...) to gr.ImageEditor().

  • To create a sketchpad input that supports writing black strokes on a white background, you might have previously written:
gr.Image(source="canvas", tools="sketch")

Now, you should write:

gr.ImageEditor(sources=(), brush=gr.Brush(colors=["#000000"]))

Note: you can supply a list of supported stroke colors in gr.Brush, as well as control whether users can choose their own colors by setting the color_mode parameter of gr.Brush to be either "fixed" or "defaults".

  • If you want to create a sketchpad where users can draw in any color, simply omit the brush parameter. In other words, where previously, you would do:
gr.Image(source="canvas", tools="color-sketch")

Now, you should write:

gr.ImageEditor(sources=())
  • If you want to allow users to choose a background image and then draw on the image, previously, you would do:
gr.Image(source="upload", tools="color-sketch")

Now, this is the default behavior of the ImageEditor component, so you should just write:

gr.ImageEditor()

Unlike the Image component, which passes the input image as a single value into the prediction function, the ImageEditor passes a dictionary consisting of three key-value pairs:

  • the key "background", whose value is the background image
  • the key "layers", which consists of a list of values, with the strokes in each layer corresponding to one list element.
  • the key "composite", whose value is to the complete image consisting of background image and all of the strokes.

The type of each value can be set by the type parameter ("filepath", "pil", or "numpy", with the default being "numpy"), just like in the Image component.

Please see the documentation of the gr.ImageEditor component for more details: https://www.gradio.app/docs/imageeditor

Features

Fixes

3.45.0-beta.13

Features

3.45.0-beta.12

Features

Fixes

3.48.0

Features

Fixes

3.47.1

Fixes

3.47.0

Highlights

new FileExplorer component (#5672 e4a307ed6)

Thanks to a new capability that allows components to communicate directly with the server without passing data via the value, we have created a new FileExplorer component.

This component allows you to populate the explorer by passing a glob, but only provides the selected file(s) in your prediction function.

Users can then navigate the virtual filesystem and select files which will be accessible in your predict function. This component will allow developers to build more complex spaces, with more flexible input options.

output

For more information check the FileExplorer documentation.

Thanks @aliabid94!

Features

Fixes

3.46.1

Features

Fixes

3.46.0

Features

Fixes

3.45.2

Features

Fixes

3.45.1

Fixes

3.45.0

Features

Fixes

3.44.4

Features

Fixes

3.44.3

Fixes

3.44.2

Fixes

3.44.1

Fixes

3.44.0

Features

Fixes

3.43.2

Fixes

3.43.1

Fixes

3.43.0

Features

Fixes

3.42.0

Highlights

Like/Dislike Button for Chatbot (#5391 abf1c57d)

Thanks @dawoodkhan82!

Added the ability to attach event listeners via decorators (#5395 55fed04f)

e.g.

with gr.Blocks() as demo:
    name = gr.Textbox(label="Name")
    output = gr.Textbox(label="Output Box")
    greet_btn = gr.Button("Greet")

    @greet_btn.click(inputs=name, outputs=output)
    def greet(name):
        return "Hello " + name + "!"

Thanks @aliabid94!

Features

Fixes

3.41.2

Features

  • #5284 5f25eb68 - Minor bug fix sweep. Thanks @aliabid94!/n - Our use of exit was catching errors and corrupting the traceback of any component that failed to instantiate (try running blocks_kitchen_sink off main for an example). Now the exit exits immediately if there’s been an exception, so the original exception can be printed cleanly/n - HighlightedText was rendering weird, cleaned it up

Fixes

3.41.1

Fixes

3.41.0

Highlights

Improve startup performance and markdown support (#5279 fe057300)

Improved markdown support

We now have better support for markdown in gr.Markdown and gr.Dataframe. Including syntax highlighting and Github Flavoured Markdown. We also have more consistent markdown behaviour and styling.

Various performance improvements

These improvements will be particularly beneficial to large applications.

  • Rather than attaching events manually, they are now delegated, leading to a significant performance improvement and addressing a performance regression introduced in a recent version of Gradio. App startup for large applications is now around twice as fast.

  • Optimised the mounting of individual components, leading to a modest performance improvement during startup (~30%).

  • Corrected an issue that was causing markdown to re-render infinitely.

  • Ensured that the gr.3DModel does re-render prematurely.

    Thanks @pngwn!

Enable streaming audio in python client (#5248 390624d8)

The gradio_client now supports streaming file outputs 🌊

No new syntax! Connect to a gradio demo that supports streaming file outputs and call predict or submit as you normally would.

import gradio_client as grc
client = grc.Client("gradio/stream_audio_out")

# Get the entire generated audio as a local file
client.predict("/Users/freddy/Pictures/bark_demo.mp4", api_name="/predict")

job = client.submit("/Users/freddy/Pictures/bark_demo.mp4", api_name="/predict")

# Get the entire generated audio as a local file
job.result()

# Each individual chunk
job.outputs()

Thanks @freddyaboulton!

Add render function to <gradio-app> (#5158 804fcc05)

We now have an event render on the web component, which is triggered once the embedded space has finished rendering.

<script>
	function handleLoadComplete() {
		console.log("Embedded space has finished rendering");
	}
	const gradioApp = document.querySelector("gradio-app");
	gradioApp.addEventListener("render", handleLoadComplete);
</script>

Thanks @hannahblair!

Features

Fixes

3.40.0

Highlights

Client.predict will now return the final output for streaming endpoints (#5057 35856f8b)

This is a breaking change (for gradio_client only)!

Previously, Client.predict would only return the first output of an endpoint that streamed results. This was causing confusion for developers that wanted to call these streaming demos via the client.

We realize that developers using the client don’t know the internals of whether a demo streams or not, so we’re changing the behavior of predict to match developer expectations.

Using Client.predict will now return the final output of a streaming endpoint. This will make it even easier to use gradio apps via the client.

Thanks @freddyaboulton!

Gradio now supports streaming audio outputs

Allows users to use generators to stream audio out, yielding consecutive chunks of audio. Requires streaming=True to be set on the output audio.

import gradio as gr
from pydub import AudioSegment

def stream_audio(audio_file):
    audio = AudioSegment.from_mp3(audio_file)
    i = 0
    chunk_size = 3000
    
    while chunk_size*i < len(audio):
        chunk = audio[chunk_size*i:chunk_size*(i+1)]
        i += 1
        if chunk:
            file = f"/tmp/{i}.mp3"
            chunk.export(file, format="mp3")            
            yield file
        
demo = gr.Interface(
    fn=stream_audio,
    inputs=gr.Audio(type="filepath", label="Audio file to stream"),
    outputs=gr.Audio(autoplay=True, streaming=True),
)

demo.queue().launch()

From the backend, streamed outputs are served from the /stream/ endpoint instead of the /file/ endpoint. Currently just used to serve audio streaming output. The output JSON will have is_stream: true, instead of is_file: true in the file data object. Thanks @aliabid94!

Features

Fixes

3.39.0

Highlights

Create Discord Bots from Gradio Apps 🤖 (#4960 46e4ef67)

We’re excited to announce that Gradio can now automatically create a discord bot from any gr.ChatInterface app.

It’s as easy as importing gradio_client, connecting to the app, and calling deploy_discord!

🦙 Turning Llama 2 70b into a discord bot 🦙

import gradio_client as grc
grc.Client("ysharma/Explore_llamav2_with_TGI").deploy_discord(to_id="llama2-70b-discord-bot")

Getting started with template spaces

To help get you started, we have created an organization on Hugging Face called gradio-discord-bots with template spaces you can use to turn state of the art LLMs powered by Gradio to discord bots.

Currently we have template spaces for:

But once again, you can deploy ANY gr.ChatInterface app exposed on the internet! So don’t hesitate to try it on your own Chatbots.

❗️ Additional Note ❗️: Technically, any gradio app that exposes an api route that takes in a single string and outputs a single string can be deployed to discord. But gr.ChatInterface apps naturally lend themselves to discord’s chat functionality so we suggest you start with those.

Thanks @freddyaboulton!

Features

Fixes

3.38

New Features:

  • Provide a parameter animate (False by default) in gr.make_waveform() which animates the overlayed waveform by @dawoodkhan82 in PR 4918
  • Add show_download_button param to allow the download button in static Image components to be hidden by @hannahblair in PR 4959
  • Added autofocus argument to Textbox by @aliabid94 in PR 4978
  • The gr.ChatInterface UI now converts the “Submit” button to a “Stop” button in ChatInterface while streaming, which can be used to pause generation. By @abidlabs in PR 4971.
  • Add a border_color_accent_subdued theme variable to add a subdued border color to accented items. This is used by chatbot user messages. Set the value of this variable in Default theme to *primary_200. By @freddyaboulton in PR 4989
  • Add default sketch color argument brush_color. Also, masks drawn on images are now slightly translucent (and mask color can also be set via brush_color). By @aliabid94 in PR 4979

Bug Fixes:

  • Fixes cancels for generators so that if a generator is canceled before it is complete, subsequent runs of the event do not continue from the previous iteration, but rather start from the beginning. By @abidlabs in PR 4969.
  • Use gr.State in gr.ChatInterface to reduce latency by @freddyaboulton in PR 4976
  • Fix bug with gr.Interface where component labels inferred from handler parameters were including special args like gr.Request or gr.EventData. By @cbensimon in PR 4956

Other Changes:

3.37

New Features:

Introducing a new gr.ChatInterface abstraction, which allows Gradio users to build fully functioning Chat interfaces very easily. The only required parameter is a chat function fn, which accepts a (string) user input message and a (list of lists) chat history and returns a (string) response. Here’s a toy example:

import gradio as gr

def echo(message, history):
    return message

demo = gr.ChatInterface(fn=echo, examples=["hello", "hola", "merhaba"], title="Echo Bot")
demo.launch()

Which produces:

image

And a corresponding easy-to-use API at /chat:

image

The gr.ChatInterface abstraction works nicely with various LLM libraries, such as langchain. See the dedicated guide for more examples using gr.ChatInterface. Collective team effort in PR 4869

  • Chatbot messages now show hyperlinks to download files uploaded to gr.Chatbot() by @dawoodkhan82 in PR 4848
  • Cached examples now work with generators and async generators by @abidlabs in PR 4927
  • Add RTL support to gr.Markdown, gr.Chatbot, gr.Textbox (via the rtl boolean parameter) and text-alignment to gr.Textbox(via the string text_align parameter) by @abidlabs in PR 4933

Examples of usage:

with gr.Blocks() as demo:
    gr.Textbox(interactive=True, text_align="right")
demo.launch()
with gr.Blocks() as demo:
    gr.Markdown("سلام", rtl=True)
demo.launch()
  • The get_api_info method of Blocks now supports layout output components @freddyaboulton in PR 4871

  • Added the support for the new command gradio environmentto make it easier for people to file bug reports if we shipped an easy command to list the OS, gradio version, and versions of gradio/gradio-client dependencies. bu @varshneydevansh in PR 4915.

Bug Fixes:

  • The .change() event is fixed in Video and Image so that it only fires once by @abidlabs in PR 4793
  • The .change() event is fixed in Audio so that fires when the component value is programmatically updated by @abidlabs in PR 4793
  • Add missing display: flex property to Row so that flex styling is applied to children by [@hannahblair] in PR 4896
  • Fixed bug where gr.Video could not preprocess urls by @freddyaboulton in PR 4904
  • Fixed copy button rendering in API page on Safari by @aliabid94 in PR 4924
  • Fixed gr.Group and container=False. container parameter only available for Textbox, Number, and Dropdown, the only elements where it makes sense. By @aliabid94 in PR 4916
  • Fixed broken image link in auto-generated app.py from ThemeClass.push_to_hub by @deepkyu in PR 4944

Other Changes:

  • Warning on mobile that if a user leaves the tab, websocket connection may break. On broken connection, tries to rejoin queue and displays error conveying connection broke. By @aliabid94 in PR 4742
  • Remove blocking network calls made before the local URL gets printed - these slow down the display of the local URL, especially when no internet is available. @aliabid94 in PR 4905.
  • Pinned dependencies to major versions to reduce the likelihood of a broken gradio due to changes in downstream dependencies by @abidlabs in PR 4885
  • Queue max_size defaults to parent Blocks max_thread when running on Spaces with ZeroGPU hardware. By @cbensimon in PR 4937

Breaking Changes:

Motivated by the release of pydantic==2.0, which included breaking changes that broke a large number of Gradio apps, we’ve pinned many gradio dependencies. Note that pinned dependencies can cause downstream conflicts, so this may be a breaking change. That being said, we’ve kept the pins pretty loose, and we’re expecting change to be better for the long-term stability of Gradio apps.

3.36.1

New Features:

Bug Fixes:

  • Fix bug where gr.File change event was not triggered when the value was changed by another event by @freddyaboulton in PR 4811

3.36.0

New Features:

  • The gr.Video, gr.Audio, gr.Image, gr.Chatbot, and gr.Gallery components now include a share icon when deployed on Spaces. This behavior can be modified by setting the show_share_button parameter in the component classes. by @aliabid94 in PR 4651
  • Allow the web component space, src, and host attributes to be updated dynamically by @pngwn in PR 4461
  • Suggestion for Spaces Duplication built into Gradio, by @aliabid94 in PR 4458
  • The api_name parameter now accepts False as a value, which means it does not show up in named or unnamed endpoints. By @abidlabs in PR 4683
  • Added support for pathlib.Path in gr.Video, gr.Gallery, and gr.Chatbot by sunilkumardash9 in PR 4581.

Bug Fixes:

  • Updated components with info attribute to update when update() is called on them. by @jebarpg in PR 4715.
  • Ensure the Image components undo button works mode is mask or color-sketch by @amyorz in PR 4692
  • Load the iframe resizer external asset asynchronously, by @akx in PR 4336
  • Restored missing imports in gr.components by @abidlabs in PR 4566
  • Fix bug where select event was not triggered in gr.Gallery if height was set to be large with allow_preview=False by @freddyaboulton in PR 4551
  • Fix bug where setting visible=False in gr.Group event did not work by @abidlabs in PR 4567
  • Fix make_waveform to work with paths that contain spaces @akx in PR 4570 & PR 4578
  • Send captured data in stop_recording event for gr.Audio and gr.Video components by @freddyaboulton in PR 4554
  • Fix bug in gr.Gallery where height and object_fit parameters where being ignored by @freddyaboulton in PR 4576
  • Fixes an HTML sanitization issue in DOMPurify where links in markdown were not opening in a new window by [@hannahblair] in PR 4577
  • Fixed Dropdown height rendering in Columns by @aliabid94 in PR 4584
  • Fixed bug where AnnotatedImage css styling was causing the annotation masks to not be displayed correctly by @freddyaboulton in PR 4628
  • Ensure that Gradio does not silently fail when running on a port that is occupied by @abidlabs in PR 4624.
  • Fix double upload bug that caused lag in file uploads by @aliabid94 in PR 4661
  • Progress component now appears even when no iterable is specified in tqdm constructor by @itrushkin in PR 4475
  • Deprecation warnings now point at the user code using those deprecated features, instead of Gradio internals, by (https://github.com/akx) in PR 4694
  • Adapt column widths in gr.Examples based on content by @pngwn & @dawoodkhan82 in PR 4700
  • The plot parameter deprecation warnings should now only be emitted for Image components by @freddyaboulton in PR 4709
  • Removed uncessessary type deprecation warning by @freddyaboulton in PR 4709
  • Ensure Audio autoplays works when autoplay=True and the video source is dynamically updated @pngwn in PR 4705
  • When an error modal is shown in spaces, ensure we scroll to the top so it can be seen by @pngwn in PR 4712
  • Update depedencies by @pngwn in PR 4675
  • Fixes gr.Dropdown being cutoff at the bottom by @abidlabs in PR 4691.
  • Scroll top when clicking “View API” in spaces by @pngwn in PR 4714
  • Fix bug where show_label was hiding the entire component for gr.Label by @freddyaboulton in PR 4713
  • Don’t crash when uploaded image has broken EXIF data, by @akx in PR 4764
  • Place toast messages at the top of the screen by @pngwn in PR 4796
  • Fix regressed styling of Login page when auth is enabled by @freddyaboulton in PR 4797
  • Prevent broken scrolling to output on Spaces by @aliabid94 in PR 4822

Other Changes:

  • Add .git-blame-ignore-revs by @akx in PR 4586
  • Update frontend dependencies in PR 4601
  • Use typing.Literal where possible in gradio library and client by @freddyaboulton in PR 4608
  • Remove unnecessary mock json files for frontend E2E tests by @dawoodkhan82 in PR 4625
  • Update dependencies by @pngwn in PR 4643
  • The theme builder now launches successfully, and the API docs are cleaned up. By @abidlabs in PR 4683
  • Remove cleared_value from some components as its no longer used internally by @freddyaboulton in PR 4685
  • Better errors when you define two Blocks and reference components in one Blocks from the events in the other Blocks @abidlabs in PR 4738.
  • Better message when share link is not created by @abidlabs in PR 4773.
  • Improve accessibility around selected images in gr.Gallery component by @hannahblair in PR 4790

Breaking Changes:

PR 4683 removes the explict named endpoint “load_examples” from gr.Interface that was introduced in PR 4456.

3.35.2

Bug Fixes:

3.35.1

Bug Fixes:

3.35.0

New Features:

  • A gr.ClearButton which allows users to easily clear the values of components by @abidlabs in PR 4456

Example usage:

import gradio as gr

with gr.Blocks() as demo:
    chatbot = gr.Chatbot([("Hello", "How are you?")])
    with gr.Row():
        textbox = gr.Textbox(scale=3, interactive=True)
        gr.ClearButton([textbox, chatbot], scale=1)

demo.launch()
  • Min and max value for gr.Number by @artegoser and @dawoodkhan82 in PR 3991
  • Add start_recording and stop_recording events to Video and Audio components by @pngwn in PR 4422
  • Allow any function to generate an error message and allow multiple messages to appear at a time. Other error modal improvements such as auto dismiss after a time limit and a new layout on mobile @pngwn in PR 4459.
  • Add autoplay kwarg to Video and Audio components by @pngwn in PR 4453
  • Add allow_preview parameter to Gallery to control whether a detailed preview is displayed on click by @freddyaboulton in PR 4470
  • Add latex_delimiters parameter to Chatbot to control the delimiters used for LaTeX and to disable LaTeX in the Chatbot by @dawoodkhan82 in PR 4516
  • Can now issue gr.Warning and gr.Info modals. Simply put the code gr.Warning("Your warning message") or gr.Info("Your info message") as a standalone line in your function. By @aliabid94 in PR 4518.

Example:

def start_process(name):
    gr.Info("Starting process")
    if name is None:
        gr.Warning("Name is empty")
    ...
    if success == False:
        raise gr.Error("Process failed")

Bug Fixes:

  • Add support for PAUSED state in the JS client by @abidlabs in PR 4438
  • Ensure Tabs only occupy the space required by @pngwn in PR 4419
  • Ensure components have the correct empty sizes to prevent empty containers from collapsing by @pngwn in PR 4447.
  • Frontend code no longer crashes when there is a relative URL in an <a> element, by @akx in PR 4449.
  • Fix bug where setting format='mp4' on a video component would cause the function to error out if the uploaded video was not playable by @freddyaboulton in PR 4467
  • Fix _js parameter to work even without backend function, by @aliabid94 in PR 4486.
  • Fix new line issue with gr.Chatbot() by @dawoodkhan82 in PR 4491
  • Fixes issue with Clear button not working for Label component by @abidlabs in PR 4456
  • Restores the ability to pass in a tuple (sample rate, audio array) to gr.Audio() by @abidlabs in PR 4525
  • Ensure code is correctly formatted and copy button is always present in Chatbot by @pngwn in PR 4527
  • show_label will not automatically be set to True in gr.BarPlot.update by @freddyaboulton in PR 4531
  • gr.BarPlot group text now respects darkmode by @freddyaboulton in PR 4531
  • Fix dispatched errors from within components @aliabid94 in PR 4786

Other Changes:

Breaking Changes:

  • The behavior of the Clear button has been changed for Slider, CheckboxGroup, Radio, Dropdown components by @abidlabs in PR 4456. The Clear button now sets the value of these components to be empty as opposed to the original default set by the developer. This is to make them in line with the rest of the Gradio components.
  • Python 3.7 end of life is June 27 2023. Gradio will no longer support python 3.7 by @freddyaboulton in PR 4484
  • Removed $ as a default LaTeX delimiter for the Chatbot by @dawoodkhan82 in PR 4516. The specific LaTeX delimeters can be set using the new latex_delimiters parameter in Chatbot.

3.34.0

New Features:

  • The gr.UploadButton component now supports the variant and interactive parameters by @abidlabs in PR 4436.

Bug Fixes:

  • Remove target=”_blank” override on anchor tags with internal targets by @hannahblair in PR 4405
  • Fixed bug where gr.File(file_count='multiple') could not be cached as output by @freddyaboulton in PR 4421
  • Restricts the domains that can be proxied via /proxy route by @abidlabs in PR 4406.
  • Fixes issue where gr.UploadButton could not be used to upload the same file twice by @dawoodkhan82 in PR 4437
  • Fixes bug where /proxy route was being incorrectly constructed by the frontend by @abidlabs in PR 4430.
  • Fix z-index of status component by @hannahblair in PR 4429
  • Fix video rendering in Safari by @aliabid94 in PR 4433.
  • The output directory for files downloaded when calling Blocks as a function is now set to a temporary directory by default (instead of the working directory in some cases) by @abidlabs in PR 4501

Other Changes:

  • When running on Spaces, handler functions will be transformed by the PySpaces library in order to make them work with specific hardware. It will have no effect on standalone Gradio apps or regular Gradio Spaces and can be globally deactivated as follows : import spaces; spaces.disable_gradio_auto_wrap() by @cbensimon in PR 4389.
  • Deprecated .style parameter and moved arguments to constructor. Added support for .update() to all arguments initially in style. Added scale and min_width support to every Component. By @aliabid94 in PR 4374

3.33.1

Bug Fixes:

Other Changes:

  • More explicit error message when share link binary is blocked by antivirus by @abidlabs in PR 4380.

3.33.0

New Features:

  • Introduced gradio deploy to launch a Gradio app to Spaces directly from your terminal. By @aliabid94 in PR 4033.
  • Introduce show_progress='corner' argument to event listeners, which will not cover the output components with the progress animation, but instead show it in the corner of the components. By @aliabid94 in PR 4396.

Bug Fixes:

  • Fix bug where Label change event was triggering itself by @freddyaboulton in PR 4371
  • Make Blocks.load behave like other event listeners (allows chaining then off of it) @anentropic in PR 4304
  • Respect interactive=True in output components of a gr.Interface by @abidlabs in PR 4356.
  • Remove unused frontend code by @akx in PR 4275
  • Fixes favicon path on Windows by @abidlabs in PR 4369.
  • Prevent path traversal in /file routes by @abidlabs in PR 4370.
  • Do not send HF token to other domains via /proxy route by @abidlabs in PR 4368.
  • Replace default markedjs sanitize function with DOMPurify sanitizer for gr.Chatbot() by @dawoodkhan82 in PR 4360
  • Prevent the creation of duplicate copy buttons in the chatbot and ensure copy buttons work in non-secure contexts by @binary-husky in PR 4350.

Other Changes:

  • Remove flicker of loading bar by adding opacity transition, by @aliabid94 in PR 4349.
  • Performance optimization in the frontend’s Blocks code by @akx in PR 4334
  • Upgrade the pnpm lock file format version from v6.0 to v6.1 by @whitphx in PR 4393

Breaking Changes:

  • The /file= route no longer allows accessing dotfiles or files in “dot directories” by @akx in PR 4303

3.32.0

New Features:

  • Interface.launch() and Blocks.launch() now accept an app_kwargs argument to allow customizing the configuration of the underlying FastAPI app, by @akx in PR 4282

Bug Fixes:

  • Fixed Gallery/AnnotatedImage components not respecting GRADIO_DEFAULT_DIR variable by @freddyaboulton in PR 4256
  • Fixed Gallery/AnnotatedImage components resaving identical images by @freddyaboulton in PR 4256
  • Fixed Audio/Video/File components creating empty tempfiles on each run by @freddyaboulton in PR 4256
  • Fixed the behavior of the run_on_click parameter in gr.Examples by @abidlabs in PR 4258.
  • Ensure error modal displays when the queue is enabled by @pngwn in PR 4273
  • Ensure js client respcts the full root when making requests to the server by @pngwn in PR 4271

Other Changes:

3.31.0

New Features:

Bug Fixes:

  • Fix “TypeError: issubclass() arg 1 must be a class” When use Optional[Types] by @lingfengchencn in PR 4200.
  • Gradio will no longer send any analytics or call home if analytics are disabled with the GRADIO_ANALYTICS_ENABLED environment variable. By @akx in PR 4194 and PR 4236
  • The deprecation warnings for kwargs now show the actual stack level for the invocation, by @akx in PR 4203.
  • Fix “TypeError: issubclass() arg 1 must be a class” When use Optional[Types] by @lingfengchencn in PR 4200.
  • Ensure cancelling functions work correctly by @pngwn in PR 4225
  • Fixes a bug with typing.get_type_hints() on Python 3.9 by @abidlabs in PR 4228.
  • Fixes JSONDecodeError by @davidai in PR 4241
  • Fix chatbot_dialogpt demo by @dawoodkhan82 in PR 4238.

Other Changes:

  • Change gr.Chatbot() markdown parsing to frontend using marked library and prism by @dawoodkhan82 in PR 4150
  • Update the js client by @pngwn in PR 3899
  • Fix documentation for the shape of the numpy array produced by the Image component by @der3318 in PR 4204.
  • Updates the timeout for websocket messaging from 1 second to 5 seconds by @abidlabs in PR 4235

3.30.0

New Features:

  • Adds a root_path parameter to launch() that allows running Gradio applications on subpaths (e.g. www.example.com/app) behind a proxy, by @abidlabs in PR 4133
  • Fix dropdown change listener to trigger on change when updated as an output by @aliabid94 in PR 4128.
  • Add .input event listener, which is only triggered when a user changes the component value (as compared to .change, which is also triggered when a component updates as the result of a function trigger), by @aliabid94 in PR 4157.

Bug Fixes:

3.29.0

New Features:

Bug Fixes:

Full Changelog:

  • Allow users to submit with enter in Interfaces with textbox / number inputs @aliabid94 in PR 4090.
  • Updates gradio’s requirements.txt to requires uvicorn>=0.14.0 by @abidlabs in PR 4086
  • Updates some error messaging by @abidlabs in PR 4086
  • Renames simplified Chinese translation file from zh-cn.json to zh-CN.json by @abidlabs in PR 4086

3.28.3

Bug Fixes:

3.28.2

Bug Fixes

New Features:

  • Add support for visual-question-answering, document-question-answering, and image-to-text using gr.Interface.load("models/...") and gr.Interface.from_pipeline by @osanseviero in PR 3887
  • Add code block support in gr.Chatbot(), by @dawoodkhan82 in PR 4048
  • Adds the ability to blocklist filepaths (and also improves the allowlist mechanism) by @abidlabs in PR 4047.
  • Adds the ability to specify the upload directory via an environment variable by @abidlabs in PR 4047.

Bug Fixes:

  • Fixes issue with matplotlib not rendering correctly if the backend was not set to Agg by @abidlabs in PR 4029
  • Fixes bug where rendering the same gr.State across different Interfaces/Blocks within larger Blocks would not work by @abidlabs in PR 4030
  • Code component visual updates by @pngwn in PR 4051

Documentation Changes:

  • Adds a Guide on how to use the Python Client within a FastAPI app, by @abidlabs in PR 3892

Breaking Changes:

  • gr.HuggingFaceDatasetSaver behavior changed internally. The flagging/ folder is not a .git/ folder anymore when using it. organization parameter is now ignored in favor of passing a full dataset id as dataset_name (e.g. "username/my-dataset").
  • New lines (\n) are not automatically converted to <br> in gr.Markdown() or gr.Chatbot(). For multiple new lines, a developer must add multiple <br> tags.

Full Changelog:

  • Safer version of gr.HuggingFaceDatasetSaver using HTTP methods instead of git pull/push by @Wauplin in PR 3973

3.28.1

New Features:

Bug Fixes:

Testing and Infrastructure Changes:

  • CI: Simplified Python CI workflow by @akx in PR 3982
  • Upgrade pyright to 1.1.305 by @akx in PR 4042
  • More Ruff rules are enabled and lint errors fixed by @akx in PR 4038

3.28.0

Bug Fixes:

  • Fix duplicate play commands in full-screen mode of ‘video’. by @tomchang25 in PR 3968.
  • Fix the issue of the UI stuck caused by the ‘selected’ of DataFrame not being reset. by @tomchang25 in PR 3916.
  • Fix issue where gr.Video() would not work inside a gr.Tab() by @dawoodkhan82 in PR 3891
  • Fixed issue with old_value check in File. by @tomchang25 in PR 3859.
  • Fixed bug where all bokeh plots appeared in the same div by @freddyaboulton in PR 3896
  • Fixed image outputs to automatically take full output image height, unless explicitly set, by @aliabid94 in PR 3905
  • Fix issue in gr.Gallery() where setting height causes aspect ratio of images to collapse by @dawoodkhan82 in PR 3830
  • Fix issue where requesting for a non-existing file would trigger a 500 error by @micky2be in [PR 3895](https://github.com/gradio-app/gradio/pull/3895).
  • Fix bugs with abspath about symlinks, and unresolvable path on Windows by @micky2be in [PR 3895](https://github.com/gradio-app/gradio/pull/3895).
  • Fixes type in client Status enum by @10zinten in PR 3931
  • Fix gr.ChatBot to handle image url tye-singwa in PR 3953
  • Move Google Tag Manager related initialization code to analytics-enabled block by @akx in PR 3956
  • Fix bug where port was not reused if the demo was closed and then re-launched by @freddyaboulton in PR 3896
  • Fixes issue where dropdown does not position itself at selected element when opened @dawoodkhan82 in PR 3639

Documentation Changes:

Testing and Infrastructure Changes:

  • CI: Python backend lint is only run once, by @akx in PR 3960
  • Format invocations and concatenations were replaced by f-strings where possible by @akx in PR 3984
  • Linting rules were made more strict and issues fixed by @akx in PR 3979.

Breaking Changes:

  • Some re-exports in gradio.themes utilities (introduced in 3.24.0) have been eradicated. By @akx in PR 3958

Full Changelog:

  • Add DESCRIPTION.md to image_segmentation demo by @aliabd in PR 3866
  • Fix error in running gr.themes.builder() by @deepkyu in PR 3869
  • Fixed a JavaScript TypeError when loading custom JS with _js and setting outputs to None in gradio.Blocks() by @DavG25 in PR 3883
  • Fixed bg_background_fill theme property to expand to whole background, block_radius to affect form elements as well, and added block_label_shadow theme property by @aliabid94 in PR 3590

3.27.0

New Features:

AnnotatedImage Component

New AnnotatedImage component allows users to highlight regions of an image, either by providing bounding boxes, or 0-1 pixel masks. This component is useful for tasks such as image segmentation, object detection, and image captioning.

AnnotatedImage screenshot

Example usage:

with gr.Blocks() as demo:
    img = gr.Image()
    img_section = gr.AnnotatedImage()
    def mask(img):
        top_left_corner = [0, 0, 20, 20]
        random_mask = np.random.randint(0, 2, img.shape[:2])
        return (img, [(top_left_corner, "left corner"), (random_mask, "random")])
    img.change(mask, img, img_section)

See the image_segmentation demo for a full example. By @aliabid94 in PR 3836

3.26.0

New Features:

Video component supports subtitles
  • Allow the video component to accept subtitles as input, by @tomchang25 in PR 3673. To provide subtitles, simply return a tuple consisting of (path_to_video, path_to_subtitles) from your function. Both .srt and .vtt formats are supported:
with gr.Blocks() as demo:
    gr.Video(("video.mp4", "captions.srt"))

Bug Fixes:

Documentation Changes:

3.25.0

New Features:

  • Improve error messages when number of inputs/outputs to event handlers mismatch, by @space-nuko in PR 3519

  • Add select listener to Images, allowing users to click on any part of an image and get the coordinates of the click by @aliabid94 in PR 3786.

with gr.Blocks() as demo:
    img = gr.Image()
    textbox = gr.Textbox()

    def select_handler(img, evt: gr.SelectData):
        selected_pixel = img[evt.index[1], evt.index[0]]
        return f"Selected pixel: {selected_pixel}"

    img.select(select_handler, img, textbox)

Recording 2023-04-08 at 17 44 39

Bug Fixes:

  • Increase timeout for sending analytics data by @dawoodkhan82 in PR 3647
  • Fix bug where http token was not accessed over websocket connections by @freddyaboulton in PR 3735
  • Add ability to specify rows, columns and object-fit in style() for gr.Gallery() component by @dawoodkhan82 in PR 3586
  • Fix bug where recording an audio file through the microphone resulted in a corrupted file name by @abidlabs in PR 3770
  • Added “ssl_verify” to blocks.launch method to allow for use of self-signed certs by @garrettsutula in PR 3873
  • Fix bug where iterators where not being reset for processes that terminated early by @freddyaboulton in PR 3777
  • Fix bug where the upload button was not properly handling the file_count='multiple' case by @freddyaboulton in PR 3782
  • Fix bug where use Via API button was giving error by @Devang-C in PR 3783

Documentation Changes:

Full Changelog:

  • Fixed IPv6 listening to work with bracket [::1] notation, by @dsully in PR 3695

3.24.1

New Features:

  • No changes to highlight.

Bug Fixes:

  • Fixes Chatbot issue where new lines were being created every time a message was sent back and forth by @aliabid94 in PR 3717.
  • Fixes data updating in DataFrame invoking a select event once the dataframe has been selected. By @yiyuezhuo in PR 3861
  • Fixes false positive warning which is due to too strict type checking by @yiyuezhuo in PR 3837.

3.24.0

New Features:

  • Trigger the release event when Slider number input is released or unfocused by @freddyaboulton in PR 3589

  • Created Theme Builder, which allows users to create themes without writing any code, by @aliabid94 in PR 3664. Launch by:

    import gradio as gr
    gr.themes.builder()

    Theme Builder

  • The Dropdown component now has a allow_custom_value parameter that lets users type in custom values not in the original list of choices.

  • The Colorpicker component now has a .blur() event

Added a download button for videos! 📥

download_video

By @freddyaboulton in PR 3581.

Bug Fixes:

  • Fixed bug where text for altair plots was not legible in dark mode by @freddyaboulton in PR 3555
  • Fixes Chatbot and Image components so that files passed during processing are added to a directory where they can be served from, by @abidlabs in PR 3523
  • Use Gradio API server to send telemetry using huggingface_hub @dawoodkhan82 in PR 3488
  • Fixes an an issue where if the Blocks scope was not exited, then State could be shared across sessions, by @abidlabs in PR 3600
  • Ensures that gr.load() loads and applies the upstream theme, by @abidlabs in PR 3641
  • Fixed bug where “or” was not being localized in file upload text by @freddyaboulton in PR 3599
  • Fixed bug where chatbot does not autoscroll inside of a tab, row or column by @dawoodkhan82 in PR 3637
  • Fixed bug where textbox shrinks when lines set to larger than 20 by @dawoodkhan82 in PR 3637
  • Ensure CSS has fully loaded before rendering the application, by @pngwn in PR 3573
  • Support using an empty list as gr.Dataframe value, by @space-nuko in PR 3646
  • Fixed gr.Image not filling the entire element size, by @space-nuko in PR 3649
  • Make gr.Code support the lines property, by @space-nuko in PR 3651
  • Fixes certain _js return values being double wrapped in an array, by @space-nuko in PR 3594
  • Correct the documentation of gr.File component to state that its preprocessing method converts the uploaded file to a temporary file, by @RussellLuo in PR 3660
  • Fixed bug in Serializer ValueError text by @osanseviero in PR 3669
  • Fix default parameter argument and gr.Progress used in same function, by @space-nuko in PR 3671
  • Hide Remove All button in gr.Dropdown single-select mode by @space-nuko in PR 3678
  • Fix broken spaces in docs by @aliabd in PR 3698
  • Fix items in gr.Dropdown besides the selected item receiving a checkmark, by @space-nuko in PR 3644
  • Fix several gr.Dropdown issues and improve usability, by @space-nuko in PR 3705

Documentation Changes:

  • Makes some fixes to the Theme Guide related to naming of variables, by @abidlabs in PR 3561
  • Documented HuggingFaceDatasetJSONSaver by @osanseviero in PR 3604
  • Makes some additions to documentation of Audio and State components, and fixes the pictionary demo by @abidlabs in PR 3611
  • Fix outdated sharing your app guide by @aliabd in PR 3699

Testing and Infrastructure Changes:

  • Removed heavily-mocked tests related to comet_ml, wandb, and mlflow as they added a significant amount of test dependencies that prevented installation of test dependencies on Windows environments. By @abidlabs in PR 3608
  • Added Windows continuous integration, by @space-nuko in PR 3628
  • Switched linting from flake8 + isort to ruff, by @akx in PR 3710

Full Changelog:

  • Mobile responsive iframes in themes guide by @aliabd in PR 3562
  • Remove extra $demo from theme guide by @aliabd in PR 3563
  • Set the theme name to be the upstream repo name when loading from the hub by @freddyaboulton in PR 3595
  • Copy everything in website Dockerfile, fix build issues by @aliabd in PR 3659
  • Raise error when an event is queued but the queue is not configured by @freddyaboulton in PR 3640
  • Allows users to apss in a string name for a built-in theme, by @abidlabs in PR 3641
  • Added orig_name to Video output in the backend so that the front end can set the right name for downloaded video files by @freddyaboulton in PR 3700

3.23.0

New Features:

Theme Sharing!

Once you have created a theme, you can upload it to the HuggingFace Hub to let others view it, use it, and build off of it! You can also download, reuse, and remix other peoples’ themes. See https://gradio.app/theming-guide/ for more details.

By @freddyaboulton in PR 3428

Bug Fixes:

Full Changelog:

  • Fix rendering of dropdowns to take more space, and related bugs, by @aliabid94 in PR 3549

3.22.1

Bug Fixes:

3.22.0

New Features:

Official Theme release

Gradio now supports a new theme system, which allows you to customize the look and feel of your app. You can now use the theme= kwarg to pass in a prebuilt theme, or customize your own! See https://gradio.app/theming-guide/ for more details. By @aliabid94 in PR 3470 and PR 3497

elem_classes

Add keyword argument elem_classes to Components to control class names of components, in the same manner as existing elem_id. By @aliabid94 in PR 3466

Bug Fixes:

  • Fixes the File.upload() event trigger which broke as part of the change in how we uploaded files by @abidlabs in PR 3462
  • Fixed issue with gr.Request object failing to handle dictionaries when nested keys couldn’t be converted to variable names #3454 by @radames in PR 3459
  • Fixed bug where css and client api was not working properly when mounted in a subpath by @freddyaboulton in PR 3482

Documentation Changes:

Testing and Infrastructure Changes:

Full Changelog:

3.21.0

New Features:

Theme Sharing 🎨 🤝

You can now share your gradio themes with the world!

After creating a theme, you can upload it to the HuggingFace Hub to let others view it, use it, and build off of it!

Uploading

There are two ways to upload a theme, via the theme class instance or the command line.

  1. Via the class instance
my_theme.push_to_hub(repo_name="my_theme",
                     version="0.2.0",
                     hf_token="...")
  1. Via the command line

First save the theme to disk

my_theme.dump(filename="my_theme.json")

Then use the upload_theme command:

upload_theme\
"my_theme.json"\
"my_theme"\
"0.2.0"\
"<hf-token>"

The version must be a valid semantic version string.

This creates a space on the huggingface hub to host the theme files and show potential users a preview of your theme.

An example theme space is here: https://huggingface.co/spaces/freddyaboulton/dracula_revamped

Downloading

To use a theme from the hub, use the from_hub method on the ThemeClass and pass it to your app:

my_theme = gr.Theme.from_hub("freddyaboulton/my_theme")

with gr.Blocks(theme=my_theme) as demo:
    ....

You can also pass the theme string directly to Blocks or Interface (gr.Blocks(theme="freddyaboulton/my_theme"))

You can pin your app to an upstream theme version by using semantic versioning expressions.

For example, the following would ensure the theme we load from the my_theme repo was between versions 0.1.0 and 0.2.0:

with gr.Blocks(theme="freddyaboulton/my_theme@>=0.1.0,<0.2.0") as demo:
    ....

by @freddyaboulton in PR 3428

Code component 🦾

New code component allows you to enter, edit and display code with full syntax highlighting by @pngwn in PR 3421

The Chatbot component now supports audio, video, and images

The Chatbot component now supports audio, video, and images with a simple syntax: simply pass in a tuple with the URL or filepath (the second optional element of the tuple is alt text), and the image/audio/video will be displayed:

gr.Chatbot([
    (("driving.mp4",), "cool video"),
    (("cantina.wav",), "cool audio"),
    (("lion.jpg", "A lion"), "cool pic"),
]).style(height=800)
image

Note: images were previously supported via Markdown syntax and that is still supported for backwards compatibility. By @dawoodkhan82 in PR 3413

  • Allow consecutive function triggers with .then and .success by @aliabid94 in PR 3430

  • New code component allows you to enter, edit and display code with full syntax highlighting by @pngwn in PR 3421

  • Added the .select() event listener, which also includes event data that can be passed as an argument to a function with type hint gr.SelectData. The following components support the .select() event listener: Chatbot, CheckboxGroup, Dataframe, Dropdown, File, Gallery, HighlightedText, Label, Radio, TabItem, Tab, Textbox. Example usage:
import gradio as gr

with gr.Blocks() as demo:
    gallery = gr.Gallery(["images/1.jpg", "images/2.jpg", "images/3.jpg"])
    selected_index = gr.Textbox()

    def on_select(evt: gr.SelectData):
        return evt.index

    gallery.select(on_select, None, selected_index)

By @aliabid94 in PR 3399

Bug Fixes:

  • Use huggingface_hub to send telemetry on interface and blocks; eventually to replace segment by @dawoodkhan82 in PR 3342
  • Ensure load events created by components (randomize for slider, callable values) are never queued unless every is passed by @freddyaboulton in PR 3391
  • Prevent in-place updates of generic_update by shallow copying by @gitgithan in PR 3405 to fix #3282
  • Fix bug caused by not importing BlockContext in utils.py by @freddyaboulton in PR 3424
  • Ensure dropdown does not highlight partial matches by @pngwn in PR 3421
  • Fix mic button display by @aliabid94 in PR 3456

Documentation Changes:

Testing and Infrastructure Changes:

Full Changelog:

3.20.1

New Features:

chatbot = gr.Chatbot().style(height=500)

Bug Fixes:

  • Ensure uploaded images are always shown in the sketch tool by @pngwn in PR 3386
  • Fixes bug where when if fn is a non-static class member, then self should be ignored as the first param of the fn by @or25 in PR #3227

3.20.0

New Features:

Release event for Slider

Now you can trigger your python function to run when the slider is released as opposed to every slider change value!

Simply use the release method on the slider

slider.release(function, inputs=[...], outputs=[...], api_name="predict")

By @freddyaboulton in PR 3353

Dropdown Component Updates

The standard dropdown component now supports searching for choices. Also when multiselect is True, you can specify max_choices to set the maximum number of choices you want the user to be able to select from the dropdown component.

gr.Dropdown(label="Choose your favorite colors", choices=["red", "blue", "green", "yellow", "orange"], multiselect=True, max_choices=2)

by @dawoodkhan82 in PR 3211

Download button for images 🖼️

Output images will now automatically have a download button displayed to make it easier to save and share the results of Machine Learning art models.

download_sketch

By @freddyaboulton in PR 3297

  • Updated image upload component to accept all image formats, including lossless formats like .webp by @fienestar in PR 3225
  • Adds a disabled mode to the gr.Button component by setting interactive=False by @abidlabs in PR 3266 and PR 3288
  • Adds visual feedback to the when the Flag button is clicked, by @abidlabs in PR 3289
  • Adds ability to set flagging_options display text and saved flag separately by @abidlabs in PR 3289
  • Allow the setting of brush_radius for the Image component both as a default and via Image.update() by @pngwn in PR 3277
  • Added info= argument to form components to enable extra context provided to users, by @aliabid94 in PR 3291
  • Allow developers to access the username of a logged-in user from the gr.Request() object using the .username attribute by @abidlabs in PR 3296
  • Add preview option to Gallery.style that launches the gallery in preview mode when first loaded by @freddyaboulton in PR 3345

Bug Fixes:

  • Ensure mirror_webcam is always respected by @pngwn in PR 3245
  • Fix issue where updated markdown links were not being opened in a new tab by @gante in PR 3236
  • API Docs Fixes by @aliabd in PR 3287
  • Added a timeout to queue messages as some demos were experiencing infinitely growing queues from active jobs waiting forever for clients to respond by @freddyaboulton in PR 3196
  • Fixes the height of rendered LaTeX images so that they match the height of surrounding text by @abidlabs in PR 3258 and in PR 3276
  • Fix bug where matplotlib images where always too small on the front end by @freddyaboulton in PR 3274
  • Remove embed’s initial_height when loading is complete so the embed finds its natural height once it is loaded @pngwn in PR 3292
  • Prevent Sketch from crashing when a default image is provided by @pngwn in PR 3277
  • Respect the shape argument on the front end when creating Image Sketches by @pngwn in PR 3277
  • Fix infinite loop caused by setting Dropdown's value to be [] and adding a change event on the dropdown by @freddyaboulton in PR 3295
  • Fix change event listed twice in image docs by @aliabd in PR 3318
  • Fix bug that cause UI to be vertically centered at all times by @pngwn in PR 3336
  • Fix bug where height set in Gallery.style was not respected by the front-end by @freddyaboulton in PR 3343
  • Ensure markdown lists are rendered correctly by @pngwn in PR 3341
  • Ensure that the initial empty value for gr.Dropdown(Multiselect=True) is an empty list and the initial value for gr.Dropdown(Multiselect=False) is an empty string by @pngwn in PR 3338
  • Ensure uploaded images respect the shape property when the canvas is also enabled by @pngwn in PR 3351
  • Ensure that Google Analytics works correctly when gradio apps are created with analytics_enabled=True by @abidlabs in PR 3349
  • Fix bug where files were being re-uploaded after updates by @freddyaboulton in PR 3375
  • Fix error when using backen_fn and custom js at the same time by @jialeicui in PR 3358
  • Support new embeds for huggingface spaces subdomains by @pngwn in PR 3367

Documentation Changes:

Testing and Infrastructure Changes:

Breaking Changes:

  • Chatbot bubble colors can no longer be set by chatbot.style(color_map=) by [@aliabid94] in PR 3370

Full Changelog:

  • Fixed comment typo in components.py by @eltociear in PR 3235
  • Cleaned up chatbot ui look and feel by [@aliabid94] in PR 3370

3.19.1

Bug Fixes:

  • UI fixes including footer and API docs by @aliabid94 in PR 3242
  • Updated image upload component to accept all image formats, including lossless formats like .webp by @fienestar in PR 3225

Full Changelog:

  • Added backend support for themes by @aliabid94 in PR 2931
  • Added support for button sizes “lg” (default) and “sm”.

3.19.0

New Features:

Improved embedding experience

When embedding a spaces-hosted gradio app as a web component, you now get an improved UI linking back to the original space, better error handling and more intelligent load performance. No changes are required to your code to benefit from this enhanced experience; simply upgrade your gradio SDK to the latest version.

This behaviour is configurable. You can disable the info panel at the bottom by passing info="false". You can disable the container entirely by passing container="false".

Error statuses are reported in the UI with an easy way for end-users to report problems to the original space author via the community tab of that Hugginface space:

By default, gradio apps are lazy loaded, vastly improving performance when there are several demos on the page. Metadata is loaded ahead of time, but the space will only be loaded and rendered when it is in view.

This behaviour is configurable. You can pass eager="true" to load and render the space regardless of whether or not it is currently on the screen.

by @pngwn in PR 3205

New gr.BarPlot component! 📊

Create interactive bar plots from a high-level interface with gr.BarPlot. No need to remember matplotlib syntax anymore!

Example usage:

import gradio as gr
import pandas as pd

simple = pd.DataFrame({
    'a': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'],
    'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})

with gr.Blocks() as demo:
    gr.BarPlot(
        simple,
        x="a",
        y="b",
        title="Simple Bar Plot with made up data",
        tooltip=['a', 'b'],
    )

demo.launch()

By @freddyaboulton in PR 3157

Bokeh plots are back! 🌠

Fixed a bug that prevented bokeh plots from being displayed on the front end and extended support for both 2.x and 3.x versions of bokeh!

image

By @freddyaboulton in PR 3212

Bug Fixes:

  • Adds ability to add a single message from the bot or user side. Ex: specify None as the second value in the tuple, to add a single message in the chatbot from the “bot” side.
gr.Chatbot([("Hi, I'm DialoGPT. Try asking me a question.", None)])

By @dawoodkhan82 in PR 3165

  • Fixes gr.utils.delete_none to only remove props whose values are None from the config by @abidlabs in PR 3188
  • Fix bug where embedded demos were not loading files properly by @freddyaboulton in PR 3177
  • The change event is now triggered when users click the ‘Clear All’ button of the multiselect DropDown component by @freddyaboulton in PR 3195
  • Stops File component from freezing when a large file is uploaded by @aliabid94 in PR 3191
  • Support Chinese pinyin in Dataframe by @aliabid94 in PR 3206
  • The clear event is now triggered when images are cleared by @freddyaboulton in PR 3218
  • Fix bug where auth cookies where not sent when connecting to an app via http by @freddyaboulton in PR 3223
  • Ensure latext CSS is always applied in light and dark mode by @pngwn in PR 3233

Documentation Changes:

Full Changelog:

  • Fix demos page css and add close demos button by @aliabd in PR 3151
  • Caches temp files from base64 input data by giving them a deterministic path based on the contents of data by @abidlabs in PR 3197
  • Better warnings (when there is a mismatch between the number of output components and values returned by a function, or when the File component or UploadButton component includes a file_types parameter along with file_count=="dir") by @abidlabs in PR 3194
  • Raises a gr.Error instead of a regular Python error when you use gr.Interface.load() to load a model and there’s an error querying the HF API by @abidlabs in PR 3194
  • Fixed gradio share links so that they are persistent and do not reset if network connection is disrupted by by XciD, Wauplin, and @abidlabs in PR 3149 and a follow-up to allow it to work for users upgrading from a previous Gradio version in PR 3221

3.18.0

New Features:

Revamped Stop Button for Interfaces 🛑

If your Interface function is a generator, there used to be a separate Stop button displayed next to the Submit button.

We’ve revamed the Submit button so that it turns into a Stop button during the generation process. Clicking on the Stop button will cancel the generation and turn it back to a Submit button. The Stop button will automatically turn back to a Submit button at the end of the generation if you don’t use it!

By @freddyaboulton in PR 3124

Queue now works with reload mode!

You can now call queue on your demo outside of the if __name__ == "__main__" block and run the script in reload mode with the gradio command.

Any changes to the app.py file will be reflected in the webpage automatically and the queue will work properly!

By @freddyaboulton in PR 3089

Allow serving files from additional directories
demo = gr.Interface(...)
demo.launch(
  file_directories=["/var/lib/demo/path/to/resources"]
)

By @maxaudron in PR 3075

Bug Fixes:

  • Fixes URL resolution on Windows by @abidlabs in PR 3108
  • Example caching now works with components without a label attribute (e.g. Column) by @abidlabs in PR 3123
  • Ensure the Video component correctly resets the UI state when a new video source is loaded and reduce choppiness of UI by @pngwn in PR 3117
  • Fixes loading private Spaces by @abidlabs in PR 3068
  • Added a warning when attempting to launch an Interface via the %%blocks jupyter notebook magic command by @freddyaboulton in PR 3126
  • Fixes bug where interactive output image cannot be set when in edit mode by @dawoodkhan82 in PR 3135
  • A share link will automatically be created when running on Sagemaker notebooks so that the front-end is properly displayed by @abidlabs in PR 3137
  • Fixes a few dropdown component issues; hide checkmark next to options as expected, and keyboard hover is visible by @dawoodkhan82 in [PR 3145]https://github.com/gradio-app/gradio/pull/3145)
  • Fixed bug where example pagination buttons were not visible in dark mode or displayed under the examples table. By @freddyaboulton in PR 3144
  • Fixed bug where the font color of axis labels and titles for native plots did not respond to dark mode preferences. By @freddyaboulton in PR 3146

Documentation Changes:

  • Added a guide on the 4 kinds of Gradio Interfaces by @yvrjsharma and @abidlabs in PR 3003
  • Explained that the parameters in launch will not be respected when using reload mode, e.g. gradio command by @freddyaboulton in PR 3089
  • Added a demo to show how to set up variable numbers of outputs in Gradio by @abidlabs in PR 3127
  • Updated docs to reflect that the equal_height parameter should be passed to the .style() method of gr.Row() by @freddyaboulton in PR 3125

Full Changelog:

3.17.1

New Features:

iOS image rotation fixed 🔄

Previously photos uploaded via iOS would be rotated after processing. This has been fixed by @freddyaboulton in PR 3089

######### Before

image

######### After

image

Run on Kaggle kernels 🧪

A share link will automatically be created when running on Kaggle kernels (notebooks) so that the front-end is properly displayed.

image

By @freddyaboulton in PR 3101

Bug Fixes:

  • Fix bug where examples were not rendered correctly for demos created with Blocks api that had multiple input compinents by @freddyaboulton in PR 3090
  • Fix change event listener for JSON, HighlightedText, Chatbot by @aliabid94 in PR 3095
  • Fixes bug where video and file change event not working @tomchang25 in PR 3098
  • Fixes bug where static_video play and pause event not working @tomchang25 in PR 3098
  • Fixed Gallery.style(grid=...) by by @aliabd in PR 3107

Documentation Changes:

  • Update chatbot guide to include blocks demo and markdown support section by @dawoodkhan82 in PR 3023

Full Changelog:

  • Set minimum markdown-it-py version to 2.0.0 so that the dollar math plugin is compatible by @freddyaboulton in PR 3102

3.17.0

New Features:

Extended support for Interface.load! 🏗️

You can now load image-to-text and conversational pipelines from the hub!

Image-to-text Demo
io = gr.Interface.load("models/nlpconnect/vit-gpt2-image-captioning",
                       api_key="<optional-api-key>")
io.launch()
image
conversational Demo
chatbot = gr.Interface.load("models/microsoft/DialoGPT-medium",
                           api_key="<optional-api-key>")
chatbot.launch()

chatbot_load

By @freddyaboulton in PR 3011

Download Button added to Model3D Output Component 📥

No need for an additional file output component to enable model3d file downloads anymore. We now added a download button to the model3d component itself.

Screenshot 2023-01-18 at 3 52 45 PM

By @dawoodkhan82 in PR 3014

Fixing Auth on Spaces 🔑

Authentication on spaces works now! Third party cookies must be enabled on your browser to be able to log in. Some browsers disable third party cookies by default (Safari, Chrome Incognito).

auth_spaces

Bug Fixes:

  • Fixes bug where interpretation event was not configured correctly by @freddyaboulton in PR 2993
  • Fix relative import bug in reload mode by @freddyaboulton in PR 2992
  • Fixes bug where png files were not being recognized when uploading images by @abidlabs in PR 3002
  • Fixes bug where external Spaces could not be loaded and used as functions if they returned files by @abidlabs in PR 3004
  • Fix bug where file serialization output was not JSON serializable by @freddyaboulton in PR 2999
  • Fixes bug where png files were not being recognized when uploading images by @abidlabs in PR 3002
  • Fixes bug where temporary uploaded files were not being added to temp sets by @abidlabs in PR 3005
  • Fixes issue where markdown support in chatbot breaks older demos @dawoodkhan82 in PR 3006
  • Fixes the /file/ route that was broken in a recent change in PR 3010
  • Fix bug where the Image component could not serialize image urls by @freddyaboulton in PR 2957
  • Fix forwarding for guides after SEO renaming by @aliabd in PR 3017
  • Switch all pages on the website to use latest stable gradio by @aliabd in PR 3016
  • Fix bug related to deprecated parameters in huggingface_hub for the HuggingFaceDatasetSaver in PR 3025
  • Added better support for symlinks in the way absolute paths are resolved by @abidlabs in PR 3037
  • Fix several minor frontend bugs (loading animation, examples as gallery) frontend @aliabid94 in PR 2961.
  • Fixes bug that the chatbot sample code does not work with certain input value by @petrov826 in PR 3039.
  • Fix shadows for form element and ensure focus styles more visible in dark mode @pngwn in PR 3042.
  • Fixed bug where the Checkbox and Dropdown change events were not triggered in response to other component changes by @freddyaboulton in PR 3045
  • Fix bug where the queue was not properly restarted after launching a closed app by @freddyaboulton in PR 3022
  • Adding missing embedded components on docs by @aliabd in PR 3027
  • Fixes bug where app would crash if the file_types parameter of gr.File or gr.UploadButton was not a list by @freddyaboulton in PR 3048
  • Ensure CSS mounts correctly regardless of how many Gradio instances are on the page @pngwn in PR 3059.
  • Fix bug where input component was not hidden in the frontend for UploadButton by @freddyaboulton in PR 3053
  • Fixes issue where after clicking submit or undo, the sketch output wouldn’t clear. @dawoodkhan82 in PR 3047
  • Ensure spaces embedded via the web component always use the correct URLs for server requests and change ports for testing to avoid strange collisions when users are working with embedded apps locally by @pngwn in PR 3065
  • Preserve selected image of Gallery through updated by @freddyaboulton in PR 3061
  • Fix bug where auth was not respected on HF spaces by @freddyaboulton and @aliabid94 in PR 3049
  • Fixes bug where tabs selected attribute not working if manually change tab by @tomchang25 in 3055
  • Change chatbot to show dots on progress, and fix bug where chatbot would not stick to bottom in the case of images by @aliabid94 in PR 3067

Documentation Changes:

Testing and Infrastructure Changes:

  • Adds a GitHub action to test if any large files (> 5MB) are present by @abidlabs in PR 3013

Full Changelog:

  • Rewrote frontend using CSS variables for themes by @pngwn in PR 2840
  • Moved telemetry requests to run on background threads by @abidlabs in PR 3054

3.16.2

Bug Fixes:

3.16.1

Bug Fixes:

3.16.0

New Features:

Send custom progress updates by adding a gr.Progress argument after the input arguments to any function. Example:
def reverse(word, progress=gr.Progress()):
    progress(0, desc="Starting")
    time.sleep(1)
    new_string = ""
    for letter in progress.tqdm(word, desc="Reversing"):
        time.sleep(0.25)
        new_string = letter + new_string
    return new_string

demo = gr.Interface(reverse, gr.Text(), gr.Text())

Progress indicator bar by @aliabid94 in PR 2750.

  • Added title argument to TabbedInterface by @MohamedAliRashad in #2888
  • Add support for specifying file extensions for gr.File and gr.UploadButton, using file_types parameter (e.g gr.File(file_count="multiple", file_types=["text", ".json", ".csv"])) by @dawoodkhan82 in #2901
  • Added multiselect option to Dropdown by @dawoodkhan82 in #2871
With multiselect set to true a user can now select multiple options from the gr.Dropdown component.
gr.Dropdown(["angola", "pakistan", "canada"], multiselect=True, value=["angola"])
Screenshot 2023-01-03 at 4 14 36 PM

Bug Fixes:

  • Fixed bug where an error opening an audio file led to a crash by @FelixDombek in PR 2898
  • Fixed bug where setting default_enabled=False made it so that the entire queue did not start by @freddyaboulton in PR 2876
  • Fixed bug where csv preview for DataFrame examples would show filename instead of file contents by @freddyaboulton in PR 2877
  • Fixed bug where an error raised after yielding iterative output would not be displayed in the browser by @JaySmithWpg in PR 2889
  • Fixed bug in blocks_style demo that was preventing it from launching by @freddyaboulton in PR 2890
  • Fixed bug where files could not be downloaded by @freddyaboulton in PR 2926
  • Fixed bug where cached examples were not displaying properly by @a-rogalska in PR 2974

Documentation Changes:

  • Added a Guide on using Google Sheets to create a real-time dashboard with Gradio’s DataFrame and LinePlot component, by @abidlabs in PR 2816
  • Add a components - events matrix on the docs by @aliabd in PR 2921

Testing and Infrastructure Changes:

Full Changelog:

Contributors Shoutout:

  • @JaySmithWpg for making their first contribution to gradio!
  • @MohamedAliRashad for making their first contribution to gradio!

3.15.0

New Features:

Gradio’s newest plotting component gr.LinePlot! 📈

With this component you can easily create time series visualizations with customizable appearance for your demos and dashboards … all without having to know an external plotting library.

For an example of the api see below:

gr.LinePlot(stocks,
            x="date",
            y="price",
            color="symbol",
            color_legend_position="bottom",
            width=600, height=400, title="Stock Prices")

image

By @freddyaboulton in PR 2807

Bug Fixes:

  • Fixed bug where the examples_per_page parameter of the Examples component was not passed to the internal Dataset component by @freddyaboulton in PR 2861
  • Fixes loading Spaces that have components with default values by @abidlabs in PR 2855
  • Fixes flagging when allow_flagging="auto" in gr.Interface() by @abidlabs in PR 2695
  • Fixed bug where passing a non-list value to gr.CheckboxGroup would crash the entire app by @freddyaboulton in PR 2866

Documentation Changes:

  • Added a Guide on using BigQuery with Gradio’s DataFrame and ScatterPlot component, by @abidlabs in PR 2794

Full Changelog:

  • Fixed importing gradio can cause PIL.Image.registered_extensions() to break by [@aliencaocao](https://github.com/aliencaocao) in [PR 2846](https://github.com/gradio-app/gradio/pull/2846)
  • Fix css glitch and navigation in docs by @aliabd in PR 2856
  • Added the ability to set x_lim, y_lim and legend positions for gr.ScatterPlot by @freddyaboulton in PR 2807
  • Remove footers and min-height the correct way by @aliabd in PR 2860

3.14.0

New Features:

Add Waveform Visual Support to Audio

Adds a gr.make_waveform() function that creates a waveform video by combining an audio and an optional background image by @dawoodkhan82 and @aliabid94 in [PR 2706](https://github.com/gradio-app/gradio/pull/2706. Helpful for making audio outputs much more shareable.

waveform screenrecording

Allows Every Component to Accept an every Parameter

When a component’s initial value is a function, the every parameter re-runs the function every every seconds. By @abidlabs in PR 2806. Here’s a code example:

import gradio as gr

with gr.Blocks() as demo:
    df = gr.DataFrame(run_query, every=60*60)

demo.queue().launch()

Bug Fixes:

  • Fixed issue where too many temporary files were created, all with randomly generated filepaths. Now fewer temporary files are created and are assigned a path that is a hash based on the file contents by @abidlabs in PR 2758

3.13.2

Bug Fixes:

*No changes to highlight.

Documentation Changes:

  • Improves documentation of several queuing-related parameters by @abidlabs in PR 2825

Testing and Infrastructure Changes:

3.13.1

New Features:

New Shareable Links

Replaces tunneling logic based on ssh port-forwarding to that based on frp by XciD and Wauplin in PR 2509

You don’t need to do anything differently, but when you set share=True in launch(), you’ll get this message and a public link that look a little bit different:

Setting up a public link... we have recently upgraded the way public links are generated. If you encounter any problems, please downgrade to gradio version 3.13.0
.
Running on public URL: https://bec81a83-5b5c-471e.gradio.live

These links are a more secure and scalable way to create shareable demos!

Bug Fixes:

  • Allows gr.Dataframe() to take a pandas.DataFrame that includes numpy array and other types as its initial value, by @abidlabs in PR 2804
  • Add altair to requirements.txt by @freddyaboulton in PR 2811
  • Added aria-labels to icon buttons that are built into UI components by @emilyuhde in PR 2791

Documentation Changes:

Testing and Infrastructure Changes:

Full Changelog:

  • Fixed typo in parameter visible in classes in templates.py by @abidlabs in PR 2805
  • Switched external service for getting IP address from https://api.ipify.org to https://checkip.amazonaws.com/ by @abidlabs in PR 2810

  • Fixed typo in parameter visible in classes in templates.py by @abidlabs in PR 2805
  • Switched external service for getting IP address from https://api.ipify.org to https://checkip.amazonaws.com/ by @abidlabs in PR 2810

3.13.0

New Features:

Scatter plot component

It is now possible to create a scatter plot natively in Gradio!

The gr.ScatterPlot component accepts a pandas dataframe and some optional configuration parameters and will automatically create a plot for you!

This is the first of many native plotting components in Gradio!

For an example of how to use gr.ScatterPlot see below:

import gradio as gr
from vega_datasets import data

cars = data.cars()

with gr.Blocks() as demo:
    gr.ScatterPlot(show_label=False,
                   value=cars,
                   x="Horsepower",
                   y="Miles_per_Gallon",
                   color="Origin",
                   tooltip="Name",
                   title="Car Data",
                   y_title="Miles per Gallon",
                   color_legend_title="Origin of Car").style(container=False)

demo.launch()
image

By @freddyaboulton in PR 2764

Support for altair plots

The Plot component can now accept altair plots as values! Simply return an altair plot from your event listener and gradio will display it in the front-end. See the example below:

import gradio as gr
import altair as alt
from vega_datasets import data

cars = data.cars()
chart = (
    alt.Chart(cars)
    .mark_point()
    .encode(
        x="Horsepower",
        y="Miles_per_Gallon",
        color="Origin",
    )
)

with gr.Blocks() as demo:
    gr.Plot(value=chart)
demo.launch()
image

By @freddyaboulton in PR 2741

Set the background color of a Label component

The Label component now accepts a color argument by @freddyaboulton in PR 2736. The color argument should either be a valid css color name or hexadecimal string. You can update the color with gr.Label.update!

This lets you create Alert and Warning boxes with the Label component. See below:

import gradio as gr
import random

def update_color(value):
    if value < 0:
        # This is bad so use red
        return "#FF0000"
    elif 0 <= value <= 20:
        # Ok but pay attention (use orange)
        return "#ff9966"
    else:
        # Nothing to worry about
        return None

def update_value():
    choice = random.choice(['good', 'bad', 'so-so'])
    color = update_color(choice)
    return gr.Label.update(value=choice, color=color)


with gr.Blocks() as demo:
    label = gr.Label(value=-10)
    demo.load(lambda: update_value(), inputs=None, outputs=[label], every=1)
demo.queue().launch()

label_bg_color_update

Add Brazilian Portuguese translation

Add Brazilian Portuguese translation (pt-BR.json) by @pstwh in PR 2753:

image

Bug Fixes:

  • Fixed issue where image thumbnails were not showing when an example directory was provided by @abidlabs in PR 2745
  • Fixed bug loading audio input models from the hub by @freddyaboulton in PR 2779.
  • Fixed issue where entities were not merged when highlighted text was generated from the dictionary inputs @payoto in PR 2767
  • Fixed bug where generating events did not finish running even if the websocket connection was closed by @freddyaboulton in PR 2783.

Full Changelog:

3.12.0

New Features:

The Chatbot component now supports a subset of Markdown (including bold, italics, code, images)

You can now pass in some Markdown to the Chatbot component and it will show up, meaning that you can pass in images as well! by @abidlabs in PR 2731

Here’s a simple example that references a local image lion.jpg that is in the same folder as the Python script:

import gradio as gr

with gr.Blocks() as demo:
    gr.Chatbot([("hi", "hello **abubakar**"), ("![](/file=lion.jpg)", "cool pic")])

demo.launch()

Alt text

To see a more realistic example, see the new demo /demo/chatbot_multimodal/run.py.

Latex support

Added mathtext (a subset of latex) support to gr.Markdown. Added by @kashif and @aliabid94 in PR 2696.

Example of how it can be used:

gr.Markdown(
    r"""
    # Hello World! $\frac{\sqrt{x + y}}{4}$ is today's lesson.
    """)
Update Accordion properties from the backend

You can now update the Accordion label and open status with gr.Accordion.update by @freddyaboulton in PR 2690

import gradio as gr

with gr.Blocks() as demo:
    with gr.Accordion(label="Open for greeting", open=False) as accordion:
        gr.Textbox("Hello!")
    open_btn = gr.Button(value="Open Accordion")
    close_btn = gr.Button(value="Close Accordion")
    open_btn.click(
        lambda: gr.Accordion.update(open=True, label="Open Accordion"),
        inputs=None,
        outputs=[accordion],
    )
    close_btn.click(
        lambda: gr.Accordion.update(open=False, label="Closed Accordion"),
        inputs=None,
        outputs=[accordion],
    )
demo.launch()

update_accordion

Bug Fixes:

  • Fixed bug where requests timeout is missing from utils.version_check() by @yujiehecs in PR 2729
  • Fixed bug where so that the File component can properly preprocess files to “binary” byte-string format by CoffeeVampir3 in PR 2727
  • Fixed bug to ensure that filenames are less than 200 characters even for non-English languages by @SkyTNT in PR 2685

Documentation Changes:

Full Changelog:

  • Make try examples button more prominent by @aliabd in PR 2705
  • Fix id clashes in docs by @aliabd in PR 2713
  • Fix typos in guide docs by @andridns in PR 2722
  • Add option to include_audio in Video component. When True, for source="webcam" this will record audio and video, for source="upload" this will retain the audio in an uploaded video by @mandargogate in PR 2721

Contributors Shoutout:

3.11.0

New Features:

Upload Button

There is now a new component called the UploadButton which is a file upload component but in button form! You can also specify what file types it should accept in the form of a list (ex: image, video, audio, text, or generic file). Added by @dawoodkhan82 in PR 2591.

Example of how it can be used:

import gradio as gr

def upload_file(files):
    file_paths = [file.name for file in files]
    return file_paths

with gr.Blocks() as demo:
    file_output = gr.File()
    upload_button = gr.UploadButton("Click to Upload a File", file_types=["image", "video"], file_count="multiple")
    upload_button.upload(upload_file, upload_button, file_output)

demo.launch()
Revamped API documentation page

New API Docs page with in-browser playground and updated aesthetics. @gary149 in PR 2652

Revamped Login page

Previously our login page had its own CSS, had no dark mode, and had an ugly json message on the wrong credentials. Made the page more aesthetically consistent, added dark mode support, and a nicer error message. @aliabid94 in PR 2684

Accessing the Requests Object Directly

You can now access the Request object directly in your Python function by @abidlabs in PR 2641. This means that you can access request headers, the client IP address, and so on. In order to use it, add a parameter to your function and set its type hint to be gr.Request. Here’s a simple example:

import gradio as gr

def echo(name, request: gr.Request):
    if request:
        print("Request headers dictionary:", request.headers)
        print("IP address:", request.client.host)
    return name

io = gr.Interface(echo, "textbox", "textbox").launch()

Bug Fixes:

  • Fixed bug that limited files from being sent over websockets to 16MB. The new limit is now 1GB by @abidlabs in PR 2709

Documentation Changes:

  • Updated documentation for embedding Gradio demos on Spaces as web components by @julien-c in PR 2698
  • Updated IFrames in Guides to use the host URL instead of the Space name to be consistent with the new method for embedding Spaces, by @julien-c in PR 2692
  • Colab buttons on every demo in the website! Just click open in colab, and run the demo there.

https://user-images.githubusercontent.com/9021060/202878400-cb16ed47-f4dd-4cb0-b2f0-102a9ff64135.mov

Full Changelog:

  • Better warnings and error messages for gr.Interface.load() by @abidlabs in PR 2694
  • Add open in colab buttons to demos in docs and /demos by @aliabd in PR 2608
  • Apply different formatting for the types in component docstrings by @aliabd in PR 2707

3.10.1

Bug Fixes:

Full Changelog:

3.10.0

  • Add support for 'password' and 'email' types to Textbox. @pngwn in PR 2653
  • gr.Textbox component will now raise an exception if type is not “text”, “email”, or “password” @pngwn in PR 2653. This will cause demos using the deprecated gr.Textbox(type="number") to raise an exception.

Bug Fixes:

  • Updated the minimum FastApi used in tests to version 0.87 by @freddyaboulton in PR 2647
  • Fixed bug where interfaces with examples could not be loaded with gr.Interface.load by @freddyaboulton PR 2640
  • Fixed bug where the interactive property of a component could not be updated by @freddyaboulton in PR 2639
  • Fixed bug where some URLs were not being recognized as valid URLs and thus were not loading correctly in various components by @abidlabs in PR 2659

Documentation Changes:

  • Fix some typos in the embedded demo names in “05_using_blocks_like_functions.md” by @freddyaboulton in PR 2656

Full Changelog:

  • Add support for 'password' and 'email' types to Textbox. @pngwn in PR 2653

3.9.1

Bug Fixes:

  • Only set a min height on md and html when loading by @pngwn in PR 2623

Documentation Changes:

  • See docs for the latest gradio commit to main as well the latest pip release:

main-vs-pip

  • Modified the “Connecting To a Database Guide” to use pd.read_sql as opposed to low-level postgres connector by @freddyaboulton in PR 2604

Full Changelog:

  • Dropdown for seeing docs as latest or main by @aliabd in PR 2544
  • Allow gr.Templates to accept parameters to override the defaults by @abidlabs in PR 2600
  • Components now throw a ValueError() if constructed with invalid parameters for type or source (for components that take those parameters) in PR 2610
  • Allow auth with using queue by @GLGDLY in PR 2611

3.9

New Features:

  • Gradio is now embedded directly in colab without requiring the share link by @aliabid94 in PR 2455
Calling functions by api_name in loaded apps

When you load an upstream app with gr.Blocks.load, you can now specify which fn to call with the api_name parameter.

import gradio as gr
english_translator = gr.Blocks.load(name="spaces/gradio/english-translator")
german = english_translator("My name is Freddy", api_name='translate-to-german')

The api_name parameter will take precedence over the fn_index parameter.

Bug Fixes:

Documentation Changes:

  • Added a Guide on how to configure the queue for maximum performance by @abidlabs in PR 2558

Full Changelog:

3.8.2

Bug Fixes:

  • Ensure gradio apps embedded via spaces use the correct endpoint for predictions. @pngwn in PR 2567
  • Ensure gradio apps embedded via spaces use the correct websocket protocol. @pngwn in PR 2571

New Features:

Running Events Continuously

Gradio now supports the ability to run an event continuously on a fixed schedule. To use this feature, pass every=# of seconds to the event definition. This will run the event every given number of seconds!

This can be used to:

  • Create live visualizations that show the most up to date data
  • Refresh the state of the frontend automatically in response to changes in the backend

Here is an example of a live plot that refreshes every half second:

import math
import gradio as gr
import plotly.express as px
import numpy as np


plot_end = 2 * math.pi


def get_plot(period=1):
    global plot_end
    x = np.arange(plot_end - 2 * math.pi, plot_end, 0.02)
    y = np.sin(2*math.pi*period * x)
    fig = px.line(x=x, y=y)
    plot_end += 2 * math.pi
    return fig


with gr.Blocks() as demo:
    with gr.Row():
        with gr.Column():
            gr.Markdown("Change the value of the slider to automatically update the plot")
            period = gr.Slider(label="Period of plot", value=1, minimum=0, maximum=10, step=1)
            plot = gr.Plot(label="Plot (updates every half second)")

    dep = demo.load(get_plot, None, plot, every=0.5)
    period.change(get_plot, period, plot, every=0.5, cancels=[dep])

demo.queue().launch()

live_demo

Documentation Changes:

Full Changelog:

  • Allows loading private Spaces by passing an an api_key to gr.Interface.load() by @abidlabs in PR 2568

3.8

New Features:

  • Allows event listeners to accept a single dictionary as its argument, where the keys are the components and the values are the component values. This is set by passing the input components in the event listener as a set instead of a list. @aliabid94 in PR 2550

Bug Fixes:

Full Changelog:

3.7

New Features:

Batched Functions

Gradio now supports the ability to pass batched functions. Batched functions are just functions which take in a list of inputs and return a list of predictions.

For example, here is a batched function that takes in two lists of inputs (a list of words and a list of ints), and returns a list of trimmed words as output:

import time

def trim_words(words, lens):
    trimmed_words = []
    time.sleep(5)
    for w, l in zip(words, lens):
        trimmed_words.append(w[:l])
    return [trimmed_words]

The advantage of using batched functions is that if you enable queuing, the Gradio server can automatically batch incoming requests and process them in parallel, potentially speeding up your demo. Here’s what the Gradio code looks like (notice the batch=True and max_batch_size=16 — both of these parameters can be passed into event triggers or into the Interface class)

import gradio as gr

with gr.Blocks() as demo:
    with gr.Row():
        word = gr.Textbox(label="word", value="abc")
        leng = gr.Number(label="leng", precision=0, value=1)
        output = gr.Textbox(label="Output")
    with gr.Row():
        run = gr.Button()

    event = run.click(trim_words, [word, leng], output, batch=True, max_batch_size=16)

demo.queue()
demo.launch()

In the example above, 16 requests could be processed in parallel (for a total inference time of 5 seconds), instead of each request being processed separately (for a total inference time of 80 seconds).

Upload Event

Video, Audio, Image, and File components now support a upload() event that is triggered when a user uploads a file into any of these components.

Example usage:

import gradio as gr

with gr.Blocks() as demo:
    with gr.Row():
        input_video = gr.Video()
        output_video = gr.Video()

     # Clears the output video when an input video is uploaded
    input_video.upload(lambda : None, None, output_video)

Bug Fixes:

  • Fixes issue where plotly animations, interactivity, titles, legends, were not working properly. @dawoodkhan82 in PR 2486
  • Prevent requests to the /api endpoint from skipping the queue if the queue is enabled for that event by @freddyaboulton in PR 2493
  • Fixes a bug with cancels in event triggers so that it works properly if multiple Blocks are rendered by @abidlabs in PR 2530
  • Prevent invalid targets of events from crashing the whole application. @pngwn in PR 2534
  • Properly dequeue cancelled events when multiple apps are rendered by @freddyaboulton in PR 2540
  • Fixes videos being cropped due to height/width params not being used @hannahblair in PR 4946

Documentation Changes:

  • Added an example interactive dashboard to the “Tabular & Plots” section of the Demos page by @freddyaboulton in PR 2508

Full Changelog:

  • Fixes the error message if a user builds Gradio locally and tries to use share=True by @abidlabs in PR 2502
  • Allows the render() function to return self by @Raul9595 in PR 2514
  • Fixes issue where plotly animations, interactivity, titles, legends, were not working properly. @dawoodkhan82 in PR 2486
  • Gradio now supports batched functions by @abidlabs in PR 2218
  • Add upload event for Video, Audio, Image, and File components @dawoodkhan82 in PR 2448
  • Changes websocket path for Spaces as it is no longer necessary to have a different URL for websocket connections on Spaces by @abidlabs in PR 2528
  • Clearer error message when events are defined outside of a Blocks scope, and a warning if you try to use Series or Parallel with Blocks by @abidlabs in PR 2543
  • Adds support for audio samples that are in float64, float16, or uint16 formats by @abidlabs in PR 2545

3.6

New Features:

Cancelling Running Events

Running events can be cancelled when other events are triggered! To test this feature, pass the cancels parameter to the event listener. For this feature to work, the queue must be enabled.

cancel_on_change_rl

Code:

import time
import gradio as gr

def fake_diffusion(steps):
    for i in range(steps):
        time.sleep(1)
        yield str(i)

def long_prediction(*args, **kwargs):
    time.sleep(10)
    return 42


with gr.Blocks() as demo:
    with gr.Row():
        with gr.Column():
            n = gr.Slider(1, 10, value=9, step=1, label="Number Steps")
            run = gr.Button()
            output = gr.Textbox(label="Iterative Output")
            stop = gr.Button(value="Stop Iterating")
        with gr.Column():
            prediction = gr.Number(label="Expensive Calculation")
            run_pred = gr.Button(value="Run Expensive Calculation")
        with gr.Column():
            cancel_on_change = gr.Textbox(label="Cancel Iteration and Expensive Calculation on Change")

    click_event = run.click(fake_diffusion, n, output)
    stop.click(fn=None, inputs=None, outputs=None, cancels=[click_event])
    pred_event = run_pred.click(fn=long_prediction, inputs=None, outputs=prediction)

    cancel_on_change.change(None, None, None, cancels=[click_event, pred_event])


demo.queue(concurrency_count=1, max_size=20).launch()

For interfaces, a stop button will be added automatically if the function uses a yield statement.

import gradio as gr
import time

def iteration(steps):
    for i in range(steps):
       time.sleep(0.5)
       yield i

gr.Interface(iteration,
             inputs=gr.Slider(minimum=1, maximum=10, step=1, value=5),
             outputs=gr.Number()).queue().launch()

stop_interface_rl

Bug Fixes:

  • Add loading status tracker UI to HTML and Markdown components. @pngwn in PR 2474
  • Fixed videos being mirrored in the front-end if source is not webcam by @freddyaboulton in PR 2475
  • Add clear button for timeseries component @dawoodkhan82 in PR 2487
  • Removes special characters from temporary filenames so that the files can be served by components @abidlabs in PR 2480
  • Fixed infinite reload loop when mounting gradio as a sub application by @freddyaboulton in PR 2477

Documentation Changes:

  • Adds a demo to show how a sound alert can be played upon completion of a prediction by @abidlabs in PR 2478

Full Changelog:

3.5

Bug Fixes:

  • Ensure that Gradio does not take control of the HTML page title when embedding a gradio app as a web component, this behaviour flipped by adding control_page_title="true" to the webcomponent. @pngwn in PR 2400

  • Decreased latency in iterative-output demos by making the iteration asynchronous @freddyaboulton in PR 2409

  • Fixed queue getting stuck under very high load by @freddyaboulton in PR 2374

  • Ensure that components always behave as if interactive=True were set when the following conditions are true:

    • no default value is provided,
    • they are not set as the input or output of an event,
    • interactive kwarg is not set.

    @pngwn in PR 2459

New Features:

  • When an Image component is set to source="upload", it is now possible to drag and drop and image to replace a previously uploaded image by @pngwn in PR 1711
  • The gr.Dataset component now accepts HTML and Markdown components by @abidlabs in PR 2437

Documentation Changes:

Breaking Changes:

  • The Carousel component is officially deprecated. Since gradio 3.0, code containing the Carousel component would throw warnings. As of the next release, the Carousel component will raise an exception.

Full Changelog:

3.4.1

New Features:

1. See Past and Upcoming Changes in the Release History 👀

You can now see gradio’s release history directly on the website, and also keep track of upcoming changes. Just go here.

release-history

Bug Fixes:

  1. Fix typo in guide image path by @freddyaboulton in PR 2357
  2. Raise error if Blocks has duplicate component with same IDs by @abidlabs in PR 2359
  3. Catch the permission exception on the audio component by @Ian-GL in PR 2330
  4. Fix image_classifier_interface_load demo by @freddyaboulton in PR 2365
  5. Fix combining adjacent components without gaps by introducing gr.Row(variant="compact") by @aliabid94 in PR 2291 This comes with deprecation of the following arguments for Component.style: round, margin, border.
  6. Fix audio streaming, which was previously choppy in PR 2351. Big thanks to @yannickfunk for the proposed solution.
  7. Fix bug where new typeable slider doesn’t respect the minimum and maximum values @dawoodkhan82 in PR 2380

Documentation Changes:

  1. New Guide: Connecting to a Database 🗄️

    A new guide by @freddyaboulton that explains how you can use Gradio to connect your app to a database. Read more here.

  2. New Guide: Running Background Tasks 🥷

    A new guide by @freddyaboulton that explains how you can run background tasks from your gradio app. Read more here.

  3. Small fixes to docs for Image component by @abidlabs in PR 2372

Full Changelog:

3.4

New Features:

1. Gallery Captions 🖼️

You can now pass captions to images in the Gallery component. To do so you need to pass a {List} of (image, {str} caption) tuples. This is optional and the component also accepts just a list of the images.

Here’s an example:

import gradio as gr

images_with_captions = [
    ("https://images.unsplash.com/photo-1551969014-7d2c4cddf0b6", "Cheetah by David Groves"),
    ("https://images.unsplash.com/photo-1546182990-dffeafbe841d", "Lion by Francesco"),
    ("https://images.unsplash.com/photo-1561731216-c3a4d99437d5", "Tiger by Mike Marrah")
    ]

with gr.Blocks() as demo:
    gr.Gallery(value=images_with_captions)

demo.launch()
gallery_captions
2. Type Values into the Slider 🔢

You can now type values directly on the Slider component! Here’s what it looks like:

type-slider

3. Better Sketching and Inpainting 🎨

We’ve made a lot of changes to our Image component so that it can support better sketching and inpainting.

Now supports:

  • A standalone black-and-white sketch
import gradio as gr
demo = gr.Interface(lambda x: x, gr.Sketchpad(), gr.Image())
demo.launch()

bw

  • A standalone color sketch
import gradio as gr
demo = gr.Interface(lambda x: x, gr.Paint(), gr.Image())
demo.launch()

color-sketch

  • An uploadable image with black-and-white or color sketching
import gradio as gr
demo = gr.Interface(lambda x: x, gr.Image(source='upload', tool='color-sketch'), gr.Image()) # for black and white, tool = 'sketch'
demo.launch()

sketch-new

  • Webcam with black-and-white or color sketching
import gradio as gr
demo = gr.Interface(lambda x: x, gr.Image(source='webcam', tool='color-sketch'), gr.Image()) # for black and white, tool = 'sketch'
demo.launch()

webcam-sketch

As well as other fixes

Bug Fixes:

  1. Fix bug where max concurrency count is not respected in queue by @freddyaboulton in PR 2286
  2. fix : queue could be blocked by @SkyTNT in PR 2288
  3. Supports gr.update() in example caching by @abidlabs in PR 2309
  4. Clipboard fix for iframes by @abidlabs in PR 2321
  5. Fix: Dataframe column headers are reset when you add a new column by @dawoodkhan82 in PR 2318
  6. Added support for URLs for Video, Audio, and Image by @abidlabs in PR 2256
  7. Add documentation about how to create and use the Gradio FastAPI app by @abidlabs in PR 2263

Documentation Changes:

  1. Adding a Playground Tab to the Website by @aliabd in PR 1860
  2. Gradio for Tabular Data Science Workflows Guide by @merveenoyan in PR 2199
  3. Promotes postprocess and preprocess to documented parameters by @abidlabs in PR 2293
  4. Update 2)key_features.md by @voidxd in PR 2326
  5. Add docs to blocks context postprocessing function by @Ian-GL in PR 2332

Testing and Infrastructure Changes

  1. Website fixes and refactoring by @aliabd in PR 2280
  2. Don’t deploy to spaces on release by @freddyaboulton in PR 2313

Full Changelog:

Contributors Shoutout:

3.3

New Features:

1. Iterative Outputs ⏳

You can now create an iterative output simply by having your function return a generator!

Here’s (part of) an example that was used to generate the interface below it. See full code.

def predict(steps, seed):
    generator = torch.manual_seed(seed)
    for i in range(1,steps):
        yield pipeline(generator=generator, num_inference_steps=i)["sample"][0]

example

2. Accordion Layout 🆕

This version of Gradio introduces a new layout component to Blocks: the Accordion. Wrap your elements in a neat, expandable layout that allows users to toggle them as needed.

Usage: (Read the docs)

with gr.Accordion("open up"):
# components here

accordion

3. Skops Integration 📈

Our new integration with skops allows you to load tabular classification and regression models directly from the hub.

Here’s a classification example showing how quick it is to set up an interface for a model.

import gradio as gr
gr.Interface.load("models/scikit-learn/tabular-playground").launch()

187936493-5c90c01d-a6dd-400f-aa42-833a096156a1

Full Changelog:

Contributors Shoutout:

3.2

New Features:

1. Improvements to Queuing 🥇

We’ve implemented a brand new queuing system based on web sockets instead of HTTP long polling. Among other things, this allows us to manage queue sizes better on Hugging Face Spaces. There are also additional queue-related parameters you can add:

  • Now supports concurrent workers (parallelization)
demo = gr.Interface(...)
demo.queue(concurrency_count=3)
demo.launch()
  • Configure a maximum queue size
demo = gr.Interface(...)
demo.queue(max_size=100)
demo.launch()
  • If a user closes their tab / browser, they leave the queue, which means the demo will run faster for everyone else
2. Fixes to Examples
  • Dataframe examples will render properly, and look much clearer in the UI: (thanks to PR #2125)

Screen Shot 2022-08-30 at 8 29 58 PM

  • Image and Video thumbnails are cropped to look neater and more uniform: (thanks to PR #2109)

Screen Shot 2022-08-30 at 8 32 15 PM

  • Other fixes in PR #2131 and #2064 make it easier to design and use Examples
3. Component Fixes 🧱
  • Specify the width and height of an image in its style tag (thanks to PR #2133)
components.Image().style(height=260, width=300)
  • Automatic conversion of videos so they are playable in the browser (thanks to PR #2003). Gradio will check if a video’s format is playable in the browser and, if it isn’t, will automatically convert it to a format that is (mp4).
  • Pass in a json filepath to the Label component (thanks to PR #2083)
  • Randomize the default value of a Slider (thanks to PR #1935)

slider-random

  • Improvements to State in PR #2100
4. Ability to Randomize Input Sliders and Reload Data whenever the Page Loads
  • In some cases, you want to be able to show a different set of input data to every user as they load the page app. For example, you might want to randomize the value of a “seed” Slider input. Or you might want to show a Textbox with the current date. We now supporting passing functions as the default value in input components. When you pass in a function, it gets re-evaluated every time someone loads the demo, allowing you to reload / change data for different users.

Here’s an example loading the current date time into an input Textbox:

import gradio as gr
import datetime

with gr.Blocks() as demo:
    gr.Textbox(datetime.datetime.now)

demo.launch()

Note that we don’t evaluate the function — datetime.datetime.now() — we pass in the function itself to get this behavior — datetime.datetime.now

Because randomizing the initial value of Slider is a common use case, we’ve added a randomize keyword argument you can use to randomize its initial value:

import gradio as gr
demo = gr.Interface(lambda x:x, gr.Slider(0, 10, randomize=True), "number")
demo.launch()
5. New Guide 🖊️

Full Changelog:

Contributors Shoutout:

3.1

New Features:

1. Embedding Demos on Any Website 💻

With PR #1444, Gradio is now distributed as a web component. This means demos can be natively embedded on websites. You’ll just need to add two lines: one to load the gradio javascript, and one to link to the demos backend.

Here’s a simple example that embeds the demo from a Hugging Face space:

<script
	type="module"
	src="https://gradio.s3-us-west-2.amazonaws.com/3.0.18/gradio.js"
></script>
<gradio-app space="abidlabs/pytorch-image-classifier"></gradio-app>

But you can also embed demos that are running anywhere, you just need to link the demo to src instead of space. In fact, all the demos on the gradio website are embedded this way:

Screen Shot 2022-07-14 at 2 41 44 PM

Read more in the Embedding Gradio Demos guide.

2. Reload Mode 👨‍💻

Reload mode helps developers create gradio demos faster by automatically reloading the demo whenever the code changes. It can support development on Python IDEs (VS Code, PyCharm, etc), the terminal, as well as Jupyter notebooks.

If your demo code is in a script named app.py, instead of running python app.py you can now run gradio app.py and that will launch the demo in reload mode:

Launching in reload mode on: http://127.0.0.1:7860 (Press CTRL+C to quit)
Watching...
WARNING: The --reload flag should not be used in production on Windows.

If you’re working from a Jupyter or Colab Notebook, use these magic commands instead: %load_ext gradio when you import gradio, and %%blocks in the top of the cell with the demo code. Here’s an example that shows how much faster the development becomes:

Blocks

3. Inpainting Support on gr.Image() 🎨

We updated the Image component to add support for inpainting demos. It works by adding tool="sketch" as a parameter, that passes both an image and a sketchable mask to your prediction function.

Here’s an example from the LAMA space:

FXApVlFVsAALSD-

4. Markdown and HTML support in Dataframes 🔢

We upgraded the Dataframe component in PR #1684 to support rendering Markdown and HTML inside the cells.

This means you can build Dataframes that look like the following:

image (8)

5. gr.Examples() for Blocks 🧱

We’ve added the gr.Examples component helper to allow you to add examples to any Blocks demo. This class is a wrapper over the gr.Dataset component.

Screen Shot 2022-07-14 at 2 23 50 PM

gr.Examples takes two required parameters:

  • examples which takes in a nested list
  • inputs which takes in a component or list of components

You can read more in the Examples docs or the Adding Examples to your Demos guide.

6. Fixes to Audio Streaming

With PR 1828 we now hide the status loading animation, as well as remove the echo in streaming. Check out the stream_audio demo for more or read through our Real Time Speech Recognition guide.

Screen Shot 2022-07-19 at 6 02 35 PM

Full Changelog:

Contributors Shoutout:

3.0

🔥 Gradio 3.0 is the biggest update to the library, ever.

New Features:

1. Blocks 🧱

Blocks is a new, low-level API that allows you to have full control over the data flows and layout of your application. It allows you to build very complex, multi-step applications. For example, you might want to:

  • Group together related demos as multiple tabs in one web app
  • Change the layout of your demo instead of just having all of the inputs on the left and outputs on the right
  • Have multi-step interfaces, in which the output of one model becomes the input to the next model, or have more flexible data flows in general
  • Change a component’s properties (for example, the choices in a Dropdown) or its visibility based on user input

Here’s a simple example that creates the demo below it:

import gradio as gr

def update(name):
    return f"Welcome to Gradio, {name}!"

demo = gr.Blocks()

with demo:
    gr.Markdown(
    """
    # Hello World!
    Start typing below to see the output.
    """)
    inp = gr.Textbox(placeholder="What is your name?")
    out = gr.Textbox()

    inp.change(fn=update,
               inputs=inp,
               outputs=out)

demo.launch()

hello-blocks

Read our Introduction to Blocks guide for more, and join the 🎈 Gradio Blocks Party!

2. Our Revamped Design 🎨

We’ve upgraded our design across the entire library: from components, and layouts all the way to dark mode.

kitchen_sink

3. A New Website 💻

We’ve upgraded gradio.app to make it cleaner, faster and easier to use. Our docs now come with components and demos embedded directly on the page. So you can quickly get up to speed with what you’re looking for.

website

4. New Components: Model3D, Dataset, and More..

We’ve introduced a lot of new components in 3.0, including Model3D, Dataset, Markdown, Button and Gallery. You can find all the components and play around with them here.

Model3d

Full Changelog:

Contributors Shoutout: