Microsoft Teams 应用技能
加载于:base.md
目的: 为 Microsoft Teams 构建 AI 驱动的代理和应用程序。创建对话机器人、消息扩展和集成了像 OpenAI 和 Claude 这样的大型语言模型的智能助手。
架构概览
┌─────────────────────────────────────────────────────────────────┐
│ TEAMS 应用类型 │
│ ───────────────────────────────────────────────────────────── │
│ │
│ 1. AI 代理 (机器人) │
│ 由 LLMs 驱动的会话应用 │
│ 处理消息、命令和操作 │
│ │
│ 2. 消息扩展 │
│ 搜索外部系统,将卡片插入消息 │
│ 带模态对话框的动作命令 │
│ │
│ 3. 标签页 │
│ Teams 内的嵌入式 Web 应用程序 │
│ 个人、频道或会议标签页 │
│ │
│ 4. WEBHOOKS & 连接器 │
│ 入站:向频道发布消息 │
│ 出站:响应 @提及 │
├─────────────────────────────────────────────────────────────────┤
│ SDK 格局 (2025) │
│ ───────────────────────────────────────────────────────────── │
│ Teams SDK v2: 主要 SDK,仅用于 Teams 应用 │
│ M365 代理 SDK: 多渠道(Teams、Outlook、Copilot) │
│ Teams 工具包:VS Code 扩展,用于开发 │
└─────────────────────────────────────────────────────────────────┘
快速开始
安装 Teams CLI
npm install -g @microsoft/teams.cli
创建新项目
# TypeScript(推荐)
npx @microsoft/teams.cli new typescript my-agent --template echo
# Python
npx @microsoft/teams.cli new python my-agent --template echo
# C#
npx @microsoft/teams.cli new csharp my-agent --template echo
项目结构
my-agent/
├── src/
│ ├── index.ts # 入口点
│ ├── app.ts # 应用配置
│ └── handlers/
│ ├── message.ts # 消息处理程序
│ └── commands.ts # 命令处理程序
├── appPackage/
│ ├── manifest.json # 应用清单
│ ├── color.png # 应用图标(192x192)
│ └── outline.png # 轮廓图标(32x32)
├── .env # 环境变量
├── teamsapp.yml # Teams 工具包配置
└── package.json
应用清单
基本清单结构
{
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.17/MicrosoftTeams.schema.json", ...
}
带消息扩展的清单
{
"composeExtensions": [
{
"botId": "{{BOT_ID}}", ...
}
]
}
AI 代理开发
Teams SDK v2 的基本机器人
// src/app.ts
import { App, HttpPlugin, DevtoolsPlugin } from '@microsoft/teams.ai'; ...
提示配置
# src/prompts/chat/config.json
{
"schema": 1.1, ...
}
# src/prompts/chat/skprompt.txt
你是 Microsoft Teams 的 AI 助手。你帮助用户解答问题和完成任务。 ...
集成 Claude/Anthropic
Claude 驱动的 Teams 机器人
// src/claude-bot.ts
import { App, HttpPlugin } from '@microsoft/teams.ai'; ...
Claude 与工具/功能调用
// src/claude-agent.ts
import Anthropic from '@anthropic-ai/sdk'; ...
自适应卡片
基本自适应卡片
// src/cards/welcome-card.ts
import { CardFactory } from 'botbuilder'; ...
AI 响应卡片与操作
// src/cards/ai-response-card.ts
export function createAIResponseCard( ...
用户输入表单卡片
// src/cards/task-form-card.ts
export function createTaskFormCard() { ...
Microsoft Graph 集成
设置 Graph 客户端
// src/graph/client.ts
import { Client } from '@microsoft/microsoft-graph-client'; ...
常见 Graph 操作
// src/graph/operations.ts
import { Client } from '@microsoft/microsoft-graph-client'; ...
认证
使用 Teams SDK 进行 SSO
// src/auth.ts
import { App } from '@microsoft/teams.ai'; ...
手动 OAuth 流程
// src/auth/oauth.ts
import { OAuthPrompt, OAuthPromptSettings } from 'botbuilder-dialogs'; ...
RAG(检索增强生成)
Azure AI 搜索中的向量搜索
// src/rag/azure-search.ts
import { SearchClient, AzureKeyCredential } from '@azure/search-documents'; ...
RAG 增强的 Claude 响应
// src/rag/claude-rag.ts
import Anthropic from '@anthropic-ai/sdk'; ...
部署
Azure Bot 服务设置
# 创建资源组
az group create --name rg-teams-bot --location eastus
...
环境变量
# .env
# Azure Bot
BOT_ID=your-bot-id
...
Docker 部署
# Dockerfile
FROM node:18-alpine
...
# docker-compose.yml
version: '3.8'
...
Teams 工具包部署
# 登录到 Azure
npx teamsfx account login azure
...
测试
本地测试与 ngrok
# 启动 ngrok 隧道
ngrok http 3978
...
Teams 工具包本地调试
# 开始本地调试(打开 Teams 并使用你的应用)
npx teamsfx preview --local
单元测试
// tests/bot.test.ts
import { TestAdapter, TurnContext } from 'botbuilder'; ...
最佳实践
对话设计
┌─────────────────────────────────────────────────────────────────┐
│ CONVERSATION UX GUIDELINES │
│ ───────────────────────────────────────────────────────────── │
│ 1. 智能问候 │
│ - 用 onboarding 卡片欢迎新用户 │
│ - 返回用户快速访问最近的操作 │
│ ...
安全清单
- [ ] 验证所有传入消息
- [ ] 尽可能使用 App-Only 身份验证访问 Graph API
- [ ] 永不记录敏感用户数据
- [ ] 实施速率限制
- [ ] 在 Azure 中使用托管身份
- [ ] 定期旋转机密
- [ ] 启用审计日志
性能提示
| 提示 | 描述 |
|---|---|
| 缓存 Graph 令牌 | 令牌刷新成本高昂 |
| 流式传输长响应 | 使用输入指示器 + 分块响应 |
| 索引知识库 | 预先嵌入文档以进行 RAG |
| 使用连接池 | 重用 HTTP 连接 |
| 压缩负载 | Gzip 大型卡片响应 |
项目模板
AI 助手模板
// 完整的 AI 助手,使用 Claude
import { App, HttpPlugin } from '@microsoft/teams.ai'; ...
故障排除
| 问题 | 原因 | 修复 |
|---|---|---|
| 机器人无响应 | 无法访问端点 | 检查清单中的 ngrok/Azure URL |
| 认证失败 | 令牌过期/无效 | 刷新 OAuth 连接 |
| 卡片不渲染 | 无效的架构 | 在 adaptivecards.io/designer 中验证 |
| Graph 403 错误 | 缺少权限 | 检查应用注册权限 |
| 响应慢 | API 延迟 | 添加输入指示器,考虑流式传输 |