feat: Update MCP server logic and fix warnings
Browse files- app.py +51 -12
- requirements.txt +1 -1
app.py
CHANGED
|
@@ -145,6 +145,24 @@ with gr.Blocks() as demo:
|
|
| 145 |
llm_last_frame_img = gr.Image(label="Last Frame", type="filepath", interactive=False)
|
| 146 |
llm_gif_output = gr.Image(label="Generated GIF", type="filepath", interactive=False)
|
| 147 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
# --- Event Handlers ---
|
| 149 |
|
| 150 |
# --- System Events ---
|
|
@@ -178,13 +196,15 @@ with gr.Blocks() as demo:
|
|
| 178 |
get_first_frame_btn.click(
|
| 179 |
fn=video_tools.getFirstFrame,
|
| 180 |
inputs=uploaded_video_path_state,
|
| 181 |
-
outputs=first_frame_img
|
|
|
|
| 182 |
)
|
| 183 |
|
| 184 |
get_last_frame_btn.click(
|
| 185 |
fn=video_tools.getLastFrame,
|
| 186 |
inputs=uploaded_video_path_state,
|
| 187 |
-
outputs=last_frame_img
|
|
|
|
| 188 |
)
|
| 189 |
|
| 190 |
# --- LLM Events ---
|
|
@@ -221,6 +241,35 @@ with gr.Blocks() as demo:
|
|
| 221 |
]
|
| 222 |
)
|
| 223 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 224 |
# --- App Load Event ---
|
| 225 |
demo.load(
|
| 226 |
fn=on_load_tasks,
|
|
@@ -239,16 +288,6 @@ with gr.Blocks() as demo:
|
|
| 239 |
|
| 240 |
# --- MCP Server Launch ---
|
| 241 |
if __name__ == "__main__":
|
| 242 |
-
# Expose the functions we want to be available as tools
|
| 243 |
-
demo.add_tools(
|
| 244 |
-
{
|
| 245 |
-
"letter_counter": letter_counter,
|
| 246 |
-
"getFirstFrame": video_tools.getFirstFrame,
|
| 247 |
-
"getLastFrame": video_tools.getLastFrame,
|
| 248 |
-
"convert_mp4_to_gif": video_tools.convert_mp4_to_gif,
|
| 249 |
-
}
|
| 250 |
-
)
|
| 251 |
-
# Launch the Gradio app with MCP server enabled
|
| 252 |
demo.launch(mcp_server=True)
|
| 253 |
|
| 254 |
|
|
|
|
| 145 |
llm_last_frame_img = gr.Image(label="Last Frame", type="filepath", interactive=False)
|
| 146 |
llm_gif_output = gr.Image(label="Generated GIF", type="filepath", interactive=False)
|
| 147 |
|
| 148 |
+
# Hidden tab for exposing functions as MCP tools
|
| 149 |
+
with gr.Tab("MCP Tools", visible=False):
|
| 150 |
+
gr.Markdown("## Tools for MCP Server")
|
| 151 |
+
|
| 152 |
+
# Input for video path for MCP tools
|
| 153 |
+
mcp_video_path_input = gr.Textbox(label="Video Path for MCP")
|
| 154 |
+
|
| 155 |
+
# For letter_counter
|
| 156 |
+
lc_word_input = gr.Textbox(label="Word")
|
| 157 |
+
lc_letter_input = gr.Textbox(label="Letter")
|
| 158 |
+
lc_output = gr.Number(label="Count")
|
| 159 |
+
lc_btn = gr.Button("Count Letters")
|
| 160 |
+
|
| 161 |
+
# For video tools
|
| 162 |
+
mcp_get_first_frame_btn = gr.Button("MCP Get First Frame")
|
| 163 |
+
mcp_get_last_frame_btn = gr.Button("MCP Get Last Frame")
|
| 164 |
+
gif_btn = gr.Button("Convert to GIF")
|
| 165 |
+
|
| 166 |
# --- Event Handlers ---
|
| 167 |
|
| 168 |
# --- System Events ---
|
|
|
|
| 196 |
get_first_frame_btn.click(
|
| 197 |
fn=video_tools.getFirstFrame,
|
| 198 |
inputs=uploaded_video_path_state,
|
| 199 |
+
outputs=first_frame_img,
|
| 200 |
+
api_name="getFirstFrame"
|
| 201 |
)
|
| 202 |
|
| 203 |
get_last_frame_btn.click(
|
| 204 |
fn=video_tools.getLastFrame,
|
| 205 |
inputs=uploaded_video_path_state,
|
| 206 |
+
outputs=last_frame_img,
|
| 207 |
+
api_name="getLastFrame"
|
| 208 |
)
|
| 209 |
|
| 210 |
# --- LLM Events ---
|
|
|
|
| 241 |
]
|
| 242 |
)
|
| 243 |
|
| 244 |
+
# --- Hidden MCP Tool Events ---
|
| 245 |
+
lc_btn.click(
|
| 246 |
+
fn=letter_counter,
|
| 247 |
+
inputs=[lc_word_input, lc_letter_input],
|
| 248 |
+
outputs=lc_output,
|
| 249 |
+
api_name="letter_counter"
|
| 250 |
+
)
|
| 251 |
+
|
| 252 |
+
mcp_get_first_frame_btn.click(
|
| 253 |
+
fn=video_tools.getFirstFrame,
|
| 254 |
+
inputs=mcp_video_path_input,
|
| 255 |
+
outputs=llm_first_frame_img, # Can reuse an existing image component
|
| 256 |
+
api_name="getFirstFrame"
|
| 257 |
+
)
|
| 258 |
+
|
| 259 |
+
mcp_get_last_frame_btn.click(
|
| 260 |
+
fn=video_tools.getLastFrame,
|
| 261 |
+
inputs=mcp_video_path_input,
|
| 262 |
+
outputs=llm_last_frame_img, # Can reuse an existing image component
|
| 263 |
+
api_name="getLastFrame"
|
| 264 |
+
)
|
| 265 |
+
|
| 266 |
+
gif_btn.click(
|
| 267 |
+
fn=video_tools.convert_mp4_to_gif,
|
| 268 |
+
inputs=mcp_video_path_input,
|
| 269 |
+
outputs=llm_gif_output,
|
| 270 |
+
api_name="convert_mp4_to_gif"
|
| 271 |
+
)
|
| 272 |
+
|
| 273 |
# --- App Load Event ---
|
| 274 |
demo.load(
|
| 275 |
fn=on_load_tasks,
|
|
|
|
| 288 |
|
| 289 |
# --- MCP Server Launch ---
|
| 290 |
if __name__ == "__main__":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 291 |
demo.launch(mcp_server=True)
|
| 292 |
|
| 293 |
|
requirements.txt
CHANGED
|
@@ -1,2 +1,2 @@
|
|
| 1 |
-
gradio[mcp]
|
| 2 |
requests
|
|
|
|
| 1 |
+
gradio[mcp]
|
| 2 |
requests
|