File size: 2,383 Bytes
d1ddfcd
 
74f2127
 
a5b6885
 
 
 
 
d1ddfcd
74f2127
 
 
 
 
 
a5b6885
74f2127
 
 
 
 
 
a5b6885
74f2127
a5b6885
d1ddfcd
 
 
 
 
a5b6885
 
74f2127
a5b6885
d1ddfcd
a5b6885
d1ddfcd
a5b6885
 
d1ddfcd
 
a5b6885
d1ddfcd
 
a5b6885
d1ddfcd
a5b6885
d1ddfcd
a5b6885
 
d1ddfcd
e8ac5f6
 
df9ce22
74f2127
d1ddfcd
 
df9ce22
74f2127
a5b6885
 
 
 
88b92fb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from fastapi import FastAPI, Request, Response
import os
import requests
import json
import logging

# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

HF_WEBHOOK_SECRET = os.environ.get("HF_WEBHOOK_SECRET")
SLACK_WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_URL")

def send_slack_message(message: str):
    """Send a message to Slack using webhook URL"""
    if not SLACK_WEBHOOK_URL:
        logger.warning(f"No Slack webhook URL configured. Message: {message}")
        return
    
    payload = {"text": message}
    try:
        response = requests.post(SLACK_WEBHOOK_URL, json=payload)
        response.raise_for_status()
        logger.info(f"Slack message sent successfully: {message}")
    except requests.exceptions.RequestException as e:
        logger.error(f"Failed to send Slack message: {e}")

app = FastAPI()

@app.post("/webhook")
async def webhook(request: Request):
    logger.info(f"Received webhook request from {request.client.host}")
    
    if request.headers.get("X-Webhook-Secret") != HF_WEBHOOK_SECRET:
        logger.warning("Invalid webhook secret received")
        return Response("Invalid secret", status_code=401)
    
    data = await request.json()
    logger.info(f"Webhook payload: {json.dumps(data, indent=2)}")
    
    event = data.get("event", {})
    repo = data.get("repo", {})
    
    # Only process model repo events
    if repo.get("type") != "model" or event.get("scope") != "repo":
        logger.info(f"Skipping non-model repo event: type={repo.get('type')}, scope={event.get('scope')}")
        return Response("Not a model repo event", status_code=200)
    
    action = event.get("action")
    logger.info(f"Processing model repo action: {action}")
    
    if action == "move":
        old_name = repo.get("name", "unknown")
        new_name = data.get("movedTo", {}).get("name", "unknown")
        message = f"πŸ”„ Model renamed: {old_name} β†’ https://hf.co/{new_name}"
        send_slack_message(message)
    elif action == "delete":
        name = repo.get("name", "unknown")
        message = f"πŸ—‘οΈ Model deleted: https://hf.co/{name}"
        send_slack_message(message)
    else:
        logger.info(f"Unhandled action: {action}")
    
    return Response("Webhook notification received and processed!", status_code=200)