參數系統 (Parameters)
參數定義了節點的輸入端、輸出端與自訂屬性。本頁面深入介紹 Parameter 的每個屬性欄位、特徵標籤 (Traits) 系統、參數輔助包裝類別、容器型別以及用於建立動態參數介面的進階模式。
關於參數型別至編輯器視覺部件的對應關係、支援的 ui_options 設定鍵與特徵標籤清單,請參閱 參數 UI 參考指南。
參數屬性欄位 (Parameter Attributes)
Parameter 類別包含以下核心屬性:
- name:
str,參數唯一識別名稱,不可包含空白字元。 - tooltip:
str或list[dict],在 UI 介面上懸浮顯示的提示說明文字。 - default_value:
Any,參數未連線且未指定時採用的預設值。 - type:
str,參數在引擎中的核心型別(例如"str"、"list[str]"或ParameterTypeBuiltin.STR.value)。 - input_types:
list[str],允許連入此參數的型別清單。 - output_type:
str,連線輸出至其他節點時的型別。 - allowed_modes:
set[ParameterMode],允許的模式集合,包含{INPUT, OUTPUT, PROPERTY}。 - ui_options:
dict,傳遞給前端以自訂 UI 呈現樣式的選項字典。 - converters:
list[Callable[[Any], Any]],數值寫入前的轉換器函式清單。 - validators:
list[Callable[[Parameter, Any], None]],數值校驗器函式清單。 - hide/hide_label/hide_property:常用 UI 便捷旗標(亦可透過
ui_options設定;衝突時以ui_options為準)。 - allow_input/allow_property/allow_output:配置模式的便捷旗標(若已顯式宣告
allowed_modes則會被忽略)。 - settable:
bool(預設為True)——對於純計算產生或唯讀的輸出參數,可設為False。 - serializable:
bool(預設為True)——對於不可序列化的值(如驅動器 Driver 實例、檔案控制代碼等)請設為False。當宣告在輸出端時,這會將數值保留在產生的處理程序內部,僅跨 Worker 處理程序傳遞輕量鍵值——詳見 傳遞不可序列化值。 - user_defined:
bool(預設為False)。 - private:
bool(預設為False)——對常規使用者編輯介面隱藏(供程式庫或引擎內部專用)。 - exclude_from_metadata:
bool(預設為False)——從明文出處中繼資料輸出(附屬 JSON 與嵌入式 PNG 區塊)中排除此參數的值。參數名稱仍會記錄在parameters_omitted中以供稽核。適用於保存密碼或使用者私密金鑰等敏感資訊的參數。 - parent_container_name:
str | None——將此參數指派為ParameterContainer(即ParameterList或ParameterDictionary)的子項。用於清單型所有權結構。 - parent_element_name:
str | None——將此參數巢狀掛載至ParameterGroup(UI 分組視覺元件)下方。用於節點介面中的視覺折疊分組。
特徵標籤 (Traits)
透過 add_trait() 賦予參數額外的介面互動與約束能力:
- Options:
Options(choices=list[str] | list[tuple[str, Any]], show_search: bool = True, search_filter: str = "", allow_custom: bool = False) - Slider:
Slider(min_val: float, max_val: float, soft_limits: bool = False)——soft_limits=True會將範圍視為軟性限制:滑桿軌道維持在範圍內,但手動鍵入超出範圍的值時會被允許而非拋出例外。 - Button:
Button(label: str = "", variant=..., size=..., button_link=... | on_click=..., get_button_state=...) - ColorPicker:
ColorPicker(format="hex") - FileSystemPicker:
FileSystemPicker(...)(檔案與目錄選取器 UI)
關於特徵標籤的完整清單、渲染部件及受控的 ui_options 鍵名,請參閱 參數 UI 參考指南。
保存特徵標籤狀態:特徵標籤透過 to_state() 與 apply_state() 選擇性加入狀態持久化機制。回傳符合建構子規格的文字、數值、布林值以及包含這些型別的列表或字典。不支援的值將被忽略並記錄警告。使用預設方法的特徵標籤不保存任何狀態。
接收 UI 選項寫入:實作 state_from_ui_options() 可將來自節點程式碼、編輯器或存檔的 ui_options 寫入操作映射至 apply_state() 所接受的相同狀態。預設行為會忽略寫入,這適合無可變狀態的純渲染鍵。若寫入本應改變特徵標籤的渲染結果但特徵標籤不接受該寫入,系統將記錄警告日誌。
參數輔助包裝類別 (ParameterString, ParameterInt, ...)
Griptape Nodes 在 griptape_nodes.exe_types.param_types.* 命名空間下提供了一系列便捷的 Parameter 衍生輔助類別。
其設計初衷是讓常見的參數宣告簡潔、一致且支援執行階段動態修改(許多 UI 選項皆直接封裝為 Python 屬性)。
常用輔助型別速查表
| 輔助類別 | 強制指定的 type / output_type |
預設 input_types 行為 |
核心 UI 便捷引數 | 說明備註 |
|---|---|---|---|---|
ParameterString |
"str" / "str" |
accept_any=True → ["any"] 並自動轉為 str |
markdown, multiline, placeholder_text, is_full_width |
建構子中的 type、output_type 與 input_types 引數會被忽略 |
ParameterBool |
"bool" / "bool" |
accept_any=True → ["any"] 並自動轉為 bool |
on_label, off_label |
自動識別轉換常見字串,如 "true"/"false"、"yes"/"no" |
ParameterInt |
"int" / "int" |
accept_any=True → ["any"] 並自動轉為 int |
step, slider, min_val, max_val, validate_min_max |
根據引數自動掛載約束特徵 (Clamp/MinMax/Slider) |
ParameterFloat |
"float" / "float" |
accept_any=True → ["any"] 並自動轉為 float |
step, slider, min_val, max_val, validate_min_max |
根據引數自動掛載約束特徵 (Clamp/MinMax/Slider) |
ParameterDict |
"dict" / "dict" |
accept_any=True → ["any"] 並自動轉為 dict |
(無) | 調用 griptape_nodes.utils.dict_utils.to_dict() 執行轉換 |
ParameterJson |
"json" / "json" |
accept_any=True → ["any"] 並自動轉為 JSON |
button, button_label, button_icon |
使用 json_repair.repair_json() 達成容錯字串至 JSON 轉換 |
ParameterRange |
"list" / "list" |
accept_any=True → ["any"] 並自動轉為 list |
range_slider + min_val/max_val/step,標籤設定 |
雙數值滑桿僅在數值恰好為包含兩個數值的清單時有效 |
ParameterImage |
"ImageUrlArtifact" / "ImageUrlArtifact" |
accept_any=True → ["any"] (不轉換) |
clickable_file_browser, webcam_capture_image, edit_mask, pulse_on_run |
主要是 UI 便捷性;如需強迫型別轉換可自訂 converters |
ParameterAudio |
"AudioUrlArtifact" / "AudioUrlArtifact" |
accept_any=True → ["any"] (不轉換) |
clickable_file_browser, microphone_capture_audio, edit_audio, pulse_on_run |
主要是 UI 便捷性;如需強迫型別轉換可自訂 converters |
ParameterVideo |
"VideoUrlArtifact" / "VideoUrlArtifact" |
accept_any=True → ["any"] (不轉換) |
clickable_file_browser, webcam_capture_video, edit_video, pulse_on_run |
主要是 UI 便捷性;如需強迫型別轉換可自訂 converters |
Parameter3D |
"ThreeDUrlArtifact" / "ThreeDUrlArtifact" |
accept_any=True → ["any"] (不轉換) |
clickable_file_browser, expander, pulse_on_run |
主要是 UI 便捷性;如需強迫型別轉換可自訂 converters |
ParameterButton |
"button" / "str" |
["str", "any"] |
label, variant, size, icon, state, href / on_click |
label 為顯示文字;default_value 為實際儲存值 |
輔助類別的共通行為
- 所有輔助建構子皆完整繼承標準
Parameter的建構引數(allowed_modes或allow_input/allow_property/allow_output、hide/hide_label/hide_property、settable、serializable等)。 - 許多輔助類別預設啟用
accept_any=True。啟用時,輔助類別通常將input_types=["any"]並自動在前置佇列加入轉換函式(例如ParameterString將所有連入值轉為str)。若需要嚴格的型別校驗,請將其關閉。 - 若同時提供明確的便捷引數(例如
hide=True)與ui_options中的同名鍵(例如ui_options={"hide": False}),一律以ui_options為準,且 Griptape Nodes 會發出衝突警示。
重點輔助類別深入解析
ParameterString
- 強制指定
type="str"與output_type="str"。 accept_any=True時將None轉為"",其他數值則透過str(value)轉換。- UI 便捷屬性:
markdown、multiline、placeholder_text、is_full_width(皆支援執行階段讀寫)。
ParameterBool
- 強制指定
type="bool"與output_type="bool"。 accept_any=True時將常見字串表示(如"true"、"yes"、"on"、"1")轉換為True,將("false"、"no"、"off"、"0")轉換為False。- UI 便捷屬性:
on_label、off_label(執行階段可變屬性)。
ParameterInt / ParameterFloat(基於 ParameterNumber)
- 強制指定數值
type/output_type,並在accept_any=True時前置掛載型別轉換器。 step:儲存於ui_options["step"]並進行步進校驗(值必須為當前步進的整數倍)。slider,min_val,max_val,validate_min_max:根據優先權自動掛載以下約束特徵之一:- 若
slider=True則掛載Slider(min_val, max_val) - 若
validate_min_max=True則掛載MinMax(min_val, max_val) - 若同時提供
min_val與max_val則掛載Clamp(min_val, max_val)
- 若
soft_limits:僅在搭配slider=True時有效。將滑桿範圍設為軟限制——軌道維持在min_val–max_val區間,但允許使用者在輸入框手動鍵入超出此區間的數值。可透過soft_limits屬性在執行階段動態讀寫。
ParameterJson
- 強制指定
type="json"與output_type="json"。 accept_any=True時使用json_repair.repair_json()嘗試修復並解析 JSON 字串(亦嘗試將非字串輸入序列化)。- UI 便捷功能:可選的編輯器快開按鈕(
button,button_label,button_icon)。
ParameterDict
- 強制指定
type="dict"與output_type="dict"。 accept_any=True時利用to_dict(...)將各類輸入強制轉換為標準字典。
ParameterRange
- 強制指定
type="list"與output_type="list"。 accept_any=True時將None轉為[],列表維持為列表,其他任何值包裝為[value]。- UI 便捷功能:
range_slider(巢狀ui_options["range_slider"]物件),包含min_val/max_val/step與標籤能見度設定。 - 雙數值滑桿 UI 僅在參數值恰好為兩個數值的列表時生效。
ParameterImage(影像參數強烈推薦首選)
處理影像輸入/輸出時,請一律使用 ParameterImage 取代通用 Parameter。 其優勢包括:
- 自動指派
type="ImageUrlArtifact"與output_type="ImageUrlArtifact" - 內建檔案瀏覽器選取、視訊鏡頭擷取與遮罩繪製等完整 UI 支援
- 確保所有影像處理節點之間的介面與行為高度一致
這亦能有效控制參數傳輸體積:ImageUrlArtifact 僅保存短網址字串,而傳統的替代方案 ImageArtifact 會將整張影像的原始二進位位元組內嵌至 WebSocket 流量與存檔的工作流程中(除非顯式宣告 serializable=False)——詳見 參數資料承載體積。
基本宣告範例:
from griptape_nodes.exe_types.param_types.parameter_image import ParameterImage
# 輸入影像參數
self.add_parameter(
ParameterImage(
name="input_image",
tooltip="供處理的輸入影像",
allow_output=False, # 僅作輸入
)
)
# 輸出影像參數
self.add_parameter(
ParameterImage(
name="output_image",
tooltip="生成的輸出影像結果",
allow_input=False, # 僅作輸出
allow_property=False,
)
)
支援的 UI 選項:
clickable_file_browser:啟用檔案瀏覽器選取影像webcam_capture_image:啟用視訊鏡頭即時拍照edit_mask:啟用遮罩繪製塗抹覆蓋層pulse_on_run:影像更新時在 UI 上呈現脈衝視覺回饋
動態可見度切換範式:
針對僅在特定模型下才需要呈現的參數:
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
# 新增影像參數(預設隱藏)
self.add_parameter(
ParameterImage(
name="input_image",
tooltip="圖生圖 (Image-to-Image) 專用的輸入影像",
allow_output=False,
)
)
# 依據預設模型初始化可見度
self._initialize_parameter_visibility()
def _initialize_parameter_visibility(self) -> None:
"""依據當前選取的模型初始化參數可見度。"""
model = self.get_parameter_value("model") or "default"
if model in ["model-with-image-support", "another-model"]:
self.show_parameter_by_name("input_image")
else:
self.hide_parameter_by_name("input_image")
def after_value_set(self, parameter: Parameter, value: Any) -> None:
"""當模型下拉選單切換時即時更新參數可見度。"""
if parameter.name == "model":
if value in ["model-with-image-support", "another-model"]:
self.show_parameter_by_name("input_image")
else:
self.hide_parameter_by_name("input_image")
self.set_parameter_value("input_image", None) # 隱藏時清空殘留值
return super().after_value_set(parameter, value)
為何優先選用 ParameterImage:
| 維度 | 通用 Parameter |
ParameterImage |
|---|---|---|
| 型別安全 | 需手動配置 type 與 input_types |
自動綁定標準產物型別 |
| UI 特性 | 需自行撰寫大量 ui_options |
內建檔案瀏覽器、鏡頭擷取、遮罩塗繪 |
| 一致性 | 視個別開發者實作而異 | 全平台節點標準化統一行為 |
| 維護成本 | 充滿重複性樣板程式碼 | 程式碼乾淨凝練 |
舊式寫法(強烈建議淘汰):
# ❌ 請勿採用此寫法——請改用 ParameterImage
self.add_parameter(
Parameter(
name="input_image",
input_types=["ImageArtifact", "ImageUrlArtifact", "str"],
type="ImageArtifact",
default_value=None,
tooltip="輸入影像",
allowed_modes={ParameterMode.INPUT, ParameterMode.PROPERTY},
ui_options={"display_name": "Input Image"},
)
)
ParameterAudio / ParameterVideo / Parameter3D
- 強制指定對應的
*UrlArtifact作為type/output_type(例如AudioUrlArtifact、VideoUrlArtifact、ThreeDUrlArtifact)。 - 這些輔助類別主要封裝了豐富的 UI 互動能力(檔案瀏覽/錄製擷取/編輯/展開器)。若需要字串至產物的型別轉換,可提供
converters或在節點的before_value_set()/process()中進行處理。 - 音訊:
ParameterAudio在傳輸負載體積上的考量與ParameterImage完全相同——AudioArtifact會內嵌全部位元組資料,而AudioUrlArtifact僅傳遞短網址。 - 影片:引擎並未設計原始位元組的
VideoArtifact類別,因此不存在位元組內嵌風險。新節點中請一律宣告VideoUrlArtifact——連線型別檢查要求型別名稱完全相符,因此"VideoArtifact"與"VideoUrlArtifact"不可混用互換。 - 3D:
ThreeDArtifact亦包含二進位位元組,請優先使用Parameter3D所強制規範的ThreeDUrlArtifact。
ParameterButton
按鈕提供了點擊時觸發操作的互動式 UI 元件,例如更新參數、執行運算或在不同狀態間切換導覽。
核心規格:
- 強制指定
type="button"與output_type="str"。 - 預設為純屬性 UI 元件 (
allow_property=True,allow_input=False,allow_output=False)。 - 接收
href="..."(外部導航連結)或on_click=...(自訂回呼函式)。 label為按鈕表面顯示的文字標籤。icon支援指定視覺圖示。
實作範式: 按鈕必須包裹在 ParameterButtonGroup 容器中:
from griptape_nodes.exe_types.core_types import ParameterButtonGroup
from griptape_nodes.exe_types.param_types.parameter_button import ParameterButton
from griptape_nodes.traits.button import Button, ButtonDetailsMessagePayload
class MyNode(DataNode):
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
with ParameterButtonGroup(name="my_button_group") as button_group:
ParameterButton(
name="update_button",
label="更新日期/時間",
icon="calendar",
on_click=self._handle_button_click, # 直接傳入回呼
)
self.add_node_element(button_group)
self.add_parameter(
Parameter(
name="display_value",
tooltip="由按鈕更新的數值",
type=ParameterTypeBuiltin.STR.value,
allowed_modes={ParameterMode.PROPERTY},
ui_options={
"display_name": "顯示數值",
"readonly": True, # 禁止手動編輯
},
default_value="點擊按鈕以更新",
)
)
def _handle_button_click(
self,
button: Button,
button_payload: ButtonDetailsMessagePayload,
) -> None:
"""按鈕點擊處理常式。"""
new_value = "更新於 " + datetime.now().strftime("%H:%M:%S")
self.set_parameter_value("display_value", new_value)
容器型別 (Containers)
- ParameterList:管理多個子
Parameter項目的容器參數(使用get_parameter_list_value()展平取值)。 - ParameterDictionary:管理有序鍵值對項目的容器參數(有別於純值輔助類別
ParameterDict)。 - ParameterGroup:純粹用於前端 UI 折疊分組的視覺容器。
容器關鍵語意:
- 容器參數在引擎內部以
ParameterContainer物件表示。它們永遠為真 (Always Truthy),即便內容為空(覆寫了__bool__()以防止過期快取造成邏輯漏洞)。 ParameterList支援多種前端顯示選項(如collapsed折疊、網格呈現、欄數設定)。ParameterDictionary是有序的鍵值對集合(內部以列表維持順序)。
parent_container_name 與 parent_element_name 的致命差異:
| 屬性名稱 | 指向目標 | 設計目的 |
|---|---|---|
parent_container_name |
ParameterContainer (ParameterList, ParameterDictionary) |
所有權歸屬。表示該參數是列表或字典容器的子項。引擎用於 add_parameter() 註冊、子項生命週期清理、數值匯總與儲存載入。 |
parent_element_name |
ParameterGroup |
UI 視覺分組。將參數視覺上巢狀歸納於節點面板的折疊群組中。用於 UI 佈局、_remove_existing_*() 查找與介面還原。 |
切勿混淆這兩者! 若將 parent_element_name 誤寫為 parent_container_name(或反之):
- 參數會脫離分組,直接暴露於節點最頂層。
- 在連續執行間無法被正確清理(殘留過期輸出)。
- 工作流程在存檔與載入時會失敗——還原處理常式在以指定名稱查找容器或群組時,若型別不符,將在數值套用前直接靜默丟棄該參數。
記憶口訣:
- 放入
ParameterList或ParameterDictionary? → 使用parent_container_name - 放入
ParameterGroup進行面板視覺排版? → 使用parent_element_name
# ✅ 正確:為了 UI 視覺分組掛載於 ParameterGroup 下
param = ParameterImage(
name="cell_0_0",
parent_element_name=self._grid_cells_group.name, # ParameterGroup
...
)
# ❌ 錯誤:將 ParameterGroup 指定給 parent_container_name
param = ParameterImage(
name="cell_0_0",
parent_container_name=self._grid_cells_group.name, # 錯誤:這是 ParameterGroup,並非 ParameterContainer
...
)
ParameterList 設計範式
適用於接收多個同型別輸入的參數:
self.add_parameter(
ParameterList(
name="tools",
input_types=["Tool", "list[Tool]"],
default_value=[],
tooltip="連接個別工具或工具清單",
allowed_modes={ParameterMode.INPUT},
)
)
# 在 process 方法中提取值
tools = self.get_parameter_list_value("tools") # 一律回傳平整列表
for tool in tools:
# 逐一處理各個工具
行為注意事項:get_parameter_list_value() 會自動展平巢狀迭代物件並自動濾除 Falsey 元素(例如 0、False、""、空字典/列表)。若需完整保留這些值,請改用 get_parameter_value() 並自行手動處理。
常見參數設計範式 (Common Parameter Patterns)
附帶佔位文字的搜尋輸入框
Parameter(
name="search_query",
input_types=["str"],
type="str",
tooltip="搜尋模型的關鍵字",
allowed_modes={ParameterMode.INPUT, ParameterMode.PROPERTY},
ui_options={"placeholder_text": "例如:llama, bert, stable-diffusion"},
)
全寬清單輸出 (Full-Width List Output)
Parameter(
name="results",
output_type="list[dict]",
type="list[dict]",
tooltip="包含完整資訊的搜尋結果",
allowed_modes={ParameterMode.OUTPUT},
ui_options={"is_full_width": True},
)
多行文字輸入 (Multiline Text Input)
Parameter(
name="prompt",
input_types=["str"],
type="str",
tooltip="期望輸出的描述提示詞",
allowed_modes={ParameterMode.INPUT, ParameterMode.PROPERTY},
ui_options={"multiline": True, "placeholder_text": "描述您欲產生的內容..."},
)
附帶檔案總管瀏覽器的檔案路徑
若要讓使用者從磁碟挑選檔案或目錄,可在 str 參數附加 FileSystemPicker 特徵標籤。參數的值即為所選路徑:
from griptape_nodes.traits.file_system_picker import FileSystemPicker
Parameter(
name="config_path",
type="str",
tooltip="組態檔案的路徑",
allowed_modes={ParameterMode.INPUT, ParameterMode.PROPERTY},
traits={
FileSystemPicker(
allow_files=True,
allow_directories=False,
file_extensions=[".json", ".yaml"],
)
},
)
FileSystemPicker 預設僅選取目錄,因此當欲選取檔案時請傳入 allow_files=True。它亦支援 multiple(多選)、workspace_only(僅限工作區)、檔案大小上限以及包含/排除模式——詳見 參數 UI 參考手冊 (Parameter UI Reference)。
媒體參數的運作方式截然不同。ParameterImage、ParameterAudio、ParameterVideo 與 Parameter3D 各自在媒體檢視器中提供點擊瀏覽上傳功能(clickable_file_browser,預設開啟),且所選檔案會被上傳並以 *UrlArtifact 而非純路徑字串傳遞給節點。處理媒體時請優先使用這些輔助類別而非 str 路徑——參見上方的 ParameterImage。
進階參數設計範式 (Advanced Parameter Patterns)
動態參數可見度 (Dynamic Parameter Visibility)
使用 after_value_set() 生命週期回呼構建具備情境感知能力的前端 UI:
def after_value_set(self, parameter: Parameter, value: Any) -> None:
"""根據所選模型動態更新參數的可見度。"""
if parameter.name == "model":
if value == "text-to-image":
self.hide_parameter_by_name("input_image")
self.show_parameter_by_name("prompt")
elif value == "image-to-image":
self.show_parameter_by_name("input_image")
self.show_parameter_by_name("prompt")
return super().after_value_set(parameter, value)
動態選項更新 (Dynamic Options Updates)
在執行階段動態更新參數的下拉選項清單。這些選項會作為特徵標籤 (Trait) 狀態保存:
from griptape_nodes.traits.options import Options
def _update_option_choices(self, param_name: str, choices: list, default_value: str):
"""動態更新 Options 特徵標籤的選項。"""
param = self.get_parameter_by_name(param_name)
if not param:
return
# 特徵標籤作為子元素儲存於 Parameter 上
# (最常見的情況為更新 Options 特徵標籤)
for trait in param.find_elements_by_type(Options):
trait.choices = choices
break
self.set_parameter_value(param_name, default_value)
動態參數架構與 ParameterTransitionComponent
某些進階節點包含一個下拉選單(例如模型切換器、模式選擇器、運算元挑選),每個選項都代表著截然不同的輸入與輸出參數組合。傳統作法(清空所有參數並從頭重建)會粗暴毀掉使用者已辛苦連好的所有連接線。ParameterTransitionComponent 透過精確計算當前參數介面與新選項所需介面的差異 (Diff) 完美解決此問題,針對每個參數名稱執行以下四種策略之一:
- Preserve (保留)——新舊兩側皆存在且簽章完全一致。分毫未動,連線與數值 100% 完好如初。
- Replace (替換)——兩側皆存在但簽章發生改變(型別或模式不同)。組件會先行捕獲當前的連入與連出關係,移除舊參數,建立帶有新簽章的新參數,隨後透過
CreateConnectionRequest重新發送捕獲的連線請求。平台的連線處理常式會重新驗證型別相容性:新簽章下依然合法的連線會自動完美復原,不合法的連線則安全斷開。 - Remove (移除)——新選項不再需要該參數。透過
RemoveParameterFromNodeRequest妥善移除並清理連線。 - Add (新增)——全新參數。透過呼叫方提供的工廠函式動態建立。
程式庫作者的實作方式
from griptape_nodes.exe_types.param_components.parameter_transition_component import (
ParameterTransitionComponent,
TransitionParameter,
)
# 在節點的 __init__ 中:
self._model_params = ParameterTransitionComponent(
self,
manages_parameter=lambda p: p.name in self._MODEL_PARAM_NAMES,
)
# 在模型下拉選單切換時的處理常式中:
desired = self._build_transition_parameters_for_model(selected_model)
self._model_params.transition_to(desired)
何時採用此組件
- 單一節點的參數介面結構取決於離散的使用者選項(模型挑選器、運算模式切換器)。
- 使用者在正常的流程編排中會頻繁切換選項,且不希望每次切換都要重新連線。
何時不應使用此組件
- 僅需根據數值顯示或隱藏某些既定參數——使用
hide_parameter_by_name/show_parameter_by_name的 動態可見度 模式。 - 僅需更新下拉選單的選項清單——使用 動態選項更新 模式。
- 參數結構完全固定,僅數值產生變化。
與 ParameterGroup 搭配使用
該組件依名稱管理個別參數。若您的動態介面使用分組,請在 add_request_factory 中傳入 parent_element_name,以便新加入的參數能正確歸納至對應群組中;群組的建立與清理交由呼叫方處理。
ParameterList 進階用法
同時包含個別型別與清單型別以實現最高靈活性。此處的 ImageArtifact 僅用於相容舊版工作流程連線——新宣告的清單參數請一律使用 ImageUrlArtifact(參見 參數傳輸大小限制):
self.add_parameter(
ParameterList(
name="images",
input_types=[
"ImageUrlArtifact",
"ImageArtifact", # 僅供舊版連線相容
"str",
"list",
"list[ImageUrlArtifact]",
"list[ImageArtifact]", # 僅供舊版連線相容
],
default_value=[],
tooltip="輸入影像(總計最多 10 張影像)",
allowed_modes={ParameterMode.INPUT},
ui_options={"expander": True, "display_name": "輸入影像"},
)
)
控制參數在 UI 中的排列順序
參數在 UI 中依其透過 add_parameter() 新增的順序呈現。這對使用者體驗至關重要——相關的參數應當在邏輯上分組排列。
問題所在:諸如 BaseImageProcessor 等基底類別會在自身的 __init__ 中自動新增參數(如 input_image),這可能不是您所期望的順序。
解決方案:直接繼承 SuccessFailureNode 而非 BaseImageProcessor,藉此取得對參數排序的完全控制權:
from griptape_nodes.exe_types.node_types import SuccessFailureNode
from griptape_nodes.exe_types.param_types.parameter_image import ParameterImage
class ColorMatch(SuccessFailureNode):
"""將參考影像的色彩風格轉移至目標影像。"""
def __init__(self, name: str, metadata: dict[Any, Any] | None = None) -> None:
super().__init__(name, metadata)
# 參考影像排在第一位——色彩調色盤的來源
self.add_parameter(
ParameterImage(
name="reference_image",
tooltip="參考影像——欲轉移之色彩調色盤來源",
ui_options={"clickable_file_browser": True, "expander": True},
)
)
# 目標影像排在第二位——欲修改的影像
self.add_parameter(
ParameterImage(
name="target_image",
tooltip="目標影像——套用色彩風格轉移的影像",
ui_options={"clickable_file_browser": True, "expander": True},
)
)
# 依序新增其他參數...
雙影像處理節點標準範式
對於需同時處理兩張影像的節點(混合、色彩比對、影像合成),請使用以下設計範式:
from typing import Any, ClassVar
from PIL import Image
from griptape.artifacts import ImageUrlArtifact
from griptape_nodes.exe_types.core_types import Parameter
from griptape_nodes.exe_types.node_types import SuccessFailureNode
from griptape_nodes.exe_types.param_types.parameter_image import ParameterImage
from griptape_nodes_library.utils.image_utils import (
dict_to_image_url_artifact,
load_pil_from_url,
save_pil_image_with_named_filename,
)
from griptape_nodes_library.utils.file_utils import generate_filename
class TwoImageProcessor(SuccessFailureNode):
"""處理兩張影像的節點基底範式。"""
CATEGORY: ClassVar[str] = "image"
def __init__(self, name: str, metadata: dict[Any, Any] | None = None) -> None:
super().__init__(name, metadata)
# 第一張影像輸入
self.add_parameter(
ParameterImage(
name="image_a",
tooltip="第一張輸入影像",
ui_options={"clickable_file_browser": True, "expander": True},
)
)
# 第二張影像輸入
self.add_parameter(
ParameterImage(
name="image_b",
tooltip="第二張輸入影像",
ui_options={"clickable_file_browser": True, "expander": True},
)
)
# 輸出影像
self.add_parameter(
ParameterImage(
name="output_image",
tooltip="處理後的成果",
allowed_modes={ParameterMode.OUTPUT},
)
)
def _get_image_artifact(self, param_name: str) -> ImageUrlArtifact | None:
"""將參數數值轉換為 ImageUrlArtifact。"""
value = self.get_parameter_value(param_name)
if value is None:
return None
if isinstance(value, dict):
return dict_to_image_url_artifact(value)
return value
def _process_images(self) -> None:
"""處理兩張影像並設定輸出。"""
image_a_artifact = self._get_image_artifact("image_a")
image_b_artifact = self._get_image_artifact("image_b")
if not image_a_artifact or not image_b_artifact:
return
# 載入為 PIL 影像
pil_a = load_pil_from_url(image_a_artifact.value)
pil_b = load_pil_from_url(image_b_artifact.value)
# 執行影像運算處理(於子類別中覆寫)
result_pil = self._do_processing(pil_a, pil_b)
# 儲存運算成果
filename = generate_filename(self.name, suffix="processed")
output_artifact = save_pil_image_with_named_filename(result_pil, filename)
self.parameter_output_values["output_image"] = output_artifact
def _do_processing(self, image_a: Image.Image, image_b: Image.Image) -> Image.Image:
"""請覆寫此方法以實作具體的運算邏輯。"""
raise NotImplementedError
def after_value_set(self, parameter: Parameter, value: Any) -> None:
"""當兩張影像皆就緒時觸發即時預覽。"""
if parameter.name in ("image_a", "image_b"):
image_a = self.get_parameter_value("image_a")
image_b = self.get_parameter_value("image_b")
if image_a and image_b:
self._process_images()
return super().after_value_set(parameter, value)
def process(self) -> None:
"""主要運算進入點。"""
self._process_images()
使用的核心工具函式:
dict_to_image_url_artifact():將字典結構轉為產物物件load_pil_from_url():從 URL 載入 PIL 影像(包含 localhost)save_pil_image_with_named_filename():儲存 PIL 影像並回傳產物generate_filename():根據節點名稱建立具備一致性的檔名