二、LangGraph搭建MCP客户端流程

        接下来进入到实操环节,正式为大家介绍如何将MCP工具接入LangGraph中并创建智能体。

1. 创建自定义MCP工具

        作为大模型开发者,掌握MCP工具开发流程是基本功,这里我们先尝试自定义MCP工具,并将其接入LangGraph。对于一个完整的MCP项目来说,要有完整的项目代码结构、以及符合MCP服务器基本调用规范。具体项目创建流程如下:

Step 1. 借助uv创建Python项目

        MCP开发要求借助uv进行虚拟环境创建和依赖管理。uv 是一个Python 依赖管理工具,类似于 pipconda,但它更快、更高效,并且可以更好地管理 Python 虚拟环境和依赖项。它的核心目标是替代 pipvenv pip-tools,提供更好的性能和更低的管理开销。

uv 的特点

  1. 速度更快:相比 pipuv 采用 Rust 编写,性能更优。
  1. 支持 PEP 582:无需 virtualenv,可以直接使用 __pypackages__ 进行管理。
  1. 兼容 pip:支持 requirements.txtpyproject.toml 依赖管理。
  1. 替代 venv:提供 uv venv 进行虚拟环境管理,比 venv 更轻量。
  1. 跨平台:支持 Windows、macOS 和 Linux。

        以Ubuntu系统为例,首先使用pip安装uv:

Bash
pip install uv

此外,也可以直接使用curl安装uv

Bash
curl -LsSf https://astral.sh/uv/install.sh | sh

然后按照如下流程创建项目主目录:

Bash
# 创建项目目录
uv init mcp-get-weather
cd mcp-get-weather

然后输入如下命令创建虚拟环境:

Bash
# 创建虚拟环境
uv venv

# 激活虚拟环境
source .venv/bin/activate

此时这个.venv文件就负责保存当前虚拟环境的各项依赖。

各文件解释如下:

文件/文件夹

作用

.git/

Git 版本控制目录

.venv/

虚拟环境

.gitignore

Git 忽略规则

.python-version

Python版本声明

main.py

主程序入口

pyproject.toml

项目配置文件

README.md

项目说明文档

Step 2. 添加项目依赖

        接下来继续使用uv工具,为我们的项目添加基础依赖。根据此前的代码解释不难看出,当前项目主要需要用到httpxdotenvlanggraphlangchain_deepseeklangchain_mcp_adapters等核心库,我们可以使用如下命令安装相关依赖,并同时安装mcp sdk:

Bash
# 安装 MCP SDK
uv add mcp httpx dotenv langgraph langchain-deepseek langchain-mcp-adapters

注意,对于uv管理库来说,相关依赖会安装到.venv文件中,并不会和系统库产生冲突。

Step 3.编写MCP服务器

        接下来继续创建MCP服务器,为了更好的模拟真实场景,这里我们创建多个MCP服务器。

  • 查询天气服务器weather_server.py
  • 用于进行天气信息查询的服务器,完整代码如下:

Python
import os
import json
import httpx
from typing import Any
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCP

#
初始化 MCP 服务器
mcp = FastMCP("WeatherServer")

# OpenWeather API 配置
OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather"
API_KEY = "98cdb20187473b93432b86d8181cb070"
USER_AGENT = "weather-app/1.0"

async def fetch_weather(city: str) -> dict[str, Any] | None:
    """
    从 OpenWeather API 获取天气信息。
    :param city: 城市名称(需使用英文,如 Beijing)
    :return: 天气数据字典;若出错返回包含 error 信息的字典
    """
    params = {
        "q": city,
        "appid": API_KEY,
        "units": "metric",
        "lang": "zh_cn"
    }
    headers = {"User-Agent": USER_AGENT}

    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(OPENWEATHER_API_BASE, params=params, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()  # 返回字典类型
        except httpx.HTTPStatusError as e:
            return {"error": f"HTTP 错误: {e.response.status_code}"}
        except Exception as e:
            return {"error": f"请求失败: {str(e)}"}

def format_weather(data: dict[str, Any] | str) -> str:
    """
    将天气数据格式化为易读文本。
    :param data: 天气数据(可以是字典或 JSON 字符串)
    :return: 格式化后的天气信息字符串
    """
    # 如果传入的是字符串,则先转换为字典
    if isinstance(data, str):
        try:
            data = json.loads(data)
        except Exception as e:
            return f"无法解析天气数据: {e}"

    # 如果数据中包含错误信息,直接返回错误提示
    if "error" in data:
        return f"⚠️ {data['error']}"

    # 提取数据时做容错处理
    city = data.get("name", "未知")
    country = data.get("sys", {}).get("country", "未知")
    temp = data.get("main", {}).get("temp", "N/A")
    humidity = data.get("main", {}).get("humidity", "N/A")
    wind_speed = data.get("wind", {}).get("speed", "N/A")
    # weather 可能为空列表,因此用 [0] 前先提供默认字典
    weather_list = data.get("weather", [{}])
    description = weather_list[0].get("description", "未知")

    return (
        f"🌍 {city}, {country}\n"
        f"🌡 温度: {temp}°C\n"
        f"💧 湿度: {humidity}%\n"
        f"🌬 风速: {wind_speed} m/s\n"
        f"🌤 天气: {description}\n"
    )

@mcp.tool()
async def query_weather(city: str) -> str:
    """
    输入指定城市的英文名称,返回今日天气查询结果。
    :param city: 城市名称(需使用英文)
    :return: 格式化后的天气信息
    """
    data = await fetch_weather(city)
    return format_weather(data)

if __name__ == "__main__":
    # 以标准 I/O 方式运行 MCP 服务器
    mcp.run(transport='stdio')

  • 写入本地文档服务器write_server.py
  • 用于将指定文本信息写入本地文档的外部函数,完整代码如下:

Python
import os
from datetime import datetime
from mcp.server.fastmcp import FastMCP

#
初始化 MCP 服务器
mcp = FastMCP("WriteServer")
USER_AGENT = "write-app/1.0"

# 文件保存目录
OUTPUT_DIR = "./output"

# 确保目录存在
os.makedirs(OUTPUT_DIR, exist_ok=True)

@mcp.tool()
async def write_file(content: str) -> str:
    """
    将指定内容写入本地文件,并返回生成的文件名。
    :param content: 必要参数,字符串类型,用于表示需要写入文档的具体内容。
    :return: 写入结果与文件路径
    """
    # 创建带时间戳的文件名
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"note_{timestamp}.txt"
    filepath = os.path.join(OUTPUT_DIR, filename)

    try:
        # 写入文件
        with open(filepath, "w", encoding="utf-8") as f:
            f.write(content)

        return f"✅ 已成功写入文件: {filepath}"
    except Exception as e:
        return f"⚠️ 写入失败: {e}"

if __name__ == "__main__":
    # 以标准 I/O 方式运行 MCP 服务器
    mcp.run(transport='stdio')

  • 创建.env文件
  •  为了更好的保管敏感API-KEY信息,我们还需要创建一个.env文件,并写入OpenWeather的API-KEY,用于进行天气查询。

创建完成后可以在本地文件夹中看到这两个python文件。

Step 4.测试MCP服务器功能

        当我们完成MCP服务器开发后,即可使用MCP-Inspector进行MCP工具功能测试。回到项目主目录下,然后输入如下命令:

Bash
# 回到项目主目录
# cd /root/autodl-tmp/MCP/LangGraph/mcp-get-weather

# 安装Node.js
# curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
# sudo apt install -y nodejs

npx -y @modelcontextprotocol/inspector

接下来,如果是使用AutoDL,则先需要使用隧道工具将端口映射到本地进行运行:

然后打开Inspector:http://127.0.0.1:6274/ ,并在页面中进行如下设置:

同时,需要输入Proxy Token,可以在启动环境中查看:

然后即可点击连接,显示Connected后则代表MCP工具服务已顺利启动。接下来即可进行功能测试了:

然后即可测试下一项工具write_server.py:

两项工具都通过了测试,

选择SSE模式,选择默认运行地址:http://localhost:8000/sse,然后点击connect:

然后输入地名进行测试:

完整测试流程如下:

同时我们也在本地文件夹中看到了output中新增的内容,表明第二个函数已经顺利将文本内容写入到了本地:

至此,两项MCP工具均测试完毕,接下来即可构建LangGraph MCP客户端,来接入这些工具搭建智能体了。

2. 创建LangGraph MCP客户端

        使用LangGraph接入MCP工具,核心需要使用langchain_mcp_adapters库,该库可以将MCP工具信息进行解析,并让LangGraph顺利识别。识别后即可像任意其他工具一样接入LangGraph中并搭建智能体。

LangGraph接入MCP的核心原理为: weather_server.py → 启动为子进程 → stdio 通信 → MCP 协议 → 转换为 LangChain 工具 → LangGraph Agent 执行读写,核心转换过程为::

  1. @mcp.tool() → 标准 LangChain Tool
  1. stdio_client() → 自动处理 read/write 流,其中read 表示从 MCP 服务器读取响应的流,write 表示向 MCP 服务器发送请求的流,对于 stdio weather_server.py,它们就是子进程的 stdoutstdin
  1. MultiServerMCPClient → 一键转换所有工具

Step 1. 创建MCP配置文件

        而为了完整实现一个标准的MCP调用流程、即通过配置文件灵活说明MCP工具信息然后再进行调用,这里我们同样先创建一个servers_config.json文件,用于记录MCP工具信息:

JSON
{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["weather_server.py"],
      "transport": "stdio"
    },
    "write": {
      "command": "python",
      "args": ["write_server.py"],
      "transport": "stdio"
    }
  }
}

Step 2. 修改.env配置文件和提示词模板

        同样的,我们需要创建一个.env文件来写入敏感信息:

Plaintext
BASE_URL=https://api.deepseek.com
MODEL=deepseek-chat
LLM_API_KEY=DeepSeek API KEY
OPENWEATHER_API_KEY=OpenWeather API KEY

然后为当前Agent创建一个提示词模板agent_prompts.txt

然后写入如下内容:

Plaintext
你是一个智能体,具备以下两种能力:

1.查询天气:调用query_weather(city: str),返回指定城市的实时天气。

2.写入文件:调用write_file(content: str),将文本内容写入本地文件并返回路径。

当用户提出请求时,你需要理解意图并选择相应的工具。如果请求缺少必要信息,先与用户确认后再调用工具。返回结果时以简洁、友好的方式回复。

如果用户提出的问题与你的功能无关,请礼貌告知无法处理。

Step 3. 创建client.py主函数文件

        然后再创建client主函数文件

并在其中写入如下代码:

Python
"""
多服务器 MCP + LangChain Agent 示例
---------------------------------
1. 读取 .env 中的 LLM_API_KEY / BASE_URL / MODEL
2. 读取 servers_config.json 中的 MCP 服务器信息
3. 启动 MCP 服务器(支持多个)
4. 将所有工具注入 LangGraph Agent,由大模型自动选择并调用
"""

import asyncio
import json
import logging
import os
from typing import Any, Dict, List

from dotenv import load_dotenv
from langgraph.prebuilt import create_react_agent
from langchain_deepseek import ChatDeepSeek
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.checkpoint.memory import InMemorySaver

# 设置记忆存储
checkpointer = InMemorySaver()

# 读取提示词
with open("agent_prompts.txt", "r", encoding="utf-8") as f:
    prompt = f.read()

# 设置对话配置
config = {
    "configurable": {
        "thread_id": "1" 
    }
}

# ────────────────────────────
# 环境配置
# ────────────────────────────

class Configuration:
    """读取 .env 与 servers_config.json"""

    def __init__(self) -> None:
        load_dotenv()
        self.api_key: str = os.getenv("LLM_API_KEY") or ""
        self.base_url: str | None = os.getenv("BASE_URL")  # DeepSeek 用 https://api.deepseek.com
        self.model: str = os.getenv("MODEL") or "deepseek-chat"
        if not self.api_key:
            raise ValueError("❌ 未找到 LLM_API_KEY,请在 .env 中配置")

    @staticmethod
    def load_servers(file_path: str = "servers_config.json") -> Dict[str, Any]:
        with open(file_path, "r", encoding="utf-8") as f:
            return json.load(f).get("mcpServers", {})

# ────────────────────────────
# 主逻辑
# ────────────────────────────
async def run_chat_loop() -> None:
    """启动 MCP-Agent 聊天循环"""
    cfg = Configuration()
    os.environ["DEEPSEEK_API_KEY"] = os.getenv("LLM_API_KEY", "")
    if cfg.base_url:
        os.environ["DEEPSEEK_API_BASE"] = cfg.base_url
    servers_cfg = Configuration.load_servers()

    # 1️ 连接多台 MCP 服务器
    mcp_client = MultiServerMCPClient(servers_cfg)

    tools = await mcp_client.get_tools()         # LangChain Tool 对象列表

    logging.info(f"✅ 已加载 {len(tools)} 个 MCP 工具: {[t.name for t in tools]}")

    # 2️ 初始化大模型(DeepSeek / OpenAI / 任意兼容 OpenAI 协议的模型)
    DeepSeek_API_KEY = os.getenv("DEEPSEEK_API_KEY")
    model = ChatDeepSeek(model="deepseek-chat")

    # 3 构造 LangGraph Agent
   
    agent = create_react_agent(model=model,
                               tools=tools,
                               prompt=prompt,
                               checkpointer=checkpointer)

    # 4 CLI 聊天
    print("\n🤖 MCP Agent 已启动,输入 'quit' 退出")
    while True:
        user_input = input("\n你: ").strip()
        if user_input.lower() == "quit":
            break
        try:
            result = await agent.ainvoke(
            {"messages": [{"role": "user", "content": user_input}]},
            config
        )
            print(f"\nAI: {result['messages'][-1].content}")
        except Exception as exc:
            print(f"\n⚠️  出错: {exc}")

    # 5️ 清理
    await mcp_client.cleanup()
    print("🧹 资源已清理,Bye!")

# ────────────────────────────
# 入口
# ────────────────────────────
if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
    asyncio.run(run_chat_loop())

代码解释如下:
✅ 从 .env 文件读取模型配置
✅ 从 servers_config.json 读取 MCP 服务器配置(支持多个服务器)
✅ 启动 MCP 客户端加载所有工具
✅ 用 LangGraph 创建 Agent,把所有工具挂载
✅ 在命令行与用户进行对话,模型自动选择工具
✅ 清理资源

1️⃣ 顶部模块导入

Python
import asyncio
import json
import logging
import os
from typing import Any, Dict, List

from dotenv import load_dotenv
from langgraph.prebuilt import create_react_agent
from langchain_deepseek import ChatDeepSeek
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.checkpoint.memory import InMemorySaver

🔹 解释

  • asyncio:异步执行工具
  • json:读取JSON配置
  • logging:日志输出
  • os:读取环境变量
  • load_dotenv:加载.env文件
  • create_react_agent:LangGraph的预置函数,创建ReAct式Agent
  • ChatDeepSeek:DeepSeek官方模型封装
  • MultiServerMCPClient:用于一次连接多个MCP服务器
  • InMemorySaver:LangGraph的内存记忆存储(会话状态保存)

2️⃣ 记忆存储和提示词加载

Python
checkpointer = InMemorySaver()

with open("agent_prompts.txt", "r", encoding="utf-8") as f:
    prompt = f.read()

🔹 解释

  • checkpointer: 用于保存在对话中的上下文记忆(例如工具调用历史)
  • prompt: 从 agent_prompts.txt 读取智能体提示词(系统角色)

3️⃣ 对话配置

Python
config = {
    "configurable": {
        "thread_id": "1" 
    }
}

🔹 解释

  • thread_id: 会话编号,如果要做多会话隔离时用
  • 这里硬编码为1,所以这个会话上下文ID固定

4️⃣ Configuration - 环境配置

Python
class Configuration:
    """
读取 .env 与 servers_config.json"""

    def __init__(self) -> None:
        load_dotenv()
        self.api_key: str = os.getenv("LLM_API_KEY") or ""
        self.base_url: str | None = os.getenv("BASE_URL")
        self.model: str = os.getenv("MODEL") or "deepseek-chat"
        if not self.api_key:
            raise ValueError("❌ 未找到 LLM_API_KEY,请在 .env 中配置")

    @staticmethod
    def load_servers(file_path: str = "servers_config.json") -> Dict[str, Any]:
        with open(file_path, "r", encoding="utf-8") as f:
            return json.load(f).get("mcpServers", {})

🔹 解释
这个类分两部分:

  1. 初始化方法
  • load_dotenv() 加载 .env 中的配置
  • LLM_API_KEY: 大模型的密钥
  • BASE_URL: API Base URL
  • MODEL: 模型名称
  • 没有密钥会直接报错
  1. 静态方法
  • load_servers():加载 servers_config.json 文件,返回 mcpServers 字典
  • 这个字典包含所有 MCP 服务器连接信息

✅ 这样就可以把配置集中管理

5️⃣ run_chat_loop() 主逻辑

这是整个程序的核心。

Python
async def run_chat_loop() -> None:

一个异步函数,用于:

  • 启动MCP客户端
  • 创建LangGraph Agent
  • 循环读取用户输入
  • 调用Agent
  • 返回结果

我们分步骤看。

5.1 配置读取与环境变量设置

Python
cfg = Configuration()
os.environ["DEEPSEEK_API_KEY"] = os.getenv("LLM_API_KEY", "")
if cfg.base_url:
    os.environ["DEEPSEEK_API_BASE"] = cfg.base_url
servers_cfg = Configuration.load_servers()

🔹 解释

  • cfg = Configuration(): 实例化配置
  • LLM_API_KEY 注入环境变量 DEEPSEEK_API_KEY(DeepSeek SDK会用)
  • 如果设置了 BASE_URL,也注入 DEEPSEEK_API_BASE
  • 加载所有MCP服务器配置

5.2 连接多台MCP服务器

Python
mcp_client = MultiServerMCPClient(servers_cfg)
tools = await mcp_client.get_tools()

🔹 解释

  • MultiServerMCPClient:自动连接多台MCP服务器
  • get_tools():从所有服务器加载工具(LangChain Tool对象)
  • 例如你的query_weatherwrite_file
  • 可以跨服务器统一管理

5.3 日志打印

Python
logging.info(f"✅ 已加载 {len(tools)} 个 MCP 工具: {[t.name for t in tools]}")

🔹 解释
显示一行日志,告诉你加载了多少工具以及它们的名字。

5.4 初始化大模型

Python
DeepSeek_API_KEY = os.getenv("DEEPSEEK_API_KEY")
model = ChatDeepSeek(model="deepseek-chat")

🔹 解释

  • ChatDeepSeek: 封装DeepSeek的聊天模型
  • model: 用于 LangGraph Agent 的核心 LLM

5.5 创建LangGraph Agent

Python
agent = create_react_agent(model=model,
                           tools=tools,
                           prompt=prompt,
                           checkpointer=checkpointer)

🔹 解释

  • create_react_agent: 快捷方法,创建ReAct推理式智能体
  • 参数:
  • model: 大模型
  • tools: 所有MCP工具
  • prompt: 系统提示词
  • checkpointer: 记忆存储器(保存上下文)

5.6 CLI 聊天循环

Python
print("\n🤖 MCP Agent 已启动,输入 'quit' 退出")
while True:
    user_input = input("\n你: ").strip()
    if user_input.lower() == "quit":
        break
    try:
        result = await agent.ainvoke(
            {"messages": [{"role": "user", "content": user_input}]},
            config
        )
        print(f"\nAI: {result['messages'][-1].content}")
    except Exception as exc:
        print(f"\n⚠️  出错: {exc}")

🔹 解释

  • input(): 读取用户输入
  • 如果输入quit就退出
  • 调用 agent.ainvoke()
  • 异步执行模型推理
  • 自动决定要不要调用工具
  • 打印最后一条模型回复
  • 出错时打印异常

5.7 清理资源

Python
await mcp_client.cleanup()
print("🧹
资源已清理,Bye!")

🔹 解释
关闭所有MCP连接,释放资源。

6️⃣ 入口逻辑

Python
if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
    asyncio.run(run_chat_loop())

🔹 解释

  • 配置日志格式
  • 启动事件循环执行 run_chat_loop()

🟢 功能总结:

多服务器支持:同时连接多台MCP服务器
动态工具加载:不需硬编码工具
DeepSeek模型支持:直接用LangChain的DeepSeek封装
记忆管理:用InMemorySaver保存对话状态
标准ReAct推理:大模型自主判断何时调用工具

Step 4. 运行测试

        最后,输入如下命令启动对话:

Bash
uv run client.py

        实际运行效果如下,能够发现,无论是多工具调用还是持久化记忆,都能顺利运行。

至此,我们就完整完成了完整的MCP工具接入LangGraph搭建智能体的完整流程。

3. 接入更多MCP工具

3.1 Filesystem MCP工具接入

        接下来借助我们创建好的MCP客户端,仅需填写MCP配置,即可非常便捷的接入更多MCP工具。这里以GitHub上的Filesystem MCP工具为例进行演示。Filesystem服务器是一个最基础同时也是最常用的MCP服务器,同时也是官方推荐的服务器,服务器项目地址:https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem

借助Filesystem,我们可以高效便捷操作本地文件夹。同时Filesystem也是一个js项目,源码托管在npm平台上:(https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem)

而我们仅需填写如下配置,即可使用Filesystem MCP:

Bash
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/path/to/other/allowed/dir"
      ]
    }
  }
}

例如我们在servers_config.json中写入MCP工具配置:

JSON
{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["weather_server.py"],
      "transport": "stdio"
    },
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/root/autodl-tmp/MCP/LangGraph/mcp-get-weather"
      ],
      "transport": "stdio"
    }
  } 
}

实际运行效果如下所示:

3.2 FireCrawl MCP工具接入

        FireCrawl是一款专为现代人工智能应用而设计的高性能网页抓取与结构化内容提取框架。它致力于通过自动化的方式,将互联网海量的非结构化网页数据转化为可被大模型理解、检索和推理的标准化知识。FireCrawl不仅支持对静态和动态网页进行深度爬取,还能够自动识别并提取页面中的正文、元数据、表格、代码片段以及多媒体内容,形成丰富的上下文语料。该工具在多语言环境下同样表现出色,可在全球范围内快速搭建定制化的知识抓取流程。通过与矢量数据库、检索增强生成(RAG)系统和MCP协议的无缝集成,FireCrawl为企业和研究机构提供了一种高效、可扩展的解决方案,使大型语言模型具备最新的实时知识获取与更新能力,显著提升其在问答、分析与内容生成等场景中的智能化水平。

  • FireCrawl官网地址:https://www.firecrawl.dev/
  • FireCrawl MCP官网地址 https://github.com/mendableai/firecrawl-mcp-server

紧接着改写配置文件内容如下:

JSON
{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["weather_server.py"],
      "transport": "stdio"
    },
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/root/autodl-tmp/MCP/LangGraph/mcp-get-weather"
      ],
        "transport": "stdio"
    },
    "mcp-server-firecrawl": {
      "command": "npx",
      "args": ["-y", "firecrawl-mcp"],
      "env": {
        "FIRECRAWL_API_KEY": "YOUR_API_KEY"
      },
        "transport": "stdio"
    }     
  } 
}

实际运行效果如下:

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐