@copilotkit/channels-teams

中文文档
0.12.0发布于 2026/10/28MITTypeScriptES Module构建来源已验证近 30 天下载 105.1万

微软 Teams 平台适配器用于 CopilotKit JSX 频道 (@copilotkit/channels).

中文使用文档
文档目录10 节
  1. 管理频道: 持有自己证书的替代办法
  2. 安装
  3. 快速启动
  4. 如何将地图映射到 PlatformAdapter 合同
  5. 土著团队
  6. 选项
  7. 请求认证
  8. 输入附件下载
  9. 状态和路线图
  10. 出口

@ copilotkit/ 频道团队

这个 微软团队平台适配器 页:1 @copilotkit/channels这是一个 混凝土 PlatformAdapter 将团队插入平台不可知的机器人 发动机,就像 @copilotkit/channels-slack 为斯莱克做。 你个 写你的机器人一次 createChannel (手,JSX,工具,上下文)并运行它 通过添加此适配器在 Teams 上.

这是建立在 微软 365 代理 SDK (单位:千美元)@microsoft/agents-hosting, (中文(简体) ), (原始内容存档于2019-10-21). Bot Framework SDK的接班人.

适配方保留自己的团队/微软365证书(clientId 编号 : clientSecret 编号 : tenantId,或无匿名的本地 dev)——在管理的 路径 : CopilotRuntime (免费计划可用),它开始并拥有频道的 生命周期。 在SDK原始版上建造和操作自己的频道跑道 也是一条支持路径.

管理频道: 持有自己证书的替代办法

这个适配器是 自动托管 路径:您的进程持有微软团队证书,运行微软团队入侵,直接与微软团队交谈.

管理情报频道 是另一个选择。 Intelligence拥有提供者边缘——签名入侵, Egress, 和加密的证书存储——因此您的程序没有持有微软Teams的证书,也没有曝光任何公开的微软Teams端点. 也可以获得耐用线程,频道仪表板,每个频道的健康和记录,以及浏览器向导或CLI提供的引导提供者设置. 浏览器创建了耐用频道草稿

npx copilotkit@latest channels add --project-id <project-id> --channel-id <channel-id> --adapter teams --provision

这个管理路径创建了一个团队管理的机器人和Entra身份;它不需要Azure Bot. 同行手动路径使用Teams开发者Portal + Entra. 既保持供应商的秘密 也保持一次性的应用包字节 从你的项目.

您的机器人代码在其他方面是完全相同的——代理,工具,上下文,命令,和转弯处理器不会改变. 只有运输才有 见 examples/teams/app/managed.ts 同一瓶装双向电线 副驾驶通道 用于运行时接线的技巧.

这个自备适配器仍然得到充分的支持. 如果您想要在自己的基础设施内连接供应商, 请选择它 .

安装

pnpm add @copilotkit/channels @copilotkit/channels-ui @copilotkit/channels-teams
pnpm add @microsoft/agents-hosting @microsoft/agents-activity

微软365代理SDK软件包 可选同伴依赖关系这样 他们不是为你安装的。 如上所示添加它们——这个适配器是 需要他们来管理攻击小组.

express 也是可选的对等器,但是要使用内置的 听着, createTeamsServer里面装满了懒惰的 start()所以一个机器人 服务于 POST /api/messages 从它自己的 HTTP 服务器不安装它 :

pnpm add express   # only for createTeamsServer

它们是可选的,因为管理的路径不需要它们。 管理频道 仅通过 ./render 子路径,它永远不会触碰 Microsoft SDK,所以一个安装的应用程序 @copilotkit/runtime 用于普通聊天 UI 不再拉 整个微软代理堆叠, 或精确 zod 打针 带着它.

如果您不导入适配器, 节点在导入时失败, 并命名 要安装的软件包 :

Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@microsoft/agents-hosting'

快速启动

import { createChannel } from "@copilotkit/channels";
import { teams } from "@copilotkit/channels-teams";
import { CopilotRuntime, CopilotKitIntelligence } from "@copilotkit/runtime/v2";
import { createCopilotNodeListener } from "@copilotkit/runtime/v2/node";

const bot = createChannel({
  name: "support-bot", // project-unique Intelligence Channel name
  identifyUser: "platform",
  adapters: [teams({ port: 3978 })],
});

bot.onMessage(({ thread, message }) => thread.post(`Echo: ${message.text}`));

// The runtime owns the channel's lifecycle — there is no `bot.start()`.
const runtime = new CopilotRuntime({
  intelligence: new CopilotKitIntelligence({
    // apiUrl and wsUrl default to cloud-hosted CopilotKit Intelligence — override
    // both together only for a self-hosted deployment.
    apiKey: process.env.CPK_INTELLIGENCE_API_KEY!, // free tier available
  }),
  channels: [bot],
});

// Creating the listener starts the Channel's connection.
const listener = createCopilotNodeListener({ runtime });
// Optional: await that activation; once settled, POST /api/messages is listening
// on :3978.
await listener.channels.ready();

然后指点 微软 365 代理游戏场 临Τ 无微软 地方发展需要证书:

npx @microsoft/m365agentsplayground   # opens http://localhost:56150

游戏场连接到 http://127.0.0.1:3978/api/messages 并给你一个 类似团队的聊天UI来测试对手. 见 examples/teams 对于一个完整的,可运行的回声机器人,和 微软团队指南 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}通过Azure Bot Service {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}然后装入真正的团队.

如何将地图映射到 PlatformAdapter 合同

  • 入侵: (单位:千美元) CloudAdapter 接受小组的活动 POST /api/messages (被快递服务器踩出). 每个 message 活动 改为 sink.onTurn(...)上传文件 附件 : buildFileContentParts 下载(a) file.download.info URL,或一个 data:/https介质 URL),并手取代理多模式内容 部件——CSV/JSON/text作为解码文本,图像和PDF作为二进制. 就这样 制作"加载CSV ~ 得到图表"的工作. Note Teams 只交付上传 输入一个机器人的文件 1:1(个人)聊天 (所需经费) supportsFiles: true 内 应用程序列表; 在频道或分组聊天中, 团队不将文件发送到 机器人,所以图 -从数据那里 意味着粘贴数据 内线.
  • 进取: 结构化/交互式UI向一个 适应卡 (1.5) 并作为附件发送; 发送一个折叠为纯文本的回复 作为普通文本活动( 赤色) Echo: hi 不应该是名片。 两个都出去 现场直播 TurnContext 在原转弯内发动机在等待 整个转弯处理器,所以一个回复(或一个完整) runAgent() 循环)完成于 hTTP 响应关闭 。 (转会/主动发送) CloudAdapter.continueConversation 通过被捕获的对话参考。 )
  • 已删除文件 : postFile 将文件发布到对话中 。 图像( 如 a) 制取的图表 PNG )通过一个 data: URI,所以这样 直接在线条中做成- bot- slack postFile 平行.
  • 流线 : 文本回复流 通过消息编辑 (小组基线) (原始内容存档于2013-10-12). model. 贴出第一个内容,然后 updateActivity 编辑相同的 消息随着缓冲器的增大而增加(按键和序列;见 TeamsMessageStream),在打字指标之后。 原始符号流是 后作增益.
  • 代理运行 : createRunRenderer 连接 AG-UI 活动到 Teams 。 每个文本 消息通过编辑流出,工具调用加中断被捕获 运行循环.
  • 历史: 团队不给机器人 一份可查询的记录 所以 记忆 TeamsConversationStore 每个对话和种子各保留一个 探员要跟着它跑 换到持久 ConversationStore 用于生产.

土著团队

使用 Teams 便携式JSX以外的适应卡型的命名空间 设置。 土生土长的卡有一张 Teams.AdaptiveCard 树根。 动作可以是 根系儿童或 Teams.ActionSet。 。 。 .

import { Teams } from "@copilotkit/channels-teams";

await thread.post(
  <Teams.AdaptiveCard fallbackText="Deploy approval">
    <Teams.TextBlock text="Deploy ready" wrap />
    <Teams.ActionSet>
      <Teams.Action.Submit
        key="approve"
        title="Approve"
        value={{ decision: "approve" }}
        onSubmit={({ action }) => approve(action.value)}
      />
    </Teams.ActionSet>
  </Teams.AdaptiveCard>,
);

序列器从使用的种类和属性计算出卡片版本. 清晰的下根版本与升起的组件和财产失败 起码。 命名的子槽保持可变, 因此操作器在动作中 管理下交付和行动恢复. Teams.Raw 接受一个 经审查的非交互式适应卡对象.

生成的 本地目录 标注38 7个稳定动作、预览条目和支持 节点。 主机徽章和目录存在来自适应卡. microsoft.com. 这里的“支持”是指微软为Teams的条目打上标记 住地租户仍然是单独的放行检查。 直接小组和管理小组 使用相同的序列器和Bot框架附件形状.

选项

teams({
  port: 3978, // POST /api/messages port (Playground default)
  host, // interface to listen on (see below)
  clientId, // Microsoft app id; omit for anonymous local dev
  clientSecret, // omit for anonymous local dev
  tenantId, // omit for multi-tenant / anonymous
  interruptEventNames, // custom-event names treated as agent interrupts
  allowedServiceUrls, // extra Bot Connector origins to accept (see below)
});

全权证书也来自 clientId 编号 : clientSecret 编号 : tenantId 环境变量,或来自 Connections__<id>__Settings__ClientId 编号 : ClientSecret 编号 : TenantId (M365特工SDK读取的名字). 炸弹 SDK的框架 MicrosoftAppId 编号 : MicrosoftAppPassword 变量不是 读取;如果其中任何一个被设定,而没有任何应用标识解析, start 失败而不是 运行无认证。 将它们重命名为支持的窗体之一 .

请求认证

与一个 clientId 配置(作为一个选项,或通过其中的任意一个 vars M365特工SDK读取,包括: Connections__*, (中文(简体) ), POST /api/messages 仅限 接受带有该应用程序有效标志的请求。 SDK的车 authorizeJWT 检查签名,观众和过期。 收听者需要机器人 拥有作为受众的应用代号,以及SDK为应用配置的发行商(Bot) 框架, https://api.botframework.com或者你的房客的Azure AD发行商; botframework.com 租户当无时 tenantId 已设定). Bot 框架符号 还必须携带 serviceurl 及其签名密钥必须被认可 活动 channelId (见下文)。 其他的都一样 401 或者说 403 财务报告和审定财务报表 从来没有到达你的操作员。 设置例如 authorityEndpoint,或自定义发布器 清单(Connections__<id>__Settings__Issuers环境的决心 同样的SDK读取它们.

这个 Connections__* env 设置优先: 当其中任何一个设置时 SDK 单独从这些 Env vars 构建其认证设置并忽略 clientId 编号 : clientSecret 编号 : tenantId 选项。 如果应用 id 解决是 缺少或与 clientId 你配置的, start 失败 给冲突取名错误, 而不是匿名运行或作为另一个 应用.

机器人把应用符号寄给活动 serviceUrl 当它回答,所以 也检查了 URL。 它一定是下面的微软连接器主机之一 当它带有一种迹象的时候 serviceurl 索赔,来源与索赔来源相同 索赔。 否则,请求得到 403机器人从不给它发邮件

  • https://smba.trafficmanager.net (团队)
  • https://smba.infra.gcc.teams.microsoft.com (小组:海湾合作委员会)
  • https://smba.infra.gov.teams.microsoft.us (海湾合作委员会高级小组)
  • https://smba.infra.dod.teams.microsoft.us (团队DoD)
  • https://*.botframework.com (Bot框架频道,如Web Chat)
  • https://msteams.botframework.azure.cn (21Vianet运营的团队)
  • https://*.botframework.azure.us (祖尔政府)

添加其它连接器来源 allowedServiceUrls: ["https://connector.example"]。领先 *. 关于主机 允许任何子域,并在其后至少需要两个标签 (单位:千美元)https://*.example.com没有 https://*.com) (中文(简体) ). 平面 http 仅被接受 页:1 localhost, (中文(简体) ), 127.0.0.1 财务报告和审定财务报表 [::1]违反这些规则的条目是: 在警告中被忽略.

使用 Bot 框架模拟器测试一个认证的机器人,允许 例如模拟器的本地连接器 allowedServiceUrls: ["http://localhost:<port>"]。 。 。 .

频道背书. Bot 连接器的签名密钥文档中的每个密钥 列出它可能签名的频道。 对于一个瓶子框架符号 (单位:千美元)iss: https://api.botframework.com其关键清单有背书 活动 channelId 必须是其中之一,或者请求得到 403。比如说 Bot Framework SDK, 其密钥 endorsements 字段不存在或没有空 选中; Azure AD 密钥( 单一租户 Azure 瓶服务, 瓶子框架) 模拟器)没有. 密钥文档缓存一个小时; 之后取出次数 5 秒, 失败的获取拒绝了请求( q)503) (中文(简体) ).

匿名模式. 没有 clientId 终点是 匿名: 任何人 谁能到达它可以驱动一转。 这个模式是当地M365特工用的 只播放场,所以听众绑定 127.0.0.1 除非你设定 host该 仅为 IPv4: 连接到 localhost 超过 IPv6 (::1无 返回IPv4需求 host: "localhost" 或者说 host: "::1"。 。 。 . 设置非移动背面 host (例如 host: "0.0.0.0"暴露一个 未认证的机器人到网络;适配器登录一个警告. 与一个 clientId 除非 host 说不然.

createTeamsServer。 。 。 . 直接调用, 它使用 CloudAdapter 你通过。 一个 authConfig 覆盖必须解决 适配器的app id:一个解析为无app id(例如: {}(或改为) 另一个应用程序制作 start() 失败,所以一个超音速 永远不能转动证书 适配器匿名或切换身份.

如果你服务 POST /api/messages 自己而不是使用 createTeamsServer,在检查前进行相同的检查 CloudAdapter.process: 运行 authorizeJWT,只接受你的应用id 作为观众和唯一的发行者, 检查 Bot 框架符号的背书,并检查活动是否 serviceUrl 是一个连接器,你信任 和符号的 serviceurl 索赔. authorizeJWT 仅接受任何发行人而不查看 serviceUrl机器人会把应用标志寄到那里.

输入附件下载

远程附件需要端口443上的 HTTPS 和一个公认的 Microsoft 文件 主持人。 内置政策接受 SharePoint 的租户子域 (单位:千美元)sharepoint.com, (中文(简体) ), sharepoint.us, (中文(简体) ), sharepoint.cn, (中文(简体) ), sharepoint.de, (中文(简体) ), 团队(teams.microsoft.com, (中文(简体) ), teams.microsoft.us, (中文(简体) ), asm.skype.com, (中文(简体) ), botframework.com, (中文(简体) ), botframework.azure.us, (中文(简体) ), files.1drv.com,以及 svc.ms, (中文(简体) ), 加号 graph.microsoft.com 以及上面列出的准确的团队连接主机. 含有证书或指向别处的 URL 被跳过 。 当地 播放场上传, 使用界限 data: 附录.

每次下载和重定向都会解决 DNS 并拒绝目的地(如果有的话) 地址是私有、回回、链接本地、保留或不支持的 IPv6 过渡地址。 TLS 连接只使用已验证的地址和 仍然验证原主机名 。 复行受想行识受想行识受想行识受想行识受想行识受想行识相. 图 文件内容重定向使用其预先认证的 URL; 图形无记名符号 从未被传送到重定向目标。 连接器 allowedServiceUrls 不扩展此附件策略.

下载器在读取和取消超大小时执行大小限制或 暂停请求 。 内置数据在解码前被绑定. 配置限制 与适配器 files 选项 :

选项默认范围
maxBytesPerFile8个小米每个附件
maxFiles页:1每个信件下载尝试, 包括失败的尝试
maxTextBytes200基贝传送给代理人的解码文本
maxBytesPerMessage40个小米B合并下载字节,包括图元数据
downloadTimeoutMs30 000人DNS、连接、重定向和每次下载的正文;每个图形元数据/操作
maxDownloadTimeMs6万个共享信件的已过下载时间

适配器在构建时验证下载预算限制. 他们一定是 非负安全整数; 无效值, 如 Infinity 立即失败 选项名称出错。 每条信息都得到新的预算.

内线和图回落路径共享一个预算。 下载失败生成 不包含预认证的 URL 或传输错误的短跳注释 细节。 Graph 通道倒置使用商业 Graph 端点 .

状态和路线图

已执行:信息入侵; 适应卡渲染 装入炸弹 词汇( e)<Header>, (中文(简体) ), <Section>编号 :<Markdown>, (中文(简体) ), <Fields>, (中文(简体) ), <Table>, (中文(简体) ), <Image>, (中文(简体) ), <Actions>编号 :<Button>, (中文(简体) ), <Select>, (中文(简体) ), <Input>, (中文(简体) ), <Context>带有 赤色回复的简单文字路径和一个倒计时表; 逐个流出 编辑 附有打字指标的文本答复; runAgent 工具调用/ 中断 捕获; 纸牌动作回程+HITL (下文);对话历史; update 编号 : delete在M365代理游戏场验证.

卡-动作回转+HITL. 适应卡 Action.Submit 点击到达 作为带有此动作的信息活动 data 内 activity.value· ; decodeInteraction 解析我们的不透明 ckActionId + 按钮值及其路径 改为 sink.onInteraction,解决引擎的 awaitChoice 服务员和 运行按钮 onClick (如编辑已就位的拾取器). 工具处理器 呼唤 await thread.awaitChoice(<Card/>) 因此,将代理人关在 人的决定;见 examples/teams 用于批准/拒绝演示。 入侵和 交互解码从一个共享帮助中获取对话密钥 (单位:千美元)conversationKeyOf)故侍者常决.

Async 转接. 当认证时, 入侵会撞倒进入的转弯 立即运行一个离子上的代理 continueConversation 上下文,所以 a 一个 awaitChoice 暂停可以超过团队转出窗口( 核准分钟) (后来)。 在匿名的本地游乐场( 其中) continueConversation 没有 app id) 运行使用 inbound turn 语境, localhost hold open over 暂停。 侍者为内相(v1),因此无法从一个进程重启中活出.

计划的后续行动(建筑为每个项目留出了空间):

  • 原始符号流: 通过 SDK 的逐个回复 StreamingResponse (单位:千美元)queueInformativeUpdate 编号 : queueTextChunk 编号 : endStream, (中文(简体) ), vs. 当前当时的后编辑模式.
  • 持久的HITL服务员: 待定 awaitChoice 状态如此批准 幸存的重启(今天是记忆中).
  • 用户查询 (微软图)和 任意非图像文件上传 通过 团队/文件同意流程(今天) postFile 处理内置图像.

出口

teams, (中文(简体) ), TeamsAdapter, (中文(简体) ), TeamsAdapterOptions, (中文(简体) ), TeamsReplyTarget, (中文(简体) ), ConversationKey· ; TeamsConversationStore· ; createRunRenderer· ; conversationKeyOf 编号 : parseCardAction· ; renderTeamsMarkdown· ; renderAdaptiveCard 编号 : AdaptiveCard 编号 : isPlainText 编号 : ADAPTIVE_CARD_CONTENT_TYPE· ; TEAMS_LIMITS· ; TeamsMessageStream· ; createTeamsServer 编号 : TeamsServer 编号 : TeamsServerConfig· ; SanitizingHttpAgent (折旧——频道默认消毒); buildFileContentParts 编号 : TeamsAttachmentRef 编号 : FileDeliveryConfig。 。 。 .

版本与发布记录

@copilotkit/channels-teams 共发布 46 个版本,首次发布于 2026/07/09;过去 12 个月发布了 46 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.12.0latest2026/10/2813 天前
0.11.12026/10/1625 天前
0.11.02026/09/231 个月前
0.10.02026/09/151 个月前
0.9.32026/09/151 个月前
0.9.22026/09/032 个月前

其他发布通道:canary → 0.7.3-canary.1785878925。

关于 @copilotkit/channels-teams 的常见问题

@copilotkit/channels-teams 是什么?

微软 Teams 平台适配器用于 CopilotKit JSX 频道 (@copilotkit/channels).

如何安装 @copilotkit/channels-teams?

在项目目录运行 npm install @copilotkit/channels-teams,或使用 pnpm add / yarn add / bun add。

@copilotkit/channels-teams 支持 TypeScript 吗?

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

@copilotkit/channels-teams 支持 ESM 还是 CommonJS?

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

@copilotkit/channels-teams 可以商用吗?

@copilotkit/channels-teams 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@copilotkit/channels-teams 的下载量有多少?

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

@copilotkit/channels-teams 还在维护吗?

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