亞澤 · yazelin.github.io

週二快閃加開場 · 2026-10-06

Larch 視覺小說本機預覽:larch-preview 講義

這份講義整理今晚講的東西:官方 API 的寫入限流實測、本機預覽怎麼運作、不用 AI 怎麼用、按 F 留回饋給 agent、改完怎麼推回 Larch,還有三個平台的安裝指令。數字是 2026-10-06 下午量的,量法和原始數據都留著。

1線上改,卡在哪

單次改一句其實不慢。卡的是一部作品要來回改上百次:

實測:線上 vs 本機(2026-10-06 下午,各量兩輪)
項目 線上(官方 agent API) 本機(larch-preview)
單次:改一句到畫面看到 中位數 1.65 秒(10 筆) 中位數 1.01 秒(100 筆)
重整後停在哪 回標題畫面,要按開始 停在原本那張卡、那一句
限流 連續第 13 次回 429,等 49~52 秒 沒有
連續改 50 次 245.1 秒(兩輪相同) 50.3 秒、51.0 秒

連續改 50 次,本機至少快 4.8 倍。線上那欄只算寫入,沒算每次重整預覽頁。本機的 1 秒是預覽頁每 1 秒檢查一次檔案的間隔。

2不用 AI 也能用

預覽本身不呼叫 AI,不花松果幣,也不吃 token。要直接改 JSON,得先看得懂卡片結構。

  1. 準備專案檔:
  2. 啟動本機預覽:
    python3 ~/larch-preview/serve.py ~/my-story/project.json
    終端機會印出網址,預設是 http://127.0.0.1:8790/,被佔用會自動換一個,以終端機印的為準。
  3. 左右兩個視窗:左邊 VS Code 開 project.json,右邊 Chrome 開上面那個網址。
  4. 改台詞存檔:找到卡片的 data.text 或 data.dialogueLines 改字,按 Ctrl + S(Mac 是 Cmd + S)。右邊大約 1 秒後自己重整,停在原本那一句。JSON 改壞的話,畫面停在上一版,上方會寫錯在哪。
  5. 兩個快捷鍵:

3跟 agent 說哪裡要改:按 F

4頂欄的「雲端」按鈕

按鈕或快捷鍵 S 打開同步面板。要先設好 Larch API 金鑰(環境變數 LARCH_API_KEY,或 ~/.config/larch/key)。

推送前要知道:推送不會檢查「拉下來之後雲端有沒有人改過」,會直接蓋掉。網頁編輯器開著的話先關掉,不然編輯器可能把它手上的舊版推回去。整包取代也會洗掉本機檔沒帶到的欄位,推之前先在雲端存一份快照,推完回網頁看一次。

5角色與素材

看:預覽頁頂欄按「素材庫」,另開一頁列出角色的立繪與差分、專案所有的圖片音訊影片,每個標出被卡片用到幾次,沒用到的標紅。專案檔一改,兩秒內自己更新。只能看,不能在上面改。

改:抓下來的 project.json 是整個專案,角色在 characters,素材在 media,有三種改法:

"characters": [{ "id": "character-…", "name": "…", "portraitUrl": "…",
  "expressions": [{ "id": "expression-…", "kind": "pose", "name": "窗邊等", "imageUrl": "…" }] }],
"media": [{ "id": "…", "url": "https://cdn.jsdelivr.net/gh/<帳號>/<repo>@<分支>/<路徑>", "name": "…", "type": "image" }]
要知道的三件事:
  1. 新圖可以用 jsDelivr:圖推到 GitHub 公開 repo,JSON 填 jsDelivr 網址,本機預覽直接載得到(實測 200),不用先傳上 Larch。RPG 地圖的圖例外:本機會經過 serve.py 的代理,只放行 Larch 網域。
  2. 換差分圖,畫面不會跟著變:播放器顯示哪張立繪,看的是每張卡的 stage.actors[].url,跟角色資料裡的 expressions 無關。要換畫面上的立繪就改那些卡。
  3. rev 目前看不到:只有拉取或推送成功時頂端會閃一下「Rev 382」。本機沒記住是從哪一版拉下來的,所以推送也擋不到雲端被改過,這兩件是下一步要做的。

6安裝

MIT 授權。repo 不放 Larch 官方的前端檔案,sync.py 會在自己的電腦上從 larch.ink 抓(第一次大約 26 MB、一分鐘左右)。

macOS / Linux(終端機)

git clone https://github.com/yazelin/larch-preview ~/larch-preview
cd ~/larch-preview && python3 sync.py

# Claude Code
mkdir -p ~/.claude/skills && ln -s ~/larch-preview ~/.claude/skills/larch-preview
# Codex、agy、GitHub Copilot CLI
mkdir -p ~/.agents/skills && ln -s ~/larch-preview ~/.agents/skills/larch-preview

Windows(PowerShell)

git clone https://github.com/yazelin/larch-preview "$HOME\larch-preview"
cd "$HOME\larch-preview"; python sync.py

# Claude Code
New-Item -ItemType Junction -Path "$HOME\.claude\skills\larch-preview" -Target "$HOME\larch-preview" -Force
# Codex、agy、GitHub Copilot CLI
New-Item -ItemType Junction -Path "$HOME\.agents\skills\larch-preview" -Target "$HOME\larch-preview" -Force
Larch 平台更新之後:再跑一次 python3 sync.py(Windows 是 python sync.py)。官方前端沒變就不會重抓;要整包重抓加 --force。
跨平台現況:回饋檔的檔案鎖在 Linux/macOS 用 fcntl,Windows 改用 msvcrt.locking。64 個 Python 測試、9 個 Node 測試在 Linux 上全過;Windows 和 macOS 還沒有實機跑過,遇到問題請你的 AI 照錯誤訊息修。

7改完怎麼推回 Larch

本機改的時候不打雲端 API,改完推一次。50 次寫入變成 1 次,就不會撞到限流。兩條路都是整包取代:

方法 怎麼做 要注意
叫 agent 推 跟 agent 說:「把本機的 project.json 推上雲端專案 project-xxxx」,它會用 larch_replace_project。 沒帶到的欄位會被洗掉。推之前存快照,推完回網頁看一次。
不用 AI 預覽頁頂欄「雲端」→ 推送。 同上。不建議自己手打 curl -X PUT:body 要包一層 {"project": …},少包這層,伺服器一樣回 200,但雲端專案會被清空。

8常見問答

Q1:圖片和語音會存到硬碟嗎?
A:不會。serve.py 從 Larch 的媒體網址代抓,放在記憶體裡,關掉伺服器就沒了。所以預覽時還是要連網。硬碟上只有專案 JSON 和播放器前端快取(約 26 MB)。

Q2:白板可以改嗎?
A:不能,白板只能看。要改卡片或連線,改 JSON 存檔,白板會跟著重整。

Q3:推上去會蓋掉別人的進度嗎?
A:會。推送不會檢查你拉下來之後雲端有沒有被改過。多人一起做、或網頁編輯器開著的時候,推之前先確認。

官方活動:第三屆 Larch 創作者挑戰《自由與限制》
為期 3 週,10/04~10/24 截止,現在第 1 週,11/01 公布結果。用 Larch 做一個 5~10 分鐘的故事,有用 RPG 擴充功能會加分。
報名送 100 枚松果幣,分享活動可以申請活動 Pro,最佳作品獎金 US$50。
活動頁:larch.ink/creator-challenge

9現場補充(直播時講到、原本講義沒寫的)

10會後補充(10/7):jsDelivr 的兩個坑

補充:素材放 GitHub 走 jsDelivr 有一些限制,作品一大就會遇到。

11會後補充(10/7):素材載入加速,有需要才往下一步

不是每部作品都要做到最後一階。每往下一階都多一件要自己管的事(雖然也是叫 AI 做啦),所以照順序來:看到「往下一步」的症狀才往下走,作品小就停在第 0 或第 1 階。下面的數字都是 2026-10-07 量的。

第 0 階:不優化

第 1 階:換格式(還是放在 Larch)

第 2 階:素材搬到 GitHub,走 jsDelivr

第 3 階:孤兒 tag(先整部一個,超過才拆)

素材都在本機時,上傳的順序

製作中素材放在本機,project.json 寫相對路徑(例如 bg/night.webp),larch-preview 直接讀得到。要推上 Larch 時照這個順序,不能反過來:

  1. 素材推上 GitHub 公開 repo(jsDelivr 只抓得到已經推上去的 commit)。
  2. 用到的素材超過 40 MB,打孤兒 tag(第 3 階)。
  3. 把相對路徑換成 jsDelivr 網址,釘在 tag 或 commit 上(@card-… 或 @<commit>),不要用 @main。
  4. 每個網址實際抓一次,確認回 200,順便把快取暖起來(冷快取第一次可能要等好幾十秒)。
  5. 最後才推 project.json。先推的話,玩家打開時有些圖還抓不到。

12連結