Signe22 commited on
Commit
f361e22
·
verified ·
1 Parent(s): 96f2b20

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +210 -0
app.py CHANGED
@@ -152,4 +152,214 @@ def get_articles(
152
  df = pd.read_sql_query(query, conn, params=params)
153
  conn.close()
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  return df.to_dict(orient="records")
 
152
  df = pd.read_sql_query(query, conn, params=params)
153
  conn.close()
154
 
155
+ return df.to_dict(orient="records")
156
+
157
+
158
+ # =========================
159
+ # Monitoring endpoints
160
+ # =========================
161
+
162
+ @app.get("/monitoring/results")
163
+ def get_monitoring_results(
164
+ overall_status: Optional[str] = None,
165
+ requires_human_review: Optional[int] = None,
166
+ relevance_judgment: Optional[str] = None,
167
+ label_judgment: Optional[str] = None,
168
+ predicted_label: Optional[str] = None,
169
+ source: Optional[str] = None,
170
+ start_date: Optional[str] = None,
171
+ end_date: Optional[str] = None,
172
+ search: Optional[str] = None,
173
+ limit: int = Query(100, ge=1, le=500),
174
+ offset: int = Query(0, ge=0),
175
+ ):
176
+ conn = get_connection()
177
+
178
+ query = """
179
+ SELECT
180
+ monitoring_id,
181
+ article_id,
182
+ title,
183
+ description,
184
+ clean_text,
185
+ predicted_label,
186
+ source,
187
+ url,
188
+ published_at,
189
+ classified_at,
190
+ relevance_judgment,
191
+ relevance_confidence,
192
+ relevance_explanation,
193
+ label_judgment,
194
+ label_confidence,
195
+ label_explanation,
196
+ overall_status,
197
+ requires_human_review,
198
+ judge_model,
199
+ raw_judge_response,
200
+ evaluated_at
201
+ FROM monitoring_results
202
+ WHERE 1=1
203
+ """
204
+ params = []
205
+
206
+ if overall_status:
207
+ query += " AND overall_status = ?"
208
+ params.append(overall_status)
209
+
210
+ if requires_human_review is not None:
211
+ query += " AND requires_human_review = ?"
212
+ params.append(requires_human_review)
213
+
214
+ if relevance_judgment:
215
+ query += " AND relevance_judgment = ?"
216
+ params.append(relevance_judgment)
217
+
218
+ if label_judgment:
219
+ query += " AND label_judgment = ?"
220
+ params.append(label_judgment)
221
+
222
+ if predicted_label:
223
+ query += " AND predicted_label = ?"
224
+ params.append(predicted_label)
225
+
226
+ if source:
227
+ query += " AND source = ?"
228
+ params.append(source)
229
+
230
+ if start_date:
231
+ query += " AND date(published_at) >= date(?)"
232
+ params.append(start_date)
233
+
234
+ if end_date:
235
+ query += " AND date(published_at) <= date(?)"
236
+ params.append(end_date)
237
+
238
+ if search:
239
+ query += " AND (lower(title) LIKE ? OR lower(description) LIKE ?)"
240
+ pattern = f"%{search.lower()}%"
241
+ params.extend([pattern, pattern])
242
+
243
+ query += " ORDER BY evaluated_at DESC LIMIT ? OFFSET ?"
244
+ params.extend([limit, offset])
245
+
246
+ df = pd.read_sql_query(query, conn, params=params)
247
+ conn.close()
248
+
249
+ return df.to_dict(orient="records")
250
+
251
+
252
+ @app.get("/monitoring/summary")
253
+ def get_monitoring_summary():
254
+ conn = get_connection()
255
+
256
+ total_monitored = int(pd.read_sql_query(
257
+ "SELECT COUNT(*) AS n FROM monitoring_results",
258
+ conn
259
+ )["n"].iloc[0])
260
+
261
+ needs_review = int(pd.read_sql_query(
262
+ "SELECT COUNT(*) AS n FROM monitoring_results WHERE requires_human_review = 1",
263
+ conn
264
+ )["n"].iloc[0])
265
+
266
+ relevance_distribution = pd.read_sql_query(
267
+ """
268
+ SELECT relevance_judgment, COUNT(*) AS count
269
+ FROM monitoring_results
270
+ GROUP BY relevance_judgment
271
+ ORDER BY count DESC
272
+ """,
273
+ conn
274
+ ).to_dict(orient="records")
275
+
276
+ label_distribution = pd.read_sql_query(
277
+ """
278
+ SELECT label_judgment, COUNT(*) AS count
279
+ FROM monitoring_results
280
+ GROUP BY label_judgment
281
+ ORDER BY count DESC
282
+ """,
283
+ conn
284
+ ).to_dict(orient="records")
285
+
286
+ status_distribution = pd.read_sql_query(
287
+ """
288
+ SELECT overall_status, COUNT(*) AS count
289
+ FROM monitoring_results
290
+ GROUP BY overall_status
291
+ ORDER BY count DESC
292
+ """,
293
+ conn
294
+ ).to_dict(orient="records")
295
+
296
+ common_problem_labels = pd.read_sql_query(
297
+ """
298
+ SELECT predicted_label, COUNT(*) AS count
299
+ FROM monitoring_results
300
+ WHERE overall_status != 'ok'
301
+ GROUP BY predicted_label
302
+ ORDER BY count DESC
303
+ """,
304
+ conn
305
+ ).to_dict(orient="records")
306
+
307
+ daily_issues = pd.read_sql_query(
308
+ """
309
+ SELECT
310
+ date(evaluated_at) AS day,
311
+ overall_status,
312
+ COUNT(*) AS count
313
+ FROM monitoring_results
314
+ GROUP BY date(evaluated_at), overall_status
315
+ ORDER BY day ASC, overall_status ASC
316
+ """,
317
+ conn
318
+ ).to_dict(orient="records")
319
+
320
+ conn.close()
321
+
322
+ return {
323
+ "total_monitored": total_monitored,
324
+ "needs_review": needs_review,
325
+ "relevance_distribution": relevance_distribution,
326
+ "label_distribution": label_distribution,
327
+ "status_distribution": status_distribution,
328
+ "common_problem_labels": common_problem_labels,
329
+ "daily_issues": daily_issues,
330
+ }
331
+
332
+
333
+ @app.get("/monitoring/review-queue")
334
+ def get_review_queue(limit: int = Query(100, ge=1, le=500)):
335
+ conn = get_connection()
336
+
337
+ query = """
338
+ SELECT
339
+ monitoring_id,
340
+ article_id,
341
+ title,
342
+ description,
343
+ predicted_label,
344
+ source,
345
+ url,
346
+ published_at,
347
+ relevance_judgment,
348
+ relevance_confidence,
349
+ relevance_explanation,
350
+ label_judgment,
351
+ label_confidence,
352
+ label_explanation,
353
+ overall_status,
354
+ requires_human_review,
355
+ evaluated_at
356
+ FROM monitoring_results
357
+ WHERE requires_human_review = 1
358
+ ORDER BY evaluated_at DESC
359
+ LIMIT ?
360
+ """
361
+
362
+ df = pd.read_sql_query(query, conn, params=[limit])
363
+ conn.close()
364
+
365
  return df.to_dict(orient="records")