griptape-nodes 0.63.0__py3-none-any.whl → 0.63.1__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.
@@ -239,19 +239,36 @@ def _format_download_row(download: "ModelDownloadStatus") -> tuple[str, str, str
239
239
 
240
240
  def _format_progress(download: "ModelDownloadStatus") -> str:
241
241
  """Format download progress information."""
242
- if download.total_files is not None and download.completed_files is not None and download.total_files > 0:
243
- progress_percent = (download.completed_files / download.total_files) * 100
242
+ if download.total_bytes is not None and download.completed_bytes is not None and download.total_bytes > 0:
243
+ progress_percent = (download.completed_bytes / download.total_bytes) * 100
244
244
  return f"{progress_percent:.1f}%"
245
245
  return "Unknown"
246
246
 
247
247
 
248
248
  def _format_size(download: "ModelDownloadStatus") -> str:
249
249
  """Format download size information."""
250
- if download.total_files is not None and download.completed_files is not None:
251
- return f"{download.completed_files}/{download.total_files} files"
250
+ if download.total_bytes is not None and download.completed_bytes is not None:
251
+ return f"{_format_bytes(download.completed_bytes)}/{_format_bytes(download.total_bytes)}"
252
252
  return "Unknown"
253
253
 
254
254
 
255
+ def _format_bytes(num_bytes: int) -> str:
256
+ """Format bytes to human-readable string."""
257
+ if num_bytes == 0:
258
+ return "0 B"
259
+
260
+ bytes_per_unit = 1024.0
261
+ units = ["B", "KB", "MB", "GB", "TB"]
262
+ unit_index = 0
263
+ size = float(num_bytes)
264
+
265
+ while size >= bytes_per_unit and unit_index < len(units) - 1:
266
+ size /= bytes_per_unit
267
+ unit_index += 1
268
+
269
+ return f"{size:.2f} {units[unit_index]}"
270
+
271
+
255
272
  def _format_eta(download: "ModelDownloadStatus") -> str:
256
273
  """Format estimated time of arrival."""
257
274
  # ETA is not available in the current ModelDownloadStatus structure
@@ -171,15 +171,15 @@ class ListModelDownloadsRequest(RequestPayload):
171
171
 
172
172
  @dataclass
173
173
  class ModelDownloadStatus:
174
- """Model download status tracking multiple files."""
174
+ """Model download status tracking byte-level progress."""
175
175
 
176
176
  model_id: str
177
177
  status: str # "downloading", "completed", "failed"
178
178
  started_at: str
179
179
  updated_at: str
180
- total_files: int | None = None
181
- completed_files: int | None = None
182
- failed_files: int | None = None
180
+ total_bytes: int | None = None
181
+ completed_bytes: int | None = None
182
+ failed_bytes: int | None = None
183
183
  # Optional fields for completed downloads
184
184
  completed_at: str | None = None
185
185
  local_path: str | None = None
@@ -9,7 +9,7 @@ import threading
9
9
  from dataclasses import dataclass
10
10
  from datetime import UTC, datetime
11
11
  from pathlib import Path
12
- from typing import TYPE_CHECKING, Any
12
+ from typing import TYPE_CHECKING
13
13
  from urllib.parse import urlparse
14
14
 
15
15
  from huggingface_hub import list_models, scan_cache_dir, snapshot_download
@@ -76,144 +76,186 @@ class DownloadParams:
76
76
  ignore_patterns: list[str] | None = None
77
77
 
78
78
 
79
- class ModelDownloadTracker(tqdm):
80
- """Custom tqdm progress bar that tracks aggregate model download progress."""
79
+ def _create_progress_tracker(model_id: str) -> type[tqdm]: # noqa: C901
80
+ """Create a tqdm class with model_id pre-configured.
81
81
 
82
- _file_lock = threading.Lock()
83
- _current_model_id = ""
82
+ Args:
83
+ model_id: The model ID to track progress for
84
84
 
85
- @classmethod
86
- def set_current_model_id(cls, model_id: str) -> None:
87
- """Set the current model being downloaded."""
88
- cls._current_model_id = model_id
85
+ Returns:
86
+ A tqdm class that will track progress for the given model
87
+ """
88
+ logger.info("Creating progress tracker for model: %s", model_id)
89
89
 
90
- def __init__(self, *args, model_id: str = "", **kwargs):
91
- if not model_id and self._current_model_id:
92
- model_id = self._current_model_id
90
+ class BoundModelDownloadTracker(tqdm):
91
+ """Tqdm subclass bound to a specific model_id."""
93
92
 
94
- super().__init__(*args, **kwargs)
95
- self.model_id = model_id
96
- self.start_time = datetime.now(UTC).isoformat()
93
+ _file_lock = threading.Lock()
94
+ _first_update = True
97
95
 
98
- logger.debug(
99
- "ModelDownloadTracker created - model_id: %s, total: %s, desc: %s, args: %s",
100
- self.model_id,
101
- self.total,
102
- getattr(self, "desc", None),
103
- args,
104
- )
96
+ def __init__(self, *args, **kwargs) -> None:
97
+ super().__init__(*args, **kwargs)
98
+ self.model_id = model_id
99
+ self.start_time = datetime.now(UTC).isoformat()
100
+ self._cumulative_bytes = 0
105
101
 
106
- if self.model_id:
107
- self._init_status_file()
108
-
109
- def update(self, n: int = 1) -> None:
110
- """Override update to track progress in status file."""
111
- logger.debug(
112
- "ModelDownloadTracker update - model_id: %s, n: %s, self.n: %s, total: %s",
113
- self.model_id,
114
- n,
115
- self.n,
116
- self.total,
117
- )
118
- super().update(n)
119
- self._update_status_file()
120
-
121
- def close(self) -> None:
122
- """Override close to log download completion."""
123
- super().close()
124
- self._update_status_file() # Write final state to status file
125
- logger.debug(
126
- "ModelDownloadTracker close - model_id: %s, self.n: %s, total: %s", self.model_id, self.n, self.total
127
- )
102
+ # Check if this is a byte-level progress bar or file enumeration bar
103
+ unit = getattr(self, "unit", "")
104
+ desc = getattr(self, "desc", "")
128
105
 
129
- def _get_status_file_path(self) -> Path:
130
- """Get the path to the status file for this model."""
131
- status_dir = xdg_data_home() / "griptape_nodes" / "model_downloads"
132
- status_dir.mkdir(parents=True, exist_ok=True)
133
-
134
- sanitized_model_id = re.sub(r"[^\w\-_]", "--", self.model_id)
135
- return status_dir / f"{sanitized_model_id}.json"
136
-
137
- def _init_status_file(self) -> None:
138
- """Initialize the status file for this model."""
139
- try:
140
- with self._file_lock:
141
- status_file = self._get_status_file_path()
142
- current_time = datetime.now(UTC).isoformat()
106
+ # Skip file enumeration bars (unit='it', desc='Fetching N files')
107
+ # We only want to track byte-level download progress
108
+ self._should_track = not (unit == "it" and "Fetching" in str(desc))
143
109
 
110
+ if not self._should_track:
144
111
  logger.debug(
145
- "ModelDownloadTracker initializing status file: %s (total_files=%s)", status_file, self.total
112
+ "ModelDownloadTracker skipping file enumeration bar - model_id: %s, desc: '%s'",
113
+ self.model_id,
114
+ desc,
146
115
  )
116
+ return
147
117
 
148
- data = {
149
- "model_id": self.model_id,
150
- "status": "downloading",
151
- "started_at": current_time,
152
- "updated_at": current_time,
153
- "total_files": self.total or 0,
154
- "downloaded_files": 0,
155
- "progress_percent": 0.0,
156
- }
157
-
158
- with status_file.open("w") as f:
159
- json.dump(data, f, indent=2)
118
+ logger.debug(
119
+ "ModelDownloadTracker instantiated for tracking - model_id: %s, total: %s, unit: %s, desc: '%s'",
120
+ self.model_id,
121
+ self.total,
122
+ unit,
123
+ desc,
124
+ )
160
125
 
161
- logger.debug("ModelDownloadTracker status file initialized successfully")
126
+ if self.model_id:
127
+ self._init_status_file()
162
128
 
163
- except Exception:
164
- logger.exception("ModelDownloadTracker._init_status_file failed")
129
+ def update(self, n: int = 1) -> None:
130
+ """Override update to track progress in status file."""
131
+ super().update(n)
132
+ self._cumulative_bytes += n
165
133
 
166
- def _update_status_file(self) -> None:
167
- """Update the status file with current progress."""
168
- if not self.model_id:
169
- logger.warning("ModelDownloadTracker._update_status_file called with empty model_id")
170
- return
134
+ # Skip if not tracking this progress bar
135
+ if not getattr(self, "_should_track", True):
136
+ return
171
137
 
172
- try:
173
- with self._file_lock:
174
- status_file = self._get_status_file_path()
175
- logger.info("ModelDownloadTracker updating status file: %s", status_file)
138
+ if self._first_update:
139
+ logger.debug("ModelDownloadTracker received first update for model: %s", self.model_id)
140
+ self._first_update = False
141
+
142
+ logger.debug(
143
+ "ModelDownloadTracker update - model_id: %s, added: %s, now: %s/%s (%.1f%%)",
144
+ self.model_id,
145
+ n,
146
+ self._cumulative_bytes,
147
+ self.total,
148
+ (self._cumulative_bytes / self.total * 100) if self.total else 0,
149
+ )
150
+ self._update_status_file(mark_completed=False)
176
151
 
177
- if not status_file.exists():
178
- logger.warning("Status file does not exist: %s", status_file)
179
- return
152
+ def close(self) -> None:
153
+ """Override close to mark download as completed only if fully downloaded."""
154
+ super().close()
180
155
 
181
- with status_file.open() as f:
182
- data = json.load(f)
156
+ # Skip if not tracking this progress bar
157
+ if not getattr(self, "_should_track", True):
158
+ return
183
159
 
184
- current_time = datetime.now(UTC).isoformat()
185
- progress_percent = (self.n / self.total * 100) if self.total else 0
160
+ # Only mark as completed if we actually downloaded everything
161
+ is_complete = self.total > 0 and self._cumulative_bytes >= self.total
186
162
 
163
+ if is_complete:
187
164
  logger.info(
188
- "ModelDownloadTracker updating progress: files=%d/%d, percent=%.1f%%",
189
- self.n,
165
+ "ModelDownloadTracker closed - model_id: %s, downloaded: %s/%s bytes (COMPLETE)",
166
+ self.model_id,
167
+ self._cumulative_bytes,
168
+ self.total,
169
+ )
170
+ self._update_status_file(mark_completed=True)
171
+ else:
172
+ logger.warning(
173
+ "ModelDownloadTracker closed prematurely - model_id: %s, downloaded: %s/%s bytes (%.1f%%)",
174
+ self.model_id,
175
+ self._cumulative_bytes,
190
176
  self.total,
191
- progress_percent,
177
+ (self._cumulative_bytes / self.total * 100) if self.total else 0,
192
178
  )
179
+ # Don't mark as completed - leave status as "downloading" or "failed"
180
+ self._update_status_file(mark_completed=False)
193
181
 
194
- # Check if download is complete
195
- is_complete = self.total > 0 and self.n >= self.total
182
+ def _get_status_file_path(self) -> Path:
183
+ """Get the path to the status file for this model."""
184
+ status_dir = xdg_data_home() / "griptape_nodes" / "model_downloads"
185
+ status_dir.mkdir(parents=True, exist_ok=True)
196
186
 
197
- update_data = {
198
- "downloaded_files": self.n,
199
- "progress_percent": progress_percent,
200
- "updated_at": current_time,
201
- }
187
+ sanitized_model_id = re.sub(r"[^\w\-_]", "--", self.model_id)
188
+ return status_dir / f"{sanitized_model_id}.json"
189
+
190
+ def _init_status_file(self) -> None:
191
+ """Initialize the status file for this model."""
192
+ try:
193
+ with self._file_lock:
194
+ status_file = self._get_status_file_path()
195
+ current_time = datetime.now(UTC).isoformat()
196
+
197
+ data = {
198
+ "model_id": self.model_id,
199
+ "status": "downloading",
200
+ "started_at": current_time,
201
+ "updated_at": current_time,
202
+ "total_bytes": self.total or 0,
203
+ "downloaded_bytes": 0,
204
+ "progress_percent": 0.0,
205
+ }
206
+
207
+ with status_file.open("w") as f:
208
+ json.dump(data, f, indent=2)
209
+
210
+ except Exception:
211
+ logger.exception("ModelDownloadTracker._init_status_file failed")
212
+
213
+ def _update_status_file(self, *, mark_completed: bool = False) -> None:
214
+ """Update the status file with current progress.
215
+
216
+ Args:
217
+ mark_completed: If True, mark the download as completed
218
+ """
219
+ if not self.model_id:
220
+ logger.warning("ModelDownloadTracker._update_status_file called with empty model_id")
221
+ return
202
222
 
203
- # Update status to completed if all files are downloaded
204
- if is_complete:
205
- update_data["status"] = "completed"
206
- update_data["completed_at"] = current_time
223
+ try:
224
+ with self._file_lock:
225
+ status_file = self._get_status_file_path()
207
226
 
208
- data.update(update_data)
227
+ if not status_file.exists():
228
+ logger.warning("Status file does not exist: %s", status_file)
229
+ return
209
230
 
210
- with status_file.open("w") as f:
211
- json.dump(data, f, indent=2)
231
+ with status_file.open() as f:
232
+ data = json.load(f)
212
233
 
213
- logger.debug("ModelDownloadTracker status file updated successfully")
234
+ current_time = datetime.now(UTC).isoformat()
235
+ progress_percent = (self._cumulative_bytes / self.total * 100) if self.total else 0
214
236
 
215
- except Exception:
216
- logger.exception("ModelDownloadTracker._update_status_file failed")
237
+ # Always update total_bytes since it grows during aggregated downloads
238
+ update_data = {
239
+ "total_bytes": self.total or 0,
240
+ "downloaded_bytes": self._cumulative_bytes,
241
+ "progress_percent": progress_percent,
242
+ "updated_at": current_time,
243
+ }
244
+
245
+ # Only mark as completed when explicitly requested (from close())
246
+ if mark_completed:
247
+ update_data["status"] = "completed"
248
+ update_data["completed_at"] = current_time
249
+
250
+ data.update(update_data)
251
+
252
+ with status_file.open("w") as f:
253
+ json.dump(data, f, indent=2)
254
+
255
+ except Exception:
256
+ logger.exception("ModelDownloadTracker._update_status_file failed")
257
+
258
+ return BoundModelDownloadTracker
217
259
 
218
260
 
219
261
  class ModelManager:
@@ -258,7 +300,8 @@ class ModelManager:
258
300
  """Direct model download method that can be used without event system.
259
301
 
260
302
  This method contains the core download logic without going through
261
- the event system, avoiding recursion issues.
303
+ the event system, avoiding recursion issues. It leverages huggingface_hub v1.1.0+
304
+ aggregated tqdm for clean progress tracking across parallel downloads.
262
305
 
263
306
  Args:
264
307
  model_id: Model ID to download
@@ -273,34 +316,28 @@ class ModelManager:
273
316
  Raises:
274
317
  Exception: If download fails
275
318
  """
276
- # Set up progress tracking
277
- ModelDownloadTracker.set_current_model_id(model_id)
278
-
279
- try:
280
- # Build download kwargs
281
- download_kwargs = {
282
- "repo_id": model_id,
283
- "repo_type": "model",
284
- "revision": revision,
285
- "tqdm_class": ModelDownloadTracker,
286
- }
319
+ # Build download kwargs with progress tracking
320
+ download_kwargs = {
321
+ "repo_id": model_id,
322
+ "repo_type": "model",
323
+ "revision": revision,
324
+ "tqdm_class": _create_progress_tracker(model_id),
325
+ }
287
326
 
288
- # Add optional parameters
289
- if local_dir:
290
- download_kwargs["local_dir"] = local_dir
291
- if allow_patterns:
292
- download_kwargs["allow_patterns"] = allow_patterns
293
- if ignore_patterns:
294
- download_kwargs["ignore_patterns"] = ignore_patterns
327
+ # Add optional parameters
328
+ if local_dir:
329
+ download_kwargs["local_dir"] = local_dir
330
+ if allow_patterns:
331
+ download_kwargs["allow_patterns"] = allow_patterns
332
+ if ignore_patterns:
333
+ download_kwargs["ignore_patterns"] = ignore_patterns
295
334
 
296
- # Execute download with progress tracking
297
- local_path = snapshot_download(**download_kwargs) # type: ignore[arg-type]
335
+ logger.info("Calling snapshot_download with custom tqdm_class for model: %s", model_id)
298
336
 
299
- return str(local_path)
337
+ # Execute download with progress tracking
338
+ local_path = snapshot_download(**download_kwargs) # type: ignore[arg-type]
300
339
 
301
- finally:
302
- # Clear the current model ID when done
303
- ModelDownloadTracker.set_current_model_id("")
340
+ return str(local_path)
304
341
 
305
342
  def _get_status_directory(self) -> Path:
306
343
  """Get the status directory path for model downloads.
@@ -407,9 +444,6 @@ class ModelManager:
407
444
  Args:
408
445
  download_params: Download parameters
409
446
 
410
- Returns:
411
- str: Local path where the model was downloaded
412
-
413
447
  Raises:
414
448
  Exception: If download fails
415
449
  """
@@ -726,23 +760,23 @@ class ModelManager:
726
760
  with status_file.open() as f:
727
761
  data = json.load(f)
728
762
 
729
- # Get file counts from simplified structure
730
- total_files = data.get("total_files", 0)
731
- downloaded_files = data.get("downloaded_files", 0)
763
+ # Get byte counts from status file
764
+ total_bytes = data.get("total_bytes", 0)
765
+ downloaded_bytes = data.get("downloaded_bytes", 0)
732
766
 
733
- # For simplified tracking, failed_files is calculated
734
- failed_files = 0
767
+ # For simplified tracking, failed_bytes is calculated
768
+ failed_bytes = 0
735
769
  if data.get("status") == "failed":
736
- failed_files = total_files - downloaded_files
770
+ failed_bytes = total_bytes - downloaded_bytes
737
771
 
738
772
  return ModelDownloadStatus(
739
773
  model_id=data["model_id"],
740
774
  status=data["status"],
741
775
  started_at=data["started_at"],
742
776
  updated_at=data["updated_at"],
743
- total_files=total_files,
744
- completed_files=downloaded_files,
745
- failed_files=failed_files,
777
+ total_bytes=total_bytes,
778
+ completed_bytes=downloaded_bytes,
779
+ failed_bytes=failed_bytes,
746
780
  completed_at=data.get("completed_at"),
747
781
  local_path=data.get("local_path"),
748
782
  failed_at=data.get("failed_at"),
@@ -955,64 +989,6 @@ class ModelManager:
955
989
  # If we can't parse the directory, skip it
956
990
  return None
957
991
 
958
- def _download_model(self, download_params: dict[str, str | list[str] | None]) -> Path:
959
- """Model download implementation.
960
-
961
- Args:
962
- download_params: Dictionary containing download parameters
963
-
964
- Returns:
965
- Path: Local path where the model was downloaded
966
- """
967
- # Validate parameters and build download kwargs
968
- download_kwargs = self._build_download_kwargs(download_params)
969
-
970
- # Set the current model ID for progress tracking
971
- model_id = download_params["model_id"]
972
- if isinstance(model_id, str):
973
- ModelDownloadTracker.set_current_model_id(model_id)
974
-
975
- # Execute download with progress tracking
976
- local_path = snapshot_download(**download_kwargs) # type: ignore[arg-type]
977
-
978
- # Clear the current model ID when done
979
- ModelDownloadTracker.set_current_model_id("")
980
-
981
- return Path(local_path)
982
-
983
- def _build_download_kwargs(self, download_params: dict[str, str | list[str] | None]) -> dict:
984
- """Build kwargs for snapshot_download with validation.
985
-
986
- Args:
987
- download_params: Dictionary containing download parameters
988
-
989
- Returns:
990
- dict: Validated download kwargs for snapshot_download
991
- """
992
- param_model_id = download_params["model_id"]
993
- local_dir = download_params["local_dir"]
994
- revision = download_params["revision"]
995
- allow_patterns = download_params["allow_patterns"]
996
- ignore_patterns = download_params["ignore_patterns"]
997
-
998
- # Build base kwargs with custom progress tracking
999
- download_kwargs: dict[str, Any] = {
1000
- "repo_id": param_model_id,
1001
- "repo_type": "model",
1002
- "revision": revision,
1003
- "tqdm_class": ModelDownloadTracker,
1004
- }
1005
-
1006
- # Add optional parameters
1007
- if local_dir is not None and isinstance(local_dir, str):
1008
- download_kwargs["local_dir"] = local_dir
1009
- if allow_patterns is not None and isinstance(allow_patterns, list):
1010
- download_kwargs["allow_patterns"] = allow_patterns
1011
- if ignore_patterns is not None and isinstance(ignore_patterns, list):
1012
- download_kwargs["ignore_patterns"] = ignore_patterns
1013
-
1014
- return download_kwargs
1015
-
1016
992
  def _parse_model_id(self, model_input: str) -> str:
1017
993
  """Parse model ID from either a direct model ID or a Hugging Face URL.
1018
994
 
@@ -1086,6 +1062,7 @@ class ModelManager:
1086
1062
  await cancel_subprocess(process, f"download process for model '{model_id}'")
1087
1063
  del self._download_processes[model_id]
1088
1064
 
1065
+ # Cancel active download task if it exists
1089
1066
  if model_id in self._download_tasks:
1090
1067
  task = self._download_tasks[model_id]
1091
1068
  if not task.done():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.63.0
3
+ Version: 0.63.1
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.12
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -20,7 +20,7 @@ Requires-Dist: binaryornot>=0.4.4
20
20
  Requires-Dist: pillow>=11.3.0
21
21
  Requires-Dist: watchfiles>=1.1.0
22
22
  Requires-Dist: typer>=0.15.0
23
- Requires-Dist: huggingface-hub>=1.0.1
23
+ Requires-Dist: huggingface-hub>=1.1.0
24
24
  Requires-Dist: rich>=14.1.0
25
25
  Requires-Dist: semver>=3.0.4
26
26
  Requires-Dist: aiofiles>=25.1.0
@@ -28,7 +28,7 @@ griptape_nodes/cli/commands/config.py,sha256=zh5rs2vCY_x9dEUK2jtQQJGcjlJzhpJJ-Eg
28
28
  griptape_nodes/cli/commands/engine.py,sha256=PWcjuhG_q6wnX1dZY1RJKvQQLO4CmMFBGyhOUKYOofE,2484
29
29
  griptape_nodes/cli/commands/init.py,sha256=JCI5dxvmPfeOiby33LXiEuLVtMGZlmpTGfpuE-a3FUo,27643
30
30
  griptape_nodes/cli/commands/libraries.py,sha256=Iz5pVKnlOYk_YCF5axfOaDnLmjaBOOUiraq3CW3ovMg,4191
31
- griptape_nodes/cli/commands/models.py,sha256=txbozCLF_Hvj4q9g0P8gAi0ZfIFcL95Ad9QS_PfHiHY,17612
31
+ griptape_nodes/cli/commands/models.py,sha256=367gCuzDiRf9xJkSutjJYO7Rm5daN3lgOP72Np4cAws,18059
32
32
  griptape_nodes/cli/commands/self.py,sha256=aafOn1ThMxoRu2OvwqxAu0BuM_3vfB7e8_dOWeUpNZI,4021
33
33
  griptape_nodes/cli/main.py,sha256=A9k-4vdxOrm3Z0NNtDWLmvSW5ecvtIXInLR0zn2AERA,1739
34
34
  griptape_nodes/cli/shared.py,sha256=ciuqFxls18HXxNOaqK6QObmb3i7OLbw_DkUxX2g0rL0,2656
@@ -115,7 +115,7 @@ griptape_nodes/retained_mode/events/generate_request_payload_schemas.py,sha256=P
115
115
  griptape_nodes/retained_mode/events/library_events.py,sha256=66RPGhJSe9kmZVcNkuwFqglV4OjJ2qL91oGiUUvT_LA,18801
116
116
  griptape_nodes/retained_mode/events/logger_events.py,sha256=jYlxzPomgCsJuPtJ0znWBhD8QJfC8qC4xfChDiuVuyg,705
117
117
  griptape_nodes/retained_mode/events/mcp_events.py,sha256=51OlMZVcabdcIxBb_ojvrHtq2jAzZA31pooPBKaApyg,10734
118
- griptape_nodes/retained_mode/events/model_events.py,sha256=EbSjIpJrQi2RuRRFJsoioAyMchAba-vEOXvLBCR0xi0,9227
118
+ griptape_nodes/retained_mode/events/model_events.py,sha256=jXm-v-_Uxysn4MJ7a80_uIphrxTHgua3BGgHGyy3T_Y,9232
119
119
  griptape_nodes/retained_mode/events/node_events.py,sha256=pIFR6Pqnazajaf0_vRPdKs3uzItXjq-4IuSW-Qkc4_c,33294
120
120
  griptape_nodes/retained_mode/events/object_events.py,sha256=cJaqEU73Lzf1RRxJrFqEpl8eTr-gDhKpXKywJ-vVCJQ,2631
121
121
  griptape_nodes/retained_mode/events/os_events.py,sha256=LbfLZZjZJoOakMTxbsd_8kjlhY5KiPZMCuT9Wg99hsk,19153
@@ -200,7 +200,7 @@ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sh
200
200
  griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=K3UEBzAdCY9wphyBbLxDYP0Q43aYvhLZ_Pz7_SzcPec,443
201
201
  griptape_nodes/retained_mode/managers/library_manager.py,sha256=gSVn-Bge5-kXoSVvKz4E8C5h-52Efc6Wbvc6FLH0aLo,108170
202
202
  griptape_nodes/retained_mode/managers/mcp_manager.py,sha256=Ezmn5_48r4JWYe-tFGqmw9dXLvvTiO1rw9b4MNCkw0U,15955
203
- griptape_nodes/retained_mode/managers/model_manager.py,sha256=Qc_FiqIJQ_ZuL5Yb7WiHCgUngKlbbJ_dUo7E5Ten5_g,45036
203
+ griptape_nodes/retained_mode/managers/model_manager.py,sha256=0JQUHrPsanU7-GxXM4mWG5XHkeA3GTLNf_guykyswgs,44810
204
204
  griptape_nodes/retained_mode/managers/node_manager.py,sha256=7LQF3pWpTsGnQlgDu-CCeAmMk4E2VC-Ti-HiUELCkjE,196136
205
205
  griptape_nodes/retained_mode/managers/object_manager.py,sha256=w6T5UPUJRcYF90F1MuWhZVDgRrMc1uQ-6wt84Oz8OQA,12827
206
206
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=lTkMZlaacTgtV5oV-YF6HG8xsx9V_LwX1eg074WTs2k,20137
@@ -263,7 +263,7 @@ griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_re
263
263
  griptape_nodes/version_compatibility/workflow_versions/__init__.py,sha256=z5XDgkizoNByCXpyo34hfsJKFsWlOHbD6hgzfYH9ubc,52
264
264
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
265
265
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py,sha256=Thx8acnbw5OychhwEEj9aFxvbPe7Wgn4V9ZmZ7KRZqc,2082
266
- griptape_nodes-0.63.0.dist-info/WHEEL,sha256=DpNsHFUm_gffZe1FgzmqwuqiuPC6Y-uBCzibcJcdupM,78
267
- griptape_nodes-0.63.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
268
- griptape_nodes-0.63.0.dist-info/METADATA,sha256=NggYefh2QsZO5LoHabGuQoCLlsV-6mHiEha_RokIfKA,5208
269
- griptape_nodes-0.63.0.dist-info/RECORD,,
266
+ griptape_nodes-0.63.1.dist-info/WHEEL,sha256=DpNsHFUm_gffZe1FgzmqwuqiuPC6Y-uBCzibcJcdupM,78
267
+ griptape_nodes-0.63.1.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
268
+ griptape_nodes-0.63.1.dist-info/METADATA,sha256=Sp4QfVsWJJ-C7zIdLa47mRMBb7i8wXycfaDv6gOEx3k,5208
269
+ griptape_nodes-0.63.1.dist-info/RECORD,,