griptape-nodes 0.57.0__py3-none-any.whl → 0.58.0__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/api_client/__init__.py +9 -0
- griptape_nodes/api_client/client.py +279 -0
- griptape_nodes/api_client/request_client.py +273 -0
- griptape_nodes/app/app.py +57 -150
- griptape_nodes/bootstrap/utils/python_subprocess_executor.py +1 -1
- griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +22 -50
- griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +6 -1
- griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +27 -46
- griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +7 -0
- griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +3 -1
- griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +3 -1
- griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +16 -1
- griptape_nodes/common/node_executor.py +466 -0
- griptape_nodes/drivers/storage/base_storage_driver.py +0 -11
- griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +7 -25
- griptape_nodes/drivers/storage/local_storage_driver.py +2 -2
- griptape_nodes/exe_types/connections.py +37 -9
- griptape_nodes/exe_types/core_types.py +1 -1
- griptape_nodes/exe_types/node_types.py +115 -22
- griptape_nodes/machines/control_flow.py +48 -7
- griptape_nodes/machines/parallel_resolution.py +98 -29
- griptape_nodes/machines/sequential_resolution.py +61 -22
- griptape_nodes/node_library/library_registry.py +24 -1
- griptape_nodes/node_library/workflow_registry.py +38 -2
- griptape_nodes/retained_mode/events/execution_events.py +8 -1
- griptape_nodes/retained_mode/events/flow_events.py +90 -3
- griptape_nodes/retained_mode/events/node_events.py +17 -10
- griptape_nodes/retained_mode/events/workflow_events.py +5 -0
- griptape_nodes/retained_mode/griptape_nodes.py +16 -219
- griptape_nodes/retained_mode/managers/config_manager.py +0 -46
- griptape_nodes/retained_mode/managers/engine_identity_manager.py +225 -74
- griptape_nodes/retained_mode/managers/flow_manager.py +1276 -230
- griptape_nodes/retained_mode/managers/library_manager.py +7 -8
- griptape_nodes/retained_mode/managers/node_manager.py +197 -9
- griptape_nodes/retained_mode/managers/secrets_manager.py +26 -0
- griptape_nodes/retained_mode/managers/session_manager.py +264 -227
- griptape_nodes/retained_mode/managers/settings.py +4 -38
- griptape_nodes/retained_mode/managers/static_files_manager.py +3 -3
- griptape_nodes/retained_mode/managers/version_compatibility_manager.py +135 -6
- griptape_nodes/retained_mode/managers/workflow_manager.py +206 -78
- griptape_nodes/servers/mcp.py +23 -15
- griptape_nodes/utils/async_utils.py +36 -0
- griptape_nodes/utils/dict_utils.py +8 -2
- griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +11 -6
- griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py +12 -5
- {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/METADATA +4 -3
- {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/RECORD +49 -47
- {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/WHEEL +1 -1
- griptape_nodes/retained_mode/utils/engine_identity.py +0 -245
- griptape_nodes/servers/ws_request_manager.py +0 -268
- {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/entry_points.txt +0 -0
|
@@ -1,10 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
from dataclasses import dataclass, field
|
|
2
4
|
from enum import Enum, auto
|
|
3
|
-
from typing import Any, NamedTuple, NewType
|
|
5
|
+
from typing import TYPE_CHECKING, Any, NamedTuple, NewType
|
|
4
6
|
from uuid import uuid4
|
|
5
7
|
|
|
6
|
-
from griptape_nodes.exe_types.
|
|
7
|
-
|
|
8
|
+
from griptape_nodes.exe_types.node_types import NodeResolutionState
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from griptape_nodes.exe_types.core_types import NodeMessagePayload
|
|
12
|
+
from griptape_nodes.exe_types.node_types import NodeDependencies
|
|
13
|
+
from griptape_nodes.retained_mode.events.connection_events import ListConnectionsForNodeResultSuccess
|
|
14
|
+
from griptape_nodes.retained_mode.events.parameter_events import (
|
|
15
|
+
GetParameterDetailsResultSuccess,
|
|
16
|
+
GetParameterValueResultSuccess,
|
|
17
|
+
SetParameterValueRequest,
|
|
18
|
+
)
|
|
8
19
|
from griptape_nodes.retained_mode.events.base_events import (
|
|
9
20
|
RequestPayload,
|
|
10
21
|
ResultPayloadFailure,
|
|
@@ -12,12 +23,6 @@ from griptape_nodes.retained_mode.events.base_events import (
|
|
|
12
23
|
WorkflowAlteredMixin,
|
|
13
24
|
WorkflowNotAlteredMixin,
|
|
14
25
|
)
|
|
15
|
-
from griptape_nodes.retained_mode.events.connection_events import ListConnectionsForNodeResultSuccess
|
|
16
|
-
from griptape_nodes.retained_mode.events.parameter_events import (
|
|
17
|
-
GetParameterDetailsResultSuccess,
|
|
18
|
-
GetParameterValueResultSuccess,
|
|
19
|
-
SetParameterValueRequest,
|
|
20
|
-
)
|
|
21
26
|
from griptape_nodes.retained_mode.events.payload_registry import PayloadRegistry
|
|
22
27
|
|
|
23
28
|
|
|
@@ -430,7 +435,7 @@ class SerializedNodeCommands:
|
|
|
430
435
|
"""
|
|
431
436
|
|
|
432
437
|
set_parameter_value_command: SetParameterValueRequest
|
|
433
|
-
unique_value_uuid:
|
|
438
|
+
unique_value_uuid: SerializedNodeCommands.UniqueParameterValueUUID
|
|
434
439
|
|
|
435
440
|
create_node_command: CreateNodeRequest
|
|
436
441
|
element_modification_commands: list[RequestPayload]
|
|
@@ -573,12 +578,14 @@ class SerializeSelectedNodesToCommandsRequest(WorkflowNotAlteredMixin, RequestPa
|
|
|
573
578
|
|
|
574
579
|
Args:
|
|
575
580
|
nodes_to_serialize: List of node identifiers (each containing [node_name, timestamp])
|
|
581
|
+
copy_to_clipboard: Whether to copy the result to clipboard (defaults to True for backward compatibility)
|
|
576
582
|
|
|
577
583
|
Results: SerializeSelectedNodesToCommandsResultSuccess (with commands) | SerializeSelectedNodesToCommandsResultFailure (node not found, serialization error)
|
|
578
584
|
"""
|
|
579
585
|
|
|
580
586
|
# They will be passed with node_name, timestamp
|
|
581
587
|
nodes_to_serialize: list[list[str]]
|
|
588
|
+
copy_to_clipboard: bool = True
|
|
582
589
|
|
|
583
590
|
|
|
584
591
|
@dataclass
|
|
@@ -278,12 +278,14 @@ class SaveWorkflowRequest(RequestPayload):
|
|
|
278
278
|
Args:
|
|
279
279
|
file_name: Name of the file to save the workflow to (None for auto-generated)
|
|
280
280
|
image_path: Path to save workflow image/thumbnail (None for no image)
|
|
281
|
+
pickle_control_flow_result: Whether to use pickle-based serialization for control flow results (None for default behavior)
|
|
281
282
|
|
|
282
283
|
Results: SaveWorkflowResultSuccess (with file path) | SaveWorkflowResultFailure (save error)
|
|
283
284
|
"""
|
|
284
285
|
|
|
285
286
|
file_name: str | None = None
|
|
286
287
|
image_path: str | None = None
|
|
288
|
+
pickle_control_flow_result: bool | None = None
|
|
287
289
|
|
|
288
290
|
|
|
289
291
|
@dataclass
|
|
@@ -388,6 +390,7 @@ class PublishWorkflowRequest(RequestPayload):
|
|
|
388
390
|
publisher_name: str
|
|
389
391
|
execute_on_publish: bool = False
|
|
390
392
|
published_workflow_file_name: str | None = None
|
|
393
|
+
pickle_control_flow_result: bool = False
|
|
391
394
|
|
|
392
395
|
|
|
393
396
|
@dataclass
|
|
@@ -655,6 +658,7 @@ class SaveWorkflowFileFromSerializedFlowRequest(RequestPayload):
|
|
|
655
658
|
branched_from: Optional branched from information to preserve workflow lineage
|
|
656
659
|
workflow_shape: Optional workflow shape defining inputs and outputs for external callers
|
|
657
660
|
file_path: Optional specific file path to use (defaults to workspace path if not provided)
|
|
661
|
+
pickle_control_flow_result: Whether to pickle control flow results in generated execution code (defaults to False)
|
|
658
662
|
|
|
659
663
|
Results: SaveWorkflowFileFromSerializedFlowResultSuccess (with file path) | SaveWorkflowFileFromSerializedFlowResultFailure (save error)
|
|
660
664
|
"""
|
|
@@ -667,6 +671,7 @@ class SaveWorkflowFileFromSerializedFlowRequest(RequestPayload):
|
|
|
667
671
|
execution_flow_name: str | None = None
|
|
668
672
|
branched_from: str | None = None
|
|
669
673
|
workflow_shape: WorkflowShape | None = None
|
|
674
|
+
pickle_control_flow_result: bool = False
|
|
670
675
|
|
|
671
676
|
|
|
672
677
|
@dataclass
|
|
@@ -2,42 +2,23 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
|
-
import re
|
|
6
|
-
import uuid
|
|
7
|
-
from dataclasses import dataclass
|
|
8
5
|
from datetime import UTC, datetime
|
|
9
6
|
from typing import TYPE_CHECKING, Any
|
|
10
7
|
|
|
8
|
+
import semver
|
|
9
|
+
|
|
11
10
|
from griptape_nodes.exe_types.flow import ControlFlow
|
|
12
11
|
from griptape_nodes.node_library.workflow_registry import WorkflowRegistry
|
|
13
12
|
from griptape_nodes.retained_mode.events.app_events import (
|
|
14
|
-
AppConnectionEstablished,
|
|
15
|
-
AppEndSessionRequest,
|
|
16
|
-
AppEndSessionResultFailure,
|
|
17
|
-
AppEndSessionResultSuccess,
|
|
18
|
-
AppGetSessionRequest,
|
|
19
|
-
AppGetSessionResultSuccess,
|
|
20
|
-
AppStartSessionRequest,
|
|
21
|
-
AppStartSessionResultSuccess,
|
|
22
13
|
EngineHeartbeatRequest,
|
|
23
14
|
EngineHeartbeatResultFailure,
|
|
24
15
|
EngineHeartbeatResultSuccess,
|
|
25
|
-
GetEngineNameRequest,
|
|
26
|
-
GetEngineNameResultFailure,
|
|
27
|
-
GetEngineNameResultSuccess,
|
|
28
16
|
GetEngineVersionRequest,
|
|
29
17
|
GetEngineVersionResultFailure,
|
|
30
18
|
GetEngineVersionResultSuccess,
|
|
31
|
-
SessionHeartbeatRequest,
|
|
32
|
-
SessionHeartbeatResultFailure,
|
|
33
|
-
SessionHeartbeatResultSuccess,
|
|
34
|
-
SetEngineNameRequest,
|
|
35
|
-
SetEngineNameResultFailure,
|
|
36
|
-
SetEngineNameResultSuccess,
|
|
37
19
|
)
|
|
38
20
|
from griptape_nodes.retained_mode.events.base_events import (
|
|
39
21
|
GriptapeNodeEvent,
|
|
40
|
-
ResultDetails,
|
|
41
22
|
ResultPayloadFailure,
|
|
42
23
|
)
|
|
43
24
|
from griptape_nodes.retained_mode.events.flow_events import (
|
|
@@ -89,48 +70,6 @@ if TYPE_CHECKING:
|
|
|
89
70
|
logger = logging.getLogger("griptape_nodes")
|
|
90
71
|
|
|
91
72
|
|
|
92
|
-
@dataclass
|
|
93
|
-
class Version:
|
|
94
|
-
major: int
|
|
95
|
-
minor: int
|
|
96
|
-
patch: int
|
|
97
|
-
|
|
98
|
-
@classmethod
|
|
99
|
-
def from_string(cls, version_string: str) -> Version | None:
|
|
100
|
-
match = re.match(r"(\d+)\.(\d+)\.(\d+)", version_string)
|
|
101
|
-
if match:
|
|
102
|
-
major, minor, patch = map(int, match.groups())
|
|
103
|
-
return cls(major, minor, patch)
|
|
104
|
-
return None
|
|
105
|
-
|
|
106
|
-
def __str__(self) -> str:
|
|
107
|
-
return f"{self.major}.{self.minor}.{self.patch}"
|
|
108
|
-
|
|
109
|
-
def __lt__(self, other: Version) -> bool:
|
|
110
|
-
"""Less than comparison."""
|
|
111
|
-
return (self.major, self.minor, self.patch) < (other.major, other.minor, other.patch)
|
|
112
|
-
|
|
113
|
-
def __le__(self, other: Version) -> bool:
|
|
114
|
-
"""Less than or equal comparison."""
|
|
115
|
-
return (self.major, self.minor, self.patch) <= (other.major, other.minor, other.patch)
|
|
116
|
-
|
|
117
|
-
def __gt__(self, other: Version) -> bool:
|
|
118
|
-
"""Greater than comparison."""
|
|
119
|
-
return (self.major, self.minor, self.patch) > (other.major, other.minor, other.patch)
|
|
120
|
-
|
|
121
|
-
def __ge__(self, other: Version) -> bool:
|
|
122
|
-
"""Greater than or equal comparison."""
|
|
123
|
-
return (self.major, self.minor, self.patch) >= (other.major, other.minor, other.patch)
|
|
124
|
-
|
|
125
|
-
def __eq__(self, other: Version) -> bool: # type: ignore[override]
|
|
126
|
-
"""Equality comparison."""
|
|
127
|
-
return (self.major, self.minor, self.patch) == (other.major, other.minor, other.patch)
|
|
128
|
-
|
|
129
|
-
def __hash__(self) -> int:
|
|
130
|
-
"""Hash function for Version."""
|
|
131
|
-
return hash((self.major, self.minor, self.patch))
|
|
132
|
-
|
|
133
|
-
|
|
134
73
|
class GriptapeNodes(metaclass=SingletonMeta):
|
|
135
74
|
_event_manager: EventManager
|
|
136
75
|
_os_manager: OSManager
|
|
@@ -155,7 +94,7 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
155
94
|
_resource_manager: ResourceManager
|
|
156
95
|
_sync_manager: SyncManager
|
|
157
96
|
|
|
158
|
-
def __init__(self) -> None:
|
|
97
|
+
def __init__(self) -> None:
|
|
159
98
|
from griptape_nodes.retained_mode.managers.agent_manager import AgentManager
|
|
160
99
|
from griptape_nodes.retained_mode.managers.arbitrary_code_exec_manager import (
|
|
161
100
|
ArbitraryCodeExecManager,
|
|
@@ -213,8 +152,8 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
213
152
|
)
|
|
214
153
|
self._agent_manager = AgentManager(self._static_files_manager, self._event_manager)
|
|
215
154
|
self._version_compatibility_manager = VersionCompatibilityManager(self._event_manager)
|
|
216
|
-
self._session_manager = SessionManager(self._event_manager)
|
|
217
155
|
self._engine_identity_manager = EngineIdentityManager(self._event_manager)
|
|
156
|
+
self._session_manager = SessionManager(self._engine_identity_manager, self._event_manager)
|
|
218
157
|
self._mcp_manager = MCPManager(self._event_manager, self._config_manager)
|
|
219
158
|
self._sync_manager = SyncManager(self._event_manager, self._config_manager)
|
|
220
159
|
|
|
@@ -222,24 +161,9 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
222
161
|
self._event_manager.assign_manager_to_request_type(
|
|
223
162
|
GetEngineVersionRequest, self.handle_engine_version_request
|
|
224
163
|
)
|
|
225
|
-
self._event_manager.assign_manager_to_request_type(
|
|
226
|
-
AppStartSessionRequest, self.handle_session_start_request
|
|
227
|
-
)
|
|
228
|
-
self._event_manager.assign_manager_to_request_type(AppEndSessionRequest, self.handle_session_end_request)
|
|
229
|
-
self._event_manager.add_listener_to_app_event(AppConnectionEstablished, self.on_app_connection_established)
|
|
230
|
-
self._event_manager.assign_manager_to_request_type(AppGetSessionRequest, self.handle_get_session_request)
|
|
231
|
-
self._event_manager.assign_manager_to_request_type(
|
|
232
|
-
SessionHeartbeatRequest, self.handle_session_heartbeat_request
|
|
233
|
-
)
|
|
234
164
|
self._event_manager.assign_manager_to_request_type(
|
|
235
165
|
EngineHeartbeatRequest, self.handle_engine_heartbeat_request
|
|
236
166
|
)
|
|
237
|
-
self._event_manager.assign_manager_to_request_type(
|
|
238
|
-
GetEngineNameRequest, self.handle_get_engine_name_request
|
|
239
|
-
)
|
|
240
|
-
self._event_manager.assign_manager_to_request_type(
|
|
241
|
-
SetEngineNameRequest, self.handle_set_engine_name_request
|
|
242
|
-
)
|
|
243
167
|
|
|
244
168
|
@classmethod
|
|
245
169
|
def get_instance(cls) -> GriptapeNodes:
|
|
@@ -304,11 +228,11 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
304
228
|
|
|
305
229
|
@classmethod
|
|
306
230
|
def get_session_id(cls) -> str | None:
|
|
307
|
-
return GriptapeNodes.SessionManager().
|
|
231
|
+
return GriptapeNodes.SessionManager().active_session_id
|
|
308
232
|
|
|
309
233
|
@classmethod
|
|
310
234
|
def get_engine_id(cls) -> str | None:
|
|
311
|
-
return GriptapeNodes.EngineIdentityManager().
|
|
235
|
+
return GriptapeNodes.EngineIdentityManager().active_engine_id
|
|
312
236
|
|
|
313
237
|
@classmethod
|
|
314
238
|
def EventManager(cls) -> EventManager:
|
|
@@ -421,113 +345,20 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
421
345
|
msg = "Failed to successfully delete all objects"
|
|
422
346
|
raise ValueError(msg)
|
|
423
347
|
|
|
424
|
-
async def on_app_connection_established(self, _payload: AppConnectionEstablished) -> None:
|
|
425
|
-
from griptape_nodes.app.app import subscribe_to_topic
|
|
426
|
-
|
|
427
|
-
# Subscribe to request topic (engine discovery)
|
|
428
|
-
await subscribe_to_topic("request")
|
|
429
|
-
|
|
430
|
-
# Get engine ID and subscribe to engine_id/request
|
|
431
|
-
engine_id = GriptapeNodes.get_engine_id()
|
|
432
|
-
if engine_id:
|
|
433
|
-
await subscribe_to_topic(f"engines/{engine_id}/request")
|
|
434
|
-
else:
|
|
435
|
-
logger.warning("Engine ID not available for subscription")
|
|
436
|
-
|
|
437
|
-
# Get session ID and subscribe to session_id/request if available
|
|
438
|
-
session_id = GriptapeNodes.get_session_id()
|
|
439
|
-
if session_id:
|
|
440
|
-
topic = f"sessions/{session_id}/request"
|
|
441
|
-
await subscribe_to_topic(topic)
|
|
442
|
-
else:
|
|
443
|
-
logger.info("No session ID available for subscription")
|
|
444
|
-
|
|
445
348
|
def handle_engine_version_request(self, request: GetEngineVersionRequest) -> ResultPayload: # noqa: ARG002
|
|
446
349
|
try:
|
|
447
|
-
engine_ver =
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
)
|
|
455
|
-
details = f"Attempted to get engine version. Failed because version string '{engine_ver}' wasn't in expected major.minor.patch format."
|
|
456
|
-
logger.error(details)
|
|
457
|
-
return GetEngineVersionResultFailure(result_details=details)
|
|
350
|
+
engine_ver = semver.VersionInfo.parse(engine_version)
|
|
351
|
+
return GetEngineVersionResultSuccess(
|
|
352
|
+
major=engine_ver.major,
|
|
353
|
+
minor=engine_ver.minor,
|
|
354
|
+
patch=engine_ver.patch,
|
|
355
|
+
result_details="Engine version retrieved successfully.",
|
|
356
|
+
)
|
|
458
357
|
except Exception as err:
|
|
459
358
|
details = f"Attempted to get engine version. Failed due to '{err}'."
|
|
460
359
|
logger.error(details)
|
|
461
360
|
return GetEngineVersionResultFailure(result_details=details)
|
|
462
361
|
|
|
463
|
-
async def handle_session_start_request(self, request: AppStartSessionRequest) -> ResultPayload: # noqa: ARG002
|
|
464
|
-
from griptape_nodes.app.app import subscribe_to_topic
|
|
465
|
-
|
|
466
|
-
current_session_id = GriptapeNodes.SessionManager().get_active_session_id()
|
|
467
|
-
if current_session_id is None:
|
|
468
|
-
# Client wants a new session
|
|
469
|
-
current_session_id = uuid.uuid4().hex
|
|
470
|
-
GriptapeNodes.SessionManager().save_session(current_session_id)
|
|
471
|
-
details = f"New session '{current_session_id}' started at {datetime.now(tz=UTC)}."
|
|
472
|
-
logger.info(details)
|
|
473
|
-
else:
|
|
474
|
-
details = f"Session '{current_session_id}' already active. Joining..."
|
|
475
|
-
|
|
476
|
-
topic = f"sessions/{current_session_id}/request"
|
|
477
|
-
await subscribe_to_topic(topic)
|
|
478
|
-
logger.info("Subscribed to new session topic: %s", topic)
|
|
479
|
-
|
|
480
|
-
return AppStartSessionResultSuccess(current_session_id, result_details="Session started successfully.")
|
|
481
|
-
|
|
482
|
-
async def handle_session_end_request(self, _: AppEndSessionRequest) -> ResultPayload:
|
|
483
|
-
from griptape_nodes.app.app import unsubscribe_from_topic
|
|
484
|
-
|
|
485
|
-
try:
|
|
486
|
-
previous_session_id = GriptapeNodes.SessionManager().get_active_session_id()
|
|
487
|
-
if previous_session_id is None:
|
|
488
|
-
details = "No active session to end."
|
|
489
|
-
logger.info(details)
|
|
490
|
-
else:
|
|
491
|
-
details = f"Session '{previous_session_id}' ended at {datetime.now(tz=UTC)}."
|
|
492
|
-
logger.info(details)
|
|
493
|
-
GriptapeNodes.SessionManager().clear_saved_session()
|
|
494
|
-
|
|
495
|
-
unsubscribe_topic = f"sessions/{previous_session_id}/request"
|
|
496
|
-
await unsubscribe_from_topic(unsubscribe_topic)
|
|
497
|
-
|
|
498
|
-
return AppEndSessionResultSuccess(
|
|
499
|
-
session_id=previous_session_id, result_details="Session ended successfully."
|
|
500
|
-
)
|
|
501
|
-
except Exception as err:
|
|
502
|
-
details = f"Failed to end session due to '{err}'."
|
|
503
|
-
logger.error(details)
|
|
504
|
-
return AppEndSessionResultFailure(result_details=details)
|
|
505
|
-
|
|
506
|
-
def handle_get_session_request(self, _: AppGetSessionRequest) -> ResultPayload:
|
|
507
|
-
return AppGetSessionResultSuccess(
|
|
508
|
-
session_id=GriptapeNodes.SessionManager().get_active_session_id(),
|
|
509
|
-
result_details="Session ID retrieved successfully.",
|
|
510
|
-
)
|
|
511
|
-
|
|
512
|
-
def handle_session_heartbeat_request(self, request: SessionHeartbeatRequest) -> ResultPayload: # noqa: ARG002
|
|
513
|
-
"""Handle session heartbeat requests.
|
|
514
|
-
|
|
515
|
-
Simply verifies that the session is active and responds with success.
|
|
516
|
-
"""
|
|
517
|
-
try:
|
|
518
|
-
active_session_id = GriptapeNodes.SessionManager().get_active_session_id()
|
|
519
|
-
if active_session_id is None:
|
|
520
|
-
details = "Session heartbeat received but no active session found"
|
|
521
|
-
logger.warning(details)
|
|
522
|
-
return SessionHeartbeatResultFailure(result_details=details)
|
|
523
|
-
|
|
524
|
-
details = f"Session heartbeat successful for session: {active_session_id}"
|
|
525
|
-
return SessionHeartbeatResultSuccess(result_details=details)
|
|
526
|
-
except Exception as err:
|
|
527
|
-
details = f"Failed to handle session heartbeat: {err}"
|
|
528
|
-
logger.error(details)
|
|
529
|
-
return SessionHeartbeatResultFailure(result_details=details)
|
|
530
|
-
|
|
531
362
|
def handle_engine_heartbeat_request(self, request: EngineHeartbeatRequest) -> ResultPayload:
|
|
532
363
|
"""Handle engine heartbeat requests.
|
|
533
364
|
|
|
@@ -541,14 +372,14 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
541
372
|
workflow_info = self._get_current_workflow_info()
|
|
542
373
|
|
|
543
374
|
# Get engine name
|
|
544
|
-
engine_name = GriptapeNodes.EngineIdentityManager().
|
|
375
|
+
engine_name = GriptapeNodes.EngineIdentityManager().engine_name
|
|
545
376
|
|
|
546
377
|
return EngineHeartbeatResultSuccess(
|
|
547
378
|
heartbeat_id=request.heartbeat_id,
|
|
548
379
|
engine_version=engine_version,
|
|
549
380
|
engine_name=engine_name,
|
|
550
|
-
engine_id=GriptapeNodes.EngineIdentityManager().
|
|
551
|
-
session_id=GriptapeNodes.SessionManager().
|
|
381
|
+
engine_id=GriptapeNodes.EngineIdentityManager().active_engine_id,
|
|
382
|
+
session_id=GriptapeNodes.SessionManager().active_session_id,
|
|
552
383
|
timestamp=datetime.now(tz=UTC).isoformat(),
|
|
553
384
|
result_details="Engine heartbeat successful",
|
|
554
385
|
**instance_info,
|
|
@@ -559,40 +390,6 @@ class GriptapeNodes(metaclass=SingletonMeta):
|
|
|
559
390
|
logger.error(details)
|
|
560
391
|
return EngineHeartbeatResultFailure(heartbeat_id=request.heartbeat_id, result_details=details)
|
|
561
392
|
|
|
562
|
-
def handle_get_engine_name_request(self, request: GetEngineNameRequest) -> ResultPayload: # noqa: ARG002
|
|
563
|
-
"""Handle requests to get the current engine name."""
|
|
564
|
-
try:
|
|
565
|
-
engine_name = GriptapeNodes.EngineIdentityManager().get_engine_name()
|
|
566
|
-
return GetEngineNameResultSuccess(
|
|
567
|
-
engine_name=engine_name, result_details="Engine name retrieved successfully."
|
|
568
|
-
)
|
|
569
|
-
except Exception as err:
|
|
570
|
-
error_message = f"Failed to get engine name: {err}"
|
|
571
|
-
logger.error(error_message)
|
|
572
|
-
return GetEngineNameResultFailure(error_message=error_message, result_details=error_message)
|
|
573
|
-
|
|
574
|
-
def handle_set_engine_name_request(self, request: SetEngineNameRequest) -> ResultPayload:
|
|
575
|
-
"""Handle requests to set a new engine name."""
|
|
576
|
-
try:
|
|
577
|
-
# Validate engine name (basic validation)
|
|
578
|
-
if not request.engine_name or not request.engine_name.strip():
|
|
579
|
-
error_message = "Engine name cannot be empty"
|
|
580
|
-
logger.warning(error_message)
|
|
581
|
-
return SetEngineNameResultFailure(error_message=error_message, result_details=error_message)
|
|
582
|
-
|
|
583
|
-
# Set the new engine name
|
|
584
|
-
GriptapeNodes.EngineIdentityManager().set_engine_name(request.engine_name.strip())
|
|
585
|
-
details = f"Engine name set to: {request.engine_name.strip()}"
|
|
586
|
-
return SetEngineNameResultSuccess(
|
|
587
|
-
engine_name=request.engine_name.strip(),
|
|
588
|
-
result_details=ResultDetails(message=details, level=logging.INFO),
|
|
589
|
-
)
|
|
590
|
-
|
|
591
|
-
except Exception as err:
|
|
592
|
-
error_message = f"Failed to set engine name: {err}"
|
|
593
|
-
logger.error(error_message)
|
|
594
|
-
return SetEngineNameResultFailure(error_message=error_message, result_details=error_message)
|
|
595
|
-
|
|
596
393
|
def _get_instance_info(self) -> dict[str, str | None]:
|
|
597
394
|
"""Get instance information from environment variables.
|
|
598
395
|
|
|
@@ -9,7 +9,6 @@ from pydantic import ValidationError
|
|
|
9
9
|
from xdg_base_dirs import xdg_config_home
|
|
10
10
|
|
|
11
11
|
from griptape_nodes.node_library.library_registry import LibraryRegistry
|
|
12
|
-
from griptape_nodes.retained_mode.events.app_events import AppInitializationComplete
|
|
13
12
|
from griptape_nodes.retained_mode.events.base_events import ResultPayload
|
|
14
13
|
from griptape_nodes.retained_mode.events.config_events import (
|
|
15
14
|
GetConfigCategoryRequest,
|
|
@@ -91,11 +90,6 @@ class ConfigManager:
|
|
|
91
90
|
)
|
|
92
91
|
event_manager.assign_manager_to_request_type(ResetConfigRequest, self.on_handle_reset_config_request)
|
|
93
92
|
|
|
94
|
-
event_manager.add_listener_to_app_event(
|
|
95
|
-
AppInitializationComplete,
|
|
96
|
-
self.on_app_initialization_complete,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
93
|
@property
|
|
100
94
|
def workspace_path(self) -> Path:
|
|
101
95
|
"""Get the base file path from the configuration.
|
|
@@ -231,34 +225,6 @@ class ConfigManager:
|
|
|
231
225
|
)
|
|
232
226
|
self.load_configs()
|
|
233
227
|
|
|
234
|
-
def on_app_initialization_complete(self, _payload: AppInitializationComplete) -> None:
|
|
235
|
-
# We want to ensure that all environment variables from here are pre-filled in the secrets manager.
|
|
236
|
-
env_var_names = self.gather_env_var_names()
|
|
237
|
-
for env_var_name in env_var_names:
|
|
238
|
-
self._update_secret_from_env_var(env_var_name)
|
|
239
|
-
|
|
240
|
-
def gather_env_var_names(self) -> list[str]:
|
|
241
|
-
"""Gather all environment variable names within the config."""
|
|
242
|
-
return self._gather_env_var_names_in_dict(self.merged_config)
|
|
243
|
-
|
|
244
|
-
def _gather_env_var_names_in_dict(self, config: dict) -> list[str]:
|
|
245
|
-
"""Gather all environment variable names from a given config dictionary."""
|
|
246
|
-
env_var_names = []
|
|
247
|
-
for value in config.values():
|
|
248
|
-
if isinstance(value, dict):
|
|
249
|
-
env_var_names.extend(self._gather_env_var_names_in_dict(value))
|
|
250
|
-
elif isinstance(value, str) and value.startswith("$"):
|
|
251
|
-
env_var_names.append(value[1:])
|
|
252
|
-
return env_var_names
|
|
253
|
-
|
|
254
|
-
def _update_secret_from_env_var(self, env_var_name: str) -> None:
|
|
255
|
-
# Lazy load to avoid circular import
|
|
256
|
-
from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
|
|
257
|
-
|
|
258
|
-
if GriptapeNodes.SecretsManager().get_secret(env_var_name, should_error_on_not_found=False) is None:
|
|
259
|
-
# Set a blank one.
|
|
260
|
-
GriptapeNodes.SecretsManager().set_secret(env_var_name, "")
|
|
261
|
-
|
|
262
228
|
def save_user_workflow_json(self, workflow_file_name: str) -> None:
|
|
263
229
|
config_loc = "app_events.on_app_initialization_complete.workflows_to_register"
|
|
264
230
|
existing_workflows = self.get_config_value(config_loc)
|
|
@@ -393,12 +359,6 @@ class ConfigManager:
|
|
|
393
359
|
|
|
394
360
|
self.set_config_value(key=request.category, value=request.contents)
|
|
395
361
|
|
|
396
|
-
# Update any added env vars (this is dumb)
|
|
397
|
-
# TODO: https://github.com/griptape-ai/griptape-nodes/issues/1022
|
|
398
|
-
after_env_vars_set = set(self.gather_env_var_names())
|
|
399
|
-
for after_env_var in after_env_vars_set:
|
|
400
|
-
self._update_secret_from_env_var(after_env_var)
|
|
401
|
-
|
|
402
362
|
result_details = f"Successfully assigned the config dictionary for section '{request.category}'."
|
|
403
363
|
return SetConfigCategoryResultSuccess(result_details=result_details)
|
|
404
364
|
|
|
@@ -518,12 +478,6 @@ class ConfigManager:
|
|
|
518
478
|
# Set the new value
|
|
519
479
|
self.set_config_value(key=request.category_and_key, value=request.value)
|
|
520
480
|
|
|
521
|
-
# Update any added env vars (this is dumb)
|
|
522
|
-
# TODO: https://github.com/griptape-ai/griptape-nodes/issues/1022
|
|
523
|
-
after_env_vars_set = set(self.gather_env_var_names())
|
|
524
|
-
for after_env_var in after_env_vars_set:
|
|
525
|
-
self._update_secret_from_env_var(after_env_var)
|
|
526
|
-
|
|
527
481
|
# For container types, indicate the change with a diff
|
|
528
482
|
if isinstance(request.value, (dict, list)):
|
|
529
483
|
if old_value_copy is not None:
|