Gradio 代理 & MCP 黑客马拉松
获奖者Gradio 代理 & MCP 黑客马拉松
获奖者先决条件:本指南要求您了解 Blocks。请务必首先阅读 Blocks 指南。
本指南涵盖了自动重载、在 Python IDE 中重载以及在 Jupyter Notebook 中使用 Gradio。
当您构建 Gradio 演示,特别是使用 Blocks 构建时,您可能会发现反复运行代码来测试更改很繁琐。
为了让您更快、更方便地编写代码,我们让您在 Python IDE(如 VS Code、Sublime Text、PyCharm 等)中开发或通常从终端运行 Python 代码时,能够即时“重载”您的 Gradio 应用。我们还开发了一个类似的“魔法命令”,如果您使用 Jupyter Notebooks(或任何类似环境,如 Colab),它能让您更快地重新运行单元格。
本简短指南将涵盖这两种方法,因此无论您如何编写 Python 代码,您都将知道如何更快地构建 Gradio 应用。
如果您正在使用 Python IDE 构建 Gradio Blocks,您的代码文件(我们称之为 run.py
)可能看起来像这样
import gradio as gr
with gr.Blocks() as demo:
gr.Markdown("# Greetings from Gradio!")
inp = gr.Textbox(placeholder="What is your name?")
out = gr.Textbox()
inp.change(fn=lambda x: f"Welcome, {x}!",
inputs=inp,
outputs=out)
if __name__ == "__main__":
demo.launch()
问题是,每当您想更改布局、事件或组件时,都必须关闭并重新运行您的应用,方法是输入 python run.py
。
与其这样做,不如通过更改一个单词:将 python
改为 gradio
来在重载模式下运行您的代码。
在终端中,运行 gradio run.py
。就是这样!
现在,您会看到类似这样的内容
Watching: '/Users/freddy/sources/gradio/gradio', '/Users/freddy/sources/gradio/demo/'
Running on local URL: http://127.0.0.1:7860
这里重要的部分是显示 Watching...
的那一行。这里发生的是 Gradio 将监视 run.py
文件所在的目录,如果文件发生变化,它将自动为您重新运行该文件。因此您可以专注于编写代码,您的 Gradio 演示将自动刷新 🥳
提示: `gradio` 命令不会检测传递给 `launch()` 方法的参数,因为在重载模式下不会调用 `launch()` 方法。例如,在 `launch()` 中设置 `auth` 或 `show_error` 不会反映在应用中。
使用重载模式时,有一点很重要:Gradio 会专门在您的代码中查找一个名为 demo
的 Gradio Blocks/Interface 演示。如果您将演示命名为其他名称,则需要将演示的名称作为第二个参数传递到您的代码中。因此,如果您的 run.py
文件看起来像这样
import gradio as gr
with gr.Blocks() as my_demo:
gr.Markdown("# Greetings from Gradio!")
inp = gr.Textbox(placeholder="What is your name?")
out = gr.Textbox()
inp.change(fn=lambda x: f"Welcome, {x}!",
inputs=inp,
outputs=out)
if __name__ == "__main__":
my_demo.launch()
那么您将像这样在重载模式下启动它:gradio run.py --demo-name=my_demo
。
默认情况下,Gradio 对脚本使用 UTF-8 编码。对于重载模式,如果您使用 UTF-8 以外的编码格式(如 cp1252),请确保您已这样做
# -*- coding: cp1252 -*-
gradio run.py --encoding cp1252
🔥 如果您的应用程序接受命令行参数,您也可以传入它们。这是一个示例
import gradio as gr
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, default="User")
args, unknown = parser.parse_known_args()
with gr.Blocks() as demo:
gr.Markdown(f"# Greetings {args.name}!")
inp = gr.Textbox()
out = gr.Textbox()
inp.change(fn=lambda x: x, inputs=inp, outputs=out)
if __name__ == "__main__":
demo.launch()
您可以像这样运行:gradio run.py --name Gretel
顺便说一句,如果您更改 run.py
源代码或 Gradio 源代码,就会发生这种自动重载。这意味着如果您决定为 Gradio 本身做贡献,这会很有用 ✅
默认情况下,重载模式会在您每次进行更改时重新运行整个脚本。但在某些情况下,这并不理想。例如,加载机器学习模型可能只需发生一次以节省时间。还有一些使用 C 或 Rust 扩展的 Python 库在重载时会抛出错误,例如 numpy
和 tiktoken
。
在这些情况下,您可以将不想重新运行的代码放入 if gr.NO_RELOAD:
代码块中。这里有一个示例,说明如何在开发过程中仅加载一次 transformers 模型。
提示: `gr.NO_RELOAD` 的值为 `True`。因此,当您完成开发并想在生产环境中运行脚本时,无需更改脚本。只需使用 `python` 而不是 `gradio` 运行文件即可。
import gradio as gr
if gr.NO_RELOAD:
from transformers import pipeline
pipe = pipeline("text-classification", model="cardiffnlp/twitter-roberta-base-sentiment-latest")
demo = gr.Interface(lambda s: {d["label"]: d["score"] for d in pipe(s)}, gr.Textbox(), gr.Label())
if __name__ == "__main__":
demo.launch()
如果您使用 Jupyter Notebook(或 Colab Notebook 等)来开发代码怎么办?我们也有适合您的方案!
我们开发了一个魔法命令,可以为您创建并运行 Blocks 演示。要使用它,请在笔记本顶部加载 gradio 扩展
%load_ext gradio
然后,在您开发 Gradio 演示的单元格中,只需在顶部写入魔法命令 %%blocks
,然后像往常一样编写布局和组件即可
%%blocks
import gradio as gr
with gr.Blocks() as demo:
gr.Markdown(f"# Greetings {args.name}!")
inp = gr.Textbox()
out = gr.Textbox()
inp.change(fn=lambda x: x, inputs=inp, outputs=out)
请注意
您无需启动您的演示——Gradio 会自动为您完成!
每次您重新运行单元格时,Gradio 都会在同一端口上使用相同的底层 Web 服务器重新渲染您的应用。这意味着您将比正常重新运行单元格时快得多地看到您的更改。
在 Jupyter Notebook 中看起来是这样的
🪄 这在 Colab Notebooks 中也适用!这是一个 Colab Notebook,您可以在其中看到 Blocks 魔法的实际效果。尝试进行一些更改并重新运行包含 Gradio 代码的单元格!
提示: 您可能需要在 Colab 中使用 `%%blocks --share` 才能使演示出现在单元格中。
Notebook 魔法命令现在是作者构建 Gradio 演示的首选方式。无论您如何编写 Python 代码,我们都希望这些方法中的任何一种都能为您提供更好的 Gradio 开发体验。
现在您已经知道如何使用 Gradio 快速开发,快开始构建您自己的应用吧!
如果您正在寻找灵感,可以尝试探索其他人使用 Gradio 构建的演示,浏览公共 Hugging Face Spaces 🤗