griptape-nodes 0.63.3__py3-none-any.whl → 0.63.4__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.
@@ -33,6 +33,7 @@ class LocalStorageDriver(BaseStorageDriver):
33
33
  msg = "Static server is not enabled. Please set STATIC_SERVER_ENABLED to True."
34
34
  raise ValueError(msg)
35
35
  if base_url is None:
36
+ # Default to localhost - the storage driver creator can pass a proxy URL if needed
36
37
  self.base_url = f"http://{STATIC_SERVER_HOST}:{STATIC_SERVER_PORT}{STATIC_SERVER_URL}"
37
38
  else:
38
39
  self.base_url = base_url
@@ -149,6 +149,7 @@ console = Console()
149
149
  class LibraryManager:
150
150
  SANDBOX_LIBRARY_NAME = "Sandbox Library"
151
151
  LIBRARY_CONFIG_FILENAME = "griptape_nodes_library.json"
152
+ LIBRARY_CONFIG_GLOB_PATTERN = "griptape[_-]nodes[_-]library.json"
152
153
 
153
154
  @dataclass
154
155
  class LibraryInfo:
@@ -2210,7 +2211,7 @@ class LibraryManager:
2210
2211
  """Process a path, handling both files and directories."""
2211
2212
  if path.is_dir():
2212
2213
  # Process all library JSON files recursively in the directory
2213
- discovered_libraries.update(path.rglob(LibraryManager.LIBRARY_CONFIG_FILENAME))
2214
+ discovered_libraries.update(path.rglob(LibraryManager.LIBRARY_CONFIG_GLOB_PATTERN))
2214
2215
  elif path.suffix == ".json":
2215
2216
  discovered_libraries.add(path)
2216
2217
 
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from enum import StrEnum
2
3
  from pathlib import Path
3
4
  from typing import Any, Literal
@@ -25,6 +26,7 @@ STORAGE = Category(name="Storage", description="Data storage and persistence con
25
26
  SYSTEM_REQUIREMENTS = Category(name="System Requirements", description="System resource requirements and limits")
26
27
  MCP_SERVERS = Category(name="MCP Servers", description="Model Context Protocol server configurations")
27
28
  PROJECTS = Category(name="Projects", description="Project template configurations and registrations")
29
+ STATIC_SERVER = Category(name="Static Server", description="Static file server configuration for serving media assets")
28
30
 
29
31
 
30
32
  def Field(category: str | Category = "General", **kwargs) -> Any:
@@ -232,3 +234,8 @@ class Settings(BaseModel):
232
234
  default_factory=list,
233
235
  description="List of Model Context Protocol server configurations",
234
236
  )
237
+ static_server_base_url: str = Field(
238
+ category=STATIC_SERVER,
239
+ default_factory=lambda: f"http://{os.getenv('STATIC_SERVER_HOST', 'localhost')}:{os.getenv('STATIC_SERVER_PORT', '8124')}",
240
+ description="Base URL for the static server. Defaults to http://localhost:8124 (or values from STATIC_SERVER_HOST/PORT env vars). Override this when using tunnels (ngrok, cloudflare) or reverse proxies.",
241
+ )
@@ -53,6 +53,12 @@ class StaticFilesManager:
53
53
  self.storage_backend = config_manager.get_config_value("storage_backend", default=StorageBackend.LOCAL)
54
54
  workspace_directory = Path(config_manager.get_config_value("workspace_directory"))
55
55
 
56
+ # Build base URL for LocalStorageDriver from configured base URL
57
+ from griptape_nodes.servers.static import STATIC_SERVER_URL
58
+
59
+ base_url_config = config_manager.get_config_value("static_server_base_url")
60
+ base_url = f"{base_url_config}{STATIC_SERVER_URL}"
61
+
56
62
  match self.storage_backend:
57
63
  case StorageBackend.GTC:
58
64
  bucket_id = secrets_manager.get_secret("GT_CLOUD_BUCKET_ID", should_error_on_not_found=False)
@@ -61,7 +67,7 @@ class StaticFilesManager:
61
67
  logger.warning(
62
68
  "GT_CLOUD_BUCKET_ID secret is not available, falling back to local storage. Run `gtn init` to set it up."
63
69
  )
64
- self.storage_driver = LocalStorageDriver(workspace_directory)
70
+ self.storage_driver = LocalStorageDriver(workspace_directory, base_url=base_url)
65
71
  else:
66
72
  static_files_directory = config_manager.get_config_value(
67
73
  "static_files_directory", default="staticfiles"
@@ -73,7 +79,7 @@ class StaticFilesManager:
73
79
  static_files_directory=static_files_directory,
74
80
  )
75
81
  case StorageBackend.LOCAL:
76
- self.storage_driver = LocalStorageDriver(workspace_directory)
82
+ self.storage_driver = LocalStorageDriver(workspace_directory, base_url=base_url)
77
83
  case _:
78
84
  msg = f"Invalid storage backend: {self.storage_backend}"
79
85
  raise ValueError(msg)
@@ -16,9 +16,9 @@ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
16
16
 
17
17
  # Whether to enable the static server
18
18
  STATIC_SERVER_ENABLED = os.getenv("STATIC_SERVER_ENABLED", "true").lower() == "true"
19
- # Host of the static server
19
+ # Host of the static server (where uvicorn binds)
20
20
  STATIC_SERVER_HOST = os.getenv("STATIC_SERVER_HOST", "localhost")
21
- # Port of the static server
21
+ # Port of the static server (where uvicorn binds)
22
22
  STATIC_SERVER_PORT = int(os.getenv("STATIC_SERVER_PORT", "8124"))
23
23
  # URL path for the static server
24
24
  STATIC_SERVER_URL = os.getenv("STATIC_SERVER_URL", "/workspace")
@@ -34,10 +34,11 @@ async def _create_static_file_upload_url(request: Request) -> dict:
34
34
 
35
35
  Similar to a presigned URL, but for uploading files to the static server.
36
36
  """
37
- base_url = request.base_url
37
+ base_url = GriptapeNodes.ConfigManager().get_config_value("static_server_base_url")
38
+
38
39
  body = await request.json()
39
40
  file_path = body["file_path"].lstrip("/")
40
- url = urljoin(str(base_url), f"/static-uploads/{file_path}")
41
+ url = urljoin(base_url, f"/static-uploads/{file_path}")
41
42
 
42
43
  return {"url": url}
43
44
 
@@ -66,7 +67,8 @@ async def _create_static_file(request: Request, file_path: str) -> dict:
66
67
  logger.error(msg)
67
68
  raise HTTPException(status_code=500, detail=msg) from e
68
69
 
69
- static_url = f"http://{STATIC_SERVER_HOST}:{STATIC_SERVER_PORT}{STATIC_SERVER_URL}/{file_path}"
70
+ base_url = GriptapeNodes.ConfigManager().get_config_value("static_server_base_url")
71
+ static_url = urljoin(f"{base_url}{STATIC_SERVER_URL}/", file_path)
70
72
  return {"url": static_url}
71
73
 
72
74
 
@@ -144,14 +146,18 @@ def start_static_server() -> None:
144
146
  app.add_api_route("/static-uploads/", _list_static_files, methods=["GET"])
145
147
  app.add_api_route("/static-files/{file_path:path}", _delete_static_file, methods=["DELETE"])
146
148
 
149
+ # Build CORS allowed origins list
150
+ allowed_origins = [
151
+ os.getenv("GRIPTAPE_NODES_UI_BASE_URL", "https://app.nodes.griptape.ai"),
152
+ "https://app.nodes-staging.griptape.ai",
153
+ "http://localhost:5173",
154
+ GriptapeNodes.ConfigManager().get_config_value("static_server_base_url"),
155
+ ]
156
+
147
157
  # Add CORS middleware
148
158
  app.add_middleware(
149
159
  CORSMiddleware,
150
- allow_origins=[
151
- os.getenv("GRIPTAPE_NODES_UI_BASE_URL", "https://app.nodes.griptape.ai"),
152
- "https://app.nodes-staging.griptape.ai",
153
- "http://localhost:5173",
154
- ],
160
+ allow_origins=allowed_origins,
155
161
  allow_credentials=True,
156
162
  allow_methods=["OPTIONS", "GET", "POST", "PUT", "DELETE"],
157
163
  allow_headers=["*"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.63.3
3
+ Version: 0.63.4
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.12
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -55,7 +55,7 @@ griptape_nodes/drivers/__init__.py,sha256=tHmiFQn6uJyFVhC2PrqHgRUH3d3yDsqMQpWqRa
55
55
  griptape_nodes/drivers/storage/__init__.py,sha256=_7p8vJt3YnnF6sD3Uxxw38c-gazuMIHSS-m3G6sa2Qk,208
56
56
  griptape_nodes/drivers/storage/base_storage_driver.py,sha256=47PrMzxOuJhV2ee4CbPT7YOqR2MjlHr3VxhGON_ygio,3945
57
57
  griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py,sha256=qQctInOvfKRJdqTiW8T3ycjre2FDGTb9-JtzEtiCHVM,6870
58
- griptape_nodes/drivers/storage/local_storage_driver.py,sha256=FqiX1DmvpyKx444f74cFCsQ2Mfx6XiOezRcCGFOCSgQ,3665
58
+ griptape_nodes/drivers/storage/local_storage_driver.py,sha256=lhgi1ATTp0GU5vcXE-tLr3G76eiINfkGo2p_b1mfOYI,3760
59
59
  griptape_nodes/drivers/storage/storage_backend.py,sha256=3QBIwrgPc1krBIiPYLoK2swhIPDiKJnnucOEdyx7y3c,184
60
60
  griptape_nodes/drivers/thread_storage/__init__.py,sha256=JkCafJ978K63ad8PWtTIC7af70nxMjbp13ZJz2_55Bs,604
61
61
  griptape_nodes/drivers/thread_storage/base_thread_storage_driver.py,sha256=yckq3ckw5ZQgBz-wwUVdYzTht9r0dBB1DdJNgrt63ZM,2944
@@ -198,7 +198,7 @@ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/packa
198
198
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py,sha256=XgG7whE74zWDxX1pOvhASW0pwjOei1EDLvIH19xdzT0,6117
199
199
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sha256=cCGr-MQ1RlVBiUTZepYEKdVhPgC4ebcYrmpv8rI3VeM,894
200
200
  griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=K3UEBzAdCY9wphyBbLxDYP0Q43aYvhLZ_Pz7_SzcPec,443
201
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=gSVn-Bge5-kXoSVvKz4E8C5h-52Efc6Wbvc6FLH0aLo,108170
201
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=vH1U6hTS0aK_rK5C7mKkrvacx8pd8ohDkKQF0roWbl0,108244
202
202
  griptape_nodes/retained_mode/managers/mcp_manager.py,sha256=Ezmn5_48r4JWYe-tFGqmw9dXLvvTiO1rw9b4MNCkw0U,15955
203
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
@@ -217,8 +217,8 @@ griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py,sha256=YHjU
217
217
  griptape_nodes/retained_mode/managers/resource_types/os_resource.py,sha256=ImgkOQI_br4yI3EY777D93NR20al8b4q9IocqWESjkw,3082
218
218
  griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=2DU2002dgr3XipnAhmjqLXH82ZFb8wlGpTWX8pl4f7E,7722
219
219
  griptape_nodes/retained_mode/managers/session_manager.py,sha256=u3OEir9rjwG7GFM4MA5crKwcwq6F-lCUKlFzxlFU4co,14085
220
- griptape_nodes/retained_mode/managers/settings.py,sha256=fpLm3QZXLpNEYWrBmasYr-5iQz6Aox-c0k8UaRMBQig,9860
221
- griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=zTwlvLDub5siwNIAysrtWGbls5zC2amMSP2m-M7W4v0,11170
220
+ griptape_nodes/retained_mode/managers/settings.py,sha256=BgVeneuBIQl7dkBqCVjHzAnSR7ehscANk-6K7o0R9sE,10414
221
+ griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=qQLOwugzqWoz2fzmOpXldU8U33R_WXQ8i4trIKodKv8,11494
222
222
  griptape_nodes/retained_mode/managers/sync_manager.py,sha256=quKrg3pGEmPcoQDm5IqLHEFW64UmS4OT6o27dD57pFg,21395
223
223
  griptape_nodes/retained_mode/managers/user_manager.py,sha256=JAOOKDhUfIbj0CJ5EHRBcplmxheQTzeogbvGO23VqXQ,4508
224
224
  griptape_nodes/retained_mode/managers/variable_manager.py,sha256=TnuqHSRK9Yiu_EtKxQksF9SyyQb72lbFQuTQZdpBxeE,24116
@@ -230,7 +230,7 @@ griptape_nodes/retained_mode/utils/name_generator.py,sha256=IZLahtfP3XC79XApLdGo
230
230
  griptape_nodes/retained_mode/variable_types.py,sha256=GVrSWMB3gEDAufSPOBXbNfIRhA9M43MoxpqLyuIg_HE,435
231
231
  griptape_nodes/servers/__init__.py,sha256=JCmorB8tQUu_kQ8hSRhgw4VsOqsC0iZjZ-mCXYy9ZOQ,60
232
232
  griptape_nodes/servers/mcp.py,sha256=pCtBFfPKZuhU2tWguorOnmV33fYmF7NN-c9gu4MQFEk,5453
233
- griptape_nodes/servers/static.py,sha256=cSHiOrVFb8qliwSviSup3nDes6PaiRb8XwHqUQNEWwA,7201
233
+ griptape_nodes/servers/static.py,sha256=mRkzOVZQJillVsnNCz2Mbi1TgiiGI3OUaF-NiD1U53M,7499
234
234
  griptape_nodes/traits/__init__.py,sha256=bTLXTiZTJz2z15RRLoPI4nvLnNW9FiLcKL_2pT4E10g,32
235
235
  griptape_nodes/traits/add_param_button.py,sha256=27RZDVLMD0HmRF6hjfz7iV7LBau92vMc_d2eD2Ey8fA,649
236
236
  griptape_nodes/traits/button.py,sha256=tTOgY-AQ7VbG97JzOletb7lFaGj48nFX67Qp_QA45M4,14012
@@ -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.3.dist-info/WHEEL,sha256=DpNsHFUm_gffZe1FgzmqwuqiuPC6Y-uBCzibcJcdupM,78
267
- griptape_nodes-0.63.3.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
268
- griptape_nodes-0.63.3.dist-info/METADATA,sha256=Ns3qiYrWBDzCFc97U_7M6wt7UzdRssTBX4B_voreiRE,5208
269
- griptape_nodes-0.63.3.dist-info/RECORD,,
266
+ griptape_nodes-0.63.4.dist-info/WHEEL,sha256=w4ZtLaDgMAZW2MMZZwtH8zENekoQYBCeullI-zsXJQk,78
267
+ griptape_nodes-0.63.4.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
268
+ griptape_nodes-0.63.4.dist-info/METADATA,sha256=McQKXCEmm7LUjo-HW78LH2yUm7QLqhTIHG6QJE2CxnE,5208
269
+ griptape_nodes-0.63.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.8
2
+ Generator: uv 0.9.9
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any