# Agent 接入

Agent(智能体)是基于大模型构建的、能够完成特定任务的 AI 应用。与直接调用大模型不同,Agent 可以使用工具、访问知识库、执行多步推理,适合构建复杂的对话应用。

在小程序中通过 wx.cloud.extend.AI 调用云开发 Agent,实现智能对话。

# 初始化

wx.cloud.init({
  env: "<云开发环境ID>",
});

const ai = wx.cloud.extend.AI;

# 基本调用

使用 ai.bot.sendMessage() 与 Agent 进行对话:

const res = await ai.bot.sendMessage({
  data: {
    botId: "<你的 Agent ID>",
    threadId: "thread_" + Date.now().toString(),
    runId: "run_" + Date.now().toString(),
    messages: [
      {
        id: String(Date.now()),
        role: "user",
        content: "你好,请介绍一下你自己",
      },
    ],
    tools: [],
    context: [],
    state: {},
    forwardedProps: {},
  },
});

let response = "";
for await (const event of res.eventStream) {
  const data = JSON.parse(event.data);
  switch (data.type) {
    case "TEXT_MESSAGE_CONTENT":
      response += data.delta;
      break;
    case "RUN_FINISHED":
      console.log("对话结束");
      break;
    case "RUN_ERROR":
      console.error("运行出错:", data.message);
      break;
  }
}

console.log("完整回复:", response);

# 请求参数

参数 类型 必填 说明
botId string 是 Agent ID,在控制台创建 Agent 后获取
threadId string 是 会话 ID,同一个 threadId 属于同一个会话
runId string 是 本次运行 ID,每次调用使用不同的 runId
messages array 是 消息列表,包含用户发送的消息
tools array 否 自定义工具列表,默认为空数组
context array 否 上下文信息,默认为空数组
state object 否 自定义状态,默认为空对象
forwardedProps object 否 透传属性,默认为空对象

# messages 格式

{
  id: String(Date.now()),  // 消息唯一 ID
  role: "user",            // 消息角色:user
  content: "用户输入内容"   // 消息内容
}

# 响应事件类型

Agent 通过 SSE(Server-Sent Events)流式返回事件,主要事件类型:

事件类型 说明 关键字段
TEXT_MESSAGE_CONTENT 文本内容增量 delta — 文本片段
RUN_STARTED Agent 开始运行 —
RUN_FINISHED Agent 运行结束 —
RUN_ERROR 运行出错 message — 错误信息
TOOL_CALL_START 开始调用工具 toolCallId — 工具调用 ID;toolCallName — 工具名称
TOOL_CALL_ARGS 工具参数增量 toolCallId;delta — 参数 JSON 片段(同一 toolCallId 需按顺序拼接)
TOOL_CALL_END 工具调用结束 toolCallId — 工具调用 ID(注意:此事件不含执行结果)
TOOL_CALL_RESULT 工具执行结果 toolCallId;content — 工具返回结果

完整的事件类型定义参见 Agent HTTP 协议文档。

# 多轮对话

Agent 使用 threadId 来管理会话。同一个 threadId 下的对话共享上下文,实现多轮连续对话:

Page({
  data: {
    messages: [],
    threadId: "",
    isLoading: false,
  },

  onLoad() {
    // 创建一个新会话
    this.setData({ threadId: "thread_" + Date.now().toString() });
  },

  async sendMessage(userInput) {
    const { messages, threadId } = this.data;

    const userMsg = {
      id: String(Date.now()),
      role: "user",
      content: userInput,
    };

    this.setData({
      messages: [...messages, userMsg, { role: "assistant", content: "" }],
      isLoading: true,
    });

    try {
      const ai = wx.cloud.extend.AI;
      const res = await ai.bot.sendMessage({
        data: {
          botId: "<你的 Agent ID>",
          threadId: threadId, // 使用同一个 threadId 实现多轮对话
          runId: "run_" + Date.now().toString(), // 每次调用使用新的 runId
          messages: [userMsg], // 只传当前消息,历史由 Agent 服务端管理
          tools: [],
          context: [],
          state: {},
          forwardedProps: {},
        },
      });

      let assistantContent = "";
      for await (const event of res.eventStream) {
        const data = JSON.parse(event.data);
        if (data.type === "TEXT_MESSAGE_CONTENT") {
          assistantContent += data.delta;
          const updatedMessages = [...messages, userMsg, { role: "assistant", content: assistantContent }];
          this.setData({ messages: updatedMessages });
        }
      }
    } catch (error) {
      console.error("调用失败:", error);
    } finally {
      this.setData({ isLoading: false });
    }
  },

  // 新建会话
  newConversation() {
    this.setData({
      messages: [],
      threadId: "thread_" + Date.now().toString(),
    });
  },
});

与大模型多轮对话的区别: 大模型需要在每次请求中传入完整的历史消息,而 Agent 的历史消息由服务端管理,客户端每次只需传入当前消息,通过 threadId 关联同一会话。

# 错误处理

const res = await ai.bot.sendMessage({ data: { /* ... */ } });

for await (const event of res.eventStream) {
  const data = JSON.parse(event.data);

  switch (data.type) {
    case "TEXT_MESSAGE_CONTENT":
      // 正常文本内容
      break;

    case "RUN_ERROR":
      // 运行出错,展示错误信息
      console.error("Agent 运行出错:", data.message);
      wx.showToast({ title: "请求出错", icon: "error" });
      break;

    case "RUN_FINISHED":
      // 运行结束
      break;
  }
}

# 获取 Agent ID

在 云开发控制台 → AI → Agent 中创建 Agent 后,可以获取对应的 Agent ID:

# Agent 与大模型的对比

特性 大模型(createModel) Agent(bot.sendMessage)
适用场景 简单问答、文本生成 复杂对话、任务执行
会话管理 客户端维护 messages 历史 服务端通过 threadId 管理
工具调用 不支持 支持(联网搜索、知识库等)
自定义能力 通过 system prompt 设定 在控制台配置指令、工具、知识库
返回方式 文本流 SSE 事件流(含工具调用事件)
点击咨询小助手