Introducing Gradio ClientsJoin us on Thursday, 9am PST
LivestreamIntroducing Gradio ClientsJoin us on Thursday, 9am PST
Livestream41a4493
- fix client flaky tests. Thanks @abidlabs!e2271e2
- documentation for @gradio/client. Thanks @pngwn!f8ebace
- Ensure all status are reported internally when calling predict
. Thanks @pngwn!48eeea4
- Refactor Cancelling Logic To Use /cancel. Thanks @freddyaboulton!8628899
- Support Bash in Api Recorder. Thanks @aliabd!96d8de2
- add delete event to File
component. Thanks @pngwn!2cd02ff
- Remove deprecated parameters from Python Client. Thanks @abidlabs!8ca93d4
- Improve design of api recorder. Thanks @aliabd!5c8915b
- Add cURL to view API Page and add a dedicated Guide. Thanks @abidlabs!d5a9604
- Fix js client bundle. Thanks @pngwn!9d2d605
- Change client submit API to be an AsyncIterable and support more platforms. Thanks @pngwn!6447dfa
- Improve file handling in JS Client. Thanks @hannahblair!63d36fb
- Handle gradio apps using state
in the JS Client. Thanks @hannahblair!d393a4a
- Fix type hints for render and on. Thanks @freddyaboulton!341844f
- Click to preview images in chatbot. Thanks @dawoodkhan82!a970589
- Fix multimodal textbox placeholder. Thanks @dawoodkhan82!4a55157
- state.change listener with deep hash check. Thanks @aliabid94!33c8081
- Handle special arguments when extracting parameter names for view API page. Thanks @abidlabs!4795c6e
- Fix multimodal textbox styling for certain themes. Thanks @dawoodkhan82!83bdf5c
- Add support for numpy~=2.0
. Thanks @freddyaboulton!d078621
- Add CDN installation to JS docs. Thanks @hannahblair!55f664f
- Add event listener support to render blocks. Thanks @aliabid94!945ac83
- Improve rendering. Thanks @aliabid94!ab65360
- Allow JS Client to work with authenticated spaces 🍪. Thanks @hannahblair!e738e26
- Include instructions on starting from someone else’s custom component repository. Thanks @freddyaboulton!94a1143
- Add allow-credentials to preflight header. Thanks @abidlabs!5efd35c
- Editable Docs. Thanks @aliabd!33e8bab
- Enable hiding the inline category in HighlightedText with a show_inline_category
argument. Thanks @xu-song!8028c33
- Render decorator documentation. Thanks @aliabid94!3fbf2e8
- chore: update docs.py. Thanks @eltociear!e86dd01
- Connect heartbeat if state created in render. Also fix config cleanup bug #8407. Thanks @freddyaboulton!1f8e5c4
- Improve URL handling in JS Client. Thanks @hannahblair!aebd2e9
- Model3D right-handed coordinate system. Thanks @dylanebert!24ab22d
- Fix encoding error. Thanks @xu-song!6a1b58c
- Add --table-text-color
var to fix body text in Examples
. Thanks @hannahblair!2d705bc
- Add body color to gr.Accordion
. Thanks @hannahblair!a373b0e
- Set orig_name in python client file uploads. Thanks @freddyaboulton!97ac79b
- Fix bug in reload mode equality check. Better equality conversion for state variables. Thanks @freddyaboulton!89d6a17
- Change z-index of status tracker. Thanks @hannahblair!4dc7fa7
- Fix Chatbot, Dataframe, Markdown custom components. Thanks @freddyaboulton!f138b41
- Use Any if JsonValue cannot be imported. Thanks @freddyaboulton!0236b1a
- fix: prevent triggering gr.File.select on delete. Thanks @gtm-nayan!82ba397
- add missing orig_name (follow up to #8334). Thanks @gtm-nayan!47012a0
- ensure the client correctly handles all binary data. Thanks @Saghen!7c81897
- chore(deps): update dependency esbuild to ^0.21.0. Thanks @renovate!4350215
- Link to troubleshooting guide in the custom component loading status. Thanks @freddyaboulton!ee1e294
- Ensure JSON component outputs handled properly in postprocess. Thanks @freddyaboulton!929d216
- always create a jwt when connecting to a space if a hf_token is present. Thanks @pngwn!a9e1a8a
- Make exceptions in the Client more specific. Thanks @abidlabs!de52f0e
- Reduce the analytics that are collected in Gradio. Thanks @abidlabs!0bf3d1a
- Fix bug where client could not connect to apps that had self signed certificates. Thanks @freddyaboulton!7e976fd
- Send ProcessCompleted message when job is cancelled. Thanks @freddyaboulton!719d596
- Fix bug where status tracker was the target of pointer events. Thanks @freddyaboulton!fbf4edd
- ensure client works for private spaces. Thanks @pngwn!892181b
- chore(deps): update dependency @types/prismjs to v1.26.4. Thanks @renovate!0a6f0a7
- Fix custom component detection logic in analytics. Thanks @freddyaboulton!52dac63
- Adds examples_per_page
to gr.ChatInterface
and allows clear_btn
in gr.Interface
to be hidden. Thanks @abidlabs!32d915a
- Apply clean_indent() to the file contents specified with 5436031
- Render decorator 2. Thanks @aliabid94!e09b4e8
- Add support for passing keyword args to data
in JS client. Thanks @hannahblair!bf909bd
- Change upload icon for MultimodalTextbox. Thanks @dawoodkhan82!c562a3d
- Cancel server progress from the python client. Thanks @freddyaboulton!05fe491
- Allow Spaces with .success()
to be gr.load
-ed. Thanks @abidlabs!22df61a
- Client node fix. Thanks @pngwn!9ece050
- Fix bug where updating a component’s value in reload mode would not be shown in UI. Thanks @freddyaboulton!72039be
)It is now possible to load a demo with a custom component with gr.load
.
The custom component must be installed in your system and imported in your python session.
import gradio as gr
import gradio_pdf
demo = gr.load("freddyaboulton/gradiopdf", src="spaces")
if __name__ == "__main__":
demo.launch()
Thanks @freddyaboulton!
f5b710c
- chore(deps): update dependency eslint to v9. Thanks @renovate!a81e369
- Remove hatch installation in js/app/package.json which is no longer needed. Thanks @whitphx!b9afe93
- Rename eventSource_Factory
and fetch_implementation
. Thanks @hannahblair!bed2f82
- Implement JS Client tests. Thanks @hannahblair!d0a759f
- Pass Error status in /dev/reload stream. Thanks @freddyaboulton!611c927
- Lite wheel optimization. Thanks @whitphx!91b5cd6
- remove redundant event source logic. Thanks @hannahblair!24b2286
- allow the canvas size to be set on the ImageEditor
. Thanks @pngwn!cfc272f
- Set the show_api flag on Lite. Thanks @whitphx!1435d1d
- Extend Interface.from_pipeline() to support Transformers.js.py pipelines on Lite. Thanks @whitphx!68dcae5
- Use workspace version for code in _website. Thanks @aliabd!6a218b4
- rework upload to be a class method + pass client into each component. Thanks @pngwn!cf52ca6
- Ensure connectivity to private HF spaces with SSE protocol. Thanks @hannahblair!3a6f1a5
- Only connect to heartbeat if needed. Thanks @freddyaboulton!7aca673
- Add eventsource polyfill for Node.js and browser environments. Thanks @hannahblair!5671ff1
- fix: handling SIGINT correctly in reload.py, single entrance of block_thread in blocks.py. Thanks @Tiger3018!449d0e6
- Refactor analytics to not use api.gradio.app. Thanks @freddyaboulton!39791eb
- Convert sse calls in client from async to sync. Thanks @abidlabs!08b4e61
- Add ETag to /custom_component
route to control browser caching. Thanks @freddyaboulton!2471f79
- run python reload only if python file changed. Thanks @jameszhou02!376dfaa
- Specify the fastapi version on Lite to avoid ujson installation which is not available on Pyodide yet. Thanks @whitphx!2afca65
)We have added a max_file_size
size parameter to launch()
that limits to size of files uploaded to the server. This limit applies to each individual file. This parameter can be specified as a string or an integer (corresponding to the size in bytes).
The following code snippet sets a max file size of 5 megabytes.
import gradio as gr
demo = gr.Interface(lambda x: x, "image", "image")
demo.launch(max_file_size="5mb")
# or
demo.launch(max_file_size=5 * gr.FileSize.MB)
When a component encounters an error, the error state shown in the UI can now be cleared by clicking on the x
icon in the top right of the component. This applies to all types of errors, whether it’s raised in the UI or the server.
Thanks @freddyaboulton!
659d3c5
- chore(deps): update dependency iframe-resizer to v4.3.11. Thanks @renovate!0fb058e
- Fix the Lite custom element parser so it doesn’t add the .code option when the entrypoint file is already specified. Thanks @whitphx!d665f40
- Fix custom JS function caller to concat the outputs of a dep to the inputs as the arguments. Thanks @whitphx!2e469a5
- Using keys to preserve values between reloads. Thanks @aliabid94!450b8cc
- Refactor JS Client. Thanks @hannahblair!595ebf7
- Cache an error from app.submit() and show it on frontend. Thanks @whitphx!1c99570
- Adjust View Api
container z-index
. Thanks @hannahblair!cbf2d4e
- fix typo from #8105. Thanks @abidlabs!cbdfbdf
- upgrade ruff
test dependency to ruff==0.4.1
. Thanks @abidlabs!15a7106
- allow custom component authors to provide custom vite plugins and svelte preprocessors. Thanks @pngwn!568eeb2
- Fix gr.Interface.from_pipeline()
to allow audio uploads and to display classification labels correctly. Thanks @whitphx!32cfa61
- Remove auto-created files from gradio cc publish
and other tweaks. Thanks @freddyaboulton!6864035
- Add session hash to gr request. Thanks @freddyaboulton!17e83c9
- Docs Reorg and Intro Page. Thanks @aliabd!5bf61cb
- Hide the scroll bar in WaveformControls when it’s not necessary. Thanks @whitphx!0efd72e
- Add Analytics for custom components. Thanks @freddyaboulton!b50a67d
- Fix GRADIO_CACHE_EXAMPLES
environment variable to only take effect if fn
and outputs
parameters are provided. Thanks @abidlabs!ac30e07
- [HF OAuth] Logout user if oauth token has expired. Thanks @Wauplin!72f4ca8
- Fix gr.Label
styling and a11y markup. Thanks @whitphx!006fa3c
- improve the documentation for js
parameter in Blocks
, Interface
, ChatInterface
. Thanks @abidlabs!176a8a4
- Fix Label component’s value change detection to avoid infinite loop dispatching the change event. Thanks @whitphx!91a7a31
- Store configs per session in the backend. Thanks @aliabid94!d7461aa
- Fix an encoding issue in gradio/components/code.py. Thanks @3210448723!5d9db89
- Fix causing Hot Reload (#8070). Thanks @zolgear!937c858
- Use orjson to serialize dict including np.array. Thanks @whitphx!487db7b
- Respect auth_dependency
parameter in launch()
. Thanks @abidlabs!0a42e96
- Allow users to template the ImageEditor
when using custom components. Thanks @pngwn!624f9b9
- make gradio dev tools a local dependency rather than bundling. Thanks @pngwn!ImageEditor
The ImageEditor
component has been refreshed to make it more user-friendly and reliable.
This release contains a host of improvements to the ImageEditor
component, that will be of particular interest to those building real-time image editing applications or complex image processing pipelines:
input
, upload
, change
and apply
events.change
event.06bdf0e
- Restore chatbot formatting. Thanks @aliabid94!05f935c
- GRADIO_SHARE Environment Variable. Thanks @cocktailpeanut!cecd6e4
- Update dependency iframe-resizer to v4.3.10. Thanks @renovate!92139f3
- refresh the ImageEditor
UI. Thanks @pngwn!a0c2848
- Fix internal server error in HF OAuth workflow. Thanks @Wauplin!5f0248e
- When authenticating with HF OAuth, stay in same tab. Thanks @Wauplin!074ce38
- ensure the ImageEditor
works correctly with layers and change
events. Thanks @pngwn!dbb7373
- ensure ImageEditor
events work as expected. Thanks @pngwn!c9ddd84
- Update the Lite custom element parser. Thanks @whitphx!299c87c
- Document that show_copy_button in gr.Textbox is not visible when show_label=False. Thanks @lappemic!55ef4a5
- Fixes Chatbot Image Sizing. Thanks @dawoodkhan82!e10ec6a
- Fix multimode interface double box on file upload. Thanks @TALLEC-Scott!6fafce0
- ensure maps are correctly shallow cloned when updating state. Thanks @pngwn!79e0aa8
- Fix heartbeat in the js client to be Lite compatible. Thanks @whitphx!8903415
- Add show_progress prop to Upload Component to bring back upload progress animation. Thanks @freddyaboulton!d6c289b
- round [x, y, w, h] before cropping to avoid unexpected interpolation on pixel values. Thanks @ernestchu!f17d1a0
- Add an explicit dependency of urllib3~=2.0
and update processing_utils.save_url_to_cache
to use urllib3
for Lite support. Thanks @whitphx!c1df2f8
- Fix example loading for custom components. Thanks @freddyaboulton!522daf7
- Patch async_save_url_to_cache
for Lite. Thanks @whitphx!2a5cb97
- ensure ImageEditor
always draws at the correct position. Thanks @hrrbay!0424c75
- Update typer
to drop [all]
as it is no longer needed. Thanks @joennlae!b43055b
- Lite playground design changes. Thanks @aliabd!2bae1cf
- Adds an “API Recorder” to the view API page, some internal methods have been made async. Thanks @abidlabs!b165193
- Restore Markdown formatting for Chatbots, MarkdownCode. Thanks @aliabid94!a4782f7
- Allow displaying gr.Code examples by their filename if value is a tuple. Thanks @freddyaboulton!8250a1a
- Handle the case of multiple headers when constructing root url. Thanks @abidlabs!b78129d
- Use asyncio.Event to stop stream in heartbeat route. Thanks @freddyaboulton!eae97c2
- Fix task bug in python 3.9. Thanks @freddyaboulton!1a7851c
- Fix handling of single font name in theme. Thanks @sd109!1eb4c20
- ensure kwargs are always in sync across the whole application. Thanks @pngwn!7c9a964
- Fix programmatic tab selection. Thanks @aliabid94!057d171
- Correctly handle device selection in Image
and ImageEditor
. Thanks @hannahblair!b729f10
- Bugfix: Fix color and size keys in theme builder app. Thanks @shubhamofbce!be46ab1
- ensure entire dropdown is clickable. Thanks @dawoodkhan82!bad3836
- Adding hint list[list]
for example parameter. Thanks @WH-Yoshi!867ff16
- Trigger the “clear” event of Image Editor. Thanks @uebian!919afff
- Adds a Guide on deploying Gradio apps with Docker. Thanks @abidlabs!efd9524
- Fix gr.CheckboxGroup change event. Thanks @freddyaboulton!9666854
- Fixes streaming event race condition. Thanks @aliabid94!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!
024b44c
- Add support for lazy caching of examples, as well as add GRADIO_CACHE_EXAMPLES
env variable. Thanks @abidlabs!c7933ff
- Suppress printing “Running on local URL:” when quiet is set. Thanks @dnoliver!b9dbcf7
- Make buttons in gr.ChatInterface
more mobile-friendly. Thanks @abidlabs!e6d051d
- Paste Images into MultimodalTextbox. Thanks @abidlabs!f42d3e2
- Make internal event handlers of gr.Interface and gr.ChatInterface async. Thanks @freddyaboulton!ccdab9b
- logout route deleting cookie fix. Thanks @MichaelPerger!946487c
- Cache view_api info in server and python client. Thanks @freddyaboulton!5e66e01
- Fix audio streaming out. Thanks @aliabid94!7bbc3b6
- JS functions break entire app if there’s no input, fixed. Thanks @aliabid94!7af3cd7
- Adds a placeholder
argument to gr.Chatbot
. Thanks @abidlabs!ee804b2
- Stop running iterators when js client disconnects. Thanks @freddyaboulton!72661e3
- Revert the minify setting in vite.config.js which was mistakingly introduced in #6261. Thanks @whitphx!1a7c8d3
- Stop importing gradio.ipython_ext in Wasm mode. Thanks @whitphx!75a2bf7
- Add guide on Client state and and fix default values of components. Thanks @abidlabs!e0a8b7f
- Exclude typer
from the requirements list for Wasm env and fix gradio.cli
not to be imported. Thanks @whitphx!e3b1236
- Lazy-import pandas. Thanks @whitphx!ecf5c52
- Fix gradio/components/dataframe.py not to import pandas.io
. Thanks @whitphx!05db0c4
- Refactor CORS Middleware to be much faster. Thanks @abidlabs!425fd1c
- Benchmark fix test. Thanks @aliabid94!1c257f5
- Bugfix: ..
in filename throwing error while loading in output. Thanks @shubhamofbce!0e125d7
- Trigger click event from gr.DownloadButton
even when no file is present. Thanks @abidlabs!8d7b3ca
- Multimodal Textbox Loading + other fixes. Thanks @dawoodkhan82!2c8cd0a
- Lazy-import altair. Thanks @whitphx!b0a3ea9
- Small fix to client.view_api() in the case of default file values. Thanks @abidlabs!755157f
- Do not reload code inside gr.NO_RELOAD context. Thanks @freddyaboulton!dd3e363
- Fail CI if lint or typecheck fails. Thanks @abidlabs!aad209f
- Decrease latency: do not run pre and postprocess in threadpool. Thanks @freddyaboulton!d831040
- Remove Ruff and Uvicorn in Wasm env. Thanks @whitphx!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!c62a57e
- Convert Docs Demos to Lite. Thanks @aliabd!f7df92f
- Improve UX of non-interactive slider. Thanks @Pythongor!ff6bf3e
- Remove the aiohttp mock from the Wasm worker as it’s removed in https://github.com/gradio-app/gradio/pull/5244. Thanks @whitphx!43ae23f
- Fix accidental bug that prevented custom textboxes from being passed to chatinterface. Thanks @freddyaboulton!e78bca4
- Trigger input event for Radio even when radio is output component. Thanks @freddyaboulton!781678b
- Fix root url resolution from x_forwarded_host
headers. Thanks @abidlabs!cf98c7e
- Adds trigger_mode to gr.on. Use it to set trigger_model=“always_last” for live interfaces. Thanks @freddyaboulton!ca42748
- Ensure paginate
updates when samples value changes in Dataset
. Thanks @hannahblair!a2badf1
- Migrate to Storybook 8. Thanks @hannahblair!853d945
- Add format parameter to gr.Image, gr.Gallery, gr.AnnotatedImage, gr.Plot to control format to save image files in. Thanks @dfl!84f81fe
- Closing stream from the backend. Thanks @aliabid94!15da39f
- Multimodal Textbox (Chat Input Component). Thanks @dawoodkhan82!aca4892
- More fixes for gr.load()
as well as a tweaking the __str__
and __repr__
methods of components. Thanks @abidlabs!f739bef
- Add Playground to Lite Custom Element. Thanks @aliabd!0a3870d
- Call handle_darkmode() even if window.__gradio_mode__ === "website"
but enforce the light theme. Thanks @whitphx!7d3c868
- Detailed error message for wasm_utils.get_registered_app(). Thanks @whitphx!04857bc
- Add allowed_paths
, blocked_paths
, show_error
, and favicon_path
parameters to gr.mount_gradio_app
. Thanks @abidlabs!aba4470
- Add auth
, auth_message
, and root_path
parameters to mount_gradio_app
. Thanks @abidlabs!188b86b
- Add support for object-detection models in gr.load()
. Thanks @abidlabs!5d1e8da
- batch UI updates on a per frame basis. Thanks @pngwn!6390d0b
- Add support for python client connecting to gradio apps running with self-signed SSL certificates. Thanks @abidlabs!a1c24db
- Fix OAuth + fix OAuth documentation + undocument logout button. Thanks @Wauplin!c9aba8d
- Fixes: gr.Markdown is not updated properly when it has an image tag. Thanks @dawoodkhan82!95c6bc8
- Fix flagged files and ensure that flagging_mode=“auto” saves output components as well. Thanks @abidlabs!bc61ff6
- Several fixes to gr.load
. Thanks @abidlabs!7f9b291
- Cast button value as string in postprocess. Thanks @heaversm!84f81fe
- Fix race condition between state updates and loading_status updates. Thanks @aliabid94!f67759d
- Fix wasm_proxied_mount_css to not reuse an existing style element. Thanks @whitphx!598ad7b
- fix dev mode. Thanks @pngwn!28342a2
- Fix httpx timeout issues. Thanks @freddyaboulton!7c66a29
- Fix the Lite custom element to initialize the app in the connected callback and dispose the app in the disconnected callback. Thanks @whitphx!1a4b089
- Refactor example_inputs()
, separating its logic into two separate methods: example_payload()
and example_value()
. Thanks @abidlabs!6ebf0ce
- Add support for diffuser pipelines in gr.Interface.from_pipeline(). Thanks @shubhamofbce!048364c
- downgrade contourpy. Thanks @abidlabs!2edba13
- Fix CrossOriginWorkerMaker
to cache the blob URL. Thanks @whitphx!9482c7a
- fix: redundant meta tags that are unwanted. Thanks @qkdxorjs1002!ba8cc48
- feature detect CSSStylesheet. Thanks @pngwn!d0688b3
- Files should now be supplied as file(...)
in the Client, and some fixes to gr.load()
as well. Thanks @abidlabs!a22f3e0
- Fixing root path issue with subpath being repeated twice. Thanks @abidlabs!b3b0ea3
- Add —python-path, —pip-path, —gradio-path CLI arguments to let custom component developers control which executable is used. Thanks @freddyaboulton!0ae1e44
- Control which files get moved to cache with gr.set_static_paths. Thanks @freddyaboulton!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!8181695
- image upload fix. Thanks @dawoodkhan82!4d5789e
- Allow mounted Gradio apps to work with external / arbitrary authentication providers. Thanks @abidlabs!355ed66
- Fix the root_url
logic for streaming files. Thanks @abidlabs!9c6de6d
- Upgrade Pyodide to 0.25.0. Thanks @whitphx!a57e34e
- Add delete_cache parameter to gr.Blocks to delete files created by app on shutdown. Thanks @freddyaboulton!98aa808
- Add /logout
functionality for Gradio auth. Thanks @abidlabs!375bfd2
- Fix server_messages.py to use the patched BaseModel class for Wasm env. Thanks @aliabid94!3645da5
- Fix incorrect relative mouse coordinates for Gallery
preview overlay. Thanks @MMP0!eda33b3
- Refactors get_fetchable_url_or_file()
to remove it from the frontend. Thanks @abidlabs!4b0d589
- chore(deps): update all non-major dependencies. Thanks @renovate!561579d
- fix-tests. Thanks @pngwn!bd2c695
- Adds a gr.DownloadButton
component. Thanks @abidlabs!d3384cb
- Prevent additional paths that can trigger credential leakage on Windows. Thanks @abidlabs!f84720c
- Prevent paths beginning with //
or \\
. Thanks @abidlabs!1c22123
- Fixes method to resolve the root
URLs. Thanks @abidlabs!26356a6
- Fixes: Invalid file_type breaks drag and drop. Thanks @dawoodkhan82!fc4c2db
- Allow Python Client to upload/download files when connecting to Gradio apps with auth enabled. Thanks @abidlabs!08c2d49
- when adding custom head html, ensure there are no duplicate meta tags. Thanks @qkdxorjs1002!1fa2e91
- Fixes auth_message
so that it correctly renders HTML. Thanks @abidlabs!f26aba0
- Prevent audio speeding up when trimming. Thanks @hannahblair!e340894
- Quick fix: custom dropdown value. Thanks @dawoodkhan82!ddd4d3e
- Enable Ruff S101. Thanks @abidlabs!b7a97f2
- Update httpx
to httpx>=0.24.1
in requirements.txt
. Thanks @abidlabs!16fbe9c
- Prevent components from working with non-uploaded files. Thanks @aliabid94!84802ee
- Tighten CORS rules. Thanks @abidlabs!98a2719
- Fix z-index layer of orange generating border. Thanks @daviirodrig!9c36572
- Quick fix: File height overflow. Thanks @dawoodkhan82!ddd4d3e
- ensure Dataframe headers are aligned with content when scrolling. Thanks @abidlabs!ba3ec13
- Tab select fix. Thanks @aliabid94!b186767
- Fix Gallery
preview overlay and backdrop. Thanks @MMP0!33f68cb
- Fix Canvas3D/Canvas3DGS async imports. Thanks @whitphx!ba747ad
- Make fix in #7444 (Block /file= filepaths that could expose credentials on Windows) more general. Thanks @abidlabs!c88290d
- WIP: Optimize /file route. Thanks @freddyaboulton!e329f1f
- Prevent timing attacks to guess Gradio passwords. Thanks @abidlabs!3e4e680
- Fixes to the .key_up()
method to make it usable for a dynamic dropdown autocomplete. Thanks @abidlabs!4faf8a7
- Block /file=
filepaths that could expose credentials on Windows. Thanks @abidlabs!f52cab6
- Dispatch change event for file explorer. Thanks @aliabid94!fb1f6be
- Run pre/post processing in threadpool. Thanks @freddyaboulton!6b8a7e5
- Ensure gr.Dropdown
can have an empty initial value. Thanks @hannahblair!f191786
- Improve responsiveness of gr.Audio()
controls. Thanks @hannahblair!3e886d8
- Model3D Gaussian Splatting. Thanks @dylanebert!fa8225d
- Use updated component in postprocess()
. Thanks @abidlabs!17fb116
- Fixes gr.Markdown() does not render spaces around links correctly. Thanks @dawoodkhan82!65437ce
- Improve File Explorer performance. Thanks @aliabid94!c2dfc59
- remove static while pending behaviour. Thanks @pngwn!b5c74ff
- Fix HTTPX package crash for some values of “article” parameter in the interface. Thanks @YuryYakhno!4ab399f
- Allow config to include non-pickle-able values. Thanks @abidlabs!065c5b1
- Add .key_up
event listener to gr.Dropdown()
. Thanks @abidlabs!314ccfa
- Fix File Explorer interactivity. Thanks @aliabid94!dff4109
- Retain dropdown value if choices have been changed. Thanks @abidlabs!32b317f
- Set root
correctly for Gradio apps that are deployed behind reverse proxies. Thanks @abidlabs!46b4568
- Allow applying @media
, @keyframes
and @import
in custom CSS. Thanks @hannahblair!f35f615
- Added remove button for every file in file preview, to remove individual file in gr.File(). Thanks @shubhamofbce!49d9c48
- [WIP] Refactor file normalization to be in the backend and remove it from the frontend of each component. Thanks @abidlabs!7e9b206
- Stop using deprecated pydantic config class and filter gradio warnings from tests. Thanks @freddyaboulton!6dfd40f
- Make set_documentation_group a no-op. Thanks @freddyaboulton!c1a7ea7
- Add SQL Support for gr.Code. Thanks @aersam!7b10d97
- Remove the @gradio/wasm
dependency from @gradio/gallery
that is not used. Thanks @whitphx!b95d0d0
- Allow setting custom headers in Python Client. Thanks @abidlabs!1e68561
- Update Pydantic patch for Lite that emulates PydanticV2 API using V1. Thanks @whitphx!cccab27
- E2E tests for Lite. Thanks @whitphx!a7fa47a
- ensure Dataframes in background tabs are visible when the tab is selected. Thanks @pngwn!2244059
- Ensure CSS .dark
rule selectors are applied. Thanks @hannahblair!4dc9ffb
- Store gr.Accordion
’s open
value. Thanks @hannahblair!7f19ba2
- Stop caching root url. Thanks @abidlabs!7302a6e
- Fix gr.load
for file-based Spaces. Thanks @abidlabs!ccdaec4
- Add a simpleimage
template for custom components. Thanks @abidlabs!edfd05d
- Expand chatinterface to full window height. Thanks @aliabid94!aa97a5e
- Improvements to API Docs. Thanks @abidlabs!e418edd
- Fix SimpleImage package json. Thanks @abidlabs!5181957
- Add mobile Chromatic tests. Thanks @hannahblair!e5344ba
- chore(deps): update dependency marked to v12. Thanks @renovate!572e360
- Upload tweak. Thanks @pngwn!0fddd0f
- Determine documentation group automatically. Thanks @akx!68a54a7
- Improve chatbot streaming performance with diffs. Thanks @aliabid94!/n Note that this PR changes the API format for generator functions, which would be a breaking change for any clients reading the EventStream directlyefacc7d
- Ensure open
reactivity in Accordion. Thanks @hannahblair!2e6672c
- Allow start/pause of streaming image input. Only access the webcam while it’s needed. Thanks @freddyaboulton!dec6a71
- Fix PIL imports. Thanks @akx!fdd1521
- chore: Change time format (thanks @jjshoots for the independent contribution). Thanks @arian81!3c8c4ac
- Document the gr.ParamViewer
component, and fix component preprocessing/postprocessing docstrings. Thanks @abidlabs!46919c5
- Defer importing matplotlib. Thanks @akx!8bb0ce2
- Hotfix for: stt_or_tts
demo. Thanks @abidlabs!200e251
- Add gr.Image
interaction test + gr.ImageEditor
interaction test improvement. Thanks @hannahblair!87d5105
- Handle httpx.InvalidURL when setting non-URL article strings. Thanks @nopperl!aab2a75
- Allow selecting texts in dataframe cells. Thanks @shubhamofbce!05d8a3c
- Update ruff to 0.1.13, enable more rules, fix issues. Thanks @akx!b3a9c83
- Lite: Wasm-compatible Model3D. Thanks @whitphx!7ea8336
- Remove flag_dir from read_from_flag(). Thanks @akx!6a7e98b
- Fix hyphen-bug in gradio cc publish. Thanks @freddyaboulton!60078df
- Fix test requirements to be compatible with python 3.11. Thanks @abidlabs!09257ef
- Fix ci cache. Thanks @pngwn!1893756
- Small cleanups of Code
component. Thanks @abidlabs!aea14c4
- Refactor Inference API and rename it to Serverless Inference Endpoints. Thanks @abidlabs!24157a3
- add background color based on the OS mode. Thanks @aileenvl!8dd6f4b
- Handle the case where examples is null
for all components. Thanks @abidlabs!757dba6
- Add show_label
check to gr.Dataframe
. Thanks @hannahblair!2d51a9d
- Add missing parameters and docstrings for gr.TabbedInterface
. Thanks @abidlabs!9f23b0b
- Optimize client view_api method. Thanks @freddyaboulton!ded5256
- Fix audio recording events not dispatching. Thanks @hannahblair!733ca26
- Ensure examples Images displays as expected. Thanks @hannahblair!a3aa22f
- Adjust Value to Fix .Label Display. Thanks @codydh!0d36ac0
- Fixes issue with datatype setting in gr.Dataframe. Setting no longer dependent on col_count. Thanks @cswamy!db27df3
- Escape triple quotes when creating space.py
for custom components. Thanks @abidlabs!c3e61e4
- Few File component drag and drop. Thanks @dawoodkhan82!cae05c0
- Fix single file upload display. Thanks @freddyaboulton!e3217b4
- Amend audio waveform colour. Thanks @hannahblair!b25e95e
- Fix processing_utils.save_url_to_cache()
to follow redirects when accessing the URL. Thanks @whitphx!d7095c4
- Number example fix. Thanks @abidlabs!faead14
- Show label in interactive image editor. Thanks @hannahblair!3b8dfc6
- Add visible
check to Tab. Thanks @hannahblair!daaaf95
- Fixes issues related to gr.Dataframe
receiving an empty dataframe. Thanks @cswamy!21a16c6
- add params to gr.Interface
and gr.ChatInterface
. Thanks @abidlabs!6abad53
- Added polars dataframe support with demo. Thanks @cswamy!94aa271
- Improve rapid generation performance via UI throttling. Thanks @aliabid94!bc2cdc1
- Allow download button for interactive Audio and Video components. Thanks @hannahblair!125a832
- generate docs when running gradio cc build
. Thanks @pngwn!c60ad4d
- Use Gallery as input component. Thanks @freddyaboulton!1718c4a
- add STL 3D model support. Thanks @Mon-ius!6ee22dc
- Ensure gradio cc publish
uploads the documentation space, if it exists. Thanks @pngwn!82fe73d
- Redirect with query params after oauth. Thanks @Wauplin!2cdcf4a
- Single oauth button. Thanks @Wauplin!5727b92
- Allow buttons to take null value. Thanks @abidlabs!217bfe3
- Support audio data in np.int8
format in the gr.Audio
component. Thanks @Ram-Pasupula!ac73555
- Run before_fn and after_fn for each generator iteration. Thanks @freddyaboulton!7d53aa1
- Miscellaneous doc fixes. Thanks @abidlabs!ca8753b
- Fixes: Chatbot crashes when given empty url following http:// or https://. Thanks @dawoodkhan82!cb90b3d
- Programmatically determine max wheel version to push to spaces. Thanks @freddyaboulton!80f8fbf
- Add logic to handle non-interactive or hidden tabs. Thanks @hannahblair!b961652
- Remove kwargs from template components. Thanks @freddyaboulton!45f725f
- un-disable output components after exception is raised. Thanks @abidlabs!44c53d9
- Fix dropdown refocusing due to <label />
element. Thanks @hannahblair!e7ab406
- Fix ParamViewer css. Thanks @freddyaboulton!28e8a8a
- Reduce CPU usage of dev mode. Thanks @freddyaboulton!c35fac0
- Ensure device selection works in Audio when streaming. Thanks @hannahblair!13cb6af
- Ensure microphone devices list updates. Thanks @hannahblair!be56c76
- Lite: Add the home_dir
to sys.path
. Thanks @whitphx!8c355a4
- Add ruff mock for Lite. Thanks @whitphx!e8b2d8b
- Add sample rate config option to gr.Audio()
. Thanks @tsukumijima!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 docsThis will generate a Gradio app that you can upload to spaces providing rich documentation for potential users. The documentation page includes:
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!
1fc8a94
- fix lint. Thanks @freddyaboulton!07d520c
- fix versions. Thanks @pngwn!3642b7a
- publish: simplify twine_files code. Thanks @akx!64c65d8
- Add encoding to open/writing files on the deploy_discord function. Thanks @WilliamHarer!f2d69fc
- Fix gallery thumbnail design regression. Thanks @hannahblair!ec28b4e
- Add visible
and interactive
params to gr.Tab()
. Thanks @hannahblair!aaecfe5
- Themes: fix bogus header image URL. Thanks @akx!a336508
- Fix bug preventing layout components to be used as custom components. Thanks @freddyaboulton!3c3cf86
- Fix UI freeze on rapid generators. Thanks @aliabid94!9201f86
- Raise error in build step if custom component package is not installed. Thanks @freddyaboulton!9cefd2e
- Refactor examples so they accept data in the same format as is returned by function, rename .as_example()
to .process_example()
. Thanks @abidlabs!523b6bc
- gr.update(value=[])
for gr.File()
clears it. Thanks @dawoodkhan82!6be3c2c
- Fix Chatbot custom component template. Thanks @freddyaboulton!3f139c7
- Fix File drag and drop for specific file_types. Thanks @dawoodkhan82!623bc1a
- Switch default order for sources for gr.Video
so that upload is the default. Thanks @abidlabs!5d00dd3
- Make ccf317f
- Add additional_inputs
, additional_inputs_accordion
parameters to gr.Interface
. Thanks @abidlabs!8dfabee
- fixed typo. Thanks @Cassini-chris!793bf8f
- Display pending file in <Upload />
while waiting for upload request. Thanks @hannahblair!640b7fe
- Fix issue with Webcam Recording. Thanks @dawoodkhan82!5e00162
- Make 6e285be
- Fix the reloader. Thanks @aliabid94!0f0498b
- Ensure Chatbot theme text size is set correctly. Thanks @hannahblair!f742d0e
- Lite: Support AnnotatedImage on Wasm. Thanks @whitphx!8a093e2
- Add a dev instruction for lite in SharedWorker mode. Thanks @whitphx!6c863af
- Fix functional tests. Thanks @aliabid94!fb9c6ca
- Lite: Chatbot. Thanks @whitphx!4511d57
- Fix the aria-label attrs in gr.Chatbot()
. Thanks @whitphx!649cd4d
- Use EventSource_factory
in open_stream()
for Wasm. Thanks @whitphx!02c2442
- Fix docstring of deprecated parameter concurrency_count. Thanks @ronensc!24a5836
- Component Server fix. Thanks @aliabid94!8333db8
- Fix the Wasm worker to initialize the app directories. Thanks @whitphx!e671e54
- Allow gr.ClearButton
and gr.DuplicateButton
to be made hidden (and otherwise updated). Thanks @abidlabs!b1b78c2
- Fix .select
for gr.Image
, gr.CheckboxGroup
. Thanks @abidlabs!bd11d6e
- Remove the styles on the audio elements in the Chatbot component. Thanks @whitphx!d361a0f
- Ensure camera settings only update when necessary in Model3D. Thanks @hannahblair!459c5dc
- replacing distutils.StrictVersion dependency for Python 3.12. Thanks @velaia!7bab755
- Fixed (this this). Thanks @Cassini-chris!31c2316
- fix issue 6873: File with file_count=‘directory’ bug. Thanks @joshwilson-dev!c00da89
- Fix returning copies of a component instance from a prediction function. Thanks @abidlabs!e974cf0
- Custom JS Guide. Thanks @dawoodkhan82!e528f98
- chore(deps): update dependency mrmime to v2. Thanks @renovate!d406855
- Fix JS Client when app is running behind a proxy. Thanks @freddyaboulton!48d6534
- Add show_api
parameter to events, and fix gr.load()
. Also makes some minor improvements to the “view API” page when running on Spaces. Thanks @abidlabs!15c97c6
- Fix webcam when streaming=True
. Thanks @hannahblair!7bb561a
- Rewriting parts of the README and getting started guides for 4.0. Thanks @abidlabs!846d52d
- Fix md highlight. Thanks @pngwn!f3abde8
- Add an option to enable header links for markdown. Thanks @pngwn!828fb9e
- Refactor queue so that there are separate queues for each concurrency id. Thanks @aliabid94!1401d99
- Fix ImageEditor
interaction story. Thanks @hannahblair!77c9003
- Fixes issue 5781: Enables specifying a caching directory for Examples. Thanks @cswamy!67a2b7f
- Fixed duplicate word (“this this”). Thanks @Cassini-chris!1b9d423
- Prevent file traversals. Thanks @abidlabs!50496f9
- Adjust rounding logic when precision is None
in gr.Number()
. Thanks @hannahblair!73268ee
- Improve source selection UX. Thanks @hannahblair!245d58e
- Improve how server/js client handle unexpected errors. Thanks @freddyaboulton!7ba8c5d
- Fix SSRF vulnerability on /file=
route. Thanks @abidlabs!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!6b130e2
- Ensure LoginButton value
text is displayed. Thanks @hannahblair!526fb6c
- Fix gr.load()
so that it works with the SSE v1 protocol. Thanks @abidlabs!5d51fbc
- Fixes Drag and Drop for Upload. Thanks @dawoodkhan82!51e241a
- Fix flaky CI tests (again 😓 ). Thanks @freddyaboulton!34f9431
- Python client properly handles hearbeat and log messages. Also handles responses longer than 65k. Thanks @freddyaboulton!21cfb0a
- Remove the styles from the Image/Video primitive components and Fix the container styles. Thanks @whitphx!67ddd40
- Lite v4. Thanks @whitphx!053bec9
- Improve CSS token documentation in Storybook. Thanks @hannahblair!3240d04
- Add editable
parameter to Audio. Thanks @hannahblair!9a0bd27
- Add support for OAuth tokens. Thanks @Wauplin!f3c4d78
- reload on css changes + fix css specificity. Thanks @pngwn!299f5e2
- Update HF token used in CI tests. Thanks @abidlabs!cfd5700
- Cause gr.ClearButton
to reset the value of gr.State
. Thanks @abidlabs!6b1401c
- chore(deps): update dependency marked to v11. Thanks @renovate!30c9fbb
- Set gradio api server from env. Thanks @aisensiy!51b54b3
- Tweak to our bug issue template. Thanks @abidlabs!7cbf96e
- Issue 5245: consolidate usage of requests and httpx. Thanks @cswamy!24e0481
- Hotfix: update huggingface_hub
dependency version. Thanks @abidlabs!bdf81fe
- Lite: Set the home dir path per appId at each runtime. Thanks @whitphx!4d1cbbc
- Allow passing height and width as string in Blocks.svelte
. Thanks @hannahblair!5177132
- Lite: Fix the isMessagePort()
type guard in js/wasm/src/worker-proxy.ts. Thanks @whitphx!8a70e83
- switch from black to ruff formatter. Thanks @DarhkVoyd!6a9151d
- Remove progress animation on streaming. Thanks @aliabid94!5238053
- Fix reload mode warning about not being able to find the app. Thanks @freddyaboulton!1234c37
- use gr.Error for audio length errors. Thanks @abidlabs!fe40308
- Rotate Images to Upright Position in preprocess. Thanks @freddyaboulton!9a5811d
- Fix the download button of the gr.Gallery()
component to work. Thanks @whitphx!c9673ca
- Fix directory-only glob for FileExplorer. Thanks @freddyaboulton!9a6ff70
- Fix issue with head
param when adding more than one script tag. Thanks @dawoodkhan82!d76bcaa
- Fix api event drops. Thanks @aliabid94!a1b966e
- Fixed an issue where files could not be filed. Thanks @duolabmeng6!dfc61ec
- Fix dropdown blur bug when values are provided as tuples. Thanks @abidlabs!128ab5d
- Ensure checked files persist after FileExplorer rerenders. Thanks @hannahblair!798eca5
- Fit video media within Video component. Thanks @hannahblair!28a7aa9
- Mount on a FastAPI app with lifespan manager. Thanks @Xmaster6y!1751f14
- Remove 2 slider demos from docs. Thanks @aliabd!4396f3f
- Fix encoding issue #6364 of reload mode. Thanks @curiousRay!9919b8a
- Fix the docstring decoration. Thanks @whitphx!9bf1ad4
- Fix uploaded file wasn’t moved to custom temp dir at different disks. Thanks @dodysw!9bcb1da
- Feat: make UploadButton accept icon. Thanks @Justin-Xiang!4f040c7
- Update zh-CN.json. Thanks @cibimo!13ace03
- Update file_explorer.py - Fixing error if nothing selected in file_count=single mode (return None rather). Thanks @v-chabaux!2b625ad
- Ensure Chatbot messages are properly aligned when rtl
is true. Thanks @hannahblair!b639e04
- Quick Image + Text Component Fixes. Thanks @dawoodkhan82!206af31
- Improve like/dislike functionality. Thanks @hannahblair!d548202
- Improve video trimming and error handling. Thanks @hannahblair!d92c819
- Add concurrency_limit to ChatInterface, add IDE support for concurrency_limit. Thanks @freddyaboulton!8fc562a
- Add show_recording_waveform
to Audio. Thanks @hannahblair!3156598
- Make FileExplorer work on python 3.8 and 3.9. Also make it update on changes to root, glob, or glob_dir. Thanks @freddyaboulton!b8034a1
- Fix: Gradio Client work with private Spaces. Thanks @abidlabs!13ef0f0ca
- Quick fix: Make component interactive when it is in focus. Thanks @dawoodkhan82!96290d304
- tweak deps. Thanks @pngwn!71f1a1f99
- Mark FileData.orig_name
optional on the frontend aligning the type definition on the Python side. Thanks @whitphx!f94db6b73
- File table style with accessible file name texts. Thanks @whitphx!63f466882
- Fix typo in base.py. Thanks @eltociear!46f13f496
- chore(deps): update all non-major dependencies. Thanks @renovate!901f3eebd
- Allow reselecting the original option in gr.Dropdown
after value has changed programmatically. Thanks @abidlabs!147926196
- Some tweaks to ImageEditor
. Thanks @abidlabs!d4e3a5189
- Allows setting parameters of gr.ChatInterface
’s Accordion
. Thanks @abidlabs!f53b01cbf
- Fix Theme Dropdown in deployed theme space. Thanks @freddyaboulton!a424fdbb2
- Ensure audio waveform autoplay
updates. Thanks @hannahblair!1bbd6cab3
- Fix undefined data
TypeError in Blocks. Thanks @hannahblair!830b6c0e6
- Process and convert .svg files in Image
. Thanks @hannahblair!ImageEditor
component (#6169 9caddc17b
)A brand new component, completely separate from Image
that provides simple editing capabilities.
1:1
, etc)
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!
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!070f71c93
- Ensure image editor crop and draw cursor works as expected when the scroll position changes. Thanks @pngwn!739e3a5a0
- Fix dev mode. Thanks @freddyaboulton!ac4ca59c9
- Extract video filenames correctly from URLs. Thanks @112292454!6b53330a5
- UploadButton tests. Thanks @freddyaboulton!a1e3c61f4
- Allow setting a default_concurrency_limit
other than 1. Thanks @abidlabs!179f5bcde
- Add py.typed to gradio backend. Thanks @aleneum!58e3ca826
- Custom Component CLI Improvements. Thanks @freddyaboulton!2761b6d19
- Catch ValueError, KeyError when saving PIL Image. Thanks @freddyaboulton!62d35c3d1
- Issue 2085: Transformers object detection pipeline added. Thanks @cswamy!3953a1467
- Preserve original image extension in backend processing. Thanks @freddyaboulton!e0fc14659
- Allow google analytics to work on Spaces (and other iframe situations). Thanks @abidlabs!1959471a8
- Add download tests for audio/video. Thanks @freddyaboulton!2727f45fb
- Do not show warnings when renaming api_names. Thanks @abidlabs!727ae2597
- chore: rename api_key to hf_token. Thanks @NickCrews!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!2777f326e
- Ensure Audio ouput events are dispatched. Thanks @hannahblair!f816136a0
- Add volume control to Audio. Thanks @hannahblair!d00fcf89d
- Gradio custom component dev mode now detects changes to Example.svelte file. Thanks @freddyaboulton!bce6ca109
- Send more than one heartbeat message. Thanks @freddyaboulton!b3ba17dd1
- Update the selected indices in Dropdown
when value changes programmatically. Thanks @abidlabs!8ef48f852
- Async functions and async generator functions with the every
option to work. Thanks @whitphx!9cfeb4f17
- Remove websockets dependency. Thanks @freddyaboulton!0401c77f3
- Move ffmpeg to Video
deps. Thanks @hannahblair!d84209703
- Lite: SharedWorker mode. Thanks @whitphx!649f3ceb6
- Added docs on gr.Examples. Thanks @abidlabs!d31d8c6ad
- Allows sources
to be a string for gr.Image
. Thanks @abidlabs!2090aad73
- Move wavesurfer dep to js/audio. Thanks @freddyaboulton!324867f63
- Fix event target. Thanks @aliabid94!03491ef49
- Fix docstrings and default value for api_name
. Thanks @abidlabs!e76a9e8fc
- Fix Chatbot Pending Message Issues. Thanks @dawoodkhan82!da1e31832
- Fix Model3D download button and other issues. Thanks @freddyaboulton!de998b281
- Processes avatar_images
for gr.Chatbot
and icon
for gr.Button
correctly, so that respective files are moved to cache. Thanks @abidlabs!42f76aeeb
- Add AsyncGenerator to the check-list of dependencies.types.generator
. Thanks @whitphx!d64787b88
- Fix colorFrom
in theme space readmes. Thanks @abidlabs!4d3aad33a
- Fix image upload. Thanks @freddyaboulton!854b482f5
- Redesign file upload. Thanks @hannahblair!37dd335e5
- Fix audio streaming output issues in 4.0. Thanks @aliabid94!f1409f95e
- Provide status updates on file uploads. Thanks @freddyaboulton!8a3f45c26
- Fix component update bug. Thanks @freddyaboulton!6204ccac5
- Fixes gr.load()
so it works properly with Images and Examples. Thanks @abidlabs!55fda81fa
- Textbox and Code Component Blur/Focus Fixes. Thanks @dawoodkhan82!d3b53a457
- Fix for stylized DataFrame. Thanks @abidlabs!ed546f2e1
- Fix Model3D template. Thanks @freddyaboulton!dfdaf1092
- Fix data model for gr.DataFrame
. Thanks @abidlabs!4b1011bab
- Maintain text selection in Chatbot
button elements. Thanks @hannahblair!bca6c2c80
- Restore query parameters in request. Thanks @aliabid94!19af2806a
- Add autoplay to waveform_settings
. Thanks @hannahblair!7ab73df48
- fix regarding callable function error. Thanks @SrijanSahaySrivastava!3cdeabc68
- Ensure source selection does not get hidden in overflow. Thanks @hannahblair!176c4d140
- Temporary fix to be able to load themes from Hub. Thanks @abidlabs!fad92c29d
- Improve default source behaviour in Audio. Thanks @hannahblair!570866a3b
- Hide show API link when in gradio lite. Thanks @hannahblair!c56128781
- Fix updating choices in gr.Dropdown
and updates related to other components. Thanks @abidlabs!92278729e
- Gallery preview fix and optionally skip download of urls in postprcess. Thanks @freddyaboulton!5668036ee
- Fix file upload on windows. Thanks @freddyaboulton!e8216be94
- ensure gr.Dataframe
updates as expected. Thanks @pngwn!8bbeca0e7
- Improve Embed and CDN handling and fix a couple of related bugs. Thanks @pngwn!61c155e9b
- Remove session if browser closed on mobile. Thanks @aliabid94!4840b4bc2
- Add that api routes are automatically named to CHANGELOG. Thanks @freddyaboulton!dd901c1b0
- Model3D panning, improved UX. Thanks @dylanebert!12d8e90a1
- Fixes input Image
component with streaming=True
. Thanks @abidlabs!de36820ef
- Fix various issues with demos on website. Thanks @aliabd!ac4f2bcde
- Remove **kwargs from queue. Thanks @freddyaboulton!e3ede2ff7
- Ensure Model 3D updates when attributes change. Thanks @hannahblair!e32bac894
- Fix updating interactive prop. Thanks @abidlabs!27194a987
- Ensure the statustracker for gr.Image
displays in static mode. Thanks @pngwn!aaa55ce85
- Video/Audio fixes. Thanks @freddyaboulton!6bce259c5
- Ensure gr.CheckboxGroup
updates as expected. Thanks @pngwn!afb72bd19
- Fix bug where radio.select passes the previous value to the function instead of the selected value. Thanks @freddyaboulton!3e31c1752
- Add likeable to config for Chatbot. Thanks @freddyaboulton!2cffcf3c3
- ensure radios have different names. Thanks @pngwn!5cddd6588
- Fixes: Initial message is overwrtitten in chat interface. Thanks @dawoodkhan82!5fe091367
- handle selected_index prop change for gallery. Thanks @pngwn!a4a931dd3
- fixFileExplorer
preprocess. Thanks @pngwn!d7a1a6559
- Fix file overflow and add keyboard navigation to FileExplorer
. Thanks @hannahblair!2ba14b284
- JS Param. Thanks @dawoodkhan82!62ec2075c
- modify preprocess to use pydantic models. Thanks @abidlabs!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.
We now support adding arbitrary JS to your apps using the js
parameter in Blocks, and arbitrary modifications to the
head
parameter in Blocks
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.
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.
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)
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)
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.
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:
**kwarg
from every component, meaning that components cannot accept arbitrary (unused) parameters. Previously, warnings would be thrown.plain
is no longer an alias for secondary
for the variant
argument in the gr.Button
classCarousel
class and StatusTracker
class and Box
layout classVariable
alias for State
.style()
methods from component classes.update()
method from component classesget_interpretation_neighbors()
and get_interpretation_scores()
from component classesdeprecation.py
— this was designed for internal usage so unlikely to break gradio appssource
param in gr.Audio
and gr.Video
to sources
show_edit_button
param from gr.Audio
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:
status_tracker
parameter from eventsHuggingFaceDatasetJSONSaver
classBlocks.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()
insteadInterface.load()
has been removedgr.load
a Space that is running Gradio 3.x. However, you can still use the client libraries (see changes to the client libraries below).enable_queue
from launch()
gr.Series
and gr.Parallel
api_name=None
, the api name is the name of the python function.Changes related to the Client libraries:
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. Here are some concrete tips to help migrate to Gradio 4.0:
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=["."])
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:
concurrency_limit=None
in Gradio 4.0. (Previously you would set queue=False
.)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()
.
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"
.
brush
parameter. In other words, where previously, you would do:gr.Image(source="canvas", tools="color-sketch")
Now, you should write:
gr.ImageEditor(sources=())
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:
"background"
, whose value is the background image"layers"
, which consists of a list of values, with the strokes in each layer corresponding to one list element."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
86edc0199
- Remove gr.mix. Thanks @abidlabs!287fe6782
- fix circular dependency with client + upload. Thanks @pngwn!59f5a4e30
- Part I: Remove serializes. Thanks @abidlabs!287fe6782
- Don’t serve files in working directory by default. Thanks @pngwn!287fe6782
- Small change to make api_open=False
by default. Thanks @pngwn!287fe6782
- Add json schema unit tests. Thanks @pngwn!287fe6782
- Remove duplicate elem_ids
from components. Thanks @pngwn!911829ac2
- Allow data at queue join. Thanks @aliabid94!287fe6782
- Moves gradio_cached_folder
inside the gradio temp direcotry. Thanks @pngwn!287fe6782
- V4: Fix constructor_args. Thanks @pngwn!287fe6782
- Remove interpretation for good. Thanks @pngwn!287fe6782
- Improve Audio Component. Thanks @pngwn!287fe6782
- pass props to example components and to example outputs. Thanks @pngwn!287fe6782
- Clean root url. Thanks @pngwn!287fe6782
- Adds the ability to build the frontend and backend of custom components in preparation for publishing to pypi using gradio_component build
. Thanks @pngwn!287fe6782
- Fix selectable prop in the backend. Thanks @pngwn!287fe6782
- Set api=False for cancel events. Thanks @pngwn!287fe6782
- Improve Video Component. Thanks @pngwn!287fe6782
- Try to trigger a major beta release. Thanks @pngwn!79c8156eb
- Queue concurrency count. Thanks @aliabid94!287fe6782
- Image v4. Thanks @pngwn!287fe6782
- Publish all components to npm. Thanks @pngwn!287fe6782
- Open source FRP server and allow gradio
to connect to custom share servers. Thanks @pngwn!287fe6782
- File upload optimization. Thanks @pngwn!287fe6782
- Custom components. Thanks @pngwn!287fe6782
- Removes deprecated arguments and parameters from v4. Thanks @pngwn!287fe6782
- V4: Use async version of shutil in upload route. Thanks @pngwn!287fe6782
- V4: Set cache dir for some component tests. Thanks @pngwn!287fe6782
- Proposal: sample demo for custom components should be a gr.Interface
. Thanks @pngwn!287fe6782
- fix cc build. Thanks @pngwn!287fe6782
- —overwrite deletes previous content. Thanks @pngwn!28322422c
- strip dangling svelte imports. Thanks @pngwn!287fe6782
- Swap websockets for SSE. Thanks @pngwn!1162ed621
- Remove show_edit_button
param in Audio. Thanks @hannahblair!a7435ba9e
- Fix static issues with Lite on v4. Thanks @aliabd!e4f7b4b40
- fix circular dependency with client + upload. Thanks @pngwn!667802a6c
- JS Component Documentation. Thanks @freddyaboulton!103416d17
- JS READMEs and Storybook on Docs. Thanks @aliabd!c476bd5a5
- Image v4. Thanks @pngwn!90318b1dd
- swap mode
on the frontned to interactive
to match the backend. Thanks @pngwn!9c3bf3175
- Don’t serve files in working directory by default. Thanks @abidlabs!d2dfc1b9a
- Small change to make api_open=False
by default. Thanks @abidlabs!982bff2fd
- Remove duplicate elem_ids
from components. Thanks @hannahblair!f71ea09ae
- Moves gradio_cached_folder
inside the gradio temp direcotry. Thanks @abidlabs!a8ef6d5dc
- Remove interpretation for good. Thanks @abidlabs!bce37ac74
- Fix selectable prop in the backend. Thanks @freddyaboulton!88bccfdba
- Improve Video Component. Thanks @hannahblair!865a22d5c
- Refactor Blocks.load()
so that it is in the same style as the other listeners. Thanks @abidlabs!c3bc515bf
- Gradio custom component publish. Thanks @freddyaboulton!db143bdd1
- Make output components not editable if they are being updated. Thanks @dawoodkhan82!d5d29c947
- Open source FRP server and allow gradio
to connect to custom share servers. Thanks @abidlabs!0d261c6ec
- Fix fallback demo app template code. Thanks @freddyaboulton!71bf2702c
- Fix video. Thanks @abidlabs!bf127e124
- Swap websockets for SSE. Thanks @aliabid94!037e5af33
- WIP: Fix docs. Thanks @freddyaboulton!f08da1a6f
- Fixes markdown rendering in examples. Thanks @abidlabs!0c571c044
- Add json schema unit tests. Thanks @freddyaboulton!83e947676
- Format js in v4 branch. Thanks @freddyaboulton!fadc057bb
- V4: Fix constructor_args. Thanks @freddyaboulton!9cad2127b
- Improve Audio Component. Thanks @hannahblair!cad537aac
- pass props to example components and to example outputs. Thanks @pngwn!825c9cddc
- Fix dev mode model3D. Thanks @freddyaboulton!9a40de7bf
- Fix: Move to cache in init postprocess + Fallback Fixes. Thanks @freddyaboulton!184834d02
- Add a cli command to list available templates. Thanks @freddyaboulton!11d67ae75
- Add a stand-alone install command and tidy-up the fallback template. Thanks @freddyaboulton!338969af2
- V4: Single-file implementation of form components. Thanks @freddyaboulton!39227b6fa
- Try to trigger a major beta release. Thanks @freddyaboulton!447dfe06b
- Clean up backend of File
and UploadButton
and change the return type of preprocess()
from TemporaryFIle to string filepath. Thanks @abidlabs!abff6fb75
- Fix remaining xfail tests in backend. Thanks @freddyaboulton!cd8146ba0
- Update logos for v4. Thanks @abidlabs!be2ed5e13
- File upload optimization. Thanks @freddyaboulton!6b0bb5e6a
- Removes deprecated arguments and parameters from v4. Thanks @abidlabs!de18102b8
- V4: Fix component update bug. Thanks @freddyaboulton!9cf40f76f
- V4: Simple dropdown. Thanks @freddyaboulton!85056de5c
- V4: Simple textbox. Thanks @freddyaboulton!9053c95a1
- Simplify File Component. Thanks @freddyaboulton!35a227fbf
- Proposal: sample demo for custom components should be a gr.Interface
. Thanks @abidlabs!3b2d9eaa3
- fix cc build. Thanks @pngwn!287fe6782
- Pending events behavior. Thanks @pngwn!287fe6782
- Reinstate types that were removed in error in #5832. Thanks @pngwn!287fe6782
- Fixes: slider bar are too thin on FireFox. Thanks @pngwn!40a171ea6
- Fix image double change bug. Thanks @pngwn!0000a1916
- fix dropdown arrow size. Thanks @pngwn!bf38e5f06
- remove dupe component. Thanks @pngwn!7d07001e8
- fix storybook. Thanks @pngwn!ce036c5d4
- Pending events behavior. Thanks @dawoodkhan82!dbb7de5e0
- fix tests. Thanks @pngwn!e27997fe6
- Fix root
when user is unauthenticated so that login page appears correctly. Thanks @abidlabs!f3f98f923
- Lite error handler. Thanks @whitphx!66549d8d2
- Fixes: slider bar are too thin on FireFox. Thanks @dawoodkhan82!85ba6de13
- V4: Some misc fixes. Thanks @pngwn!319c30f3f
- rererefactor frontend files. Thanks @pngwn!85ba6de13
- Add host to dev mode for vite. Thanks @pngwn!d2314e53b
- BugFix: Make FileExplorer Component Templateable. Thanks @pngwn!85ba6de13
- Use tags to identify custom component dirs and ignore uninstalled components. Thanks @pngwn!f769876e0
- Apply formatter (and small refactoring) to the Lite-related frontend code. Thanks @whitphx!13ed8a485
- V4: Use beta release versions for ‘@gradio’ packages. Thanks @freddyaboulton!85ba6de13
- Adds the ability to build the frontend and backend of custom components in preparation for publishing to pypi using gradio_component build
. Thanks @pngwn!85ba6de13
- Fix deployed demos on v4 branch. Thanks @pngwn!85ba6de13
- Set api=False for cancel events. Thanks @pngwn!85ba6de13
- Use full path to executables in CLI. Thanks @pngwn!1c390f101
- Merge main again. Thanks @pngwn!85ba6de13
- Simplify how files are handled in components in 4.0. Thanks @pngwn!85ba6de13
- Name Endpoints if api_name is None. Thanks @pngwn!dcf13d750
- V4: Update Component pyi file. Thanks @freddyaboulton!85ba6de13
- Rename gradio_component to gradio component. Thanks @pngwn!85ba6de13
- V4: Use async version of shutil in upload route. Thanks @pngwn!85ba6de13
- V4: Set cache dir for some component tests. Thanks @pngwn!fee3d527e
- Adds column_widths
to gr.Dataframe
and hide overflowing text when wrap=False
. Thanks @abidlabs!85ba6de13
- Better logs in dev mode. Thanks @pngwn!d0cc6b136
- fixup. Thanks @pngwn!465f58957
- Show empty JSON icon when value
is null
. Thanks @hannahblair!85ba6de13
- Reinstate types that were removed in error in #5832. Thanks @pngwn!b67115e8e
- Lite: Make the Examples component display media files using pseudo HTTP requests to the Wasm server. Thanks @whitphx!1aa186220
- Lite: Fix Examples.create() to be a normal func so it can be called in the Wasm env. Thanks @whitphx!121f25b2d
- Lite: Fix is_self_host() to detect 127.0.0.1
as localhost as well. Thanks @whitphx!e24163e15
- Added dimensionality check to avoid bad array dimensions. Thanks @THEGAMECHANGER416!46334780d
- Mention that audio is normalized when converting to wav in docs. Thanks @aileenvl!a55b80942
- Add styling (e.g. font colors and background colors) support to gr.DataFrame
through the pd.Styler
object. Thanks @abidlabs!5f1cbc436
- Add support for gr.Request to gr.ChatInterface. Thanks @DarhkVoyd!c4e3a9274
- Fix curly brackets in docstrings. Thanks @whitphx!8d909624f
- Fix styling issues with Audio, Image and Video components. Thanks @aliabd!e70805d54
- Change BlockLabel
element to use <label>
. Thanks @aileenvl!c07207e0b
- Remove deprecated .update()
usage from Interface internals. Thanks @abidlabs!b450cef15
- Fix type the docstring of the Code component. Thanks @whitphx!4e62b8493
- Ensure websocket polyfill doesn’t load if there is already a global.Webocket
property set. Thanks @Jay2theWhy!b83064da0
- Fix error when scrolling dropdown with scrollbar. Thanks @Kit-p!7b63db271
- Convert async methods in the Examples class into normal sync methods. Thanks @whitphx!891d42e9b
- Define Font.repr() to be printed in the doc in a readable format. Thanks @whitphx!1d5b15a2d
- Assert refactor in external.py. Thanks @harry-urek!48e09ee88
- Quick fix: Chatbot change event. Thanks @dawoodkhan82!c4ba832b3
- Remove deprecation warning from gr.update
and clean up associated code. Thanks @abidlabs!0592c301d
- Fix Dataframe line_breaks
. Thanks @dawoodkhan82!fbce277e5
- Keep Markdown rendered lists within dataframe cells. Thanks @abidlabs!361823896
- Fix dataframe line_breaks
. Thanks @dawoodkhan82!796145e2c
- Fix calls to the component server so that gr.FileExplorer
works on Spaces. Thanks @abidlabs!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.
For more information check the FileExplorer
documentation.
Thanks @aliabid94!
ed0f9a21b
- Adds change()
event to gr.Gallery
. Thanks @abidlabs!4567788bd
- Adds the ability to set the selected_index
in a gr.Gallery
. Thanks @abidlabs!caeee8bf7
- ensure the client does not depend on window
when running in a node environment. Thanks @gibiee!a0d3cc45c
- Fix gr.SelectData
so that the target attribute is correctly attached, and the filedata is included in the data attribute with gr.Gallery
. Thanks @abidlabs!957ba5cfd
- Prevent bokeh from injecting bokeh js multiple times. Thanks @abidlabs!37e70842d
- added try except block in state.py
. Thanks @SrijanSahaySrivastava!f096c3ae1
- Throw helpful error when media devices are not found. Thanks @hannahblair!c0fef4454
- Revert replica proxy logic and instead implement using the root
variable. Thanks @freddyaboulton!e2874bc3c
- fix pending chatbot message styling and ensure messages with value None
don’t render. Thanks @hannahblair!8f0fed857
- Improve chatbot accessibility and UX. Thanks @hannahblair!2a5b9e03b
- Added support for pandas Styler
object to gr.DataFrame
(initially just sets the display_value
). Thanks @abidlabs!abb5e9df4
- Ensure images with no caption download in gallery. Thanks @hannahblair!502054848
- Fix Gallery columns
and rows
params. Thanks @abidlabs!e842a561a
- Fix new line issue in chatbot. Thanks @dawoodkhan82!c9af4f794
- Added timeout and error handling for frpc tunnel. Thanks @cansik!ef96d3512
- Don’t raise warnings when returning an updated component in a dictionary. Thanks @abidlabs!caf6d9c0e
- Set share=True for all Gradio apps in Colab by default. Thanks @abidlabs!dba651904
- Fix for deepcopy errors when running the replica-related logic on Spaces. Thanks @abidlabs!84e03fe50
- Adds copy buttons to website, and better descriptions to API Docs. Thanks @aliabd!a0fc5a296
- Make Tab and Tabs updatable. Thanks @abidlabs!c10dabd6b
- Fixes gr.select() Method Issues with Dataframe Cells. Thanks @dawoodkhan82!c2b31c396
- Context-based Progress tracker. Thanks @cbensimon!78e7cf516
- ensure internal data has updated before dispatching success
or then
events. Thanks @pngwn!d626c21e9
- Fully resolve generated filepaths when running on Hugging Face Spaces with multiple replicas. Thanks @abidlabs!aefb556ac
- prevent internal log_message error from /api/predict
. Thanks @cbensimon!96c4b97c7
- Adjust translation. Thanks @ylhsieh!3a48490bc
- Add a bare Component
type to the acceptable type list of gr.load()
’s inputs
and outputs
. Thanks @whitphx!b619e6f6e
- Reorganize Docs Navbar and Fill in Gaps. Thanks @aliabd!c5e969559
- Fix small issues in docs and guides. Thanks @aliabd!c57f1b75e
- Fix functional tests. Thanks @abidlabs!40de3d217
- add query parameters to the gr.Request
object through the query_params
attribute. Thanks @DarhkVoyd!ea0e00b20
- Prevent Clients from accessing API endpoints that set api_name=False
. Thanks @abidlabs!e1874aff8
- Add gr.on
listener method. Thanks @aliabid94!2e25d4305
- Pause autoscrolling if a user scrolls up in a gr.Textbox
and resume autoscrolling if they go all the way down. Thanks @abidlabs!21c7225bd
- Improve plot rendering. Thanks @aliabid94!9f9af327c
- [Refactoring] Convert async functions that don’t contain await
statements to normal functions. Thanks @whitphx!d76555a12
- Fix secondary hue bug in gr.themes.builder(). Thanks @hellofreckles!f4e4f82b5
- Increase Slider clickable area. Thanks @dawoodkhan82!6a36c3b78
- chore(deps): update dependency @types/prismjs to v1.26.1. Thanks @renovate!da05e59a5
- Cleanup of .update and .get_config per component. Thanks @aliabid94!/n get_config is removed, the config used is simply any attribute that is in the Block that shares a name with one of the constructor paramaters./n update is not removed for backwards compatibility, but deprecated. Instead return the component itself. Created a updateable decorator that simply checks to see if we’re in an update, and if so, skips the constructor and wraps the args and kwargs in an update dictionary. easy peasy.38fafb9e2
- Fix typos in Gallery docs. Thanks @atesgoral!d1ad1f671
- Attach elem_classes
selectors to layout elements, and an id to the Tab button (for targeting via CSS/JS). Thanks @abidlabs!75ddeb390
- Accessibility Improvements. Thanks @hannahblair!6b1714386
- Upgrade Pyodide to 0.24.0 and install the native orjson package. Thanks @whitphx!9ccc4794a
- Use ContextVar instead of threading.local(). Thanks @cbensimon!54d21d3f1
- Ensure HighlightedText
with merge_elements
loads without a value. Thanks @hannahblair!fb5964fb8
- Fix bug in example cache loading event. Thanks @freddyaboulton!341402337
- Allow Gradio apps containing gr.Radio()
, gr.Checkboxgroup()
, or gr.Dropdown()
to be loaded with gr.load()
. Thanks @abidlabs!7c34b434a
- Fix width and height issues that would cut off content in gr.DataFrame
. Thanks @abidlabs!faad01f8e
- Add render_markdown
parameter to chatbot. Thanks @dawoodkhan82!88d43bd12
- Fixes avatar image in chatbot being squashed. Thanks @dawoodkhan82!6b8c8afd9
- Fix incorrect behavior of gr.load()
with gr.Examples
. Thanks @abidlabs!e51fcd5d5
- setting share=True on Spaces or in wasm should warn instead of raising error. Thanks @abidlabs!52f783175
- refactor: Use package.json for version management. Thanks @DarhkVoyd!d29b1ab74
- Makes sliders consistent across all browsers. Thanks @dawoodkhan82!e0d61b8ba
- Fix .clear()
events for audio and image. Thanks @dawoodkhan82!d9e9ae43f
- Guide fixes, esp. streaming audio. Thanks @aliabid94!acdeff57e
- Allow multiple instances of Gradio with authentication to run on different ports. Thanks @abidlabs!50d9747d0
- chore(deps): update dependency iframe-resizer to v4.3.7. Thanks @renovate!4ed5902e7
- Adding basque language. Thanks @EkhiAzur!290f51871
- typo in UploadButton’s docstring. Thanks @chaeheum3!d1bf23cd2
- Modify Image examples docstring. Thanks @freddyaboulton!ba64082ed
- preprocess for components when type=‘index’. Thanks @abidlabs!301c7878
- allow gr.Image() examples to take urls. Thanks @abidlabs!a0cc9ac9
- Fixes dropdown breaking if a user types in invalid value and presses enter. Thanks @abidlabs!c5fe8eba
- Fix docstring of dropdown. Thanks @hysts!81c9ca9a
- Fix .update()
method in gr.Dropdown()
to handle choices
. Thanks @abidlabs!dc86e4a7
- Lazy load all images. Thanks @aliabid94!21f1db40
- Ensure input value saves on dropdown blur. Thanks @hannahblair!9ee20f49
- Validate i18n file names with ISO-639x. Thanks @hannahblair!c60b89b0
- Adding Central Kurdish. Thanks @Hrazhan!d112e261
- Allow interactive input in gr.HighlightedText
. Thanks @hannahblair!8909e42a
- Adds autoscroll
param to gr.Textbox()
. Thanks @dawoodkhan82!ddc02268
- Allows the gr.Dropdown
to have separate names and values, as well as enables allow_custom_value
for multiselect dropdown. Thanks @abidlabs!b271e738
- Remove except asyncio.CancelledError which is no longer necessary due to 53d7025. Thanks @whitphx!041560f9
- Fix queueing.call_prediction to retrieve the default response class in the same manner as FastAPI’s implementation. Thanks @whitphx!afcf3c48
- Do not expose existence of files outside of working directory. Thanks @abidlabs!bd2fda77
- Dispatch stop_recording
event in Audio. Thanks @hannahblair!05715f55
- Adds a filterable
parameter to gr.Dropdown
that controls whether user can type to filter choices. Thanks @abidlabs!a4e010a9
- Fix share button position. Thanks @dawoodkhan82!82ec4d26
- Allow interface with components to be run inside blocks. Thanks @abidlabs!67bb7bcb
- ensure dataframe doesn’t scroll unless needed. Thanks @pngwn!7a4a89e5
- ensure iframe is correct size on spaces. Thanks @pngwn!c77f05ab
- Fix the Queue to call API endpoints without internal HTTP routing. Thanks @whitphx!aad7acd7
- Add sort to bar plot. Thanks @Chaitanya134!afac0006
- significantly improve the performance of gr.Dataframe
for large datasets. Thanks @pngwn!d14d63e3
- Auto scroll to bottom of textbox. Thanks @dawoodkhan82!26fef8c7
- Skip view_api request in js client when auth enabled. Thanks @freddyaboulton!7ab4b70f
- api_open does not take precedence over show_api. Thanks @freddyaboulton!abf1c57d
)Thanks @dawoodkhan82!
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!
c5bf9138
- Add chat bubble width param. Thanks @dawoodkhan82!119c8343
- Faster reload mode. Thanks @freddyaboulton!79d8f9d8
- Adds height
and zoom_speed
parameters to Model3D
component, as well as a button to reset the camera position. Thanks @abidlabs!61803c65
- chore(deps): update dependency extendable-media-recorder to v9. Thanks @renovate!4ccb9a86
- Makes it possible to set the initial camera position for the Model3D
component as a tuple of (alpha, beta, radius). Thanks @mbahri!97c3c7b1
- Move scripts from old website to CI. Thanks @aliabd!b8968898
- Fix typo in utils.py. Thanks @eltociear!05892302
- Adds kwarg to disable html sanitization in gr.Chatbot()
. Thanks @dawoodkhan82!0cc7e2dc
- Hide avatar when message none. Thanks @dawoodkhan82!e4e7a431
- Renders LaTeX that is added to the page in gr.Markdown
, gr.Chatbot
, and gr.DataFrame
. Thanks @abidlabs!4d94ea0a
- Adds horizontal scrolling to content that overflows in gr.Markdown. Thanks @abidlabs!b27f7583
- Change markdown rendering to set breaks to false. Thanks @abidlabs!64666525
- Cancel Dropdown Filter. Thanks @deckar01!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 up3341148c
- Fix: wrap avatar-image in a div to clip its shape. Thanks @Keldos-Li!df090e89
- Fix Checkbox select dispatch. Thanks @freddyaboulton!31996c99
- ensure login form has correct styles. Thanks @pngwn!e32b0928
- ensure dropdown stays open when identical data is passed in. Thanks @pngwn!fe057300
)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.
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!
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!
render
function to <gradio-app>
(#5158 804fcc05
)We now have an event render
on the
<script>
function handleLoadComplete() {
console.log("Embedded space has finished rendering");
}
const gradioApp = document.querySelector("gradio-app");
gradioApp.addEventListener("render", handleLoadComplete);
</script>
Thanks @hannahblair!
f49028cf
- Move markdown & latex processing to the frontend for the gr.Markdown and gr.DataFrame components. Thanks @abidlabs!fbdad78a
- Lazy load interactive or static variants of a component individually, rather than loading both variants regardless. This change will improve performance for many applications. Thanks @pngwn!4b58ea6d
- Update i18n tokens and locale files. Thanks @hannahblair!a7460557
- Add height parameter and scrolling to gr.Dataframe
. Thanks @abidlabs!c57d4c23
- gr.Radio
and gr.CheckboxGroup
can now accept different names and values. Thanks @abidlabs!e8fd4e4e
- Add api_name
parameter to gr.Interface
. Additionally, completely hide api page if show_api=False. Thanks @freddyaboulton!a2f42e28
- Allow updating the label of gr.UpdateButton
. Thanks @abidlabs!1cefee7f
- chore(deps): update dependency marked to v7. Thanks @renovate!a773eaf7
- Stop passing inputs and preprocessing on iterators. Thanks @aliabid94!947d615d
- Sign in with Hugging Face (OAuth support). Thanks @Wauplin!cf167cd1
- Create event listener table for components on docs. Thanks @aliabd!730f0c1d
- Ensure gradio client works as expected for functions that return nothing. Thanks @raymondtri!b22e1888
- Fix the images in the theme builder to use permanent URI. Thanks @abidlabs!f344592a
- Allows setting a height to gr.File
and improves the UI of the component. Thanks @abidlabs!06982212
- Removes scrollbar from File preview when not needed. Thanks @abidlabs!15075241
- Rotate axes labels on LinePlot, BarPlot, and ScatterPlot. Thanks @Faiga91!92282cea
- Chatbot Avatar Images. Thanks @dawoodkhan82!b3e50db9
- Remove aiohttp dependency. Thanks @freddyaboulton!46a2b600
- ensure translations for audio work correctly. Thanks @hannahblair!933db53e
- Better handling of empty dataframe in gr.DataFrame
. Thanks @abidlabs!2b397791
- Fix message text overflow onto copy button in gr.Chatbot
. Thanks @hannahblair!ddac7e4d
- Ensure File component uploads files to the server. Thanks @pngwn!6fb92b48
- Fixes audio streaming issues. Thanks @aliabid94!7b8fa8aa
- Allow caching examples with streamed output. Thanks @aliabid94!cdfd4217
- Tweaks to icon
parameter in gr.Button()
. Thanks @abidlabs!3b805346
- Allows code block in chatbot to scroll horizontally. Thanks @dawoodkhan82!f769cb67
- only start listening for events after the components are mounted. Thanks @pngwn!c39f06e1
- Fix .update()
for gr.Radio()
and gr.CheckboxGroup()
. Thanks @abidlabs!87f1c2b4
- Allow gr.Interface.from_pipeline()
and gr.load()
to work within gr.Blocks()
. Thanks @abidlabs!de23e9f7
- Improve audio streaming. Thanks @aliabid94!/n - Proper audio streaming with WAV files. We now do the proper processing to stream out wav files as a single stream of audio without any cracks in the seams./n - Audio streaming with bytes. Stream any audio type by yielding out bytes, and it should work flawlessly.54bcb724
- Restores missing part of bottom border on file component. Thanks @abidlabs!1ecf88ac
- fix #5229. Thanks @breengles!502f1015
- Ensure Blocks
translation copy renders correctly. Thanks @hannahblair!a0f22626
- make_waveform()
twitter video resolution fix. Thanks @dawoodkhan82!35856f8b
)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!
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!
d7f83823
- solve how can I config root_path dynamically? #4968. Thanks @eastonsuo!6693660a
- Add download button to selected images in Gallery
. Thanks @hannahblair!61129052
- Update dependency esbuild to ^0.19.0. Thanks @renovate!80be7a1c
- chatbot conversation nodes can contain a copy button. Thanks @fazpu!0b74a159
- Use importlib
in favor of deprecated pkg_resources
. Thanks @jayceslesar!3b9494f5
- Lite: Fix the analytics module to use asyncio to work in the Wasm env. Thanks @whitphx!5244c587
- Allow new lines in HighlightedText
with /n
and preserve whitespace. Thanks @hannahblair!2745075a
- Add deploy_discord to docs. Thanks @freddyaboulton!0dc49b4c
- Add support for async functions and async generators to gr.ChatInterface
. Thanks @abidlabs!883ac364
- Add step
param to Number
. Thanks @hannahblair!22aa5eba
- Use font size --text-md
for <code>
in Chatbot messages. Thanks @jaywonchung!f5539c76
- Enhancement: Add focus event to textbox and number component. Thanks @JodyZ0203!34f6b22e
- Strip leading and trailing spaces from username in login route. Thanks @sweep-ai!144df459
- Add show_edit_button
param to gr.Audio
. Thanks @hannahblair!eaa1ce14
- Enhancing Tamil Translation: Language Refinement 🌟. Thanks @sanjaiyan-dev!8b4eb8ca
- JS Client: Fixes cannot read properties of null (reading ‘is_file’). Thanks @raymondtri!e6317d77
- Update dependency extendable-media-recorder to v8. Thanks @renovate!13e47835
- chore(deps): update dependency extendable-media-recorder to v8. Thanks @renovate!37caa2e0
- Add icon and link params to gr.Button
. Thanks @hannahblair!7d897165
- gr.Dropdown
now has correct behavior in static mode as well as when an option is selected. Thanks @abidlabs!667875b2
- Live audio streaming output1b017e68
- Add interactive
args to gr.ColorPicker
. Thanks @hannahblair!56d2609d
- Reset textbox value to empty string when value is None. Thanks @hannahblair!67265a58
- Allow supporting >1000 files in gr.File()
and gr.UploadButton()
. Thanks @abidlabs!80727bbe
- Fix dataset features and dataset preview for HuggingFaceDatasetSaver. Thanks @freddyaboulton!620e4645
- gr.Dropdown()
now supports values with arbitrary characters and doesn’t clear value when re-focused. Thanks @abidlabs!136adc9c
- Ensure gradio_client
is backwards compatible with gradio==3.24.1
. Thanks @abidlabs!97d804c7
- [Spaces] ZeroGPU Queue fix. Thanks @cbensimon!cd1353fa
- Fixes the display of minutes in the video player. Thanks @abidlabs!b84a35b7
- Add icon and link to DuplicateButton. Thanks @aliabd!f6c491b0
- highlightedtext throws an error basing on model. Thanks @rajeunoia!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")
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!
3f8c210b
- Implement left and right click in Gallery
component and show implicit images in Gallery
grid. Thanks @hannahblair!dc07a9f9
- Bringing back the “Add download button for audio” PR by @leuryr. Thanks @abidlabs!44ac8ad0
- Allow setting sketch color default. Thanks @aliabid94!b74f8453
- Adds additional_inputs
to gr.ChatInterface
. Thanks @abidlabs!41c83070
- Add CSS resets and specifiers to play nice with HF blog. Thanks @aliabid94!animate
(False
by default) in gr.make_waveform()
which animates the overlayed waveform by @dawoodkhan82 in PR 4918show_download_button
param to allow the download button in static Image components to be hidden by @hannahblair in PR 4959gr.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.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 4989brush_color
. Also, masks drawn on images are now slightly translucent (and mask color can also be set via brush_color). By @aliabid94 in PR 4979cancels
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.gr.State
in gr.ChatInterface
to reduce latency by @freddyaboulton in PR 4976gr.Interface
where component labels inferred from handler parameters were including special args like gr.Request
or gr.EventData
. By @cbensimon in PR 4956components
directory by @freddyaboulton in PR 4948Introducing 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:
And a corresponding easy-to-use API at /chat
:
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
gr.Chatbot()
by @dawoodkhan82 in PR 4848gr.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 4933Examples 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 environment
to 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.
.change()
event is fixed in Video
and Image
so that it only fires once by @abidlabs in PR 4793.change()
event is fixed in Audio
so that fires when the component value is programmatically updated by @abidlabs in PR 4793display: flex
property to Row
so that flex styling is applied to children by [@hannahblair] in PR 4896gr.Video
could not preprocess urls by @freddyaboulton in PR 4904gr.Group
and container=False
. container
parameter only available for Textbox
, Number
, and Dropdown
, the only elements where it makes sense. By @aliabid94 in PR 4916app.py
from ThemeClass.push_to_hub
by @deepkyu in PR 4944gradio
due to changes in downstream dependencies by @abidlabs in PR 4885max_size
defaults to parent Blocks max_thread
when running on Spaces with ZeroGPU hardware. By @cbensimon in PR 4937Motivated 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.
gr.File
change event was not triggered when the value was changed by another event by @freddyaboulton in PR 4811gr.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 4651space
, src
, and host
attributes to be updated dynamically by @pngwn in PR 4461api_name
parameter now accepts False
as a value, which means it does not show up in named or unnamed endpoints. By @abidlabs in PR 4683pathlib.Path
in gr.Video
, gr.Gallery
, and gr.Chatbot
by sunilkumardash9 in PR 4581.info
attribute to update when update()
is called on them. by @jebarpg in PR 4715.Image
components undo button works mode is mask
or color-sketch
by @amyorz in PR 4692gr.components
by @abidlabs in PR 4566select
event was not triggered in gr.Gallery
if height
was set to be large with allow_preview=False
by @freddyaboulton in PR 4551visible=False
in gr.Group
event did not work by @abidlabs in PR 4567make_waveform
to work with paths that contain spaces @akx in PR 4570 & PR 4578stop_recording
event for gr.Audio
and gr.Video
components by @freddyaboulton in PR 4554gr.Gallery
where height
and object_fit
parameters where being ignored by @freddyaboulton in PR 4576AnnotatedImage
css styling was causing the annotation masks to not be displayed correctly by @freddyaboulton in PR 4628Progress
component now appears even when no iterable
is specified in tqdm
constructor by @itrushkin in PR 4475plot
parameter deprecation warnings should now only be emitted for Image
components by @freddyaboulton in PR 4709type
deprecation warning by @freddyaboulton in PR 4709autoplay=True
and the video source is dynamically updated @pngwn in PR 4705gr.Dropdown
being cutoff at the bottom by @abidlabs in PR 4691.show_label
was hiding the entire component for gr.Label
by @freddyaboulton in PR 4713.git-blame-ignore-revs
by @akx in PR 4586typing.Literal
where possible in gradio library and client by @freddyaboulton in PR 4608cleared_value
from some components as its no longer used internally by @freddyaboulton in PR 4685PR 4683 removes the explict named endpoint “load_examples” from gr.Interface that was introduced in PR 4456.
gr.ClearButton
which allows users to easily clear the values of components by @abidlabs in PR 4456Example 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()
start_recording
and stop_recording
events to Video
and Audio
components by @pngwn in PR 4422autoplay
kwarg to Video
and Audio
components by @pngwn in PR 4453allow_preview
parameter to Gallery
to control whether a detailed preview is displayed on click by
@freddyaboulton in PR 4470latex_delimiters
parameter to Chatbot
to control the delimiters used for LaTeX and to disable LaTeX in the Chatbot
by @dawoodkhan82 in PR 4516gr.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")
<a>
element, by @akx in PR 4449.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_js
parameter to work even without backend function, by @aliabid94 in PR 4486.gr.Chatbot()
by @dawoodkhan82 in PR 4491Label
component by @abidlabs in PR 4456show_label
will not automatically be set to True
in gr.BarPlot.update
by @freddyaboulton in PR 4531gr.BarPlot
group text now respects darkmode by @freddyaboulton in PR 4531new Promise()
s by @akx in PR 4442.mount_gradio_app
, by @charlesfrye in PR4519.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.$
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
.gr.UploadButton
component now supports the variant
and interactive
parameters by @abidlabs in PR 4436.gr.File(file_count='multiple')
could not be cached as output by @freddyaboulton in PR 4421/proxy
route by @abidlabs in PR 4406.gr.UploadButton
could not be used to upload the same file twice by @dawoodkhan82 in PR 4437/proxy
route was being incorrectly constructed by the frontend by @abidlabs in PR 4430.import spaces; spaces.disable_gradio_auto_wrap()
by @cbensimon in PR 4389..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 4374every
to work with generators by @dkjshk in PR 4434validate_url
to check for 403 errors and use a GET request in place of a HEAD by @alvindaiyan in PR 4388.gradio deploy
to launch a Gradio app to Spaces directly from your terminal. By @aliabid94 in PR 4033.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.Blocks.load
behave like other event listeners (allows chaining then
off of it) @anentropic in PR 4304interactive=True
in output components of a gr.Interface
by @abidlabs in PR 4356./file
routes by @abidlabs in PR 4370./proxy
route by @abidlabs in PR 4368.markedjs
sanitize function with DOMPurify sanitizer for gr.Chatbot()
by @dawoodkhan82 in PR 4360/file=
route no longer allows accessing dotfiles or files in “dot directories” by @akx in PR 4303Interface.launch()
and Blocks.launch()
now accept an app_kwargs
argument to allow customizing the configuration of the underlying FastAPI app, by @akx in PR 4282run_on_click
parameter in gr.Examples
by @abidlabs in PR 4258.initial_height
attribute by @whitphx in PR 4223mount_css
fn to remove circular dependency @whitphx in PR 4222gr.Chatbot()
using KaTeX
by @dawoodkhan82 in PR 4285.gradio app.py
) can now accept command line arguments by @micky2be in PR 4119format
argument to Audio
component by @freddyaboulton in PR 4178chatbot_dialogpt
demo by @dawoodkhan82 in PR 4238.gr.Chatbot()
markdown parsing to frontend using marked
library and prism
by @dawoodkhan82 in PR 4150Image
component by @der3318 in PR 4204.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.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.gr.File(file_count='multiple')
output components by @freddyaboulton in PR 4153/info
route by @freddyaboulton in PR 4039gr.Slider
release
event not triggering on mobile by @space-nuko in PR 4098State
component info from the /info
route by @abidlabs in PR 4107zh-cn.json
to zh-CN.json
by @abidlabs in PR 4086gr.Code()
component with streaming by @dawoodkhan82 in PR 4043visual-question-answering
, document-question-answering
, and image-to-text
using gr.Interface.load("models/...")
and gr.Interface.from_pipeline
by @osanseviero in PR 3887gr.Chatbot()
, by @dawoodkhan82 in PR 4048matplotlib
not rendering correctly if the backend was not set to Agg
by @abidlabs in PR 4029gr.State
across different Interfaces/Blocks within larger Blocks would not work by @abidlabs in PR 4030gr.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"
).\n
) are not automatically converted to <br>
in gr.Markdown()
or gr.Chatbot()
. For multiple new lines, a developer must add multiple <br>
tags.gr.HuggingFaceDatasetSaver
using HTTP methods instead of git pull/push by @Wauplin in PR 3973gr.Image
sketch modes, by @space-nuko in PR 3615gr.Video()
would not work inside a gr.Tab()
by @dawoodkhan82 in PR 3891gr.Gallery()
where setting height causes aspect ratio of images to collapse by @dawoodkhan82 in PR 3830[PR 3895](https://github.com/gradio-app/gradio/pull/3895)
.[PR 3895](https://github.com/gradio-app/gradio/pull/3895)
.Status
enum by @10zinten in PR 3931gr.ChatBot
to handle image url tye-singwa in PR 3953gr
consistent across the docs by @duerrsimon in PR 3901gradio.themes
utilities (introduced in 3.24.0) have been eradicated.
By @akx in PR 3958gr.themes.builder()
by @deepkyu in PR 3869_js
and setting outputs
to None
in gradio.Blocks()
by @DavG25 in PR 3883New 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.
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
Video
component supports subtitles(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"))
gr.Chatbot()
component by @dawoodkhan82 in PR 3816Updates the “view API” page in Gradio apps to use the gradio_client
library by @aliabd in PR 3765
Read more about how to use the gradio_client
library here: https://gradio.app/getting-started-with-the-python-client/
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)
rows
, columns
and object-fit
in style()
for gr.Gallery()
component by @dawoodkhan82 in PR 3586file_count='multiple'
case by @freddyaboulton in PR 3782select
event once the dataframe has been selected. By @yiyuezhuo in PR 3861Trigger 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()
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
By @freddyaboulton in PR 3581.
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 3523huggingface_hub
@dawoodkhan82 in PR 3488gr.load()
loads and applies the upstream theme, by @abidlabs in PR 3641lines
set to larger than 20 by @dawoodkhan82 in PR 3637gr.Dataframe
value, by @space-nuko in PR 3646gr.Image
not filling the entire element size, by @space-nuko in PR 3649gr.Code
support the lines
property, by @space-nuko in PR 3651_js
return values being double wrapped in an array, by @space-nuko in PR 3594gr.File
component to state that its preprocessing method converts the uploaded file to a temporary file, by @RussellLuo in PR 3660gr.Progress
used in same function, by @space-nuko in PR 3671Remove All
button in gr.Dropdown
single-select mode by @space-nuko in PR 3678gr.Dropdown
besides the selected item receiving a checkmark, by @space-nuko in PR 3644gr.Dropdown
issues and improve usability, by @space-nuko in PR 3705HuggingFaceDatasetJSONSaver
by @osanseviero in PR 3604Audio
and State
components, and fixes the pictionary
demo by @abidlabs in PR 3611ruff
, by @akx in PR 3710orig_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 3700Once 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
gr.Code()
component. By @abidlabs in PR 3556Gradio 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
gr.Request
object failing to handle dictionaries when nested keys couldn’t be converted to variable names #3454 by @radames in PR 3459pyright==1.1.298
for stability by @abidlabs in PR 3475IOComponent.add_interactive_to_config()
by @space-nuko in PR 3476IOComponent.generate_sample()
by @space-nuko in PR 3475You 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!
There are two ways to upload a theme, via the theme class instance or the command line.
my_theme.push_to_hub(repo_name="my_theme",
version="0.2.0",
hf_token="...")
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
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
New code component allows you to enter, edit and display code with full syntax highlighting by @pngwn in PR 3421
Chatbot
component now supports audio, video, and imagesThe 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)
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
.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
huggingface_hub
to send telemetry on interface
and blocks
; eventually to replace segment by @dawoodkhan82 in PR 3342generic_update
by shallow copying by @gitgithan in PR 3405 to fix #3282BlockContext
in utils.py
by @freddyaboulton in PR 3424generic_update
by shallow copying by @gitgithan in PR 3405 to fix #3282JSON
component (show_label parameter, icons) in @abidlabs in PR 3451height
kwarg to style in gr.Chatbot()
component by @dawoodkhan82 in PR 3369chatbot = gr.Chatbot().style(height=500)
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
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
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.
By @freddyaboulton in PR 3297
gr.Button
component by setting interactive=False
by @abidlabs in PR 3266 and PR 3288flagging_options
display text and saved flag separately by @abidlabs in PR 3289brush_radius
for the Image
component both as a default and via Image.update()
by @pngwn in PR 3277info=
argument to form components to enable extra context provided to users, by @aliabid94 in PR 3291gr.Request()
object using the .username
attribute by @abidlabs in PR 3296preview
option to Gallery.style
that launches the gallery in preview mode when first loaded by @freddyaboulton in PR 3345mirror_webcam
is always respected by @pngwn in PR 3245initial_height
when loading is complete so the embed finds its natural height once it is loaded @pngwn in PR 3292shape
argument on the front end when creating Image Sketches by @pngwn in PR 3277Dropdown's
value to be []
and adding a change event on the dropdown by @freddyaboulton in PR 3295height
set in Gallery.style
was not respected by the front-end by @freddyaboulton in PR 3343gr.Dropdown(Multiselect=True)
is an empty list and the initial value for gr.Dropdown(Multiselect=False)
is an empty string by @pngwn in PR 3338analytics_enabled=True
by @abidlabs in PR 3349types
field to the dependency field in the config by @freddyaboulton in PR 3315gr.BarPlot
component by @abidlabs in PR 3275chatbot.style(color_map=)
by [@aliabid94] in PR 3370When 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.
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
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!
By @freddyaboulton in PR 3212
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
gr.utils.delete_none
to only remove props whose values are None
from the config by @abidlabs in PR 3188change
event is now triggered when users click the ‘Clear All’ button of the multiselect DropDown component by @freddyaboulton in PR 3195clear
event is now triggered when images are cleared by @freddyaboulton in PR 3218File
component or UploadButton
component includes a file_types
parameter along with file_count=="dir"
) by @abidlabs in PR 3194gr.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 3194If 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
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
demo = gr.Interface(...)
demo.launch(
file_directories=["/var/lib/demo/path/to/resources"]
)
By @maxaudron in PR 3075
Column
) by @abidlabs in PR 3123Interface
via the %%blocks
jupyter notebook magic command by @freddyaboulton in PR 3126launch
will not be respected when using reload mode, e.g. gradio
command by @freddyaboulton in PR 3089equal_height
parameter should be passed to the .style()
method of gr.Row()
by @freddyaboulton in PR 3125fake_diffusion
demos by @freddyaboulton in PR 3120Previously photos uploaded via iOS would be rotated after processing. This has been fixed by @freddyaboulton in PR 3089
######### Before
######### After
A share link will automatically be created when running on Kaggle kernels (notebooks) so that the front-end is properly displayed.
By @freddyaboulton in PR 3101
Gallery.style(grid=...)
by by @aliabd in PR 3107markdown-it-py
version to 2.0.0
so that the dollar math plugin is compatible by @freddyaboulton in PR 3102You can now load image-to-text
and conversational
pipelines from the hub!
io = gr.Interface.load("models/nlpconnect/vit-gpt2-image-captioning",
api_key="<optional-api-key>")
io.launch()
chatbot = gr.Interface.load("models/microsoft/DialoGPT-medium",
api_key="<optional-api-key>")
chatbot.launch()
By @freddyaboulton in PR 3011
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.
By @dawoodkhan82 in PR 3014
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).
/file/
route that was broken in a recent change in PR 3010huggingface_hub
for the HuggingFaceDatasetSaver in PR 3025closed
app by @freddyaboulton in PR 3022file_types
parameter of gr.File
or gr.UploadButton
was not a list by @freddyaboulton in PR 3048UploadButton
by @freddyaboulton in PR 3053gr.LinePlot
for the blocks_kinematics
demo by @freddyaboulton in PR 2998interface_series_load
to include some inline markdown code by @abidlabs in PR 3051mount_gradio_app
would not launch if the queue was enabled in a gradio app by @freddyaboulton in PR 2939blocks_plug
demo that prevented switching tabs programmatically with python @TashaSkyUp in PR 2971.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.
title
argument to TabbedInterface
by @MohamedAliRashad in #2888gr.File
and gr.UploadButton
, using file_types
parameter (e.g gr.File(file_count="multiple", file_types=["text", ".json", ".csv"])
) by @dawoodkhan82 in #2901multiselect
option to Dropdown
by @dawoodkhan82 in #2871multiselect
set to true
a user can now select multiple options from the gr.Dropdown
component.gr.Dropdown(["angola", "pakistan", "canada"], multiselect=True, value=["angola"])
default_enabled=False
made it so that the entire queue did not start by @freddyaboulton in PR 2876blocks_style
demo that was preventing it from launching by @freddyaboulton in PR 2890DataFrame
and LinePlot
component, by @abidlabs in PR 2816default_enabled
parameter of the Blocks.queue
method has no effect by @freddyaboulton in PR 2876Gradio’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")
By @freddyaboulton in PR 2807
examples_per_page
parameter of the Examples
component was not passed to the internal Dataset
component by @freddyaboulton in PR 2861allow_flagging="auto"
in gr.Interface()
by @abidlabs in PR 2695gr.CheckboxGroup
would crash the entire app by @freddyaboulton in PR 2866DataFrame
and ScatterPlot
component,
by @abidlabs in PR 2794[@aliencaocao](https://github.com/aliencaocao)
in [PR 2846](https://github.com/gradio-app/gradio/pull/2846)
x_lim
, y_lim
and legend positions for gr.ScatterPlot
by @freddyaboulton in PR 2807Adds 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.
every
ParameterWhen 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()
*No changes to highlight.
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!
gr.Dataframe()
to take a pandas.DataFrame
that includes numpy array and other types as its initial value, by @abidlabs in PR 2804altair
to requirements.txt by @freddyaboulton in PR 2811visible
in classes in templates.py
by @abidlabs in PR 2805https://api.ipify.org
to https://checkip.amazonaws.com/
by @abidlabs in PR 2810visible
in classes in templates.py
by @abidlabs in PR 2805https://api.ipify.org
to https://checkip.amazonaws.com/
by @abidlabs in PR 2810It 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()
By @freddyaboulton in PR 2764
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()
By @freddyaboulton in PR 2741
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()
Add Brazilian Portuguese translation (pt-BR.json) by @pstwh in PR 2753:
gr.Blocks().load()
by @abidlabs in PR 2755Chatbot
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()
To see a more realistic example, see the new demo /demo/chatbot_multimodal/run.py
.
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.
""")
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()
File
component can properly preprocess files to “binary” byte-string format by CoffeeVampir3 in PR 2727include_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 2721There 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()
New API Docs page with in-browser playground and updated aesthetics. @gary149 in PR 2652
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
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()
https://user-images.githubusercontent.com/9021060/202878400-cb16ed47-f4dd-4cb0-b2f0-102a9ff64135.mov
gr.Interface.load()
by @abidlabs in PR 2694'password'
and 'email'
types to Textbox
. @pngwn in PR 2653gr.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.gr.Interface.load
by @freddyaboulton PR 2640interactive
property of a component could not be updated by @freddyaboulton in PR 2639pd.read_sql
as opposed to low-level postgres connector by @freddyaboulton in PR 2604gr.Templates
to accept parameters to override the defaults by @abidlabs in PR 2600ValueError()
if constructed with invalid parameters for type
or source
(for components that take those parameters) in PR 2610When 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.
gr.Blocks.load()
now correctly loads example files from Spaces @abidlabs in PR 2594api_name
to Blocks.__call__
by @freddyaboulton in PR 2593Gradio 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:
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()
queue
and auth
when working with reload mode by by @freddyaboulton in PR 3089api_key
to gr.Interface.load()
by @abidlabs in PR 2568every
keyword to event listeners that runs events on a fixed schedule by @freddyaboulton in PR 2512Gradio 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).
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)
/api
endpoint from skipping the queue if the queue is enabled for that event by @freddyaboulton in PR 2493cancels
in event triggers so that it works properly if multiple
Blocks are rendered by @abidlabs in PR 2530share=True
by @abidlabs in PR 2502upload
event for Video
, Audio
, Image
, and File
components @dawoodkhan82 in PR 2448Series
or Parallel
with Blocks
by @abidlabs in PR 2543float64
, float16
, or uint16
formats by @abidlabs in PR 2545Running 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.
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()
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:
interactive
kwarg is not set.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 1711gr.Dataset
component now accepts HTML
and Markdown
components by @abidlabs in PR 2437Carousel
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.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 2400Blocks.load()
event by @abidlabs in PR 2413gr.Plot()
component @dawoodkhan82 in PR 2402Textbox
and Number
components @dawoodkhan82 in PR 2448You can now see gradio’s release history directly on the website, and also keep track of upcoming changes. Just go here.
gr.Row(variant="compact")
by @aliabid94 in PR 2291 This comes with deprecation of the following arguments for Component.style
: round
, margin
, border
.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.
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.
Small fixes to docs for Image
component by @abidlabs in PR 2372
analytics
dependency by @abidlabs in PR 2347Image
component by @abidlabs in PR 2372gr.update()
dictionary even if post-processing is disabled @abidlabs in PR 2385You 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()
You can now type values directly on the Slider component! Here’s what it looks like:
We’ve made a lot of changes to our Image component so that it can support better sketching and inpainting.
Now supports:
import gradio as gr
demo = gr.Interface(lambda x: x, gr.Sketchpad(), gr.Image())
demo.launch()
import gradio as gr
demo = gr.Interface(lambda x: x, gr.Paint(), gr.Image())
demo.launch()
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()
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()
As well as other fixes
gr.update()
in example caching by @abidlabs in PR 2309postprocess
and preprocess
to documented parameters by @abidlabs in PR 2293postprocess
and preprocess
to documented parameters by @abidlabs in PR 2293gr.update()
in example caching by @abidlabs in PR 2309You 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]
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
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()
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:
demo = gr.Interface(...)
demo.queue(concurrency_count=3)
demo.launch()
demo = gr.Interface(...)
demo.queue(max_size=100)
demo.launch()
components.Image().style(height=260, width=300)
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()
Label
component now accepts file paths to .json
files by @abidlabs in PR 2083file
route as well by @abidlabs in PR 2099State
by @abidlabs in PR 2100gr.Examples
by @abidlabs in PR 2131With 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:
Read more in the Embedding Gradio Demos guide.
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:
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:
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:
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.
gr.Examples takes two required parameters:
examples
which takes in a nested listinputs
which takes in a component or list of componentsYou can read more in the Examples docs or the Adding Examples to your Demos guide.
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.
integrate()
method moved to Blocks
by @abidlabs in PR 1776Blocks 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:
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()
Read our Introduction to Blocks guide for more, and join the 🎈 Gradio Blocks Party!
We’ve upgraded our design across the entire library: from components, and layouts all the way to dark mode.
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.
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.
gradio.components
syntax by @abidlabs in PR 848blocks-dev
by @abidlabs in PR 861Blocks
instances to be used like a Block
in other Blocks
by @abidlabs in PR 919Launchable()
by @abidlabs in PR 968