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.
- griptape_nodes/drivers/storage/local_storage_driver.py +1 -0
- griptape_nodes/retained_mode/managers/library_manager.py +2 -1
- griptape_nodes/retained_mode/managers/settings.py +7 -0
- griptape_nodes/retained_mode/managers/static_files_manager.py +8 -2
- griptape_nodes/servers/static.py +16 -10
- {griptape_nodes-0.63.3.dist-info → griptape_nodes-0.63.4.dist-info}/METADATA +1 -1
- {griptape_nodes-0.63.3.dist-info → griptape_nodes-0.63.4.dist-info}/RECORD +9 -9
- {griptape_nodes-0.63.3.dist-info → griptape_nodes-0.63.4.dist-info}/WHEEL +1 -1
- {griptape_nodes-0.63.3.dist-info → griptape_nodes-0.63.4.dist-info}/entry_points.txt +0 -0
|
@@ -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.
|
|
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)
|
griptape_nodes/servers/static.py
CHANGED
|
@@ -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 =
|
|
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(
|
|
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
|
-
|
|
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=["*"],
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
221
|
-
griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=
|
|
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=
|
|
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.
|
|
267
|
-
griptape_nodes-0.63.
|
|
268
|
-
griptape_nodes-0.63.
|
|
269
|
-
griptape_nodes-0.63.
|
|
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,,
|
|
File without changes
|