thomasht86 commited on
Commit
7172de3
·
verified ·
1 Parent(s): b08a991

Upload folder using huggingface_hub

Browse files
Files changed (3) hide show
  1. frontend/app.py +18 -16
  2. main.py +3 -7
  3. output.css +4 -0
frontend/app.py CHANGED
@@ -4,7 +4,7 @@ from urllib.parse import quote_plus
4
  from fasthtml.components import H1, H2, Div, Form, Img, NotStr, P, Span
5
  from fasthtml.xtend import A, Script
6
  from lucide_fasthtml import Lucide
7
- from shad4fast import Badge, Button, Input, Label, RadioGroup, RadioGroupItem
8
 
9
  # JavaScript to check the input value and enable/disable the search button and radio buttons
10
  check_input_script = Script(
@@ -136,17 +136,17 @@ def SearchBox(with_border=False, query_value="", ranking_value="nn+colpali"):
136
  RadioGroup(
137
  Div(
138
  RadioGroupItem(value="nn+colpali", id="nn+colpali"),
139
- Label("nn+colpali", htmlFor="nn+colpali"),
140
  cls="flex items-center space-x-2",
141
  ),
142
  Div(
143
- RadioGroupItem(value="bm25+colpali", id="bm25+colpali"),
144
- Label("bm25+colpali", htmlFor="bm25+colpali"),
145
  cls="flex items-center space-x-2",
146
  ),
147
  Div(
148
- RadioGroupItem(value="bm25", id="bm25"),
149
- Label("bm25", htmlFor="bm25"),
150
  cls="flex items-center space-x-2",
151
  ),
152
  name="ranking",
@@ -276,7 +276,7 @@ def LoadingSkeleton():
276
 
277
  def SimMapButtonReady(query_id, idx, token, img_src):
278
  return Button(
279
- token,
280
  size="sm",
281
  data_image_src=img_src,
282
  id=f"sim-map-button-{query_id}-{idx}-{token}",
@@ -367,14 +367,20 @@ def SearchResult(results: list, query_id: Optional[str] = None):
367
  Div(
368
  Lucide(icon="file-text"),
369
  H2(fields["title"], cls="text-xl md:text-2xl font-semibold"),
 
 
 
 
 
370
  cls="flex items-center gap-2",
371
  ),
372
  Div(
373
  Button(
374
- "Show Text",
375
  size="sm",
376
  id=f"toggle-button-{idx}",
377
  onclick=f"toggleTextContent({idx})",
 
378
  ),
379
  ),
380
  cls="flex flex-wrap items-center justify-between bg-background px-3 py-4",
@@ -417,11 +423,7 @@ def SearchResult(results: list, query_id: Optional[str] = None):
417
  "Page " + str(fields["page_number"]),
418
  cls="text-foreground font-mono bold text-sm",
419
  ),
420
- Badge(
421
- f"Relevance score: {result['relevance']:.4f}",
422
- cls="flex gap-1.5 items-center justify-center",
423
- ),
424
- cls="flex items-center justify-between",
425
  ),
426
  Div(
427
  Div(
@@ -441,10 +443,10 @@ def SearchResult(results: list, query_id: Optional[str] = None):
441
  cls="grid bg-border p-2",
442
  ),
443
  id=f"text-column-{idx}",
444
- cls="text-column relative bg-background px-3 py-5 hidden",
445
  ),
446
  id=f"image-text-columns-{idx}",
447
- cls="relative grid grid-cols-1 border-t",
448
  ),
449
  cls="grid grid-cols-1 grid-rows-[auto_1fr]",
450
  ),
@@ -461,7 +463,7 @@ def SearchResult(results: list, query_id: Optional[str] = None):
461
 
462
  def ChatResult(query_id: str, query: str):
463
  return Div(
464
- Div("LLM Response", cls="text-xl font-semibold p-3"),
465
  Div(
466
  Div(
467
  Div(
 
4
  from fasthtml.components import H1, H2, Div, Form, Img, NotStr, P, Span
5
  from fasthtml.xtend import A, Script
6
  from lucide_fasthtml import Lucide
7
+ from shad4fast import Badge, Button, Input, Label, RadioGroup, RadioGroupItem, Separator
8
 
9
  # JavaScript to check the input value and enable/disable the search button and radio buttons
10
  check_input_script = Script(
 
136
  RadioGroup(
137
  Div(
138
  RadioGroupItem(value="nn+colpali", id="nn+colpali"),
139
+ Label("ColPali", htmlFor="ColPali"),
140
  cls="flex items-center space-x-2",
141
  ),
142
  Div(
143
+ RadioGroupItem(value="bm25", id="bm25"),
144
+ Label("BM25", htmlFor="BM25"),
145
  cls="flex items-center space-x-2",
146
  ),
147
  Div(
148
+ RadioGroupItem(value="bm25+colpali", id="bm25+colpali"),
149
+ Label("Hybrid ColPali + BM25", htmlFor="Hybrid ColPali + BM25"),
150
  cls="flex items-center space-x-2",
151
  ),
152
  name="ranking",
 
276
 
277
  def SimMapButtonReady(query_id, idx, token, img_src):
278
  return Button(
279
+ token.replace("\u2581", ""),
280
  size="sm",
281
  data_image_src=img_src,
282
  id=f"sim-map-button-{query_id}-{idx}-{token}",
 
367
  Div(
368
  Lucide(icon="file-text"),
369
  H2(fields["title"], cls="text-xl md:text-2xl font-semibold"),
370
+ Separator(orientation="vertical"),
371
+ Badge(
372
+ f"Relevance score: {result['relevance']:.4f}",
373
+ cls="flex gap-1.5 items-center justify-center",
374
+ ),
375
  cls="flex items-center gap-2",
376
  ),
377
  Div(
378
  Button(
379
+ "Hide Text",
380
  size="sm",
381
  id=f"toggle-button-{idx}",
382
  onclick=f"toggleTextContent({idx})",
383
+ cls="hidden md:block",
384
  ),
385
  ),
386
  cls="flex flex-wrap items-center justify-between bg-background px-3 py-4",
 
423
  "Page " + str(fields["page_number"]),
424
  cls="text-foreground font-mono bold text-sm",
425
  ),
426
+ cls="flex items-center justify-end",
 
 
 
 
427
  ),
428
  Div(
429
  Div(
 
443
  cls="grid bg-border p-2",
444
  ),
445
  id=f"text-column-{idx}",
446
+ cls="text-column relative bg-background px-3 py-5 hidden md-grid-text-column",
447
  ),
448
  id=f"image-text-columns-{idx}",
449
+ cls="relative grid grid-cols-1 border-t grid-image-text-columns",
450
  ),
451
  cls="grid grid-cols-1 grid-rows-[auto_1fr]",
452
  ),
 
463
 
464
  def ChatResult(query_id: str, query: str):
465
  return Div(
466
+ Div("AI-generated response", cls="text-xl font-semibold p-3"),
467
  Div(
468
  Div(
469
  Div(
main.py CHANGED
@@ -95,7 +95,7 @@ gemini_model = genai.GenerativeModel(
95
  )
96
  STATIC_DIR = Path(__file__).parent / "static"
97
  IMG_DIR = STATIC_DIR / "saved"
98
- os.makedirs(IMG_DIR, exist_ok=True)
99
 
100
 
101
  @app.on_event("startup")
@@ -307,14 +307,10 @@ async def full_image(docid: str, query_id: str, idx: int):
307
  Endpoint to get the full quality image for a given result id.
308
  """
309
  image_data = await vespa_app.get_full_image_from_vespa(docid)
310
- # Update the cache with the full image data asynchronously to not block the request
311
  asyncio.create_task(update_full_image_cache(docid, query_id, idx, image_data))
312
- # Save the image to a file
313
- img_path = IMG_DIR / f"{docid}.jpg"
314
- with open(img_path, "wb") as f:
315
- f.write(base64.b64decode(image_data))
316
  return Img(
317
- src=f"/static/saved/{docid}.jpg",
318
  alt="something",
319
  cls="result-image w-full h-full object-contain",
320
  )
 
95
  )
96
  STATIC_DIR = Path(__file__).parent / "static"
97
  IMG_DIR = STATIC_DIR / "saved"
98
+ os.makedirs(STATIC_DIR, exist_ok=True)
99
 
100
 
101
  @app.on_event("startup")
 
307
  Endpoint to get the full quality image for a given result id.
308
  """
309
  image_data = await vespa_app.get_full_image_from_vespa(docid)
310
+ # Update the cache with the full image data
311
  asyncio.create_task(update_full_image_cache(docid, query_id, idx, image_data))
 
 
 
 
312
  return Img(
313
+ src=f"data:image/png;base64,{image_data}",
314
  alt="something",
315
  cls="result-image w-full h-full object-contain",
316
  )
output.css CHANGED
@@ -1142,6 +1142,10 @@ body {
1142
  align-items: center;
1143
  }
1144
 
 
 
 
 
1145
  .justify-center {
1146
  justify-content: center;
1147
  }
 
1142
  align-items: center;
1143
  }
1144
 
1145
+ .justify-end {
1146
+ justify-content: flex-end;
1147
+ }
1148
+
1149
  .justify-center {
1150
  justify-content: center;
1151
  }