import json import os import gradio as gr from gradio.components import Component from typing import Any, Dict, Optional from src.webui.webui_manager import WebuiManager from src.utils import config import logging from functools import partial logger = logging.getLogger(__name__) async def update_mcp_server(mcp_file: str, webui_manager: WebuiManager): """ Update the MCP server. """ if hasattr(webui_manager, "bu_controller") and webui_manager.bu_controller: logger.warning("⚠️ Close controller because mcp file has changed!") await webui_manager.bu_controller.close_mcp_client() webui_manager.bu_controller = None if not mcp_file or not os.path.exists(mcp_file) or not mcp_file.endswith('.json'): logger.warning(f"{mcp_file} is not a valid MCP file.") return None, gr.update(visible=False) with open(mcp_file, 'r') as f: mcp_server = json.load(f) return json.dumps(mcp_server, indent=2), gr.update(visible=True) def create_agent_settings_tab(webui_manager: WebuiManager): """ Creates an agent settings tab. """ input_components = set(webui_manager.get_components()) tab_components = {} with gr.Group(): with gr.Column(): override_system_prompt = gr.Textbox(label="Override system prompt", lines=4, interactive=True) extend_system_prompt = gr.Textbox(label="Extend system prompt", lines=4, interactive=True) with gr.Group(): mcp_json_file = gr.File(label="MCP server json", interactive=True, file_types=[".json"]) mcp_server_config = gr.Textbox(label="MCP server", lines=6, interactive=True, visible=False) with gr.Group(): with gr.Row(): # Fixed provider as OpenAI llm_provider = gr.Dropdown( choices=["openai"], label="LLM Provider", value="openai", info="OpenAI is the only supported LLM provider", interactive=False ) llm_model_name = gr.Dropdown( label="LLM Model Name", choices=config.model_names['openai'], value="gpt-4o", interactive=True, allow_custom_value=True, info="Select a model in the dropdown options or directly type a custom model name" ) with gr.Row(): llm_temperature = gr.Slider( minimum=0.0, maximum=2.0, value=0.6, step=0.1, label="LLM Temperature", info="Controls randomness in model outputs", interactive=True ) use_vision = gr.Checkbox( label="Use Vision", value=True, info="Enable Vision(Input highlighted screenshot into LLM)", interactive=True ) with gr.Row(): llm_base_url = gr.Textbox( label="Base URL", value="", info="API endpoint URL (if required)" ) llm_api_key = gr.Textbox( label="API Key", type="password", value="", info="Your API key (leave blank to use .env)" ) with gr.Row(): max_steps = gr.Slider( minimum=1, maximum=1000, value=100, step=1, label="Max Run Steps", info="Maximum number of steps the agent will take", interactive=True ) max_actions = gr.Slider( minimum=1, maximum=100, value=10, step=1, label="Max Number of Actions", info="Maximum number of actions the agent will take per step", interactive=True ) with gr.Row(): max_input_tokens = gr.Number( label="Max Input Tokens", value=128000, precision=0, interactive=True ) tool_calling_method = gr.Dropdown( label="Tool Calling Method", value="auto", interactive=True, allow_custom_value=True, choices=['function_calling', 'json_mode', 'raw', 'auto', 'tools', "None"], visible=True ) tab_components.update(dict( override_system_prompt=override_system_prompt, extend_system_prompt=extend_system_prompt, llm_provider=llm_provider, llm_model_name=llm_model_name, llm_temperature=llm_temperature, use_vision=use_vision, llm_base_url=llm_base_url, llm_api_key=llm_api_key, max_steps=max_steps, max_actions=max_actions, max_input_tokens=max_input_tokens, tool_calling_method=tool_calling_method, mcp_json_file=mcp_json_file, mcp_server_config=mcp_server_config, )) webui_manager.add_components("agent_settings", tab_components) async def update_wrapper(mcp_file): """Wrapper for handle_pause_resume.""" update_dict = await update_mcp_server(mcp_file, webui_manager) yield update_dict mcp_json_file.change( update_wrapper, inputs=[mcp_json_file], outputs=[mcp_server_config, mcp_server_config] )