コンテンツにスキップ

OpenClawにおけるMarkdownフォーマットの仕組み

複数のチャネルにメッセージを送信する際、Markdownの扱いに頭を悩ませたことはありませんか?チャネルごとに微妙に異なる記法や、長いメッセージを分割したときに太字などの装飾が途切れてしまう問題は、開発者にとって共通の課題です。

OpenClawでは、Markdownを直接レンダリングするのではなく、一度IR(中間表現)に変換することで、これらの問題をスマートに解決しています。

  • Markdown形式のソーステキスト
  • OpenClawの各チャネル用アダプター(Slack, Telegram, Signalなど)

OpenClawのMarkdown処理は、以下の3つのステップで実行されます。5分で全体の流れを把握しましょう。

まず、Markdownをプレーンテキストとスタイル情報のセット(IR)に変換します。これにより、ソーステキストを保持したまま、どのチャネルでも再利用できる形になります。

IRの例: 入力されたMarkdownが Hello **world** — see [docs](https://docs.openclaw.ai). の場合、以下のような構造になります。

{
"text": "Hello world — see docs.",
"styles": [{ "start": 6, "end": 11, "style": "bold" }],
"links": [{ "start": 19, "end": 23, "href": "https://docs.openclaw.ai" }]
}

メッセージが長すぎる場合、レンダリング前にIRテキストを分割します。このとき、インラインフォーマット(太字や斜体など)がチャンクをまたいで壊れないよう、スタイルを適切にスライスします。

3. チャネルごとのレンダリング

Section titled “3. チャネルごとのレンダリング”

最後に、各チャネルの仕様に合わせて出力します。

  • Slack: mrkdwnトークン(例: <url|label>)
  • Telegram: HTMLタグ(例: <b>, <i>)
  • Signal: プレーンテキスト + スタイル範囲

Markdownのテーブルは、チャネルによってサポート状況が異なります。markdown.tables 設定を使用して、チャネルやアカウントごとに変換ルールを制御することをお勧めします。

  • code: テーブルをコードブロックとしてレンダリングします(多くのチャネルのデフォルト)。
  • bullets: 各行を箇条書きに変換します(SignalとWhatsAppのデフォルト)。
  • off: テーブルのパースを無効化し、生のテキストとして扱います。

設定例:

channels:
discord:
markdown:
tables: code
accounts:
work:
markdown:
tables: off

実装中によく遭遇する問題と解決策です。

  • Slackでリンクが二重になる: パース時にAutolinkを無効にしてください。
  • Telegramでマークアップが壊れる: HTMLタグ以外のテキストが適切にエスケープされているか確認してください。
  • Signalでスタイルがずれる: Signalのスタイル範囲はUTF-16コード単位のオフセットを期待しています。コードポイントのオフセットを使用しないように注意してください。
  • コードブロックの表示が崩れる: フェンス付きコードブロックの末尾の改行を保持してください。閉じマーカーが正しく新しい行に配置される必要があります。

さらに詳しい設定やカスタマイズについては、AI Setup Assistant で質問してみてください。

OpenClaw

OpenClaw Expert

まだ解決しませんか?

このページで解決しない場合は、OpenClaw Expertに直接質問してください。