OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  botpress-adk:使用Botpress ADK构建AI机器人的指南

botpress-adk:使用Botpress ADK构建AI机器人的指南

 
  cyclone ·  2026-02-01 22:52:44 · 20 次点击  · 0 条评论  

名称: adk
描述: 使用 Botpress 智能体开发套件 (ADK) 构建 AI 机器人的指南
版本: 1.0.0
作者: yueranlu
标签: [botpress, adk, chatbot, ai, typescript]
主页: https://github.com/botpress/adk


Botpress ADK 开发指南

使用 Botpress 智能体开发套件 (ADK) 构建 AI 机器人的综合指南。

何时使用

  • 用户要求构建 Botpress 机器人或聊天机器人
  • 用户提到 ADK、智能体开发套件或 Botpress
  • 用户想要创建动作、工具、工作流、对话、表、触发器或知识库
  • 用户需要 adk CLI 命令的帮助(init、dev、deploy、link)
  • 用户遇到 ADK 相关错误或需要故障排除
  • 用户询问机器人配置、状态管理或集成

快速参考

ADK 是一个基于约定的 TypeScript 框架,其中文件结构直接映射到机器人行为

你的角色: 引导用户完成整个机器人开发生命周期——从项目设置到部署。使用本技能中的模式和代码示例来编写正确、可运行的 ADK 代码。

核心原则: 在 ADK 中,文件放置的位置至关重要。每种组件类型都有特定的 src/ 子目录,文件根据位置自动被发现。

如何使用本技能

本技能是你构建 Botpress 机器人的主要参考。 当用户要求你使用 ADK 构建某些功能时:

  1. 确定他们需要什么 - 是新机器人、一个功能(动作、工具、工作流)、数据存储(表)还是事件处理(触发器)?
  2. 检查正确的目录 - 每种组件类型都放在特定的 src/ 子目录中
  3. 使用下面的模式 - 严格按照代码示例操作,它们代表了正确的 ADK 约定
  4. 运行 adk --help - 对于此处未涵盖的 CLI 命令,或运行 adk <command> --help 获取特定帮助

决策指南 - 创建什么组件:

用户想要... 创建此组件 位置
处理用户消息 对话 src/conversations/
添加 AI 可以调用的函数 工具 src/tools/
添加可复用的业务逻辑 动作 src/actions/
运行后台/计划任务 工作流 src/workflows/
存储结构化数据 src/tables/
响应事件(用户创建等) 触发器 src/triggers/
让 AI 访问文档/数据 知识库 src/knowledge/
连接外部服务(Slack 等) 集成 adk add <name>

如果本技能中的信息不够,请获取相应的 GitHub 参考文件(每节都提供了链接)以获取更详细的规范。

重要提示:ADK 是 AI 原生的

ADK 使用传统的聊天机器人模式。不要创建意图、实体或对话流。

替代方案:
- 定义意图 (greet, orderPizza, checkStatus)
- 训练实体提取 (@pizzaSize, @toppings)
- 手动路由到意图处理器

ADK 使用:
- execute() - AI 根据指令自然理解用户意图
- 工具 - AI 自主决定何时调用你的函数
- zai.extract() - 基于模式的结构化数据提取
- 知识库 - 基于你的文档进行 RAG 以生成有根据的响应

文档: https://www.botpress.com/docs/adk/
GitHub: https://github.com/botpress/skills/tree/master/skills/adk


先决条件与安装

在使用 ADK 之前,请确保用户已具备:

  • Botpress 账户 - 在 https://app.botpress.cloud 创建
  • Node.js v22.0.0+ - 使用 node --version 检查
  • 包管理器 - bun(推荐)、pnpm、yarn 或 npm

安装 ADK CLI:

macOS & Linux:

curl -fsSL https://github.com/botpress/adk/releases/latest/download/install.sh | bash

Windows (PowerShell):

powershell -c "irm https://github.com/botpress/adk/releases/latest/download/install.ps1 | iex"

验证安装:

adk --version

如果安装失败,请检查 https://github.com/botpress/adk/releases 以获取手动下载选项。

文档: https://www.botpress.com/docs/adk/quickstart
GitHub: https://raw.githubusercontent.com/botpress/skills/master/skills/adk/references/cli.md


快速开始

安装 ADK CLI 后,创建一个新机器人:

adk init my-bot         # 创建项目(为初学者选择 "Hello World" 模板)
cd my-bot
npm install             # 或使用 bun/pnpm/yarn
adk login               # 使用 Botpress Cloud 进行身份验证
adk add chat            # 添加聊天集成以进行测试
adk dev                 # 启动开发服务器(支持热重载)
adk chat                # 在 CLI 中测试(在单独的终端中运行)
adk deploy              # 准备就绪后部署到生产环境

http://localhost:3001/ 处的可视化控制台允许你配置集成和测试机器人。

文档: https://www.botpress.com/docs/adk/quickstart
GitHub: https://raw.githubusercontent.com/botpress/skills/master/skills/adk/references/cli.md


链接和部署你的机器人

重要提示: 你的机器人必须链接到 Botpress Cloud 并部署才能正常工作。ADK 在开发期间本地运行,但机器人本身存在于 Botpress Cloud 中。

正确的顺序:链接 → 开发 → 部署

按照此顺序使你的机器人正常工作:

# 1. 链接 - 将你的项目连接到 Botpress Cloud(创建 agent.json)
adk link

# 2. 开发 - 启动开发服务器(热重载、测试)
adk dev

# 3. 部署 - 准备就绪后推送到生产环境
adk deploy

分步说明:

  1. adk link - 将你的本地项目链接到 Botpress Cloud 中的一个机器人。这会创建包含你的工作区和机器人 ID 的 agent.json。在任何其他操作之前首先运行此命令。

  2. adk dev - 启动本地开发服务器并启用热重载。在 http://localhost:3001 打开开发控制台,你可以在其中配置集成和测试机器人。在单独的终端中使用 adk chat 进行测试。

  3. adk deploy - 将你的机器人部署到生产环境。当你准备好让机器人通过生产渠道(Slack、WhatsApp、网页聊天等)实时访问时运行此命令。

故障排除错误

如果在运行 adk devadk deploy 时遇到错误:

  1. 检查日志 - 查看终端输出或 http://localhost:3001 开发控制台中的日志面板
  2. 复制错误信息 - 从日志中选择并复制完整的错误信息
  3. 寻求帮助 - 将错误粘贴回 AI 助手并请求帮助修复问题

常见错误场景:
- 集成配置错误: 通常意味着需要在 localhost:3001 的 UI 中配置集成
- 类型错误: 通常由不正确的导入或模式不匹配引起
- 部署失败: 可能表示缺少环境变量或配置无效

修复错误的示例工作流:

1. 运行 `adk dev` 或 `adk deploy`
2. 在终端/日志中看到错误
3. 复制错误信息
4. 告诉 AI:"我在运行 adk dev 时遇到此错误:[粘贴错误]"
5. AI 将帮助诊断并修复问题

文档: https://www.botpress.com/docs/adk/quickstart
GitHub: https://raw.githubusercontent.com/botpress/skills/master/skills/adk/references/cli.md


项目结构

关键规则: 文件位置决定行为。将组件放在正确的 src/ 子目录中,否则它们将不会被发现。

my-bot/
├── agent.config.ts    # 机器人配置:名称、模型、状态模式、集成
├── agent.json         # 工作区/机器人 ID(由 adk link/dev 自动生成,添加到 .gitignore)
├── package.json       # Node.js 依赖项和脚本(dev、build、deploy)
├── tsconfig.json      # TypeScript 配置
├── .env               # API 密钥和密钥(切勿提交!)
├── .gitignore         # 应包含:agent.json、.env、node_modules/、.botpress/
├── src/
│   ├── conversations/ # 处理传入消息 → 使用 execute() 获取 AI 响应
│   ├── workflows/     # 后台进程 → 使用 step() 进行可恢复的操作
│   ├── actions/       # 可复用函数 → 从任何地方使用 actions.name() 调用
│   ├── tools/         # AI 可调用函数 → AI 决定何时调用这些函数
│   ├── tables/        # 数据存储 → 自动同步到云端,支持语义搜索
│   ├── triggers/      # 事件处理器 → 响应 user.created、集成事件等
│   └── knowledge/     # RAG 源 → 为 AI 上下文索引文档、网站或表
└── .botpress/         # 自动生成的类型(切勿手动编辑)

关键配置文件:

  • agent.config.ts - 定义机器人元数据、AI 模型、状态模式和集成的主要配置(你编辑此文件)
  • agent.json - 将智能体链接到工作区/机器人 ID。由 adk linkadk dev 自动生成。添加到 .gitignore - 包含每个开发人员不同的环境特定 ID
  • package.json - Node.js 配置,包含 @botpress/runtime 依赖项和 devbuilddeploy 脚本
  • tsconfig.json - 项目的 TypeScript 配置
  • .env - API 密钥和密钥的环境变量(切勿提交!)
  • .gitignore - 应包含:agent.json.envnode_modules/.botpress/

文档: https://www.botpress.com/docs/adk/project-structure
GitHub: https://raw.githubusercontent.com/botpress/skills/master/skills/adk/references/agent-config.md


智能体配置

agent.config.ts 文件定义你的机器人身份、AI 模型、状态模式和集成。设置新机器人时始终从这里开始。

import { defineConfig, z } from "@botpress/runtime";

export default defineConfig({
  name: "my-support-bot",
  description: "AI 客户支持助手",

  // 用于不同操作的 AI 模型
  defaultModels: {
    autonomous: "openai:gpt-4o",      // 由 execute() 用于对话
    zai: "openai:gpt-4o-mini"         // 用于 zai 操作(更便宜、更快)
  },

  // 全局机器人状态 - 在所有对话和用户之间共享
  bot: {
    state: z.object({
      maintenanceMode: z.boolean().default(false),
      totalConversations: z.number().default(0)
    })
  },

  // 每个用户的状态 - 为每个用户在所有对话中持久化
  user: {
    state: z.object({
      name: z.string().optional(),
      tier: z.enum(["free", "pro"]).default("free"),
      preferredLanguage: z.enum(["en", "es", "fr"]).default("en")
    }),
    tags: {
      source: z.string(),
      region: z.string().optional()
    }
  },

  // 每个对话的状态
  conversation: {
    state: z.object({
      context: z.string().optional()
    }),
    tags: {
      category: z.enum(["support", "sales", "general"]),
      priority: z.enum(["low", "medium", "high"]).optional()
    }
  },

  // 你的机器人使用的集成(ADK 1.9+ 格式)
  dependencies: {
    integrations: {
      chat: { version: "chat@0.7.3", enabled: true },
      slack: { version: "slack@2.5.5", enabled: true }
    }
  }
});

可用模型:
- OpenAI:openai:gpt-4oopenai:gpt-4o-miniopenai:gpt-4-turbo
- Anthropic:anthropic:claude-3-5-sonnetanthropic:claude-3-opus
- Google:google:gemini-1.5-progoogle:gemini-1.5-flash

文档: https://www.botpress.com/docs/adk/project-structure
GitHub: https://raw.githubusercontent.com/botpress/skills/master/skills/adk/references/agent-config.md


核心概念

1. 动作 - 可复用的业务逻辑

何时创建动作:
- 你需要从多个地方(工作流、对话、触发器)调用的可复用逻辑
- 你正在包装外部 API 或数据库操作
- 你想要可测试、可组合的业务逻辑
- 你需要使用自定义逻辑调用集成 API(Slack、Linear 等)

何时不使用动作(改用工具):
- 你希望 AI 自主决定何时调用它
- 该函数应在 execute() 期间可用

动作不能直接被 AI 调用 - 如果 AI 需要使用它们,请使用 .asTool() 将它们转换为工具。

位置: src/actions/*.ts

import { Action, z } from "@botpress/runtime";

export const fetchUser = new Action({
  name: "fetchUser",
  description: "从数据库检索用户详细信息",

  // 使用 Zod 模式定义输入/输出以确保类型安全
  input: z.object({ userId: z.string() }),
  output: z.object({ name: z.string(), email: z.string() }),

  // 重要:处理器接收 { input, client } - 必须在处理器内部解构 input
  async handler({ input, client }) {
    const { user } = await client.getUser({ id: input.userId });
    return { name: user.name, email: user.tags.email };
  }
});

调用动作:

import { actions } from "@botpress/runtime";
const userData = await actions.fetchUser({ userId: "123" });

// 要使动作可被 AI 调用,将其转换为工具:
tools: [actions.fetchUser.asTool()]

关键规则:
- 处理器接收 { input, client } - 必须在处理器内部解构 input
- 不能在参数中直接解构输入字段
- 可以调用其他动作、集成动作、访问状态
- 可以使用 .asTool() 转换为工具

文档: https://www.botpress.com/docs/adk/concepts/actions
GitHub: https://raw.githubusercontent.com/botpress/skills/master/skills/adk/references/actions.md


2. 工具 - AI 可调用函数

何时创建工具:
- 你希望 AI 自主决定何时使用此函数
- 该函数检索 AI 需要的信息(搜索、查找、获取)
- 该函数代表用户执行操作(创建工单、发送消息)
- 你正在构建 AI 在对话期间应具备的能力

AI 根据以下因素决定何时使用工具:
1. 工具的 description - 使其清晰具体地说明何时使用它
2. 输入模式的 .describe() 字段 - 帮助 AI 理解参数含义
3. 对话上下文和用户意图

与动作的关键区别: 工具可以直接解构输入;动作不能。

位置: src/tools/*.ts

import { Autonomous, z } from "@botpress/runtime";

export const searchProducts = new Autonomous.Tool({
  name: "searchProducts",
  // 此描述至关重要 - 它告诉 AI 何时使用此工具
  description: "搜索产品目录。当用户询问产品、可用性、定价或想要浏览商品时使用。",

  input: z.object({
    query: z.string().describe("搜索关键词"),
    category: z.string().optional().describe("按类别筛选")
  }),
  output: z.object({
    products: z.array(z.object({ id: z.string(), name: z.string(), price: z.number() }))
  }),

  // 与动作不同,工具可以在处理器中直接解构输入
  handler: async ({ query, category }) => {
    // 你的搜索逻辑在这里
    return { products: [] };
  }
});

使用 ThinkSignal: 当工具无法完成但你想给 AI 提供上下文时:

import { Autonomous } from "@botpress/runtime";

// 在处理器内部 - AI 将看到此消息并可以适当响应
throw new Autonomous.ThinkSignal(
  "未找到结果",
  "未找到匹配该查询的产品。请用户尝试不同的搜索词。"
);

高级工具属性:
``typescript export const myTool = new Autonomous.Tool({ name: "myTool", description: "工具描述", input: z.object({...}), output: z.object({...}), aliases: ["searchDocs", "findDocs"], // 替代名称 handler: async (input, ctx) => { console.log(调用 ID: ${ctx.callId}`); // 唯一的调用标识符
// ...

20 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私 ·  条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 17 ms
Developed with Cursor