Update app.py
Browse files
app.py
CHANGED
@@ -557,13 +557,13 @@ def Generate_Speech( # <-- MCP tool #4 (Generate Speech)
|
|
557 |
fetch_interface = gr.Interface(
|
558 |
fn=Fetch_Webpage, # connect the function to the UI
|
559 |
inputs=[
|
560 |
-
gr.Textbox(label="URL", placeholder="https://example.com/article"
|
561 |
-
gr.Dropdown(label="Verbosity", choices=["Brief", "Standard", "Full"], value="Standard"
|
562 |
-
gr.Checkbox(value=True, label="Include Metadata"
|
563 |
-
gr.Checkbox(value=True, label="Include Main Text"
|
564 |
-
gr.Checkbox(value=True, label="Include Links"
|
565 |
-
gr.Slider(400, 12000, value=3000, step=100, label="Max Characters (body text)"
|
566 |
-
gr.Slider(0, 100, value=20, step=1, label="Max Links"
|
567 |
],
|
568 |
outputs=gr.Markdown(label="Extracted Summary"),
|
569 |
title="Fetch Webpage",
|
@@ -576,20 +576,19 @@ fetch_interface = gr.Interface(
|
|
576 |
"control verbosity, whether to include metadata/text/links, and limits "
|
577 |
"for characters and number of links."
|
578 |
),
|
579 |
-
|
580 |
-
fill_width=True,
|
581 |
)
|
582 |
|
583 |
# --- Concise DDG tab (JSONL with short keys, minimal tokens) ---
|
584 |
concise_interface = gr.Interface(
|
585 |
fn=Search_DuckDuckGo,
|
586 |
inputs=[
|
587 |
-
gr.Textbox(label="Query", placeholder="topic OR site:example.com"
|
588 |
-
gr.Slider(minimum=1, maximum=20, value=5, step=1, label="Max results"
|
589 |
-
gr.Checkbox(value=False, label="Include snippets (adds tokens)"
|
590 |
-
gr.Slider(minimum=20, maximum=200, value=80, step=5, label="Max snippet chars"
|
591 |
-
gr.Checkbox(value=True, label="Dedupe by domain"
|
592 |
-
gr.Slider(minimum=20, maximum=120, value=80, step=5, label="Max title chars"
|
593 |
],
|
594 |
outputs=gr.Textbox(label="Results (JSONL)", interactive=False),
|
595 |
title="DuckDuckGo Search",
|
@@ -601,9 +600,8 @@ concise_interface = gr.Interface(
|
|
601 |
"t=title, u=url, optional s=snippet. Options control result count, "
|
602 |
"snippet inclusion and length, domain deduping, and title length."
|
603 |
),
|
604 |
-
|
605 |
submit_btn="Search",
|
606 |
-
fill_width=True,
|
607 |
)
|
608 |
|
609 |
##
|
@@ -611,7 +609,7 @@ concise_interface = gr.Interface(
|
|
611 |
# --- Execute Python tab (simple code interpreter) ---
|
612 |
code_interface = gr.Interface(
|
613 |
fn=Execute_Python,
|
614 |
-
inputs=gr.Code(label="Python Code", language="python"
|
615 |
outputs=gr.Textbox(label="Output"),
|
616 |
title="Python Code Executor",
|
617 |
description=(
|
@@ -624,17 +622,52 @@ code_interface = gr.Interface(
|
|
624 |
"Returns:\n"
|
625 |
"- string: Combined stdout produced by the code, or the exception text if execution failed."
|
626 |
),
|
627 |
-
|
628 |
-
fill_width=True,
|
629 |
)
|
630 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
631 |
# --- Kokoro TTS tab (text to speech) ---
|
632 |
kokoro_interface = gr.Interface(
|
633 |
fn=Generate_Speech,
|
634 |
inputs=[
|
635 |
-
gr.Textbox(label="Text", placeholder="Type text to synthesize…", lines=4
|
636 |
-
gr.Slider(minimum=0.5, maximum=2.0, value=1.0, step=0.1, label="Speed"
|
637 |
-
gr.Textbox(label="Voice", value="af_heart", placeholder="e.g., af_heart"
|
638 |
],
|
639 |
outputs=gr.Audio(label="Audio", type="numpy"),
|
640 |
title="Kokoro TTS",
|
@@ -646,8 +679,7 @@ kokoro_interface = gr.Interface(
|
|
646 |
"Parameters: text (str), speed (float 0.5–2.0), voice (str). "
|
647 |
"Return the generated image to the user."
|
648 |
),
|
649 |
-
|
650 |
-
fill_width=True,
|
651 |
)
|
652 |
|
653 |
# ==========================
|
@@ -741,8 +773,8 @@ def Generate_Image( # <-- MCP tool #5 (Generate Image)
|
|
741 |
image_generation_interface = gr.Interface(
|
742 |
fn=Generate_Image,
|
743 |
inputs=[
|
744 |
-
gr.Textbox(label="Prompt", placeholder="Enter a prompt", lines=2
|
745 |
-
gr.Textbox(label="Model", value="black-forest-labs/FLUX.1-Krea-dev", placeholder="creator/model-name"
|
746 |
gr.Textbox(
|
747 |
label="Negative Prompt",
|
748 |
value=(
|
@@ -751,17 +783,15 @@ image_generation_interface = gr.Interface(
|
|
751 |
"mutated, ugly, disgusting, blurry, amputation, misspellings, typos"
|
752 |
),
|
753 |
lines=2,
|
754 |
-
scale=2,
|
755 |
-
min_width=300,
|
756 |
),
|
757 |
-
gr.Slider(minimum=1, maximum=100, value=35, step=1, label="Steps"
|
758 |
-
gr.Slider(minimum=1.0, maximum=20.0, value=7.0, step=0.1, label="CFG Scale"
|
759 |
gr.Radio(label="Sampler", value="DPM++ 2M Karras", choices=[
|
760 |
"DPM++ 2M Karras", "DPM++ SDE Karras", "Euler", "Euler a", "Heun", "DDIM"
|
761 |
-
]
|
762 |
-
gr.Slider(minimum=-1, maximum=1_000_000_000, value=-1, step=1, label="Seed (-1 = random)"
|
763 |
-
gr.Slider(minimum=64, maximum=1216, value=1024, step=32, label="Width"
|
764 |
-
gr.Slider(minimum=64, maximum=1216, value=1024, step=32, label="Height"
|
765 |
],
|
766 |
outputs=gr.Image(label="Generated Image"),
|
767 |
title="Image Generation",
|
@@ -775,8 +805,7 @@ image_generation_interface = gr.Interface(
|
|
775 |
"sampler (str, label only), seed (int, -1=random), width/height (int, 64–1216). Returns a PIL.Image. "
|
776 |
"Return the generated image to the user in this format ``"
|
777 |
),
|
778 |
-
|
779 |
-
fill_width=True,
|
780 |
)
|
781 |
|
782 |
# ==========================
|
@@ -931,16 +960,16 @@ def Generate_Video( # <-- MCP tool #6 (Generate Video)
|
|
931 |
video_generation_interface = gr.Interface(
|
932 |
fn=Generate_Video,
|
933 |
inputs=[
|
934 |
-
gr.Textbox(label="Prompt", placeholder="Enter a prompt for the video", lines=2
|
935 |
-
gr.Textbox(label="Model", value="Wan-AI/Wan2.2-T2V-A14B", placeholder="creator/model-name"
|
936 |
-
gr.Textbox(label="Negative Prompt", value="", lines=2
|
937 |
-
gr.Slider(minimum=1, maximum=100, value=25, step=1, label="Steps"
|
938 |
-
gr.Slider(minimum=1.0, maximum=20.0, value=3.5, step=0.1, label="CFG Scale"
|
939 |
-
gr.Slider(minimum=-1, maximum=1_000_000_000, value=-1, step=1, label="Seed (-1 = random)"
|
940 |
-
gr.Slider(minimum=64, maximum=1920, value=768, step=8, label="Width"
|
941 |
-
gr.Slider(minimum=64, maximum=1920, value=768, step=8, label="Height"
|
942 |
-
gr.Slider(minimum=4, maximum=60, value=24, step=1, label="FPS"
|
943 |
-
gr.Slider(minimum=1.0, maximum=10.0, value=4.0, step=0.5, label="Duration (s)"
|
944 |
],
|
945 |
outputs=gr.Video(label="Generated Video"),
|
946 |
title="Video Generation",
|
@@ -953,8 +982,7 @@ video_generation_interface = gr.Interface(
|
|
953 |
"Parameters: prompt (str), model_id (str), negative_prompt (str), steps (int), cfg_scale (float), seed (int), "
|
954 |
"width/height (int), fps (int), duration (float). Returns a file path to an MP4 that MCP exposes as a file URL."
|
955 |
),
|
956 |
-
|
957 |
-
fill_width=True,
|
958 |
)
|
959 |
|
960 |
# Build tabbed app; disable Image/Video tools if no HF token is present
|
@@ -982,6 +1010,7 @@ demo = gr.TabbedInterface(
|
|
982 |
tab_names=_tab_names,
|
983 |
title="Tools MCP",
|
984 |
theme="Nymbo/Nymbo_Theme",
|
|
|
985 |
)
|
986 |
|
987 |
# Launch the UI and expose all functions as MCP tools in one server
|
|
|
557 |
fetch_interface = gr.Interface(
|
558 |
fn=Fetch_Webpage, # connect the function to the UI
|
559 |
inputs=[
|
560 |
+
gr.Textbox(label="URL", placeholder="https://example.com/article"),
|
561 |
+
gr.Dropdown(label="Verbosity", choices=["Brief", "Standard", "Full"], value="Standard"),
|
562 |
+
gr.Checkbox(value=True, label="Include Metadata"),
|
563 |
+
gr.Checkbox(value=True, label="Include Main Text"),
|
564 |
+
gr.Checkbox(value=True, label="Include Links"),
|
565 |
+
gr.Slider(400, 12000, value=3000, step=100, label="Max Characters (body text)"),
|
566 |
+
gr.Slider(0, 100, value=20, step=1, label="Max Links"),
|
567 |
],
|
568 |
outputs=gr.Markdown(label="Extracted Summary"),
|
569 |
title="Fetch Webpage",
|
|
|
576 |
"control verbosity, whether to include metadata/text/links, and limits "
|
577 |
"for characters and number of links."
|
578 |
),
|
579 |
+
allow_flagging="never",
|
|
|
580 |
)
|
581 |
|
582 |
# --- Concise DDG tab (JSONL with short keys, minimal tokens) ---
|
583 |
concise_interface = gr.Interface(
|
584 |
fn=Search_DuckDuckGo,
|
585 |
inputs=[
|
586 |
+
gr.Textbox(label="Query", placeholder="topic OR site:example.com"),
|
587 |
+
gr.Slider(minimum=1, maximum=20, value=5, step=1, label="Max results"),
|
588 |
+
gr.Checkbox(value=False, label="Include snippets (adds tokens)"),
|
589 |
+
gr.Slider(minimum=20, maximum=200, value=80, step=5, label="Max snippet chars"),
|
590 |
+
gr.Checkbox(value=True, label="Dedupe by domain"),
|
591 |
+
gr.Slider(minimum=20, maximum=120, value=80, step=5, label="Max title chars"),
|
592 |
],
|
593 |
outputs=gr.Textbox(label="Results (JSONL)", interactive=False),
|
594 |
title="DuckDuckGo Search",
|
|
|
600 |
"t=title, u=url, optional s=snippet. Options control result count, "
|
601 |
"snippet inclusion and length, domain deduping, and title length."
|
602 |
),
|
603 |
+
allow_flagging="never",
|
604 |
submit_btn="Search",
|
|
|
605 |
)
|
606 |
|
607 |
##
|
|
|
609 |
# --- Execute Python tab (simple code interpreter) ---
|
610 |
code_interface = gr.Interface(
|
611 |
fn=Execute_Python,
|
612 |
+
inputs=gr.Code(label="Python Code", language="python"),
|
613 |
outputs=gr.Textbox(label="Output"),
|
614 |
title="Python Code Executor",
|
615 |
description=(
|
|
|
622 |
"Returns:\n"
|
623 |
"- string: Combined stdout produced by the code, or the exception text if execution failed."
|
624 |
),
|
625 |
+
allow_flagging="never",
|
|
|
626 |
)
|
627 |
|
628 |
+
CSS_STYLES = """
|
629 |
+
.gradio-container h1 {
|
630 |
+
text-align: center;
|
631 |
+
/* Ensure main title appears first, then our two subtitle lines */
|
632 |
+
display: grid;
|
633 |
+
justify-items: center;
|
634 |
+
}
|
635 |
+
/* Place bold tools list on line 2, normal auth note on line 3 (below title) */
|
636 |
+
.gradio-container h1::before {
|
637 |
+
grid-row: 2;
|
638 |
+
content: "Fetch Webpage | Search DuckDuckGo | Code Interpreter | Kokoro TTS | Image Generation | Video Generation";
|
639 |
+
display: block;
|
640 |
+
font-size: 1rem;
|
641 |
+
font-weight: 700;
|
642 |
+
opacity: 0.9;
|
643 |
+
margin-top: 6px;
|
644 |
+
white-space: pre-wrap;
|
645 |
+
}
|
646 |
+
.gradio-container h1::after {
|
647 |
+
grid-row: 3;
|
648 |
+
content: "Authentication is optional but Image/Video Generation require a `HF_READ_TOKEN` in env variables. They are hidden otherwise.";
|
649 |
+
display: block;
|
650 |
+
font-size: 1rem;
|
651 |
+
font-weight: 400;
|
652 |
+
opacity: 0.9;
|
653 |
+
margin-top: 2px;
|
654 |
+
white-space: pre-wrap;
|
655 |
+
}
|
656 |
+
|
657 |
+
/* Remove inside tab panels so it doesn't duplicate under each tool title */
|
658 |
+
.gradio-container [role=\"tabpanel\"] h1::before,
|
659 |
+
.gradio-container [role=\"tabpanel\"] h1::after {
|
660 |
+
content: none !important;
|
661 |
+
}
|
662 |
+
"""
|
663 |
+
|
664 |
# --- Kokoro TTS tab (text to speech) ---
|
665 |
kokoro_interface = gr.Interface(
|
666 |
fn=Generate_Speech,
|
667 |
inputs=[
|
668 |
+
gr.Textbox(label="Text", placeholder="Type text to synthesize…", lines=4),
|
669 |
+
gr.Slider(minimum=0.5, maximum=2.0, value=1.0, step=0.1, label="Speed"),
|
670 |
+
gr.Textbox(label="Voice", value="af_heart", placeholder="e.g., af_heart"),
|
671 |
],
|
672 |
outputs=gr.Audio(label="Audio", type="numpy"),
|
673 |
title="Kokoro TTS",
|
|
|
679 |
"Parameters: text (str), speed (float 0.5–2.0), voice (str). "
|
680 |
"Return the generated image to the user."
|
681 |
),
|
682 |
+
allow_flagging="never",
|
|
|
683 |
)
|
684 |
|
685 |
# ==========================
|
|
|
773 |
image_generation_interface = gr.Interface(
|
774 |
fn=Generate_Image,
|
775 |
inputs=[
|
776 |
+
gr.Textbox(label="Prompt", placeholder="Enter a prompt", lines=2),
|
777 |
+
gr.Textbox(label="Model", value="black-forest-labs/FLUX.1-Krea-dev", placeholder="creator/model-name"),
|
778 |
gr.Textbox(
|
779 |
label="Negative Prompt",
|
780 |
value=(
|
|
|
783 |
"mutated, ugly, disgusting, blurry, amputation, misspellings, typos"
|
784 |
),
|
785 |
lines=2,
|
|
|
|
|
786 |
),
|
787 |
+
gr.Slider(minimum=1, maximum=100, value=35, step=1, label="Steps"),
|
788 |
+
gr.Slider(minimum=1.0, maximum=20.0, value=7.0, step=0.1, label="CFG Scale"),
|
789 |
gr.Radio(label="Sampler", value="DPM++ 2M Karras", choices=[
|
790 |
"DPM++ 2M Karras", "DPM++ SDE Karras", "Euler", "Euler a", "Heun", "DDIM"
|
791 |
+
]),
|
792 |
+
gr.Slider(minimum=-1, maximum=1_000_000_000, value=-1, step=1, label="Seed (-1 = random)"),
|
793 |
+
gr.Slider(minimum=64, maximum=1216, value=1024, step=32, label="Width"),
|
794 |
+
gr.Slider(minimum=64, maximum=1216, value=1024, step=32, label="Height"),
|
795 |
],
|
796 |
outputs=gr.Image(label="Generated Image"),
|
797 |
title="Image Generation",
|
|
|
805 |
"sampler (str, label only), seed (int, -1=random), width/height (int, 64–1216). Returns a PIL.Image. "
|
806 |
"Return the generated image to the user in this format ``"
|
807 |
),
|
808 |
+
allow_flagging="never",
|
|
|
809 |
)
|
810 |
|
811 |
# ==========================
|
|
|
960 |
video_generation_interface = gr.Interface(
|
961 |
fn=Generate_Video,
|
962 |
inputs=[
|
963 |
+
gr.Textbox(label="Prompt", placeholder="Enter a prompt for the video", lines=2),
|
964 |
+
gr.Textbox(label="Model", value="Wan-AI/Wan2.2-T2V-A14B", placeholder="creator/model-name"),
|
965 |
+
gr.Textbox(label="Negative Prompt", value="", lines=2),
|
966 |
+
gr.Slider(minimum=1, maximum=100, value=25, step=1, label="Steps"),
|
967 |
+
gr.Slider(minimum=1.0, maximum=20.0, value=3.5, step=0.1, label="CFG Scale"),
|
968 |
+
gr.Slider(minimum=-1, maximum=1_000_000_000, value=-1, step=1, label="Seed (-1 = random)"),
|
969 |
+
gr.Slider(minimum=64, maximum=1920, value=768, step=8, label="Width"),
|
970 |
+
gr.Slider(minimum=64, maximum=1920, value=768, step=8, label="Height"),
|
971 |
+
gr.Slider(minimum=4, maximum=60, value=24, step=1, label="FPS"),
|
972 |
+
gr.Slider(minimum=1.0, maximum=10.0, value=4.0, step=0.5, label="Duration (s)"),
|
973 |
],
|
974 |
outputs=gr.Video(label="Generated Video"),
|
975 |
title="Video Generation",
|
|
|
982 |
"Parameters: prompt (str), model_id (str), negative_prompt (str), steps (int), cfg_scale (float), seed (int), "
|
983 |
"width/height (int), fps (int), duration (float). Returns a file path to an MP4 that MCP exposes as a file URL."
|
984 |
),
|
985 |
+
allow_flagging="never",
|
|
|
986 |
)
|
987 |
|
988 |
# Build tabbed app; disable Image/Video tools if no HF token is present
|
|
|
1010 |
tab_names=_tab_names,
|
1011 |
title="Tools MCP",
|
1012 |
theme="Nymbo/Nymbo_Theme",
|
1013 |
+
css=CSS_STYLES,
|
1014 |
)
|
1015 |
|
1016 |
# Launch the UI and expose all functions as MCP tools in one server
|