prithivMLmods commited on
Commit
0e8d8f2
·
verified ·
1 Parent(s): d7adce1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +187 -126
app.py CHANGED
@@ -102,26 +102,26 @@ def load_and_preview_pdf(file_path: Optional[str]) -> Tuple[Optional[Image.Image
102
  """
103
  state = get_initial_pdf_state()
104
  if not file_path:
105
- return None, state, '<div style="text-align:center;">No file loaded</div>'
106
 
107
  try:
108
  pages = convert_pdf_to_images(file_path)
109
  if not pages:
110
- return None, state, '<div style="text-align:center;">Could not load file</div>'
111
 
112
  state["pages"] = pages
113
  state["total_pages"] = len(pages)
114
- page_info_html = f'<div style="text-align:center;">Page 1 / {state["total_pages"]}</div>'
115
  return pages[0], state, page_info_html
116
  except Exception as e:
117
- return None, state, f'<div style="text-align:center;">Failed to load preview: {e}</div>'
118
 
119
  def navigate_pdf_page(direction: str, state: Dict[str, Any]):
120
  """
121
  Navigates to the previous or next page in the PDF preview.
122
  """
123
  if not state or not state["pages"]:
124
- return None, state, '<div style="text-align:center;">No file loaded</div>'
125
 
126
  current_index = state["current_page_index"]
127
  total_pages = state["total_pages"]
@@ -136,7 +136,7 @@ def navigate_pdf_page(direction: str, state: Dict[str, Any]):
136
  state["current_page_index"] = new_index
137
 
138
  image_preview = state["pages"][new_index]
139
- page_info_html = f'<div style="text-align:center;">Page {new_index + 1} / {total_pages}</div>'
140
 
141
  return image_preview, state, page_info_html
142
 
@@ -258,191 +258,252 @@ video_examples = [["Explain the video in detail.", "videos/2.mp4"]]
258
  pdf_examples = [["examples/sample-doc.pdf"]]
259
 
260
  css = """
261
- @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700;900&display=swap');
262
 
263
  :root {
264
  --bg-main: #ffd6e7;
265
  --bg-card: #ff66a3;
266
  --bg-header: #ffffff;
 
 
 
 
267
  --bg-button-primary: #4ade80;
268
  --bg-button-primary-hover: #1ac2ff;
269
  --bg-button-secondary: #fde047;
270
  --bg-button-secondary-hover: #f97316;
271
  --color-border: #000000;
272
  --color-text: #000000;
273
- --shadow-card: 12px 12px 0 var(--color-border);
274
- --shadow-button: 4px 4px 0 var(--color-border);
 
 
 
 
 
 
 
 
 
 
 
 
275
  }
276
 
277
  body, .gradio-container {
278
- font-family: 'Montserrat', sans-serif;
279
- background-color: var(--bg-main);
280
- color: var(--color-text);
 
281
  }
282
 
283
- h1 {
284
- font-size: 2.5rem !important;
285
- font-weight: 900 !important;
286
- text-align: center;
287
- margin-bottom: 2rem !important;
288
- color: var(--color-text);
 
 
 
 
 
 
 
289
  }
290
 
 
291
  .gradio-container .gr-panel {
292
  background-color: transparent !important;
293
  border: none !important;
294
  box-shadow: none !important;
295
  }
296
-
297
- .gr-tabs {
298
- translate: -6px -6px;
299
- background: var(--bg-card);
300
- border: 3px solid var(--color-border);
301
- box-shadow: var(--shadow-card);
302
- transition: all 0.2s ease;
303
- }
304
- .gr-tabs:hover {
305
- translate: -3px -3px;
306
- box-shadow: 9px 9px 0 var(--color-border);
307
  }
308
 
309
- .gr-block.gr-box {
310
- border: none !important;
 
 
 
 
 
 
 
311
  }
312
-
313
- .tabs > .tab-nav > button {
314
- font-family: 'Montserrat', sans-serif;
315
- font-size: 14px !important;
316
- font-weight: 900 !important;
317
- background: var(--bg-header) !important;
318
- color: var(--color-text) !important;
319
- border-bottom: 3px solid var(--color-border) !important;
320
- transition: background-color 0.3s ease !important;
321
  }
322
 
323
- .tabs > .tab-nav > button.selected {
324
- background: var(--bg-card) !important;
325
- color: white !important;
 
 
 
 
 
 
 
 
 
 
 
326
  }
327
 
 
328
  .gr-button {
329
- padding: 8px 16px;
330
- border: 3px solid var(--color-border) !important;
331
- box-shadow: var(--shadow-button) !important;
332
- font-weight: 900 !important;
333
- transition: all 0.15s ease !important;
334
- cursor: pointer;
335
- font-size: 14px !important;
336
- color: var(--color-text) !important;
337
- background: var(--bg-button-secondary) !important;
338
  }
339
  .gr-button.submit-btn {
340
- background: var(--bg-button-primary) !important;
341
  }
342
  .gr-button:hover {
343
- transform: translate(2px, 2px);
344
- box-shadow: 2px 2px 0 var(--color-border) !important;
345
- background: var(--bg-button-primary-hover) !important;
346
  }
347
  .gr-button.submit-btn:hover {
348
- background: var(--bg-button-primary-hover) !important;
349
  }
350
  .gr-button:active {
351
- transform: translate(4px, 4px);
352
- box-shadow: 0 0 0 var(--color-border) !important;
353
  }
354
 
355
- .canvas-output {
356
- translate: -6px -6px;
357
- background: var(--bg-card);
358
- border: 3px solid var(--color-border);
359
- box-shadow: var(--shadow-card);
360
- transition: all 0.2s ease;
361
- padding: 1.5rem;
 
 
 
362
  }
363
- .canvas-output:hover {
364
- translate: -3px -3px;
365
- box-shadow: 9px 9px 0 var(--color-border);
366
  }
367
- .canvas-output .gr-markdown h2 {
368
- font-size: 14px;
369
- font-weight: 900;
370
- width: 100%;
371
- background: var(--bg-header);
372
- padding: 8px 12px;
373
- color: var(--color-text);
374
- border: 3px solid var(--color-border);
375
- margin: -1.5rem -1.5rem 1.5rem -1.5rem; /* Adjust to break out of padding */
376
  }
377
 
378
- textarea, input[type="text"], input[type="file"] {
379
- width: 100%;
380
- padding: 10px;
381
- border: 3px solid var(--color-border) !important;
 
382
  background: var(--bg-header) !important;
383
- color: var(--color-text) !important;
384
- font-weight: 600 !important;
385
- font-family: 'Montserrat', sans-serif;
386
- font-size: 14px;
387
- box-sizing: border-box;
388
- border-radius: 0 !important;
 
 
 
 
389
  }
390
 
 
391
  .gr-accordion {
392
- border: 3px solid var(--color-border) !important;
393
- background: rgba(255, 255, 255, 0.3) !important;
 
 
 
 
 
 
394
  }
395
 
396
- .gr-image, .gr-video {
397
- border: 3px solid var(--color-border) !important;
398
- min-height: 290px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
399
  }
400
  """
401
 
402
- with gr.Blocks(css=css) as demo:
403
  pdf_state = gr.State(value=get_initial_pdf_state())
404
- gr.Markdown("# **Qwen3-VL-Processor**")
405
- with gr.Row():
 
 
 
406
  with gr.Column(scale=2):
407
- with gr.Tabs():
408
- with gr.TabItem("Image Inference"):
409
- image_query = gr.Textbox(label="Query Input", placeholder="Enter your query here...")
410
- image_upload = gr.Image(type="pil", label="Image", height=290)
411
- image_submit = gr.Button("Submit", elem_classes="submit-btn")
412
- gr.Examples(examples=image_examples, inputs=[image_query, image_upload])
413
-
414
- with gr.TabItem("Video Inference"):
415
- video_query = gr.Textbox(label="Query Input", placeholder="Enter your query here...")
416
- video_upload = gr.Video(label="Video", height=290)
417
- video_submit = gr.Button("Submit", elem_classes="submit-btn")
418
- gr.Examples(examples=video_examples, inputs=[video_query, video_upload])
419
-
420
- with gr.TabItem("PDF Inference"):
421
- with gr.Row():
422
- with gr.Column(scale=1):
 
 
423
  pdf_query = gr.Textbox(label="Query Input", placeholder="e.g., 'Summarize this document'")
424
  pdf_upload = gr.File(label="Upload PDF", file_types=[".pdf"])
425
- pdf_submit = gr.Button("Submit", elem_classes="submit-btn")
426
- with gr.Column(scale=1):
427
  pdf_preview_img = gr.Image(label="PDF Preview", height=280)
428
  with gr.Row():
429
  prev_page_btn = gr.Button("◀ Previous")
430
- page_info = gr.HTML('<div style="text-align:center;">No file loaded</div>')
431
  next_page_btn = gr.Button("Next ▶")
 
432
 
433
- with gr.Accordion("Advanced options", open=False):
434
- max_new_tokens = gr.Slider(label="Max new tokens", minimum=1, maximum=MAX_MAX_NEW_TOKENS, step=1, value=DEFAULT_MAX_NEW_TOKENS)
435
- temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=4.0, step=0.1, value=0.6)
436
- top_p = gr.Slider(label="Top-p (nucleus sampling)", minimum=0.05, maximum=1.0, step=0.05, value=0.9)
437
- top_k = gr.Slider(label="Top-k", minimum=1, maximum=1000, step=1, value=50)
438
- repetition_penalty = gr.Slider(label="Repetition penalty", minimum=1.0, maximum=2.0, step=0.05, value=1.2)
439
 
440
  with gr.Column(scale=3):
441
- with gr.Column(elem_classes="canvas-output"):
442
- gr.Markdown("## Output")
443
- output = gr.Textbox(label="Raw Output Stream", interactive=False, lines=15, show_copy_button=True)
444
- with gr.Accordion("(Result.md)", open=False):
445
- markdown_output = gr.Markdown(label="(Result.Md)")
 
 
446
 
447
  # Event handlers
448
  image_submit.click(
 
102
  """
103
  state = get_initial_pdf_state()
104
  if not file_path:
105
+ return None, state, '<div class="page-info">No file loaded</div>'
106
 
107
  try:
108
  pages = convert_pdf_to_images(file_path)
109
  if not pages:
110
+ return None, state, '<div class="page-info">Could not load file</div>'
111
 
112
  state["pages"] = pages
113
  state["total_pages"] = len(pages)
114
+ page_info_html = f'<div class="page-info">Page 1 / {state["total_pages"]}</div>'
115
  return pages[0], state, page_info_html
116
  except Exception as e:
117
+ return None, state, f'<div class="page-info">Failed to load preview: {e}</div>'
118
 
119
  def navigate_pdf_page(direction: str, state: Dict[str, Any]):
120
  """
121
  Navigates to the previous or next page in the PDF preview.
122
  """
123
  if not state or not state["pages"]:
124
+ return None, state, '<div class="page-info">No file loaded</div>'
125
 
126
  current_index = state["current_page_index"]
127
  total_pages = state["total_pages"]
 
136
  state["current_page_index"] = new_index
137
 
138
  image_preview = state["pages"][new_index]
139
+ page_info_html = f'<div class="page-info">Page {new_index + 1} / {total_pages}</div>'
140
 
141
  return image_preview, state, page_info_html
142
 
 
258
  pdf_examples = [["examples/sample-doc.pdf"]]
259
 
260
  css = """
261
+ @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@600;700;900&display=swap');
262
 
263
  :root {
264
  --bg-main: #ffd6e7;
265
  --bg-card: #ff66a3;
266
  --bg-header: #ffffff;
267
+ --bg-result: #ffffff;
268
+ --bg-tab-active: #ff66a3;
269
+ --bg-advanced: rgba(255, 255, 255, 0.3);
270
+ --bg-uploader: rgba(255, 255, 255, 0.4);
271
  --bg-button-primary: #4ade80;
272
  --bg-button-primary-hover: #1ac2ff;
273
  --bg-button-secondary: #fde047;
274
  --bg-button-secondary-hover: #f97316;
275
  --color-border: #000000;
276
  --color-text: #000000;
277
+ --color-text-button: #000000;
278
+ --color-text-header: #000000;
279
+ }
280
+
281
+ .dark {
282
+ --bg-main: #2c132c;
283
+ --bg-card: #592659;
284
+ --bg-header: #1a1a1a;
285
+ --bg-result: #2a2a2a;
286
+ --bg-tab-active: #7f397f;
287
+ --bg-advanced: rgba(0, 0, 0, 0.3);
288
+ --bg-uploader: rgba(0, 0, 0, 0.4);
289
+ --color-text: #f0f0f0;
290
+ --color-text-header: #f0f0f0;
291
  }
292
 
293
  body, .gradio-container {
294
+ font-family: 'Montserrat', sans-serif;
295
+ background-color: var(--bg-main);
296
+ color: var(--color-text);
297
+ transition: background-color 0.3s ease;
298
  }
299
 
300
+ /* Header Styles */
301
+ #app-header {
302
+ background: var(--bg-header);
303
+ padding: 2rem;
304
+ border-bottom: 3px solid var(--color-border);
305
+ color: var(--color-text-header);
306
+ transition: background-color 0.3s ease, color 0.3s ease;
307
+ }
308
+ #app-header h1 {
309
+ font-size: 2.5rem;
310
+ font-weight: 900;
311
+ margin: 0;
312
+ text-align: center;
313
  }
314
 
315
+ /* Main Layout Styles */
316
  .gradio-container .gr-panel {
317
  background-color: transparent !important;
318
  border: none !important;
319
  box-shadow: none !important;
320
  }
321
+ #main-row {
322
+ gap: 4rem;
323
+ padding: 2rem;
 
 
 
 
 
 
 
 
324
  }
325
 
326
+ /* Card Styles */
327
+ .card {
328
+ font-family: 'Montserrat', sans-serif;
329
+ translate: -6px -6px;
330
+ background: var(--bg-card);
331
+ border: 3px solid var(--color-border);
332
+ box-shadow: 12px 12px 0 var(--color-border);
333
+ transition: all 0.2s ease;
334
+ width: 100%;
335
  }
336
+ .card:hover {
337
+ translate: -3px -3px;
338
+ box-shadow: 9px 9px 0 var(--color-border);
 
 
 
 
 
 
339
  }
340
 
341
+ .card-header {
342
+ font-size: 14px;
343
+ font-weight: 900;
344
+ width: 100%;
345
+ background: var(--bg-header);
346
+ padding: 8px 12px;
347
+ color: var(--color-text-header);
348
+ border-bottom: 3px solid var(--color-border);
349
+ }
350
+ .card-content {
351
+ padding: 1.5rem;
352
+ font-size: 14px;
353
+ font-weight: 600;
354
+ color: var(--color-text);
355
  }
356
 
357
+ /* Button Styles */
358
  .gr-button {
359
+ padding: 8px 16px !important;
360
+ border: 3px solid var(--color-border) !important;
361
+ box-shadow: 4px 4px 0 var(--color-border) !important;
362
+ font-weight: 900 !important;
363
+ transition: all 0.15s ease !important;
364
+ cursor: pointer !important;
365
+ font-size: 14px !important;
366
+ color: var(--color-text-button) !important;
367
+ background: var(--bg-button-secondary) !important;
368
  }
369
  .gr-button.submit-btn {
370
+ background: var(--bg-button-primary) !important;
371
  }
372
  .gr-button:hover {
373
+ transform: translate(2px, 2px);
374
+ box-shadow: 2px 2px 0 var(--color-border) !important;
 
375
  }
376
  .gr-button.submit-btn:hover {
377
+ background: var(--bg-button-primary-hover) !important;
378
  }
379
  .gr-button:active {
380
+ transform: translate(4px, 4px);
381
+ box-shadow: 0 0 0 var(--color-border) !important;
382
  }
383
 
384
+ /* Form & Input Styles */
385
+ .gr-input, .gr-textarea, .gr-dropdown, .gr-textbox, .gr-file {
386
+ border: 3px solid var(--color-border) !important;
387
+ background: var(--bg-result) !important;
388
+ color: var(--color-text) !important;
389
+ font-weight: 600 !important;
390
+ font-family: 'Montserrat', sans-serif !important;
391
+ font-size: 14px !important;
392
+ box-sizing: border-box !important;
393
+ border-radius: 0 !important;
394
  }
395
+ textarea, input[type=text], input[type=email], input[type=password] {
396
+ color: var(--color-text) !important;
397
+ background: var(--bg-result) !important;
398
  }
399
+ .gr-label > .label-text {
400
+ font-weight: 900 !important;
401
+ color: var(--color-text) !important;
402
+ margin-bottom: 0.5rem !important;
 
 
 
 
 
403
  }
404
 
405
+ /* Tabs Styles */
406
+ .tab-nav > button {
407
+ font-family: 'Montserrat', sans-serif !important;
408
+ font-size: 14px !important;
409
+ font-weight: 900 !important;
410
  background: var(--bg-header) !important;
411
+ color: var(--color-text-header) !important;
412
+ border-bottom: 3px solid var(--color-border) !important;
413
+ border-right: 3px solid var(--color-border) !important;
414
+ border-top: none !important;
415
+ border-left: none !important;
416
+ transition: background-color 0.3s ease !important;
417
+ }
418
+ .tab-nav > button.selected {
419
+ background: var(--bg-tab-active) !important;
420
+ color: white !important;
421
  }
422
 
423
+ /* Advanced Options Accordion */
424
  .gr-accordion {
425
+ background: var(--bg-advanced) !important;
426
+ padding: 1rem;
427
+ border: 3px solid var(--color-border) !important;
428
+ margin-top: 1rem;
429
+ }
430
+ .gr-accordion > .label-wrap {
431
+ font-weight: 900 !important;
432
+ color: var(--color-text) !important;
433
  }
434
 
435
+ /* Slider Styles */
436
+ .gr-slider {
437
+ background: var(--bg-uploader) !important;
438
+ border: 3px solid var(--color-border) !important;
439
+ }
440
+ .gr-slider input[type=range]::-webkit-slider-thumb {
441
+ background: var(--bg-button-secondary) !important;
442
+ border: 3px solid var(--color-border) !important;
443
+ }
444
+ .gr-slider input[type=range]::-moz-range-thumb {
445
+ background: var(--bg-button-secondary) !important;
446
+ border: 3px solid var(--color-border) !important;
447
+ }
448
+
449
+ /* PDF Viewer Styles */
450
+ .page-info {
451
+ text-align: center;
452
+ font-weight: 900;
453
+ padding-top: 10px;
454
  }
455
  """
456
 
457
+ with gr.Blocks(css=css, theme=gr.themes.Base()) as demo:
458
  pdf_state = gr.State(value=get_initial_pdf_state())
459
+
460
+ with gr.Column(elem_id="app-header"):
461
+ gr.Markdown("# Qwen3-VL-Processor")
462
+
463
+ with gr.Row(elem_id="main-row"):
464
  with gr.Column(scale=2):
465
+ with gr.Column(elem_classes="card"):
466
+ with gr.Box(elem_classes="card-header"):
467
+ gr.Markdown("### INPUT")
468
+ with gr.Box(elem_classes="card-content"):
469
+ with gr.Tabs():
470
+ with gr.TabItem("Image Inference"):
471
+ image_query = gr.Textbox(label="Query Input", placeholder="Enter your query here...")
472
+ image_upload = gr.Image(type="pil", label="Image", height=290)
473
+ image_submit = gr.Button("Submit", elem_classes="submit-btn")
474
+ gr.Examples(examples=image_examples, inputs=[image_query, image_upload])
475
+
476
+ with gr.TabItem("Video Inference"):
477
+ video_query = gr.Textbox(label="Query Input", placeholder="Enter your query here...")
478
+ video_upload = gr.Video(label="Video", height=290)
479
+ video_submit = gr.Button("Submit", elem_classes="submit-btn")
480
+ gr.Examples(examples=video_examples, inputs=[video_query, video_upload])
481
+
482
+ with gr.TabItem("PDF Inference"):
483
  pdf_query = gr.Textbox(label="Query Input", placeholder="e.g., 'Summarize this document'")
484
  pdf_upload = gr.File(label="Upload PDF", file_types=[".pdf"])
 
 
485
  pdf_preview_img = gr.Image(label="PDF Preview", height=280)
486
  with gr.Row():
487
  prev_page_btn = gr.Button("◀ Previous")
488
+ page_info = gr.HTML('<div class="page-info">No file loaded</div>')
489
  next_page_btn = gr.Button("Next ▶")
490
+ pdf_submit = gr.Button("Submit", elem_classes="submit-btn")
491
 
492
+ with gr.Accordion("Advanced options", open=False):
493
+ max_new_tokens = gr.Slider(label="Max new tokens", minimum=1, maximum=MAX_MAX_NEW_TOKENS, step=1, value=DEFAULT_MAX_NEW_TOKENS)
494
+ temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=4.0, step=0.1, value=0.6)
495
+ top_p = gr.Slider(label="Top-p (nucleus sampling)", minimum=0.05, maximum=1.0, step=0.05, value=0.9)
496
+ top_k = gr.Slider(label="Top-k", minimum=1, maximum=1000, step=1, value=50)
497
+ repetition_penalty = gr.Slider(label="Repetition penalty", minimum=1.0, maximum=2.0, step=0.05, value=1.2)
498
 
499
  with gr.Column(scale=3):
500
+ with gr.Column(elem_classes="card"):
501
+ with gr.Box(elem_classes="card-header"):
502
+ gr.Markdown("### RESULT")
503
+ with gr.Box(elem_classes="card-content"):
504
+ output = gr.Textbox(label="Raw Output Stream", interactive=False, lines=15, show_copy_button=True)
505
+ with gr.Accordion("(Result.md)", open=False):
506
+ markdown_output = gr.Markdown(label="(Result.Md)")
507
 
508
  # Event handlers
509
  image_submit.click(