Concept internals
Markdown फ़ॉर्मेटिंग
OpenClaw आउटबाउंड Markdown को चैनल-विशिष्ट आउटपुट रेंडर करने से पहले एक साझा मध्यवर्ती निरूपण (IR) में बदलता है। IR सादा टेक्स्ट और शैली/लिंक स्पैन बनाए रखता है, ताकि एक पार्स चरण हर चैनल को इनपुट दे और चंकिंग कभी भी स्पैन के बीच में फ़ॉर्मैटिंग को विभाजित न करे।
पाइपलाइन
- Markdown को IR में पार्स करें (
markdownToIR) - सादा टेक्स्ट और शैली स्पैन (बोल्ड, इटैलिक, स्ट्राइकथ्रू, कोड, कोड ब्लॉक, स्पॉइलर, ब्लॉककोट, शीर्षक 1-6) तथा लिंक स्पैन। ऑफ़सेट UTF-16 कोड इकाइयाँ हैं, इसलिए Signal शैली रेंज सीधे उसके API के अनुरूप होती हैं। तालिकाएँ केवल तभी पार्स होती हैं, जब चैनल किसी तालिका मोड का विकल्प चुनता है। - IR को चंकों में बाँटें (
chunkMarkdownIR/renderMarkdownIRChunksWithinLimit)- विभाजन रेंडरिंग से पहले IR टेक्स्ट पर होता है, इसलिए इनलाइन शैलियों और लिंक को सीमा के आर-पार टूटने के बजाय प्रत्येक चंक के अनुसार काटा जाता है।
- प्रत्येक चैनल के लिए रेंडर करें (
renderMarkdownWithMarkers) - एक शैली-मार्कर मैप स्पैन को चैनल के मूल मार्कअप में बदलता है।
| चैनल | रेंडरर | टिप्पणियाँ |
|---|---|---|
| Slack | mrkdwn टोकन (*bold*, _italic_, `code`, कोड फ़ेंस) |
लिंक <url|label> बन जाते हैं; दोहरी लिंकिंग से बचने के लिए पार्स करते समय ऑटोलिंक अक्षम रहता है |
| Telegram | HTML टैग (<b>, <i>, <s>, <code>, <pre><code>, <a href>, <tg-spoiler>) |
richMessages चालू होने पर रिच-मैसेज तालिकाओं और शीर्षकों (<h1>-<h6>) का भी समर्थन करता है |
| Signal | सादा टेक्स्ट + text-style रेंज |
जब लेबल URL से अलग होता है, तो लिंक label (url) के रूप में रेंडर होते हैं |
| Discord, WhatsApp, iMessage, Microsoft Teams और अन्य चैनल | सादा टेक्स्ट | कोई IR-आधारित शैली नहीं; Markdown तालिका रूपांतरण फिर भी convertMarkdownTables के माध्यम से चलता है |
IR उदाहरण
इनपुट Markdown:
नमस्ते **दुनिया** - [दस्तावेज़](https://docs.openclaw.ai) देखें।IR (रूपरेखात्मक):
{ "text": "Hello world - see docs.", "styles": [{ "start": 6, "end": 11, "style": "bold" }], "links": [{ "start": 19, "end": 23, "href": "https://docs.openclaw.ai" }]}तालिका प्रबंधन
markdown.tables नियंत्रित करता है कि कोई चैनल Markdown तालिकाओं को कैसे रूपांतरित करता है, प्रत्येक
चैनल के लिए और वैकल्पिक रूप से प्रत्येक खाते के लिए:
| मोड | व्यवहार |
|---|---|
code |
कोड ब्लॉक के भीतर संरेखित ASCII तालिका के रूप में रेंडर करें (डिफ़ॉल्ट फ़ॉलबैक) |
bullets |
प्रत्येक पंक्ति को label: value बुलेट बिंदुओं में बदलें |
block |
जहाँ ट्रांसपोर्ट उनका समर्थन करता है वहाँ मूल तालिकाएँ बनाए रखें; अन्यथा code पर फ़ॉलबैक होता है |
off |
तालिका पार्सिंग अक्षम करें; अपरिष्कृत तालिका टेक्स्ट बिना बदलाव के आगे जाता है |
प्रति-चैनल Plugin डिफ़ॉल्ट: Signal, WhatsApp और Matrix के लिए डिफ़ॉल्ट
bullets है; Mattermost के लिए डिफ़ॉल्ट off है; Telegram के लिए डिफ़ॉल्ट block है (जो
code में बदलता है, जब तक खाते में richMessages सक्षम न हो)। स्पष्ट Plugin डिफ़ॉल्ट के बिना कोई भी
चैनल code पर फ़ॉलबैक करता है।
channels: discord: markdown: tables: code accounts: work: markdown: tables: offचंकिंग नियम
- चंक सीमाएँ चैनल अडैप्टर/कॉन्फ़िगरेशन से आती हैं और IR टेक्स्ट पर लागू होती हैं, रेंडर किए गए आउटपुट पर नहीं।
- फ़ेंस किए गए कोड ब्लॉक को अंतिम न्यूलाइन सहित एक ब्लॉक के रूप में रखा जाता है, ताकि चैनल समापन फ़ेंस को सही ढंग से रेंडर करें।
- सूची और ब्लॉककोट उपसर्ग IR टेक्स्ट का हिस्सा होते हैं, इसलिए चंकिंग कभी भी उपसर्ग के बीच में विभाजन नहीं करती।
- इनलाइन शैलियाँ कभी चंकों के बीच विभाजित नहीं होतीं; रेंडरर अगले चंक के आरंभ में खुली शैली को फिर से खोलता है।
सभी चैनलों में चंक-सीमा और डिलीवरी व्यवहार के लिए स्ट्रीमिंग और चंकिंग देखें।
लिंक नीति
- Slack:
[label](url)-><url|label>; सीधे लिखे URL सीधे ही रहते हैं। - Telegram:
[label](url)-><a href="url">label</a>(HTML पार्स मोड)। - Signal:
[label](url)->label (url), जब तक लेबल पहले से URL से मेल न खाता हो।
स्पॉइलर
स्पॉइलर मार्कर (||spoiler||) Signal (जहाँ उन्हें SPOILER
शैली रेंज में मैप किया जाता है) और Telegram (जहाँ उन्हें <tg-spoiler> में मैप किया जाता है) के लिए पार्स किए जाते हैं। अन्य चैनल
||...|| को सादा टेक्स्ट मानते हैं।
चैनल फ़ॉर्मैटर जोड़ना या अपडेट करना
- चैनल के लिए उपयुक्त विकल्प (
autolink,headingStyle,blockquotePrefix,tableMode) पास करते हुएmarkdownToIR(...)के साथ एक बार पार्स करें। - शैली-मार्कर मैप (या
Signal जैसे ट्रांसपोर्ट के लिए कस्टम शैली-रेंज लॉजिक) के साथ
renderMarkdownWithMarkers(...)का उपयोग करके रेंडर करें। - प्रत्येक चंक को रेंडर करने से पहले
chunkMarkdownIR(...)याrenderMarkdownIRChunksWithinLimit(...)के साथ चंक में बाँटें। - आउटबाउंड प्रेषण पथ से नए चंकर और रेंडरर को कॉल करने के लिए अडैप्टर को जोड़ें।
- यदि चैनल चंकिंग करता है, तो फ़ॉर्मैट परीक्षणों और आउटबाउंड डिलीवरी परीक्षण के साथ परीक्षण करें।
सामान्य सावधानियाँ
- Slack एंगल-ब्रैकेट टोकन (
<@U123>,<#C123>,<https://...>) को एस्केपिंग के बाद भी सुरक्षित रहना चाहिए; अपरिष्कृत HTML को फिर भी सुरक्षित रूप से एस्केप करना आवश्यक है। - Telegram HTML में टूटे हुए मार्कअप से बचने के लिए टैग के बाहर के टेक्स्ट को एस्केप करना आवश्यक है।
- Signal शैली रेंज UTF-16 ऑफ़सेट का उपयोग करती हैं, कोड-पॉइंट ऑफ़सेट का नहीं।
- फ़ेंस किए गए कोड ब्लॉक में अंतिम न्यूलाइन सुरक्षित रखें, ताकि समापन मार्कर अपनी अलग पंक्ति पर आए।