OpenClaw formatuje wychodzący Markdown, konwertując go do wspólnej reprezentacji pośredniej (IR) przed renderowaniem danych wyjściowych specyficznych dla kanału. IR zachowuje tekst źródłowy bez zmian, jednocześnie przenosząc zakresy stylów/linków, dzięki czemu dzielenie na fragmenty i renderowanie mogą pozostawać spójne między kanałami.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Cele
- Spójność: jeden etap parsowania, wiele rendererów.
- Bezpieczne dzielenie na fragmenty: dziel tekst przed renderowaniem, aby formatowanie inline nigdy nie urywało się między fragmentami.
- Dopasowanie do kanału: mapuj ten sam IR na Slack mrkdwn, HTML Telegram oraz zakresy stylów Signal bez ponownego parsowania Markdown.
Pipeline
- Parsuj Markdown -> IR
- IR to zwykły tekst oraz zakresy stylów (bold/italic/strike/code/spoiler) i zakresy linków.
- Przesunięcia są jednostkami kodu UTF-16, aby zakresy stylów Signal były zgodne z jego API.
- Tabele są parsowane tylko wtedy, gdy kanał włącza konwersję tabel.
- Dziel IR na fragmenty (najpierw format)
- Dzielenie odbywa się na tekście IR przed renderowaniem.
- Formatowanie inline nie jest dzielone między fragmentami; zakresy są przycinane dla każdego fragmentu.
- Renderuj dla każdego kanału
- Slack: tokeny mrkdwn (bold/italic/strike/code), linki jako
<url|label>. - Telegram: tagi HTML (
<b>,<i>,<s>,<code>,<pre><code>,<a href>). - Signal: zwykły tekst + zakresy
text-style; linki stają sięlabel (url), gdy etykieta się różni.
- Slack: tokeny mrkdwn (bold/italic/strike/code), linki jako
Przykład IR
Wejściowy Markdown:Gdzie jest używany
- Adaptery wychodzące Slack, Telegram i Signal renderują z IR.
- Inne kanały (WhatsApp, iMessage, Microsoft Teams, Discord) nadal używają zwykłego tekstu lub własnych reguł formatowania, z konwersją tabel Markdown stosowaną przed dzieleniem na fragmenty, gdy jest włączona.
Obsługa tabel
Tabele Markdown nie są spójnie obsługiwane we wszystkich klientach czatu. Użyjmarkdown.tables, aby kontrolować konwersję dla kanału (i konta).
code: renderuj tabele jako bloki kodu (domyślnie dla większości kanałów).bullets: konwertuj każdy wiersz na punkty listy (domyślnie dla Matrix, Signal i WhatsApp).off: wyłącz parsowanie i konwersję tabel; surowy tekst tabeli przechodzi dalej.
Reguły dzielenia na fragmenty
- Limity fragmentów pochodzą z adapterów/konfiguracji kanałów i są stosowane do tekstu IR.
- Ogrodzenia kodu są zachowywane jako pojedynczy blok z końcowym znakiem nowego wiersza, aby kanały renderowały je poprawnie.
- Prefiksy list i prefiksy cytatów blokowych są częścią tekstu IR, więc dzielenie na fragmenty nie rozdziela tekstu w środku prefiksu.
- Style inline (bold/italic/strike/inline-code/spoiler) nigdy nie są dzielone między fragmentami; renderer ponownie otwiera style wewnątrz każdego fragmentu.
Polityka linków
- Slack:
[label](url)-><url|label>; gołe adresy URL pozostają gołe. Autolink jest wyłączony podczas parsowania, aby uniknąć podwójnego linkowania. - Telegram:
[label](url)-><a href="url">label</a>(tryb parsowania HTML). - Signal:
[label](url)->label (url), chyba że etykieta pasuje do URL.
Spoilery
Znaczniki spoilerów (||spoiler||) są parsowane tylko dla Signal, gdzie mapują się na
zakresy stylu SPOILER. Inne kanały traktują je jako zwykły tekst.
Jak dodać lub zaktualizować formatter kanału
- Parsuj raz: użyj współdzielonego helpera
markdownToIR(...)z opcjami odpowiednimi dla kanału (autolink, styl nagłówków, prefiks cytatu blokowego). - Renderuj: zaimplementuj renderer z
renderMarkdownWithMarkers(...)i mapą znaczników stylu (lub zakresami stylów Signal). - Dziel na fragmenty: wywołaj
chunkMarkdownIR(...)przed renderowaniem; renderuj każdy fragment. - Podłącz adapter: zaktualizuj adapter wychodzący kanału, aby używał nowego mechanizmu dzielenia na fragmenty i renderera.
- Testuj: dodaj lub zaktualizuj testy formatowania oraz test dostarczania wychodzącego, jeśli kanał używa dzielenia na fragmenty.
Częste pułapki
- Tokeny Slack w nawiasach kątowych (
<@U123>,<#C123>,<https://...>) muszą być zachowane; bezpiecznie escapuj surowy HTML. - HTML Telegram wymaga escapowania tekstu poza tagami, aby uniknąć uszkodzonego znacznikowania.
- Zakresy stylów Signal zależą od przesunięć UTF-16; nie używaj przesunięć punktów kodowych.
- Zachowuj końcowe znaki nowego wiersza dla ogrodzonych bloków kodu, aby znaczniki zamykające trafiały do własnego wiersza.
Powiązane
Streaming i dzielenie na fragmenty
Zachowanie streamingu wychodzącego, granice fragmentów i dostarczanie specyficzne dla kanału.
Prompt systemowy
Co model widzi przed rozmową, w tym wstrzyknięte pliki obszaru roboczego.