openfree commited on
Commit
740bd2d
ยท
verified ยท
1 Parent(s): e1df55d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +172 -65
app.py CHANGED
@@ -36,17 +36,25 @@ custom_css = """
36
  .main-container {
37
  background: rgba(255, 255, 255, 0.98);
38
  border-radius: 16px;
39
- padding: 24px;
40
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
41
  border: 1px solid rgba(0, 0, 0, 0.05);
42
- margin: 12px;
43
  }
44
 
45
- .pdf-status {
46
- padding: 12px 16px;
47
  border-radius: 12px;
48
- margin: 12px 0;
49
- font-size: 0.95rem;
 
 
 
 
 
 
 
 
 
50
  font-weight: 500;
51
  }
52
 
@@ -71,17 +79,39 @@ custom_css = """
71
  .rag-context {
72
  background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
73
  border-left: 4px solid #f59e0b;
74
- padding: 12px;
75
- margin: 12px 0;
76
- border-radius: 8px;
77
- font-size: 0.9rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
 
80
- .thinking-section {
81
- background: rgba(0, 0, 0, 0.02);
82
- border: 1px solid rgba(0, 0, 0, 0.1);
83
- border-radius: 8px;
84
- padding: 12px;
 
 
 
 
 
 
 
 
85
  margin: 8px 0;
86
  }
87
  """
@@ -519,88 +549,149 @@ def update_rag_settings(enable, docs, k):
519
 
520
  # Build the interface
521
  with gr.Blocks(theme=gr.themes.Soft(), css=custom_css, fill_height=True) as demo:
522
- gr.Markdown("# ๐Ÿš€ GPT-OSS-20B with PDF RAG System")
523
- gr.Markdown("Enhanced AI assistant with document-based context understanding")
524
-
525
  with gr.Row():
526
- # Left sidebar for RAG controls
527
- with gr.Column(scale=1):
528
- with gr.Group(elem_classes="main-container"):
529
- gr.Markdown("### ๐Ÿ“š Document RAG Settings")
530
-
 
 
 
 
 
 
 
 
531
  pdf_upload = gr.File(
532
  label="Upload PDF",
533
  file_types=[".pdf"],
534
- type="filepath"
 
535
  )
536
 
537
  upload_status = gr.HTML(
538
- value="<div class='pdf-status pdf-info'>๐Ÿ“ค Upload a PDF to enable document-based answers</div>"
539
  )
540
 
541
  document_list = gr.CheckboxGroup(
542
  choices=[],
543
- label="๐Ÿ“„ Select Documents",
544
- info="Choose documents to use as context"
545
- )
546
-
547
- clear_btn = gr.Button("๐Ÿ—‘๏ธ Clear All Documents", size="sm", variant="secondary")
548
-
549
- enable_rag = gr.Checkbox(
550
- label="โœจ Enable RAG",
551
- value=False,
552
- info="Use documents for context-aware responses"
553
  )
554
 
 
 
 
 
 
 
 
 
 
 
555
  top_k_slider = gr.Slider(
556
  minimum=1,
557
  maximum=5,
558
  value=3,
559
  step=1,
560
  label="Context Chunks",
561
- info="Number of document chunks to use"
 
 
 
 
 
 
 
 
 
 
562
  )
563
 
564
- # RAG status display
565
- rag_status = gr.HTML(
566
- value="<div class='pdf-status pdf-info'>๐Ÿ” RAG: <strong>Disabled</strong></div>"
 
 
 
567
  )
568
 
569
- context_preview = gr.HTML(value="", visible=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
570
 
571
- # Right side for chat interface
572
- with gr.Column(scale=3):
573
- with gr.Group(elem_classes="main-container"):
574
  # Create ChatInterface with custom function
575
  chat_interface = gr.ChatInterface(
576
  fn=generate_response,
577
  additional_inputs=[
578
- gr.Slider(label="Max new tokens", minimum=64, maximum=4096, step=1, value=2048),
579
- gr.Textbox(
580
- label="System Prompt",
581
- value="You are a helpful assistant. Reasoning: medium",
582
- lines=4,
583
- placeholder="Change system prompt"
584
- ),
585
- gr.Slider(label="Temperature", minimum=0.1, maximum=2.0, step=0.1, value=0.7),
586
- gr.Slider(label="Top-p", minimum=0.05, maximum=1.0, step=0.05, value=0.9),
587
- gr.Slider(label="Top-k", minimum=1, maximum=100, step=1, value=50),
588
- gr.Slider(label="Repetition Penalty", minimum=1.0, maximum=2.0, step=0.05, value=1.0)
589
  ],
590
  examples=[
591
- [{"text": "Explain Newton laws clearly and concisely"}],
592
- [{"text": "Write a Python function to calculate the Fibonacci sequence"}],
593
- [{"text": "What are the benefits of open weight AI models"}],
594
  ],
595
  cache_examples=False,
596
  type="messages",
597
- description="""Chat with GPT-OSS-20B. Upload PDFs to enhance responses with document context.
598
- Click to view thinking process (default is on).""",
599
  textbox=gr.Textbox(
600
- label="Query Input",
601
- placeholder="Type your prompt (RAG will be applied if enabled)"
 
 
 
 
 
 
 
 
 
602
  ),
603
- stop_btn="Stop Generation",
 
 
 
 
604
  multimodal=False
605
  )
606
 
@@ -616,21 +707,37 @@ with gr.Blocks(theme=gr.themes.Soft(), css=custom_css, fill_height=True) as demo
616
  outputs=[upload_status, document_list]
617
  )
618
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
619
  # Update RAG settings when changed
620
  enable_rag.change(
621
- fn=update_rag_settings,
622
  inputs=[enable_rag, document_list, top_k_slider],
623
  outputs=[rag_status, context_preview]
624
  )
625
 
626
  document_list.change(
627
- fn=update_rag_settings,
628
  inputs=[enable_rag, document_list, top_k_slider],
629
  outputs=[rag_status, context_preview]
630
  )
631
 
632
  top_k_slider.change(
633
- fn=update_rag_settings,
634
  inputs=[enable_rag, document_list, top_k_slider],
635
  outputs=[rag_status, context_preview]
636
  )
 
36
  .main-container {
37
  background: rgba(255, 255, 255, 0.98);
38
  border-radius: 16px;
39
+ padding: 20px;
40
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
41
  border: 1px solid rgba(0, 0, 0, 0.05);
 
42
  }
43
 
44
+ .sidebar-container {
45
+ background: rgba(255, 255, 255, 0.98);
46
  border-radius: 12px;
47
+ padding: 16px;
48
+ box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.06);
49
+ border: 1px solid rgba(0, 0, 0, 0.05);
50
+ height: fit-content;
51
+ }
52
+
53
+ .pdf-status {
54
+ padding: 10px 14px;
55
+ border-radius: 10px;
56
+ margin: 8px 0;
57
+ font-size: 0.9rem;
58
  font-weight: 500;
59
  }
60
 
 
79
  .rag-context {
80
  background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
81
  border-left: 4px solid #f59e0b;
82
+ padding: 10px;
83
+ margin: 8px 0;
84
+ border-radius: 6px;
85
+ font-size: 0.85rem;
86
+ }
87
+
88
+ .status-badge {
89
+ display: inline-block;
90
+ padding: 4px 12px;
91
+ border-radius: 20px;
92
+ font-size: 0.85rem;
93
+ font-weight: 600;
94
+ margin: 4px 0;
95
+ }
96
+
97
+ .status-enabled {
98
+ background: #10b981;
99
+ color: white;
100
  }
101
 
102
+ .status-disabled {
103
+ background: #6b7280;
104
+ color: white;
105
+ }
106
+
107
+ /* Chat interface maximization */
108
+ .chat-container {
109
+ height: calc(100vh - 200px) !important;
110
+ min-height: 600px;
111
+ }
112
+
113
+ /* Accordion styling */
114
+ .accordion {
115
  margin: 8px 0;
116
  }
117
  """
 
549
 
550
  # Build the interface
551
  with gr.Blocks(theme=gr.themes.Soft(), css=custom_css, fill_height=True) as demo:
 
 
 
552
  with gr.Row():
553
+ # Compact sidebar
554
+ with gr.Column(scale=1, min_width=300):
555
+ gr.Markdown("## ๐Ÿš€ GPT-OSS-20B + RAG")
556
+
557
+ # RAG Status Badge
558
+ with gr.Group(elem_classes="sidebar-container"):
559
+ rag_status = gr.HTML(
560
+ value="<div class='status-badge status-disabled'>RAG: Disabled</div>"
561
+ )
562
+ context_preview = gr.HTML(value="", visible=False)
563
+
564
+ # PDF Upload Section
565
+ with gr.Accordion("๐Ÿ“„ PDF Documents", open=True, elem_classes="accordion"):
566
  pdf_upload = gr.File(
567
  label="Upload PDF",
568
  file_types=[".pdf"],
569
+ type="filepath",
570
+ elem_classes="compact-upload"
571
  )
572
 
573
  upload_status = gr.HTML(
574
+ value="<div style='font-size: 0.85rem; color: #6b7280;'>No documents uploaded</div>"
575
  )
576
 
577
  document_list = gr.CheckboxGroup(
578
  choices=[],
579
+ label="Select Documents",
580
+ elem_classes="compact-checkbox"
 
 
 
 
 
 
 
 
581
  )
582
 
583
+ with gr.Row():
584
+ enable_rag = gr.Checkbox(
585
+ label="Enable RAG",
586
+ value=False,
587
+ scale=2
588
+ )
589
+ clear_btn = gr.Button("Clear", size="sm", variant="secondary", scale=1)
590
+
591
+ # RAG Settings
592
+ with gr.Accordion("โš™๏ธ RAG Settings", open=False, elem_classes="accordion"):
593
  top_k_slider = gr.Slider(
594
  minimum=1,
595
  maximum=5,
596
  value=3,
597
  step=1,
598
  label="Context Chunks",
599
+ info="Number of chunks to use"
600
+ )
601
+
602
+ # Model Settings
603
+ with gr.Accordion("๐Ÿ”ง Model Settings", open=False, elem_classes="accordion"):
604
+ max_tokens = gr.Slider(
605
+ label="Max tokens",
606
+ minimum=64,
607
+ maximum=4096,
608
+ step=1,
609
+ value=2048
610
  )
611
 
612
+ temperature = gr.Slider(
613
+ label="Temperature",
614
+ minimum=0.1,
615
+ maximum=2.0,
616
+ step=0.1,
617
+ value=0.7
618
  )
619
 
620
+ with gr.Row():
621
+ top_p = gr.Slider(
622
+ label="Top-p",
623
+ minimum=0.05,
624
+ maximum=1.0,
625
+ step=0.05,
626
+ value=0.9
627
+ )
628
+
629
+ top_k = gr.Slider(
630
+ label="Top-k",
631
+ minimum=1,
632
+ maximum=100,
633
+ step=1,
634
+ value=50
635
+ )
636
+
637
+ repetition_penalty = gr.Slider(
638
+ label="Repetition Penalty",
639
+ minimum=1.0,
640
+ maximum=2.0,
641
+ step=0.05,
642
+ value=1.0
643
+ )
644
+
645
+ # System Prompt
646
+ with gr.Accordion("๐Ÿ’ฌ System Prompt", open=False, elem_classes="accordion"):
647
+ system_prompt = gr.Textbox(
648
+ label="System Prompt",
649
+ value="You are a helpful assistant. Reasoning: medium",
650
+ lines=3,
651
+ placeholder="Customize the system prompt..."
652
+ )
653
 
654
+ # Main chat area - maximized
655
+ with gr.Column(scale=4):
656
+ with gr.Group(elem_classes="main-container chat-container"):
657
  # Create ChatInterface with custom function
658
  chat_interface = gr.ChatInterface(
659
  fn=generate_response,
660
  additional_inputs=[
661
+ max_tokens,
662
+ system_prompt,
663
+ temperature,
664
+ top_p,
665
+ top_k,
666
+ repetition_penalty
 
 
 
 
 
667
  ],
668
  examples=[
669
+ [{"text": "Summarize the document"}],
670
+ [{"text": "What are the key points mentioned?"}],
671
+ [{"text": "Explain the main concept"}],
672
  ],
673
  cache_examples=False,
674
  type="messages",
675
+ title=None,
676
+ description=None,
677
  textbox=gr.Textbox(
678
+ label="Message",
679
+ placeholder="Ask anything... (RAG will be applied if enabled)",
680
+ lines=2,
681
+ max_lines=10,
682
+ autofocus=True
683
+ ),
684
+ chatbot=gr.Chatbot(
685
+ height=550,
686
+ show_copy_button=True,
687
+ bubble_full_width=False,
688
+ render_markdown=True
689
  ),
690
+ stop_btn="Stop",
691
+ retry_btn="Retry",
692
+ undo_btn="Undo",
693
+ clear_btn="Clear",
694
+ submit_btn="Send",
695
  multimodal=False
696
  )
697
 
 
707
  outputs=[upload_status, document_list]
708
  )
709
 
710
+ # Simplified RAG status update
711
+ def update_rag_status_simple(enable, docs, k):
712
+ """Simplified RAG status update"""
713
+ global rag_enabled, selected_docs, top_k_chunks
714
+ rag_enabled = enable
715
+ selected_docs = docs if docs else []
716
+ top_k_chunks = k
717
+
718
+ if enable and docs:
719
+ status_html = "<div class='status-badge status-enabled'>RAG: Active</div>"
720
+ preview = f"<div style='font-size: 0.85rem; color: #10b981;'>๐Ÿ“š {len(docs)} doc(s) | {k} chunks</div>"
721
+ return gr.update(value=status_html), gr.update(value=preview, visible=True)
722
+ else:
723
+ status_html = "<div class='status-badge status-disabled'>RAG: Disabled</div>"
724
+ return gr.update(value=status_html), gr.update(value="", visible=False)
725
+
726
  # Update RAG settings when changed
727
  enable_rag.change(
728
+ fn=update_rag_status_simple,
729
  inputs=[enable_rag, document_list, top_k_slider],
730
  outputs=[rag_status, context_preview]
731
  )
732
 
733
  document_list.change(
734
+ fn=update_rag_status_simple,
735
  inputs=[enable_rag, document_list, top_k_slider],
736
  outputs=[rag_status, context_preview]
737
  )
738
 
739
  top_k_slider.change(
740
+ fn=update_rag_status_simple,
741
  inputs=[enable_rag, document_list, top_k_slider],
742
  outputs=[rag_status, context_preview]
743
  )