Nihal2000 commited on
Commit
d284aec
Β·
verified Β·
1 Parent(s): dd4a6b9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +102 -108
app.py CHANGED
@@ -111,7 +111,7 @@ class ContentOrganizerMCPServer:
111
  "error": str(e),
112
  "message": "Failed to process document"
113
  }
114
-
115
  async def get_document_content_async(self, document_id: str) -> Optional[str]:
116
  """Get document content by ID"""
117
  try:
@@ -457,22 +457,6 @@ def generate_tags_for_document(doc_choice, custom_text, max_tags):
457
  logger.error(f"Tag generation error: {str(e)}")
458
  return f"❌ Error: {str(e)}"
459
 
460
- def delete_document_from_library(document_id):
461
- """deleting a document from the library"""
462
- try:
463
- # Run the async delete_document method
464
- result = mcp_server.run_async(mcp_server.document_store.delete_document(document_id))
465
- if result:
466
- msg = f"πŸ—‘οΈ Document {document_id[:8]}... deleted successfully."
467
- else:
468
- msg = f"❌ Failed to delete document {document_id[:8]}..."
469
- # Refresh document list and choices
470
- doc_list = get_document_list()
471
- doc_choices = get_document_choices()
472
- return msg, doc_list, gr.update(choices=doc_choices)
473
- except Exception as e:
474
- return f"❌ Error: {str(e)}", get_document_list(), gr.update(choices=get_document_choices())
475
-
476
  def ask_question(question):
477
  """Gradio interface for Q&A"""
478
  if not question.strip():
@@ -497,28 +481,40 @@ def ask_question(question):
497
  except Exception as e:
498
  return f"❌ Error: {str(e)}"
499
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
500
  # Create Gradio Interface
501
  def create_gradio_interface():
502
  with gr.Blocks(title="🧠 Intelligent Content Organizer MCP Agent", theme=gr.themes.Soft()) as interface:
503
  gr.Markdown("""
504
  # 🧠 Intelligent Content Organizer MCP Agent
505
-
506
  A powerful MCP (Model Context Protocol) server for intelligent content management with semantic search,
507
  summarization, and Q&A capabilities powered by Anthropic Claude and Mistral AI.
508
-
509
  ## πŸš€ Quick Start:
510
- 1. **Upload Documents** β†’ Go to "πŸ“„ Upload Documents" tab
511
- 2. **Search Your Content** β†’ Use "πŸ” Search Documents" to find information
512
- 3. **Get Summaries** β†’ Select any document in "πŸ“ Summarize" tab
513
- 4. **Ask Questions** β†’ Get answers from your documents in "❓ Ask Questions" tab
514
-
515
  """)
516
-
517
- # Shared components for document selection
518
- doc_choices = gr.State(get_document_choices())
519
-
520
  with gr.Tabs():
521
- # Document Library Tab
522
  with gr.Tab("πŸ“š Document Library"):
523
  with gr.Row():
524
  with gr.Column():
@@ -530,26 +526,28 @@ def create_gradio_interface():
530
  interactive=False
531
  )
532
  refresh_btn = gr.Button("πŸ”„ Refresh Library", variant="secondary")
533
-
 
 
 
 
 
 
 
 
 
534
  refresh_btn.click(
535
  fn=get_document_list,
536
  outputs=[document_list]
537
  )
538
- delete_doc_dropdown = gr.Dropdown(
539
- label="Select Document to Delete",
540
- choices=get_document_choices(),
541
- value=None,
542
- interactive=True,
543
- allow_custom_value=False
544
- )
545
- delete_btn = gr.Button("πŸ—‘οΈ Delete Selected Document", variant="stop")
546
- delete_btn.click(
547
- delete_document_from_library,
548
- inputs=[delete_doc_dropdown],
549
- outputs=[document_list, document_list, delete_doc_dropdown]
550
- )
551
-
552
- # Document Ingestion Tab
553
  with gr.Tab("πŸ“„ Upload Documents"):
554
  with gr.Row():
555
  with gr.Column():
@@ -570,25 +568,21 @@ def create_gradio_interface():
570
  label="Document ID",
571
  placeholder="Document ID will appear here after processing..."
572
  )
573
-
574
- # Hidden dropdowns for updating
575
- doc_dropdown_sum = gr.Dropdown(label="Hidden", visible=False)
576
- doc_dropdown_tag = gr.Dropdown(label="Hidden", visible=False)
577
-
578
  upload_btn.click(
579
  upload_and_process_file,
580
  inputs=[file_input],
581
- outputs=[upload_output, doc_id_output, document_list, doc_dropdown_sum, doc_dropdown_tag, doc_choices]
582
  )
583
-
584
- # Semantic Search Tab
585
  with gr.Tab("πŸ” Search Documents"):
586
  with gr.Row():
587
  with gr.Column(scale=1):
588
  gr.Markdown("### Search Your Document Library")
589
  search_query = gr.Textbox(
590
  label="What are you looking for?",
591
- placeholder="Enter your search query... (e.g., 'machine learning algorithms', 'quarterly revenue', 'project timeline')",
592
  lines=2
593
  )
594
  search_top_k = gr.Slider(
@@ -605,35 +599,33 @@ def create_gradio_interface():
605
  lines=20,
606
  placeholder="Search results will appear here..."
607
  )
608
-
609
  search_btn.click(
610
  perform_search,
611
  inputs=[search_query, search_top_k],
612
  outputs=[search_output]
613
  )
614
-
615
- # Summarization Tab
616
  with gr.Tab("πŸ“ Summarize"):
617
  with gr.Row():
618
  with gr.Column():
619
  gr.Markdown("### Generate Document Summaries")
620
-
621
- with gr.Tab("From Library"):
622
- doc_dropdown_sum = gr.Dropdown(
623
- label="Select Document to Summarize",
624
- choices=get_document_choices(),
625
- value=None,
626
- interactive=True,
627
- allow_custom_value=False
628
- )
629
-
630
- with gr.Tab("Custom Text"):
631
- summary_text = gr.Textbox(
632
- label="Or Paste Text to Summarize",
633
- placeholder="Paste any text here to summarize...",
634
- lines=8
635
- )
636
-
637
  summary_style = gr.Dropdown(
638
  label="Summary Style",
639
  choices=["concise", "detailed", "bullet_points", "executive"],
@@ -641,42 +633,40 @@ def create_gradio_interface():
641
  info="Choose how you want the summary formatted"
642
  )
643
  summarize_btn = gr.Button("πŸ“ Generate Summary", variant="primary", size="lg")
644
-
645
  with gr.Column():
646
  summary_output = gr.Textbox(
647
  label="Generated Summary",
648
  lines=20,
649
  placeholder="Summary will appear here..."
650
  )
651
-
652
  summarize_btn.click(
653
  summarize_document,
654
  inputs=[doc_dropdown_sum, summary_text, summary_style],
655
  outputs=[summary_output]
656
  )
657
-
658
- # Tag Generation Tab
659
  with gr.Tab("🏷️ Generate Tags"):
660
  with gr.Row():
661
  with gr.Column():
662
  gr.Markdown("### Auto-Generate Document Tags")
663
-
664
- with gr.Tab("From Library"):
665
- doc_dropdown_tag = gr.Dropdown(
666
- label="Select Document to Tag",
667
- choices=get_document_choices(),
668
- value=None,
669
- interactive=True,
670
- allow_custom_value=False
671
- )
672
-
673
- with gr.Tab("Custom Text"):
674
- tag_text = gr.Textbox(
675
- label="Or Paste Text to Generate Tags",
676
- placeholder="Paste any text here to generate tags...",
677
- lines=8
678
- )
679
-
680
  max_tags = gr.Slider(
681
  label="Number of Tags",
682
  minimum=3,
@@ -685,57 +675,61 @@ def create_gradio_interface():
685
  step=1
686
  )
687
  tag_btn = gr.Button("🏷️ Generate Tags", variant="primary", size="lg")
688
-
689
  with gr.Column():
690
  tag_output = gr.Textbox(
691
  label="Generated Tags",
692
  lines=10,
693
  placeholder="Tags will appear here..."
694
  )
695
-
696
  tag_btn.click(
697
  generate_tags_for_document,
698
  inputs=[doc_dropdown_tag, tag_text, max_tags],
699
  outputs=[tag_output]
700
  )
701
-
702
- # Q&A Tab
703
  with gr.Tab("❓ Ask Questions"):
704
  with gr.Row():
705
  with gr.Column():
706
  gr.Markdown("""
707
  ### Ask Questions About Your Documents
708
-
709
  The AI will search through all your uploaded documents to find relevant information
710
  and provide comprehensive answers with sources.
711
  """)
712
  qa_question = gr.Textbox(
713
  label="Your Question",
714
- placeholder="Ask anything about your documents... (e.g., 'What are the key findings about renewable energy?', 'How much was spent on marketing last quarter?')",
715
  lines=3
716
  )
717
  qa_btn = gr.Button("❓ Get Answer", variant="primary", size="lg")
718
-
719
  with gr.Column():
720
  qa_output = gr.Textbox(
721
  label="AI Answer",
722
  lines=20,
723
  placeholder="Answer will appear here with sources..."
724
  )
725
-
726
  qa_btn.click(
727
  ask_question,
728
  inputs=[qa_question],
729
  outputs=[qa_output]
730
  )
731
-
732
- # Auto-refresh document lists when switching tabs
733
  interface.load(
734
- fn=lambda: (get_document_list(), get_document_choices(), get_document_choices()),
 
 
 
 
735
  outputs=[document_list, doc_dropdown_sum, doc_dropdown_tag]
736
  )
737
-
738
- return interface
739
 
740
  # Create and launch the interface
741
  if __name__ == "__main__":
 
111
  "error": str(e),
112
  "message": "Failed to process document"
113
  }
114
+
115
  async def get_document_content_async(self, document_id: str) -> Optional[str]:
116
  """Get document content by ID"""
117
  try:
 
457
  logger.error(f"Tag generation error: {str(e)}")
458
  return f"❌ Error: {str(e)}"
459
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
460
  def ask_question(question):
461
  """Gradio interface for Q&A"""
462
  if not question.strip():
 
481
  except Exception as e:
482
  return f"❌ Error: {str(e)}"
483
 
484
+ def delete_document_from_library(document_id):
485
+ """deleting a document from the library"""
486
+ try:
487
+ # Run the async delete_document method
488
+ result = mcp_server.run_async(mcp_server.document_store.delete_document(document_id))
489
+ if result:
490
+ msg = f"πŸ—‘οΈ Document {document_id[:8]}... deleted successfully."
491
+ else:
492
+ msg = f"❌ Failed to delete document {document_id[:8]}..."
493
+ # Refresh document list and choices
494
+ doc_list = get_document_list()
495
+ doc_choices = get_document_choices()
496
+ return msg, doc_list, gr.update(choices=doc_choices)
497
+ except Exception as e:
498
+ return f"❌ Error: {str(e)}", get_document_list(), gr.update(choices=get_document_choices())
499
+
500
  # Create Gradio Interface
501
  def create_gradio_interface():
502
  with gr.Blocks(title="🧠 Intelligent Content Organizer MCP Agent", theme=gr.themes.Soft()) as interface:
503
  gr.Markdown("""
504
  # 🧠 Intelligent Content Organizer MCP Agent
505
+
506
  A powerful MCP (Model Context Protocol) server for intelligent content management with semantic search,
507
  summarization, and Q&A capabilities powered by Anthropic Claude and Mistral AI.
508
+
509
  ## πŸš€ Quick Start:
510
+ 1. **Upload Documents** β†’ Go to "πŸ“„ Upload Documents" tab
511
+ 2. **Search Your Content** β†’ Use "πŸ” Search Documents" to find information
512
+ 3. **Get Summaries** β†’ Select any document in "πŸ“ Summarize" tab
513
+ 4. **Ask Questions** β†’ Get answers from your documents in "❓ Ask Questions" tab
 
514
  """)
515
+
 
 
 
516
  with gr.Tabs():
517
+ # πŸ“š Document Library Tab
518
  with gr.Tab("πŸ“š Document Library"):
519
  with gr.Row():
520
  with gr.Column():
 
526
  interactive=False
527
  )
528
  refresh_btn = gr.Button("πŸ”„ Refresh Library", variant="secondary")
529
+
530
+ delete_doc_dropdown = gr.Dropdown(
531
+ label="Select Document to Delete",
532
+ choices=get_document_choices(),
533
+ value=None,
534
+ interactive=True,
535
+ allow_custom_value=False
536
+ )
537
+ delete_btn = gr.Button("πŸ—‘οΈ Delete Selected Document", variant="stop")
538
+
539
  refresh_btn.click(
540
  fn=get_document_list,
541
  outputs=[document_list]
542
  )
543
+
544
+ delete_btn.click(
545
+ delete_document_from_library,
546
+ inputs=[delete_doc_dropdown],
547
+ outputs=[document_list, delete_doc_dropdown]
548
+ )
549
+
550
+ # πŸ“„ Upload Documents Tab
 
 
 
 
 
 
 
551
  with gr.Tab("πŸ“„ Upload Documents"):
552
  with gr.Row():
553
  with gr.Column():
 
568
  label="Document ID",
569
  placeholder="Document ID will appear here after processing..."
570
  )
571
+
 
 
 
 
572
  upload_btn.click(
573
  upload_and_process_file,
574
  inputs=[file_input],
575
+ outputs=[upload_output, doc_id_output]
576
  )
577
+
578
+ # πŸ” Search Documents Tab
579
  with gr.Tab("πŸ” Search Documents"):
580
  with gr.Row():
581
  with gr.Column(scale=1):
582
  gr.Markdown("### Search Your Document Library")
583
  search_query = gr.Textbox(
584
  label="What are you looking for?",
585
+ placeholder="Enter your search query...",
586
  lines=2
587
  )
588
  search_top_k = gr.Slider(
 
599
  lines=20,
600
  placeholder="Search results will appear here..."
601
  )
602
+
603
  search_btn.click(
604
  perform_search,
605
  inputs=[search_query, search_top_k],
606
  outputs=[search_output]
607
  )
608
+
609
+ # πŸ“ Summarize Tab
610
  with gr.Tab("πŸ“ Summarize"):
611
  with gr.Row():
612
  with gr.Column():
613
  gr.Markdown("### Generate Document Summaries")
614
+
615
+ doc_dropdown_sum = gr.Dropdown(
616
+ label="Select Document to Summarize",
617
+ choices=get_document_choices(),
618
+ value=None,
619
+ interactive=True,
620
+ allow_custom_value=False
621
+ )
622
+
623
+ summary_text = gr.Textbox(
624
+ label="Or Paste Text to Summarize",
625
+ placeholder="Paste any text here to summarize...",
626
+ lines=8
627
+ )
628
+
 
 
629
  summary_style = gr.Dropdown(
630
  label="Summary Style",
631
  choices=["concise", "detailed", "bullet_points", "executive"],
 
633
  info="Choose how you want the summary formatted"
634
  )
635
  summarize_btn = gr.Button("πŸ“ Generate Summary", variant="primary", size="lg")
636
+
637
  with gr.Column():
638
  summary_output = gr.Textbox(
639
  label="Generated Summary",
640
  lines=20,
641
  placeholder="Summary will appear here..."
642
  )
643
+
644
  summarize_btn.click(
645
  summarize_document,
646
  inputs=[doc_dropdown_sum, summary_text, summary_style],
647
  outputs=[summary_output]
648
  )
649
+
650
+ # 🏷️ Generate Tags Tab
651
  with gr.Tab("🏷️ Generate Tags"):
652
  with gr.Row():
653
  with gr.Column():
654
  gr.Markdown("### Auto-Generate Document Tags")
655
+
656
+ doc_dropdown_tag = gr.Dropdown(
657
+ label="Select Document to Tag",
658
+ choices=get_document_choices(),
659
+ value=None,
660
+ interactive=True,
661
+ allow_custom_value=False
662
+ )
663
+
664
+ tag_text = gr.Textbox(
665
+ label="Or Paste Text to Generate Tags",
666
+ placeholder="Paste any text here to generate tags...",
667
+ lines=8
668
+ )
669
+
 
 
670
  max_tags = gr.Slider(
671
  label="Number of Tags",
672
  minimum=3,
 
675
  step=1
676
  )
677
  tag_btn = gr.Button("🏷️ Generate Tags", variant="primary", size="lg")
678
+
679
  with gr.Column():
680
  tag_output = gr.Textbox(
681
  label="Generated Tags",
682
  lines=10,
683
  placeholder="Tags will appear here..."
684
  )
685
+
686
  tag_btn.click(
687
  generate_tags_for_document,
688
  inputs=[doc_dropdown_tag, tag_text, max_tags],
689
  outputs=[tag_output]
690
  )
691
+
692
+ # ❓ Ask Questions Tab
693
  with gr.Tab("❓ Ask Questions"):
694
  with gr.Row():
695
  with gr.Column():
696
  gr.Markdown("""
697
  ### Ask Questions About Your Documents
698
+
699
  The AI will search through all your uploaded documents to find relevant information
700
  and provide comprehensive answers with sources.
701
  """)
702
  qa_question = gr.Textbox(
703
  label="Your Question",
704
+ placeholder="Ask anything about your documents...",
705
  lines=3
706
  )
707
  qa_btn = gr.Button("❓ Get Answer", variant="primary", size="lg")
708
+
709
  with gr.Column():
710
  qa_output = gr.Textbox(
711
  label="AI Answer",
712
  lines=20,
713
  placeholder="Answer will appear here with sources..."
714
  )
715
+
716
  qa_btn.click(
717
  ask_question,
718
  inputs=[qa_question],
719
  outputs=[qa_output]
720
  )
721
+
722
+ # Auto-refresh dropdowns when the app loads
723
  interface.load(
724
+ fn=lambda: (
725
+ get_document_list(),
726
+ get_document_choices(),
727
+ get_document_choices()
728
+ ),
729
  outputs=[document_list, doc_dropdown_sum, doc_dropdown_tag]
730
  )
731
+
732
+ return interface
733
 
734
  # Create and launch the interface
735
  if __name__ == "__main__":