You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在JavaScript中调用Hugging Face+Gradio API遇阻,求调试及正确用法

解决JavaScript调用Hugging Face + Gradio API的问题

先排查你现有代码的潜在问题

你当前的脚本可能遇到以下几个问题:

  • 跨域限制:Hugging Face Spaces默认可能不允许外部网站的跨域请求,需要在Space的设置里开启CORS,或者用Gradio官方JS客户端处理跨域逻辑。
  • 数据格式错误:readAsDataURL返回的是带data:image/xxx;base64,前缀的字符串,而Gradio的predict接口通常需要纯base64内容(去掉前缀),或直接上传二进制文件。
  • 端点路径错误:部分Gradio应用的预测端点是/api/predict而非/predict,可以打开Space页面,在浏览器开发者工具的网络面板里查看正确的请求路径。
  • 响应结构不匹配:如果模型返回的结构和你代码里json['data'][0]['confidences'][0]['label']的层级不符,会直接报错,建议先在控制台打印console.log(json)确认响应结构。

修复后的原生JavaScript调用示例

如果要继续用原生fetch,调整代码如下:

---
title: 1. Single file
layout: page
---

<input id="photo" type="file">
<div id="results"></div>
<script>
  async function loaded(file) {
    // 用FormData直接上传二进制文件,更符合Gradio的接收预期
    const formData = new FormData();
    formData.append('data', file);

    try {
      const response = await fetch('https://hiddenmiddle-fastai-lesson2.hf.space/api/predict', {
        method: "POST",
        body: formData
        // 无需手动设置Content-Type,浏览器会自动处理边界标识
      });
      
      if (!response.ok) throw new Error(`请求失败: ${response.status}`);
      
      const json = await response.json();
      console.log('API响应:', json); // 先打印确认结构,再调整取值逻辑
      
      // 根据实际响应结构调整取值
      const label = json.data[0].confidences[0].label;
      results.innerHTML = `<br/><img src="${URL.createObjectURL(file)}" width="300"> <p>${label}</p>`;
    } catch (err) {
      results.innerHTML = `<p>调用失败: ${err.message}</p>`;
      console.error(err);
    }
  }

  function read() {
    const file = photo.files[0];
    if (file) loaded(file);
  }

  photo.addEventListener('change', read); // 用change事件替代input,触发时机更准确
</script>

更可靠的方式:使用Gradio JavaScript客户端

Gradio官方提供了JS客户端库,能自动处理跨域、数据格式和端点路径问题,推荐使用:

  1. 引入Gradio客户端库:
<script src="https://cdn.jsdelivr.net/npm/@gradio/client@latest/dist/index.min.js"></script>
  1. 调用示例:
---
title: 1. Single file
layout: page
---

<input id="photo" type="file">
<div id="results"></div>
<script src="https://cdn.jsdelivr.net/npm/@gradio/client@latest/dist/index.min.js"></script>
<script>
  async function predict(file) {
    try {
      // 初始化客户端,传入你的Space地址
      const client = await gradio.Client.connect("https://hiddenmiddle-fastai-lesson2.hf.space");
      // 调用predict方法,传入文件(客户端会自动处理格式转换)
      const result = await client.predict("/predict", [file]);
      
      console.log('预测结果:', result);
      const label = result.data[0].confidences[0].label;
      results.innerHTML = `<br/><img src="${URL.createObjectURL(file)}" width="300"> <p>${label}</p>`;
    } catch (err) {
      results.innerHTML = `<p>调用失败: ${err.message}</p>`;
      console.error(err);
    }
  }

  function read() {
    const file = photo.files[0];
    if (file) predict(file);
  }

  photo.addEventListener('change', read);
</script>

关键注意事项

  • CORS设置:如果用原生fetch,需要确保你的Hugging Face Space开启了CORS。可以在Space的app.py中修改启动代码:
    import gradio as gr
    app = gr.Interface(...)
    app.launch(server_name="0.0.0.0", server_port=7860, cors=True)
    
  • 端点确认:打开你的Space页面,手动上传一张图片,在浏览器F12的网络面板里查看请求的URL和数据格式,确保代码里的端点和格式一致。
  • 错误处理:务必添加try-catch捕获请求和解析错误,方便快速排查问题。

内容的提问来源于stack exchange,提问作者Non-chemist_dude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:10:26