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

HuggingFace数据集变更自动更新Space及FastAPI Webhook问题求助

问题与解决方案

问题描述

我创建了一个Hugging Face Dataset,并在我的Hugging Face Spaces应用中使用它。我希望在底层数据集发生修改时,能自动重启或更新这些Spaces。

我正在构建一个FastAPI应用来处理Webhook,但通过浏览器访问/webhook端点时遇到了问题。以下是我的完整代码:

app = FastAPI()

# Define your Hugging Face token and Spaces
HF_TOKEN = os.getenv("HF_TOKEN")  # Store your token securely in an environment variable
SPACES = ["Adityarajpurohit/QnA_ragmodel"]

def restart_space(space_id):
    """Restart a Hugging Face Space using the API."""
    api_url = f"https://api.huggingface.co/spaces/{space_id}/restart"  # Corrected API endpoint for restarting Spaces
    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    response = requests.post(api_url, headers=headers)
    if response.status_code == 200:
        print(f"Successfully restarted Space: {space_id}")
    else:
        print(f"Failed to restart Space: {space_id} - {response.status_code} - {response.text}")
@app.get("/")
async def root():
    return {"message": "Webhook server is running"}

@app.post("/webhook")
async def trigger_training(request: Request):
    payload = await request.json()
    # Parse the payload to check the event type and repository type
    webhook_payload = WebhookPayload(**payload)

    if webhook_payload.repo.type == "dataset" and webhook_payload.event.action == "update":
        print("Dataset updated, triggering updates...")
        for space_id in SPACES:
            restart_space(space_id)
        print("All related Spaces updated successfully.")
        return {"message": "Webhook processed successfully."}

    return {"message": "No action taken. Event not related to dataset update."}

浏览器输出:

error:{"detail":"Method Not Allowed"}


解决方案

1. 解决浏览器访问/webhook的报错

浏览器访问发送的是GET请求,但你的/webhook端点只配置了POST方法,因此出现Method Not Allowed是正常行为。Webhook不需要手动在浏览器访问,应该由Hugging Face的数据集服务自动发送POST请求触发。

如果需要测试,可以用curl发送POST请求:

curl -X POST http://your-webhook-url/webhook -H "Content-Type: application/json" -d '{"event": {"action": "update"}, "repo": {"type": "dataset"}}'

2. 完善Webhook配置与代码

(1)定义WebhookPayload模型

你的代码中使用了WebhookPayload但未定义,需要用Pydantic补充:

from pydantic import BaseModel

class Event(BaseModel):
    action: str

class Repo(BaseModel):
    type: str

class WebhookPayload(BaseModel):
    event: Event
    repo: Repo

(2)修复异步端点中的同步调用问题

restart_space是同步函数,直接在FastAPI的异步端点中调用会阻塞事件循环,建议用asyncio.to_thread包装:

import asyncio
import requests

async def restart_space(space_id):
    """Restart a Hugging Face Space using the API."""
    api_url = f"https://api.huggingface.co/spaces/{space_id}/restart"
    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    response = await asyncio.to_thread(requests.post, api_url, headers=headers)
    if response.status_code == 200:
        print(f"Successfully restarted Space: {space_id}")
    else:
        print(f"Failed to restart Space: {space_id} - {response.status_code} - {response.text}")

(3)配置Hugging Face数据集Webhook

在你的数据集页面进入Settings > Webhooks,添加你的Webhook URL,选择触发事件为Repository updated,保存即可。确保Webhook服务公网可访问(如果在本地运行,需要用ngrok等工具暴露端口)。

3. 替代方法

(1)使用官方huggingface_hub库

替换requests调用,更简洁且官方维护:

from huggingface_hub import HfApi

api = HfApi(token=HF_TOKEN)
api.restart_space(repo_id=space_id)

(2)无需重启,动态加载最新数据

如果你的Space是RAG应用,可以不用重启,直接在代码中每次查询前加载最新数据集:

from datasets import load_dataset

def get_latest_dataset():
    # 强制刷新缓存加载最新版本
    return load_dataset("your-dataset-id", refresh_cache=True)

(3)通过Git触发Space重新部署

如果你的Space绑定了Git仓库,可以在数据集更新时触发Git仓库的CI/CD流程,自动重新部署Space。


内容的提问来源于stack exchange,提问作者Aditya Raj purohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:19:53