Status
Wdrożono dla współdzielonego agenta, CLI, możliwości Plugin i powierzchni dostarczania wychodzącego:ReplyPayload.presentationprzenosi semantyczny interfejs wiadomości.ReplyPayload.delivery.pinprzenosi żądania przypinania wysłanych wiadomości.- Współdzielone akcje wiadomości udostępniają
presentation,deliveryipinzamiast natywnych dla provideracomponents,blocks,buttonslubcard. - Rdzeń renderuje albo automatycznie degraduje prezentację przez możliwości wychodzące deklarowane przez Plugin.
- Renderery Discord, Slack, Telegram, Mattermost, MS Teams i Feishu konsumują generyczny kontrakt.
- Kod control plane kanału Discord nie importuje już kontenerów UI opartych na Carbon.
Problem
Interfejs kanałów jest obecnie podzielony na kilka niekompatybilnych powierzchni:- Rdzeń posiada hak renderera międzykontekstowego o kształcie Discord przez
buildCrossContextComponents. channel.tsDiscord może importować natywne UI Carbon przezDiscordUiContainer, co wciąga zależności UI runtime do control plane Plugin kanału.- Agent i CLI udostępniają furtki ucieczki dla natywnych ładunków, takie jak
componentsDiscord,blocksSlack,buttonsTelegram lub Mattermost orazcardTeams lub Feishu. ReplyPayload.channelDataprzenosi zarówno wskazówki transportowe, jak i natywne koperty UI.- Generyczny model
interactiveistnieje, ale jest węższy niż bogatsze układy używane już przez Discord, Slack, Teams, Feishu, LINE, Telegram i Mattermost.
Cele
- Rdzeń decyduje o najlepszej semantycznej prezentacji wiadomości na podstawie zadeklarowanych możliwości.
- Rozszerzenia deklarują możliwości i renderują semantyczną prezentację do natywnych ładunków transportowych.
- Web Control UI pozostaje oddzielone od natywnego interfejsu czatu.
- Natywne ładunki kanałów nie są wystawiane przez współdzieloną powierzchnię wiadomości agenta ani CLI.
- Nieobsługiwane funkcje prezentacji automatycznie degradują się do najlepszej reprezentacji tekstowej.
- Zachowanie dostarczania, takie jak przypinanie wysłanej wiadomości, jest generyczną metadanych dostarczania, a nie prezentacją.
Poza zakresem
- Brak shim kompatybilności wstecznej dla
buildCrossContextComponents. - Brak publicznych furtek ucieczki dla
components,blocks,buttonslubcard. - Brak importów bibliotek UI natywnych dla kanału w rdzeniu.
- Brak provider-specyficznych warstw SDK dla dołączonych kanałów.
Model docelowy
Dodaj polepresentation należące do rdzenia do ReplyPayload.
interactive staje się podzbiorem presentation podczas migracji:
- blok tekstowy
interactivemapuje się dopresentation.blocks[].type = "text". - blok przycisków
interactivemapuje się dopresentation.blocks[].type = "buttons". - blok wyboru
interactivemapuje się dopresentation.blocks[].type = "select".
presentation; interactive pozostaje wewnętrznym starszym pomocnikiem parsera/renderowania dla istniejących producentów odpowiedzi.
Metadane dostarczania
Dodaj poledelivery należące do rdzenia dla zachowania wysyłania, które nie jest UI.
delivery.pin = trueoznacza przypięcie pierwszej pomyślnie dostarczonej wiadomości.notifydomyślnie ma wartośćfalse.requireddomyślnie ma wartośćfalse; nieobsługiwane kanały lub nieudane przypinanie automatycznie degradują się przez kontynuację dostarczania.- Ręczne akcje wiadomości
pin,unpinilist-pinspozostają dla istniejących wiadomości.
channelData.telegram.pin = true do delivery.pin = true.
Kontrakt możliwości runtime
Dodaj haki renderowania prezentacji i dostarczania do adaptera wychodzącego runtime, a nie do control-plane Plugin kanału.- Rozwiąż kanał docelowy i adapter runtime.
- Zapytaj o możliwości prezentacji.
- Zdegraduj nieobsługiwane bloki przed renderowaniem.
- Wywołaj
renderPresentation. - Jeśli renderer nie istnieje, przekonwertuj prezentację do fallbacku tekstowego.
- Po udanym wysłaniu wywołaj
pinDeliveredMessage, gdy zażądanodelivery.pini jest obsługiwane.
Mapowanie kanałów
Discord:- Renderuj
presentationdo components v2 i kontenerów Carbon w modułach tylko runtime. - Zachowaj pomocniki kolorów akcentów w lekkich modułach.
- Usuń importy
DiscordUiContainerz kodu control-plane Plugin kanału.
- Renderuj
presentationdo Block Kit. - Usuń wejście
blocksz agenta i CLI.
- Renderuj tekst, kontekst i separatory jako tekst.
- Renderuj akcje i select jako inline keyboards, gdy są skonfigurowane i dozwolone dla docelowej powierzchni.
- Użyj fallbacku tekstowego, gdy inline buttons są wyłączone.
- Przenieś przypinanie tematu ACP do
delivery.pin.
- Renderuj akcje jako interaktywne przyciski, gdy są skonfigurowane.
- Renderuj pozostałe bloki jako fallback tekstowy.
- Renderuj
presentationdo Adaptive Cards. - Zachowaj ręczne akcje
pin/unpin/list-pins. - Opcjonalnie zaimplementuj
pinDeliveredMessage, jeśli obsługa Graph jest niezawodna dla docelowej rozmowy.
- Renderuj
presentationdo interactive cards. - Zachowaj ręczne akcje
pin/unpin/list-pins. - Opcjonalnie zaimplementuj
pinDeliveredMessagedla przypinania wysłanych wiadomości, jeśli zachowanie API jest niezawodne.
- Renderuj
presentationdo wiadomości Flex lub template, gdzie to możliwe. - Dla nieobsługiwanych bloków wracaj do tekstu.
- Usuń ładunki UI LINE z
channelData.
- Konwertuj prezentację do tekstu z konserwatywnym formatowaniem.
Kroki refaktoryzacji
- Ponownie zastosuj poprawkę wydania Discord, która rozdziela
ui-colors.tsod UI opartego na Carbon i usuwaDiscordUiContainerzextensions/discord/src/channel.ts. - Dodaj
presentationideliverydoReplyPayload, normalizacji ładunku wychodzącego, podsumowań dostarczania i ładunków hooków. - Dodaj schemat
MessagePresentationi pomocniki parsera w wąskiej podścieżce SDK/runtime. - Zastąp możliwości wiadomości
buttons,cards,componentsiblockssemantycznymi możliwościami prezentacji. - Dodaj haki adaptera wychodzącego runtime do renderowania prezentacji i przypinania dostarczenia.
- Zastąp konstrukcję komponentów międzykontekstowych przez
buildCrossContextPresentation. - Usuń
src/infra/outbound/channel-adapters.tsi usuńbuildCrossContextComponentsz typów Plugin kanału. - Zmień
maybeApplyCrossContextMarker, aby dołączałopresentationzamiast natywnych parametrów. - Zaktualizuj ścieżki wysyłania plugin-dispatch, aby konsumowały tylko semantyczną prezentację i metadane dostarczania.
- Usuń natywne parametry ładunku agenta i CLI:
components,blocks,buttonsicard. - Usuń pomocniki SDK tworzące natywne schematy message-tool, zastępując je pomocnikami schematu prezentacji.
- Usuń UI/natywne koperty z
channelData; zachowaj tylko metadane transportu, dopóki każde pozostałe pole nie zostanie przejrzane. - Migruj renderery Discord, Slack, Telegram, Mattermost, MS Teams, Feishu i LINE.
- Zaktualizuj dokumentację dla CLI wiadomości, stron kanałów, SDK Plugin i cookbooka możliwości.
- Uruchom profilowanie rozgałęzienia importów dla Discord i dotkniętych entrypointów kanałów.
channelData. Krok 15 pozostaje walidacją następczą, jeśli chcemy skwantyfikowanych liczb rozgałęzienia importów wykraczających poza bramkę typów/testów.
Testy
Dodaj lub zaktualizuj:- Testy normalizacji prezentacji.
- Testy automatycznej degradacji prezentacji dla nieobsługiwanych bloków.
- Testy znaczników międzykontekstowych dla plugin-dispatch i ścieżek dostarczania rdzenia.
- Testy macierzy renderowania kanałów dla Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE i fallbacku tekstowego.
- Testy schematu message-tool dowodzące, że natywne pola zniknęły.
- Testy CLI dowodzące, że natywne flagi zniknęły.
- Regresję leniwości importu entrypointu Discord obejmującą Carbon.
- Testy przypinania dostarczenia obejmujące Telegram i fallback generyczny.
Otwarte pytania
- Czy
delivery.pinpowinno zostać zaimplementowane dla Discord, Slack, MS Teams i Feishu w pierwszym etapie, czy najpierw tylko dla Telegram? - Czy
deliverypowinno ostatecznie wchłonąć istniejące pola, takie jakreplyToId,replyToCurrent,silentiaudioAsVoice, czy pozostać skupione na zachowaniach po wysłaniu? - Czy prezentacja powinna bezpośrednio obsługiwać obrazy lub referencje do plików, czy media powinny na razie pozostać oddzielone od układu UI?