griptape-nodes 0.40.0__py3-none-any.whl → 0.42.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.
Files changed (49) hide show
  1. griptape_nodes/app/__init__.py +1 -5
  2. griptape_nodes/app/app.py +12 -9
  3. griptape_nodes/app/app_sessions.py +132 -36
  4. griptape_nodes/app/watch.py +3 -1
  5. griptape_nodes/drivers/storage/local_storage_driver.py +3 -2
  6. griptape_nodes/exe_types/flow.py +68 -368
  7. griptape_nodes/machines/control_flow.py +16 -13
  8. griptape_nodes/machines/node_resolution.py +16 -14
  9. griptape_nodes/node_library/workflow_registry.py +2 -2
  10. griptape_nodes/retained_mode/events/agent_events.py +70 -8
  11. griptape_nodes/retained_mode/events/app_events.py +132 -11
  12. griptape_nodes/retained_mode/events/arbitrary_python_events.py +23 -0
  13. griptape_nodes/retained_mode/events/base_events.py +7 -25
  14. griptape_nodes/retained_mode/events/config_events.py +87 -11
  15. griptape_nodes/retained_mode/events/connection_events.py +56 -5
  16. griptape_nodes/retained_mode/events/context_events.py +27 -4
  17. griptape_nodes/retained_mode/events/execution_events.py +99 -14
  18. griptape_nodes/retained_mode/events/flow_events.py +165 -7
  19. griptape_nodes/retained_mode/events/library_events.py +193 -15
  20. griptape_nodes/retained_mode/events/logger_events.py +11 -0
  21. griptape_nodes/retained_mode/events/node_events.py +243 -22
  22. griptape_nodes/retained_mode/events/object_events.py +40 -4
  23. griptape_nodes/retained_mode/events/os_events.py +13 -2
  24. griptape_nodes/retained_mode/events/parameter_events.py +212 -8
  25. griptape_nodes/retained_mode/events/secrets_events.py +59 -7
  26. griptape_nodes/retained_mode/events/static_file_events.py +57 -4
  27. griptape_nodes/retained_mode/events/validation_events.py +39 -4
  28. griptape_nodes/retained_mode/events/workflow_events.py +188 -17
  29. griptape_nodes/retained_mode/griptape_nodes.py +46 -323
  30. griptape_nodes/retained_mode/managers/agent_manager.py +1 -1
  31. griptape_nodes/retained_mode/managers/engine_identity_manager.py +146 -0
  32. griptape_nodes/retained_mode/managers/event_manager.py +14 -2
  33. griptape_nodes/retained_mode/managers/flow_manager.py +749 -64
  34. griptape_nodes/retained_mode/managers/library_manager.py +112 -2
  35. griptape_nodes/retained_mode/managers/node_manager.py +35 -32
  36. griptape_nodes/retained_mode/managers/object_manager.py +11 -3
  37. griptape_nodes/retained_mode/managers/os_manager.py +70 -1
  38. griptape_nodes/retained_mode/managers/secrets_manager.py +4 -0
  39. griptape_nodes/retained_mode/managers/session_manager.py +328 -0
  40. griptape_nodes/retained_mode/managers/settings.py +7 -0
  41. griptape_nodes/retained_mode/managers/workflow_manager.py +523 -454
  42. griptape_nodes/retained_mode/retained_mode.py +44 -0
  43. griptape_nodes/retained_mode/utils/engine_identity.py +141 -27
  44. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/METADATA +2 -2
  45. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/RECORD +48 -47
  46. griptape_nodes/retained_mode/utils/session_persistence.py +0 -105
  47. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/WHEEL +0 -0
  48. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/entry_points.txt +0 -0
  49. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/licenses/LICENSE +0 -0
@@ -21,6 +21,18 @@ class RunAgentRequestArtifact(dict):
21
21
  @dataclass
22
22
  @PayloadRegistry.register
23
23
  class RunAgentRequest(RequestPayload):
24
+ """Run an agent with input and optional artifacts.
25
+
26
+ Use when: Executing conversational AI interactions, processing user queries,
27
+ running autonomous agents, handling multi-modal inputs with URLs.
28
+
29
+ Args:
30
+ input: Text input to send to the agent
31
+ url_artifacts: List of URL artifacts to include with the request
32
+
33
+ Results: RunAgentResultStarted -> RunAgentResultSuccess (with output) | RunAgentResultFailure (execution error)
34
+ """
35
+
24
36
  input: str
25
37
  url_artifacts: list[RunAgentRequestArtifact]
26
38
 
@@ -28,76 +40,126 @@ class RunAgentRequest(RequestPayload):
28
40
  @dataclass
29
41
  @PayloadRegistry.register
30
42
  class RunAgentResultStarted(WorkflowNotAlteredMixin, ResultPayloadSuccess):
31
- pass
43
+ """Agent execution started successfully. Execution will continue asynchronously."""
32
44
 
33
45
 
34
46
  @dataclass
35
47
  @PayloadRegistry.register
36
48
  class RunAgentResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
49
+ """Agent execution completed successfully.
50
+
51
+ Args:
52
+ output: Dictionary containing agent response and execution results
53
+ """
54
+
37
55
  output: dict
38
56
 
39
57
 
40
58
  @dataclass
41
59
  @PayloadRegistry.register
42
60
  class RunAgentResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
61
+ """Agent execution failed.
62
+
63
+ Args:
64
+ error: Dictionary containing error details and failure information
65
+ """
66
+
43
67
  error: dict
44
68
 
45
69
 
46
70
  @dataclass
47
71
  @PayloadRegistry.register
48
72
  class GetConversationMemoryRequest(RequestPayload):
49
- pass
73
+ """Get the agent's conversation memory.
74
+
75
+ Use when: Reviewing conversation history, implementing memory inspection,
76
+ debugging agent behavior, displaying conversation context.
77
+
78
+ Results: GetConversationMemoryResultSuccess (with runs) | GetConversationMemoryResultFailure (memory error)
79
+ """
50
80
 
51
81
 
52
82
  @dataclass
53
83
  @PayloadRegistry.register
54
84
  class GetConversationMemoryResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
85
+ """Conversation memory retrieved successfully.
86
+
87
+ Args:
88
+ runs: List of conversation runs (exchanges between user and agent)
89
+ """
90
+
55
91
  runs: list[Run]
56
92
 
57
93
 
58
94
  @dataclass
59
95
  @PayloadRegistry.register
60
96
  class GetConversationMemoryResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
61
- pass
97
+ """Conversation memory retrieval failed. Common causes: memory not initialized, access error."""
62
98
 
63
99
 
64
100
  @dataclass
65
101
  @PayloadRegistry.register
66
102
  class ConfigureAgentRequest(RequestPayload):
103
+ """Configure agent settings and behavior.
104
+
105
+ Use when: Setting up agent parameters, changing model configurations,
106
+ customizing agent behavior, updating agent settings.
107
+
108
+ Args:
109
+ prompt_driver: Dictionary of prompt driver configuration options
110
+
111
+ Results: ConfigureAgentResultSuccess | ConfigureAgentResultFailure (configuration error)
112
+ """
113
+
67
114
  prompt_driver: dict = field(default_factory=dict)
68
115
 
69
116
 
70
117
  @dataclass
71
118
  @PayloadRegistry.register
72
119
  class ConfigureAgentResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
73
- pass
120
+ """Agent configured successfully. New settings are now active."""
74
121
 
75
122
 
76
123
  @dataclass
77
124
  @PayloadRegistry.register
78
125
  class ConfigureAgentResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
79
- pass
126
+ """Agent configuration failed. Common causes: invalid parameters, configuration error."""
80
127
 
81
128
 
82
129
  @dataclass
83
130
  @PayloadRegistry.register
84
131
  class ResetAgentConversationMemoryRequest(RequestPayload):
85
- pass
132
+ """Reset the agent's conversation memory.
133
+
134
+ Use when: Starting fresh conversations, clearing conversation history,
135
+ resolving memory issues, implementing conversation reset features.
136
+
137
+ Results: ResetAgentConversationMemoryResultSuccess | ResetAgentConversationMemoryResultFailure (reset error)
138
+ """
86
139
 
87
140
 
88
141
  @dataclass
89
142
  @PayloadRegistry.register
90
143
  class ResetAgentConversationMemoryResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
91
- pass
144
+ """Agent conversation memory reset successfully. All previous conversation history cleared."""
92
145
 
93
146
 
94
147
  @dataclass
95
148
  @PayloadRegistry.register
96
149
  class ResetAgentConversationMemoryResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
97
- pass
150
+ """Agent conversation memory reset failed. Common causes: memory access error, system constraints."""
98
151
 
99
152
 
100
153
  @dataclass
101
154
  @PayloadRegistry.register
102
155
  class AgentStreamEvent(ExecutionPayload):
156
+ """Streaming token event during agent execution.
157
+
158
+ Use when: Implementing real-time agent output, displaying progressive responses,
159
+ building streaming UIs, monitoring agent token generation.
160
+
161
+ Args:
162
+ token: Individual token generated by the agent during execution
163
+ """
164
+
103
165
  token: str
@@ -13,6 +13,17 @@ from griptape_nodes.retained_mode.events.payload_registry import PayloadRegistry
13
13
  @dataclass
14
14
  @PayloadRegistry.register
15
15
  class AppStartSessionRequest(RequestPayload):
16
+ """Start a new application session.
17
+
18
+ Use when: Initializing client connections, beginning new workflow sessions,
19
+ setting up isolated execution environments, managing session state.
20
+
21
+ Args:
22
+ session_id: Specific session ID to use (None for auto-generated)
23
+
24
+ Results: AppStartSessionResultSuccess (with session ID) | AppStartSessionResultFailure (session creation error)
25
+ """
26
+
16
27
  # TODO: https://github.com/griptape-ai/griptape-nodes/issues/1600
17
28
  session_id: str | None = None
18
29
 
@@ -20,48 +31,80 @@ class AppStartSessionRequest(RequestPayload):
20
31
  @dataclass
21
32
  @PayloadRegistry.register
22
33
  class AppStartSessionResultSuccess(ResultPayloadSuccess):
34
+ """Session started successfully.
35
+
36
+ Args:
37
+ session_id: Unique identifier for the created session
38
+ """
39
+
23
40
  session_id: str
24
41
 
25
42
 
26
43
  @dataclass
27
44
  @PayloadRegistry.register
28
45
  class AppStartSessionResultFailure(ResultPayloadFailure):
29
- pass
46
+ """Session start failed. Common causes: resource constraints, initialization error."""
30
47
 
31
48
 
32
49
  @dataclass
33
50
  @PayloadRegistry.register
34
51
  class AppGetSessionRequest(RequestPayload):
35
- pass
52
+ """Get the current session information.
53
+
54
+ Use when: Checking session status, retrieving session details,
55
+ validating session state, debugging session issues.
56
+
57
+ Results: AppGetSessionResultSuccess (with session ID) | AppGetSessionResultFailure (session error)
58
+ """
36
59
 
37
60
 
38
61
  @dataclass
39
62
  @PayloadRegistry.register
40
63
  class AppGetSessionResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
64
+ """Session information retrieved successfully.
65
+
66
+ Args:
67
+ session_id: Current session identifier (None if no active session)
68
+ """
69
+
41
70
  session_id: str | None
42
71
 
43
72
 
44
73
  @dataclass
45
74
  @PayloadRegistry.register
46
75
  class AppGetSessionResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
47
- pass
76
+ """Session information retrieval failed. Common causes: session not found, access error."""
48
77
 
49
78
 
50
79
  @dataclass
51
80
  @PayloadRegistry.register
52
81
  class AppInitializationComplete(AppPayload):
53
- pass
82
+ """Application initialization completed successfully. All subsystems ready."""
54
83
 
55
84
 
56
85
  @dataclass
57
86
  @PayloadRegistry.register
58
87
  class GetEngineVersionRequest(RequestPayload):
59
- pass
88
+ """Get the engine version information.
89
+
90
+ Use when: Checking compatibility, displaying version info,
91
+ debugging engine issues, validating engine capabilities.
92
+
93
+ Results: GetEngineVersionResultSuccess (with version numbers) | GetEngineVersionResultFailure (version error)
94
+ """
60
95
 
61
96
 
62
97
  @dataclass
63
98
  @PayloadRegistry.register
64
99
  class GetEngineVersionResultSuccess(ResultPayloadSuccess):
100
+ """Engine version retrieved successfully.
101
+
102
+ Args:
103
+ major: Major version number
104
+ minor: Minor version number
105
+ patch: Patch version number
106
+ """
107
+
65
108
  major: int
66
109
  minor: int
67
110
  patch: int
@@ -70,25 +113,37 @@ class GetEngineVersionResultSuccess(ResultPayloadSuccess):
70
113
  @dataclass
71
114
  @PayloadRegistry.register
72
115
  class GetEngineVersionResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
73
- pass
116
+ """Engine version retrieval failed. Common causes: version not available, system error."""
74
117
 
75
118
 
76
119
  @dataclass
77
120
  @PayloadRegistry.register
78
121
  class AppEndSessionRequest(RequestPayload):
79
- pass
122
+ """End the current application session.
123
+
124
+ Use when: Closing client connections, cleaning up session resources,
125
+ terminating workflow sessions, implementing logout functionality.
126
+
127
+ Results: AppEndSessionResultSuccess (with session ID) | AppEndSessionResultFailure (cleanup error)
128
+ """
80
129
 
81
130
 
82
131
  @dataclass
83
132
  @PayloadRegistry.register
84
133
  class AppEndSessionResultSuccess(ResultPayloadSuccess):
134
+ """Session ended successfully.
135
+
136
+ Args:
137
+ session_id: Identifier of the ended session (None if no session was active)
138
+ """
139
+
85
140
  session_id: str | None
86
141
 
87
142
 
88
143
  @dataclass
89
144
  @PayloadRegistry.register
90
145
  class AppEndSessionResultFailure(ResultPayloadFailure):
91
- pass
146
+ """Session end failed. Common causes: session not found, cleanup error."""
92
147
 
93
148
 
94
149
  @dataclass
@@ -100,13 +155,13 @@ class SessionHeartbeatRequest(RequestPayload):
100
155
  @dataclass
101
156
  @PayloadRegistry.register
102
157
  class SessionHeartbeatResultSuccess(ResultPayloadSuccess):
103
- pass
158
+ """Session heartbeat successful. Session is active and responsive."""
104
159
 
105
160
 
106
161
  @dataclass
107
162
  @PayloadRegistry.register
108
163
  class SessionHeartbeatResultFailure(ResultPayloadFailure):
109
- pass
164
+ """Session heartbeat failed. Common causes: session inactive, network error, timeout."""
110
165
 
111
166
 
112
167
  @dataclass
@@ -125,6 +180,25 @@ class EngineHeartbeatRequest(RequestPayload):
125
180
  @dataclass
126
181
  @PayloadRegistry.register
127
182
  class EngineHeartbeatResultSuccess(ResultPayloadSuccess):
183
+ """Engine heartbeat successful with comprehensive status information.
184
+
185
+ Args:
186
+ heartbeat_id: Unique identifier correlating with the request
187
+ engine_version: Current engine version string
188
+ engine_id: Unique engine identifier (None if not set)
189
+ session_id: Current session identifier (None if no session)
190
+ timestamp: Heartbeat timestamp
191
+ instance_type: Cloud instance type (None if not applicable)
192
+ instance_region: Cloud instance region (None if not applicable)
193
+ instance_provider: Cloud provider name (None if not applicable)
194
+ deployment_type: Type of deployment (None if not applicable)
195
+ public_ip: Public IP address (None if not available)
196
+ current_workflow: Name of active workflow (None if none)
197
+ workflow_file_path: Path to workflow file (None if none)
198
+ has_active_flow: Whether there's an active flow running
199
+ engine_name: Human-readable engine name
200
+ """
201
+
128
202
  heartbeat_id: str
129
203
  engine_version: str
130
204
  engine_id: str | None
@@ -144,40 +218,87 @@ class EngineHeartbeatResultSuccess(ResultPayloadSuccess):
144
218
  @dataclass
145
219
  @PayloadRegistry.register
146
220
  class EngineHeartbeatResultFailure(ResultPayloadFailure):
221
+ """Engine heartbeat failed.
222
+
223
+ Args:
224
+ heartbeat_id: Unique identifier correlating with the request
225
+ """
226
+
147
227
  heartbeat_id: str
148
228
 
149
229
 
150
230
  @dataclass
151
231
  @PayloadRegistry.register
152
232
  class SetEngineNameRequest(RequestPayload):
233
+ """Set the human-readable engine name.
234
+
235
+ Use when: Customizing engine identification, setting up engine instances,
236
+ implementing engine management, branding engine instances.
237
+
238
+ Args:
239
+ engine_name: New name for the engine
240
+
241
+ Results: SetEngineNameResultSuccess (with name) | SetEngineNameResultFailure (validation error)
242
+ """
243
+
153
244
  engine_name: str
154
245
 
155
246
 
156
247
  @dataclass
157
248
  @PayloadRegistry.register
158
249
  class SetEngineNameResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
250
+ """Engine name set successfully.
251
+
252
+ Args:
253
+ engine_name: The name that was set for the engine
254
+ """
255
+
159
256
  engine_name: str
160
257
 
161
258
 
162
259
  @dataclass
163
260
  @PayloadRegistry.register
164
261
  class SetEngineNameResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
262
+ """Engine name setting failed.
263
+
264
+ Args:
265
+ error_message: Detailed error message describing the failure
266
+ """
267
+
165
268
  error_message: str
166
269
 
167
270
 
168
271
  @dataclass
169
272
  @PayloadRegistry.register
170
273
  class GetEngineNameRequest(RequestPayload):
171
- pass
274
+ """Get the current engine name.
275
+
276
+ Use when: Displaying engine information, checking engine identity,
277
+ implementing engine management UIs, debugging engine issues.
278
+
279
+ Results: GetEngineNameResultSuccess (with name) | GetEngineNameResultFailure (retrieval error)
280
+ """
172
281
 
173
282
 
174
283
  @dataclass
175
284
  @PayloadRegistry.register
176
285
  class GetEngineNameResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
286
+ """Engine name retrieved successfully.
287
+
288
+ Args:
289
+ engine_name: Current engine name
290
+ """
291
+
177
292
  engine_name: str
178
293
 
179
294
 
180
295
  @dataclass
181
296
  @PayloadRegistry.register
182
297
  class GetEngineNameResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
298
+ """Engine name retrieval failed.
299
+
300
+ Args:
301
+ error_message: Detailed error message describing the failure
302
+ """
303
+
183
304
  error_message: str
@@ -15,16 +15,39 @@ from griptape_nodes.retained_mode.events.payload_registry import PayloadRegistry
15
15
  @dataclass
16
16
  @PayloadRegistry.register
17
17
  class RunArbitraryPythonStringRequest(RequestPayload):
18
+ """Execute arbitrary Python code string.
19
+
20
+ Use when: Development/debugging, testing code snippets, prototyping,
21
+ educational purposes. WARNING: This is configurable behavior that can be disabled.
22
+
23
+ Args:
24
+ python_string: Python code string to execute
25
+
26
+ Results: RunArbitraryPythonStringResultSuccess (with output) | RunArbitraryPythonStringResultFailure (execution error)
27
+ """
28
+
18
29
  python_string: str
19
30
 
20
31
 
21
32
  @dataclass
22
33
  @PayloadRegistry.register
23
34
  class RunArbitraryPythonStringResultSuccess(ResultPayloadSuccess):
35
+ """Python code executed successfully.
36
+
37
+ Args:
38
+ python_output: String output from the executed Python code
39
+ """
40
+
24
41
  python_output: str
25
42
 
26
43
 
27
44
  @dataclass
28
45
  @PayloadRegistry.register
29
46
  class RunArbitraryPythonStringResultFailure(ResultPayloadFailure):
47
+ """Python code execution failed.
48
+
49
+ Args:
50
+ python_output: Error output from the failed Python code execution
51
+ """
52
+
30
53
  python_output: str
@@ -12,9 +12,6 @@ from griptape.structures import Structure
12
12
  from griptape.tools import BaseTool
13
13
  from pydantic import BaseModel, Field
14
14
 
15
- from griptape_nodes.retained_mode.utils.engine_identity import EngineIdentity
16
- from griptape_nodes.retained_mode.utils.session_persistence import SessionPersistence
17
-
18
15
  if TYPE_CHECKING:
19
16
  import builtins
20
17
 
@@ -113,32 +110,13 @@ A = TypeVar("A", bound=AppPayload)
113
110
  class BaseEvent(BaseModel, ABC):
114
111
  """Abstract base class for all events."""
115
112
 
116
- # Keeping here instead of in GriptapeNodes to avoid circular import hell.
117
- # TODO: https://github.com/griptape-ai/griptape-nodes/issues/848
118
- _session_id: ClassVar[str | None] = None
113
+ # Instance fields for engine and session identification
119
114
  _engine_id: ClassVar[str | None] = None
115
+ _session_id: ClassVar[str | None] = None
120
116
 
121
- # Instance variables with a default_factory that references the class variable
122
117
  engine_id: str | None = Field(default_factory=lambda: BaseEvent._engine_id)
123
118
  session_id: str | None = Field(default_factory=lambda: BaseEvent._session_id)
124
119
 
125
- @classmethod
126
- def initialize_engine_id(cls) -> None:
127
- """Initialize the engine ID if not already set."""
128
- if cls._engine_id is None:
129
- persisted_engine_id = cls._engine_id = EngineIdentity.get_engine_id()
130
- if persisted_engine_id:
131
- cls._engine_id = persisted_engine_id
132
-
133
- @classmethod
134
- def initialize_session_id(cls) -> None:
135
- """Initialize the session ID from persisted storage if available."""
136
- if cls._session_id is None:
137
- # Check if there's a persisted session ID
138
- persisted_session_id = SessionPersistence.get_persisted_session_id()
139
- if persisted_session_id:
140
- cls._session_id = persisted_session_id
141
-
142
120
  # Custom JSON encoder for the payload
143
121
  class Config:
144
122
  """Pydantic configuration for the BaseEvent class."""
@@ -207,6 +185,8 @@ class EventRequest(BaseEvent, Generic[P]):
207
185
  """Request event."""
208
186
 
209
187
  request: P
188
+ request_id: str | None = None
189
+ response_topic: str | None = None
210
190
 
211
191
  def __init__(self, **data) -> None:
212
192
  """Initialize an EventRequest, inferring the generic type if needed."""
@@ -262,7 +242,7 @@ class EventRequest(BaseEvent, Generic[P]):
262
242
  raise ValueError(msg)
263
243
 
264
244
  # Create the event instance with the payload
265
- return cls(request=request_payload)
245
+ return cls(request=request_payload, **event_data)
266
246
 
267
247
 
268
248
  class EventResult(BaseEvent, Generic[P, R], ABC):
@@ -270,6 +250,8 @@ class EventResult(BaseEvent, Generic[P, R], ABC):
270
250
 
271
251
  request: P
272
252
  result: R
253
+ request_id: str | None = None
254
+ response_topic: str | None = None
273
255
  retained_mode: str | None = None
274
256
 
275
257
  def __init__(self, **data) -> None: