griptape-nodes 0.60.4__py3-none-any.whl → 0.62.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 (47) hide show
  1. griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +0 -1
  2. griptape_nodes/common/macro_parser/__init__.py +16 -1
  3. griptape_nodes/common/macro_parser/core.py +19 -7
  4. griptape_nodes/common/macro_parser/exceptions.py +99 -0
  5. griptape_nodes/common/macro_parser/formats.py +13 -4
  6. griptape_nodes/common/macro_parser/matching.py +5 -2
  7. griptape_nodes/common/macro_parser/parsing.py +48 -8
  8. griptape_nodes/common/macro_parser/resolution.py +23 -5
  9. griptape_nodes/common/project_templates/__init__.py +49 -0
  10. griptape_nodes/common/project_templates/default_project_template.py +87 -0
  11. griptape_nodes/common/project_templates/defaults/README.md +36 -0
  12. griptape_nodes/common/project_templates/directory.py +67 -0
  13. griptape_nodes/common/project_templates/loader.py +342 -0
  14. griptape_nodes/common/project_templates/project.py +252 -0
  15. griptape_nodes/common/project_templates/situation.py +143 -0
  16. griptape_nodes/common/project_templates/validation.py +140 -0
  17. griptape_nodes/exe_types/core_types.py +36 -3
  18. griptape_nodes/exe_types/node_types.py +4 -2
  19. griptape_nodes/exe_types/param_components/progress_bar_component.py +57 -0
  20. griptape_nodes/exe_types/param_types/parameter_audio.py +243 -0
  21. griptape_nodes/exe_types/param_types/parameter_image.py +243 -0
  22. griptape_nodes/exe_types/param_types/parameter_three_d.py +215 -0
  23. griptape_nodes/exe_types/param_types/parameter_video.py +243 -0
  24. griptape_nodes/node_library/workflow_registry.py +1 -1
  25. griptape_nodes/retained_mode/events/execution_events.py +41 -0
  26. griptape_nodes/retained_mode/events/node_events.py +90 -1
  27. griptape_nodes/retained_mode/events/os_events.py +108 -0
  28. griptape_nodes/retained_mode/events/parameter_events.py +1 -1
  29. griptape_nodes/retained_mode/events/project_events.py +528 -0
  30. griptape_nodes/retained_mode/events/workflow_events.py +19 -1
  31. griptape_nodes/retained_mode/griptape_nodes.py +9 -1
  32. griptape_nodes/retained_mode/managers/agent_manager.py +18 -24
  33. griptape_nodes/retained_mode/managers/event_manager.py +6 -9
  34. griptape_nodes/retained_mode/managers/flow_manager.py +63 -0
  35. griptape_nodes/retained_mode/managers/library_manager.py +55 -42
  36. griptape_nodes/retained_mode/managers/mcp_manager.py +14 -6
  37. griptape_nodes/retained_mode/managers/node_manager.py +232 -0
  38. griptape_nodes/retained_mode/managers/os_manager.py +399 -6
  39. griptape_nodes/retained_mode/managers/project_manager.py +1067 -0
  40. griptape_nodes/retained_mode/managers/settings.py +6 -0
  41. griptape_nodes/retained_mode/managers/sync_manager.py +4 -1
  42. griptape_nodes/retained_mode/managers/workflow_manager.py +8 -79
  43. griptape_nodes/traits/button.py +19 -0
  44. {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.62.0.dist-info}/METADATA +5 -3
  45. {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.62.0.dist-info}/RECORD +47 -32
  46. {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.62.0.dist-info}/WHEEL +1 -1
  47. {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.62.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,243 @@
1
+ """ParameterImage component for image inputs with enhanced 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 ParameterImage(Parameter):
10
+ """A specialized Parameter class for image inputs with enhanced UI options.
11
+
12
+ This class provides a convenient way to create image parameters with common
13
+ UI customizations like file browser, webcam capture, and edit mask.
14
+ It exposes these UI options as direct properties for easy runtime modification.
15
+
16
+ Example:
17
+ param = ParameterImage(
18
+ name="input_image",
19
+ tooltip="Select an image",
20
+ clickable_file_browser=True,
21
+ webcam_capture_image=True,
22
+ edit_mask=True
23
+ )
24
+ param.pulse_on_run = True # Change UI options at runtime
25
+ """
26
+
27
+ def __init__( # noqa: PLR0913
28
+ self,
29
+ name: str,
30
+ tooltip: str | None = None,
31
+ *,
32
+ type: str = "ImageUrlArtifact", # noqa: A002, ARG002
33
+ input_types: list[str] | None = None, # noqa: ARG002
34
+ output_type: str = "ImageUrlArtifact", # noqa: ARG002
35
+ default_value: Any = None,
36
+ tooltip_as_input: str | None = None,
37
+ tooltip_as_property: str | None = None,
38
+ tooltip_as_output: str | None = None,
39
+ allowed_modes: set[ParameterMode] | None = None,
40
+ traits: set[type[Trait] | Trait] | None = None,
41
+ converters: list[Callable[[Any], Any]] | None = None,
42
+ validators: list[Callable[[Parameter, Any], None]] | None = None,
43
+ ui_options: dict | None = None,
44
+ pulse_on_run: bool = False,
45
+ clickable_file_browser: bool = True,
46
+ webcam_capture_image: bool = False,
47
+ edit_mask: bool = False,
48
+ accept_any: bool = True,
49
+ hide: bool = False,
50
+ hide_label: bool = False,
51
+ hide_property: bool = False,
52
+ allow_input: bool = True,
53
+ allow_property: bool = True,
54
+ allow_output: bool = True,
55
+ settable: bool = True,
56
+ serializable: bool = True,
57
+ user_defined: bool = False,
58
+ element_id: str | None = None,
59
+ element_type: str | None = None,
60
+ parent_container_name: str | None = None,
61
+ ) -> None:
62
+ """Initialize an image parameter with enhanced UI options.
63
+
64
+ Args:
65
+ name: Parameter name
66
+ tooltip: Parameter tooltip
67
+ type: Parameter type (ignored, always "ImageUrlArtifact" for ParameterImage)
68
+ input_types: Allowed input types (ignored, set based on accept_any)
69
+ output_type: Output type (ignored, always "ImageUrlArtifact" for ParameterImage)
70
+ default_value: Default parameter value
71
+ tooltip_as_input: Tooltip for input mode
72
+ tooltip_as_property: Tooltip for property mode
73
+ tooltip_as_output: Tooltip for output mode
74
+ allowed_modes: Allowed parameter modes
75
+ traits: Parameter traits
76
+ converters: Parameter converters
77
+ validators: Parameter validators
78
+ ui_options: Dictionary of UI options
79
+ pulse_on_run: Whether to pulse the parameter on run
80
+ clickable_file_browser: Whether to show clickable file browser
81
+ webcam_capture_image: Whether to enable webcam capture
82
+ edit_mask: Whether to enable edit mask functionality
83
+ accept_any: Whether to accept any input type and convert to image (default: True)
84
+ hide: Whether to hide the entire parameter
85
+ hide_label: Whether to hide the parameter label
86
+ hide_property: Whether to hide the parameter in property mode
87
+ allow_input: Whether to allow input mode
88
+ allow_property: Whether to allow property mode
89
+ allow_output: Whether to allow output mode
90
+ settable: Whether the parameter is settable
91
+ serializable: Whether the parameter is serializable
92
+ user_defined: Whether the parameter is user-defined
93
+ element_id: Element ID
94
+ element_type: Element type
95
+ parent_container_name: Name of parent container
96
+ """
97
+ # Build ui_options dictionary from the provided UI-specific parameters
98
+ if ui_options is None:
99
+ ui_options = {}
100
+ else:
101
+ ui_options = ui_options.copy()
102
+
103
+ # Add image-specific UI options if they have values
104
+ if pulse_on_run:
105
+ ui_options["pulse_on_run"] = pulse_on_run
106
+ if clickable_file_browser:
107
+ ui_options["clickable_file_browser"] = clickable_file_browser
108
+ if webcam_capture_image:
109
+ ui_options["webcam_capture_image"] = webcam_capture_image
110
+ if edit_mask:
111
+ ui_options["edit_mask"] = edit_mask
112
+
113
+ # Auto-disable clickable_file_browser if neither input nor property modes are allowed
114
+ if not allow_input and not allow_property and clickable_file_browser:
115
+ ui_options.pop("clickable_file_browser", None)
116
+
117
+ # Set up input types based on accept_any setting
118
+ if accept_any:
119
+ final_input_types = ["any"]
120
+ else:
121
+ final_input_types = ["ImageUrlArtifact"]
122
+
123
+ # Call parent with explicit parameters, following ControlParameter pattern
124
+ super().__init__(
125
+ name=name,
126
+ tooltip=tooltip,
127
+ type="ImageUrlArtifact", # Always an ImageUrlArtifact type for ParameterImage
128
+ input_types=final_input_types,
129
+ output_type="ImageUrlArtifact", # Always output as ImageUrlArtifact
130
+ default_value=default_value,
131
+ tooltip_as_input=tooltip_as_input,
132
+ tooltip_as_property=tooltip_as_property,
133
+ tooltip_as_output=tooltip_as_output,
134
+ allowed_modes=allowed_modes,
135
+ traits=traits,
136
+ converters=converters,
137
+ validators=validators,
138
+ ui_options=ui_options,
139
+ hide=hide,
140
+ hide_label=hide_label,
141
+ hide_property=hide_property,
142
+ allow_input=allow_input,
143
+ allow_property=allow_property,
144
+ allow_output=allow_output,
145
+ settable=settable,
146
+ serializable=serializable,
147
+ user_defined=user_defined,
148
+ element_id=element_id,
149
+ element_type=element_type,
150
+ parent_container_name=parent_container_name,
151
+ )
152
+
153
+ @property
154
+ def pulse_on_run(self) -> bool:
155
+ """Get whether pulse on run is enabled.
156
+
157
+ Returns:
158
+ True if pulse on run is enabled, False otherwise
159
+ """
160
+ return self.ui_options.get("pulse_on_run", False)
161
+
162
+ @pulse_on_run.setter
163
+ def pulse_on_run(self, value: bool) -> None:
164
+ """Set whether pulse on run is enabled.
165
+
166
+ Args:
167
+ value: Whether to enable pulse on run
168
+ """
169
+ if value:
170
+ self.update_ui_options_key("pulse_on_run", value)
171
+ else:
172
+ ui_options = self.ui_options.copy()
173
+ ui_options.pop("pulse_on_run", None)
174
+ self.ui_options = ui_options
175
+
176
+ @property
177
+ def clickable_file_browser(self) -> bool:
178
+ """Get whether clickable file browser is enabled.
179
+
180
+ Returns:
181
+ True if clickable file browser is enabled, False otherwise
182
+ """
183
+ return self.ui_options.get("clickable_file_browser", False)
184
+
185
+ @clickable_file_browser.setter
186
+ def clickable_file_browser(self, value: bool) -> None:
187
+ """Set whether clickable file browser is enabled.
188
+
189
+ Args:
190
+ value: Whether to enable clickable file browser
191
+ """
192
+ if value:
193
+ self.update_ui_options_key("clickable_file_browser", value)
194
+ else:
195
+ ui_options = self.ui_options.copy()
196
+ ui_options.pop("clickable_file_browser", None)
197
+ self.ui_options = ui_options
198
+
199
+ @property
200
+ def webcam_capture_image(self) -> bool:
201
+ """Get whether webcam capture image is enabled.
202
+
203
+ Returns:
204
+ True if webcam capture image is enabled, False otherwise
205
+ """
206
+ return self.ui_options.get("webcam_capture_image", False)
207
+
208
+ @webcam_capture_image.setter
209
+ def webcam_capture_image(self, value: bool) -> None:
210
+ """Set whether webcam capture image is enabled.
211
+
212
+ Args:
213
+ value: Whether to enable webcam capture image
214
+ """
215
+ if value:
216
+ self.update_ui_options_key("webcam_capture_image", value)
217
+ else:
218
+ ui_options = self.ui_options.copy()
219
+ ui_options.pop("webcam_capture_image", None)
220
+ self.ui_options = ui_options
221
+
222
+ @property
223
+ def edit_mask(self) -> bool:
224
+ """Get whether edit mask is enabled.
225
+
226
+ Returns:
227
+ True if edit mask is enabled, False otherwise
228
+ """
229
+ return self.ui_options.get("edit_mask", False)
230
+
231
+ @edit_mask.setter
232
+ def edit_mask(self, value: bool) -> None:
233
+ """Set whether edit mask is enabled.
234
+
235
+ Args:
236
+ value: Whether to enable edit mask
237
+ """
238
+ if value:
239
+ self.update_ui_options_key("edit_mask", value)
240
+ else:
241
+ ui_options = self.ui_options.copy()
242
+ ui_options.pop("edit_mask", None)
243
+ self.ui_options = ui_options
@@ -0,0 +1,215 @@
1
+ """Parameter3D component for 3D model inputs with enhanced 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 Parameter3D(Parameter):
10
+ """A specialized Parameter class for 3D model inputs with enhanced UI options.
11
+
12
+ This class provides a convenient way to create 3D model parameters with common
13
+ UI customizations like file browser and expander functionality.
14
+ It exposes these UI options as direct properties for easy runtime modification.
15
+
16
+ Example:
17
+ param = Parameter3D(
18
+ name="input_3d",
19
+ tooltip="Select a 3D model",
20
+ clickable_file_browser=True,
21
+ expander=True
22
+ )
23
+ param.pulse_on_run = True # Change UI options at runtime
24
+ """
25
+
26
+ def __init__( # noqa: PLR0913
27
+ self,
28
+ name: str,
29
+ tooltip: str | None = None,
30
+ *,
31
+ type: str = "ThreeDUrlArtifact", # noqa: A002, ARG002
32
+ input_types: list[str] | None = None, # noqa: ARG002
33
+ output_type: str = "ThreeDUrlArtifact", # noqa: ARG002
34
+ default_value: Any = None,
35
+ tooltip_as_input: str | None = None,
36
+ tooltip_as_property: str | None = None,
37
+ tooltip_as_output: str | None = None,
38
+ allowed_modes: set[ParameterMode] | None = None,
39
+ traits: set[type[Trait] | Trait] | None = None,
40
+ converters: list[Callable[[Any], Any]] | None = None,
41
+ validators: list[Callable[[Parameter, Any], None]] | None = None,
42
+ ui_options: dict | None = None,
43
+ pulse_on_run: bool = False,
44
+ clickable_file_browser: bool = True,
45
+ expander: bool = False,
46
+ accept_any: bool = True,
47
+ hide: bool = False,
48
+ hide_label: bool = False,
49
+ hide_property: bool = False,
50
+ allow_input: bool = True,
51
+ allow_property: bool = True,
52
+ allow_output: bool = True,
53
+ settable: bool = True,
54
+ serializable: bool = True,
55
+ user_defined: bool = False,
56
+ element_id: str | None = None,
57
+ element_type: str | None = None,
58
+ parent_container_name: str | None = None,
59
+ ) -> None:
60
+ """Initialize a 3D model parameter with enhanced UI options.
61
+
62
+ Args:
63
+ name: Parameter name
64
+ tooltip: Parameter tooltip
65
+ type: Parameter type (ignored, always "ThreeDUrlArtifact" for Parameter3D)
66
+ input_types: Allowed input types (ignored, set based on accept_any)
67
+ output_type: Output type (ignored, always "ThreeDUrlArtifact" for Parameter3D)
68
+ default_value: Default parameter value
69
+ tooltip_as_input: Tooltip for input mode
70
+ tooltip_as_property: Tooltip for property mode
71
+ tooltip_as_output: Tooltip for output mode
72
+ allowed_modes: Allowed parameter modes
73
+ traits: Parameter traits
74
+ converters: Parameter converters
75
+ validators: Parameter validators
76
+ ui_options: Dictionary of UI options
77
+ pulse_on_run: Whether to pulse the parameter on run
78
+ clickable_file_browser: Whether to show clickable file browser
79
+ expander: Whether to enable expander functionality
80
+ accept_any: Whether to accept any input type and convert to 3D (default: True)
81
+ hide: Whether to hide the entire parameter
82
+ hide_label: Whether to hide the parameter label
83
+ hide_property: Whether to hide the parameter in property mode
84
+ allow_input: Whether to allow input mode
85
+ allow_property: Whether to allow property mode
86
+ allow_output: Whether to allow output mode
87
+ settable: Whether the parameter is settable
88
+ serializable: Whether the parameter is serializable
89
+ user_defined: Whether the parameter is user-defined
90
+ element_id: Element ID
91
+ element_type: Element type
92
+ parent_container_name: Name of parent container
93
+ """
94
+ # Build ui_options dictionary from the provided UI-specific parameters
95
+ if ui_options is None:
96
+ ui_options = {}
97
+ else:
98
+ ui_options = ui_options.copy()
99
+
100
+ # Add 3D-specific UI options if they have values
101
+ if pulse_on_run:
102
+ ui_options["pulse_on_run"] = pulse_on_run
103
+ if clickable_file_browser:
104
+ ui_options["clickable_file_browser"] = clickable_file_browser
105
+ if expander:
106
+ ui_options["expander"] = expander
107
+
108
+ # Auto-disable clickable_file_browser if neither input nor property modes are allowed
109
+ if not allow_input and not allow_property and clickable_file_browser:
110
+ ui_options.pop("clickable_file_browser", None)
111
+
112
+ # Set up input types based on accept_any setting
113
+ if accept_any:
114
+ final_input_types = ["any"]
115
+ else:
116
+ final_input_types = ["ThreeDUrlArtifact"]
117
+
118
+ # Call parent with explicit parameters, following ControlParameter pattern
119
+ super().__init__(
120
+ name=name,
121
+ tooltip=tooltip,
122
+ type="ThreeDUrlArtifact", # Always a ThreeDUrlArtifact type for Parameter3D
123
+ input_types=final_input_types,
124
+ output_type="ThreeDUrlArtifact", # Always output as ThreeDUrlArtifact
125
+ default_value=default_value,
126
+ tooltip_as_input=tooltip_as_input,
127
+ tooltip_as_property=tooltip_as_property,
128
+ tooltip_as_output=tooltip_as_output,
129
+ allowed_modes=allowed_modes,
130
+ traits=traits,
131
+ converters=converters,
132
+ validators=validators,
133
+ ui_options=ui_options,
134
+ hide=hide,
135
+ hide_label=hide_label,
136
+ hide_property=hide_property,
137
+ allow_input=allow_input,
138
+ allow_property=allow_property,
139
+ allow_output=allow_output,
140
+ settable=settable,
141
+ serializable=serializable,
142
+ user_defined=user_defined,
143
+ element_id=element_id,
144
+ element_type=element_type,
145
+ parent_container_name=parent_container_name,
146
+ )
147
+
148
+ @property
149
+ def pulse_on_run(self) -> bool:
150
+ """Get whether pulse on run is enabled.
151
+
152
+ Returns:
153
+ True if pulse on run is enabled, False otherwise
154
+ """
155
+ return self.ui_options.get("pulse_on_run", False)
156
+
157
+ @pulse_on_run.setter
158
+ def pulse_on_run(self, value: bool) -> None:
159
+ """Set whether pulse on run is enabled.
160
+
161
+ Args:
162
+ value: Whether to enable pulse on run
163
+ """
164
+ if value:
165
+ self.update_ui_options_key("pulse_on_run", value)
166
+ else:
167
+ ui_options = self.ui_options.copy()
168
+ ui_options.pop("pulse_on_run", None)
169
+ self.ui_options = ui_options
170
+
171
+ @property
172
+ def clickable_file_browser(self) -> bool:
173
+ """Get whether clickable file browser is enabled.
174
+
175
+ Returns:
176
+ True if clickable file browser is enabled, False otherwise
177
+ """
178
+ return self.ui_options.get("clickable_file_browser", False)
179
+
180
+ @clickable_file_browser.setter
181
+ def clickable_file_browser(self, value: bool) -> None:
182
+ """Set whether clickable file browser is enabled.
183
+
184
+ Args:
185
+ value: Whether to enable clickable file browser
186
+ """
187
+ if value:
188
+ self.update_ui_options_key("clickable_file_browser", value)
189
+ else:
190
+ ui_options = self.ui_options.copy()
191
+ ui_options.pop("clickable_file_browser", None)
192
+ self.ui_options = ui_options
193
+
194
+ @property
195
+ def expander(self) -> bool:
196
+ """Get whether expander is enabled.
197
+
198
+ Returns:
199
+ True if expander is enabled, False otherwise
200
+ """
201
+ return self.ui_options.get("expander", False)
202
+
203
+ @expander.setter
204
+ def expander(self, value: bool) -> None:
205
+ """Set whether expander is enabled.
206
+
207
+ Args:
208
+ value: Whether to enable expander
209
+ """
210
+ if value:
211
+ self.update_ui_options_key("expander", value)
212
+ else:
213
+ ui_options = self.ui_options.copy()
214
+ ui_options.pop("expander", None)
215
+ self.ui_options = ui_options
@@ -0,0 +1,243 @@
1
+ """ParameterVideo component for video inputs with enhanced 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 ParameterVideo(Parameter):
10
+ """A specialized Parameter class for video inputs with enhanced UI options.
11
+
12
+ This class provides a convenient way to create video parameters with common
13
+ UI customizations like file browser, webcam capture, and video editing.
14
+ It exposes these UI options as direct properties for easy runtime modification.
15
+
16
+ Example:
17
+ param = ParameterVideo(
18
+ name="input_video",
19
+ tooltip="Select a video",
20
+ clickable_file_browser=True,
21
+ webcam_capture_video=True,
22
+ edit_video=True
23
+ )
24
+ param.pulse_on_run = True # Change UI options at runtime
25
+ """
26
+
27
+ def __init__( # noqa: PLR0913
28
+ self,
29
+ name: str,
30
+ tooltip: str | None = None,
31
+ *,
32
+ type: str = "VideoUrlArtifact", # noqa: A002, ARG002
33
+ input_types: list[str] | None = None, # noqa: ARG002
34
+ output_type: str = "VideoUrlArtifact", # noqa: ARG002
35
+ default_value: Any = None,
36
+ tooltip_as_input: str | None = None,
37
+ tooltip_as_property: str | None = None,
38
+ tooltip_as_output: str | None = None,
39
+ allowed_modes: set[ParameterMode] | None = None,
40
+ traits: set[type[Trait] | Trait] | None = None,
41
+ converters: list[Callable[[Any], Any]] | None = None,
42
+ validators: list[Callable[[Parameter, Any], None]] | None = None,
43
+ ui_options: dict | None = None,
44
+ pulse_on_run: bool = False,
45
+ clickable_file_browser: bool = True,
46
+ webcam_capture_video: bool = False,
47
+ edit_video: bool = False,
48
+ accept_any: bool = True,
49
+ hide: bool = False,
50
+ hide_label: bool = False,
51
+ hide_property: bool = False,
52
+ allow_input: bool = True,
53
+ allow_property: bool = True,
54
+ allow_output: bool = True,
55
+ settable: bool = True,
56
+ serializable: bool = True,
57
+ user_defined: bool = False,
58
+ element_id: str | None = None,
59
+ element_type: str | None = None,
60
+ parent_container_name: str | None = None,
61
+ ) -> None:
62
+ """Initialize a video parameter with enhanced UI options.
63
+
64
+ Args:
65
+ name: Parameter name
66
+ tooltip: Parameter tooltip
67
+ type: Parameter type (ignored, always "VideoUrlArtifact" for ParameterVideo)
68
+ input_types: Allowed input types (ignored, set based on accept_any)
69
+ output_type: Output type (ignored, always "VideoUrlArtifact" for ParameterVideo)
70
+ default_value: Default parameter value
71
+ tooltip_as_input: Tooltip for input mode
72
+ tooltip_as_property: Tooltip for property mode
73
+ tooltip_as_output: Tooltip for output mode
74
+ allowed_modes: Allowed parameter modes
75
+ traits: Parameter traits
76
+ converters: Parameter converters
77
+ validators: Parameter validators
78
+ ui_options: Dictionary of UI options
79
+ pulse_on_run: Whether to pulse the parameter on run
80
+ clickable_file_browser: Whether to show clickable file browser
81
+ webcam_capture_video: Whether to enable webcam capture
82
+ edit_video: Whether to enable video editing functionality
83
+ accept_any: Whether to accept any input type and convert to video (default: True)
84
+ hide: Whether to hide the entire parameter
85
+ hide_label: Whether to hide the parameter label
86
+ hide_property: Whether to hide the parameter in property mode
87
+ allow_input: Whether to allow input mode
88
+ allow_property: Whether to allow property mode
89
+ allow_output: Whether to allow output mode
90
+ settable: Whether the parameter is settable
91
+ serializable: Whether the parameter is serializable
92
+ user_defined: Whether the parameter is user-defined
93
+ element_id: Element ID
94
+ element_type: Element type
95
+ parent_container_name: Name of parent container
96
+ """
97
+ # Build ui_options dictionary from the provided UI-specific parameters
98
+ if ui_options is None:
99
+ ui_options = {}
100
+ else:
101
+ ui_options = ui_options.copy()
102
+
103
+ # Add video-specific UI options if they have values
104
+ if pulse_on_run:
105
+ ui_options["pulse_on_run"] = pulse_on_run
106
+ if clickable_file_browser:
107
+ ui_options["clickable_file_browser"] = clickable_file_browser
108
+ if webcam_capture_video:
109
+ ui_options["webcam_capture_video"] = webcam_capture_video
110
+ if edit_video:
111
+ ui_options["edit_video"] = edit_video
112
+
113
+ # Auto-disable clickable_file_browser if neither input nor property modes are allowed
114
+ if not allow_input and not allow_property and clickable_file_browser:
115
+ ui_options.pop("clickable_file_browser", None)
116
+
117
+ # Set up input types based on accept_any setting
118
+ if accept_any:
119
+ final_input_types = ["any"]
120
+ else:
121
+ final_input_types = ["VideoUrlArtifact"]
122
+
123
+ # Call parent with explicit parameters, following ControlParameter pattern
124
+ super().__init__(
125
+ name=name,
126
+ tooltip=tooltip,
127
+ type="VideoUrlArtifact", # Always a VideoUrlArtifact type for ParameterVideo
128
+ input_types=final_input_types,
129
+ output_type="VideoUrlArtifact", # Always output as VideoUrlArtifact
130
+ default_value=default_value,
131
+ tooltip_as_input=tooltip_as_input,
132
+ tooltip_as_property=tooltip_as_property,
133
+ tooltip_as_output=tooltip_as_output,
134
+ allowed_modes=allowed_modes,
135
+ traits=traits,
136
+ converters=converters,
137
+ validators=validators,
138
+ ui_options=ui_options,
139
+ hide=hide,
140
+ hide_label=hide_label,
141
+ hide_property=hide_property,
142
+ allow_input=allow_input,
143
+ allow_property=allow_property,
144
+ allow_output=allow_output,
145
+ settable=settable,
146
+ serializable=serializable,
147
+ user_defined=user_defined,
148
+ element_id=element_id,
149
+ element_type=element_type,
150
+ parent_container_name=parent_container_name,
151
+ )
152
+
153
+ @property
154
+ def pulse_on_run(self) -> bool:
155
+ """Get whether pulse on run is enabled.
156
+
157
+ Returns:
158
+ True if pulse on run is enabled, False otherwise
159
+ """
160
+ return self.ui_options.get("pulse_on_run", False)
161
+
162
+ @pulse_on_run.setter
163
+ def pulse_on_run(self, value: bool) -> None:
164
+ """Set whether pulse on run is enabled.
165
+
166
+ Args:
167
+ value: Whether to enable pulse on run
168
+ """
169
+ if value:
170
+ self.update_ui_options_key("pulse_on_run", value)
171
+ else:
172
+ ui_options = self.ui_options.copy()
173
+ ui_options.pop("pulse_on_run", None)
174
+ self.ui_options = ui_options
175
+
176
+ @property
177
+ def clickable_file_browser(self) -> bool:
178
+ """Get whether clickable file browser is enabled.
179
+
180
+ Returns:
181
+ True if clickable file browser is enabled, False otherwise
182
+ """
183
+ return self.ui_options.get("clickable_file_browser", False)
184
+
185
+ @clickable_file_browser.setter
186
+ def clickable_file_browser(self, value: bool) -> None:
187
+ """Set whether clickable file browser is enabled.
188
+
189
+ Args:
190
+ value: Whether to enable clickable file browser
191
+ """
192
+ if value:
193
+ self.update_ui_options_key("clickable_file_browser", value)
194
+ else:
195
+ ui_options = self.ui_options.copy()
196
+ ui_options.pop("clickable_file_browser", None)
197
+ self.ui_options = ui_options
198
+
199
+ @property
200
+ def webcam_capture_video(self) -> bool:
201
+ """Get whether webcam capture video is enabled.
202
+
203
+ Returns:
204
+ True if webcam capture video is enabled, False otherwise
205
+ """
206
+ return self.ui_options.get("webcam_capture_video", False)
207
+
208
+ @webcam_capture_video.setter
209
+ def webcam_capture_video(self, value: bool) -> None:
210
+ """Set whether webcam capture video is enabled.
211
+
212
+ Args:
213
+ value: Whether to enable webcam capture video
214
+ """
215
+ if value:
216
+ self.update_ui_options_key("webcam_capture_video", value)
217
+ else:
218
+ ui_options = self.ui_options.copy()
219
+ ui_options.pop("webcam_capture_video", None)
220
+ self.ui_options = ui_options
221
+
222
+ @property
223
+ def edit_video(self) -> bool:
224
+ """Get whether edit video is enabled.
225
+
226
+ Returns:
227
+ True if edit video is enabled, False otherwise
228
+ """
229
+ return self.ui_options.get("edit_video", False)
230
+
231
+ @edit_video.setter
232
+ def edit_video(self, value: bool) -> None:
233
+ """Set whether edit video is enabled.
234
+
235
+ Args:
236
+ value: Whether to enable edit video
237
+ """
238
+ if value:
239
+ self.update_ui_options_key("edit_video", value)
240
+ else:
241
+ ui_options = self.ui_options.copy()
242
+ ui_options.pop("edit_video", None)
243
+ self.ui_options = ui_options