@bpinternal/integration-hub

中文文档
0.27.0发布于 2026/09/25AGPL-3.0TypeScriptES Module近 30 天下载 1.2万

Botpress 风格集成目录的可再用集成枢纽

中文使用文档
文档目录23 节
  1. 使用此软件包的两种方式
  2. 仅UI( @bpinternal/integration-hub (中文(简体) )
  3. UI + Botpress 运行时间( @bpinternal/integration-hub/runtime (中文…
  4. 快开始
  5. 安装
  6. 备选办法A:投放屏幕(快速)
  7. 选项B:虎克+UI组件(更多控制)
  8. 选项 C: 只绘制地图( 绘制您自己的数据层)
  9. 选项 D: 只使用 UI( 无 Botpress 客户端)
  10. API 参考
  11. useIntegrationHub(options)
  12. useIntegrationDetails(options)
  13. BotpressIntegrationHub (由屏幕组成)
  14. 映射函数
  15. 此软件包不包括什么
  16. 自定义默认值
  17. UI 组件
  18. 结构要求
  19. 1. 进口包CSS
  20. 2. CSS自定义属性
  21. 3. 集装箱查询
  22. 构建
  23. 发布

@bpinternal/integration-hub

反应 UI 组件和可选的 Botpress 运行时钩用于构建集成枢纽体验.

使用此软件包的两种方式

仅UI(@bpinternal/integration-hub(中文(简体) )

您提供自己的数据并给自己的API打电话。 软件包会给你布局组件,卡片,网格,过滤器,以及设置向导外壳. 当您有非Botpress后端或想要完全控制数据获取时使用此功能 .

所需对等方 : react, (中文(简体) ), react-dom, (中文(简体) ), framer-motion, (中文(简体) ), @base-ui/react, (中文(简体) ), clsx, (中文(简体) ), tailwind-merge, (中文(简体) ), lucide-react

UI + Botpress 运行时间(@bpinternal/integration-hub/runtime(中文(简体) )

你通过一个 @botpress/client 实例和软件包处理获取集成,将数据映射到UI类型,以及执行安装/uninstall/enable/disable 突变。 当您的应用程序已经和 Botpress API 说话时使用此选项 .

其它同伴 : @botpress/client, (中文(简体) ), @tanstack/react-query

@botpress/client 财务报告和审定财务报表 @tanstack/react-query 标记为可选的同伴依赖关系。 只有在从 ./runtime. 仅使用UI的消费者不需要安装.


快开始

安装

pnpm add @bpinternal/integration-hub react react-dom framer-motion @base-ui/react clsx tailwind-merge lucide-react

如果使用 Botpress 运行时间 :

pnpm add @botpress/client @tanstack/react-query

@bpinternal/integration-hub/runtime 包括内置配置窗体渲染器,由 @bpinternal/static-zui-form。 。 。 .

如果您的应用程序尚未提供 Radix 风格的设计标志, 请导入软件包倒置主题 :

import '@bpinternal/integration-hub/theme.css'

备选办法A:投放屏幕(快速)

一个处理一切的单一组件——取来,绘图,目录,细节视图,突变.

import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { BotpressIntegrationHub } from '@bpinternal/integration-hub/runtime'

const queryClient = new QueryClient()

export const IntegrationsPage = ({ client, workspaceId, botId }) => (
  <QueryClientProvider client={queryClient}>
    <BotpressIntegrationHub
      client={client}
      workspaceId={workspaceId}
      botId={botId}
      onInstall={(integration) => toast.success(`${integration.title} installed`)}
      onUninstall={(integration) => toast.success(`${integration.title} removed`)}
      onError={(error) => toast.error(error.message)}
    />
  </QueryClientProvider>
)

默认, BotpressIntegrationHub 使用 Static ZUI Form 创建集成配置字段。 过 renderConfigurationForm 只有您想要推翻此默认行为时.

选项B:虎克+UI组件(更多控制)

使用钩子进行数据/mutes,但用包的UI组件来构成自己的布局.

import { useIntegrationHub, useIntegrationDetails } from '@bpinternal/integration-hub/runtime'
import {
  IntegrationHubBody,
  IntegrationGridCard,
  IntegrationInstalledList,
  IntegrationDetailsLayout,
  IntegrationCapabilitiesCards
} from '@bpinternal/integration-hub'

export const IntegrationsPage = ({ client, workspaceId, botId }) => {
  const [selectedId, setSelectedId] = useState(null)
  const [search, setSearch] = useState('')

  const hub = useIntegrationHub({ client, workspaceId, botId })
  const details = useIntegrationDetails({ client, workspaceId, botId, integrationId: selectedId })

  return (
    <IntegrationHubBody
      view="hub"
      searchInput={search}
      onSearchInputChange={setSearch}
      hubIntegrations={hub.integrations}
      sidebarIntegrations={hub.integrations}
      installedIntegrations={hub.installedIntegrations}
      isHubLoading={hub.isLoading}
      renderIntegrationCard={(integration) => (
        <IntegrationGridCard
          name={integration.title ?? integration.name}
          iconUrl={integration.iconUrl}
          installed={integration.installed}
          onClick={() => setSelectedId(integration.id)}
        />
      )}
      renderInstalledIntegrations={({ integrations, searchTerm, categoryOrder }) => (
        <IntegrationInstalledList
          integrations={integrations}
          searchTerm={searchTerm}
          categoryOrder={categoryOrder}
          onSelectIntegration={(i) => setSelectedId(i.id)}
        />
      )}
      renderIntegrationDetails={() => (
        <IntegrationDetailsLayout
          title={details.definition?.title ?? ''}
          iconUrl={details.definition?.iconUrl}
          onBack={() => setSelectedId(null)}
          onInstall={() => hub.install(selectedId)}
          isInstalled={Boolean(details.installedState)}
          isInstalling={hub.isInstalling}
        >
          <IntegrationCapabilitiesCards
            actionCards={details.capabilities.actionCards}
            eventCards={details.capabilities.eventCards}
          />
        </IntegrationDetailsLayout>
      )}
    />
  )
}

选项 C: 只绘制地图( 绘制您自己的数据层)

转换纯函数 @botpress/client 类型。 无有回向无有钩. 如果您已经拥有自己的反应查询设置, 并且只是想停止复制映射逻辑, 请使用这些 .

import {
  toHubItem,
  toCapabilityCards,
  toConnectionMethods,
  getInstalledIntegrations,
  filterAndSortIntegrations
} from '@bpinternal/integration-hub/runtime'

// In your own React Query hook:
const integrations = await client.listPublicIntegrations({ version: 'latest' })
const bot = await client.getBot({ id: botId })

const installed = getInstalledIntegrations(bot.integrations)
const installedByName = new Map(installed.map((i) => [i.name, i]))

const hubItems = integrations.map((summary) => toHubItem({ summary, installedByName }))
const filtered = filterAndSortIntegrations({ integrations: hubItems, searchTerm: 'slack' })

选项 D: 只使用 UI( 无 Botpress 客户端)

使用带有任何数据源的组件 。 你处理所有采集和传递数据作为道具.

import { IntegrationHubBody, IntegrationGridCard } from '@bpinternal/integration-hub'

const myIntegrations = [
  { id: '1', name: 'slack', title: 'Slack', description: 'Chat with Slack', iconUrl: '...' }
]

export const MyHub = () => (
  <IntegrationHubBody
    view="hub"
    searchInput={search}
    onSearchInputChange={setSearch}
    hubIntegrations={myIntegrations}
    sidebarIntegrations={myIntegrations}
    installedIntegrations={[]}
    renderIntegrationCard={(integration) => (
      <IntegrationGridCard name={integration.title} iconUrl={integration.iconUrl} />
    )}
    renderInstalledIntegrations={() => <div>No installed integrations</div>}
    renderIntegrationDetails={(id) => <div>Details for {id}</div>}
  />
)

API 参考

useIntegrationHub(options)

Hook能获取集成目录和bot状态,并提供突变功能.

选项 :

参数类型说明
clientClient一个配置 @botpress/client 实例
workspaceIdstring工作空间标识
botIdstring瓶口标识
categoryResolver?(integration) => string | null覆盖默认类别映射
enabled?boolean禁用获取( 默认) true(中文(简体) )

回返情况:

外地类型说明
integrationsBotpressIntegrationHubItem[]所有公共+私人融入 installed编号 :enabled编号 :hasUpdate 计算
installedIntegrationsBotpressIntegrationHubItem[]只安装在机器人上的集成
isLoadingboolean初始负载正在进行中
errorError | null获取错误
install(id)(id: string) => Promise<void>在机器人上安装集成
uninstall(id)(id: string) => Promise<void>从机器人中删除集成
enable(id)(id: string) => Promise<void>启用已安装的集成
disable(id)(id: string) => Promise<void>禁用已安装的集成
upgrade(id)(id: string) => Promise<void>将集成升级到最新版本
refresh()() => void重新调试所有数据
isInstallingboolean正在安装突变
isUninstallingboolean未安装正在变换
isEnablingboolean启用在进行中的突变
isDisablingboolean禁用进行中的突变
isUpgradingboolean正在升级突变

useIntegrationDetails(options)

获取单一集成的完整定义的钩子 被安装的状态 和能力.

选项 :

参数类型说明
clientClient一个配置 @botpress/client 实例
workspaceIdstring工作空间标识
botIdstring瓶口标识
integrationIdstring | null集成到负载( null = 已禁用)
enabled?boolean禁用获取( 默认) true(中文(简体) )

回返情况:

外地类型说明
definitionIntegration | null完全整合定义(动作、事件、频道、配置方案)
installedStateBotpressInstalledIntegration | nullBot 已安装状态( 启用、 配置、 WebhookUrl) 或未安装的无效状态
capabilities.actionCardsIntegrationCapabilityCardItem[]动作卡准备就绪 IntegrationCapabilitiesCards
capabilities.eventCardsIntegrationCapabilityCardItem[]事件卡
capabilities.channelCardsIntegrationCapabilityCardItem[]频道卡
connectionMethodsIntegrationConnectionMethodOption[]可用的连接方法( OAuth, 命名为配置, 沙盒)
selectedConnectionMethodstring | null当前活动连接方法
isLoadingboolean获取中
errorError | null获取错误
saveConfig(config)(config: Record<string, unknown>) => Promise<void>保存集成配置
toggleEnabled()() => Promise<void>切换启用/ 损坏状态
setConnectionMethod(method)(method: string | null) => Promise<void>切换连接方法
refresh()() => void重选细节
isSavingConfigboolean配置保存中
isTogglingEnabledboolean切换正在进行中的突变
isSettingConnectionMethodboolean连接方法正在变换中

BotpressIntegrationHub (由屏幕组成)

接线的滴入组件 useIntegrationHub + 键 useIntegrationDetails +所有UI组件. 内部管理视图/搜索/选择/tab状态.

所需的道具 : client, (中文(简体) ), workspaceId, (中文(简体) ), botId

可选覆盖 :

Prop类型说明
initialView'hub' | 'installed'开始视图( 默认) 'hub'(中文(简体) )
categoriesIntegrationHubCategory[]覆盖默认类别
bannerSlidesIntegrationHubBannerSlide[]覆盖宣传横幅内容
bannerIconUrlstring屏蔽图像 URL
filterMenuLabelsPartial<IntegrationHubFilterMenuLabels>覆盖过滤器菜单文本
categoryResolver(integration) => string | null自定义类别映射
disableInstallationboolean隐藏安装按钮
hasWriteAccessboolean错误时禁用突变按钮
noResultsDocumentationLink{ href, label? }在空搜索结果中显示的链接
oauthTemplateDataRecord<string, unknown>额外有效载荷合并为 client.runVrl 当生成 OAuth 授权 URL 时。 若为 env ,运行时间推断 production 页:1 *.cloud API URLs 和 (简体中文) preview 否则.

渲染槽( 对于软件包不能拥有的东西):

槽接受的道具目的
renderConfigurationForm{ definition, installedState, selectedConnectionMethod, onSave, isSaving }覆盖默认的 Static ZUI 配置格式渲染器 .
renderConnectionsContent{ definition, installedState, connectionMethods, selectedConnectionMethod, onConnectionMethodChange }覆盖默认运行时间连接 UI(OAuth/手动流量).
renderDetailPanel{ definition, selectedCard, onClose }选择能力卡时将侧面板渲染(例如:schema取景器).

回调 :

回电类型当它起火时
onInstall(integration) => void成功安装后
onUninstall(integration) => void成功卸载后
onEnable(integration) => void成功启用后
onDisable(integration) => void成功禁用后
onUpgrade(integration) => void成功升级后
onError(error: Error) => void任何突变错误

映射函数

纯函数( 无反应) 导出自 @bpinternal/integration-hub/runtime数字 :

函数说明
toHubItem({ summary, installedByName, categoryResolver? })转换 a @botpress/client 集成摘要 + 机器人状态 IntegrationHubItem
toInstalledItem({ installedIntegration, summary?, categoryResolver? })将机器人安装的集成项转换为 IntegrationHubItem
toCapabilityCards(definition)从完全整合定义中提取动作、事件和频道到卡数组
toConnectionMethods(definition)从定义中提取可用的连接方法( OAuth, 命名为配置, 沙盒)
getInstalledIntegrations(botIntegrations)转换原始 bot.integrations 映射到已输入数组
findInstalledIntegration({ installedIntegrations, integrationId, integrationName? })以 ID 或名称查找特定的安装集成
filterAndSortIntegrations({ integrations, searchTerm, visibility?, verification?, sortMethod? })通过搜索、能见度、校验状态和排序方法过滤和排序中枢项目
resolveCategory(integration, categoryResolver?)用可选的自定义解析器解析整合的类别
isOfficialWorkspace(handle)检查工作空间控件是否为正式的 Botpress 工作空间
dedupeById(items)通过 ID 删除重复的项目

此软件包不包括什么

这些是消费者的责任:

东西为什么怎么办
授权/ 会话每个应用程序处理权限不同创建自己的 @botpress/client 拿着你的证物 把它传给钩子
自定义 OAuth UX软件包包括默认的 OAuth 流量, 但针对应用程序的重定向和 UX 可更改使用 oauthTemplateData 或覆盖到 renderConnectionsContent 编号 : IntegrationOAuthButton
自定义配置形式行为包装了静态ZUI默认渲染器,但应用软件可能需要自定义控制/验证/UX提供 renderConfigurationForm 仅在超过默认时
运行/ URL 同步过于特定框架( React Router, TanStack 路由器, Next.js)管理 selectedIntegrationId 财务报告和审定财务报表 view 声明自己和地图到您的路由器
托拉斯通知每个应用程序都有自己的土司系统使用 onInstall, (中文(简体) ), onUninstall, (中文(简体) ), onError 呼唤回起你的祝酒词
分析/跟踪App 特定遥测使用突变回调( U)onInstall, (中文(简体) ), onUninstall, (中文(简体) ), onEnable, (中文(简体) ), onDisable, (中文(简体) ), onUpgrade)和您自己的UI级跟踪钩
地物标志苹果专用的标语过 disableInstallation 或者说 hasWriteAccess 布尔

自定义默认值

包船具有通用默认. 为你的产品代替它们:

  • bannerSlides ——宣传横幅内容(通过自己的幻灯片或需要隐藏的空数组)
  • categories ——有图标的集成类(默认为13个常见类)
  • filterMenuLabels ——以默认值来深处来更改标签,例如: { verification: { official: 'Made by Botpress' } }
  • noResultsDocumentationLink ——搜索无结果时显示链接
  • formatGithubLabel 打开 IntegrationSetupMetadataBar ——自定义 GitHub URL 显示格式
  • categoryResolver ——功能以凌驾如何将整合分配给类别

UI 组件

全部从 @bpinternal/integration-hub数字 :

构成部分目的
IntegrationHubBody完整中枢页面:分类侧栏,搜索,横幅自旋,应答卡网格,已安装列表,细节平板路由
IntegrationHubFilterMenu带有活性滤波药片的下拉式滤波器菜单( 可见性、 校验、 排序)
IntegrationGridCard有图标、名称、描述、作者、徽章的整合卡
IntegrationInstalledList已排序/过滤的已安装集成状态列表
IntegrationDetailsLayout详细页外壳: 后键、 标题、 安装/ Uninstall/ Enable/ Disable/ Update 按钮、 侧面板槽
IntegrationSetupWizardLayout设置向导:“设置模式”编号步骤和“配置模式”标签
IntegrationSetupMetadataBar版本, GitHub 链接, 关于按钮行
IntegrationConnectionMethodSelector下放取连接方法( OAuth, 命名为配置, 沙盒)
IntegrationWebhookUrlField只读有复制按钮和工具提示的 Webhook URL
IntegrationConfigurationSection配置有标题、 Webhook 字段、 被屏蔽状态和子槽的包装
IntegrationCapabilitiesCards有选择状态的动作/事件/频道能力卡网格

结构要求

1. 进口包CSS

包船预编成组件样式 theme.css。在应用程序入口处导入一次:

import '@bpinternal/integration-hub/theme.css'

您无需添加 @bpinternal/integration-hub 改为运行时样式的 Tailwind 内容. 软件包源的尾风扫描只有在针对未发布的本地源开发时才有用.

2. CSS自定义属性

组件使用Radix风格的颜色符号. 任意使用 @radix-ui/themes 或定义这些变量:

:root {
  --gray-1: #ffffff;
  --gray-2: #f8f9fa;
  --gray-3: #f1f3f5;
  --gray-5: #e1e5ea;
  --gray-6: #d0d7de;
  --gray-7: #bfc8d3;
  --gray-8: #9aa4b2;
  --gray-9: #7a8594;
  --gray-10: #6b7280;
  --gray-11: #4b5563;
  --gray-12: #111827;

  --gray-a2: rgba(17, 24, 39, 0.04);
  --gray-a3: rgba(17, 24, 39, 0.07);
  --gray-a4: rgba(17, 24, 39, 0.1);
  --gray-a5: rgba(17, 24, 39, 0.14);
  --gray-a6: rgba(17, 24, 39, 0.2);
  --gray-a8: rgba(17, 24, 39, 0.4);

  --blue-a2: rgba(37, 99, 235, 0.12);
  --blue-8: #3b82f6;
  --blue-11: #1d4ed8;

  --grass-3: #ecfdf3;
  --grass-5: #a7f3d0;
  --grass-10: #16a34a;

  --accent-9: #0ea5e9;
  --accent-11: #0284c7;
}

3. 集装箱查询

IntegrationHubBody 使用本地的 CSS 容器查询来响应网格. 如果您在 Tailwind v3 app 中从源头重建软件包样式,请添加:

import containerQueries from '@tailwindcss/container-queries'
export default { plugins: [containerQueries] }

构建

pnpm --filter @bpinternal/integration-hub build
pnpm --filter @bpinternal/integration-hub type-check

发布

pnpm --filter @bpinternal/integration-hub exec npm version patch
pnpm --filter @bpinternal/integration-hub exec npm publish --access public

prepack 运行 clean && build 发布前自动.

说明: 根据传给botpress客户端的选项(x-多集成=真),来自botpress Cloud的集成由他们的ALIAS键入,而不是他们的ID. 对于打算使用集成ID的编辑,确保明确使用.id参数.

版本与发布记录

@bpinternal/integration-hub 共发布 51 个版本,首次发布于 2026/04/14;过去 12 个月发布了 51 个版本。

版本发布日期距今
0.27.0latest2026/09/251 个月前
0.26.12026/09/181 个月前
0.26.02026/08/122 个月前
0.25.92026/07/313 个月前
0.25.82026/06/194 个月前
0.25.72026/06/194 个月前

关于 @bpinternal/integration-hub 的常见问题

@bpinternal/integration-hub 是什么?

Botpress 风格集成目录的可再用集成枢纽

如何安装 @bpinternal/integration-hub?

在项目目录运行 npm install @bpinternal/integration-hub,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:clsx(>=2)、react(>=18)、react-dom(>=18)、lucide-react(>=0.466)、framer-motion(>=11)、@base-ui/react(>=1)、tailwind-merge(>=3)、@monaco-editor/react(>=4)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@bpinternal/integration-hub 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bpinternal/integration-hub 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@bpinternal/integration-hub 可以商用吗?

@bpinternal/integration-hub 使用 AGPL-3.0 许可。最严格的 Copyleft:除分发外,通过网络向用户提供基于它的服务也需要开源对应源码。闭源 SaaS 使用前务必评估。以上为概括,不构成法律意见,请以许可原文为准。

@bpinternal/integration-hub 的下载量有多少?

根据 npm 官方下载统计,@bpinternal/integration-hub 在 2026/10/09 – 2026/11/07 这 30 天内被下载 12,048 次,日均约 402 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bpinternal/integration-hub 还在维护吗?

最新版本 0.27.0 发布于 2026/09/25(1 个月前);至今共发布 51 个版本,其中过去 12 个月发布了 51 个;首次发布于 2026/04/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。