@ 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.infoURL,或一个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- slackpostFile平行. - 流线 : 文本回复流 通过消息编辑 (小组基线)
(原始内容存档于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 选项 :
| 选项 | 默认 | 范围 |
|---|---|---|
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。 。 。 .