
如何用 api_visibility 参数控制 Gradio API 端点在文档中的可见性【免费下载链接】gradioBuild and share delightful machine learning apps, all in Python. Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/gr/gradio在 Gradio 中任何应用都会在页脚提供 Use via API 链接打开后是按函数签名自动生成的 API 文档页。当你构建较复杂的Blocks应用时部分事件监听器如内部状态刷新、示例加载按钮不希望出现在这份 API 文档里但仍要能被下游应用调用还有些端点则希望连 Gradio 客户端库也无法调用。从 Gradio 6.x 开始事件监听器上的show_api参数被移除api_name也不再接受False取而代之的就是本文的主角api_visibility参数参见 Gradio 6 迁移指南。适用前提一个能launch()的 GradioBlocks应用gr.Interface/gr.ChatInterface见后文说明以及浏览器或curl这类可访问本地应用 URL 的工具用于验证。api_visibility 的三个取值与各自影响api_visibility可接受三个字符串值默认值为public。三种取值的区别来自 API Page 指南 和 事件注册参数说明取值API 文档页是否显示Gradio 客户端库能否调用典型用途public默认显示能正式对外提供的端点undocumented隐藏能下游应用仍可使用不想展示但需程序化访问的内部端点private隐藏不能gradio_client或gradio/client无法调用不希望被客户端库调用的端点两个必须注意的边界源文档明确强调设置api_visibilityprivate不能拦截对该端点的直接 HTTP 请求——底层 HTTP 端点依然可达因此它不应被当作安全机制使用。api_visibilityprivate的端点会导致下游应用无法用gr.load()加载该应用因为gr.load()底层依赖 Gradio API。最短可行示例一个应用里混合三种可见性下面的完整示例把同一个add函数注册到三个按钮上分别使用默认public、undocumented和private。api_name参数用于指定端点在 API 文档中的名称端点名默认由函数名生成见 API Page 指南import gradio as gr def add(a: float, b: float) - float: return a b with gr.Blocks() as demo: num1 gr.Number() num2 gr.Number() output gr.Textbox() btn_public gr.Button(Public add) btn_undoc gr.Button(Undocumented add) btn_private gr.Button(Private add) # 默认 public出现在 API 文档页可被客户端调用 btn_public.click(add, [num1, num2], output, api_nameadd_public) # undocumented不在 API 文档页显示但客户端仍可调用 btn_undoc.click(add, [num1, num2], output, api_nameadd_undocumented, api_visibilityundocumented) # private不在 API 文档页显示且客户端库无法调用 btn_private.click(add, [num1, num2], output, api_nameadd_private, api_visibilityprivate) demo.launch()运行后在浏览器中打开应用点击页脚的Use via API链接即可打开 API 文档页。预期看到add_public而add_undocumented和add_private都不在列表里。如何验证配置生效文档页只是给人看的入口更直接的核对方式是请求应用的 API 信息接口。按 路由实现 和get_api_info的参数说明your-gradio-app-url是launch()打印出的本地地址替换为你实际的地址# 默认只返回 public 端点 curl http://127.0.0.1:7860/gradio_api/info # 附加 all_endpointstrueundocumented 端点也会出现在返回结果中 curl http://127.0.0.1:7860/gradio_api/info?all_endpointstrue判断依据第一个请求的 JSON 中应出现add_public且add_undocumented、add_private均不在其中第二个请求的返回中会多出add_undocumented但add_private依然不会出现——private端点在生成 API 信息时会被直接跳过all_endpointstrue也覆盖不到它。此外完整的 OpenAPI 规范可以从your-gradio-app-url/gradio_api/openapi.json获取用于核对文档层面对外的完整端点描述见 API Page 指南。对private端点还可以从客户端侧验证用gradio_client连接应用后调用add_private不会成功文档给出的等价结论是该端点不能被 Gradio 客户端库调用。对下游应用与客户端库的影响验证可见性时除了看文档页还要确认下游路径符合预期undocumented下游应用可以用gr.load()加载该应用并调用这个端点因为它只是从文档中隐藏。privategr.load()无法加载该应用指南原文明确指出此副作用gradio_client/gradio/client也无法调用该端点。但直接 HTTP 请求仍然可达所以涉及敏感数据时不要依赖它做访问控制。另外页脚的Runs运行历史功能与 API 文档页覆盖相同的端点范围api_visibilityundocumented或private的事件监听器不会被记录进运行历史。如果你的应用还用了auth历史按登录用户隔离不想记录任何运行历史时可以用demo.launch(run_historyFalse)关闭详见 API Page 指南的 Run History 一节。特殊情形何时会被自动设为 private除了显式传参事件注册的参数说明 指出当事件的fn为None没有后端函数时api_visibility会被自动设为private实现代码 中纯前端js函数无 Python 后端同样会自动得到private。也就是说只挂前端行为、没有 Python 函数的事件不需要也不应该再手动指定可见性。如果你用的是gr.ChatInterface它的构造函数也接受api_visibility参数作用是对话端点的可见性取值与默认值同上见 ChatInterface 参数说明。从 5.x 的 show_api / api_nameFalse 迁移过来如果你的代码还是 Gradio 5.x 的写法Gradio 6 迁移指南 给出了逐项映射可按此批量替换事件监听器上的旧参数Gradio 5.x 写法Gradio 6.x 等价写法show_apiTrue默认api_visibilitypublic或直接省略show_apiFalseapi_visibilityundocumentedapi_nameFalseapi_visibilityprivate迁移指南中的示例5.x 的show_apiFalse对应 6.x 写法with gr.Blocks() as demo: btn gr.Button(Click me) output gr.Textbox() btn.click(fnlambda: Hello, outputsoutput, api_visibilityundocumented) demo.launch()注意private与 5.x 的api_nameFalse在下游不可用这一行为上等价但 6.x 的private不阻止直接 HTTP 请求迁移后如果有安全假设建立在旧行为上需要重新评估。限制与下一步api_visibility控制的是 API 文档与客户端库层面的可见性不是访问控制文档两次强调不要把它当作安全机制。private端点会让基于 Gradio API 的gr.load()加载整个应用失败这是应用级的影响而非单端点影响。需要进一步查看端点签名与客户端调用示例时打开 Use via API 页面即可看到每个端点自动生成的代码片段与示例输入若想让端点名更清晰配合api_name参数命名即可完整配置说明见 API Page 指南。【免费下载链接】gradioBuild and share delightful machine learning apps, all in Python. Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/gr/gradio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考