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