|
1 | 1 | from io import BytesIO |
2 | 2 | from typing import Any |
3 | 3 |
|
4 | | -import httpx |
5 | 4 | from griptape.artifacts import ImageUrlArtifact |
6 | 5 | from griptape_nodes.exe_types.core_types import ParameterMode |
7 | 6 | from griptape_nodes.exe_types.node_types import SuccessFailureNode |
| 7 | +from griptape_nodes.exe_types.param_components.project_file_parameter import ProjectFileParameter |
8 | 8 | from griptape_nodes.exe_types.param_types.parameter_image import ParameterImage |
9 | 9 | from griptape_nodes.exe_types.param_types.parameter_int import ParameterInt |
10 | 10 | from griptape_nodes.exe_types.param_types.parameter_string import ParameterString |
11 | | -from griptape_nodes.retained_mode.events.static_file_events import ( |
12 | | - CreateStaticFileDownloadUrlRequest, |
13 | | - CreateStaticFileDownloadUrlResultFailure, |
14 | | - CreateStaticFileDownloadUrlResultSuccess, |
15 | | - CreateStaticFileUploadUrlRequest, |
16 | | - CreateStaticFileUploadUrlResultFailure, |
17 | | - CreateStaticFileUploadUrlResultSuccess, |
18 | | -) |
19 | | -from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes, logger |
| 11 | +from griptape_nodes.retained_mode.griptape_nodes import logger |
20 | 12 | from griptape_nodes.traits.color_picker import ColorPicker |
21 | 13 | from PIL import Image, ImageDraw, ImageFont |
22 | 14 |
|
23 | 15 | from griptape_nodes_library.utils.color_utils import parse_color_to_rgba |
24 | | -from griptape_nodes_library.utils.file_utils import generate_filename |
25 | 16 |
|
26 | 17 | # Constants |
27 | 18 | TEXT_PREVIEW_LENGTH = 50 |
@@ -103,6 +94,13 @@ def __init__(self, name: str, metadata: dict[Any, Any] | None = None) -> None: |
103 | 94 | ) |
104 | 95 | ) |
105 | 96 |
|
| 97 | + self._output_file = ProjectFileParameter( |
| 98 | + node=self, |
| 99 | + name="output_file", |
| 100 | + default_filename="text_image.png", |
| 101 | + ) |
| 102 | + self._output_file.add_parameter() |
| 103 | + |
106 | 104 | # Add status parameters using the helper method |
107 | 105 | self._create_status_parameters( |
108 | 106 | result_details_tooltip="Details about the text-to-image operation result", |
@@ -267,56 +265,12 @@ def _set_failure_output_values(self) -> None: |
267 | 265 | self.parameter_output_values["image"] = None |
268 | 266 |
|
269 | 267 | def _upload_image_to_static_storage(self, image: Image.Image) -> ImageUrlArtifact: |
270 | | - """Upload PIL Image to static storage and return ImageUrlArtifact.""" |
| 268 | + """Save PIL Image to project file storage and return ImageUrlArtifact.""" |
271 | 269 | # Convert PIL Image to PNG bytes in memory |
272 | 270 | img_bytes = BytesIO() |
273 | 271 | image.save(img_bytes, format="PNG") |
274 | 272 | img_data = img_bytes.getvalue() |
275 | 273 |
|
276 | | - # Generate filename |
277 | | - filename = generate_filename( |
278 | | - node_name=self.name, |
279 | | - suffix="_text_image", |
280 | | - extension="png", |
281 | | - ) |
282 | | - |
283 | | - # Create upload URL request |
284 | | - upload_request = CreateStaticFileUploadUrlRequest(file_name=filename) |
285 | | - upload_result = GriptapeNodes.handle_request(upload_request) |
286 | | - |
287 | | - if isinstance(upload_result, CreateStaticFileUploadUrlResultFailure): |
288 | | - error_msg = f"Failed to create upload URL for file '{filename}': {upload_result.error}" |
289 | | - raise RuntimeError(error_msg) # noqa: TRY004 |
290 | | - |
291 | | - if not isinstance(upload_result, CreateStaticFileUploadUrlResultSuccess): |
292 | | - error_msg = f"Static file API returned unexpected result type: {type(upload_result).__name__}" |
293 | | - raise RuntimeError(error_msg) # noqa: TRY004 |
294 | | - |
295 | | - # Upload the PNG bytes |
296 | | - try: |
297 | | - response = httpx.request( |
298 | | - upload_result.method, |
299 | | - upload_result.url, |
300 | | - content=img_data, |
301 | | - headers=upload_result.headers, |
302 | | - timeout=60, |
303 | | - ) |
304 | | - response.raise_for_status() |
305 | | - except Exception as e: |
306 | | - error_msg = f"Failed to upload image data: {e}" |
307 | | - raise RuntimeError(error_msg) from e |
308 | | - |
309 | | - # Get download URL |
310 | | - download_request = CreateStaticFileDownloadUrlRequest(file_name=filename) |
311 | | - download_result = GriptapeNodes.handle_request(download_request) |
312 | | - |
313 | | - if isinstance(download_result, CreateStaticFileDownloadUrlResultFailure): |
314 | | - error_msg = f"Failed to create download URL for file '{filename}': {download_result.error}" |
315 | | - raise RuntimeError(error_msg) # noqa: TRY004 |
316 | | - |
317 | | - if not isinstance(download_result, CreateStaticFileDownloadUrlResultSuccess): |
318 | | - error_msg = f"Static file API returned unexpected download result type: {type(download_result).__name__}" |
319 | | - raise RuntimeError(error_msg) # noqa: TRY004 |
320 | | - |
321 | | - # Create and return ImageUrlArtifact |
322 | | - return ImageUrlArtifact(value=download_result.url) |
| 274 | + dest = self._output_file.build_file() |
| 275 | + saved = dest.write_bytes(img_data) |
| 276 | + return ImageUrlArtifact(value=saved.location) |
0 commit comments