sharePointSiteId + quyền Graph (xem Gửi tệp trong cuộc trò chuyện nhóm). Cuộc thăm dò được gửi qua Adaptive Cards. Các hành động tin nhắn cung cấp upload-file rõ ràng cho các lượt gửi ưu tiên tệp.
Plugin đi kèm
Microsoft Teams được cung cấp dưới dạng Plugin đi kèm trong các bản phát hành OpenClaw hiện tại; bản dựng đóng gói thông thường không yêu cầu cài đặt riêng. Trên bản dựng cũ hơn hoặc bản cài đặt tùy chỉnh không bao gồm Teams đi kèm, hãy cài đặt trực tiếp gói npm:Thiết lập nhanh
@microsoft/teams.cli xử lý việc đăng ký bot, tạo manifest và tạo thông tin xác thực bằng một lệnh.
1. Cài đặt và đăng nhập
Teams CLI hiện đang ở giai đoạn xem trước. Các lệnh và cờ có thể thay đổi giữa các bản phát hành.
--allow-anonymous là bắt buộc vì Teams không thể xác thực với devtunnels. Mỗi yêu cầu bot đến vẫn được Teams SDK xác thực.ngrok http 3978 hoặc tailscale funnel 3978 (URL có thể thay đổi trong mỗi phiên).
3. Tạo ứng dụng
CLIENT_ID, CLIENT_SECRET, TENANT_ID và Teams App ID; đồng thời cung cấp tùy chọn cài đặt ứng dụng trực tiếp trong Teams.
4. Cấu hình OpenClaw bằng thông tin xác thực từ đầu ra:
MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
5. Cài đặt ứng dụng trong Teams
teams app create nhắc bạn cài đặt ứng dụng; chọn “Install in Teams”. Để lấy liên kết cài đặt sau:
Cuộc trò chuyện nhóm bị chặn theo mặc định (
channels.msteams.groupPolicy: "allowlist"). Để cho phép trả lời trong nhóm, hãy đặt channels.msteams.groupAllowFrom, hoặc sử dụng groupPolicy: "open" để cho phép bất kỳ thành viên nào (vẫn yêu cầu đề cập).Mục tiêu
- Trò chuyện với OpenClaw qua DM, cuộc trò chuyện nhóm hoặc kênh Teams.
- Duy trì định tuyến xác định: câu trả lời luôn quay về kênh nơi chúng được nhận.
- Mặc định sử dụng hành vi kênh an toàn (yêu cầu đề cập trừ khi được cấu hình khác).
Ghi cấu hình
Theo mặc định, Microsoft Teams có thể ghi các cập nhật cấu hình do/config set|unset kích hoạt (yêu cầu commands.config: true).
Vô hiệu hóa bằng:
Kiểm soát quyền truy cập (DM + nhóm)
Quyền truy cập DM- Mặc định:
channels.msteams.dmPolicy = "pairing". Người gửi không xác định bị bỏ qua cho đến khi được phê duyệt. channels.msteams.allowFromnên sử dụng ID đối tượng AAD ổn định hoặc các nhóm truy cập người gửi tĩnh nhưaccessGroup:core-team.- Không dựa vào việc khớp UPN/tên hiển thị cho danh sách cho phép; chúng có thể thay đổi. OpenClaw vô hiệu hóa tính năng khớp tên trực tiếp theo mặc định; bật tính năng này bằng
channels.msteams.dangerouslyAllowNameMatching: true. - Trình hướng dẫn có thể phân giải tên thành ID qua Microsoft Graph khi thông tin xác thực cho phép.
- Mặc định:
channels.msteams.groupPolicy = "allowlist"(bị chặn trừ khi bạn thêmgroupAllowFrom).channels.defaults.groupPolicycó thể ghi đè mặc định dùng chung khi chưa đặtchannels.msteams.groupPolicy. channels.msteams.groupAllowFromkiểm soát người gửi hoặc nhóm truy cập người gửi tĩnh nào có thể kích hoạt trong cuộc trò chuyện nhóm/kênh (nếu không có thì dùngchannels.msteams.allowFrom).- Đặt
groupPolicy: "open"để cho phép bất kỳ thành viên nào (theo mặc định vẫn yêu cầu đề cập). - Để chặn tất cả các kênh, hãy đặt
channels.msteams.groupPolicy: "disabled".
- Giới hạn phạm vi trả lời nhóm/kênh bằng cách liệt kê các nhóm và kênh trong
channels.msteams.teams. - Sử dụng ID cuộc hội thoại Teams ổn định từ các liên kết Teams làm khóa, không dùng tên hiển thị có thể thay đổi (xem ID nhóm và kênh).
- Khi có
groupPolicy="allowlist"và danh sách cho phép nhóm, chỉ các nhóm/kênh được liệt kê mới được chấp nhận (yêu cầu đề cập). - Trình hướng dẫn cấu hình chấp nhận các mục
Team/Channelvà lưu chúng cho bạn. - Khi khởi động, OpenClaw phân giải tên nhóm/kênh và tên trong danh sách cho phép người dùng thành ID (khi quyền Graph cho phép) và ghi ánh xạ vào nhật ký. Các tên không phân giải được vẫn được giữ nguyên như đã nhập nhưng bị bỏ qua khi định tuyến trừ khi đặt
channels.msteams.dangerouslyAllowNameMatching: true.
Xác thực liên kết (chứng chỉ kết hợp danh tính được quản lý)
Đối với môi trường production, OpenClaw hỗ trợ xác thực liên kết quachannels.msteams.authType: "federated" như một lựa chọn thay thế cho khóa bí mật máy khách. Có hai phương thức:
Tùy chọn A: Xác thực dựa trên chứng chỉ
Sử dụng chứng chỉ PEM đã đăng ký với bản đăng ký ứng dụng Entra ID của bạn. Thiết lập:- Tạo hoặc lấy chứng chỉ (định dạng PEM kèm khóa riêng tư).
- Entra ID → App Registration → Certificates & secrets → Certificates → tải chứng chỉ công khai lên.
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
Tùy chọn B: Azure Managed Identity
Sử dụng Azure Managed Identity để xác thực không cần mật khẩu trên cơ sở hạ tầng Azure (AKS, App Service, máy ảo Azure). Cách hoạt động:- Pod/VM của bot có một danh tính được quản lý (do hệ thống hoặc người dùng gán).
- Thông tin xác thực danh tính liên kết kết nối danh tính được quản lý với bản đăng ký ứng dụng Entra ID.
- Trong thời gian chạy, OpenClaw sử dụng
@azure/identityđể lấy token từ điểm cuối Azure IMDS. - Token được chuyển cho Teams SDK để xác thực bot.
- Hạ tầng Azure đã bật danh tính được quản lý (danh tính khối lượng công việc AKS, App Service, VM).
- Thông tin xác thực danh tính liên kết đã được tạo trên đăng ký ứng dụng Entra ID.
- Quyền truy cập mạng tới IMDS (
169.254.169.254:80) từ pod/VM.
managedIdentityClientId: "<MI_CLIENT_ID>" vào khối trên.
Biến môi trường:
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(chỉ dành cho danh tính do người dùng gán)
Thiết lập danh tính khối lượng công việc AKS
Đối với các bản triển khai AKS sử dụng danh tính khối lượng công việc:- Bật danh tính khối lượng công việc trên cụm AKS.
-
Tạo thông tin xác thực danh tính liên kết trên đăng ký ứng dụng Entra ID:
-
Chú thích tài khoản dịch vụ Kubernetes bằng ID máy khách của ứng dụng:
-
Gắn nhãn pod để chèn danh tính khối lượng công việc:
-
Cho phép truy cập mạng tới IMDS (
169.254.169.254): nếu sử dụng NetworkPolicy, hãy thêm quy tắc lưu lượng đi ra cho169.254.169.254/32trên cổng 80.
So sánh loại xác thực
Có thể đặt
certificateThumbprint cùng với certificatePath, nhưng hiện tại đường dẫn xác thực không đọc giá trị này; giá trị chỉ được chấp nhận để đảm bảo khả năng tương thích trong tương lai.
Mặc định: khi chưa đặt authType, OpenClaw sử dụng xác thực bằng bí mật máy khách (appPassword). Các cấu hình hiện có tiếp tục hoạt động mà không cần thay đổi.
Phát triển cục bộ (tạo đường hầm)
Teams không thể truy cậplocalhost. Hãy sử dụng đường hầm phát triển cố định để URL duy trì ổn định giữa các phiên:
ngrok http 3978 hoặc tailscale funnel 3978 (URL có thể thay đổi sau mỗi phiên).
Nếu URL đường hầm thay đổi, hãy cập nhật điểm cuối:
Kiểm thử bot
Chạy chẩn đoán:- Cài đặt ứng dụng Teams (liên kết cài đặt từ
teams app get <id> --install-link). - Tìm bot trong Teams và gửi tin nhắn trực tiếp.
- Kiểm tra nhật ký Gateway để xem hoạt động đến.
Biến môi trường
Có thể đặt các khóa cấu hình liên quan đến xác thực này qua biến môi trường thay vìopenclaw.json (các khóa cấu hình khác, chẳng hạn như groupPolicy hoặc historyLimit, chỉ có thể đặt trong cấu hình):
Thao tác thông tin thành viên
OpenClaw cung cấp thao tácmember-info dựa trên Graph cho Microsoft Teams, để các tác nhân và quy trình tự động hóa có thể phân giải thông tin danh sách thành viên đã xác minh cho một cuộc hội thoại được cấu hình.
Yêu cầu:
- Quyền RSC
ChannelSettings.Read.GroupvàTeamMember.Read.Group(đã có trong tệp kê khai được khuyến nghị).
channels.msteams.actions.memberInfo riêng.
Tra cứu kênh tiêu chuẩn trả về danh tính tương ứng trong danh sách thành viên nhóm, tên hiển thị, email và vai trò.
Trong tin nhắn trực tiếp hoặc cuộc trò chuyện nhóm hiện tại, thao tác có thể trả về ID người dùng ổn định của người gửi đáng tin cậy.
Tra cứu thành viên trong kênh riêng tư/dùng chung và cuộc trò chuyện không phải hiện tại yêu cầu thêm quyền truy cập danh sách thành viên
và bị đường cơ sở quyền mặc định từ chối.
Ngữ cảnh lịch sử
channels.msteams.historyLimitkiểm soát số lượng tin nhắn kênh/nhóm gần đây được đưa vào lời nhắc. Giá trị dự phòng làmessages.groupChat.historyLimit, sau đó mặc định là 50. Đặt0để tắt.- Lịch sử luồng đã tìm nạp được lọc theo danh sách người gửi được phép (
allowFrom/groupAllowFrom), vì vậy việc khởi tạo ngữ cảnh luồng chỉ bao gồm tin nhắn từ những người gửi được phép. - Ngữ cảnh tệp đính kèm được trích dẫn (được phân tích từ HTML theo lược đồ Skype Reply trong chính các tệp đính kèm của thư trả lời) được truyền qua mà không lọc; hiện tại chỉ việc khởi tạo lịch sử luồng áp dụng bộ lọc danh sách người gửi được phép.
- Có thể giới hạn lịch sử tin nhắn trực tiếp bằng
channels.msteams.dmHistoryLimit(lượt của người dùng). Ghi đè theo từng người dùng:channels.msteams.dms["<user_id>"].historyLimit.
Quyền RSC Teams hiện tại (tệp kê khai)
Đây là các quyền resourceSpecific hiện có trong tệp kê khai ứng dụng Teams. Chúng chỉ áp dụng trong nhóm/cuộc trò chuyện nơi ứng dụng được cài đặt. Đối với kênh (phạm vi nhóm):ChannelMessage.Read.Group(Ứng dụng) - nhận tất cả tin nhắn kênh mà không cần @đề cậpChannelMessage.Send.Group(Ứng dụng)Member.Read.Group(Ứng dụng)Owner.Read.Group(Ứng dụng)ChannelSettings.Read.Group(Ứng dụng)TeamMember.Read.Group(Ứng dụng)TeamSettings.Read.Group(Ứng dụng)
ChatMessage.Read.Chat(Ứng dụng) - nhận tất cả tin nhắn trò chuyện nhóm mà không cần @đề cập
Tệp kê khai Teams mẫu (đã biên tập)
Ví dụ tối thiểu, hợp lệ với các trường bắt buộc. Thay thế ID và URL.Lưu ý về tệp kê khai (các trường bắt buộc)
bots[].botIdphải khớp với ID ứng dụng Azure Bot.webApplicationInfo.idphải khớp với ID ứng dụng Azure Bot.bots[].scopesphải bao gồm các bề mặt bạn dự định sử dụng (personal,team,groupChat).bots[].supportsFiles: truelà bắt buộc để xử lý tệp trong phạm vi cá nhân.authorization.permissions.resourceSpecificphải bao gồm quyền đọc/gửi kênh cho lưu lượng kênh.
Cập nhật ứng dụng hiện có
Khả năng: chỉ RSC so với Graph
Với chỉ Teams RSC (ứng dụng đã cài đặt, không có quyền Graph API)
Hoạt động:- Đọc nội dung văn bản của tin nhắn kênh.
- Gửi nội dung văn bản của tin nhắn kênh.
- Nhận tệp đính kèm trong phạm vi cá nhân (tin nhắn trực tiếp).
- Nội dung hình ảnh hoặc tệp của kênh/nhóm (tải trọng chỉ bao gồm một đoạn HTML giữ chỗ).
- Tải xuống tệp đính kèm được lưu trữ trong SharePoint/OneDrive.
- Đọc lịch sử tin nhắn ngoài sự kiện Webhook trực tiếp.
Với Teams RSC + quyền ứng dụng Microsoft Graph
Bổ sung:- Tải xuống nội dung được lưu trữ (hình ảnh được dán vào tin nhắn).
- Tải xuống tệp đính kèm được lưu trữ trong SharePoint/OneDrive.
- Đọc lịch sử tin nhắn kênh/cuộc trò chuyện qua Graph.
RSC so với Graph API
Kết luận: RSC dùng để lắng nghe theo thời gian thực; Graph API dùng để truy cập lịch sử. Để truy xuất các tin nhắn bị bỏ lỡ khi ngoại tuyến, bạn cần Graph API với
ChannelMessage.Read.All (yêu cầu sự đồng ý của quản trị viên).
Phương tiện + lịch sử hỗ trợ Graph
Chỉ bật các quyền ứng dụng Microsoft Graph cần thiết cho phạm vi Teams và dữ liệu bạn sử dụng:- Entra ID (Azure AD) App Registration → thêm Application permissions của Graph:
ChannelMessage.Read.Allcho tệp đính kèm và lịch sử kênh.Chat.Read.Allcho tệp đính kèm và lịch sử trò chuyện nhóm.Files.Read.Allkhi phải tải byte của tệp đính kèm xuống từ bộ nhớ SharePoint/OneDrive; các thiết lập chỉ dùng lịch sử không cần quyền này.
- Grant admin consent cho đối tượng thuê.
- Tăng manifest version của ứng dụng Teams, tải lên lại và cài đặt lại ứng dụng trong Teams.
- Thoát hoàn toàn và khởi chạy lại Teams để xóa siêu dữ liệu ứng dụng đã lưu trong bộ nhớ đệm.
Khôi phục tệp kênh/nhóm (graphMediaFallback)
Teams có thể xóa các dấu hiệu tệp khỏi hoạt động HTML được gửi đến bot. Trong trường hợp đó, hoạt động Bot Framework không thể phân biệt với một tin nhắn HTML thông thường; tham chiếu tệp đính kèm đầy đủ chỉ tồn tại trong bản sao tin nhắn trên Graph.
Bật phương án dự phòng sau khi cấp các quyền ở trên:
false để các bản cài đặt hiện có không tự động phát sinh thêm lưu lượng Graph hoặc lỗi quyền.
Đề cập người dùng: @mentions hoạt động ngay lập tức với những người dùng đã có trong cuộc trò chuyện. Để tự động tìm kiếm và đề cập những người dùng không có trong cuộc trò chuyện hiện tại, hãy thêm quyền User.Read.All (Application) và cấp sự đồng ý của quản trị viên.
Các hạn chế đã biết
Thời gian chờ webhook
Teams gửi tin nhắn qua webhook HTTP. OpenClaw áp dụng thời gian chờ máy chủ HTTP cố định cho trình lắng nghe webhook đó: 30 giây không hoạt động, tổng thời gian yêu cầu là 30 giây và 15 giây để nhận tiêu đề. Việc làm giàu ngữ cảnh và phương tiện đầu vào tùy chọn dùng chung ngân sách 10 giây. SDK trả về sau khi hoạt động thô được nối thêm một cách bền vững; lượt chạy của tác nhân được xử lý độc lập và chủ động gửi phản hồi. Nếu quá trình xử lý yêu cầu hoặc tiếp nhận bền vững vượt quá cửa sổ vận chuyển, Teams có thể thử gửi lại hoạt động và dấu mốc loại bỏ ở đầu vào sẽ từ chối ID sự kiện bị lặp lại.Hỗ trợ đám mây Teams và URL dịch vụ
Đường dẫn Teams dựa trên SDK này được xác thực trực tiếp cho đám mây công cộng Microsoft Teams. Các phản hồi đầu vào sử dụng ngữ cảnh lượt chạy SDK Teams của tin nhắn đến. Các thao tác chủ động ngoài ngữ cảnh — gửi, chỉnh sửa, xóa, thẻ, cuộc thăm dò, tin nhắn đồng ý nhận tệp và phản hồi chạy dài trong hàng đợi — sử dụng tham chiếu cuộc trò chuyện đã lưuserviceUrl. Đám mây công cộng mặc định dùng môi trường đám mây công cộng của SDK Teams và cho phép các tham chiếu đã lưu trên máy chủ Teams Connector công cộng: https://smba.trafficmanager.net/.
Đám mây công cộng là mặc định. Bạn không cần đặt channels.msteams.cloud hoặc channels.msteams.serviceUrl cho các bot đám mây công cộng thông thường.
Đối với các đám mây Teams không công khai, hãy đặt cloud và ranh giới chủ động tương ứng khi Microsoft công bố:
channels.msteams.cloudchọn cấu hình đặt sẵn đám mây SDK Teams cho việc xác thực, xác thực JWT, dịch vụ token và phạm vi Graph.channels.msteams.serviceUrlchọn ranh giới điểm cuối Bot Connector dùng để xác thực các tham chiếu cuộc trò chuyện đã lưu trước khi thực hiện các thao tác chủ động như gửi, chỉnh sửa, xóa, thẻ, cuộc thăm dò, tin nhắn đồng ý nhận tệp và phản hồi chạy dài trong hàng đợi. Thiết lập này là bắt buộc đối với các đám mây SDK USGov và DoD. Đối với China/21Vianet, OpenClaw sử dụng cấu hình đặt sẵnChinacủa SDK và chỉ chấp nhận URL dịch vụ đã lưu/được cấu hình trên các máy chủ kênh Azure China Bot Framework.
serviceUrl của hoạt động đến khi có; nếu không, hãy sử dụng bảng của Microsoft bên dưới.
Ví dụ cho GCC, nơi Microsoft ghi nhận một URL dịch vụ chủ động riêng nhưng SDK Teams không cung cấp cấu hình đặt sẵn đám mây GCC riêng:
channels.msteams.serviceUrl bị giới hạn ở các máy chủ Microsoft Teams Bot Connector được hỗ trợ. Khi URL dịch vụ được cấu hình, OpenClaw kiểm tra rằng serviceUrl của cuộc trò chuyện đã lưu sử dụng cùng một máy chủ trước khi thực hiện các thao tác chủ động như gửi, chỉnh sửa, xóa, thẻ, cuộc thăm dò hoặc phản hồi chạy dài trong hàng đợi. Với cấu hình đám mây công cộng mặc định, OpenClaw sẽ đóng an toàn nếu một cuộc trò chuyện đã lưu trỏ ra ngoài máy chủ Teams Connector công cộng. Hãy nhận một tin nhắn mới từ cuộc trò chuyện sau khi thay đổi cài đặt đám mây/URL dịch vụ để tham chiếu cuộc trò chuyện đã lưu được cập nhật.
China/21Vianet không có URL smba chủ động toàn cầu riêng trong bảng điểm cuối chủ động Teams của Microsoft. Cấu hình cloud: "China" để SDK Teams sử dụng các điểm cuối xác thực, token và JWT của Azure China. Sau đó, các thao tác gửi chủ động yêu cầu một tham chiếu cuộc trò chuyện đã lưu từ hoạt động China Teams đến hoặc một URL dịch vụ được cấu hình rõ ràng trên ranh giới kênh Azure China Bot Framework (*.botframework.azure.cn). Các trình trợ giúp Teams dựa trên Graph bị vô hiệu hóa đối với cloud: "China" cho đến khi OpenClaw định tuyến các yêu cầu Graph qua điểm cuối Azure China Graph.
Định dạng
Markdown của Teams bị hạn chế hơn Slack hoặc Discord:- Định dạng cơ bản hoạt động: in đậm, in nghiêng,
code, liên kết. - Markdown phức tạp (bảng, danh sách lồng nhau) có thể không hiển thị chính xác.
- Adaptive Cards được hỗ trợ cho các cuộc thăm dò và thao tác gửi trình bày ngữ nghĩa (xem bên dưới).
Cấu hình
Các cài đặt chính (xem /gateway/configuration để biết các mẫu kênh dùng chung):channels.msteams.enabled: bật/tắt kênh.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: thông tin xác thực của bot.channels.msteams.cloud: môi trường đám mây của Teams SDK (Public,USGov,USGovDoDhoặcChina; mặc địnhPublic). Đặt bằngserviceUrlcho các đám mây SDK USGov/DoD; Trung Quốc sử dụng cấu hình đặt sẵn của SDK và các tham chiếu hội thoại Azure China Bot Framework đã lưu, trong đó các trình trợ giúp dựa trên Graph bị tắt cho đến khi tính năng định tuyến Azure China Graph được phát hành.channels.msteams.serviceUrl: ranh giới URL dịch vụ Bot Connector cho các thao tác chủ động của SDK. Đám mây công cộng sử dụng giá trị mặc định của SDK; hãy đặt cho GCC (https://smba.infra.gcc.teams.microsoft.com/teams), GCC High hoặc DoD. Trung Quốc chấp nhận các máy chủ kênh Azure China Bot Framework khi tham chiếu hội thoại đã lưu đến từ Teams do 21Vianet vận hành.channels.msteams.webhook.port(mặc định3978).channels.msteams.webhook.path(mặc định/api/messages).channels.msteams.dmPolicy:pairing | allowlist | open | disabled(mặc địnhpairing).channels.msteams.allowFrom: danh sách cho phép DM (khuyến nghị dùng ID đối tượng AAD). Trình hướng dẫn phân giải tên thành ID trong quá trình thiết lập khi có quyền truy cập Graph.channels.msteams.dangerouslyAllowNameMatching: nút chuyển khẩn cấp để bật lại việc đối sánh UPN/tên hiển thị có thể thay đổi và định tuyến trực tiếp theo tên nhóm/kênh.channels.msteams.textChunkLimit: kích thước đoạn văn bản gửi đi tính bằng ký tự (mặc định4000và bị giới hạn cứng ở4000bất kể giá trị cấu hình cao hơn).channels.msteams.streaming.chunkMode:length(mặc định) hoặcnewlineđể tách tại các dòng trống (ranh giới đoạn văn) trước khi chia đoạn theo độ dài.channels.msteams.mediaAllowHosts: danh sách cho phép các máy chủ tệp đính kèm gửi đến (mặc định là các miền Microsoft/Teams: Graph, SharePoint/OneDrive, Teams CDN, Bot Framework, Azure Media Services).channels.msteams.mediaAuthAllowHosts: danh sách cho phép đính kèm tiêu đề Authorization khi thử tải lại phương tiện (mặc định là các máy chủ Graph + Bot Framework).channels.msteams.graphMediaFallback: chọn sử dụng tính năng tra cứu tin nhắn Graph khi HTML của kênh/nhóm không có dấu tệp (mặc địnhfalse; xem Khôi phục tệp của kênh/nhóm).channels.msteams.mediaMaxMb: ghi đè giới hạn kích thước phương tiện theo từng kênh, tính bằng MB. Dùng giá trị dự phòngagents.defaults.mediaMaxMbkhi chưa đặt.channels.msteams.requireMention: yêu cầu @đề cập trong kênh/nhóm (mặc địnhtrue).channels.msteams.replyStyle:thread | top-level(xem Kiểu trả lời).channels.msteams.teams.<teamId>.replyStyle: ghi đè theo từng nhóm.channels.msteams.teams.<teamId>.requireMention: ghi đè theo từng nhóm.channels.msteams.teams.<teamId>.tools: các ghi đè chính sách công cụ mặc định theo từng nhóm (allow/deny/alsoAllow) được dùng khi thiếu ghi đè cho kênh.channels.msteams.teams.<teamId>.toolsBySender: các ghi đè chính sách công cụ mặc định theo từng nhóm và từng người gửi (hỗ trợ ký tự đại diện"*").channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: ghi đè theo từng kênh.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: ghi đè theo từng kênh.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: các ghi đè chính sách công cụ theo từng kênh (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: các ghi đè chính sách công cụ theo từng kênh và từng người gửi (hỗ trợ ký tự đại diện"*").toolsBySendernên sử dụng các tiền tố rõ ràng cho khóa:channel:,id:,e164:,username:,name:(các khóa cũ không có tiền tố vẫn chỉ ánh xạ tớiid:).channels.msteams.authType: loại xác thực -"secret"(mặc định) hoặc"federated".channels.msteams.certificatePath: đường dẫn tới tệp chứng chỉ PEM (xác thực liên kết + chứng chỉ).channels.msteams.certificateThumbprint: dấu vân tay chứng chỉ; được chấp nhận nhưng không bắt buộc để xác thực.channels.msteams.useManagedIdentity: bật xác thực danh tính được quản lý (chế độ liên kết).channels.msteams.managedIdentityClientId: ID máy khách cho danh tính được quản lý do người dùng gán.channels.msteams.sharePointSiteId: ID site SharePoint để tải tệp lên trong cuộc trò chuyện nhóm/kênh (xem Gửi tệp trong cuộc trò chuyện nhóm).channels.msteams.welcomeCard,channels.msteams.groupWelcomeCard,channels.msteams.promptStarters: Adaptive Card chào mừng được hiển thị trong lần liên hệ DM/nhóm đầu tiên và các nút lời nhắc đề xuất của thẻ.channels.msteams.responsePrefix: văn bản được thêm vào đầu các câu trả lời gửi đi.channels.msteams.feedbackEnabled(mặc địnhtrue),channels.msteams.feedbackReflection(mặc địnhtrue),channels.msteams.feedbackReflectionCooldownMs: phản hồi thích/không thích đối với câu trả lời và bước tiếp nối tự đánh giá khi nhận phản hồi tiêu cực.channels.msteams.sso,channels.msteams.delegatedAuth: kết nối OAuth của Bot Framework và các phạm vi Graph được ủy quyền cho luồng dựa trên SSO;sso.enabled: trueyêu cầusso.connectionName.
Định tuyến và phiên
- Khóa phiên tuân theo định dạng tác nhân tiêu chuẩn (xem /concepts/session):
- Tin nhắn trực tiếp dùng chung phiên chính (
agent:<agentId>:<mainKey>). - Tin nhắn kênh/nhóm sử dụng ID hội thoại:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Tin nhắn trực tiếp dùng chung phiên chính (
Kiểu trả lời: luồng so với bài đăng
Teams có hai kiểu giao diện người dùng cho kênh trên cùng một mô hình dữ liệu nền tảng:
Vấn đề: API Teams không cho biết kênh sử dụng kiểu giao diện người dùng nào. Nếu sử dụng sai
replyStyle:
threadtrong kênh kiểu Luồng → câu trả lời bị lồng vào nhau một cách vụng về.top-leveltrong kênh kiểu Bài đăng → câu trả lời xuất hiện dưới dạng các bài đăng cấp cao nhất riêng biệt thay vì nằm trong luồng.
replyStyle theo từng kênh dựa trên cách thiết lập kênh:
Thứ tự ưu tiên phân giải
Khi bot gửi câu trả lời vào một kênh,replyStyle được phân giải từ ghi đè cụ thể nhất xuống giá trị mặc định. Giá trị đầu tiên không phải undefined sẽ được sử dụng:
- Theo từng kênh -
channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle - Theo từng nhóm -
channels.msteams.teams.<teamId>.replyStyle - Toàn cục -
channels.msteams.replyStyle - Mặc định ngầm định - được suy ra từ
requireMention:requireMention: true→threadrequireMention: false→top-level
requireMention: false toàn cục mà không có replyStyle rõ ràng, các lượt đề cập trong kênh kiểu Bài đăng sẽ xuất hiện dưới dạng bài đăng cấp cao nhất ngay cả khi tin nhắn gửi đến là câu trả lời trong luồng. Cố định replyStyle: "thread" ở cấp toàn cục, nhóm hoặc kênh để tránh kết quả ngoài dự kiến.
Đối với lượt gửi chủ động vào hội thoại kênh đã lưu (câu trả lời cho lệnh gọi công cụ trong hàng đợi, tác nhân chạy lâu), quy tắc phân giải nhóm/kênh tương tự được áp dụng; các cuộc trò chuyện nhóm và hội thoại cá nhân (DM) luôn được phân giải thành top-level cho lượt gửi chủ động, bất kể replyStyle.
Bảo toàn ngữ cảnh luồng
KhireplyStyle: "thread" có hiệu lực và bot được @đề cập từ bên trong một luồng của kênh, OpenClaw gắn lại gốc luồng ban đầu vào tham chiếu hội thoại gửi đi (19:...@thread.tacv2;messageid=<root>) để câu trả lời được đưa vào cùng luồng. Điều này áp dụng cho cả lượt gửi trực tiếp (trong lượt) và lượt gửi chủ động được thực hiện sau khi ngữ cảnh lượt của Bot Framework đã hết hạn (ví dụ: tác nhân chạy lâu, câu trả lời cho lệnh gọi công cụ trong hàng đợi qua mcp__openclaw__message).
Gốc luồng được lấy từ threadId đã lưu trên tham chiếu hội thoại. Các tham chiếu cũ được lưu trước khi có threadId sẽ dùng giá trị dự phòng activityId (hoạt động gửi đến gần nhất đã khởi tạo hội thoại), nhờ đó các bản triển khai hiện có tiếp tục hoạt động mà không cần khởi tạo lại.
Khi replyStyle: "top-level" có hiệu lực, các tin nhắn gửi đến trong luồng của kênh được chủ ý trả lời dưới dạng bài đăng cấp cao nhất mới; không có hậu tố luồng nào được đính kèm. Đây là hành vi chính xác đối với kênh kiểu Luồng; nếu xuất hiện bài đăng cấp cao nhất trong khi mong đợi câu trả lời theo luồng, thì replyStyle đã được đặt không chính xác cho kênh đó.
Tệp đính kèm và hình ảnh
Các hạn chế hiện tại:- DM: hình ảnh và tệp đính kèm hoạt động thông qua API tệp bot của Teams.
- Kênh/nhóm: tệp đính kèm nằm trong bộ nhớ M365 (SharePoint/OneDrive). Tải trọng Webhook chỉ chứa một phần giữ chỗ HTML, không chứa byte thực tế của tệp. Cần có quyền API Graph để tải tệp đính kèm của kênh xuống.
- Đối với lượt gửi ưu tiên tệp một cách rõ ràng, hãy sử dụng
action=upload-filevớimedia/filePath/path;messagetùy chọn trở thành văn bản/nhận xét đi kèm vàfilename(hoặctitle) ghi đè tên tệp đã tải lên.
channels.msteams.mediaAllowHosts (sử dụng ["*"] để cho phép mọi máy chủ).
Tiêu đề Authorization chỉ được đính kèm cho các máy chủ trong channels.msteams.mediaAuthAllowHosts (mặc định là các máy chủ Graph + Bot Framework). Giữ danh sách này nghiêm ngặt (tránh các hậu tố đa đối tượng thuê).
Gửi tệp trong cuộc trò chuyện nhóm
Bot có thể gửi tệp trong DM bằng luồng FileConsentCard tích hợp sẵn. Gửi tệp trong cuộc trò chuyện nhóm/kênh yêu cầu thiết lập bổ sung:Tại sao cuộc trò chuyện nhóm cần SharePoint
Bot sử dụng danh tính ứng dụng, trong khi tài nguyên/me của Microsoft Graph yêu cầu người dùng đã đăng nhập. Để gửi tệp trong cuộc trò chuyện nhóm/kênh, bot tải tệp lên một site SharePoint và tạo liên kết chia sẻ.
Thiết lập
-
Thêm quyền API Graph trong Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) - tải tệp lên SharePoint.ChatMember.Read.All(Application) - quyền tối thiểu trên toàn đối tượng thuê để gửi tệp trong cuộc trò chuyện nhóm.Chat.Read.Allcũng hoạt động và đã bao gồm chức năng này khi lịch sử trò chuyện nhóm được bật. Để thay thế theo từng cuộc trò chuyện, hãy sử dụng quyền chấp thuận dành riêng cho tài nguyênChatMember.Read.Chat.
- Cấp sự chấp thuận của quản trị viên cho đối tượng thuê.
-
Lấy ID site SharePoint:
-
Cấu hình OpenClaw:
Hành vi chia sẻ
Chia sẻ theo người dùng an toàn hơn vì chỉ những người tham gia trò chuyện mới có thể truy cập tệp. OpenClaw yêu cầu tra cứu thành viên thành công đối với trò chuyện nhóm; khi hết thời gian chờ, xảy ra lỗi truyền tải, kết quả trống hoặc Graph API từ chối, thao tác gửi sẽ thất bại thay vì mở rộng quyền truy cập cho toàn tổ chức.
Hành vi dự phòng
Vị trí lưu trữ tệp
Các tệp đã tải lên được lưu trong thư mục/OpenClawShared/ thuộc thư viện tài liệu mặc định của site SharePoint đã cấu hình.
Cuộc thăm dò ý kiến (Adaptive Cards)
OpenClaw gửi các cuộc thăm dò ý kiến trên Teams dưới dạng Adaptive Cards (Teams không có API thăm dò ý kiến gốc).- CLI:
openclaw message poll --channel msteams --target conversation:<id> --poll-question "..." --poll-option "..." --poll-option "...". - Gateway ghi nhận phiếu bầu trong SQLite trạng thái Plugin của OpenClaw tại
state/openclaw.sqlite. - Các tệp
msteams-polls.jsonhiện có được nhập bởiopenclaw doctor --fix, không phải bởi Plugin đang chạy. - Gateway phải duy trì trực tuyến để ghi nhận phiếu bầu.
- Các cuộc thăm dò ý kiến không tự động đăng bản tóm tắt kết quả và hiện chưa có CLI kết quả thăm dò ý kiến.
Thẻ trình bày
Gửi payload trình bày ngữ nghĩa đến người dùng hoặc cuộc trò chuyện Teams bằng công cụmessage, CLI hoặc cơ chế gửi phản hồi thông thường. OpenClaw kết xuất chúng thành Teams Adaptive Cards từ hợp đồng trình bày chung.
Tham số presentation chấp nhận các khối ngữ nghĩa. Khi cung cấp presentation, văn bản tin nhắn là tùy chọn. Các nút được kết xuất thành hành động gửi hoặc URL của Adaptive Card. Menu chọn không phải thành phần gốc trong bộ kết xuất Teams, vì vậy OpenClaw chuyển chúng thành văn bản dễ đọc trước khi gửi.
Công cụ agent:
Định dạng đích
Các đích MSTeams sử dụng tiền tố để phân biệt người dùng và cuộc trò chuyện:
Ví dụ CLI:
Nếu không có tiền tố
user:, tên sẽ mặc định được phân giải thành nhóm hoặc nhóm Teams. Luôn sử dụng user: khi nhắm đến người dùng theo tên hiển thị.Nhắn tin chủ động
- Chỉ có thể gửi tin nhắn chủ động sau khi người dùng đã tương tác, vì OpenClaw lưu tham chiếu cuộc trò chuyện tại thời điểm đó.
- Xem /gateway/configuration để biết
dmPolicyvà cơ chế kiểm soát bằng danh sách cho phép.
ID nhóm Teams và kênh (Lỗi thường gặp)
Tham số truy vấngroupId trong URL Teams KHÔNG phải là ID nhóm Teams dùng để cấu hình. Thay vào đó, hãy trích xuất ID từ đường dẫn URL:
URL nhóm Teams:
- Khóa nhóm Teams = phân đoạn đường dẫn sau
/team/(đã giải mã URL, ví dụ:19:Bk4j...@thread.tacv2; các tenant cũ hơn có thể hiển thị@thread.skype, giá trị này cũng hợp lệ). - Khóa kênh = phân đoạn đường dẫn sau
/channel/(đã giải mã URL). - Bỏ qua tham số truy vấn
groupIdkhi định tuyến OpenClaw. Đây là ID nhóm Microsoft Entra, không phải ID cuộc trò chuyện Bot Framework được sử dụng trong các hoạt động Teams đến.
Kênh riêng tư
Bot chỉ được hỗ trợ hạn chế trong các kênh riêng tư:
Giải pháp thay thế nếu kênh riêng tư không hoạt động:
- Sử dụng kênh tiêu chuẩn để tương tác với bot.
- Sử dụng tin nhắn trực tiếp; người dùng luôn có thể nhắn tin trực tiếp cho bot.
- Sử dụng Graph API để truy cập lịch sử (yêu cầu
ChannelMessage.Read.All).
Khắc phục sự cố
Các sự cố thường gặp
- Hình ảnh không hiển thị trong kênh: thiếu quyền Graph hoặc sự đồng ý của quản trị viên. Cài đặt lại ứng dụng Teams, sau đó thoát hoàn toàn và mở lại Teams.
- Không có phản hồi trong kênh: theo mặc định, bắt buộc phải đề cập; đặt
channels.msteams.requireMention=falsehoặc cấu hình theo từng nhóm Teams/kênh. - Phiên bản không khớp (Teams vẫn hiển thị manifest cũ): xóa rồi thêm lại ứng dụng và thoát hoàn toàn khỏi Teams để làm mới.
- Webhook trả về 401 Unauthorized: đây là hành vi dự kiến khi kiểm thử thủ công mà không có Azure JWT; điều đó có nghĩa là có thể truy cập endpoint nhưng xác thực thất bại. Sử dụng Azure Web Chat để kiểm thử đúng cách.
Lỗi tải manifest lên
- “Icon file cannot be empty”: manifest tham chiếu đến các tệp biểu tượng có kích thước 0 byte. Tạo các biểu tượng PNG hợp lệ (32x32 cho
outline.png, 192x192 chocolor.png). - “webApplicationInfo.Id already in use”: ứng dụng vẫn được cài đặt trong một nhóm Teams/cuộc trò chuyện khác. Trước tiên, hãy tìm và gỡ cài đặt ứng dụng đó hoặc chờ 5-10 phút để thay đổi được truyền bá.
- “Something went wrong” khi tải lên: thay vào đó, hãy tải lên qua https://admin.teams.microsoft.com, mở DevTools của trình duyệt (F12) → thẻ Network và kiểm tra nội dung phản hồi để xem lỗi thực tế.
- Tải ngoài thất bại: thử “Upload an app to your org’s app catalog” thay vì “Upload a custom app”; cách này thường bỏ qua các hạn chế tải ngoài.
Quyền RSC không hoạt động
- Xác minh
webApplicationInfo.idkhớp chính xác với App ID của bot. - Tải lại ứng dụng lên và cài đặt lại trong nhóm Teams/cuộc trò chuyện.
- Kiểm tra xem quản trị viên tổ chức có chặn quyền RSC hay không.
- Xác nhận bạn đang sử dụng đúng phạm vi:
ChannelMessage.Read.Groupcho nhóm Teams,ChatMessage.Read.Chatcho trò chuyện nhóm.
Tài liệu tham khảo
- Tạo Azure Bot - hướng dẫn thiết lập Azure Bot
- Teams Developer Portal - tạo/quản lý ứng dụng Teams
- Lược đồ manifest ứng dụng Teams
- Nhận tin nhắn kênh bằng RSC
- Tài liệu tham khảo về quyền RSC
- Xử lý tệp của bot Teams (kênh/nhóm yêu cầu Graph)
- Nhắn tin chủ động
- @microsoft/teams.cli - CLI Teams để quản lý bot
Liên quan
- Tổng quan về kênh - tất cả các kênh được hỗ trợ
- Ghép nối - xác thực DM và luồng ghép nối
- Nhóm - hành vi trò chuyện nhóm và cơ chế kiểm soát bằng lượt đề cập
- Định tuyến kênh - định tuyến phiên cho tin nhắn
- Bảo mật - mô hình truy cập và tăng cường bảo mật