MCP_Playground / ui_components /config_form.py
Aabbhishekk's picture
Upload 3 files
e37ee12 verified
import json
import gradio as gr
import modelscope_studio.components.antd as antd
import modelscope_studio.components.base as ms
from .add_mcp_server_button import AddMcpServerButton
from config import default_mcp_config, model_options, default_sys_prompt
def ConfigForm():
with antd.Form(layout="vertical",
value={
"sys_prompt": default_sys_prompt,
"model": model_options[0]["value"]
}) as config_form:
with antd.Form.Item(label_col=24):
with ms.Slot("extra"):
with antd.Flex(justify="end", elem_style=dict(marginTop=10)):
mcp_config_confirm_btn = antd.Button("保存配置",
type="primary")
with antd.Flex(wrap=True,
justify="space-between",
gap="middle",
elem_style=dict(paddingBottom=8)):
with antd.Flex(gap="middle", wrap=True):
with antd.Flex(gap="small", align="center"):
antd.Typography.Text("MCP Servers",
elem_style=dict(fontSize=14))
antd.Typography.Text("编辑以下内容以修改运行中的 MCP Servers",
elem_style=dict(fontSize=12),
type="secondary")
with antd.Tooltip(title="目前只支持 SSE 类型的 MCP Server"):
with antd.Typography.Text(type="warning"):
antd.Icon("InfoCircleOutlined")
add_mcp_server_form, add_mcp_server_json_form = AddMcpServerButton(
)
with antd.Button("重置默认配置",
size="small") as reset_mcp_config_btn:
with ms.Slot("icon"):
antd.Icon("ReloadOutlined")
with ms.Div():
with antd.Tooltip("在 MCP Inspector 中测试待连接的 MCP Server"):
with antd.Button(
"前往 MCP Inspector 测试",
color="primary",
variant="outlined",
size="small",
href_target="_blank",
href=
"https://modelscope.cn/studios/modelscope/mcp-inspector"
):
with ms.Slot("icon"):
antd.Icon("ExportOutlined")
mcp_config = gr.Code(default_mcp_config,
show_label=False,
container=False,
max_lines=20,
lines=3,
language="json")
with antd.Form.Item(form_name="model", label="模型"):
with ms.Slot("extra"):
with ms.Fragment(visible=False) as thought_tip:
antd.Typography.Text("Note: 推理模式在调用工具前,会有较长的思考过程,需耐心等待。",
elem_style=dict(fontSize=12),
type="warning")
with antd.Flex(align="center",
gap=4,
elem_style=dict(marginTop=4)):
ms.Text("Powered by")
with antd.Typography.Link(
href=
"https://modelscope.cn/docs/model-service/API-Inference/intro",
href_target="_blank",
elem_style=dict(display="flex",
alignItems="center")):
antd.Image(
"https://gw.alicdn.com/imgextra/i4/O1CN01dCJ2sA1OHUQJFyCRm_!!6000000001680-2-tps-200-200.png",
preview=False,
width=20,
height=20)
ms.Text("ModelScope API-Inference")
with antd.Select(options=model_options) as model_select:
with ms.Slot("labelRender",
params_mapping="""(option) => {
const tag = window.MODEL_OPTIONS_MAP[option.value].tag
return {
label: option.label,
link: { href: `https://modelscope.cn/models/${option.value.split(':')[0]}` },
tag: tag ? { value: tag.label, style: { display: 'inline-block', color: tag.color } } : undefined
}
}"""):
with antd.Flex(gap="small"):
antd.Typography.Text(as_item="label")
antd.Tag(elem_style=dict(display="none"),
as_item="tag")
antd.Typography.Link("模型链接",
href_target="_blank",
as_item="link")
with ms.Slot("optionRender",
params_mapping="""(option) => ({
label: option.data.label.split(':')[0],
tag: option.data.tag ? { value: option.data.tag.label, style: { display: 'inline-block', color: option.data.tag.color } } : undefined
})"""):
with antd.Flex(gap="small"):
antd.Typography.Text(as_item="label")
antd.Tag(elem_style=dict(display="none"),
as_item="tag")
with antd.Form.Item(form_name="sys_prompt", label="系统提示"):
antd.Input.Textarea(auto_size=dict(minRows=2, maxRows=4))
def add_mcp_server(mcp_config_value, add_mcp_server_form_value):
if not mcp_config_value:
mcp_config_value = "{}"
mcp_config = json.loads(mcp_config_value)
name = add_mcp_server_form_value["name"]
url = add_mcp_server_form_value["url"]
if "mcpServers" not in mcp_config:
mcp_config["mcpServers"] = {}
mcp_config["mcpServers"][name] = {"type": "sse", "url": url}
return gr.update(value=json.dumps(mcp_config, indent=4))
def add_mcp_server_by_json(mcp_config_value,
add_mcp_server_json_form_value):
if not mcp_config_value:
mcp_config_value = "{}"
mcp_config = json.loads(mcp_config_value)
json_value = add_mcp_server_json_form_value["json"]
json_config = json.loads(json_value)
if "mcpServers" not in mcp_config:
mcp_config["mcpServers"] = {}
mcp_config["mcpServers"].update(json_config.get("mcpServers", {}))
return gr.update(value=json.dumps(mcp_config, indent=4))
def select_model(e: gr.EventData):
return gr.update(visible=e._data["payload"][1].get("thought", False))
add_mcp_server_form.finish(fn=add_mcp_server,
inputs=[mcp_config, add_mcp_server_form],
outputs=[mcp_config],
queue=False)
add_mcp_server_json_form.finish(
fn=add_mcp_server_by_json,
inputs=[mcp_config, add_mcp_server_json_form],
outputs=[mcp_config],
queue=False)
model_select.change(fn=select_model, outputs=[thought_tip], queue=False)
return config_form, mcp_config_confirm_btn, reset_mcp_config_btn, mcp_config