Microsoft Teams
„Porzućcie wszelką nadzieję, wy, którzy tu wchodzicie.”Zaktualizowano: 2026-01-21 Stan: obsługiwane są tekst + załączniki DM; wysyłanie plików do kanałów/grup wymaga
sharePointSiteId + 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 standardowym spakowanym buildzie nie jest wymagana osobna instalacja. Jeśli używasz starszego builda lub niestandardowej instalacji bez bundled Teams, zainstaluj go ręcznie:Szybka konfiguracja (dla początkujących)
- Upewnij się, że plugin Microsoft Teams jest dostępny.
- Bieżące spakowane wydania OpenClaw już go zawierają.
- 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ć każdemu członkowi, z bramkowaniem wzmianką).
Cele
- Rozmawiać z OpenClaw przez DM-y Teams, czaty grupowe lub kanały.
- Zachować deterministyczne routowanie: odpowiedzi zawsze wracają do kanału, z którego przyszły.
- Domyślnie stosować bezpieczne zachowanie kanału (wzmianki 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 przez:
Kontrola dostępu (DM-y + grupy)
Dostęp DM- Domyślnie:
channels.msteams.dmPolicy = "pairing". Nieznani nadawcy 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 dopasowanie jest domyślnie wyłączone i włączane tylko przez
channels.msteams.dangerouslyAllowNameMatching: true. - Kreator może rozwiązywać nazwy na identyfikatory 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 nadpisać wartość domyślną, gdy nie jest ustawiona. channels.msteams.groupAllowFromkontroluje, którzy nadawcy mogą wywoływać działanie w czatach grupowych/kanałach (zapasowo używachannels.msteams.allowFrom).- Ustaw
groupPolicy: "open", aby zezwolić każdemu członkowi (domyślnie nadal z 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 obecna jest allowlista zespołów, akceptowane są tylko wymienione zespoły/kanały (z bramkowaniem wzmianką). - Kreator konfiguracji akceptuje wpisy
Team/Channeli zapisuje je za Ciebie. - Przy uruchamianiu OpenClaw rozwiązuje nazwy zespołów/kanałów i użytkowników z allowlisty na identyfikatory (gdy pozwalają na to uprawnienia Graph)
i zapisuje mapowanie w logach; nierozwiązane nazwy zespołów/kanałów są zachowywane tak, jak zostały wpisane, ale domyślnie ignorowane przy routowaniu, chyba że włączono
channels.msteams.dangerouslyAllowNameMatching: true.
Jak to działa
- Upewnij się, że plugin Microsoft Teams jest dostępny.
- Bieżące spakowane wydania OpenClaw już go zawierają.
- 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-ów).
- Skonfiguruj
msteamsw~/.openclaw/openclaw.json(lub przez zmienne środowiskowe) i uruchom gateway. - Gateway domyślnie nasłuchuje ruchu webhook Bot Framework pod adresem
/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 — patrz uwaga poniżej) Creation type Create new Microsoft App ID
Powiadomienie o wycofaniu: Tworzenie nowych botów wielodostępnych 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 App Registration
- 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 Messaging Endpoint
- W Azure Bot → Configuration
- Ustaw Messaging endpoint na URL webhooka:
- Produkcja:
https://your-domain.com/api/messages - Local dev: użyj tunelu (zobacz Local Development poniżej)
- Produkcja:
Krok 4: Włącz kanał Teams
- W Azure Bot → Channels
- Kliknij Microsoft Teams → Configure → Save
- Zaakceptuj Terms of Service
Local Development (tunelowanie)
Teams nie może połączyć się zlocalhost. Użyj tunelu do local developmentu:
Opcja A: ngrok
Teams Developer Portal (alternatywa)
Zamiast ręcznie tworzyć ZIP manifestu, możesz użyć Teams Developer Portal:- Kliknij + New app
- Wypeł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 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 spakowane wydania OpenClaw już go zawierają.
- Starsze/niestandardowe instalacje mogą dodać go ręcznie:
- Z npm:
openclaw plugins install @openclaw/msteams - Z lokalnego checkouta:
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_ID
-
Endpoint bota
- Ustaw Azure Bot Messaging Endpoint na:
https://<host>:3978/api/messages(lub wybraną przez Ciebie ś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 i istnieje konfiguracja
msteamsz poświadczeniami.
- Kanał Teams uruchamia się automatycznie, gdy bundled plugin lub ręcznie zainstalowany plugin jest dostępny i istnieje konfiguracja
Akcja informacji o członku
OpenClaw udostępnia opartą na Graph akcjęmember-info dla Microsoft Teams, aby agenci i automatyzacje mogli 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ż zawarte w zalecanym manifeście) - Dla wyszukiwań między zespołami: uprawnienie aplikacyjne Graph
User.Read.Allz consentem administratora
channels.msteams.actions.memberInfo (domyślnie: włączona, gdy dostępne są poświadczenia Graph).
Kontekst historii
channels.msteams.historyLimitkontroluje liczbę ostatnich wiadomości kanału/grupy opakowywanych do promptu.- Zapasowo używa
messages.groupChat.historyLimit. Ustaw0, aby wyłączyć (domyślnie 50). - Pobrana historia wątku jest filtrowana przez allowlisty nadawców (
allowFrom/groupAllowFrom), więc zasiewanie 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 tak, jak został odebrany. - Innymi słowy, allowlisty kontrolują, kto może wywołać agenta; obecnie filtrowane są tylko konkretne dodatkowe ś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 resourceSpecific permissions w naszym manifeście aplikacji Teams. Obowiązują tylko w zespole/czacie, gdzie 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 (zredagowany)
Minimalny, poprawny przykład z wymaganymi polami. Zastąp identyfikatory i URL-e.Zastrzeżenia dotyczące manifestu (pola obowiązkowe)
bots[].botIdmusi odpowiadać Azure Bot App ID.webApplicationInfo.idmusi odpowiadać Azure Bot App ID.bots[].scopesmusi zawierać powierzchnie, których chcesz 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. w celu dodania uprawnień RSC):- Zaktualizuj
manifest.json, dodając nowe ustawienia - Zwiększ pole
version(np.1.0.0→1.1.0) - Spakuj ponownie manifest z ikonami (
manifest.json,outline.png,color.png) - Prześlij nowy 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łowych: zainstaluj ponownie aplikację w każdym zespole, aby nowe uprawnienia zaczęły działać
- Całkowicie zamknij i uruchom ponownie Teams (nie tylko zamknij okno), aby wyczyścić cache metadanych aplikacji
Możliwości: tylko RSC vs Graph
Z samym Teams RSC (aplikacja zainstalowana, bez uprawnień Graph API)
Działa:- Odczyt treści tekstowej wiadomości kanałowych.
- Wysyłanie tekstowej treści wiadomości kanałowych.
- Odbieranie załączników plikowych w osobistych (DM).
- Zawartość obrazów lub plików w kanałach/grupach (payload zawiera tylko HTML stub).
- Pobieranie załączników przechowywanych w SharePoint/OneDrive.
- Odczyt historii wiadomości (poza zdarzeniem webhooka na żywo).
Z Teams RSC + uprawnieniami aplikacyjnymi Microsoft Graph
Dodaje:- Pobieranie hostowanych treści (obrazów wklejonych do wiadomości).
- Pobieranie załączników plikowych przechowywanych w SharePoint/OneDrive.
- Odczyt historii wiadomości kanałów/czatów 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 consentu administratora + przepływu tokena |
| Działa offline | Nie (musi działać) | Tak (zapytanie w dowolnym momencie) |
ChannelMessage.Read.All (wymaga consentu administratora).
Media + historia z włączonym 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 przyznać consent 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)
- Przyznaj consent administratora dla tenant.
- 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ć cache metadanych aplikacji.
User.Read.All i przyznaj consent administratora.
Znane ograniczenia
Timeouty webhooków
Teams dostarcza wiadomości przez webhook HTTP. Jeśli przetwarzanie trwa zbyt długo (np. wolne odpowiedzi LLM), możesz zobaczyć:- Timeouty gateway
- Ponawianie wiadomości przez Teams (powodujące duplikaty)
- Utracone odpowiedzi
Formatowanie
Markdown Teams jest bardziej ograniczony niż w Slack lub Discord:- Podstawowe formatowanie działa: pogrubienie, kursywa,
code, linki - Złożony Markdown (tabele, zagnieżdżone listy) może nie renderować się poprawnie
- Adaptive Cards są obsługiwane dla ankiet i dowolnych wysyłek kart (zobacz poniżej)
Konfiguracja
Kluczowe ustawienia (zobacz/gateway/configuration, aby poznać współdzielone wzorce kanałów):
channels.msteams.enabled: włącz/wyłącz 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: allowlista DM (zalecane identyfikatory obiektów AAD). Kreator rozwiązuje nazwy na identyfikatory podczas konfiguracji, gdy dostępny jest Graph.channels.msteams.dangerouslyAllowNameMatching: przełącznik awaryjny do ponownego włączenia dopasowywania zmiennych UPN-ów/nazw wyświetlanych oraz bezpośredniego routowania po nazwie zespołu/kanału.channels.msteams.textChunkLimit: rozmiar chunków tekstu wychodzącego.channels.msteams.chunkMode:length(domyślnie) lubnewline, aby dzielić po pustych liniach (granice akapitów) przed chunkowaniem po długości.channels.msteams.mediaAllowHosts: allowlista hostów dla przychodzących załączników (domyślnie domeny Microsoft/Teams).channels.msteams.mediaAuthAllowHosts: allowlista hostów, dla których dołączane są nagłówki Authorization przy ponownych próbach pobierania mediów (domyślnie hosty Graph + Bot Framework).channels.msteams.requireMention: wymagaj @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 brak nadpisania kanałowego.channels.msteams.teams.<teamId>.toolsBySender: domyślne nadpisania polityki narzędzi per nadawca dla zespołu (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 nadawca dla kanału (obsługiwany wildcard"*").- Klucze
toolsBySenderpowinny używać jawnych prefiksów:id:,e164:,username:,name:(starsze klucze bez prefiksu nadal mapują tylko doid:). channels.msteams.actions.memberInfo: włącz lub wyłącz opartą na Graph akcję informacji o członku (domyślnie: włączona, gdy dostępne są poświadczenia Graph).channels.msteams.sharePointSiteId: identyfikator witryny SharePoint do przesyłania plików w czatach grupowych/kanałach (zobacz Wysyłanie plików w czatach grupowych).
Routowanie i sesje
- Klucze sesji mają standardowy format 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 UI kanałów na tym samym bazowym modelu danych:| Styl | Opis | Zalecane replyStyle |
|---|---|---|
| Posts (klasyczny) | Wiadomości pojawiają się jako karty z odpowiedziami w 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ł w zależności od tego, jak kanał jest skonfigurowany:
Załączniki i obrazy
Bieżące ograniczenia:- DM-y: obrazy i załączniki plikowe działają przez botowe API plików Teams.
- Kanały/grupy: załączniki znajdują się w pamięci masowej M365 (SharePoint/OneDrive). Payload webhooka zawiera tylko HTML stub, a nie faktyczne 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 wielodostępnych sufiksów).
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 | Działa od razu |
| Czaty grupowe/kanały | Przesłanie do SharePoint → link współdzielenia | 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 współdzielenia.
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) - opcjonalnie, umożliwia linki współdzielenia per użytkownik
- Przyznaj consent administratora dla tenant.
-
Pobierz identyfikator witryny SharePoint:
-
Skonfiguruj OpenClaw:
Zachowanie współdzielenia
| Uprawnienie | Zachowanie współdzielenia |
|---|---|
Sites.ReadWrite.All tylko | Link współdzielenia w całej organizacji (każdy w org może uzyskać dostęp) |
Sites.ReadWrite.All + Chat.Read.All | Link współdzielenia per użytkownik (dostęp mają tylko członkowie czatu) |
Chat.Read.All, bot wraca do współdzielenia w całej organizacji.
Zachowanie zapasowe
| Scenariusz | Wynik |
|---|---|
Czat grupowy + plik + skonfigurowane sharePointSiteId | Przesłanie do SharePoint, wysłanie linku współdzielenia |
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)
Wyślij dowolny JSON Adaptive Card do użytkowników lub konwersacji Teams za pomocą narzędziamessage lub CLI.
Parametr card akceptuje obiekt JSON Adaptive Card. Gdy podano card, tekst wiadomości jest opcjonalny.
Narzędzie agenta:
Formaty target
Targety MSTeams używają prefiksów do rozróżniania użytkowników i konwersacji:| Typ targetu | Format | Przykład |
|---|---|---|
| Użytkownik (po ID) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| Użytkownik (po nazwie) | 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ść 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 bramkowanie allowlistą.
Identyfikatory zespołów i kanałów (częsta pułapka)
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:
- Identyfikator zespołu = segment ścieżki po
/team/(po zdekodowaniu URL, np.19:Bk4j...@thread.tacv2) - Identyfikator kanału = segment ścieżki po
/channel/(po zdekodowaniu URL) - Ignoruj parametr zapytania
groupId
Kanały prywatne
Boty mają ograniczone wsparcie 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 kanałów standardowych do interakcji z botem
- Używaj DM-ów — użytkownicy zawsze mogą napisać bezpośrednio do bota
- 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 consentu administratora. Zainstaluj ponownie aplikację Teams i całkowicie zamknij/otwórz Teams.
- Brak odpowiedzi w kanale: domyślnie wymagane są wzmianki; ustaw
channels.msteams.requireMention=falselub skonfiguruj per zespół/kanał. - Niezgodność wersji (Teams nadal pokazuje stary manifest): usuń i dodaj aplikację ponownie oraz całkowicie zamknij Teams, aby odświeżyć.
- 401 Unauthorized z webhooka: oczekiwane przy ręcznych testach bez Azure JWT — oznacza, że endpoint jest osiągalny, ale autoryzacja się nie powiodła. Użyj Azure Web Chat do poprawnego testowania.
Błędy przesyłania manifestu
- “Icon file cannot be empty”: manifest odwołuje się do plików ikon, które mają 0 bajtów. Utwórz poprawne ikony PNG (
outline.png32x32,color.png192x192). - “webApplicationInfo.Id already in use”: aplikacja nadal jest zainstalowana w innym zespole/czacie. Znajdź ją i odinstaluj najpierw albo odczekaj 5-10 minut na propagację.
- “Something went wrong” przy przesyłaniu: prześlij przez https://admin.teams.microsoft.com, otwórz DevTools przeglądarki (F12) → zakładka Network i sprawdź body odpowiedzi, aby zobaczyć faktyczny błąd.
- Sideload nie działa: spróbuj opcji „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ą
- Zweryfikuj, że
webApplicationInfo.iddokładnie odpowiada App ID Twojego bota - Prześlij aplikację ponownie i zainstaluj ją ponownie w zespole/czacie
- Sprawdź, czy administrator Twojej organizacji nie zablokował uprawnień RSC
- Potwierdź, że używasz właściwego zakresu:
ChannelMessage.Read.Groupdla zespołów,ChatMessage.Read.Chatdla czatów grupowych
Odwołania
- Create Azure Bot - przewodnik konfiguracji Azure Bot
- Teams Developer Portal - tworzenie/zarządzanie aplikacjami Teams
- Schemat manifestu aplikacji Teams
- Odbieranie wiadomości kanałowych z RSC
- Dokumentacja uprawnień RSC
- Obsługa plików bota Teams (kanał/grupa wymaga Graph)
- Wiadomości proaktywne
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Pairing — uwierzytelnianie DM i przepływ parowania
- Grupy — zachowanie czatów grupowych i bramkowanie wzmiankami
- Routowanie kanałów — routowanie sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie