- Bump version to 0.6.0 and enhance project description in pyproject.toml. - Introduce runtime state management with RuntimeCandidateState and RuntimeCandidateStateStore classes to handle candidate updates and state retrieval. - Implement server routes for updating and reading runtime candidate states, handling various request scenarios and errors. - Add tests for runtime layout and prompt random choice functionality, ensuring robust validation and state management. - Enhance frontend with runtime candidate editor, including UI updates and synchronization with server state.
102 lines
3.4 KiB
Markdown
102 lines
3.4 KiB
Markdown
# Runtime behavior specification
|
|
|
|
## 目的
|
|
|
|
Queue投入済みで未実行のジョブが、ノード実行時点でサーバーに受理済みの
|
|
最新候補集合を参照できるようにする。実行開始済みのジョブは変更しない。
|
|
|
|
## Queue時とRuntime時の分離
|
|
|
|
Queue時に確定するもの:
|
|
|
|
- グラフと接続
|
|
- `change_every`
|
|
- サーバー状態がない場合のフォールバック候補テキスト
|
|
- 永続化された`state_key`
|
|
|
|
Runtime同期するもの:
|
|
|
|
- 候補入力テキスト
|
|
- 入力状態
|
|
- 受理済み候補revision
|
|
|
|
`change_every`はRuntime同期しない。
|
|
|
|
## 選択寿命
|
|
|
|
Runtimeで更新されるのは候補集合であり、現在選択中の完成文字列ではない。
|
|
|
|
```text
|
|
change_every = 3
|
|
実行1: revision 1からAを選択
|
|
編集: revision 2を受理
|
|
実行2: A
|
|
実行3: A
|
|
実行4: revision 2から再選択
|
|
```
|
|
|
|
- 候補編集でrepeat countをリセットしない。
|
|
- 選択中候補の削除、`#`化、内容変更でも保持期間中は完成文字列を維持する。
|
|
- `!`の追加・削除も次回再選択時に反映する。
|
|
- `change_every`入力値自体がQueue間で変わった場合は、新周期として選択し直す。
|
|
- `selected_revision`は現在の完成文字列を決めたrevisionを表す。
|
|
|
|
## サーバー状態
|
|
|
|
状態は少なくとも次を保持する。
|
|
|
|
```text
|
|
state_key
|
|
node_kind
|
|
input_text
|
|
input_status
|
|
error
|
|
accepted_text
|
|
revision
|
|
client_id
|
|
client_sequence
|
|
```
|
|
|
|
- `accepted_text=None` と受理済み空文字 `accepted_text=""` を区別する。
|
|
- revisionは正常な候補テキストが変わった場合だけ増加する。
|
|
- incomplete/hard errorだけではrevisionを増加させない。
|
|
- クライアントごとの連番で古い更新と連番再利用を拒否する。
|
|
- 状態はメモリ内にあり、ComfyUI再起動で消える。
|
|
- 状態がなければQueueへ保存された候補テキストを使用する。
|
|
|
|
## エラー分類
|
|
|
|
### Soft incomplete
|
|
|
|
例: 波括弧の閉じ忘れ、余分な閉じ括弧。
|
|
|
|
- 新しい正常revisionとして受理しない。
|
|
- 直前の`accepted_text`とrevisionを維持する。
|
|
- Hard Error状態は解除する。
|
|
- 実行は最後の正常候補集合で継続する。
|
|
- 正常候補が一度もなく、Queueフォールバックも不正なら実行エラー。
|
|
- UIは `EDITING / SYNTAX INCOMPLETE` と使用中revisionを表示する。
|
|
|
|
### Hard error
|
|
|
|
例: 隣接する複数の直接子グループ、単独の `!`、上限超過。
|
|
|
|
- サーバーはHard Error状態を保存する。
|
|
- 最後の正常候補を黙って使用しない。
|
|
- 現在の`change_every`保持期間中でも、次回実行を`ValueError`で停止する。
|
|
- 正常な入力が受理されたらHard Errorを解除する。
|
|
- UIは `HARD ERROR` と理由を表示する。
|
|
|
|
## フロントエンド同期
|
|
|
|
- 120ms debounce。
|
|
- 日本語IME変換中は送信しない。
|
|
- 1ノード内の送信は順番に処理する。
|
|
- UTF-8で512KiBを上限とする。
|
|
- Workflow複製で重複した`state_key`は再発行する。
|
|
- 入力内容は通常どおりWorkflowへ保存する。
|
|
- `EDITING / SYNCING / LIVE / SYNC ERROR`を表示する。
|
|
- サーバーに状態があれば、その`input_text`を初期表示へ復元する。
|
|
- Runtime textareaはDOMウィジェットの可変領域を使用し、ノードの高さ変更へ追従する。
|
|
- textareaは可変領域、同期状態フッターは固定領域として配置する。
|