可以使用 cURL 这个预装在许多操作系统上的命令行工具,将任何 Gradio 应用作为 API 使用。如果您尝试从 Python 或 Javascript 以外的环境查询 Gradio 应用(因为 Python 和 Javascript 都有专门的 Gradio 客户端),这特别有用。
例如,考虑这个将英文翻译成法文的 Gradio 演示:https://abidlabs-en2fr.hf.space/。
使用 curl
,我们可以以编程方式翻译文本。
这是执行它的代码:
使用了curl
工具向指定的URL发起一个POST请求,目标是调用一个部署在Hugging Face Spaces上的模型接口(例如翻译、语音识别等),并传递了一些需要处理的数据。
$ curl -X POST https://abidlabs-en2fr.hf.space/call/predict \
-H "Content-Type: application/json" \
-d '{
"data": ["Hello, my friend."]
}'
>> {"event_id": $EVENT_ID}
演示了如何使用curl
工具从指定的URL检索特定事件ID的处理结果。在这个例子中,该命令主要用于从一个模型接口获取翻译结果。
$ curl -N https://abidlabs-en2fr.hf.space/call/predict/$EVENT_ID
>> event: complete
>> data: ["Bonjour, mon ami."]
注意:进行预测并获得结果需要两个 curl
请求:一个 POST
和一个 GET
。 POST
请求返回一个 EVENT_ID
并将其打印到控制台,这在第二个 GET
请求中用于获取结果。您可以使用 awk
和 read
将这些合并成一个命令,像这样解析第一个命令的结果并传递到第二个命令:
# 使用curl命令发送POST请求,请求目的是调用翻译服务,将"Hello, my friend."翻译成法语。
# 请求结果通过管道传递给awk命令用于解析JSON,提取事件ID。
$ curl -X POST https://abidlabs-en2fr.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello, my friend."]
}' \
# 使用awk命令和-F参数设置分隔符为双引号,'$4'表示提取第四个字段,即事件ID。
| awk -F'"' '{ print $4}' \
# 将提取的事件ID赋值给EVENT_ID变量。
| read EVENT_ID;
# 使用赋值后的EVENT_ID变量作为参数,使用curl命令构造新的GET请求,查询之前请求的处理结果。
curl -N https://abidlabs-en2fr.hf.space/call/predict/$EVENT_ID
在本指南的其余部分,我们将更详细地解释这两个步骤,并提供使用 curl
查询 Gradio 应用程序的额外示例。
先决条件:对于本指南,您不需要非常详细地了解如何构建 Gradio 应用程序。但是,熟悉 Gradio 的输入和输出组件概念会有所帮助。
安装
通常,您不需要安装 cURL,因为它已预装在许多操作系统上。运行:
curl --version
确认 curl
是否已安装。如果尚未安装,您可以通过访问 https://curl.se/download.html 来安装它。
第 0 步:获取您的 Gradio 应用程序 的 URL
要查询 Gradio 应用程序,您需要其完整的 URL。这通常只是 Gradio 应用程序托管的 URL,例如:https://bec81a83-5b5c-471e.gradio.live
Hugging Face 空间
但是,如果您在 Hugging Face 空间中查询 Gradio,您需要使用嵌入式 Gradio 应用程序的 URL,而不是空间网页的 URL。例如:
❌ Space URL: https://huggingface.co/spaces/abidlabs/en2fr
✅ Gradio app URL: https://abidlabs-en2fr.hf.space/
您可以通过点击页面底部的“查看 API”链接来获取 Gradio 应用程序的 URL。或者,您可以在页面上右键单击,然后单击“查看框架源”或浏览器中的等效项来查看嵌入式 Gradio 应用程序的 URL。
虽然您可以将任何公共空间作为 API 使用,但如果您的请求过多,您可能会受到 Hugging Face 的限制。为了无限制地使用空间,只需复制空间以创建一个私有空间,然后您就可以根据需要发出尽可能多的请求!
注意:要查询私人空间,您需要传入您的 Hugging Face(HF)令牌。您可以在此处获取您的 HF 令牌:https://huggingface.co/settings/tokens。在这种情况下,您需要在我们下面讨论的两个 curl
调用中都包含一个额外的头部:
-H "Authorization: Bearer $HF_TOKEN"
现在,我们准备发出两个 curl
请求。
第一步:进行预测(POST)
两个 curl
请求中的第一个是 POST
请求,它将输入负载提交到 Gradio 应用程序。
POST
请求的语法如下:
$ curl -X POST $URL/call/$API_NAME -H "Content-Type: application/json" -d '{
"data": $PAYLOAD
}'
在这里:
$URL
是在步骤 0 中获得的 Gradio 应用程序的 URL$API_NAME
是你正在运行的事件的 API 端点名称。你可以通过点击页面底部的“查看 API”链接来获取 API 端点名称。$PAYLOAD
是一个有效的 JSON 数据列表,包含输入负载的每个输入组件的一个元素。
当你成功地发出这个 POST
请求时,你将获得一个事件 id,它将以这种格式打印到终端:
>> {"event_id": $EVENT_ID}
此 EVENT_ID
将在后续的 curl
请求中需要,以获取预测结果。
这里有一些如何发出 POST
请求的例子
基本示例
回顾页面开头的示例,以下是如何为一个简单的 Gradio 应用程序发出 POST
请求,该应用程序接受单个输入文本组件:
$ curl -X POST https://abidlabs-en2fr.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello, my friend."]
}'
多个输入组件
curl -X POST https://gradio-hello-world-3.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello", true, 5]
}'
私人空间
如前所述,如果您要向私人空间发出请求,您需要传入一个具有读取空间权限的 Hugging Face 令牌。请求将如下所示:
# 使用curl命令向指定的API接口发送POST请求。
$ curl -X POST https://private-space.hf.space/call/predict \
# 添加一个Content-Type头部,说明请求体是JSON格式的。
-H "Content-Type: application/json" \
# 添加一个Authorization头部,使用Bearer令牌进行身份验证。
# $HF_TOKEN是一个环境变量,存放着访问令牌。你需要将其替换成实际的令牌值。
-H "Authorization: Bearer $HF_TOKEN" \
# -d 参数用于指定请求的数据体,这里以JSON格式发送数据。
-d '{
"data": ["Hello, my friend."]
}'
文件
如果您使用 curl
查询需要文件输入的 Gradio 应用程序,文件需要以 URL 的形式提供,URL 需要用这种格式封装在字典中:
{"path": $URL}
这是一个 POST
请求的例子:
$ curl -X POST https://gradio-image-mod.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": [{"path": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"}]
}'
有状态演示
如果您的 Gradio 演示在多次交互中保持用户状态(例如,是一个聊天机器人),您可以在 data
旁边传入一个 session_hash
。具有相同 session_hash
的请求被认为是同一用户会话的一部分。这可能是什么样子:
# 第一条命令:开始一个新的聊天会话
curl -X POST https://gradio-chatinterface-random-response.hf.space/call/chat \
-H "Content-Type: application/json" \
-d '{
"data": ["Are you sentient?"], # 聊天数据,即用户输入的问题
"session_hash": "randomsequence1234" # 会话哈希值,用于标识会话
}'
# 第二条命令:在同一会话中继续提问
curl -X POST https://gradio-chatinterface-random-response.hf.space/call/chat \
-H "Content-Type: application/json" \
-d '{
"data": ["Really?"], # 用户的后续提问
"session_hash": "randomsequence1234" # 使用相同的会话哈希值来标识是同一会话
}'
# 第三条命令:开始一个全新的会话
curl -X POST https://gradio-chatinterface-random-response.hf.space/call/chat \
-H "Content-Type: application/json" \
-d '{
"data": ["Are you sentient?"], # 聊天数据,即用户输入的问题
"session_hash": "newsequence5678" # 使用不同的会话哈希值,标识这是一个新的会话
}'
步骤 2:获取结果
一旦您收到与您的预测相对应的 EVENT_ID
,您就可以流式传输结果。Gradio 将这些结果存储在 Gradio 应用程序中的最近最少使用缓存中。默认情况下,缓存可以存储 2,000 个结果(跨所有用户和应用程序的端点)。
要流式传输您的预测结果,请使用以下语法发出 GET
请求:
$ curl -N $URL/call/$API_NAME/$EVENT_ID
✍️ 提示:如果您正在从私人空间获取结果,请在`GET`请求中这样包含一个带有您的 HF 令牌的头部:`-H "Authorization: Bearer $HF_TOKEN"`。
这应该会产生这种格式的响应流:
event: ...
data: ...
event: ...
data: ...
...
这里: event
可以是以下之一:
generating
:表示一个中间结果complete
:表示预测已完成并得出最终结果error
:表示预测未成功完成heartbeat
:每 15 秒发送一次以保持请求活跃
data
的格式与输入负载相同:有效的 JSON 数据列表,包含每个输出组件的输出结果。
如果请求成功完成,您应该期望的结果示例如下:
基本示例
回顾页面开头的示例,我们期望结果看起来像这样:
event: complete
data: ["Bonjour, mon ami."]
多重输出
如果您的端点返回多个值,它们将作为 data
列表的元素出现:
event: complete
data: ["Good morning Hello. It is 5 degrees today", -15.0]
流媒体示例
如果您的 Gradio 应用程序流式传输一系列值,那么它们将直接流式传输到您的终端,就像这样:
event: generating
data: ["Hello, w!"]
event: generating
data: ["Hello, wo!"]
event: generating
data: ["Hello, wor!"]
event: generating
data: ["Hello, worl!"]
event: generating
data: ["Hello, world!"]
event: complete
data: ["Hello, world!"]
文件示例
如果您的 Gradio 应用程序返回一个文件,该文件将以这种格式(包括可能的一些额外键)表示为一个字典:
{
"orig_name": "example.jpg",
"path": "/path/in/server.jpg",
"url": "https:/example.com/example.jpg",
"meta": {"_type": "gradio.FileData"}
}
在您的终端,它可能会像这样显示:
event: complete
data: [{"path": "/tmp/gradio/359933dc8d6cfe1b022f35e2c639e6e42c97a003/image.webp", "url": "https://gradio-image-mod.hf.space/c/file=/tmp/gradio/359933dc8d6cfe1b022f35e2c639e6e42c97a003/image.webp", "size": null, "orig_name": "image.webp", "mime_type": null, "is_stream": false, "meta": {"_type": "gradio.FileData"}}]