Skip to content

Commit d6eec93

Browse files
collindutterclaude
andcommitted
fix: migrate add_text_to_image to ProjectFileParameter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent cd20669 commit d6eec93

1 file changed

Lines changed: 13 additions & 59 deletions

File tree

griptape_nodes_library/image/add_text_to_image.py

Lines changed: 13 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,18 @@
11
from io import BytesIO
22
from typing import Any
33

4-
import httpx
54
from griptape.artifacts import ImageUrlArtifact
65
from griptape_nodes.exe_types.core_types import ParameterMode
76
from griptape_nodes.exe_types.node_types import SuccessFailureNode
7+
from griptape_nodes.exe_types.param_components.project_file_parameter import ProjectFileParameter
88
from griptape_nodes.exe_types.param_types.parameter_image import ParameterImage
99
from griptape_nodes.exe_types.param_types.parameter_int import ParameterInt
1010
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
2012
from griptape_nodes.traits.color_picker import ColorPicker
2113
from PIL import Image, ImageDraw, ImageFont
2214

2315
from griptape_nodes_library.utils.color_utils import parse_color_to_rgba
24-
from griptape_nodes_library.utils.file_utils import generate_filename
2516

2617
# Constants
2718
TEXT_PREVIEW_LENGTH = 50
@@ -103,6 +94,13 @@ def __init__(self, name: str, metadata: dict[Any, Any] | None = None) -> None:
10394
)
10495
)
10596

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+
106104
# Add status parameters using the helper method
107105
self._create_status_parameters(
108106
result_details_tooltip="Details about the text-to-image operation result",
@@ -267,56 +265,12 @@ def _set_failure_output_values(self) -> None:
267265
self.parameter_output_values["image"] = None
268266

269267
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."""
271269
# Convert PIL Image to PNG bytes in memory
272270
img_bytes = BytesIO()
273271
image.save(img_bytes, format="PNG")
274272
img_data = img_bytes.getvalue()
275273

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

Comments
 (0)