Microsoft Teams
„Porzućcie wszelką nadzieję, wy, którzy tu wchodzicie.”Zaktualizowano: 2026-03-25 Stan: obsługiwane są tekst oraz załączniki DM; wysyłanie plików na kanałach/w grupach wymaga
sharePointSiteId i uprawnień Graph (zobacz Wysyłanie plików w czatach grupowych). Ankiety są wysyłane przez Adaptive Cards. Akcje wiadomości udostępniają jawne upload-file dla wysyłek rozpoczynających się od pliku.
Bundled plugin
Microsoft Teams jest dostarczany jako bundled plugin w bieżących wydaniach OpenClaw, więc w standardowej paczkowanej kompilacji nie jest wymagana osobna instalacja. Jeśli używasz starszej kompilacji lub niestandardowej instalacji bez dołączonego Teams, zainstaluj go ręcznie:Szybka konfiguracja (dla początkujących)
- Upewnij się, że plugin Microsoft Teams jest dostępny.
- Bieżące paczkowane wydania OpenClaw zawierają go już domyślnie.
- Starsze/niestandardowe instalacje mogą dodać go ręcznie za pomocą powyższych poleceń.
- Utwórz Azure Bot (App ID + client secret + tenant ID).
- Skonfiguruj OpenClaw przy użyciu tych poświadczeń.
- Udostępnij
/api/messages(domyślnie port 3978) przez publiczny URL lub tunel. - Zainstaluj pakiet aplikacji Teams i uruchom gateway.
channels.msteams.groupPolicy: "allowlist"). Aby zezwolić na odpowiedzi w grupach, ustaw channels.msteams.groupAllowFrom (lub użyj groupPolicy: "open", aby zezwolić dowolnemu członkowi, z bramkowaniem wzmianką).
Cele
- Rozmawiaj z OpenClaw przez Teams DM, czaty grupowe lub kanały.
- Zachowaj deterministyczny routing: odpowiedzi zawsze wracają do kanału, z którego przyszły.
- Domyślnie stosuj bezpieczne zachowanie kanałów (wzmianki są wymagane, chyba że skonfigurowano inaczej).
Zapisy konfiguracji
Domyślnie Microsoft Teams może zapisywać aktualizacje konfiguracji wywołane przez/config set|unset (wymaga commands.config: true).
Wyłącz za pomocą:
Kontrola dostępu (DM + grupy)
Dostęp do DM- Domyślnie:
channels.msteams.dmPolicy = "pairing". Nadawcy nieznani systemowi są ignorowani do momentu zatwierdzenia. channels.msteams.allowFrompowinno używać stabilnych identyfikatorów obiektów AAD.- UPN-y/nazwy wyświetlane są zmienne; bezpośrednie dopasowywanie jest domyślnie wyłączone i włączane tylko przez
channels.msteams.dangerouslyAllowNameMatching: true. - Kreator może rozwiązywać nazwy do identyfikatorów przez Microsoft Graph, jeśli poświadczenia na to pozwalają.
- Domyślnie:
channels.msteams.groupPolicy = "allowlist"(zablokowane, dopóki nie dodaszgroupAllowFrom). Użyjchannels.defaults.groupPolicy, aby zastąpić domyślną wartość, gdy nie jest ustawiona. channels.msteams.groupAllowFromokreśla, którzy nadawcy mogą wyzwalać działania w czatach grupowych/kanałach (z fallbackiem dochannels.msteams.allowFrom).- Ustaw
groupPolicy: "open", aby zezwolić dowolnemu członkowi (nadal z domyślnym bramkowaniem wzmianką). - Aby nie zezwalać na żadne kanały, ustaw
channels.msteams.groupPolicy: "disabled".
- Ogranicz odpowiedzi w grupach/kanałach, podając zespoły i kanały w
channels.msteams.teams. - Klucze powinny używać stabilnych identyfikatorów zespołów i identyfikatorów konwersacji kanałów.
- Gdy
groupPolicy="allowlist"i lista dozwolonych zespołów jest obecna, akceptowane są tylko wymienione zespoły/kanały (z bramkowaniem wzmianką). - Kreator konfiguracji akceptuje wpisy
Team/Channeli zapisuje je za Ciebie. - Przy uruchomieniu OpenClaw rozwiązuje nazwy zespołów/kanałów oraz nazwy na liście dozwolonych użytkowników do identyfikatorów (gdy pozwalają na to uprawnienia Graph)
i zapisuje mapowanie w logach; nierozwiązane nazwy zespołów/kanałów są zachowywane w podanej postaci, ale domyślnie ignorowane przy routingu, chyba że włączono
channels.msteams.dangerouslyAllowNameMatching: true.
Jak to działa
- Upewnij się, że plugin Microsoft Teams jest dostępny.
- Bieżące paczkowane wydania OpenClaw zawierają go już domyślnie.
- Starsze/niestandardowe instalacje mogą dodać go ręcznie za pomocą powyższych poleceń.
- Utwórz Azure Bot (App ID + secret + tenant ID).
- Zbuduj pakiet aplikacji Teams, który odwołuje się do bota i zawiera poniższe uprawnienia RSC.
- Prześlij/zainstaluj aplikację Teams w zespole (lub w zakresie osobistym dla DM).
- Skonfiguruj
msteamsw~/.openclaw/openclaw.json(lub przez zmienne środowiskowe) i uruchom gateway. - Gateway domyślnie nasłuchuje ruchu webhook Bot Framework na
/api/messages.
Konfiguracja Azure Bot (wymagania wstępne)
Przed skonfigurowaniem OpenClaw musisz utworzyć zasób Azure Bot.Krok 1: Utwórz Azure Bot
- Przejdź do Create Azure Bot
-
Wypełnij kartę Basics:
Pole Wartość Bot handle Nazwa Twojego bota, np. openclaw-msteams(musi być unikalna)Subscription Wybierz swoją subskrypcję Azure Resource group Utwórz nową lub użyj istniejącej Pricing tier Free do developmentu/testów Type of App Single Tenant (zalecane - zobacz uwagę poniżej) Creation type Create new Microsoft App ID
Informacja o wycofaniu: Tworzenie nowych botów wielodzierżawowych zostało wycofane po 2025-07-31. Dla nowych botów używaj Single Tenant.
- Kliknij Review + create → Create (poczekaj ~1-2 minuty)
Krok 2: Pobierz poświadczenia
- Przejdź do zasobu Azure Bot → Configuration
- Skopiuj Microsoft App ID → to jest Twoje
appId - Kliknij Manage Password → przejdź do rejestracji aplikacji
- W sekcji Certificates & secrets → New client secret → skopiuj Value → to jest Twoje
appPassword - Przejdź do Overview → skopiuj Directory (tenant) ID → to jest Twoje
tenantId
Krok 3: Skonfiguruj endpoint wiadomości
- W Azure Bot → Configuration
- Ustaw Messaging endpoint na URL webhooka:
- Produkcja:
https://your-domain.com/api/messages - Lokalny development: użyj tunelu (zobacz poniżej Local Development)
- Produkcja:
Krok 4: Włącz kanał Teams
- W Azure Bot → Channels
- Kliknij Microsoft Teams → Configure → Save
- Zaakceptuj Terms of Service
Uwierzytelnianie federacyjne (certyfikat + managed identity)
Dodano w 2026.3.24W środowiskach produkcyjnych OpenClaw obsługuje uwierzytelnianie federacyjne jako bezpieczniejszą alternatywę dla client secret. Dostępne są dwie metody:
Opcja A: Uwierzytelnianie oparte na certyfikacie
Użyj certyfikatu PEM zarejestrowanego w rejestracji aplikacji Entra ID. Konfiguracja:- Wygeneruj lub uzyskaj certyfikat (format PEM z kluczem prywatnym).
- W Entra ID → App Registration → Certificates & secrets → Certificates → prześlij certyfikat publiczny.
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
Opcja B: Azure Managed Identity
Użyj Azure Managed Identity do uwierzytelniania bez hasła. To idealne rozwiązanie dla wdrożeń na infrastrukturze Azure (AKS, App Service, maszyny wirtualne Azure), gdzie dostępna jest managed identity. Jak to działa:- Pod/VM bota ma managed identity (przypisaną przez system lub użytkownika).
- Federated identity credential łączy managed identity z rejestracją aplikacji Entra ID.
- W czasie działania OpenClaw używa
@azure/identitydo pobierania tokenów z endpointu Azure IMDS (169.254.169.254). - Token jest przekazywany do SDK Teams na potrzeby uwierzytelniania bota.
- Infrastruktura Azure z włączoną managed identity (AKS workload identity, App Service, VM)
- Utworzona federated identity credential w rejestracji aplikacji Entra ID
- Dostęp sieciowy do IMDS (
169.254.169.254:80) z poda/VM
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(tylko dla tożsamości przypisanej przez użytkownika)
Konfiguracja AKS Workload Identity
Dla wdrożeń AKS używających workload identity:- Włącz workload identity w klastrze AKS.
-
Utwórz federated identity credential w rejestracji aplikacji Entra ID:
-
Dodaj adnotację do konta usługi Kubernetes z identyfikatorem klienta aplikacji:
-
Dodaj etykietę do poda dla wstrzykiwania workload identity:
-
Zapewnij dostęp sieciowy do IMDS (
169.254.169.254) — jeśli używasz NetworkPolicy, dodaj regułę egress zezwalającą na ruch do169.254.169.254/32na porcie 80.
Porównanie typów uwierzytelniania
| Metoda | Konfiguracja | Zalety | Wady |
|---|---|---|---|
| Client secret | appPassword | Prosta konfiguracja | Wymaga rotacji sekretu, mniejsze bezpieczeństwo |
| Certificate | authType: "federated" + certificatePath | Brak współdzielonego sekretu w sieci | Narzut związany z zarządzaniem certyfikatami |
| Managed Identity | authType: "federated" + useManagedIdentity | Bez haseł, brak sekretów do zarządzania | Wymagana infrastruktura Azure |
authType nie jest ustawione, OpenClaw domyślnie używa uwierzytelniania client secret. Istniejące konfiguracje nadal działają bez zmian.
Local Development (tunelowanie)
Teams nie może połączyć się zlocalhost. Do lokalnego developmentu użyj tunelu:
Opcja A: ngrok
Teams Developer Portal (alternatywa)
Zamiast ręcznie tworzyć ZIP z manifestem, możesz użyć Teams Developer Portal:- Kliknij + New app
- Uzupełnij podstawowe informacje (nazwa, opis, informacje o deweloperze)
- Przejdź do App features → Bot
- Wybierz Enter a bot ID manually i wklej App ID swojego Azure Bot
- Zaznacz zakresy: Personal, Team, Group Chat
- Kliknij Distribute → Download app package
- W Teams: Apps → Manage your apps → Upload a custom app → wybierz plik ZIP
Testowanie bota
Opcja A: Azure Web Chat (najpierw zweryfikuj webhook)- W Azure Portal → zasób Azure Bot → Test in Web Chat
- Wyślij wiadomość — powinieneś zobaczyć odpowiedź
- To potwierdza, że endpoint webhooka działa przed konfiguracją Teams
- Zainstaluj aplikację Teams (sideload lub katalog organizacji)
- Znajdź bota w Teams i wyślij DM
- Sprawdź logi gateway pod kątem przychodzącej aktywności
Konfiguracja (minimalna, tylko tekst)
-
Upewnij się, że plugin Microsoft Teams jest dostępny
- Bieżące paczkowane wydania OpenClaw zawierają go już domyślnie.
- Starsze/niestandardowe instalacje mogą dodać go ręcznie:
- Z npm:
openclaw plugins install @openclaw/msteams - Z lokalnego checkoutu:
openclaw plugins install ./path/to/local/msteams-plugin
- Z npm:
-
Rejestracja bota
- Utwórz Azure Bot (zobacz wyżej) i zanotuj:
- App ID
- Client secret (App password)
- Tenant ID (single-tenant)
- Utwórz Azure Bot (zobacz wyżej) i zanotuj:
-
Manifest aplikacji Teams
- Dodaj wpis
botzbotId = <App ID>. - Zakresy:
personal,team,groupChat. supportsFiles: true(wymagane do obsługi plików w zakresie osobistym).- Dodaj uprawnienia RSC (poniżej).
- Utwórz ikony:
outline.png(32x32) icolor.png(192x192). - Spakuj wszystkie trzy pliki razem:
manifest.json,outline.png,color.png.
- Dodaj wpis
-
Skonfiguruj OpenClaw
Możesz też użyć zmiennych środowiskowych zamiast kluczy konfiguracji:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_IDMSTEAMS_AUTH_TYPE(opcjonalnie:"secret"lub"federated")MSTEAMS_CERTIFICATE_PATH(federated + certyfikat)MSTEAMS_CERTIFICATE_THUMBPRINT(opcjonalne, niewymagane do uwierzytelniania)MSTEAMS_USE_MANAGED_IDENTITY(federated + managed identity)MSTEAMS_MANAGED_IDENTITY_CLIENT_ID(tylko dla managed identity przypisanej przez użytkownika)
-
Endpoint bota
- Ustaw Azure Bot Messaging Endpoint na:
https://<host>:3978/api/messages(lub wybraną ścieżkę/port).
- Ustaw Azure Bot Messaging Endpoint na:
-
Uruchom gateway
- Kanał Teams uruchamia się automatycznie, gdy bundled plugin lub ręcznie zainstalowany plugin jest dostępny, a konfiguracja
msteamszawiera poświadczenia.
- Kanał Teams uruchamia się automatycznie, gdy bundled plugin lub ręcznie zainstalowany plugin jest dostępny, a konfiguracja
Akcja informacji o członku
OpenClaw udostępnia opartą na Graph akcjęmember-info dla Microsoft Teams, dzięki czemu agenci i automatyzacje mogą bezpośrednio z Microsoft Graph rozwiązywać szczegóły członków kanału (nazwa wyświetlana, e-mail, rola).
Wymagania:
- Uprawnienie RSC
Member.Read.Group(już obecne w zalecanym manifeście) - Dla wyszukiwań między zespołami: uprawnienie aplikacyjne Graph
User.Read.Allz zgodą administratora
channels.msteams.actions.memberInfo (domyślnie: włączona, gdy dostępne są poświadczenia Graph).
Kontekst historii
channels.msteams.historyLimitokreśla, ile ostatnich wiadomości z kanału/grupy jest opakowywanych do promptu.- Z fallbackiem do
messages.groupChat.historyLimit. Ustaw0, aby wyłączyć (domyślnie 50). - Pobierana historia wątku jest filtrowana przez listy dozwolonych nadawców (
allowFrom/groupAllowFrom), więc seedowanie kontekstu wątku obejmuje tylko wiadomości od dozwolonych nadawców. - Cytowany kontekst załączników (
ReplyTo*pochodzący z HTML odpowiedzi Teams) jest obecnie przekazywany w otrzymanej postaci. - Innymi słowy, listy dozwolonych nadawców kontrolują, kto może wyzwolić agenta; obecnie filtrowane są tylko określone uzupełniające ścieżki kontekstu.
- Historię DM można ograniczyć przez
channels.msteams.dmHistoryLimit(tury użytkownika). Nadpisania per użytkownik:channels.msteams.dms["<user_id>"].historyLimit.
Bieżące uprawnienia Teams RSC (manifest)
To są istniejące uprawnienia resourceSpecific w manifeście naszej aplikacji Teams. Obowiązują tylko wewnątrz zespołu/czatu, w którym aplikacja jest zainstalowana. Dla kanałów (zakres zespołu):ChannelMessage.Read.Group(Application) - odbieranie wszystkich wiadomości kanałowych bez @mentionChannelMessage.Send.Group(Application)Member.Read.Group(Application)Owner.Read.Group(Application)ChannelSettings.Read.Group(Application)TeamMember.Read.Group(Application)TeamSettings.Read.Group(Application)
ChatMessage.Read.Chat(Application) - odbieranie wszystkich wiadomości czatu grupowego bez @mention
Przykładowy manifest Teams (z redakcją)
Minimalny, poprawny przykład z wymaganymi polami. Zastąp identyfikatory i URL-e.Zastrzeżenia dotyczące manifestu (pola wymagane)
bots[].botIdmusi odpowiadać Azure Bot App ID.webApplicationInfo.idmusi odpowiadać Azure Bot App ID.bots[].scopesmusi zawierać powierzchnie, których planujesz używać (personal,team,groupChat).bots[].supportsFiles: truejest wymagane do obsługi plików w zakresie osobistym.authorization.permissions.resourceSpecificmusi zawierać uprawnienia odczytu/wysyłania kanałowego, jeśli chcesz obsługiwać ruch kanałowy.
Aktualizacja istniejącej aplikacji
Aby zaktualizować już zainstalowaną aplikację Teams (np. dodać uprawnienia RSC):- Zaktualizuj
manifest.json, dodając nowe ustawienia - Zwiększ pole
version(np.1.0.0→1.1.0) - Ponownie spakuj ZIP z manifestem i ikonami (
manifest.json,outline.png,color.png) - Prześlij nowy plik zip:
- Opcja A (Teams Admin Center): Teams Admin Center → Teams apps → Manage apps → znajdź swoją aplikację → Upload new version
- Opcja B (Sideload): W Teams → Apps → Manage your apps → Upload a custom app
- Dla kanałów zespołu: ponownie zainstaluj aplikację w każdym zespole, aby nowe uprawnienia zaczęły obowiązywać
- Całkowicie zamknij i uruchom ponownie Teams (nie tylko zamknij okno), aby wyczyścić metadane aplikacji z cache
Możliwości: tylko RSC vs Graph
Z samym Teams RSC (aplikacja zainstalowana, bez uprawnień API Graph)
Działa:- Odczyt tekstu wiadomości kanałowych.
- Wysyłanie tekstu wiadomości kanałowych.
- Odbieranie załączników plikowych w zakresie osobistym (DM).
- Zawartość obrazów lub plików w kanałach/grupach (payload zawiera tylko stub HTML).
- Pobieranie załączników przechowywanych w SharePoint/OneDrive.
- Odczyt historii wiadomości (poza wydarzeniem webhooka na żywo).
Z Teams RSC + uprawnieniami aplikacyjnymi Microsoft Graph
Dodaje:- Pobieranie hostowanych treści (obrazy wklejane do wiadomości).
- Pobieranie załączników plikowych przechowywanych w SharePoint/OneDrive.
- Odczyt historii wiadomości kanału/czatu przez Graph.
RSC vs Graph API
| Możliwość | Uprawnienia RSC | Graph API |
|---|---|---|
| Wiadomości w czasie rzeczywistym | Tak (przez webhook) | Nie (tylko polling) |
| Wiadomości historyczne | Nie | Tak (można odpytywać historię) |
| Złożoność konfiguracji | Tylko manifest aplikacji | Wymaga zgody administratora + przepływu tokenów |
| Działa offline | Nie (musi działać) | Tak (zapytanie możliwe w dowolnym momencie) |
ChannelMessage.Read.All (wymaga zgody administratora).
Media + historia z Graph (wymagane dla kanałów)
Jeśli potrzebujesz obrazów/plików w kanałach lub chcesz pobierać historię wiadomości, musisz włączyć uprawnienia Microsoft Graph i udzielić zgody administratora.- W Entra ID (Azure AD) App Registration dodaj uprawnienia aplikacyjne Microsoft Graph:
ChannelMessage.Read.All(załączniki kanałowe + historia)Chat.Read.AlllubChatMessage.Read.All(czaty grupowe)
- Udziel zgody administratora dla tenantu.
- Zwiększ wersję manifestu aplikacji Teams, prześlij go ponownie i zainstaluj aplikację ponownie w Teams.
- Całkowicie zamknij i uruchom ponownie Teams, aby wyczyścić metadane aplikacji z cache.
User.Read.All i udziel zgody administratora.
Znane ograniczenia
Limity czasu webhooka
Teams dostarcza wiadomości przez webhook HTTP. Jeśli przetwarzanie trwa zbyt długo (np. powolne odpowiedzi LLM), możesz zobaczyć:- przekroczenia czasu gateway
- ponawianie wiadomości przez Teams (powodujące duplikaty)
- porzucone odpowiedzi
Formatowanie
Markdown Teams jest bardziej ograniczony niż w Slack lub Discord:- Działa podstawowe formatowanie: bold, italic,
code, linki - Złożony markdown (tabele, zagnieżdżone listy) może renderować się niepoprawnie
- Adaptive Cards są obsługiwane dla ankiet i dowolnych wysyłek kart (zobacz poniżej)
Konfiguracja
Kluczowe ustawienia (wspólne wzorce kanałów znajdziesz w/gateway/configuration):
channels.msteams.enabled: włącza/wyłącza kanał.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: poświadczenia bota.channels.msteams.webhook.port(domyślnie3978)channels.msteams.webhook.path(domyślnie/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(domyślnie: pairing)channels.msteams.allowFrom: lista dozwolonych dla DM (zalecane identyfikatory obiektów AAD). Kreator rozwiązuje nazwy do identyfikatorów podczas konfiguracji, gdy dostęp do Graph jest dostępny.channels.msteams.dangerouslyAllowNameMatching: przełącznik awaryjny przywracający dopasowywanie po zmiennych UPN/nazwach wyświetlanych oraz bezpośredni routing po nazwach zespołów/kanałów.channels.msteams.textChunkLimit: rozmiar fragmentów tekstu wychodzącego.channels.msteams.chunkMode:length(domyślnie) lubnewline, aby dzielić po pustych wierszach (granice akapitów) przed dzieleniem według długości.channels.msteams.mediaAllowHosts: lista dozwolonych hostów dla przychodzących załączników (domyślnie domeny Microsoft/Teams).channels.msteams.mediaAuthAllowHosts: lista dozwolonych hostów do dołączania nagłówków Authorization przy ponownych próbach pobrania mediów (domyślnie hosty Graph + Bot Framework).channels.msteams.requireMention: wymaga @mention w kanałach/grupach (domyślnie true).channels.msteams.replyStyle:thread | top-level(zobacz Styl odpowiedzi).channels.msteams.teams.<teamId>.replyStyle: nadpisanie per zespół.channels.msteams.teams.<teamId>.requireMention: nadpisanie per zespół.channels.msteams.teams.<teamId>.tools: domyślne nadpisania polityki narzędzi per zespół (allow/deny/alsoAllow) używane, gdy brakuje nadpisania kanału.channels.msteams.teams.<teamId>.toolsBySender: domyślne nadpisania polityki narzędzi per zespół i nadawcę (obsługiwany wildcard"*").channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: nadpisanie per kanał.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: nadpisanie per kanał.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: nadpisania polityki narzędzi per kanał (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: nadpisania polityki narzędzi per kanał i nadawcę (obsługiwany wildcard"*").- Klucze
toolsBySenderpowinny używać jawnych prefiksów:id:,e164:,username:,name:(starsze klucze bez prefiksu nadal mapują się tylko doid:). channels.msteams.actions.memberInfo: włącza lub wyłącza opartą na Graph akcję informacji o członku (domyślnie: włączona, gdy dostępne są poświadczenia Graph).channels.msteams.authType: typ uwierzytelniania —"secret"(domyślnie) lub"federated".channels.msteams.certificatePath: ścieżka do pliku certyfikatu PEM (federated + uwierzytelnianie certyfikatem).channels.msteams.certificateThumbprint: odcisk palca certyfikatu (opcjonalny, niewymagany do uwierzytelniania).channels.msteams.useManagedIdentity: włącza uwierzytelnianie managed identity (tryb federated).channels.msteams.managedIdentityClientId: identyfikator klienta dla managed identity przypisanej przez użytkownika.channels.msteams.sharePointSiteId: identyfikator witryny SharePoint dla wysyłania plików w czatach grupowych/kanałach (zobacz Wysyłanie plików w czatach grupowych).
Routing i sesje
- Klucze sesji są zgodne ze standardowym formatem agenta (zobacz /concepts/session):
- Wiadomości bezpośrednie współdzielą główną sesję (
agent:<agentId>:<mainKey>). - Wiadomości kanałowe/grupowe używają identyfikatora konwersacji:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Wiadomości bezpośrednie współdzielą główną sesję (
Styl odpowiedzi: wątki vs posty
Teams niedawno wprowadził dwa style interfejsu kanałów nad tym samym bazowym modelem danych:| Styl | Opis | Zalecane replyStyle |
|---|---|---|
| Posts (klasyczny) | Wiadomości pojawiają się jako karty z odpowiedziami we wątku pod spodem | thread (domyślnie) |
| Threads (jak Slack) | Wiadomości płyną liniowo, bardziej jak w Slack | top-level |
replyStyle:
threadw kanale w stylu Threads → odpowiedzi pojawiają się niezręcznie zagnieżdżonetop-levelw kanale w stylu Posts → odpowiedzi pojawiają się jako osobne posty najwyższego poziomu zamiast we wątku
replyStyle per kanał na podstawie sposobu skonfigurowania kanału:
Załączniki i obrazy
Obecne ograniczenia:- DM-y: obrazy i załączniki plikowe działają przez interfejsy API plików bota Teams.
- Kanały/grupy: załączniki są przechowywane w M365 (SharePoint/OneDrive). Payload webhooka zawiera tylko stub HTML, a nie rzeczywiste bajty pliku. Do pobierania załączników kanałowych wymagane są uprawnienia Graph API.
- Dla jawnych wysyłek rozpoczynających się od pliku użyj
action=upload-filezmedia/filePath/path; opcjonalnemessagestaje się dołączonym tekstem/komentarzem, afilenamenadpisuje nazwę przesyłanego pliku.
channels.msteams.mediaAllowHosts (użyj ["*"], aby zezwolić na dowolny host).
Nagłówki Authorization są dołączane tylko dla hostów z channels.msteams.mediaAuthAllowHosts (domyślnie hosty Graph + Bot Framework). Utrzymuj tę listę restrykcyjną (unikaj sufiksów wielodzierżawowych).
Wysyłanie plików w czatach grupowych
Boty mogą wysyłać pliki w DM-ach przy użyciu przepływu FileConsentCard (wbudowane). Jednak wysyłanie plików w czatach grupowych/kanałach wymaga dodatkowej konfiguracji:| Kontekst | Sposób wysyłania plików | Wymagana konfiguracja |
|---|---|---|
| DM-y | FileConsentCard → użytkownik akceptuje → bot przesyła plik | Działa od razu |
| Czaty grupowe/kanały | Przesłanie do SharePoint → udostępnienie linku | Wymaga sharePointSiteId + uprawnień Graph |
| Obrazy (dowolny kontekst) | Inline zakodowane w Base64 | Działa od razu |
Dlaczego czaty grupowe wymagają SharePoint
Boty nie mają osobistego dysku OneDrive (endpoint Graph API/me/drive nie działa dla tożsamości aplikacyjnych). Aby wysyłać pliki w czatach grupowych/kanałach, bot przesyła je do witryny SharePoint i tworzy link do udostępnienia.
Konfiguracja
-
Dodaj uprawnienia Graph API w Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) - przesyłanie plików do SharePointChat.Read.All(Application) - opcjonalne, włącza linki udostępniania per użytkownik
- Udziel zgody administratora dla tenantu.
-
Pobierz identyfikator witryny SharePoint:
-
Skonfiguruj OpenClaw:
Zachowanie udostępniania
| Uprawnienie | Zachowanie udostępniania |
|---|---|
Sites.ReadWrite.All tylko | Link udostępniania dla całej organizacji (dostępny dla każdego w organizacji) |
Sites.ReadWrite.All + Chat.Read.All | Link udostępniania per użytkownik (dostępny tylko dla członków czatu) |
Chat.Read.All, bot wraca do udostępniania dla całej organizacji.
Zachowanie fallback
| Scenariusz | Wynik |
|---|---|
Czat grupowy + plik + skonfigurowane sharePointSiteId | Przesłanie do SharePoint, wysłanie linku udostępniania |
Czat grupowy + plik + brak sharePointSiteId | Próba przesłania do OneDrive (może się nie udać), wysłanie tylko tekstu |
| Czat osobisty + plik | Przepływ FileConsentCard (działa bez SharePoint) |
| Dowolny kontekst + obraz | Inline zakodowane w Base64 (działa bez SharePoint) |
Lokalizacja przechowywania plików
Przesłane pliki są przechowywane w folderze/OpenClawShared/ w domyślnej bibliotece dokumentów skonfigurowanej witryny SharePoint.
Ankiety (Adaptive Cards)
OpenClaw wysyła ankiety Teams jako Adaptive Cards (nie ma natywnego API ankiet Teams).- CLI:
openclaw message poll --channel msteams --target conversation:<id> ... - Głosy są zapisywane przez gateway w
~/.openclaw/msteams-polls.json. - Gateway musi pozostać online, aby rejestrować głosy.
- Ankiety nie publikują jeszcze automatycznie podsumowań wyników (w razie potrzeby sprawdź plik magazynu).
Adaptive Cards (dowolne)
Wysyłaj dowolny JSON Adaptive Card do użytkowników lub konwersacji Teams przy użyciu narzędziamessage lub CLI.
Parametr card akceptuje obiekt JSON Adaptive Card. Gdy card jest podane, tekst wiadomości jest opcjonalny.
Narzędzie agenta:
Formaty celu
Cele MSTeams używają prefiksów do rozróżniania użytkowników i konwersacji:| Typ celu | Format | Przykład |
|---|---|---|
| Użytkownik (według ID) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| Użytkownik (według nazwy) | user:<display-name> | user:John Smith (wymaga Graph API) |
| Grupa/kanał | conversation:<conversation-id> | conversation:19:abc123...@thread.tacv2 |
| Grupa/kanał (raw) | <conversation-id> | 19:abc123...@thread.tacv2 (jeśli zawiera @thread) |
user: nazwy domyślnie trafiają do rozwiązywania grup/zespołów. Zawsze używaj user:, gdy kierujesz wiadomości do osób po nazwie wyświetlanej.
Wiadomości proaktywne
- Wiadomości proaktywne są możliwe dopiero po interakcji użytkownika, ponieważ dopiero wtedy zapisujemy referencje konwersacji.
- Zobacz
/gateway/configuration, aby poznaćdmPolicyi kontrolę przez listy dozwolonych.
Identyfikatory zespołów i kanałów (częsty problem)
Parametr zapytaniagroupId w URL-ach Teams NIE jest identyfikatorem zespołu używanym do konfiguracji. Wyodrębnij identyfikatory ze ścieżki URL:
URL zespołu:
- Team ID = segment ścieżki po
/team/(po zdekodowaniu URL, np.19:Bk4j...@thread.tacv2) - Channel ID = segment ścieżki po
/channel/(po zdekodowaniu URL) - Ignoruj parametr zapytania
groupId
Kanały prywatne
Boty mają ograniczoną obsługę w kanałach prywatnych:| Funkcja | Kanały standardowe | Kanały prywatne |
|---|---|---|
| Instalacja bota | Tak | Ograniczona |
| Wiadomości w czasie rzeczywistym (webhook) | Tak | Może nie działać |
| Uprawnienia RSC | Tak | Mogą działać inaczej |
| @mentions | Tak | Jeśli bot jest dostępny |
| Historia przez Graph API | Tak | Tak (z uprawnieniami) |
- Używaj standardowych kanałów do interakcji z botem
- Używaj DM-ów — użytkownicy zawsze mogą napisać do bota bezpośrednio
- Używaj Graph API do dostępu historycznego (wymaga
ChannelMessage.Read.All)
Rozwiązywanie problemów
Typowe problemy
- Obrazy nie pokazują się w kanałach: brakuje uprawnień Graph lub zgody administratora. Zainstaluj ponownie aplikację Teams i całkowicie zamknij/otwórz ponownie Teams.
- Brak odpowiedzi w kanale: wzmianki są domyślnie wymagane; ustaw
channels.msteams.requireMention=falselub skonfiguruj to per zespół/kanał. - Niezgodność wersji (Teams nadal pokazuje stary manifest): usuń i dodaj aplikację ponownie oraz całkowicie zamknij Teams, aby odświeżyć dane.
- 401 Unauthorized z webhooka: oczekiwane przy ręcznych testach bez JWT z Azure — oznacza, że endpoint jest osiągalny, ale uwierzytelnianie nie przeszło. Do poprawnego testu użyj Azure Web Chat.
Błędy przesyłania manifestu
- “Icon file cannot be empty”: manifest odwołuje się do plików ikon mających 0 bajtów. Utwórz poprawne ikony PNG (
outline.png32x32,color.png192x192). - “webApplicationInfo.Id already in use”: aplikacja jest nadal zainstalowana w innym zespole/czacie. Najpierw ją znajdź i odinstaluj albo poczekaj 5-10 minut na propagację.
- “Something went wrong” podczas przesyłania: prześlij przez https://admin.teams.microsoft.com, otwórz DevTools przeglądarki (F12) → kartę Network i sprawdź body odpowiedzi, aby zobaczyć rzeczywisty błąd.
- Niepowodzenie sideload: spróbuj użyć „Upload an app to your org’s app catalog” zamiast „Upload a custom app” — często omija to ograniczenia sideload.
Uprawnienia RSC nie działają
- Sprawdź, czy
webApplicationInfo.iddokładnie odpowiada App ID Twojego bota - Prześlij aplikację ponownie i zainstaluj ją ponownie w zespole/czacie
- Sprawdź, czy administrator organizacji nie zablokował uprawnień RSC
- Potwierdź, że używasz właściwego zakresu:
ChannelMessage.Read.Groupdla zespołów,ChatMessage.Read.Chatdla czatów grupowych
Odnośniki
- Create Azure Bot - przewodnik konfiguracji Azure Bot
- Teams Developer Portal - tworzenie/zarządzanie aplikacjami Teams
- Teams app manifest schema
- Receive channel messages with RSC
- RSC permissions reference
- Teams bot file handling (kanały/grupy wymagają Graph)
- Proactive messaging
Powiązane
- Channels Overview — wszystkie obsługiwane kanały
- Pairing — uwierzytelnianie DM i przepływ parowania
- Groups — zachowanie czatów grupowych i bramkowanie wzmianką
- Channel Routing — routing sesji dla wiadomości
- Security — model dostępu i utwardzanie