griptape-nodes 0.66.2__py3-none-any.whl → 0.67.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. griptape_nodes/common/node_executor.py +77 -0
  2. griptape_nodes/exe_types/core_types.py +28 -1
  3. griptape_nodes/exe_types/node_groups/base_iterative_node_group.py +27 -8
  4. griptape_nodes/exe_types/node_groups/base_node_group.py +64 -1
  5. griptape_nodes/exe_types/node_groups/subflow_node_group.py +0 -34
  6. griptape_nodes/exe_types/param_components/seed_parameter.py +3 -2
  7. griptape_nodes/exe_types/param_types/parameter_audio.py +3 -0
  8. griptape_nodes/exe_types/param_types/parameter_bool.py +3 -0
  9. griptape_nodes/exe_types/param_types/parameter_button.py +3 -0
  10. griptape_nodes/exe_types/param_types/parameter_dict.py +151 -0
  11. griptape_nodes/exe_types/param_types/parameter_float.py +3 -0
  12. griptape_nodes/exe_types/param_types/parameter_image.py +3 -0
  13. griptape_nodes/exe_types/param_types/parameter_int.py +3 -0
  14. griptape_nodes/exe_types/param_types/parameter_json.py +268 -0
  15. griptape_nodes/exe_types/param_types/parameter_number.py +3 -0
  16. griptape_nodes/exe_types/param_types/parameter_range.py +393 -0
  17. griptape_nodes/exe_types/param_types/parameter_string.py +3 -0
  18. griptape_nodes/exe_types/param_types/parameter_three_d.py +3 -0
  19. griptape_nodes/exe_types/param_types/parameter_video.py +3 -0
  20. griptape_nodes/retained_mode/events/library_events.py +2 -0
  21. griptape_nodes/retained_mode/events/parameter_events.py +89 -1
  22. griptape_nodes/retained_mode/managers/event_manager.py +176 -10
  23. griptape_nodes/retained_mode/managers/library_manager.py +14 -4
  24. griptape_nodes/retained_mode/managers/node_manager.py +187 -7
  25. griptape_nodes/retained_mode/managers/workflow_manager.py +58 -16
  26. griptape_nodes/utils/file_utils.py +58 -0
  27. {griptape_nodes-0.66.2.dist-info → griptape_nodes-0.67.0.dist-info}/METADATA +1 -1
  28. {griptape_nodes-0.66.2.dist-info → griptape_nodes-0.67.0.dist-info}/RECORD +30 -27
  29. {griptape_nodes-0.66.2.dist-info → griptape_nodes-0.67.0.dist-info}/WHEEL +1 -1
  30. {griptape_nodes-0.66.2.dist-info → griptape_nodes-0.67.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,393 @@
1
+ """ParameterRange component for list inputs with optional range slider UI options."""
2
+
3
+ from collections.abc import Callable
4
+ from typing import Any
5
+
6
+ from griptape_nodes.exe_types.core_types import Parameter, ParameterMode, Trait
7
+
8
+
9
+ class ParameterRange(Parameter):
10
+ """A specialized Parameter class for list inputs with optional range slider UI.
11
+
12
+ This class provides a convenient way to create list parameters. When the list
13
+ contains exactly 2 numeric values (int or float), you can enable the range_slider
14
+ UI option to display a range slider with customizations like min/max values,
15
+ step size, and label options. It exposes these UI options as direct properties
16
+ for easy runtime modification.
17
+
18
+ Example - General list:
19
+ param = ParameterRange(
20
+ name="items",
21
+ tooltip="List of items",
22
+ default_value=["a", "b", "c"]
23
+ )
24
+
25
+ Example - Range slider (for 2 numeric values):
26
+ param = ParameterRange(
27
+ name="range",
28
+ tooltip="Select a range",
29
+ range_slider=True,
30
+ min_val=0,
31
+ max_val=100,
32
+ step=1,
33
+ min_label="Minimum",
34
+ max_label="Maximum"
35
+ )
36
+ param.max_val = 200 # Change UI options at runtime
37
+ """
38
+
39
+ def __init__( # noqa: PLR0913
40
+ self,
41
+ name: str,
42
+ tooltip: str | None = None,
43
+ *,
44
+ type: str = "list", # noqa: A002, ARG002
45
+ input_types: list[str] | None = None, # noqa: ARG002
46
+ output_type: str = "list", # noqa: ARG002
47
+ default_value: Any = None,
48
+ tooltip_as_input: str | None = None,
49
+ tooltip_as_property: str | None = None,
50
+ tooltip_as_output: str | None = None,
51
+ allowed_modes: set[ParameterMode] | None = None,
52
+ traits: set[type[Trait] | Trait] | None = None,
53
+ converters: list[Callable[[Any], Any]] | None = None,
54
+ validators: list[Callable[[Parameter, Any], None]] | None = None,
55
+ ui_options: dict | None = None,
56
+ range_slider: bool = True,
57
+ min_val: float = 0,
58
+ max_val: float = 100,
59
+ step: float = 1,
60
+ min_label: str = "min",
61
+ max_label: str = "max",
62
+ hide_range_labels: bool = False,
63
+ hide_range_parameters: bool = False,
64
+ accept_any: bool = True,
65
+ hide: bool | None = None,
66
+ hide_label: bool = False,
67
+ hide_property: bool = False,
68
+ allow_input: bool = True,
69
+ allow_property: bool = True,
70
+ allow_output: bool = True,
71
+ settable: bool = True,
72
+ serializable: bool = True,
73
+ user_defined: bool = False,
74
+ private: bool = False,
75
+ element_id: str | None = None,
76
+ element_type: str | None = None,
77
+ parent_container_name: str | None = None,
78
+ ) -> None:
79
+ """Initialize a list parameter with optional range slider UI options.
80
+
81
+ This is a general-purpose list parameter. The range_slider option is only
82
+ applicable when the list contains exactly 2 numeric values (int or float).
83
+ When range_slider is enabled, the UI will display a range slider instead
84
+ of a standard list input.
85
+
86
+ Args:
87
+ name: Parameter name
88
+ tooltip: Parameter tooltip
89
+ type: Parameter type (ignored, always "list" for ParameterRange)
90
+ input_types: Allowed input types (ignored, set based on accept_any)
91
+ output_type: Output type (ignored, always "list" for ParameterRange)
92
+ default_value: Default parameter value
93
+ tooltip_as_input: Tooltip for input mode
94
+ tooltip_as_property: Tooltip for property mode
95
+ tooltip_as_output: Tooltip for output mode
96
+ allowed_modes: Allowed parameter modes
97
+ traits: Parameter traits
98
+ converters: Parameter converters
99
+ validators: Parameter validators
100
+ ui_options: Dictionary of UI options
101
+ range_slider: Whether to enable range slider UI (only for 2 numeric values)
102
+ min_val: Minimum value for range slider (default: 0)
103
+ max_val: Maximum value for range slider (default: 100)
104
+ step: Step size for range slider (default: 1)
105
+ min_label: Label for minimum value (default: "min")
106
+ max_label: Label for maximum value (default: "max")
107
+ hide_range_labels: Whether to hide range labels (default: False)
108
+ hide_range_parameters: Whether to hide the range parameters (default: False)
109
+ accept_any: Whether to accept any input type and convert to list (default: True)
110
+ hide: Whether to hide the entire parameter
111
+ hide_label: Whether to hide the parameter label
112
+ hide_property: Whether to hide the parameter in property mode
113
+ allow_input: Whether to allow input mode
114
+ allow_property: Whether to allow property mode
115
+ allow_output: Whether to allow output mode
116
+ settable: Whether the parameter is settable
117
+ serializable: Whether the parameter is serializable
118
+ user_defined: Whether the parameter is user-defined
119
+ private: Whether this parameter is private
120
+ element_id: Element ID
121
+ element_type: Element type
122
+ parent_container_name: Name of parent container
123
+ """
124
+ # Build ui_options dictionary from the provided UI-specific parameters
125
+ if ui_options is None:
126
+ ui_options = {}
127
+ else:
128
+ ui_options = ui_options.copy()
129
+
130
+ # Add list-specific UI options with nested range_slider structure
131
+ if range_slider:
132
+ ui_options["range_slider"] = {
133
+ "min_value": min_val,
134
+ "max_value": max_val,
135
+ "step": step,
136
+ "min_label": min_label,
137
+ "max_label": max_label,
138
+ "hide_range_labels": hide_range_labels,
139
+ "hide_range_parameters": hide_range_parameters,
140
+ }
141
+
142
+ # Set up list conversion based on accept_any setting
143
+ if converters is None:
144
+ existing_converters = []
145
+ else:
146
+ existing_converters = converters
147
+
148
+ if accept_any:
149
+ final_input_types = ["any"]
150
+ final_converters = [self._accept_any, *existing_converters]
151
+ else:
152
+ final_input_types = ["list"]
153
+ final_converters = existing_converters
154
+
155
+ # Call parent with explicit parameters, following ParameterString pattern
156
+ super().__init__(
157
+ name=name,
158
+ tooltip=tooltip,
159
+ type="list", # Always a list type for ParameterRange
160
+ input_types=final_input_types,
161
+ output_type="list", # Always output as list
162
+ default_value=default_value,
163
+ tooltip_as_input=tooltip_as_input,
164
+ tooltip_as_property=tooltip_as_property,
165
+ tooltip_as_output=tooltip_as_output,
166
+ allowed_modes=allowed_modes,
167
+ traits=traits,
168
+ converters=final_converters,
169
+ validators=validators,
170
+ ui_options=ui_options,
171
+ hide=hide,
172
+ hide_label=hide_label,
173
+ hide_property=hide_property,
174
+ allow_input=allow_input,
175
+ allow_property=allow_property,
176
+ allow_output=allow_output,
177
+ settable=settable,
178
+ serializable=serializable,
179
+ user_defined=user_defined,
180
+ private=private,
181
+ element_id=element_id,
182
+ element_type=element_type,
183
+ parent_container_name=parent_container_name,
184
+ )
185
+
186
+ def _accept_any(self, value: Any) -> list:
187
+ """Convert any input value to a list.
188
+
189
+ Args:
190
+ value: The value to convert to list
191
+
192
+ Returns:
193
+ List representation of the value
194
+ """
195
+ if value is None:
196
+ return []
197
+ if isinstance(value, list):
198
+ return value
199
+ return [value]
200
+
201
+ @property
202
+ def range_slider(self) -> bool:
203
+ """Get whether range slider UI is enabled.
204
+
205
+ Returns:
206
+ True if range slider is enabled, False otherwise
207
+ """
208
+ return "range_slider" in self.ui_options and isinstance(self.ui_options["range_slider"], dict)
209
+
210
+ @range_slider.setter
211
+ def range_slider(self, value: bool) -> None:
212
+ """Set whether range slider UI is enabled.
213
+
214
+ Args:
215
+ value: Whether to enable range slider
216
+ """
217
+ if value:
218
+ # Initialize range_slider object if it doesn't exist
219
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
220
+ self.ui_options["range_slider"] = {
221
+ "min_value": 0,
222
+ "max_value": 100,
223
+ "step": 1,
224
+ "min_label": "min",
225
+ "max_label": "max",
226
+ "hide_range_labels": False,
227
+ "hide_range_parameters": False,
228
+ }
229
+ else:
230
+ ui_options = self.ui_options.copy()
231
+ ui_options.pop("range_slider", None)
232
+ self.ui_options = ui_options
233
+
234
+ @property
235
+ def min_val(self) -> float:
236
+ """Get the minimum value for the range slider.
237
+
238
+ Returns:
239
+ The minimum value
240
+ """
241
+ range_slider = self.ui_options.get("range_slider")
242
+ if isinstance(range_slider, dict):
243
+ return range_slider.get("min_value", 0)
244
+ return 0
245
+
246
+ @min_val.setter
247
+ def min_val(self, value: float) -> None:
248
+ """Set the minimum value for the range slider.
249
+
250
+ Args:
251
+ value: The minimum value to use
252
+ """
253
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
254
+ self.range_slider = True # Initialize range_slider object
255
+ self.ui_options["range_slider"]["min_value"] = value
256
+
257
+ @property
258
+ def max_val(self) -> float:
259
+ """Get the maximum value for the range slider.
260
+
261
+ Returns:
262
+ The maximum value
263
+ """
264
+ range_slider = self.ui_options.get("range_slider")
265
+ if isinstance(range_slider, dict):
266
+ return range_slider.get("max_value", 100)
267
+ return 100
268
+
269
+ @max_val.setter
270
+ def max_val(self, value: float) -> None:
271
+ """Set the maximum value for the range slider.
272
+
273
+ Args:
274
+ value: The maximum value to use
275
+ """
276
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
277
+ self.range_slider = True # Initialize range_slider object
278
+ self.ui_options["range_slider"]["max_value"] = value
279
+
280
+ @property
281
+ def step(self) -> float:
282
+ """Get the step size for the range slider.
283
+
284
+ Returns:
285
+ The step size
286
+ """
287
+ range_slider = self.ui_options.get("range_slider")
288
+ if isinstance(range_slider, dict):
289
+ return range_slider.get("step", 1)
290
+ return 1
291
+
292
+ @step.setter
293
+ def step(self, value: float) -> None:
294
+ """Set the step size for the range slider.
295
+
296
+ Args:
297
+ value: The step size to use
298
+ """
299
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
300
+ self.range_slider = True # Initialize range_slider object
301
+ self.ui_options["range_slider"]["step"] = value
302
+
303
+ @property
304
+ def min_label(self) -> str:
305
+ """Get the label for the minimum value.
306
+
307
+ Returns:
308
+ The minimum label
309
+ """
310
+ range_slider = self.ui_options.get("range_slider")
311
+ if isinstance(range_slider, dict):
312
+ return range_slider.get("min_label", "min")
313
+ return "min"
314
+
315
+ @min_label.setter
316
+ def min_label(self, value: str) -> None:
317
+ """Set the label for the minimum value.
318
+
319
+ Args:
320
+ value: The minimum label to use
321
+ """
322
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
323
+ self.range_slider = True # Initialize range_slider object
324
+ self.ui_options["range_slider"]["min_label"] = value
325
+
326
+ @property
327
+ def max_label(self) -> str:
328
+ """Get the label for the maximum value.
329
+
330
+ Returns:
331
+ The maximum label
332
+ """
333
+ range_slider = self.ui_options.get("range_slider")
334
+ if isinstance(range_slider, dict):
335
+ return range_slider.get("max_label", "max")
336
+ return "max"
337
+
338
+ @max_label.setter
339
+ def max_label(self, value: str) -> None:
340
+ """Set the label for the maximum value.
341
+
342
+ Args:
343
+ value: The maximum label to use
344
+ """
345
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
346
+ self.range_slider = True # Initialize range_slider object
347
+ self.ui_options["range_slider"]["max_label"] = value
348
+
349
+ @property
350
+ def hide_range_labels(self) -> bool:
351
+ """Get whether range labels are hidden.
352
+
353
+ Returns:
354
+ True if range labels are hidden, False otherwise
355
+ """
356
+ range_slider = self.ui_options.get("range_slider")
357
+ if isinstance(range_slider, dict):
358
+ return range_slider.get("hide_range_labels", True)
359
+ return True
360
+
361
+ @hide_range_labels.setter
362
+ def hide_range_labels(self, value: bool) -> None:
363
+ """Set whether to hide range labels.
364
+
365
+ Args:
366
+ value: Whether to hide range labels
367
+ """
368
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
369
+ self.range_slider = True # Initialize range_slider object
370
+ self.ui_options["range_slider"]["hide_range_labels"] = value
371
+
372
+ @property
373
+ def hide_range_parameters(self) -> bool:
374
+ """Get whether the range parameters are hidden.
375
+
376
+ Returns:
377
+ True if range parameters are hidden, False otherwise
378
+ """
379
+ range_slider = self.ui_options.get("range_slider")
380
+ if isinstance(range_slider, dict):
381
+ return range_slider.get("hide_range_parameters", False)
382
+ return False
383
+
384
+ @hide_range_parameters.setter
385
+ def hide_range_parameters(self, value: bool) -> None:
386
+ """Set whether to hide the range parameters.
387
+
388
+ Args:
389
+ value: Whether to hide the range parameters
390
+ """
391
+ if "range_slider" not in self.ui_options or not isinstance(self.ui_options["range_slider"], dict):
392
+ self.range_slider = True # Initialize range_slider object
393
+ self.ui_options["range_slider"]["hide_range_parameters"] = value
@@ -55,6 +55,7 @@ class ParameterString(Parameter):
55
55
  settable: bool = True,
56
56
  serializable: bool = True,
57
57
  user_defined: bool = False,
58
+ private: bool = False,
58
59
  element_id: str | None = None,
59
60
  element_type: str | None = None,
60
61
  parent_container_name: str | None = None,
@@ -90,6 +91,7 @@ class ParameterString(Parameter):
90
91
  settable: Whether the parameter is settable
91
92
  serializable: Whether the parameter is serializable
92
93
  user_defined: Whether the parameter is user-defined
94
+ private: Whether this parameter is private
93
95
  element_id: Element ID
94
96
  element_type: Element type
95
97
  parent_container_name: Name of parent container
@@ -148,6 +150,7 @@ class ParameterString(Parameter):
148
150
  settable=settable,
149
151
  serializable=serializable,
150
152
  user_defined=user_defined,
153
+ private=private,
151
154
  element_id=element_id,
152
155
  element_type=element_type,
153
156
  parent_container_name=parent_container_name,
@@ -53,6 +53,7 @@ class Parameter3D(Parameter):
53
53
  settable: bool = True,
54
54
  serializable: bool = True,
55
55
  user_defined: bool = False,
56
+ private: bool = False,
56
57
  element_id: str | None = None,
57
58
  element_type: str | None = None,
58
59
  parent_container_name: str | None = None,
@@ -87,6 +88,7 @@ class Parameter3D(Parameter):
87
88
  settable: Whether the parameter is settable
88
89
  serializable: Whether the parameter is serializable
89
90
  user_defined: Whether the parameter is user-defined
91
+ private: Whether this parameter is private
90
92
  element_id: Element ID
91
93
  element_type: Element type
92
94
  parent_container_name: Name of parent container
@@ -140,6 +142,7 @@ class Parameter3D(Parameter):
140
142
  settable=settable,
141
143
  serializable=serializable,
142
144
  user_defined=user_defined,
145
+ private=private,
143
146
  element_id=element_id,
144
147
  element_type=element_type,
145
148
  parent_container_name=parent_container_name,
@@ -55,6 +55,7 @@ class ParameterVideo(Parameter):
55
55
  settable: bool = True,
56
56
  serializable: bool = True,
57
57
  user_defined: bool = False,
58
+ private: bool = False,
58
59
  element_id: str | None = None,
59
60
  element_type: str | None = None,
60
61
  parent_container_name: str | None = None,
@@ -90,6 +91,7 @@ class ParameterVideo(Parameter):
90
91
  settable: Whether the parameter is settable
91
92
  serializable: Whether the parameter is serializable
92
93
  user_defined: Whether the parameter is user-defined
94
+ private: Whether this parameter is private
93
95
  element_id: Element ID
94
96
  element_type: Element type
95
97
  parent_container_name: Name of parent container
@@ -145,6 +147,7 @@ class ParameterVideo(Parameter):
145
147
  settable=settable,
146
148
  serializable=serializable,
147
149
  user_defined=user_defined,
150
+ private=private,
148
151
  element_id=element_id,
149
152
  element_type=element_type,
150
153
  parent_container_name=parent_container_name,
@@ -352,9 +352,11 @@ class RegisterLibraryFromFileResultSuccess(WorkflowAlteredMixin, ResultPayloadSu
352
352
 
353
353
  Args:
354
354
  library_name: Name of the registered library
355
+ was_already_loaded: True if the library was already loaded, False if it was loaded by this request
355
356
  """
356
357
 
357
358
  library_name: str
359
+ was_already_loaded: bool = False
358
360
 
359
361
 
360
362
  @dataclass
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
4
  from typing import TYPE_CHECKING, Any, NamedTuple
5
5
 
6
6
  from pydantic import Field
@@ -141,6 +141,92 @@ class RemoveParameterFromNodeResultFailure(ResultPayloadFailure):
141
141
  """Parameter removal failed. Common causes: node not found, parameter not found, removal not allowed."""
142
142
 
143
143
 
144
+ @dataclass
145
+ @PayloadRegistry.register
146
+ class AddParameterGroupToNodeRequest(RequestPayload):
147
+ """Add a new ParameterGroup to a node.
148
+
149
+ Use when: Dynamically organizing parameters into collapsible groups,
150
+ structuring node interfaces, building nodes with categorized parameters.
151
+
152
+ Args:
153
+ node_name: Name of the node to add group to (None for current context)
154
+ group_name: Name of the new parameter group
155
+ parent_element_name: Name of parent element if nested (None for root level)
156
+ ui_options: UI configuration options (e.g., {"collapsed": True})
157
+ is_user_defined: Whether this is a user-defined group (affects serialization)
158
+ initial_setup: Skip setup work when loading from file
159
+
160
+ Results: AddParameterGroupToNodeResultSuccess | AddParameterGroupToNodeResultFailure
161
+ """
162
+
163
+ group_name: str
164
+ node_name: str | None = None
165
+ parent_element_name: str | None = None
166
+ ui_options: dict = field(default_factory=dict)
167
+ is_user_defined: bool = True
168
+ initial_setup: bool = False
169
+
170
+
171
+ @dataclass
172
+ @PayloadRegistry.register
173
+ class AddParameterGroupToNodeResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
174
+ """ParameterGroup added successfully to node.
175
+
176
+ Args:
177
+ group_name: Name of the new parameter group
178
+ node_name: Name of the node group was added to
179
+ """
180
+
181
+ group_name: str
182
+ node_name: str
183
+
184
+
185
+ @dataclass
186
+ @PayloadRegistry.register
187
+ class AddParameterGroupToNodeResultFailure(ResultPayloadFailure):
188
+ """ParameterGroup addition failed. Common causes: node not found, invalid group name, group already exists."""
189
+
190
+
191
+ @dataclass
192
+ @PayloadRegistry.register
193
+ class AlterParameterGroupDetailsRequest(RequestPayload):
194
+ """Alter the details and configuration of a ParameterGroup.
195
+
196
+ Use when: Modifying ParameterGroup UI options (collapsed state, visibility, etc.),
197
+ updating group configuration after creation, implementing save/load of group state changes.
198
+
199
+ Args:
200
+ group_name: Name of the ParameterGroup to alter
201
+ node_name: Name of the node containing the group (None for current context)
202
+ ui_options: New UI configuration options
203
+ initial_setup: Skip setup work when loading from file
204
+
205
+ Results: AlterParameterGroupDetailsResultSuccess | AlterParameterGroupDetailsResultFailure
206
+ """
207
+
208
+ group_name: str
209
+ node_name: str | None = None
210
+ ui_options: dict | None = None
211
+ initial_setup: bool = False
212
+
213
+ @classmethod
214
+ def relevant_parameters(cls) -> list[str]:
215
+ return ["group_name", "node_name", "ui_options"]
216
+
217
+
218
+ @dataclass
219
+ @PayloadRegistry.register
220
+ class AlterParameterGroupDetailsResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
221
+ """ParameterGroup details altered successfully."""
222
+
223
+
224
+ @dataclass
225
+ @PayloadRegistry.register
226
+ class AlterParameterGroupDetailsResultFailure(ResultPayloadFailure):
227
+ """ParameterGroup details alteration failed. Common causes: node not found, group not found."""
228
+
229
+
144
230
  @dataclass
145
231
  @PayloadRegistry.register
146
232
  class SetParameterValueRequest(RequestPayload):
@@ -235,6 +321,7 @@ class GetParameterDetailsResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuc
235
321
  mode_allowed_input/property/output: Which modes are allowed
236
322
  is_user_defined: Whether this is a user-defined parameter
237
323
  settable: Whether parameter can be set directly by the user or not (None for non-Parameters)
324
+ private: Whether this parameter is private
238
325
  ui_options: UI configuration options
239
326
  """
240
327
 
@@ -252,6 +339,7 @@ class GetParameterDetailsResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuc
252
339
  mode_allowed_output: bool
253
340
  is_user_defined: bool
254
341
  settable: bool | None
342
+ private: bool
255
343
  ui_options: dict | None
256
344
 
257
345