griptape-nodes 0.70.1__py3-none-any.whl → 0.71.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 (28) hide show
  1. griptape_nodes/api_client/client.py +8 -5
  2. griptape_nodes/bootstrap/utils/python_subprocess_executor.py +48 -9
  3. griptape_nodes/bootstrap/utils/subprocess_websocket_base.py +88 -0
  4. griptape_nodes/bootstrap/utils/subprocess_websocket_listener.py +126 -0
  5. griptape_nodes/bootstrap/utils/subprocess_websocket_sender.py +121 -0
  6. griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +17 -170
  7. griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +13 -117
  8. griptape_nodes/bootstrap/workflow_publishers/local_session_workflow_publisher.py +206 -0
  9. griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +22 -3
  10. griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +45 -25
  11. griptape_nodes/common/node_executor.py +60 -13
  12. griptape_nodes/exe_types/base_iterative_nodes.py +1 -1
  13. griptape_nodes/exe_types/node_groups/subflow_node_group.py +18 -0
  14. griptape_nodes/exe_types/param_components/log_parameter.py +1 -2
  15. griptape_nodes/exe_types/param_components/subflow_execution_component.py +329 -0
  16. griptape_nodes/exe_types/param_types/parameter_audio.py +17 -2
  17. griptape_nodes/exe_types/param_types/parameter_image.py +14 -1
  18. griptape_nodes/exe_types/param_types/parameter_number.py +16 -22
  19. griptape_nodes/exe_types/param_types/parameter_three_d.py +14 -1
  20. griptape_nodes/exe_types/param_types/parameter_video.py +17 -2
  21. griptape_nodes/retained_mode/managers/os_manager.py +1 -1
  22. griptape_nodes/traits/clamp.py +9 -52
  23. griptape_nodes/utils/artifact_normalization.py +245 -0
  24. griptape_nodes/utils/image_preview.py +27 -0
  25. {griptape_nodes-0.70.1.dist-info → griptape_nodes-0.71.0.dist-info}/METADATA +1 -1
  26. {griptape_nodes-0.70.1.dist-info → griptape_nodes-0.71.0.dist-info}/RECORD +28 -22
  27. {griptape_nodes-0.70.1.dist-info → griptape_nodes-0.71.0.dist-info}/WHEEL +1 -1
  28. {griptape_nodes-0.70.1.dist-info → griptape_nodes-0.71.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,245 @@
1
+ """Core utilities for normalizing artifact inputs (images, videos, audio).
2
+
3
+ This module provides normalization functions that convert string paths to
4
+ their respective artifact types (ImageUrlArtifact, VideoUrlArtifact, AudioUrlArtifact).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ from pathlib import Path
11
+ from typing import Any
12
+ from urllib.parse import urlparse
13
+
14
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ def _resolve_localhost_url_to_path(url: str) -> str:
20
+ """Resolve localhost static file URLs to workspace file paths.
21
+
22
+ Converts URLs like http://localhost:8124/workspace/static_files/file.jpg
23
+ to actual workspace file paths like static_files/file.jpg
24
+
25
+ Args:
26
+ url: URL string that may be a localhost URL
27
+
28
+ Returns:
29
+ Resolved file path relative to workspace, or original string if not a localhost URL
30
+ """
31
+ if not isinstance(url, str):
32
+ return url
33
+
34
+ # Strip query parameters (cachebuster ?t=...)
35
+ if "?" in url:
36
+ url = url.split("?")[0]
37
+
38
+ # Check if it's a localhost URL (any port)
39
+ if url.startswith(("http://localhost:", "https://localhost:")):
40
+ parsed = urlparse(url)
41
+ # Extract path after /workspace/
42
+ if "/workspace/" in parsed.path:
43
+ workspace_relative_path = parsed.path.split("/workspace/", 1)[1]
44
+ return workspace_relative_path
45
+
46
+ # Not a localhost workspace URL, return as-is
47
+ return url
48
+
49
+
50
+ def _resolve_file_path(file_path: str) -> Path | None: # noqa: PLR0911
51
+ """Resolve file path to absolute path relative to workspace.
52
+
53
+ Args:
54
+ file_path: File path (may be absolute, relative, or localhost URL)
55
+
56
+ Returns:
57
+ Resolved Path object, or None if path cannot be resolved
58
+ """
59
+ # First resolve localhost URLs
60
+ file_path = _resolve_localhost_url_to_path(file_path)
61
+
62
+ # Get workspace path (can raise exceptions from ConfigManager)
63
+ try:
64
+ workspace_path = GriptapeNodes.ConfigManager().workspace_path
65
+ except (AttributeError, RuntimeError, KeyError) as e:
66
+ logger.debug("Failed to get workspace path: %s", e)
67
+ return None
68
+
69
+ # Create Path object (Path() constructor doesn't raise exceptions, but we validate)
70
+ path = Path(file_path)
71
+
72
+ # Check if path is absolute (is_absolute() doesn't raise exceptions)
73
+ if not path.is_absolute():
74
+ # Relative path - resolve relative to workspace (path operations don't raise exceptions)
75
+ return workspace_path / path
76
+
77
+ # Absolute path - check if relative to workspace
78
+ is_relative_to_workspace = False
79
+ try:
80
+ is_relative_to_workspace = path.is_relative_to(workspace_path)
81
+ except (ValueError, AttributeError):
82
+ # Path.is_relative_to() not available in older Python versions, use relative_to() instead
83
+ try:
84
+ path.relative_to(workspace_path)
85
+ is_relative_to_workspace = True
86
+ except ValueError:
87
+ # Absolute path outside workspace
88
+ is_relative_to_workspace = False
89
+ except (OSError, RuntimeError) as e:
90
+ # Unexpected errors from relative_to()
91
+ logger.debug("Unexpected error calling relative_to() for '%s': %s", file_path, e)
92
+ return None
93
+
94
+ if is_relative_to_workspace:
95
+ return path
96
+
97
+ # Absolute path outside workspace - return as-is (might be a system path)
98
+ # exists() can raise OSError or PermissionError
99
+ try:
100
+ path_exists = path.exists()
101
+ except (OSError, PermissionError) as e:
102
+ logger.debug("Failed to check if path exists for '%s': %s", file_path, e)
103
+ return None
104
+
105
+ if path_exists:
106
+ return path
107
+
108
+ return None
109
+
110
+
111
+ def _upload_file_to_static_storage(file_path: Path, artifact_type: type[Any]) -> Any | None:
112
+ """Upload a file to static storage and return an artifact.
113
+
114
+ Args:
115
+ file_path: Path to the file to upload
116
+ artifact_type: The artifact class to create (ImageUrlArtifact, VideoUrlArtifact, AudioUrlArtifact)
117
+
118
+ Returns:
119
+ Artifact object with localhost URL, or None if upload fails
120
+ """
121
+ if not file_path.exists() or not file_path.is_file():
122
+ return None
123
+
124
+ try:
125
+ file_data = file_path.read_bytes()
126
+ file_name = file_path.name
127
+ static_files_manager = GriptapeNodes.StaticFilesManager()
128
+ url = static_files_manager.save_static_file(file_data, file_name)
129
+ return artifact_type(url)
130
+ except Exception as e:
131
+ logger.debug("Failed to upload file '%s' to static storage: %s", file_path, e)
132
+ return None
133
+
134
+
135
+ def _normalize_string_input(artifact_input: str, artifact_type: type[Any]) -> Any: # noqa: PLR0911
136
+ """Normalize a string input to an artifact.
137
+
138
+ Args:
139
+ artifact_input: String input (URL or file path)
140
+ artifact_type: The artifact class to create
141
+
142
+ Returns:
143
+ Artifact object or original input if normalization fails
144
+ """
145
+ # If it's already a URL (http/https), return it as-is
146
+ if artifact_input.startswith(("http://", "https://")):
147
+ # Check if it's a localhost URL that needs resolving
148
+ if artifact_input.startswith(("http://localhost:", "https://localhost:")):
149
+ resolved_path = _resolve_localhost_url_to_path(artifact_input)
150
+ # If path wasn't resolved, return as URL artifact
151
+ if resolved_path == artifact_input:
152
+ return artifact_type(artifact_input)
153
+
154
+ # Try to resolve and upload the resolved path
155
+ file_path = _resolve_file_path(resolved_path)
156
+ if not file_path:
157
+ return artifact_type(artifact_input)
158
+
159
+ artifact = _upload_file_to_static_storage(file_path, artifact_type)
160
+ if not artifact:
161
+ return artifact_type(artifact_input)
162
+
163
+ # Success path: return the uploaded artifact
164
+ return artifact
165
+ # Regular URL, return as-is
166
+ return artifact_type(artifact_input)
167
+
168
+ # Try to resolve and upload file path
169
+ file_path = _resolve_file_path(artifact_input)
170
+ if file_path:
171
+ artifact = _upload_file_to_static_storage(file_path, artifact_type)
172
+ if artifact:
173
+ return artifact
174
+
175
+ return artifact_input
176
+
177
+
178
+ def normalize_artifact_input(
179
+ artifact_input: Any,
180
+ artifact_type: type[Any],
181
+ *,
182
+ accepted_types: tuple[type[Any], ...] | None = None,
183
+ ) -> Any:
184
+ """Normalize an artifact input, converting string paths to the specified artifact type.
185
+
186
+ This ensures consistency whether values come from user input or node connections.
187
+ String paths are uploaded to static storage and converted to artifact objects.
188
+ Objects that are already the correct artifact type are returned unchanged.
189
+
190
+ Args:
191
+ artifact_input: Artifact input (may be string, artifact object, etc.)
192
+ artifact_type: The artifact class to create (ImageUrlArtifact, VideoUrlArtifact, AudioUrlArtifact)
193
+ accepted_types: Optional tuple of artifact types that should be passed through unchanged.
194
+ For example, for images, both ImageUrlArtifact and ImageArtifact are valid.
195
+
196
+ Returns:
197
+ Artifact of the specified type if input was a string path, otherwise returns input unchanged
198
+ """
199
+ # Return unchanged if already the correct artifact type
200
+ if isinstance(artifact_input, artifact_type):
201
+ return artifact_input
202
+
203
+ # Also return unchanged if it's one of the accepted types (e.g., ImageArtifact for images)
204
+ if accepted_types and isinstance(artifact_input, accepted_types):
205
+ return artifact_input
206
+
207
+ # Process string paths
208
+ if isinstance(artifact_input, str) and artifact_input:
209
+ return _normalize_string_input(artifact_input, artifact_type)
210
+
211
+ return artifact_input
212
+
213
+
214
+ def normalize_artifact_list(
215
+ artifact_list: list[Any],
216
+ artifact_type: type[Any],
217
+ *,
218
+ accepted_types: tuple[type[Any], ...] | None = None,
219
+ ) -> list[Any]:
220
+ """Normalize a list of artifact inputs, converting string paths to the specified artifact type.
221
+
222
+ This ensures consistency whether values come from user input or node connections.
223
+ String paths are uploaded to static storage and converted to artifact objects.
224
+ Objects that are already the correct artifact type are passed through unchanged.
225
+
226
+ Args:
227
+ artifact_list: List of artifact inputs (may contain strings, artifact objects, etc.)
228
+ artifact_type: The artifact class to create (ImageUrlArtifact, VideoUrlArtifact, AudioUrlArtifact)
229
+ accepted_types: Optional tuple of artifact types that should be passed through unchanged.
230
+ For example, for images, both ImageUrlArtifact and ImageArtifact are valid.
231
+
232
+ Returns:
233
+ List with string paths converted to artifacts of the specified type
234
+ """
235
+ if not artifact_list:
236
+ return artifact_list
237
+
238
+ normalized_list = []
239
+ for item in artifact_list:
240
+ normalized_item = normalize_artifact_input(item, artifact_type, accepted_types=accepted_types)
241
+ normalized_list.append(normalized_item)
242
+ return normalized_list
243
+
244
+
245
+ __all__ = ["normalize_artifact_input", "normalize_artifact_list"]
@@ -24,6 +24,13 @@ def create_image_preview(
24
24
  Returns:
25
25
  Base64 encoded data URL of the preview, or None if failed
26
26
  """
27
+ # Check if it's an SVG file - PIL cannot open SVG files
28
+ # TODO: Add SVG support using cairosvg or similar library to rasterize SVG files: https://github.com/griptape-ai/griptape-nodes/issues/3721
29
+ # before creating previews
30
+ if image_path.suffix.lower() == ".svg":
31
+ logger.debug(f"SVG file detected, cannot create preview with PIL (vector graphics not supported): {image_path}")
32
+ return None
33
+
27
34
  try:
28
35
  # Open and resize the image
29
36
  with Image.open(image_path) as img:
@@ -53,6 +60,12 @@ def create_image_preview(
53
60
  return data_url
54
61
 
55
62
  except Exception as e:
63
+ # Check if error is due to SVG format
64
+ if "cannot identify image file" in str(e).lower() and image_path.suffix.lower() == ".svg":
65
+ logger.debug(
66
+ f"SVG file detected, cannot create preview with PIL (vector graphics not supported): {image_path}"
67
+ )
68
+ return None
56
69
  logger.warning(f"Failed to create preview for {image_path}: {e}")
57
70
  return None
58
71
 
@@ -73,6 +86,14 @@ def create_image_preview_from_bytes(
73
86
  Base64 encoded data URL of the preview, or None if failed
74
87
  """
75
88
  try:
89
+ # Check if content might be SVG by looking at first few bytes
90
+ # TODO: Add SVG support using cairosvg or similar library to rasterize SVG files: https://github.com/griptape-ai/griptape-nodes/issues/3721
91
+ # before creating previews
92
+ content_start = image_bytes[:100].decode("utf-8", errors="ignore").lower()
93
+ if "<svg" in content_start:
94
+ logger.debug("SVG file detected, cannot create preview with PIL (vector graphics not supported)")
95
+ return None
96
+
76
97
  # Open image from bytes
77
98
  with Image.open(io.BytesIO(image_bytes)) as img:
78
99
  # Convert to RGB if necessary (for WebP/JPEG output)
@@ -101,6 +122,12 @@ def create_image_preview_from_bytes(
101
122
  return data_url
102
123
 
103
124
  except Exception as e:
125
+ # Check if error is due to SVG format
126
+ if "cannot identify image file" in str(e).lower():
127
+ content_start = image_bytes[:100].decode("utf-8", errors="ignore").lower()
128
+ if "<svg" in content_start:
129
+ logger.debug("SVG file detected, cannot create preview with PIL (vector graphics not supported)")
130
+ return None
104
131
  logger.warning(f"Failed to create preview from bytes: {e}")
105
132
  return None
106
133
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.70.1
3
+ Version: 0.71.0
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.9.0
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -1,7 +1,7 @@
1
1
  griptape_nodes/__init__.py,sha256=WxWjICLxwuyZGDpPUyCmj047GbN7PIspi4YMWgmrrQc,671
2
2
  griptape_nodes/__main__.py,sha256=fJhor6_1A27abwbnceyNheONP1iXkPzjjsV5jBEfF2M,144
3
3
  griptape_nodes/api_client/__init__.py,sha256=9iyLcPbcXjxxLhhCSYQ5zgvlwxceyrNXDE8YhOIVH8g,216
4
- griptape_nodes/api_client/client.py,sha256=fNTs-xJL8deRWceGKBGOCeKwMt6Rd0vi-jCxniZk79E,9870
4
+ griptape_nodes/api_client/client.py,sha256=df6fus5zNFOSFQJft2nmoo-hsFPoNfCihZRwWymAzcA,10006
5
5
  griptape_nodes/api_client/request_client.py,sha256=Z5lJVoG2a9hudTAQTnniaCHbBko0X1FyoakiQMimq7g,9713
6
6
  griptape_nodes/app/.python-version,sha256=e1X45ntWI8S-8_ppEojalDfXnTq6FW3kjUgdsyrH0W0,5
7
7
  griptape_nodes/app/__init__.py,sha256=DB-DTsgcNnbmEClXEouwzGhrmo3gHBCWXB9BkPGpdQI,90
@@ -9,19 +9,23 @@ griptape_nodes/app/app.py,sha256=bbaRe1khQNRZ1fziDdeokkR-M3K7tvKDpCl4eVm-R4g,180
9
9
  griptape_nodes/app/watch.py,sha256=hKVP_SuV9C17bH1h9o4uIVTKH-IL_-0iyHaNYmILTWU,1594
10
10
  griptape_nodes/bootstrap/__init__.py,sha256=ENv3SIzQ9TtlRrg1y4e4CnoBpJaFpFSkNpTFBV8X5Ls,25
11
11
  griptape_nodes/bootstrap/utils/__init__.py,sha256=tlNEApJLZazcBNhxkTdup4URwznnz4nZxjSaRfFrTBM,31
12
- griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=_XUQxrxt8n3vPv3_UHFlaAFRSODLhzKmAK5iNcf92lg,4847
12
+ griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=jZltd_CgDsa7lcxieI71iouqXfRDxyXrg0wfIFuAUDA,6330
13
+ griptape_nodes/bootstrap/utils/subprocess_websocket_base.py,sha256=PfgpdRVe_d-jLPbUu3a_OzhWsm7RBZNWicPMTowyUkA,2809
14
+ griptape_nodes/bootstrap/utils/subprocess_websocket_listener.py,sha256=6bBKO-DaB2QT9FX9vLckQgYcCXHZ6kKCU3lVwqbVo04,4626
15
+ griptape_nodes/bootstrap/utils/subprocess_websocket_sender.py,sha256=DDtCr8UgkSD8h7zhduWEXuEpjusKcDyksoznaK99EAg,4678
13
16
  griptape_nodes/bootstrap/workflow_executors/__init__.py,sha256=pyjN81-eLtjyECFYLXOtMCixiiI9qBi5yald86iM7Ek,34
14
- griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py,sha256=Zqb9yQe-3PxcaCEpLVcq6CQPn5iwjl5TJjQehm1fvZ0,16652
17
+ griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py,sha256=yS3b3wrqZbxRuNRDFynFsMI7cThhaNa0UERGarG_1Xw,9923
15
18
  griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py,sha256=jp81z4QFSuQsXigKN0h2Ywo0Tr_whbxFG-TJ7MCrS2Q,10263
16
- griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=2uDtGLtsEJcSzpCd8nEdRsIP6CDcIumTcI51izHlWUA,12944
19
+ griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=zBtTN8_BF9oq6NoujpBTsY48zX5ttVSOg8nw-LgF4so,8467
17
20
  griptape_nodes/bootstrap/workflow_executors/utils/__init__.py,sha256=IEz4GHM4-w_u6VpLemrj-V38v8aZJinr5Wya9ucEad0,40
18
21
  griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py,sha256=LCW6P3s3DTG_cUvG41l4GxRyj43c1p9yYlcJMACeW3s,1659
19
22
  griptape_nodes/bootstrap/workflow_executors/workflow_executor.py,sha256=c9FQXcvskas9N3G5OnTQO2SxJZJVoxbn7lug1GIRUBw,1074
20
23
  griptape_nodes/bootstrap/workflow_publishers/__init__.py,sha256=7ncdCGtEArgTBgSFDNCSBoIIAJpzlph1wTd2wipwvvM,35
24
+ griptape_nodes/bootstrap/workflow_publishers/local_session_workflow_publisher.py,sha256=v7ZwNv7C1RZEavv5y1RvdNyepAfoSYS6PuHFib0iTec,8355
21
25
  griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py,sha256=ZLe0Bf-LVdeLgTkfzndawUaB-1P8AdZrM732ZMxcNaw,1721
22
- griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py,sha256=h1Se4wjFMFFt9v_PD6QqBzujkDd_7w7mYxAIBXO4j_w,2994
26
+ griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py,sha256=V3RnyIbT63NmwyMIhpgshBd5X_aaBbeKK1tEIna1hcY,3953
23
27
  griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py,sha256=Kj-IIxgg01ihyUmLWgZu4ZJ6M7V1fK4Efw9quCcu-ZM,41
24
- griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py,sha256=5NfuaGrL-97Wb6JORRhR-zU4ooj3FaxOjqJizGb96Y0,2060
28
+ griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py,sha256=bj4hnuLPDV084_X2nMxqcjMGeWI-RA3ikm7QF7aZPfI,2763
25
29
  griptape_nodes/cli/__init__.py,sha256=HuXHtxqDMtpYRokxiFYuNB7R5EgkOshPil273kTmgNg,33
26
30
  griptape_nodes/cli/commands/__init__.py,sha256=8EbS15rm9xrbcPocuQO2RmOwSD1BBwa8iDgPSdsvzuU,35
27
31
  griptape_nodes/cli/commands/config.py,sha256=zh5rs2vCY_x9dEUK2jtQQJGcjlJzhpJJ-EgHHvkrvdg,2302
@@ -42,7 +46,7 @@ griptape_nodes/common/macro_parser/matching.py,sha256=hnlPIihz8W1TGnfq4anbBGciwg
42
46
  griptape_nodes/common/macro_parser/parsing.py,sha256=_37L3lCQFeetamWIiHT0C7eW1E3Wyx5V8y8OWzIUw_g,7428
43
47
  griptape_nodes/common/macro_parser/resolution.py,sha256=30_bAIRMKWw-kM3E1ne-my16xT1Wd734JMmZSOZtNPA,6937
44
48
  griptape_nodes/common/macro_parser/segments.py,sha256=r-WbZas1nSc-PlEdAZ7DycNoD6IUf3R_nhGo3T9vIa8,1010
45
- griptape_nodes/common/node_executor.py,sha256=zaVCw4BxurjwhVhCA9ujGXw2xzC4-Tkvjo3SFtY0S7Y,147191
49
+ griptape_nodes/common/node_executor.py,sha256=h8f-NabGopj_FHQTDFUTfxEESMNr5K1qUOmOs59y7OE,149641
46
50
  griptape_nodes/common/project_templates/__init__.py,sha256=5DP6Sa6ClsdDcjD30pkK0iTTysTgGdRKEkeY7ztHZyc,1541
47
51
  griptape_nodes/common/project_templates/default_project_template.py,sha256=PJFPfziH0EOGVxU5L0wZnc21bVVweW4S7wcnGPF45Co,3120
48
52
  griptape_nodes/common/project_templates/defaults/README.md,sha256=1ou6_OFi7-t86nj-7tulW1vxNMtsvkJmNxr6SseG8hA,1080
@@ -63,14 +67,14 @@ griptape_nodes/drivers/thread_storage/griptape_cloud_thread_storage_driver.py,sh
63
67
  griptape_nodes/drivers/thread_storage/local_thread_storage_driver.py,sha256=I1p2XudP89sUMsRa0DBxGXzsOFEpURLbtF01C_Wpkts,5406
64
68
  griptape_nodes/drivers/thread_storage/thread_storage_backend.py,sha256=QXLvFOZrFx7aPBmwVGaN-IHxwRAf_sXN7YWKY6tcwgE,204
65
69
  griptape_nodes/exe_types/__init__.py,sha256=wGGwKGX9-TSarUFbXpDvdU_J7eXIbWTBl_NCLOZa-G8,32
66
- griptape_nodes/exe_types/base_iterative_nodes.py,sha256=z2u4Pb9iqy2Zl3gz_LB7k6hmxYyet1Z6sLjF8afPN_0,43810
70
+ griptape_nodes/exe_types/base_iterative_nodes.py,sha256=hwEA0QWh4H2M6g8iuVahI_TUK8nm-A9r3UJS7EtEa28,43794
67
71
  griptape_nodes/exe_types/connections.py,sha256=HcM_fwWivMsXk5q6K7ZBSJpmK9THQwX_xLS_daF0PDQ,21737
68
72
  griptape_nodes/exe_types/core_types.py,sha256=XrMT0Rf0bPZBcx06f1GUTi5G_IwLgdyzGjBKkUwRh3M,101505
69
73
  griptape_nodes/exe_types/flow.py,sha256=2iAh3vN5wnMVxTc5jcPBg9TSiASq1DGIm5jgpO9Bdq4,5732
70
74
  griptape_nodes/exe_types/node_groups/__init__.py,sha256=u91XCSR4OAAr6x5kYq8i14mtHEWGQF_fSDUsWHmiOdY,346
71
75
  griptape_nodes/exe_types/node_groups/base_iterative_node_group.py,sha256=sPPy3Psl-Ku_R46upWm_8hIGFLNPeLpUBN_Sm4RzXzg,9655
72
76
  griptape_nodes/exe_types/node_groups/base_node_group.py,sha256=loDdJKllRPpWSSk-jJpqbBto80yn5oZGc6Jl-VXa_8A,3955
73
- griptape_nodes/exe_types/node_groups/subflow_node_group.py,sha256=UlZS95TKUCWiHgg6z4Wm1t9xXfUjWhk0L8pB5cXMcV0,48361
77
+ griptape_nodes/exe_types/node_groups/subflow_node_group.py,sha256=rTW0Uili0E_a5ho8p9bloNDLUjCUuxwgEgJGXfZ4KUY,49273
74
78
  griptape_nodes/exe_types/node_types.py,sha256=Hrzun9DN4FA-Yk-YQXBFyGrH1-kzszd9eVq4y6rmV5Y,84226
75
79
  griptape_nodes/exe_types/param_components/README.md,sha256=mcNFxJIan9CGTnecsrJ8mkHC55dlA3fb7k4HFznou-k,14850
76
80
  griptape_nodes/exe_types/param_components/__init__.py,sha256=ocm75WnsgiD6ozKVGFhoH9cQe_FEzeF2osxrRujOes0,60
@@ -84,23 +88,24 @@ griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_file_para
84
88
  griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter.py,sha256=zcBRQP0eZJloSdPQwJFw89B6QDHECnrosRZUy8mE2fM,1401
85
89
  griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_variant_parameter.py,sha256=FaaDZ4dvZJCnpqSOKfJ5nR1klgl07JZto2A7gxhUi3o,5290
86
90
  griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py,sha256=cE0Ht81kDcZjlN_2VoRirCA4zMlrG9GFlcptn-gC2tU,4696
87
- griptape_nodes/exe_types/param_components/log_parameter.py,sha256=_v6NH1lz9FrEKf2uMIOlwxzKTy5Vl3EAZai54lAMF1g,4313
91
+ griptape_nodes/exe_types/param_components/log_parameter.py,sha256=aLXwmoD4b5CS-Jlv2W-xnDNr4ufajuoEOFhVUAwVPdc,4261
88
92
  griptape_nodes/exe_types/param_components/progress_bar_component.py,sha256=GrAFTOrLNAx6q9zfOqiioPTG_NLHKhTe9NiZOo6zGSc,1949
89
93
  griptape_nodes/exe_types/param_components/seed_parameter.py,sha256=I48cVAojrD5oX4CT7v0x9LX6MrKVklywkp8IjE5pGIo,2321
94
+ griptape_nodes/exe_types/param_components/subflow_execution_component.py,sha256=NnIIk_0aKMrpa-ricD9_bwMJmghlpwBLO95iACuJNS4,13177
90
95
  griptape_nodes/exe_types/param_types/__init__.py,sha256=xEEmKvIFF6M7zVjQZCupbbv6SZKt-itD-rPtfRhxJVg,53
91
- griptape_nodes/exe_types/param_types/parameter_audio.py,sha256=9oIBtDg6miZDD_5y8VWr6XXjYhsRb9HjSKoaLdgqaHA,9534
96
+ griptape_nodes/exe_types/param_types/parameter_audio.py,sha256=JmctLDsuo8lEOBlDjrHs1be8HUub7IZDa8Rimpng1SE,10330
92
97
  griptape_nodes/exe_types/param_types/parameter_bool.py,sha256=VS76CODOy7_1MJI9spxmi9VwL3fwCxRKaj_8zpqB7dw,8215
93
98
  griptape_nodes/exe_types/param_types/parameter_button.py,sha256=lrFnw4dBRKTSsaMxSVMOwtAV8a-Tcex2Tf58u25qCy8,17292
94
99
  griptape_nodes/exe_types/param_types/parameter_dict.py,sha256=vbgasnkx9U9-h43geRhLjQ60ekhFlLBvuCVT9wHgWdY,6016
95
100
  griptape_nodes/exe_types/param_types/parameter_float.py,sha256=9msvMnmzYGNpqFpGyTT4tswiAlHomo9Y5EiYsydT7IM,6793
96
- griptape_nodes/exe_types/param_types/parameter_image.py,sha256=FeoqQdr1dj0F60WK0pVyNyzYsZCDjt4JiZQn252Oz3I,9433
101
+ griptape_nodes/exe_types/param_types/parameter_image.py,sha256=yV6WAx_2hR4LWZtiqR9Z_xe9jFNdnwg16vZsx-SPGKI,10162
97
102
  griptape_nodes/exe_types/param_types/parameter_int.py,sha256=06h1QpWaWLeP2tlRRW5IOGO-t_ZlxsWqnezlgoyBKaE,6942
98
103
  griptape_nodes/exe_types/param_types/parameter_json.py,sha256=M5A0_XhTKZ8qVBd1db55UA23H3nmaqryaITeN2-GwB0,9961
99
- griptape_nodes/exe_types/param_types/parameter_number.py,sha256=GuQ6jbs8LQByl4UUBhgY_INdCWeNM7qOlDMYC-SZsK8,16012
104
+ griptape_nodes/exe_types/param_types/parameter_number.py,sha256=acmFnpeYI0Gi2yVYmn9ftkruBxR_TpjDrpYi3Kj0vc8,15372
100
105
  griptape_nodes/exe_types/param_types/parameter_range.py,sha256=fkCBN0X09fAfTG9AhKQ3Nxkit_8NrFi4IGQPpmOQR8k,14689
101
106
  griptape_nodes/exe_types/param_types/parameter_string.py,sha256=-Q_9FwPtCXzpbv1C5FixLEET0c9WLJ228168IaSlZEU,9583
102
- griptape_nodes/exe_types/param_types/parameter_three_d.py,sha256=wbUeWJUVPJW5JJrkckzGnTM6SsWPSQNupyHGVoBjrOA,8393
103
- griptape_nodes/exe_types/param_types/parameter_video.py,sha256=_GhpqZwn3kFJIJA7w-oiK2DHFfPW_JosMgUFlWvK6r0,9454
107
+ griptape_nodes/exe_types/param_types/parameter_three_d.py,sha256=xv-uUj9vZPjKNcotJCXm3GYhsIbQLEN7GkTn9G_2jsA,9155
108
+ griptape_nodes/exe_types/param_types/parameter_video.py,sha256=1DkHeW0mEcPYlcTVPN0dq-u33-SzpvyqLJ_ugn2Kj_k,10250
104
109
  griptape_nodes/exe_types/type_validator.py,sha256=RTz1vX09jzQpHhozITMJ0siOZUXvsERDhrApjdaM1WM,1120
105
110
  griptape_nodes/machines/__init__.py,sha256=v0jkwr-CFOLmfEYUQvX8BKQLOdvhSsA6toXkdHcPGUE,30
106
111
  griptape_nodes/machines/control_flow.py,sha256=mmiA7OHXG3Nq36uFPKSGVgqm-ws-T21vzHgvF-um0hg,23007
@@ -208,7 +213,7 @@ griptape_nodes/retained_mode/managers/model_manager.py,sha256=3lj2X8vIvDSERPtR2V
208
213
  griptape_nodes/retained_mode/managers/node_manager.py,sha256=BG0-z2-pDjzgS5VC3u3p7-jGUJ5nGSGSShbSv9WseoA,229244
209
214
  griptape_nodes/retained_mode/managers/object_manager.py,sha256=ZpovmhnBKG_JCn4Pde9idlx2eBZjKvR7k9DHUYqD-r4,12882
210
215
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=4Vn_79vHrawy3wJVUx52tfblO4mURww58nb5RtCTpKU,20190
211
- griptape_nodes/retained_mode/managers/os_manager.py,sha256=Ttgj6R063p2Yf1lcdeSTB2xOTg94MIDCMPxO8FDczEQ,142397
216
+ griptape_nodes/retained_mode/managers/os_manager.py,sha256=0PdV11cjlGfOeqGx0XQl43L-yasdDd4z4sOPvdHhLM4,142434
212
217
  griptape_nodes/retained_mode/managers/project_manager.py,sha256=-K-anrxEVKInFMPLY-cV3ipqEh8hMELGHKbecJJJVa8,49035
213
218
  griptape_nodes/retained_mode/managers/resource_components/__init__.py,sha256=2FHpZFw2N1-oHfMCfrnB_XpF8_-2aSNtAZWh5zQTGL0,35
214
219
  griptape_nodes/retained_mode/managers/resource_components/capability_field.py,sha256=jZ5ONfdYVd5_MKlSKvUch1X2n1oHzMSeZW8UZ1a_RsU,1504
@@ -239,7 +244,7 @@ griptape_nodes/servers/static.py,sha256=R0nnMUCRDE0BxygZ-kdxhROAXgJPsIJBAEp7H_sJ
239
244
  griptape_nodes/traits/__init__.py,sha256=bTLXTiZTJz2z15RRLoPI4nvLnNW9FiLcKL_2pT4E10g,32
240
245
  griptape_nodes/traits/add_param_button.py,sha256=27RZDVLMD0HmRF6hjfz7iV7LBau92vMc_d2eD2Ey8fA,649
241
246
  griptape_nodes/traits/button.py,sha256=Nweq5oGdPpSTfyX3Dr2mjgBYwLUrokxtergnOCTiPpU,15962
242
- griptape_nodes/traits/clamp.py,sha256=hBteNZ4CF4k-5zkWDJnnkWQxOnB0G9_BEa9YwWEgdII,2780
247
+ griptape_nodes/traits/clamp.py,sha256=BZVHiWfBNePWaPMaLyOgtcWzkM7Ls4hcPlm_afmGiIs,1030
243
248
  griptape_nodes/traits/color_picker.py,sha256=ySKaoZw319yfuTSEtkVT2vSR6Goy9pBm4rusjx95F0c,3024
244
249
  griptape_nodes/traits/compare.py,sha256=X-BXGemRDxQV4EX8X24LdtcwMWwfQ1jGqDvH2bSiSuc,521
245
250
  griptape_nodes/traits/compare_images.py,sha256=KW0WlwsJP6nBoC1irdeRnUWUnZIJvlROlDhyWhX8iEs,1594
@@ -254,12 +259,13 @@ griptape_nodes/traits/traits.json,sha256=JwFsOaFfLeR1ohcyh6XApc5N2-mWMPGSaYbpA-m
254
259
  griptape_nodes/updater/__init__.py,sha256=ZTVr-zI4Jf-cFAXU3nX9L7oTCFFWsjlrkHQiZidDhB0,2570
255
260
  griptape_nodes/updater/__main__.py,sha256=lhMMctbBeni57ximitvkwqJ1TQzk79Jg9w0rkKjtp5Y,79
256
261
  griptape_nodes/utils/__init__.py,sha256=kzDZW_VPyxWJFonM3kYTl7A91_JmtHPK0Io4KPLTYT4,122
262
+ griptape_nodes/utils/artifact_normalization.py,sha256=BofLyLnOaNCofAkeXSOhwV6BfBOjHH3C1cKglXOwAew,9157
257
263
  griptape_nodes/utils/async_utils.py,sha256=4IrW8Ub8iJ2QB9yguZtfN1EB9B5nXHS7jbDaLOHWso0,4844
258
264
  griptape_nodes/utils/dict_utils.py,sha256=1VP2EoyOP0nswoAgjPehpA0izpkygWRX7L--ArN6LV8,7314
259
265
  griptape_nodes/utils/file_utils.py,sha256=D7VBkYl2MI0GUHdvI3IDB-fRN2XTp4xDpANnUcnEVvY,5524
260
266
  griptape_nodes/utils/git_utils.py,sha256=Gz55JqSFPuxbTzvnXHKHsbMy3PvkNDAYyMQ7szekcL0,45674
261
267
  griptape_nodes/utils/huggingface_utils.py,sha256=txR5XS_01W3TvsH4SQ3AJrFy8oS8Ah9M-ePRSs3jHYA,4737
262
- griptape_nodes/utils/image_preview.py,sha256=NhYIqohRF9vbFpWIEvZHdPLLPK_JdUBvC4RvNAsSa1w,4480
268
+ griptape_nodes/utils/image_preview.py,sha256=0lNBWAm4-bNAqpiD5AWeeIE3-5sdc26SX_sIcFuhU5w,6106
263
269
  griptape_nodes/utils/library_utils.py,sha256=UwTdOJcPwJljWYD-DbctjExicaw-6isXZ-Js02jrGCw,4224
264
270
  griptape_nodes/utils/metaclasses.py,sha256=RSKyAvZppH_hbMugmUmIr8QqOg1sYY4uRNfQybD4O8Q,287
265
271
  griptape_nodes/utils/uv_utils.py,sha256=ZK37LmacKfxMVKkcIOyJ35HOXgV6sFWE9CzgKPmaRU0,519
@@ -276,7 +282,7 @@ griptape_nodes/version_compatibility/versions/v0_65_5/__init__.py,sha256=4UyspOV
276
282
  griptape_nodes/version_compatibility/versions/v0_65_5/flux_2_removed_parameters.py,sha256=jOlmY5kKHXh8HPzAUtvwMJqzD4bP7pkE--yHUb7jTRA,3305
277
283
  griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
278
284
  griptape_nodes/version_compatibility/versions/v0_7_0/local_executor_argument_addition.py,sha256=Thx8acnbw5OychhwEEj9aFxvbPe7Wgn4V9ZmZ7KRZqc,2082
279
- griptape_nodes-0.70.1.dist-info/WHEEL,sha256=e_m4S054HL0hyR3CpOk-b7Q7fDX6BuFkgL5OjAExXas,80
280
- griptape_nodes-0.70.1.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
281
- griptape_nodes-0.70.1.dist-info/METADATA,sha256=VBszlO8g-vdr1HhL7NWUBo6_AF9Q5qh0rThNdfxtA1g,5373
282
- griptape_nodes-0.70.1.dist-info/RECORD,,
285
+ griptape_nodes-0.71.0.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
286
+ griptape_nodes-0.71.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
287
+ griptape_nodes-0.71.0.dist-info/METADATA,sha256=UIMyQPSauCEqiFVzr6fRyRF1XMIYVCqDgY-Iv4L76GE,5373
288
+ griptape_nodes-0.71.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.27
2
+ Generator: uv 0.9.26
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any