当前位置: 首页 > news >正文

Langchain mcp 可视化界面

界面

依赖包

"gradio>=6.13.0","langchain>=1.2.15","langchain-mcp-adapters>=0.2.2","langchain-openai>=1.1.12","langgraph-cli[inmem]>=0.4.21",

代码

importasyncioimportuuidfromtypingimportList,DictimportgradioasgrfromgradioimportChatMessagefromlangchain.agentsimportcreate_agentfromlangchain_core.messagesimportHumanMessage,AIMessage,ToolMessagefromlangchain_mcp_adapters.clientimportMultiServerMCPClientfromlanggraph.typesimportCommandfromlanggraph.checkpoint.memoryimportInMemorySaverfromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenv,find_dotenvimportos load_dotenv(find_dotenv())ZHIPU_API_KEY=os.getenv("ZHIPU_API_KEY")# ModelScope 上的 Qwen3-32B(OpenAI 接口兼容)QWEN3_32B="Qwen/Qwen3-32B"# 优先读取 ModelScope 的 API Key;若未配置则回退到 OPENAI_API_KEY(兼容常见环境)API_KEY=os.getenv("MODELSCOPE_API_KEY")oros.getenv("OPENAI_API_KEY")or""model=init_chat_model(model=QWEN3_32B,model_provider="openai",base_url="https://api-inference.modelscope.cn/v1/",api_key=API_KEY,temperature=0,# 通过 extra_body 传入思考/推理开关与流式选项(content_blocks 将包含 reasoning 与 text)extra_body={# 常见思考模式参数的并集,未识别的键会被后端忽略"enable_thinking":False},)# 网络搜索MCP服务端(工具的配置)zhipuai_mcp_server_config={"url":"https://open.bigmodel.cn/api/mcp/web_search/sse?Authorization="+ZHIPU_API_KEY,"transport":"sse",}# https://modelscope.cn/mcp/servers/@Joooook/12306-mcp 部署mcp_12306_server_config={"url":"https://mcp.api-inference.modelscope.net/xxx/sse",'transport':'sse'}# https://modelscope.cn/mcp/servers/antvis/mcp-server-chart 部署mcp_chart_server_config={"url":"https://mcp.api-inference.modelscope.net/xxx/sse",'transport':'sse'}# 创建一个MCP的客户端去连接mcp_client=MultiServerMCPClient({"zhipuai_mcp_server_config":zhipuai_mcp_server_config,"my12306_mcp_server_config":mcp_12306_server_config,"chart_mcp_server_config":mcp_12306_server_config,})# 这些MCP服务端的工具,只支持异步模式,所以只能用MCP的异步模式去调用asyncdefcreate_new_agent():mcp_tools=awaitmcp_client.get_tools()# 获取MCP的所有toolsreturncreate_agent(model,tools=mcp_tools,system_prompt='你是一个智能助手,尽可能的调用工具回答用户的问题',checkpointer=InMemorySaver()# 创建一个内存的保存器: 保存对话上下文)agent=asyncio.run(create_new_agent())# 配置参数,包含会话IDconfig={"configurable":{# 检查点由session_id访问"thread_id":str(uuid.uuid4()),}}# res = agent.invoke(input={'messages': [HumanMessage(content='你好!')]}, config=config)# print(res)defadd_message(chat_history,user_message):ifuser_message:chat_history.append({"role":"user","content":user_message})returnchat_history,gr.Textbox(value=None,interactive=False)asyncdefsubmit_messages(chat_history:List[Dict]):"""流式处理消息的核心函数"""user_input=chat_history[-1]['content']current_state=agent.get_state(config)full_response=""# 累积完整响应tool_calls=[]# 记录工具调用# 处理中断恢复或正常消息inputs=Command(resume={'answer':user_input})ifcurrent_state.nextelse{'messages':[HumanMessage(content=user_input)]}asyncforchunkinagent.astream(inputs,config,stream_mode=["messages","updates"],# 同时监听消息和状态更新):if'messages'inchunk:formessageinchunk[1]:# 处理AI消息流式输出ifisinstance(message,AIMessage)andmessage.content:full_response+=message.content# 更新最后一条消息而非追加ifchat_historyandisinstance(chat_history[-1],ChatMessage)and'title'notinchat_history[-1].metadata:chat_history[-1].content=full_responseelse:chat_history.append(ChatMessage(role="assistant",content=message.content))yieldchat_history# 处理工具调用消息elifisinstance(message,ToolMessage):tool_msg=f"🔧 调用工具:{message.name}\n{message.content}"chat_history.append(ChatMessage(role="assistant",content=tool_msg,metadata={"title":f"🛠️ Used tool{message.name}"}))yieldchat_history# 创建Gradio界面withgr.Blocks(title='我的智能小秘书',theme=gr.themes.Soft(),css=".system {color: #666; font-style: italic;}"# 自定义系统消息样式)asdemo:# 聊天历史记录组件chatbot=gr.Chatbot(height=500,render_markdown=True,# 支持Markdown格式line_breaks=False# 禁用自动换行符)# 输入组件chat_input=gr.Textbox(placeholder="请输入您的消息...",label="用户输入",max_lines=5,container=False)# 控制按钮withgr.Row():submit_btn=gr.Button("发送",variant="primary")clear_btn=gr.Button("清空对话")# 消息提交处理链msg_handler=chat_input.submit(fn=add_message,inputs=[chatbot,chat_input],outputs=[chatbot,chat_input],queue=False).then(fn=submit_messages,inputs=chatbot,outputs=chatbot,api_name="chat_stream"# API端点名称)# 按钮点击处理链btn_handler=submit_btn.click(fn=add_message,inputs=[chatbot,chat_input],outputs=[chatbot,chat_input],queue=False).then(fn=submit_messages,inputs=chatbot,outputs=chatbot)# 清空对话clear_btn.click(fn=lambda:[],inputs=None,outputs=chatbot,queue=False)# 重置输入框状态msg_handler.then(lambda:gr.Textbox(interactive=True),None,[chat_input])btn_handler.then(lambda:gr.Textbox(interactive=True),None,[chat_input])if__name__=='__main__':demo.launch()
http://www.jsqmd.com/news/729913/

相关文章:

  • Nordic nRF54LS05蓝牙SoC:低功耗BLE解决方案解析
  • 多方面因素驱动一念成仙业务2026年第一季度强劲增长深度解析
  • 双频门禁读卡器(13.56MHz 915MHz)通过融合高频(HF)与超高频(UHF)技术, “精准识别+高效通行” 的组合显著提升了门禁系统的灵活性与安全性。
  • 如何零代码实现五大媒体平台数据采集:MediaCrawler终极指南
  • 基于LLaMA与RLHF的大模型对齐实战:从SFT到PPO全流程解析
  • 无人机飞控与游戏角色控制:聊聊卡尔丹旋转顺序(Yaw-Pitch-Roll)的那些坑
  • Room 3.0:移动端持久化的“重生”变革
  • 2026全容积式蒸汽发生器厂家怎么选:供热系统设计、太阳能热水系统、成都锅炉、锅炉维修、供热储能系统、电容积式热水器选择指南 - 优质品牌商家
  • 洗涤机轴承优选指南:五强品牌深度评测与选型技巧 - 品牌策略师
  • 从比特币到企业应用:手把手带你用Hyperledger Fabric搭建一个简易联盟链Demo
  • AutoPage验证器:自动化网页质量评估的技术实践
  • Acrobat Pro隐藏技能:写几行JavaScript,让PDF书签自动变成Word式目录页
  • ComfyUI-Easy-Use:3大核心技术革新,彻底解决AI图像生成GPU资源管理难题
  • 别再死记硬背了!用Wireshark抓包实战,5分钟搞懂UDP和TCP报文到底长啥样
  • 从ViT到混合模型:我是如何用PyTorch复现CeiT和ConTNet,并在Kaggle皮肤癌数据集上刷到新高的
  • 视觉语言模型的高熵令牌攻击与防御策略
  • FLASH-SEARCHER框架:并行推理与工具调用的AI代理系统
  • 语音情绪识别中的标签聚合与主观性处理方法
  • 告别理论推导!用Python+Matlab复现WMMSE算法,搞定多用户MIMO波束成形优化
  • ARM SVE2 UMULLB指令解析与性能优化实践
  • 2026乐山小语种机构选择推荐:核心维度与案例解析 - 优质品牌商家
  • 动态负提示技术:AI艺术创作的创意突破
  • MVAug多模态视频生成技术解析与应用实践
  • 如何3步掌握Flash逆向分析:JPEXS免费反编译工具终极指南
  • 基于Git的企业级Wiki系统PandaWiki部署与实战指南
  • 避坑指南:UR5e+Realsense手眼标定中,坐标系搞错、采样失败怎么办?
  • 信息安全工程师核心考点:访问控制设计、管理与全景化应用
  • 基于Rust与WebGPU的本地大模型推理服务器部署与实战指南
  • 扩散语言模型原理与文本生成优化实践
  • AI产品经理必备:掌握这“前后左右”四维能力,轻松定义产品未来!