週二快閃加開場 · 2026-10-06
這份講義整理今晚講的東西:官方 API 的寫入限流實測、本機預覽怎麼運作、不用 AI 怎麼用、按 F 留回饋給 agent、改完怎麼推回 Larch,還有三個平台的安裝指令。數字是 2026-10-06 下午量的,量法和原始數據都留著。
單次改一句其實不慢。卡的是一部作品要來回改上百次:
HTTP 429 retry-after: 51
{"error":"Agent 專案寫入過於頻繁,請稍後再試"}
要等 49~52 秒才能繼續,等完又能寫 12 次。連續改 50 次會被擋 4 次。| 項目 | 線上(官方 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 秒檢查一次檔案的間隔。
預覽本身不呼叫 AI,不花松果幣,也不吃 token。要直接改 JSON,得先看得懂卡片結構。
mkdir -p ~/my-story && cp ~/larch-preview/fixtures/bench_demo/* ~/my-story/
python3 ~/larch-preview/serve.py ~/my-story/project.json
終端機會印出網址,預設是 http://127.0.0.1:8790/,被佔用會自動換一個,以終端機印的為準。project.json,右邊 Chrome 開上面那個網址。data.text 或 data.dialogueLines 改字,按 Ctrl + S(Mac 是 Cmd + S)。右邊大約 1 秒後自己重整,停在原本那一句。JSON 改壞的話,畫面停在上一版,上方會寫錯在哪。B:切到白板,看整個分支,點卡片上的 ▶ 從那張卡開始播。白板只能看,不能在上面改。F:留一句修稿筆記,附截圖,寫進專案旁邊的 feedback/。F:跳出回饋面板,先帶出現在這張卡、這一句(猜錯可以從清單改選),附上截圖。專案用了自訂對話框介面的話對不到卡,要從清單自己選。feedback/feedback.jsonl,截圖是同資料夾的 png,每筆都有卡片 ID 和第幾句。cd ~/larch-preview
python3 -m lp.feedback list ~/my-story
python3 -m lp.feedback done ~/my-story <回饋id> "改了什麼"
要在 ~/larch-preview 底下跑;在別的資料夾就在前面加 PYTHONPATH=~/larch-preview。
agent 照卡片 ID 去改 JSON,改完存檔,右邊的預覽自己會更新。按鈕或快捷鍵 S 打開同步面板。要先設好 Larch API 金鑰(環境變數 LARCH_API_KEY,或 ~/.config/larch/key)。
project.json.bak.<時間>。看:預覽頁頂欄按「素材庫」,另開一頁列出角色的立繪與差分、專案所有的圖片音訊影片,每個標出被卡片用到幾次,沒用到的標紅。專案檔一改,兩秒內自己更新。只能看,不能在上面改。
改:抓下來的 project.json 是整個專案,角色在 characters,素材在 media,有三種改法:
id 不要動,卡片靠它對到角色。2026-10-06 沙盒實測:本機改角色名字與描述推回去,雲端更新,角色 id、差分、立繪網址沒被動到。larch_upsert_character):改完一樣先拉取回本機。"characters": [{ "id": "character-…", "name": "…", "portraitUrl": "…",
"expressions": [{ "id": "expression-…", "kind": "pose", "name": "窗邊等", "imageUrl": "…" }] }],
"media": [{ "id": "…", "url": "https://cdn.jsdelivr.net/gh/<帳號>/<repo>@<分支>/<路徑>", "name": "…", "type": "image" }]
serve.py 的代理,只放行 Larch 網域。stage.actors[].url,跟角色資料裡的 expressions 無關。要換畫面上的立繪就改那些卡。MIT 授權。repo 不放 Larch 官方的前端檔案,sync.py 會在自己的電腦上從 larch.ink 抓(第一次大約 26 MB、一分鐘左右)。
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
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
python3 sync.py(Windows 是 python sync.py)。官方前端沒變就不會重抓;要整包重抓加 --force。
fcntl,Windows 改用 msvcrt.locking。64 個 Python 測試、9 個 Node 測試在 Linux 上全過;Windows 和 macOS 還沒有實機跑過,遇到問題請你的 AI 照錯誤訊息修。
本機改的時候不打雲端 API,改完推一次。50 次寫入變成 1 次,就不會撞到限流。兩條路都是整包取代:
| 方法 | 怎麼做 | 要注意 |
|---|---|---|
| 叫 agent 推 | 跟 agent 說:「把本機的 project.json 推上雲端專案 project-xxxx」,它會用 larch_replace_project。 |
沒帶到的欄位會被洗掉。推之前存快照,推完回網頁看一次。 |
| 不用 AI | 預覽頁頂欄「雲端」→ 推送。 | 同上。不建議自己手打 curl -X PUT:body 要包一層 {"project": …},少包這層,伺服器一樣回 200,但雲端專案會被清空。 |
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
memory.md 或 AGENTS.md,下次比較不會再犯。cdn.jsdelivr.net/gh/…)填回劇本。要特別跟 AI 講用 jsDelivr,不然它可能直接用 GitHub 的原始網址:那也有 CDN,但只快取 5 分鐘,速度很不穩(見第 11 節第 2 階)。Ctrl + F5 強制重新整理,再點一張剛改過的卡確認內容對了。補充:素材放 GitHub 走 jsDelivr 有一些限制,作品一大就會遇到。
gh 網址把整個 repo 當成一個套件,算的是整個 repo 的大小,不是單一檔案。超過就回 Package size exceeded the configured limit of 50 MB(jsDelivr 自己的 API 文件寫的是 GitHub 50 MB、npm 150 MB,跟實際一致;主說明文件那句「150 MB」講的是 npm。需要更高的上限,可以到 jsDelivr 的 GitHub repo 開 issue 申請)。之前被抓過的檔案還在快取裡,所以症狀是有些圖慢、有些出不來、重新整理又好了。香布纏的圖 repo 250 MB、音樂 repo 180 MB,兩個都超過。@main 換成 @<tag名>。tag 用的是 main 上現成的檔案,repo 不會變大。作品用到的檔案 40 MB 以內,整部一個 tag 就好;超過才一張卡片一個 tag。香布纏用到 430 MB,所以一張卡片一個(@card-v3-8 這種),好幾張卡共用的圖或配樂放在第一張用到它的卡片,網址只有一個,換卡時不會重抓。同一批 64 張圖實測:只放卷五的測試用孤兒分支(31 MB)64 張全部拿到,整個大 repo 掛了 8 張。詳細分組見第 11 節第 3 階。v2-act1 會被 jsDelivr 當成版本號,找不到檔案,回 404。第一輪 969 個網址掛了 71 個,全部是卷二。前面加 card- 之後全部拿得到。cg3_地窖插曲一_1_c_v2.webp),也都回 200。唐詩小旅行(repo 只有 15.9 MB)10/6 撞到中文檔名 404 的那張圖,10/7 用當時的 commit 和 @main 重抓也都是 200。中文檔名本身不會 404;10/6 那次的原因還沒找到,也不是 repo 太大。檔名用英文還是比較保險。不是每部作品都要做到最後一階。每往下一階都多一件要自己管的事(雖然也是叫 AI 做啦),所以照順序來:看到「往下一步」的症狀才往下走,作品小就停在第 0 或第 1 階。下面的數字都是 2026-10-07 量的。
pub-….r2.dev),回應裡沒有 CDN 快取。一張 1376×768、918 KB 的 PNG 連抓三次,每次都要 1.2~1.4 秒,第二次沒有變快。Larch 生的配音本來就是 MP3,一句 47~96 KB,不用動。https://cdn.jsdelivr.net/gh/<帳號>/<repo>@main/<路徑>。Larch 上只留 JSON 劇本,跟一定要放平台的東西(作品封面、RPG 地圖)。本機預覽直接載得到。raw.githubusercontent.com)。@main 的網址,jsDelivr 會快取 12 小時,觀眾的瀏覽器會快取 7 天(實測 max-age=604800, s-maxage=43200)。purge.jsdelivr.net 只清得到 jsDelivr 那一層,清不到觀眾瀏覽器裡的舊圖。@ 後面那個版本當下整個 repo 有哪些檔案(不算歷史)。把網址從 @main 改成大 repo 的某個 commit,那個 commit 一樣超過 50 MB。@main 換成 @<tag名>。不用另開 repo,也不會建立分支;用的是 main 上現成的檔案,repo 不會變大。指令在 larch-preview 的 SKILL.md(「素材放 GitHub 走 jsDelivr」那一節)。@card-<卡片id>),每張卡只放它用到的檔案。好幾張卡共用的圖或配樂,放在第一張用到它的卡,網址只有一個,換卡時不會重抓、配樂不會被打斷。card- 開頭的 tag 當成 branch,一樣快取 12 小時、瀏覽器 7 天,所以 tag 打了就不改內容,要改就打下一版(-r2、-r3),舊網址照樣能用。製作中素材放在本機,project.json 寫相對路徑(例如 bg/night.webp),larch-preview 直接讀得到。要推上 Larch 時照這個順序,不能反過來:
@card-… 或 @<commit>),不要用 @main。project.json。先推的話,玩家打開時有些圖還抓不到。project.json 保留相對路徑,本機預覽才能繼續讀自己電腦上的檔、離線也能改。project.json 原樣推上去。裡面還是相對路徑的話,Larch 上的圖會全部抓不到。素材在本機的作品,叫 AI 照上面五步推。