# @copilotkit/channels-teams 中文文档

规范地址：https://npmcn.com/package/%40copilotkit/channels-teams/

版本：0\.12\.0
npm 元数据更新时间：2026-10-28T13:36:27.007Z
中文译文更新时间：2026-11-10T18:25:38.731Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40copilotkit/channels-teams
原文对照：https://npmcn.com/package/%40copilotkit/channels-teams/?lang=original
项目主页：https://github.com/CopilotKit/CopilotKit
源码仓库：https://github.com/CopilotKit/CopilotKit

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：402 kB，156 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：7 个
- peer 依赖：express ^4\.18\.0 \|\| ^5\.0\.0，@microsoft/agents-hosting ^1\.5\.3，@microsoft/agents-activity ^1\.5\.3
- 首次发布：2026-07-08T19:57:58.663Z
- 最新版本发布：2026-10-28T13:36:26.108Z
- 近 30 天下载量：1050936（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：46（近 12 个月 46 个）

## 中文简介

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

## 安装

```sh
npm install @copilotkit/channels-teams
```

也可以使用：`pnpm add @copilotkit/channels-teams`、`yarn add @copilotkit/channels-teams`、`bun add @copilotkit/channels-teams`

## README

# @ copilotkit/ 频道团队

这个 **微软团队平台适配器** 页:1 [`@copilotkit/channels`](https://npmcn.com/package/%40copilotkit/channels)这是一个 混凝土 `PlatformAdapter` 将团队插入平台不可知的机器人 发动机,就像 [`@copilotkit/channels-slack`](https://npmcn.com/package/%40copilotkit/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提供的引导提供者设置. 浏览器创建了耐用频道草稿

```bash
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` 同一瓶装双向电线 **副驾驶通道** 用于运行时接线的技巧.

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

## 安装

```sh
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 服务器不安装它 :

```sh
pnpm add express   # only for createTeamsServer
```

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

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

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

## 快速启动

```ts
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 代理游戏场** 临Τ 无微软 地方发展需要证书:

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

游戏场连接到 `http://127.0.0.1:3978/api/messages` 并给你一个 类似团队的聊天UI来测试对手. 见 [`examples/teams`](https://npmcn.com/package/examples/teams) 对于一个完整的,可运行的回声机器人,和 [微软团队指南](https://npmcn.com/package/showcase/shell-docs/src/content/docs/frontends/teams.mdx) {\\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`。 。 。 .

```tsx
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` 接受一个 经审查的非交互式适应卡对象.

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

## 选项

```ts
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` 选项 :

| 选项 | 默认 | 范围 |
| --- | --- | --- |
| `maxBytesPerFile` | 8个小米 | 每个附件 |
| `maxFiles` | 页:1 | 每个信件下载尝试, 包括失败的尝试 |
| `maxTextBytes` | 200基贝 | 传送给代理人的解码文本 |
| `maxBytesPerMessage` | 40个小米B | 合并下载字节,包括图元数据 |
| `downloadTimeoutMs` | 30 000人 | DNS、连接、重定向和每次下载的正文;每个图形元数据/操作 |
| `maxDownloadTimeMs` | 6万个 | 共享信件的已过下载时间 |

适配器在构建时验证下载预算限制. 他们一定是 非负安全整数; 无效值, 如 `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 是什么？

微软 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 和提交记录判断。

