dylanebert HF Staff commited on
Commit
9e0542d
·
1 Parent(s): dd91ef9
Files changed (1) hide show
  1. viewer/src/routes/+page.svelte +406 -36
viewer/src/routes/+page.svelte CHANGED
@@ -2,20 +2,20 @@
2
  import { onMount } from "svelte";
3
  import SvelteTable, { type TableColumn } from "svelte-table";
4
 
5
- interface Row {
6
- Name: string;
7
- Orgs: string[];
8
- Authors: string[];
9
- Tags: string[];
10
- CodeStatus: string;
11
- Paper: string;
12
- Code: string;
13
- Space: string;
14
- Model: string;
15
- Dataset: string;
16
- Project: string;
17
- License: string;
18
- Date: string;
19
  }
20
 
21
  let rows: Row[] = [];
@@ -275,44 +275,414 @@
275
  }
276
  }
277
 
 
 
 
278
  const addEntry = async () => {
279
  if (!("Name" in selection)) return;
280
- const value = selection["Name"];
281
- const response = await fetch("/add-entry", {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  method: "POST",
283
  headers: {
284
  "Content-Type": "application/json",
285
  },
286
- body: JSON.stringify({ value }),
287
  });
288
  const data = await response.json();
289
- console.log(data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290
  };
291
 
292
- onMount(async () => {
293
- const url = "https://dylanebert-research-tracker-backend.hf.space/data";
294
- const response = await fetch(url, {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  method: "GET",
296
  headers: {
297
- "Authorization": "Bearer " + import.meta.env.VITE_HF_TOKEN,
298
  },
299
  });
300
  rows = await response.json();
301
- });
 
302
  </script>
303
 
304
- <div style="text-align: center; margin-top: 1rem;">
305
- <input
306
- type="text"
307
- placeholder="Enter relevant project, code, paper, space, model, or dataset URL"
308
- style="width: 100%; max-width: 512px; margin-bottom: 1rem;"
309
- bind:value={searchValue}
310
- />
311
- <button on:click={addEntry}>New Entry</button>
312
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
313
 
314
- <SvelteTable {columns} {rows} bind:filterSelections={selection} />
 
315
 
316
- <div style="text-align: center; margin-top: 1rem;">
317
- <button on:click={addEntry}>New Entry</button>
318
- </div>
 
2
  import { onMount } from "svelte";
3
  import SvelteTable, { type TableColumn } from "svelte-table";
4
 
5
+ class Row {
6
+ Name: string | null = null;
7
+ Orgs: string[] = [];
8
+ Authors: string[] = [];
9
+ Tags: string[] = [];
10
+ CodeStatus: string | null = null;
11
+ Paper: string | null = null;
12
+ Code: string | null = null;
13
+ Space: string | null = null;
14
+ Model: string | null = null;
15
+ Dataset: string | null = null;
16
+ Project: string | null = null;
17
+ License: string | null = null;
18
+ Date: string | null = null;
19
  }
20
 
21
  let rows: Row[] = [];
 
275
  }
276
  }
277
 
278
+ let statusMessage = "";
279
+ const baseURL = "https://dylanebert-research-tracker-backend.hf.space";
280
+
281
  const addEntry = async () => {
282
  if (!("Name" in selection)) return;
283
+ const value = selection["Name"] as string;
284
+ const row = new Row();
285
+ const field = await inferField(row, value);
286
+ if (!field) return;
287
+ if (field === "Name") {
288
+ row.Name = value;
289
+ } else if (field === "Paper") {
290
+ row.Paper = value;
291
+ } else if (field === "Code") {
292
+ row.Code = value;
293
+ } else if (field === "Space") {
294
+ row.Space = value;
295
+ } else if (field === "Model") {
296
+ row.Model = value;
297
+ } else if (field === "Dataset") {
298
+ row.Dataset = value;
299
+ } else if (field === "Project") {
300
+ row.Project = value;
301
+ } else {
302
+ statusMessage = `<span style="color: red;">Error: Failed to infer field type for "${value}"</span>`;
303
+ return;
304
+ }
305
+ const paper = row.Paper || (await inferPaper(row));
306
+ const code = row.Code || (await inferCode(row));
307
+ const name = row.Name || (await inferName(row));
308
+ if (!name) {
309
+ statusMessage += `<br><span style="color: red;">Error: Failed to add entry</span>`;
310
+ return;
311
+ }
312
+ const authors = await inferAuthors(row);
313
+ const orgs = await inferOrgs(row);
314
+ const date = await inferDate(row);
315
+ const model = await inferModel(row);
316
+ const dataset = await inferDataset(row);
317
+ if (paper) {
318
+ row.Paper = paper;
319
+ }
320
+ if (code) {
321
+ row.Code = code;
322
+ }
323
+ if (name) {
324
+ row.Name = name;
325
+ }
326
+ if (authors) {
327
+ row.Authors = authors.split(", ");
328
+ }
329
+ if (orgs) {
330
+ row.Orgs = orgs.split(", ");
331
+ }
332
+ if (date) {
333
+ row.Date = date;
334
+ }
335
+ if (model) {
336
+ row.Model = model;
337
+ }
338
+ if (dataset) {
339
+ row.Dataset = dataset;
340
+ }
341
+ const response = await fetch(baseURL + "/add-entry", {
342
  method: "POST",
343
  headers: {
344
  "Content-Type": "application/json",
345
  },
346
+ body: JSON.stringify(row),
347
  });
348
  const data = await response.json();
349
+ if (data.error || !data.success) {
350
+ if (data.error) {
351
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
352
+ } else {
353
+ statusMessage += `<br><span style="color: red;">Error: Failed to add entry</span>`;
354
+ }
355
+ return;
356
+ }
357
+ statusMessage += `<br><span style="color: green;">Added entry for "${row.Name}"</span>`;
358
+ rows = [row, ...rows];
359
+ };
360
+
361
+ const inferField = async (row: Row, value: string): Promise<string | null> => {
362
+ let data;
363
+ try {
364
+ const response = await fetch(baseURL + "/infer-field", {
365
+ method: "POST",
366
+ headers: {
367
+ "Content-Type": "application/json",
368
+ },
369
+ body: JSON.stringify({ value }),
370
+ });
371
+ data = await response.json();
372
+ } catch (e) {
373
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer field type for "${value}"</span>`;
374
+ return null;
375
+ }
376
+ if (data.error || !data.field || !(data.field in row)) {
377
+ statusMessage = `<span style="color: red;">Error: Failed to infer field type for "${value}"</span>`;
378
+ return null;
379
+ }
380
+ statusMessage = `<span style="color: green;">Inferred field type: ${data.field}</span>`;
381
+ return data.field;
382
+ };
383
+
384
+ const inferPaper = async (row: Row) => {
385
+ statusMessage += `<br><span>Inferring paper...</span>`;
386
+ let data;
387
+ try {
388
+ const response = await fetch(baseURL + "/infer-paper", {
389
+ method: "POST",
390
+ headers: {
391
+ "Content-Type": "application/json",
392
+ },
393
+ body: JSON.stringify(row),
394
+ });
395
+ data = await response.json();
396
+ } catch (e) {
397
+ statusMessage = statusMessage.split("<br><span>Inferring paper...</span>")[0];
398
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer paper</span>`;
399
+ return null;
400
+ }
401
+ statusMessage = statusMessage.split("<br><span>Inferring paper...</span>")[0];
402
+ if (data.error || !data.paper) {
403
+ if (data.error) {
404
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
405
+ } else if (data.message) {
406
+ statusMessage += `<br><span>${data.message}</span>`;
407
+ } else {
408
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer paper</span>`;
409
+ }
410
+ return null;
411
+ }
412
+ const link = `<a href="${data.paper}" target="_blank">${data.paper}</a>`;
413
+ statusMessage += `<br><span style="color: green;">Inferred paper: ${link}</span>`;
414
+ return data.paper;
415
+ };
416
+
417
+ const inferCode = async (row: Row) => {
418
+ statusMessage += `<br><span>Inferring code...</span>`;
419
+ let data;
420
+ try {
421
+ const response = await fetch(baseURL + "/infer-code", {
422
+ method: "POST",
423
+ headers: {
424
+ "Content-Type": "application/json",
425
+ },
426
+ body: JSON.stringify(row),
427
+ });
428
+ data = await response.json();
429
+ } catch (e) {
430
+ statusMessage = statusMessage.split("<br><span>Inferring code...</span>")[0];
431
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer code</span>`;
432
+ return null;
433
+ }
434
+ statusMessage = statusMessage.split("<br><span>Inferring code...</span>")[0];
435
+ if (data.error || !data.code) {
436
+ if (data.error) {
437
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
438
+ } else if (data.message) {
439
+ statusMessage += `<br><span>${data.message}</span>`;
440
+ } else {
441
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer code</span>`;
442
+ }
443
+ return null;
444
+ }
445
+ const link = `<a href="${data.code}" target="_blank">${data.code}</a>`;
446
+ statusMessage += `<br><span style="color: green;">Inferred code: ${link}</span>`;
447
+ return data.code;
448
  };
449
 
450
+ const inferName = async (row: Row) => {
451
+ statusMessage += `<br><span>Inferring name...</span>`;
452
+ let data;
453
+ try {
454
+ const response = await fetch(baseURL + "/infer-name", {
455
+ method: "POST",
456
+ headers: {
457
+ "Content-Type": "application/json",
458
+ },
459
+ body: JSON.stringify(row),
460
+ });
461
+ data = await response.json();
462
+ } catch (e) {
463
+ statusMessage = statusMessage.split("<br><span>Inferring name...</span>")[0];
464
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer name</span>`;
465
+ return null;
466
+ }
467
+ statusMessage = statusMessage.split("<br><span>Inferring name...</span>")[0];
468
+ if (data.error || !data.name) {
469
+ if (data.error) {
470
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
471
+ } else if (data.message) {
472
+ statusMessage += `<br><span>${data.message}</span>`;
473
+ } else {
474
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer name</span>`;
475
+ }
476
+ return null;
477
+ }
478
+ statusMessage += `<br><span style="color: green;">Inferred name: ${data.name}</span>`;
479
+ return data.name;
480
+ };
481
+
482
+ const inferAuthors = async (row: Row) => {
483
+ statusMessage += `<br><span>Inferring authors...</span>`;
484
+ let data;
485
+ try {
486
+ const response = await fetch(baseURL + "/infer-authors", {
487
+ method: "POST",
488
+ headers: {
489
+ "Content-Type": "application/json",
490
+ },
491
+ body: JSON.stringify(row),
492
+ });
493
+ data = await response.json();
494
+ } catch (e) {
495
+ statusMessage = statusMessage.split("<br><span>Inferring authors...</span>")[0];
496
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer authors</span>`;
497
+ return null;
498
+ }
499
+ statusMessage = statusMessage.split("<br><span>Inferring authors...</span>")[0];
500
+ if (data.error || !data.authors) {
501
+ if (data.error) {
502
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
503
+ } else if (data.message) {
504
+ statusMessage += `<br><span>${data.message}</span>`;
505
+ } else {
506
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer authors</span>`;
507
+ }
508
+ return null;
509
+ }
510
+ statusMessage += `<br><span style="color: green;">Inferred authors: ${data.authors}</span>`;
511
+ return data.authors;
512
+ };
513
+
514
+ const inferOrgs = async (row: Row) => {
515
+ statusMessage += `<br><span>Inferring orgs...</span>`;
516
+ let data;
517
+ try {
518
+ const response = await fetch(baseURL + "/infer-orgs", {
519
+ method: "POST",
520
+ headers: {
521
+ "Content-Type": "application/json",
522
+ },
523
+ body: JSON.stringify(row),
524
+ });
525
+ data = await response.json();
526
+ } catch (e) {
527
+ statusMessage = statusMessage.split("<br><span>Inferring orgs...</span>")[0];
528
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer orgs</span>`;
529
+ return null;
530
+ }
531
+ statusMessage = statusMessage.split("<br><span>Inferring orgs...</span>")[0];
532
+ if (data.error || !data.orgs) {
533
+ if (data.error) {
534
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
535
+ } else if (data.message) {
536
+ statusMessage += `<br><span>${data.message}</span>`;
537
+ } else {
538
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer orgs</span>`;
539
+ }
540
+ return null;
541
+ }
542
+ statusMessage += `<br><span style="color: green;">Inferred orgs: ${data.orgs}</span>`;
543
+ return data.orgs;
544
+ };
545
+
546
+ const inferDate = async (row: Row) => {
547
+ statusMessage += `<br><span>Inferring date...</span>`;
548
+ let data;
549
+ try {
550
+ const response = await fetch(baseURL + "/infer-date", {
551
+ method: "POST",
552
+ headers: {
553
+ "Content-Type": "application/json",
554
+ },
555
+ body: JSON.stringify(row),
556
+ });
557
+ data = await response.json();
558
+ } catch (e) {
559
+ statusMessage = statusMessage.split("<br><span>Inferring date...</span>")[0];
560
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer date</span>`;
561
+ return null;
562
+ }
563
+ statusMessage = statusMessage.split("<br><span>Inferring date...</span>")[0];
564
+ if (data.error || !data.date) {
565
+ if (data.error) {
566
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
567
+ } else if (data.message) {
568
+ statusMessage += `<br><span>${data.message}</span>`;
569
+ } else {
570
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer date</span>`;
571
+ }
572
+ return null;
573
+ }
574
+ statusMessage += `<br><span style="color: green;">Inferred date: ${data.date}</span>`;
575
+ return data.date;
576
+ };
577
+
578
+ const inferModel = async (row: Row) => {
579
+ statusMessage += `<br><span>Inferring model...</span>`;
580
+ let data;
581
+ try {
582
+ const response = await fetch(baseURL + "/infer-model", {
583
+ method: "POST",
584
+ headers: {
585
+ "Content-Type": "application/json",
586
+ },
587
+ body: JSON.stringify(row),
588
+ });
589
+ data = await response.json();
590
+ } catch (e) {
591
+ statusMessage = statusMessage.split("<br><span>Inferring model...</span>")[0];
592
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer model</span>`;
593
+ return null;
594
+ }
595
+ statusMessage = statusMessage.split("<br><span>Inferring model...</span>")[0];
596
+ if (data.error || !data.model) {
597
+ if (data.error) {
598
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
599
+ } else if (data.message) {
600
+ statusMessage += `<br><span>${data.message}</span>`;
601
+ } else {
602
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer model</span>`;
603
+ }
604
+ return null;
605
+ }
606
+ statusMessage += `<br><span style="color: green;">Inferred model: ${data.model}</span>`;
607
+ return data.model;
608
+ };
609
+
610
+ const inferDataset = async (row: Row) => {
611
+ statusMessage += `<br><span>Inferring dataset...</span>`;
612
+ let data;
613
+ try {
614
+ const response = await fetch(baseURL + "/infer-dataset", {
615
+ method: "POST",
616
+ headers: {
617
+ "Content-Type": "application/json",
618
+ },
619
+ body: JSON.stringify(row),
620
+ });
621
+ data = await response.json();
622
+ } catch (e) {
623
+ statusMessage = statusMessage.split("<br><span>Inferring dataset...</span>")[0];
624
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer dataset</span>`;
625
+ return null;
626
+ }
627
+ statusMessage = statusMessage.split("<br><span>Inferring dataset...</span>")[0];
628
+ if (data.error || !data.dataset) {
629
+ if (data.error) {
630
+ statusMessage += `<br><span style="color: red;">Error: ${data.error}</span>`;
631
+ } else if (data.message) {
632
+ statusMessage += `<br><span>${data.message}</span>`;
633
+ } else {
634
+ statusMessage += `<br><span style="color: red;">Error: Failed to infer dataset</span>`;
635
+ }
636
+ return null;
637
+ }
638
+ statusMessage += `<br><span style="color: green;">Inferred dataset: ${data.dataset}</span>`;
639
+ return data.dataset;
640
+ };
641
+
642
+ onMount(() => {
643
+ fetchRows();
644
+ });
645
+
646
+ let fetching = false;
647
+ const fetchRows = async () => {
648
+ if (fetching) return;
649
+ fetching = true;
650
+ const response = await fetch(baseURL + "/data", {
651
  method: "GET",
652
  headers: {
653
+ Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
654
  },
655
  });
656
  rows = await response.json();
657
+ fetching = false;
658
+ };
659
  </script>
660
 
661
+ {#if !import.meta.env.VITE_HF_TOKEN}
662
+ <div style="text-align: center; margin-top: 1rem;">
663
+ <p>Missing VITE_HF_TOKEN environment variable</p>
664
+ </div>
665
+ {:else if fetching}
666
+ <div style="text-align: center; margin-top: 1rem;">
667
+ <p>Fetching data from https://dylanebert-research-tracker-backend.hf.space/data</p>
668
+ </div>
669
+ {:else}
670
+ <div style="text-align: center; margin-top: 1rem;">
671
+ <input
672
+ type="text"
673
+ placeholder="Enter relevant project, code, paper, space, model, or dataset URL"
674
+ style="width: 100%; max-width: 512px;"
675
+ bind:value={searchValue}
676
+ />
677
+ <button on:click={addEntry}>New Entry</button>
678
+ </div>
679
+
680
+ {#if statusMessage}
681
+ <div style="text-align: center; margin-top: 0.5rem;">{@html statusMessage}</div>
682
+ {/if}
683
 
684
+ <!--spacer-->
685
+ <div style="height: 1rem;" />
686
 
687
+ <SvelteTable {columns} {rows} bind:filterSelections={selection} />
688
+ {/if}