Update app.py
Browse files
app.py
CHANGED
@@ -307,7 +307,7 @@ def get_document_choices():
|
|
307 |
def upload_and_process_file(file):
|
308 |
"""Gradio interface for file upload"""
|
309 |
if file is None:
|
310 |
-
return "No file uploaded", "", get_document_list(), gr.update(choices=get_document_choices())
|
311 |
|
312 |
try:
|
313 |
# Get file path
|
@@ -330,6 +330,7 @@ def upload_and_process_file(file):
|
|
330 |
doc_list,
|
331 |
gr.update(choices=doc_choices),
|
332 |
gr.update(choices=doc_choices),
|
|
|
333 |
gr.update(choices=doc_choices)
|
334 |
)
|
335 |
else:
|
@@ -339,6 +340,7 @@ def upload_and_process_file(file):
|
|
339 |
get_document_list(),
|
340 |
gr.update(choices=get_document_choices()),
|
341 |
gr.update(choices=get_document_choices()),
|
|
|
342 |
gr.update(choices=get_document_choices())
|
343 |
)
|
344 |
except Exception as e:
|
@@ -349,6 +351,7 @@ def upload_and_process_file(file):
|
|
349 |
get_document_list(),
|
350 |
gr.update(choices=get_document_choices()),
|
351 |
gr.update(choices=get_document_choices()),
|
|
|
352 |
gr.update(choices=get_document_choices())
|
353 |
)
|
354 |
|
@@ -482,39 +485,48 @@ def ask_question(question):
|
|
482 |
return f"β Error: {str(e)}"
|
483 |
|
484 |
def delete_document_from_library(document_id):
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
499 |
|
500 |
-
# Create Gradio Interface
|
501 |
# Create Gradio Interface
|
502 |
def create_gradio_interface():
|
503 |
with gr.Blocks(title="π§ Intelligent Content Organizer MCP Agent", theme=gr.themes.Soft()) as interface:
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
|
|
508 |
|
509 |
-
|
510 |
-
|
|
|
|
|
|
|
|
|
511 |
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
|
517 |
-
""")
|
518 |
|
519 |
with gr.Tabs():
|
520 |
# π Document Library Tab
|
@@ -524,30 +536,31 @@ def create_gradio_interface():
|
|
524 |
gr.Markdown("### Your Document Collection")
|
525 |
document_list = gr.Textbox(
|
526 |
label="Documents in Library",
|
527 |
-
value=
|
528 |
lines=20,
|
529 |
interactive=False
|
530 |
)
|
531 |
refresh_btn = gr.Button("π Refresh Library", variant="secondary")
|
532 |
|
533 |
-
|
534 |
label="Select Document to Delete",
|
535 |
-
choices=get_document_choices(),
|
536 |
value=None,
|
537 |
interactive=True,
|
538 |
allow_custom_value=False
|
539 |
)
|
540 |
delete_btn = gr.Button("ποΈ Delete Selected Document", variant="stop")
|
|
|
541 |
|
542 |
refresh_btn.click(
|
543 |
-
fn=
|
544 |
-
outputs=[document_list]
|
545 |
)
|
546 |
|
547 |
delete_btn.click(
|
548 |
delete_document_from_library,
|
549 |
-
inputs=[
|
550 |
-
outputs=[document_list, delete_doc_dropdown]
|
551 |
)
|
552 |
|
553 |
# π Upload Documents Tab
|
@@ -575,7 +588,7 @@ def create_gradio_interface():
|
|
575 |
upload_btn.click(
|
576 |
upload_and_process_file,
|
577 |
inputs=[file_input],
|
578 |
-
outputs=[upload_output, doc_id_output]
|
579 |
)
|
580 |
|
581 |
# π Search Documents Tab
|
@@ -615,9 +628,9 @@ def create_gradio_interface():
|
|
615 |
with gr.Column():
|
616 |
gr.Markdown("### Generate Document Summaries")
|
617 |
|
618 |
-
|
619 |
label="Select Document to Summarize",
|
620 |
-
choices=
|
621 |
value=None,
|
622 |
interactive=True,
|
623 |
allow_custom_value=False
|
@@ -646,7 +659,7 @@ def create_gradio_interface():
|
|
646 |
|
647 |
summarize_btn.click(
|
648 |
summarize_document,
|
649 |
-
inputs=[
|
650 |
outputs=[summary_output]
|
651 |
)
|
652 |
|
@@ -656,9 +669,9 @@ def create_gradio_interface():
|
|
656 |
with gr.Column():
|
657 |
gr.Markdown("### Auto-Generate Document Tags")
|
658 |
|
659 |
-
|
660 |
label="Select Document to Tag",
|
661 |
-
choices=
|
662 |
value=None,
|
663 |
interactive=True,
|
664 |
allow_custom_value=False
|
@@ -688,7 +701,7 @@ def create_gradio_interface():
|
|
688 |
|
689 |
tag_btn.click(
|
690 |
generate_tags_for_document,
|
691 |
-
inputs=[
|
692 |
outputs=[tag_output]
|
693 |
)
|
694 |
|
@@ -722,24 +735,32 @@ def create_gradio_interface():
|
|
722 |
outputs=[qa_output]
|
723 |
)
|
724 |
|
725 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
726 |
interface.load(
|
727 |
-
fn=
|
728 |
-
|
729 |
-
get_document_choices(), # for summarize tab
|
730 |
-
get_document_choices(), # for tag tab
|
731 |
-
get_document_choices() # for delete dropdown
|
732 |
-
),
|
733 |
-
outputs=[
|
734 |
-
document_list,
|
735 |
-
doc_dropdown_sum,
|
736 |
-
doc_dropdown_tag,
|
737 |
-
delete_doc_dropdown
|
738 |
-
]
|
739 |
)
|
740 |
|
741 |
-
return interface
|
742 |
-
|
743 |
|
744 |
# Create and launch the interface
|
745 |
if __name__ == "__main__":
|
|
|
307 |
def upload_and_process_file(file):
|
308 |
"""Gradio interface for file upload"""
|
309 |
if file is None:
|
310 |
+
return "No file uploaded", "", get_document_list(), gr.update(choices=get_document_choices()), gr.update(choices=get_document_choices()), gr.update(choices=get_document_choices()), gr.update(choices=get_document_choices())
|
311 |
|
312 |
try:
|
313 |
# Get file path
|
|
|
330 |
doc_list,
|
331 |
gr.update(choices=doc_choices),
|
332 |
gr.update(choices=doc_choices),
|
333 |
+
gr.update(choices=doc_choices),
|
334 |
gr.update(choices=doc_choices)
|
335 |
)
|
336 |
else:
|
|
|
340 |
get_document_list(),
|
341 |
gr.update(choices=get_document_choices()),
|
342 |
gr.update(choices=get_document_choices()),
|
343 |
+
gr.update(choices=get_document_choices()),
|
344 |
gr.update(choices=get_document_choices())
|
345 |
)
|
346 |
except Exception as e:
|
|
|
351 |
get_document_list(),
|
352 |
gr.update(choices=get_document_choices()),
|
353 |
gr.update(choices=get_document_choices()),
|
354 |
+
gr.update(choices=get_document_choices()),
|
355 |
gr.update(choices=get_document_choices())
|
356 |
)
|
357 |
|
|
|
485 |
return f"β Error: {str(e)}"
|
486 |
|
487 |
def delete_document_from_library(document_id):
|
488 |
+
"""deleting a document from the library"""
|
489 |
+
try:
|
490 |
+
# Run the async delete_document method
|
491 |
+
result = mcp_server.run_async(mcp_server.document_store.delete_document(document_id))
|
492 |
+
if result:
|
493 |
+
msg = f"ποΈ Document {document_id[:8]}... deleted successfully."
|
494 |
+
else:
|
495 |
+
msg = f"β Failed to delete document {document_id[:8]}..."
|
496 |
+
# Refresh document list and choices
|
497 |
+
doc_list = get_document_list()
|
498 |
+
doc_choices = get_document_choices()
|
499 |
+
return msg, doc_list, gr.update(choices=doc_choices), gr.update(choices=doc_choices), gr.update(choices=doc_choices), gr.update(choices=doc_choices)
|
500 |
+
except Exception as e:
|
501 |
+
return f"β Error: {str(e)}", get_document_list(), gr.update(choices=get_document_choices()), gr.update(choices=get_document_choices()), gr.update(choices=get_document_choices()), gr.update(choices=get_document_choices())
|
502 |
+
|
503 |
+
def refresh_library():
|
504 |
+
"""Refresh the document library display"""
|
505 |
+
doc_list = get_document_list()
|
506 |
+
doc_choices = get_document_choices()
|
507 |
+
return doc_list, gr.update(choices=doc_choices), gr.update(choices=doc_choices), gr.update(choices=doc_choices), gr.update(choices=doc_choices)
|
508 |
|
|
|
509 |
# Create Gradio Interface
|
510 |
def create_gradio_interface():
|
511 |
with gr.Blocks(title="π§ Intelligent Content Organizer MCP Agent", theme=gr.themes.Soft()) as interface:
|
512 |
+
gr.Markdown("""
|
513 |
+
# π§ Intelligent Content Organizer MCP Agent
|
514 |
+
|
515 |
+
A powerful MCP (Model Context Protocol) server for intelligent content management with semantic search,
|
516 |
+
summarization, and Q&A capabilities powered by Anthropic Claude and Mistral AI.
|
517 |
|
518 |
+
## π Quick Start:
|
519 |
+
1. **Upload Documents** β Go to "π Upload Documents" tab
|
520 |
+
2. **Search Your Content** β Use "π Search Documents" to find information
|
521 |
+
3. **Get Summaries** β Select any document in "π Summarize" tab
|
522 |
+
4. **Ask Questions** β Get answers from your documents in "β Ask Questions" tab
|
523 |
+
""")
|
524 |
|
525 |
+
# State components for dropdowns
|
526 |
+
with gr.Row(visible=False):
|
527 |
+
doc_dropdown_sum = gr.Dropdown(label="Hidden", choices=get_document_choices())
|
528 |
+
doc_dropdown_tag = gr.Dropdown(label="Hidden", choices=get_document_choices())
|
529 |
+
delete_doc_dropdown = gr.Dropdown(label="Hidden", choices=get_document_choices())
|
|
|
530 |
|
531 |
with gr.Tabs():
|
532 |
# π Document Library Tab
|
|
|
536 |
gr.Markdown("### Your Document Collection")
|
537 |
document_list = gr.Textbox(
|
538 |
label="Documents in Library",
|
539 |
+
value=get_document_list(),
|
540 |
lines=20,
|
541 |
interactive=False
|
542 |
)
|
543 |
refresh_btn = gr.Button("π Refresh Library", variant="secondary")
|
544 |
|
545 |
+
delete_doc_dropdown_visible = gr.Dropdown(
|
546 |
label="Select Document to Delete",
|
547 |
+
choices=get_document_choices(),
|
548 |
value=None,
|
549 |
interactive=True,
|
550 |
allow_custom_value=False
|
551 |
)
|
552 |
delete_btn = gr.Button("ποΈ Delete Selected Document", variant="stop")
|
553 |
+
delete_output = gr.Textbox(label="Delete Status", visible=True)
|
554 |
|
555 |
refresh_btn.click(
|
556 |
+
fn=refresh_library,
|
557 |
+
outputs=[document_list, delete_doc_dropdown_visible, doc_dropdown_sum, doc_dropdown_tag, delete_doc_dropdown]
|
558 |
)
|
559 |
|
560 |
delete_btn.click(
|
561 |
delete_document_from_library,
|
562 |
+
inputs=[delete_doc_dropdown_visible],
|
563 |
+
outputs=[delete_output, document_list, delete_doc_dropdown_visible, doc_dropdown_sum, doc_dropdown_tag, delete_doc_dropdown]
|
564 |
)
|
565 |
|
566 |
# π Upload Documents Tab
|
|
|
588 |
upload_btn.click(
|
589 |
upload_and_process_file,
|
590 |
inputs=[file_input],
|
591 |
+
outputs=[upload_output, doc_id_output, document_list, delete_doc_dropdown_visible, doc_dropdown_sum, doc_dropdown_tag, delete_doc_dropdown]
|
592 |
)
|
593 |
|
594 |
# π Search Documents Tab
|
|
|
628 |
with gr.Column():
|
629 |
gr.Markdown("### Generate Document Summaries")
|
630 |
|
631 |
+
doc_dropdown_sum_visible = gr.Dropdown(
|
632 |
label="Select Document to Summarize",
|
633 |
+
choices=get_document_choices(),
|
634 |
value=None,
|
635 |
interactive=True,
|
636 |
allow_custom_value=False
|
|
|
659 |
|
660 |
summarize_btn.click(
|
661 |
summarize_document,
|
662 |
+
inputs=[doc_dropdown_sum_visible, summary_text, summary_style],
|
663 |
outputs=[summary_output]
|
664 |
)
|
665 |
|
|
|
669 |
with gr.Column():
|
670 |
gr.Markdown("### Auto-Generate Document Tags")
|
671 |
|
672 |
+
doc_dropdown_tag_visible = gr.Dropdown(
|
673 |
label="Select Document to Tag",
|
674 |
+
choices=get_document_choices(),
|
675 |
value=None,
|
676 |
interactive=True,
|
677 |
allow_custom_value=False
|
|
|
701 |
|
702 |
tag_btn.click(
|
703 |
generate_tags_for_document,
|
704 |
+
inputs=[doc_dropdown_tag_visible, tag_text, max_tags],
|
705 |
outputs=[tag_output]
|
706 |
)
|
707 |
|
|
|
735 |
outputs=[qa_output]
|
736 |
)
|
737 |
|
738 |
+
# Update hidden dropdowns when visible ones change
|
739 |
+
doc_dropdown_sum_visible.change(
|
740 |
+
lambda x: x,
|
741 |
+
inputs=[doc_dropdown_sum_visible],
|
742 |
+
outputs=[doc_dropdown_sum]
|
743 |
+
)
|
744 |
+
|
745 |
+
doc_dropdown_tag_visible.change(
|
746 |
+
lambda x: x,
|
747 |
+
inputs=[doc_dropdown_tag_visible],
|
748 |
+
outputs=[doc_dropdown_tag]
|
749 |
+
)
|
750 |
+
|
751 |
+
delete_doc_dropdown_visible.change(
|
752 |
+
lambda x: x,
|
753 |
+
inputs=[delete_doc_dropdown_visible],
|
754 |
+
outputs=[delete_doc_dropdown]
|
755 |
+
)
|
756 |
+
|
757 |
+
# Auto-refresh dropdowns when the app loads
|
758 |
interface.load(
|
759 |
+
fn=refresh_library,
|
760 |
+
outputs=[document_list, delete_doc_dropdown_visible, doc_dropdown_sum_visible, doc_dropdown_tag_visible, delete_doc_dropdown]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
761 |
)
|
762 |
|
763 |
+
return interface
|
|
|
764 |
|
765 |
# Create and launch the interface
|
766 |
if __name__ == "__main__":
|