跳至主要內容

分頁與持久化

多分頁工作區​

CodefyUI 支援以分頁形式呈現多個獨立的畫布。每個分頁都有各自的:

  • 節點、連線與排版
  • 執行環境與紀錄
  • 錄製的輸出與保留的權重(見教學檢視器)
  • 復原/重做歷史(最多 50 步)

你可以並列保留多個實驗,例如在一個分頁放訓練 graph,另一個放推論 graph,而且各分頁的狀態不會互相干擾。

分頁列​

分頁列尾端的 + 會開啟一個空白分頁。雙擊分頁,或在取得焦點的分頁上按 F2,即可重新命名(Enter 套用,Esc 取消)。正在執行的分頁會在名稱旁顯示一個圓點。唯讀徽章表示儲存(以及外掛寫入)會被拒絕,通常是因為該 graph 由比目前更新的 CodefyUI 寫入;重新命名與關閉仍然可用。外掛開啟的分頁則會在游標停留時說明來源。每個分頁都有關閉按鈕,最後一個分頁也一樣。空白分頁會直接關閉,graph 自開啟或上次儲存後沒有變更的分頁也一樣。其他含有 graph 的分頁在關閉前,系統會先確認並指出節點數量,因為關閉分頁無法復原;檔案之後被刪除或在磁碟上被改動的分頁、外掛開啟的分頁,以及重新載入頁面後所有含有 graph 的分頁,都會這樣詢問。關閉正在執行的分頁時會詢問「此分頁仍在執行中,確定要關閉嗎?」;執行本身會繼續在伺服器上進行,並留在執行任務面板中。伺服器從專案目錄執行時,每個專案會保留自己的一組分頁。

用鍵盤操作時,按 Tab 會停在分頁列中目前開啟的分頁。Left 與 Right 在分頁間移動焦點,到了兩端會繞回另一端,Home 與 End 則跳到第一個與最後一個分頁;Enter 或 Space 會切換到取得焦點的分頁,Delete 則關閉該分頁,效果和它的關閉按鈕相同。螢幕閱讀器讀出分頁名稱時,會一併讀出開啟它的外掛與唯讀(如果有的話)。

歡迎畫面​

沒有開啟任何分頁時,CodefyUI 會以歡迎畫面取代編輯器。新增空白圖表會開啟一個空白分頁。開啟已儲存的圖表同樣會開啟一個空白分頁,並在旁邊顯示側邊欄的圖表清單;從這個清單開啟的圖,在目前分頁是空的、也沒有可復原的步驟時會放進目前分頁,否則會開在新分頁,所以你點選的圖會放進這個分頁。匯入... 就是圖表分頁裡的那一個,可讀取圖的 .json 或工作區檔案。瀏覽全部範例會開啟範例圖庫,或從一個範例開始底下的卡片則列出範例;選取其中一個會在新分頁中開啟。

歡迎畫面顯示期間:

  • 工具列只留下專案徽章、設定、?、字級與語言;外掛新增的按鈕會在開啟分頁後回來
  • 設定不會顯示屬於圖的錄製與檢視與訓練行為
  • 範例圖庫只提供在新分頁開啟
  • 沒有側邊欄與結果面板,所以要使用版本控制與執行任務,必須先用 + 或新增空白圖表開啟一個分頁;至於圖表分頁,歡迎畫面上就有開啟已儲存的圖表與匯入...

空白狀態會和其他狀態一樣被儲存:重新載入後仍會回到歡迎畫面。從未儲存過任何分頁的瀏覽器,會從一個空白的 分頁 1 開始。

自動儲存​

所有分頁都會自動存在瀏覽器裡,因此重新載入頁面時你的工作會被還原。這是瀏覽器本機的儲存;不會同步到伺服器。所以換一個瀏覽器或另一台電腦時,這些分頁都不會出現;要把它們帶過去,請用工作區檔案。

重新載入會還原每個分頁的 graph(節點、連線、排版、段落標記與子圖定義)、名稱與說明、裝置、它綁定的已儲存 graph、唯讀標記,以及執行設定。不會還原的有:復原/重做歷史、執行紀錄、輸入的機密值,以及你當時正在編輯的子圖層級(會回到最上層);外掛暫時開啟的分頁也不會被儲存。若分頁的執行當時仍在進行,且伺服器上還有這次執行,分頁會重新接上它。

儲存使用 IndexedDB,每個分頁各存一筆資料。這對大型 graph 很重要:舊的 localStorage backend 對每個來源大約只有 5MB 上限,graph 一旦超過就會直接停止儲存。IndexedDB 沒有相當的實務上限,而且每次只有目前編輯的分頁會重新寫入。

第一次開啟採用 IndexedDB 儲存的版本時,localStorage 最後儲存的內容會自動複製到 IndexedDB,不需要任何操作。舊的 localStorage 副本會保留(所以降回舊版仍可開啟它最後讀取的 graph),但之後不再更新。

如果你的瀏覽器沒有可用的 IndexedDB — 某些無痕模式,或被 sandbox 限制的 iframe — 儲存會退回 localStorage,也就回到它原本的容量上限。

儲存出問題時會出現以下三種警告。每一則都會留在畫面上直到你關閉,而且每分鐘最多出現一次:

  • 「無法儲存分頁 — 瀏覽器儲存空間已滿。」:localStorage 備援無法存入分頁。
  • 「瀏覽器儲存空間已降級為容量較小的備援方案 — 較大的圖可能會無法儲存。」:寫入 IndexedDB 失敗,儲存改用 localStorage。這一則在每個工作階段只會出現一次。
  • 「瀏覽器儲存空間無法運作 — 畫面上的分頁可能不是最新的,新的變更也可能不會被儲存。…」:開啟頁面時無法讀取已儲存的分頁。

出現其中任何一則時,請在關閉頁面前先匯出工作區檔案。

在多個瀏覽器分頁開啟​

用同一個網址開啟 CodefyUI 的每個瀏覽器分頁都共用同一份已儲存的工作區,所以同一時間只有其中一個能編輯;否則每個分頁都會把自己的內容存到其他分頁的成果上。最先開啟的分頁負責編輯。之後開啟的分頁會被這個瀏覽器分頁目前唯讀的提示蓋住,在其中做的任何事都不會被儲存。這種情況很容易發生:cdui start 會印出網址,瀏覽器也會重新開啟先前的視窗。

在提示上按在這裡編輯,就會把編輯移到這個分頁。原本負責編輯的分頁會先儲存最後的變更、停止儲存,並顯示編輯已移到另一個瀏覽器分頁;接著這個分頁會以最新儲存的內容重新載入。在舊分頁按在這裡編輯,也能用同樣的方式把編輯移回去。原本負責編輯的分頁若卡住了,或被瀏覽器凍結,這個分頁不會一直等它:10 秒後就直接接手;在一般 http 頁面上,1 秒內沒有回應就接手(見下文)。卡住的分頁醒來後不會再儲存任何東西,並顯示編輯已移到另一個瀏覽器分頁;它還沒儲存的內容會遺失。負責編輯的分頁關閉後,唯讀的分頁會維持唯讀,直到你在其中按下在這裡編輯;它不會自己重新載入。

網址只要有任何不同(包括 localhost 與 127.0.0.1),就是不同的工作區。從區域網路位址以一般 http 提供的頁面,用不到這項功能所依賴的瀏覽器機制(Web Locks),所以那裡的分頁改用互傳訊息找到彼此。運作方式相同,只有一個缺口:另一個分頁開啟時,忙到無法回應的分頁可能會被漏掉。這時由較晚開啟的分頁負責編輯;忙碌的分頁醒來後會顯示編輯已移到另一個瀏覽器分頁,它還沒儲存的內容會遺失。

儲存與載入​

已儲存的 graph 放在伺服器上,而不是瀏覽器中:

  • 檔案 → 儲存與工具列的儲存圖示,會把目前分頁的 graph 直接寫回它開啟時的那個 graph,不會再詢問。伺服器跑在哪裡都一樣,這件事不需要專案目錄。還沒綁定任何 graph 的分頁(新畫布、匯入的檔案、開啟的範例)以及另存新檔... 則會詢問名稱,並在這個名稱會蓋掉清單裡既有的 graph 時先提醒。把範例插入已綁定某個已儲存 graph 的分頁時,綁定會保留,所以下一次儲存會直接把合併後的 graph 寫回去,不會詢問。檔案 → 清除畫布會在確認後清空分頁。
  • 另存新檔...,以及尚未綁定 graph 的分頁第一次儲存時,分頁名稱會改成你輸入的名稱;名稱欄位會預先填入 graph 的名稱,尚未儲存的分頁則填入分頁名稱。直接寫回已綁定 graph 的儲存不會改變分頁名稱。在側邊欄的圖表分頁用重新命名改名的 graph,持有它的每個分頁也會跟著改名。
  • 側邊欄的圖表分頁會列出這些 graph(可搜尋,最近修改的排在前面),並標出目前分頁綁定的那一列。點擊一列會開啟那個 graph,並把它所在的分頁綁定到該檔案。目前分頁是空的時,graph 會放進目前分頁,否則會開在新分頁,所以有任何東西的畫布都不會被取代,沒有東西要確認,也不會弄丟東西。點擊已經開著的 graph 則會切到持有它的分頁,而不是再開一份。
  • 該列的選單只有兩個項目:重新命名與刪除。刪除會先確認,再把檔案從磁碟移除,在專案目錄下則會連同它的另一半一起刪除。被更名或刪除的檔案正好是某個分頁要存回去的那一個時,該分頁會跟著改:綁定到新名稱,或不再綁定任何檔案,讓下一次儲存改為詢問,而不是把你剛刪掉的檔案默默寫回去。面板的標題列也有自己的另存新檔...,讓一次儲存直接出現在你正在看的清單裡。

匯入/匯出​

你可以把任何 graph 匯出成 JSON 檔案,之後再匯入回來(或分享):

  • 匯出 → 匯出為 JSON會把目前分頁的 graph(節點、連線、參數、段落標記與子圖定義)寫成一個 .json 檔案。
  • 側邊欄圖表分頁底部的匯入... 可以讀取 graph 的 .json,也可以讀取工作區檔案,並依檔案內容(而不是檔名)分辨兩者。兩者都不會取代已開啟的 graph。只有在目前分頁是空的(沒有節點、沒有註記,也沒有可復原的步驟)時,graph 才會放進目前分頁;否則會開在一個新分頁,分頁以 graph 的名稱命名,graph 沒有名稱時則用檔名。已開啟 32 個分頁時,需要新分頁的 graph 會被拒絕並顯示訊息。工作區檔案只會增加分頁。不是 graph 的 .json 檔會被拒絕並顯示訊息;由較新版 CodefyUI 寫出的 graph 則會以唯讀方式開啟,並顯示通知。匯入的 graph 不綁定任何檔案,所以第一次儲存會詢問名稱。
  • 匯入... 到目前的空白分頁時,分頁名稱會和新分頁一樣改成 graph 的名稱;graph 沒有名稱時則用檔名。
  • 匯出為 JSON與匯出為 Python會用已儲存 graph 的檔名命名,不會詢問;檔案裡的 graph 名稱(JSON 的 name、腳本的 GRAPH_NAME)則是已儲存 graph 的名稱。尚未儲存的分頁會先詢問檔名,並預先填入分頁名稱;你輸入的名稱也會成為檔案裡的 graph 名稱和分頁名稱,按取消就不會匯出。檔名中的中文等各種文字、數字、- 與 _ 都會保留,其他字元會改成 _。匯出架構圖不會詢問:用已儲存 graph 的檔名,否則用分頁名稱。
  • 匯出 → 匯出架構圖 (SVG)/匯出架構圖 (PNG) 只會繪製架構 — 節點、連接埠與連線,不含參數值 — 並使用適合文件的淺色背景。
  • 匯出 → 匯出為 Python會產生一個可讀的單檔 Python 程式:每個節點一個函式(參數以可編輯的字面值內嵌)、依執行順序把節點串接起來的流程函式,以及帶有簡易命令列介面的 main() 進入點。每個節點函式都委派給畫布所使用的同一份節點實作,因此執行結果與畫布一致。請用相容的 CodefyUI 安裝環境中的 Python 來執行;不需要啟動網頁伺服器。CodefyUI 內建外掛包(edu、foundations、deep、stats、rl)的節點會自動從該安裝環境載入,即使該外掛包在那裡已停用也一樣;其他外掛的節點則需要先在那裡安裝並啟用該外掛,否則腳本會停止,並在訊息中指出該外掛包。腳本也會帶著每個 Map 節點所執行預設組合的副本(Map 的 subgraph 設定指名的那個),並以這份副本取代執行環境中同名的預設組合,所以執行環境不必安裝這些預設組合。若 Map 指名的預設組合不在這個 CodefyUI 裡,匯出和執行都會拒絕這張圖。用 --help 查看裝置、GraphInput JSON、逾時與專案資產等選項。讀取節點裡的相對檔案路徑如何解析,請見相對檔案路徑。

後端的範例 graph 使用的正是同一種 JSON 格式,所以匯出的 graph 也可以用 CLI 圖形執行器 在無介面(headless)下執行。

提示

因為 graph 是純 JSON,所以可以直接進行 diff 與版本控制。將 graph 與程式碼一起 commit,即可記錄一個精確且可重現的管線版本。

工作區檔案​

匯出 → 工作區 (.cduiworkspace) 會把所有開啟的分頁寫進一個檔案 workspace-YYYY-MM-DD.cduiworkspace,讓整個工作階段可以搬到另一個瀏覽器或另一台電腦。匯入... 可以把它讀回來:分頁會加在現有分頁旁邊,不會取代任何已開啟的 graph;如果瀏覽器裡只有一個空分頁,而且沒有可復原的步驟,匯入後就只會留下匯出的那一組分頁。

檔案會記下每個分頁的標題、graph 與執行設定:亂數種子、決定性演算法、錄製節點輸出、顯示內部步驟、在多次執行間保留權重、擷取梯度與自動合成損失。也會記下當時作用中的分頁,以及六項偏好設定:語言、字級、連線樣式、對齊格線、顯示節點說明與節點分類模式。檔案裡的每個 tabs[i].graph 都是一般的「匯出為 JSON」graph。匯入時兩者都會套用:檔案中當時作用中的分頁會成為作用中的分頁(若該分頁被略過,則是第一個匯入的分頁),而那六項偏好設定會取代這個瀏覽器的設定,所以編輯器的語言可能會跟著切換。匯入後會有一則訊息說明匯入了幾個分頁,以及略過的原因。

以下內容不會寫進檔案:

  • 機密參數值
  • 外掛存在瀏覽器裡的資料,例如助理外掛存放的 provider API 金鑰
  • 執行結果與訓練出的權重:它們放在伺服器的記憶體裡
  • 分頁與已儲存 graph 之間的綁定
  • 設定裡的運算裝置與面板版面:它們只屬於這一台電腦

因此匯入的分頁不綁定任何已儲存的 graph:第一次儲存會詢問名稱,而且在蓋掉清單裡既有的名稱之前會先確認。在專案目錄下,也要等到第一次儲存才會標記。

機密值是依節點定義認出來的,所以負責匯出的那個瀏覽器若沒有載入某個節點類型(外掛被停用或沒安裝),就認不出它的機密值;儲存與匯出為 JSON也有同樣的限制,分享檔案前請先檢查這類分頁。

空分頁、唯讀分頁與外掛暫時開啟的分頁不會被匯出。因此沒有任何內容可匯出時,匯出會顯示「沒有可匯出的內容:所有分頁都是空的或唯讀。」;有唯讀分頁被略過時,會說明略過了幾個。匯入時,不是 graph 的項目,或會成為第 33 個分頁的項目會被略過,其餘照常開啟 — 一次匯入最多開到 32 個分頁,而匯入時被取代的那個空分頁不算在內。超過 64 MiB 的檔案,或由較新版 CodefyUI 寫出的工作區檔案,會整個被拒絕。這裡沒有安裝的節點類型會以佔位節點開啟,並以警告列出缺少的類型;之後不會自動修復,請先安裝它所屬的外掛或自訂節點,再重新匯入檔案。