Gradio
Interfaces de démo pour modèles ML. Contrairement à streamlit, le modèle est événementiel : on déclare des composants et on branche des fonctions dessus, sans réexécution complète du script.
uv add gradio
python app.py # sert sur http://127.0.0.1:7860
Le plus court chemin
import gradio as gr
def check(site: str, produit: str) -> str:
return f"{produit} trouvé sur {site} en 3 clics"
gr.Interface(
fn=check,
inputs=["text", "text"],
outputs="text",
title="Findability checker",
).launch()
* Running on local URL: http://127.0.0.1:7860
* To create a public link, set `share=True` in `launch()`.
share=True ouvre un tunnel public valable 72 h — pratique pour montrer une démo à un
client sans rien déployer.
Blocks, pour tout le reste
Interface couvre le cas « une fonction, des entrées, des sorties ». Dès qu'il faut de la
mise en page ou plusieurs interactions, passer à Blocks.
with gr.Blocks(title="Findability") as demo:
gr.Markdown("## Test d'accessibilité produit")
with gr.Row():
site = gr.Textbox(label="Site", value="versace.com")
produit = gr.Textbox(label="Produit")
with gr.Row():
budget = gr.Slider(10, 200, value=60, step=10, label="Budget d'étapes")
mode = gr.Radio(["fast", "default"], value="default", label="Mode")
run = gr.Button("Lancer", variant="primary")
out = gr.JSON(label="Résultat")
gallery = gr.Gallery(label="Captures", columns=3)
run.click(fn=check, inputs=[site, produit, budget, mode], outputs=[out, gallery])
demo.launch()
inputs et outputs sont des listes de composants, et la fonction doit renvoyer autant
de valeurs qu'il y a de sorties, dans le même ordre.
Composants courants
| Composant | Usage |
|---|---|
gr.Textbox(lines=5) |
texte court ou long |
gr.Number, gr.Slider |
valeurs numériques |
gr.Dropdown(choices=[...], multiselect=True) |
listes |
gr.Checkbox, gr.Radio |
booléens et choix exclusifs |
gr.Image(type="pil") |
image en entrée ou sortie |
gr.File, gr.Audio, gr.Video |
fichiers |
gr.Dataframe |
tableau éditable |
gr.JSON, gr.Label |
sorties structurées |
gr.Plot |
figure matplotlib ou plotly |
Événements
run.click(fn, inputs=..., outputs=...)
site.change(fn, inputs=site, outputs=out)
site.submit(fn, ...) # touche Entrée
demo.load(fn, ...) # au chargement de la page
Enchaîner des étapes en gardant l'interface réactive :
run.click(prepare, [site], [status]).then(execute, [site], [out])
Streaming
def stream(prompt):
partial = ""
for chunk in llm.stream(prompt):
partial += chunk
yield partial # un yield = une mise à jour de l'UI
gr.Interface(fn=stream, inputs="text", outputs="text").launch()
Un générateur suffit : chaque yield pousse une nouvelle valeur au composant de sortie.
Chat
def respond(message, history):
return f"Reçu : {message}"
gr.ChatInterface(respond, type="messages").launch()
history arrive en liste de dicts {"role", "content"} avec type="messages". C'est le
format aligné sur les API LLM, à préférer à l'ancien format en tuples.
État par session
with gr.Blocks() as demo:
state = gr.State([]) # propre à chaque visiteur
def add(item, current):
current = current + [item]
return current, current
box = gr.Textbox()
out = gr.JSON()
box.submit(add, [box, state], [state, out])
gr.State n'est jamais rendu, il transporte des données Python entre événements.
Files d'attente et progression
def long_task(x, progress=gr.Progress()):
for i in progress.tqdm(range(10), desc="Sessions"):
run(i)
return "ok"
demo.queue(max_size=20).launch()
queue() est nécessaire dès que plusieurs personnes utilisent la démo en même temps.
Déployer sur Hugging Face Spaces
Un repo avec app.py, requirements.txt, et un README.md à en-tête :
---
title: Findability Checker
sdk: gradio
sdk_version: "5.0.0"
app_file: app.py
---
Les secrets se règlent dans les paramètres du Space et se lisent par os.environ.
Gradio ou Streamlit
Gradio pour exposer un modèle ou une fonction, surtout avec image, audio ou chat, et pour publier sur Spaces. Streamlit pour un tableau de bord de données avec des filtres. Les deux sont des outils de démo : au-delà, une vraie application.