Alex commited on
Commit
4ae71b6
·
1 Parent(s): 2017254
Files changed (1) hide show
  1. app.py +77 -4
app.py CHANGED
@@ -3,7 +3,8 @@ from pathlib import Path
3
  from typing import List, Dict
4
 
5
  import gradio as gr
6
- from pydantic import BaseModel, Field, validator
 
7
 
8
  # --------------- Configuration ---------------
9
  LEADERBOARD_PATH = Path("leaderboard_data.json")
@@ -31,7 +32,7 @@ class LeaderboardEntry(BaseModel):
31
  llm_pass_10: float
32
  metrics: Metrics
33
 
34
- @validator("bleu", "llm_pass_1", "llm_pass_5", "llm_pass_10", each_item=True)
35
  def score_range(cls, v: float):
36
  if not 0.0 <= v <= 1.0:
37
  raise ValueError("Scores should be between 0 and 1")
@@ -188,5 +189,77 @@ with gr.Blocks(title="Custom LLM Leaderboard") as demo:
188
  outputs=[leaderboard_df, status_markdown],
189
  )
190
 
191
- # Expose app variable for Spaces
192
- app = demo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  from typing import List, Dict
4
 
5
  import gradio as gr
6
+ from pydantic import BaseModel, Field, field_validator
7
+ from fastapi import FastAPI, HTTPException
8
 
9
  # --------------- Configuration ---------------
10
  LEADERBOARD_PATH = Path("leaderboard_data.json")
 
32
  llm_pass_10: float
33
  metrics: Metrics
34
 
35
+ @field_validator("bleu", "llm_pass_1", "llm_pass_5", "llm_pass_10")
36
  def score_range(cls, v: float):
37
  if not 0.0 <= v <= 1.0:
38
  raise ValueError("Scores should be between 0 and 1")
 
189
  outputs=[leaderboard_df, status_markdown],
190
  )
191
 
192
+ # ----------------- FastAPI backend -----------------
193
+
194
+ backend = FastAPI(title="LLM Leaderboard API")
195
+
196
+
197
+ class APISubmission(BaseModel):
198
+ model_name: str
199
+ bleu: float
200
+ llm_pass_1: float
201
+ llm_pass_5: float
202
+ llm_pass_10: float
203
+ readability: float
204
+ relevance: float
205
+ explanation_clarity: float
206
+ problem_identification: float
207
+ actionability: float
208
+ completeness: float
209
+ specificity: float
210
+ contextual_adequacy: float
211
+ consistency: float
212
+ brevity: float
213
+
214
+
215
+ @backend.post("/submit")
216
+ def api_submit(payload: APISubmission):
217
+ """Submit results via raw HTTP POST (JSON)."""
218
+ try:
219
+ LeaderboardEntry(
220
+ model_name=payload.model_name.strip(),
221
+ bleu=payload.bleu,
222
+ llm_pass_1=payload.llm_pass_1,
223
+ llm_pass_5=payload.llm_pass_5,
224
+ llm_pass_10=payload.llm_pass_10,
225
+ metrics={
226
+ "readability": payload.readability,
227
+ "relevance": payload.relevance,
228
+ "explanation_clarity": payload.explanation_clarity,
229
+ "problem_identification": payload.problem_identification,
230
+ "actionability": payload.actionability,
231
+ "completeness": payload.completeness,
232
+ "specificity": payload.specificity,
233
+ "contextual_adequacy": payload.contextual_adequacy,
234
+ "consistency": payload.consistency,
235
+ "brevity": payload.brevity,
236
+ },
237
+ )
238
+ except Exception as e:
239
+ raise HTTPException(status_code=400, detail=str(e))
240
+
241
+ # If valid, reuse same logic
242
+ submit_model(
243
+ payload.model_name,
244
+ payload.bleu,
245
+ payload.llm_pass_1,
246
+ payload.llm_pass_5,
247
+ payload.llm_pass_10,
248
+ payload.readability,
249
+ payload.relevance,
250
+ payload.explanation_clarity,
251
+ payload.problem_identification,
252
+ payload.actionability,
253
+ payload.completeness,
254
+ payload.specificity,
255
+ payload.contextual_adequacy,
256
+ payload.consistency,
257
+ payload.brevity,
258
+ )
259
+
260
+ return {"status": "ok", "message": "Submission stored"}
261
+
262
+
263
+ # ----------------- Mount Gradio -----------------
264
+
265
+ app = gr.mount_gradio_app(backend, demo, path="/")