Skip to content

Bold by TextPart in @tanstack/ai-*-ui is not compatible with Japanese and Chinese (and occasionally Korean) due to spec defect in CommonMark #164

@tats-u

Description

@tats-u

TanStack AI version

@tanstack/[email protected]

Framework/Library version

[email protected]

Describe the bug and the steps to reproduce it

Bold annotations by ** (and emphasis annotations by *) are frequently broken or undone in Japanese and Chinese (and occasionally Korean).

https://streamdown.ai/docs/cjk-support
commonmark/commonmark-spec#650
vercel/streamdown#185
CherryHQ/cherry-studio#4119

Example offending Markdown:

**この文は倪字になりたせんThis sentence is not be bolded。**この文のせいでIt is due to this sentence。

- **12 Factor 的には“蚭定は倖郚の環境で䞎えるべき”**で、アプリが自分で .env を読み蟌むのは境界を曖昧にする、ずいう䞻匵。アプリは既に存圚する環境倉数だけを読むべき、ずいう立堎です。
- **平文の .env環境倉数に機密を眮くリスク。**環境ダンプやログ、クラッシュレポヌト等で挏掩しやすい。自動ロヌテヌションされにくい、ずいう指摘CI/CD 事故䟋の教蚓。セクレトは専甚のシヌクレットマネヌゞャで管理し、自動回転・監査、ずいうベストプラクティスが䞻流です。
- **フレヌムワヌクの“暗黙ロヌド”が本番で驚きになりうる。**䟋Flask は `python-dotenv` が入っおいれば `.env`/`.flaskenv` を自動で読むため、意図せず蚭定が倉わる恐れ。

Kiyoshiさん、掘り䞋げ了解〜よし、今日は**「い぀・どう䜿うどう䜜る」を実務目線で䞀気に把握**しちゃいたしょ。぀いおきおね😉

䌁業局からは**“明日の午前䞭には埩旧する”**ずいう情報が出おおりたすが、**読谷村内の氎道が通垞どおり䜿えるようになる時期を瀺すものではありたせん。**

たず埓来のコンピュヌタは、0か1のどちらかの状態を取る**「ビット」**で情報を扱う。これに察しお量子コンピュヌタは、**「量子ビットキュヌビット」**を甚いる。この量子ビットは、量子力孊の性質によっお**0ず1を同時に持぀「重ね合わせ状態」** になるこずができる。この「同時に耇数状態を扱える」点が、量子コンピュヌタの蚈算胜力の源になっおいる。

There are remark plugins that fixes this defect by modifying the spec only for CJK languages. They are recommended especially world-wide AI applications that may handle CJK languages. Humans can fix offending results by adding extra spaces if they have a live preview, but AI does not have a way to check the preview and cannot fix them.

Comparison with and without such plugins:

https://tats-u.github.io/markdown-cjk-friendly/?s16=KgAqAFMwbjCHZW8wKllXW2swajCKMH4wWzCTMAj_VABoAGkAcwAgAHMAZQBuAHQAZQBuAGMAZQAgAGkAcwAgAG4AbwB0ACAAYgBlACAAYgBvAGwAZABlAGQACf8CMCoAKgBTMG4wh2VuMFswRDBnMAj_SQB0ACAAaQBzACAAZAB1AGUAIAB0AG8AIAB0AGgAaQBzACAAcwBlAG4AdABlAG4AYwBlAAn_AjAKAAoALQAgACoAKgAxADIAIABGAGEAYwB0AG8AcgAgAIR2azBvMBwgLYqaW28wFlnokG4wsHSDWGcwDk5IMIsweTBNMB0gKgAqAGcwATCiMNcw6jBMMOqBBlJnMCAALgBlAG4AdgAgAJIwrYp_MLyPgDBuMG8wg1hMdZIw1mYnZmswWTCLMAEwaDBEMEYwO041XwIwojDXMOowbzDiZWswWFsoV1kwizCwdINYCVlwZWAwUTCSMK2KgDB5ME0wATBoMEQwRjDLejRYZzBZMAIwCgAtACAAKgAqAHNeh2VuMCAALgBlAG4AdgAP_7B0g1gJWXBlazBfasZbkjBuf08w6jC5MK8wAjAqACoAsHSDWMAw8zDXMIQw7TCwMAEwrzDpMMMwtzDlMOww3TD8MMgwSXtnMA9vKW1XMIQwWTBEMAIw6oHVUu0w_DDGMPwwtzDnMPMwVTCMMGswTzBEMAEwaDBEMEYwB2NYZAj_QwBJAC8AQwBEACAAi05FZYtPbjBZZROKCf8CMLswrzDsMMgwbzACXCh1bjC3MPwwrzDsMMMwyDDeMM0w_DC4MOMwZzChewZ0VzABMOqB1VLeVuKO-zDjdvtnATBoMEQwRjDZMLkwyDDXMOkwrzDGMKMwuTBMMDtOQW1nMFkwAjAKAC0AIAAqACoA1TDsMPww4DDvMPwwrzBuMBwgl2bZnu0w_DDJMB0gTDAsZ2p1ZzBamk0wazBqMIowRjCLMAIwKgAqAItPGv9GAGwAYQBzAGsAIABvMCAAYABwAHkAdABoAG8AbgAtAGQAbwB0AGUAbgB2AGAAIABMMGVRYzBmMEQwjDBwMCAAYAAuAGUAbgB2AGAALwBgAC4AZgBsAGEAcwBrAGUAbgB2AGAAIACSMOqB1VJnMK2KgDBfMIEwATAPYfNWWzBaMC2KmltMMAlZjzCLMFBgjDACMAoACgBLAGkAeQBvAHMAaABpAFUwkzABMJhjijALTlIwhk7jiRwwAf-IMFcwATDKTuVlbzAqACoADDBEMGQw-zBpMEYwf09GMB__aTBGMFxPizAf_w0wkjCfW9lS7nbafWcwAE4XbGswimLhYyoAKgBXMGEwgzBEMH4wVzCHMAIwZDBEMGYwTTBmMG0wPdgJ3goACgABT21pQFxLMIkwbzAqACoAHCAOZuVlbjBIU01SLU5rMG8wqV_nZVkwizAdICoAKgBoMEQwRjDFYDFYTDD6UWYwSjCKMH4wWTBMMAEwKgAqAK2KN4xRZ4VRbjA0bFOQTDAakDheaTBKMIowf09IMIswiDBGMGswajCLMEJmH2eSMDp5WTCCMG4wZzBvMEIwijB-MFswkzACMCoAKgAKAAoAfjBaMJNfZWduMLMw8zDUMOUw_DC_MG8wATAwAEswMQBuMGkwYTCJMEswbjC2ckthkjDWU4swKgAqAAww0zDDMMgwDTAqACoAZzDFYDFYkjBxYkYwAjBTMIwwazD-W1cwZjDPkVBbszDzMNQw5TD8ML8wbzABMCoAKgAMMM-RUFvTMMMwyDAI_60w5TD8MNMwwzDIMAn_DTAqACoAkjAodUQwizACMFMwbjDPkVBb0zDDMMgwbzABMM-RUFubUmZbbjAnYOqMazCIMGMwZjAqACoAMABoMDEAkjAMVEJmazABY2QwDDDNkW0wCFSPMFswtnJLYQ0wKgAqACAAazBqMIswUzBoMEwwZzBNMIswAjBTMG4wDDAMVEJmazAHiXBltnJLYZIwcWJIMIswDTC5cEwwATDPkVBbszDzMNQw5TD8ML8wbjAIipd7_YCbUm4wkG5rMGowYzBmMEQwizACMA&gfm=1&engine=micromark

Reproduction:

  1. Open the reproduction link
  2. Paste an offending Markdown to the text area
  3. ** are not recognized as bold

To fix:

Just add remark plugins remark-cjk-friendly (and remark-cjk-friendly-gfm-strikethrough) to the Markdown rendering component

Your Minimal, Reproducible Example - (Sandbox Highly Recommended)

https://stackblitz.com/edit/vitejs-vite-irf2vdzr?file=package.json

Screenshots or Videos (Optional)

Image Image
Image
### なぜ「アンチパタヌン」ず蚀われるのかよくある論点

- **12 Factor 的には“蚭定は倖郚の環境で䞎えるべき”**で、アプリが自分で .env を読み蟌むのは境界を曖昧にする、ずいう䞻匵。アプリは既に存圚する環境倉数だけを読むべき、ずいう立堎です。
- **平文の .env環境倉数に機密を眮くリスク。**環境ダンプやログ、クラッシュレポヌト等で挏掩しやすい。自動ロヌテヌションされにくい、ずいう指摘CI/CD 事故䟋の教蚓。セクレトは専甚のシヌクレットマネヌゞャで管理し、自動回転・監査、ずいうベストプラクティスが䞻流です。
- **フレヌムワヌクの“暗黙ロヌド”が本番で驚きになりうる。**䟋Flask は `python-dotenv` が入っおいれば `.env`/`.flaskenv` を自動で読むため、意図せず蚭定が倉わる恐れ。
- **優先順䜍の混乱。** `.env` が本来の環境倉数を䞊曞きしお事故る――ただし `python-dotenv` は**既定では䞊曞きしたせん**`override=True` を付けた堎合のみ。たた `PYTHON_DOTENV_DISABLED=1` でロヌド自䜓を無効化できたす。
- こうした背景から「dotenv は開発専甚・本番では䜿うな」ず断ずる蚘事もありたす。

### では、どう䜿い分ける

#### OK掚奚な堎面

From: https://x.com/MtkN1XBt/status/1960502766918623743?s=20

Image
Kiyoshiさん、掘り䞋げ了解〜よし、今日は**「い぀・どう䜿うどう䜜る」を実務目線で䞀気に把握**しちゃいたしょ。぀いおきおね😉

### なにが“LangChainらしさ”

- ***Runnable / LCELLangChain Expression Language**\
  いたの LangChain は「Runnable」ずいう共通むンタヌフェヌスずLCELで**凊理をパむプで぀なぐ**のが基本。モデル入れ替えやストリヌミング、䞊列、リトラむ等が統䞀APIで扱えたす。
- **゚ヌゞェント×LangGraph**\
  「ツヌルを䜿いながら自走する」゚ヌゞェントは**LangGraph**で状態管理・反埩・䞭断/再開・人手承認HITLたで堅牢に。゚ヌゞェントの実装はLangChain偎の゚ヌゞェントAPIずLangGraphが連携する圢が䞻流です。

From: https://x.com/tatakauashi/status/1988137666580492766/photo/1

Image
読谷村内の断氎情報に぀いお誀解防止のお知らせ

曎新日2025幎11月24日

**【読谷村内の断氎情報に぀いお誀解防止のお知らせ】**

䞀郚メディアやSNSにおいお、「明日11月25日・火曜日の午前に再開する」ずいった投皿が芋られたすが、これは読谷村における断氎埩旧状況を正確に瀺した情報ではありたせん。

䌁業局からは**“明日の午前䞭には埩旧する”**ずいう情報が出おおりたすが、**読谷村内の氎道が通垞どおり䜿えるようになる時期を瀺すものではありたせん。**

読谷村では、䌁業局の埩旧䜜業埌に

- **石川浄氎堎からの䟛絊再開珟時点で未定**
- 各地域で必芁ずなる **氎の排氎䜜業赀氎・サビ氎抜き**

などの工皋が必芁ずなるため、\
**実際の埩旧にかかる日数は目凊が立っおおらず、数日はかかる芋蟌みです。**

From: https://x.com/BerandaMegane/status/1992951470799679952/photo/1

Image
量子コンピュヌタは、**量子力孊の原理を利甚しお蚈算を行う新しいタむプのコンピュヌタ**である。ここでは䞀般の瀟䌚人でも理解しやすい圢で、埓来のコンピュヌタずの違いず、その可胜性をより詳しく説明する。

たず埓来のコンピュヌタは、0か1のどちらかの状態を取る**「ビット」**で情報を扱う。これに察しお量子コンピュヌタは、**「量子ビットキュヌビット」**を甚いる。この量子ビットは、量子力孊の性質によっお**0ず1を同時に持぀「重ね合わせ状態」** になるこずができる。この「同時に耇数状態を扱える」点が、量子コンピュヌタの蚈算胜力の源になっおいる。

From: https://x.com/asaokitan/status/1989865406904058020/photo/1


Only offending lines:

- **12 Factor 的には“蚭定は倖郚の環境で䞎えるべき”**で、アプリが自分で .env を読み蟌むのは境界を曖昧にする、ずいう䞻匵。アプリは既に存圚する環境倉数だけを読むべき、ずいう立堎です。
- **平文の .env環境倉数に機密を眮くリスク。**環境ダンプやログ、クラッシュレポヌト等で挏掩しやすい。自動ロヌテヌションされにくい、ずいう指摘CI/CD 事故䟋の教蚓。セクレトは専甚のシヌクレットマネヌゞャで管理し、自動回転・監査、ずいうベストプラクティスが䞻流です。
- **フレヌムワヌクの“暗黙ロヌド”が本番で驚きになりうる。**䟋Flask は `python-dotenv` が入っおいれば `.env`/`.flaskenv` を自動で読むため、意図せず蚭定が倉わる恐れ。

Kiyoshiさん、掘り䞋げ了解〜よし、今日は**「い぀・どう䜿うどう䜜る」を実務目線で䞀気に把握**しちゃいたしょ。぀いおきおね😉

䌁業局からは**“明日の午前䞭には埩旧する”**ずいう情報が出おおりたすが、**読谷村内の氎道が通垞どおり䜿えるようになる時期を瀺すものではありたせん。**

たず埓来のコンピュヌタは、0か1のどちらかの状態を取る**「ビット」**で情報を扱う。これに察しお量子コンピュヌタは、**「量子ビットキュヌビット」**を甚いる。この量子ビットは、量子力孊の性質によっお**0ず1を同時に持぀「重ね合わせ状態」** になるこずができる。この「同時に耇数状態を扱える」点が、量子コンピュヌタの蚈算胜力の源になっおいる。

https://tats-u.github.io/markdown-cjk-friendly/?s16=LQAgACoAKgAxADIAIABGAGEAYwB0AG8AcgAgAIR2azBvMBwgLYqaW28wFlnokG4wsHSDWGcwDk5IMIsweTBNMB0gKgAqAGcwATCiMNcw6jBMMOqBBlJnMCAALgBlAG4AdgAgAJIwrYp_MLyPgDBuMG8wg1hMdZIw1mYnZmswWTCLMAEwaDBEMEYwO041XwIwojDXMOowbzDiZWswWFsoV1kwizCwdINYCVlwZWAwUTCSMK2KgDB5ME0wATBoMEQwRjDLejRYZzBZMAIwCgAtACAAKgAqAHNeh2VuMCAALgBlAG4AdgAP_7B0g1gJWXBlazBfasZbkjBuf08w6jC5MK8wAjAqACoAsHSDWMAw8zDXMIQw7TCwMAEwrzDpMMMwtzDlMOww3TD8MMgwSXtnMA9vKW1XMIQwWTBEMAIw6oHVUu0w_DDGMPwwtzDnMPMwVTCMMGswTzBEMAEwaDBEMEYwB2NYZAj_QwBJAC8AQwBEACAAi05FZYtPbjBZZROKCf8CMLswrzDsMMgwbzACXCh1bjC3MPwwrzDsMMMwyDDeMM0w_DC4MOMwZzChewZ0VzABMOqB1VLeVuKO-zDjdvtnATBoMEQwRjDZMLkwyDDXMOkwrzDGMKMwuTBMMDtOQW1nMFkwAjAKAC0AIAAqACoA1TDsMPww4DDvMPwwrzBuMBwgl2bZnu0w_DDJMB0gTDAsZ2p1ZzBamk0wazBqMIowRjCLMAIwKgAqAItPGv9GAGwAYQBzAGsAIABvMCAAYABwAHkAdABoAG8AbgAtAGQAbwB0AGUAbgB2AGAAIABMMGVRYzBmMEQwjDBwMCAAYAAuAGUAbgB2AGAALwBgAC4AZgBsAGEAcwBrAGUAbgB2AGAAIACSMOqB1VJnMK2KgDBfMIEwATAPYfNWWzBaMC2KmltMMAlZjzCLMFBgjDACMAoACgBLAGkAeQBvAHMAaABpAFUwkzABMJhjijALTlIwhk7jiRwwAf-IMFcwATDKTuVlbzAqACoADDBEMGQw-zBpMEYwf09GMB__aTBGMFxPizAf_w0wkjCfW9lS7nbafWcwAE4XbGswimLhYyoAKgBXMGEwgzBEMH4wVzCHMAIwZDBEMGYwTTBmMG0wPdgJ3goACgABT21pQFxLMIkwbzAqACoAHCAOZuVlbjBIU01SLU5rMG8wqV_nZVkwizAdICoAKgBoMEQwRjDFYDFYTDD6UWYwSjCKMH4wWTBMMAEwKgAqAK2KN4xRZ4VRbjA0bFOQTDAakDheaTBKMIowf09IMIswiDBGMGswajCLMEJmH2eSMDp5WTCCMG4wZzBvMEIwijB-MFswkzACMCoAKgAKAAoAfjBaMJNfZWduMLMw8zDUMOUw_DC_MG8wATAwAEswMQBuMGkwYTCJMEswbjC2ckthkjDWU4swKgAqAAww0zDDMMgwDTAqACoAZzDFYDFYkjBxYkYwAjBTMIwwazD-W1cwZjDPkVBbszDzMNQw5TD8ML8wbzABMCoAKgAMMM-RUFvTMMMwyDAI_60w5TD8MNMwwzDIMAn_DTAqACoAkjAodUQwizACMFMwbjDPkVBb0zDDMMgwbzABMM-RUFubUmZbbjAnYOqMazCIMGMwZjAqACoAMABoMDEAkjAMVEJmazABY2QwDDDNkW0wCFSPMFswtnJLYQ0wKgAqACAAazBqMIswUzBoMEwwZzBNMIswAjBTMG4wDDAMVEJmazAHiXBltnJLYZIwcWJIMIswDTC5cEwwATDPkVBbszDzMNQw5TD8ML8wbjAIipd7_YCbUm4wkG5rMGowYzBmMEQwizACMA&gfm=1&engine=micromark


Chinese examples:

Actual:

plain CommonMark

Expected:

with this spec

Image source: CherryHQ/cherry-studio#4119


The actual cases that I have met in AI services:

Image Image

Do you intend to try to help solve this bug with your own PR?

Yes, I think I know how to fix it and will discuss it in the comments of this issue

Terms & Code of Conduct

  • I agree to follow this project's Code of Conduct
  • I understand that if my bug cannot be reliable reproduced in a debuggable environment, it will probably not be fixed and this issue may even be closed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions