tyagonzales66 commited on
Commit
8731f06
·
verified ·
1 Parent(s): 457b176

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +118 -0
app.py CHANGED
@@ -8,6 +8,124 @@ BOT_USERNAME = "@DiscussionBot"
8
  INFERENCE_URL = "https://api-inference.huggingface.co/models/bigscience/bloom"
9
  PROMPT = "Pretend you're a robot responding to machine learning discussions and reply to the following comment :\n"
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  @app.post("/")
12
  async def webhook(request: Request):
13
  if request.headers.get("X-Webhook-Secret") != os.getenv("WEBHOOK_SECRET"):
 
8
  INFERENCE_URL = "https://api-inference.huggingface.co/models/bigscience/bloom"
9
  PROMPT = "Pretend you're a robot responding to machine learning discussions and reply to the following comment :\n"
10
 
11
+ @app.get("/")
12
+ async def root(request: Request) -> Dict[str, Any]:
13
+ """
14
+ Gère les requêtes GET pour vérifier l'état du serveur et afficher les détails de la requête.
15
+ Inclut une gestion d'erreurs robuste pour capturer et signaler tout problème.
16
+ """
17
+ try:
18
+ # Préparer les détails de la requête
19
+ request_details = {
20
+ "method": request.method,
21
+ "headers": dict(request.headers),
22
+ "query_params": dict(request.query_params),
23
+ "message": "Webhook server is running. Use POST to interact with the bot."
24
+ }
25
+
26
+ # Validation des paramètres de requête (exemple : vérifier si un paramètre spécifique existe)
27
+ if "test_error" in request.query_params:
28
+ if request.query_params["test_error"] == "simulate_error":
29
+ # Simuler une erreur pour tester la gestion des exceptions
30
+ raise ValueError("Simulated error triggered by query parameter 'test_error=simulate_error'")
31
+
32
+ # Log de la requête GET reçue
33
+ print(f"GET request received: headers={request_details['headers']}, query_params={request_details['query_params']}")
34
+
35
+ return request_details
36
+
37
+ except ValueError as ve:
38
+ # Gérer les erreurs spécifiques (par exemple, paramètres invalides)
39
+ error_message = f"ValueError in GET request: {str(ve)}"
40
+ print(error_message)
41
+ raise HTTPException(status_code=400, detail=error_message)
42
+
43
+ except Exception as e:
44
+ # Gérer toutes les autres erreurs imprévues
45
+ error_message = f"Unexpected error in GET request: {str(e)}"
46
+ print(error_message)
47
+ raise HTTPException(status_code=500, detail=error_message)
48
+
49
+
50
+ @app.post("/")
51
+ async def webhook(request: Request) -> Dict[str, Any]:
52
+ """
53
+ Gère les requêtes POST des Webhooks pour traiter les commentaires mentionnant le bot.
54
+ """
55
+ try:
56
+ # Vérifier le secret du Webhook
57
+ if request.headers.get("X-Webhook-Secret") != os.getenv("WEBHOOK_SECRET"):
58
+ error_message = "Secret incorrect"
59
+ print(error_message)
60
+ raise HTTPException(status_code=400, detail=error_message)
61
+
62
+ # Extraire les données de la requête
63
+ data = await request.json()
64
+ event = data.get("event", {})
65
+
66
+ # Vérifier si l'événement est un commentaire de discussion mentionnant le bot
67
+ if (
68
+ event.get("action") == "create"
69
+ and event.get("scope") == "discussion.comment"
70
+ and BOT_USERNAME in data.get("comment", {}).get("content", "")
71
+ ):
72
+ print(f"Processing comment: {data['comment']['content']}")
73
+
74
+ # Appeler l'API BLOOM
75
+ response = requests.post(
76
+ INFERENCE_URL,
77
+ headers={"Authorization": f"Bearer {os.getenv('HF_TOKEN')}"},
78
+ json={"inputs": PROMPT + data["comment"]["content"]},
79
+ )
80
+
81
+ if response.status_code == 200:
82
+ output = response.json()
83
+ print(f"BLOOM response: {output}")
84
+ continuation_text = output[0]["generated_text"].replace(
85
+ PROMPT + data["comment"]["content"], ""
86
+ ).strip()
87
+
88
+ # Publier la réponse dans la discussion
89
+ comment_url = data["discussion"]["url"]["api"] + "/comment"
90
+ print(f"Posting to comment URL: {comment_url}")
91
+ comment_response = requests.post(
92
+ comment_url,
93
+ headers={
94
+ "Authorization": f"Bearer {os.getenv('HF_TOKEN')}",
95
+ "Content-Type": "application/json",
96
+ },
97
+ json={"comment": continuation_text},
98
+ )
99
+
100
+ if comment_response.status_code == 200:
101
+ print("Comment posted successfully")
102
+ return {"success": True}
103
+ else:
104
+ error_message = f"Failed to post comment: {comment_response.text}"
105
+ print(error_message)
106
+ raise HTTPException(status_code=500, detail=error_message)
107
+ else:
108
+ error_message = f"Inference API failed: {response.text}"
109
+ print(error_message)
110
+ raise HTTPException(status_code=500, detail=error_message)
111
+
112
+ # Si les conditions ne sont pas remplies, retourner un succès sans action
113
+ print("Comment does not meet criteria, no action taken")
114
+ return {"success": False}
115
+
116
+ except HTTPException as he:
117
+ # Propager les exceptions HTTP (par exemple, secret incorrect)
118
+ raise he
119
+ except Exception as e:
120
+ # Gérer les erreurs inattendues
121
+ error_message = f"Unexpected error in POST request: {str(e)}"
122
+ print(error_message)
123
+ raise HTTPException(status_code=500, detail=error_message)
124
+
125
+ if __name__ == "__main__":
126
+ import uvicorn
127
+ uvicorn.run(app, host="0.0.0.0", port=7860)
128
+
129
  @app.post("/")
130
  async def webhook(request: Request):
131
  if request.headers.get("X-Webhook-Secret") != os.getenv("WEBHOOK_SECRET"):