griptape-nodes-engine 0.84.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 (353) hide show
  1. griptape_nodes/__init__.py +24 -0
  2. griptape_nodes/__main__.py +6 -0
  3. griptape_nodes/api_client/__init__.py +9 -0
  4. griptape_nodes/api_client/client.py +362 -0
  5. griptape_nodes/api_client/request_client.py +334 -0
  6. griptape_nodes/app/.python-version +1 -0
  7. griptape_nodes/app/__init__.py +5 -0
  8. griptape_nodes/app/app.py +687 -0
  9. griptape_nodes/app/engine_log.py +96 -0
  10. griptape_nodes/app/watch.py +54 -0
  11. griptape_nodes/bootstrap/__init__.py +1 -0
  12. griptape_nodes/bootstrap/utils/__init__.py +1 -0
  13. griptape_nodes/bootstrap/utils/python_subprocess_executor.py +177 -0
  14. griptape_nodes/bootstrap/utils/subprocess_websocket_base.py +98 -0
  15. griptape_nodes/bootstrap/utils/subprocess_websocket_listener.py +126 -0
  16. griptape_nodes/bootstrap/utils/subprocess_websocket_sender.py +120 -0
  17. griptape_nodes/bootstrap/workflow_executors/__init__.py +1 -0
  18. griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +232 -0
  19. griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +299 -0
  20. griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +187 -0
  21. griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +1 -0
  22. griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +62 -0
  23. griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +43 -0
  24. griptape_nodes/bootstrap/workflow_publishers/__init__.py +1 -0
  25. griptape_nodes/bootstrap/workflow_publishers/local_session_workflow_publisher.py +211 -0
  26. griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +41 -0
  27. griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +108 -0
  28. griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +1 -0
  29. griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +93 -0
  30. griptape_nodes/cli/__init__.py +1 -0
  31. griptape_nodes/cli/commands/__init__.py +1 -0
  32. griptape_nodes/cli/commands/config.py +74 -0
  33. griptape_nodes/cli/commands/doctor/__init__.py +43 -0
  34. griptape_nodes/cli/commands/doctor/base.py +20 -0
  35. griptape_nodes/cli/commands/doctor/websocket_connection.py +74 -0
  36. griptape_nodes/cli/commands/engine.py +66 -0
  37. griptape_nodes/cli/commands/init.py +695 -0
  38. griptape_nodes/cli/commands/libraries.py +108 -0
  39. griptape_nodes/cli/commands/models.py +549 -0
  40. griptape_nodes/cli/commands/self.py +204 -0
  41. griptape_nodes/cli/main.py +63 -0
  42. griptape_nodes/cli/shared.py +74 -0
  43. griptape_nodes/common/__init__.py +1 -0
  44. griptape_nodes/common/directed_graph.py +71 -0
  45. griptape_nodes/common/macro_parser/__init__.py +44 -0
  46. griptape_nodes/common/macro_parser/core.py +251 -0
  47. griptape_nodes/common/macro_parser/exceptions.py +126 -0
  48. griptape_nodes/common/macro_parser/formats.py +179 -0
  49. griptape_nodes/common/macro_parser/matching.py +137 -0
  50. griptape_nodes/common/macro_parser/parsing.py +212 -0
  51. griptape_nodes/common/macro_parser/resolution.py +186 -0
  52. griptape_nodes/common/macro_parser/segments.py +45 -0
  53. griptape_nodes/common/node_executor.py +3837 -0
  54. griptape_nodes/common/project_templates/__init__.py +49 -0
  55. griptape_nodes/common/project_templates/default_project_template.py +168 -0
  56. griptape_nodes/common/project_templates/defaults/README.md +36 -0
  57. griptape_nodes/common/project_templates/directory.py +67 -0
  58. griptape_nodes/common/project_templates/loader.py +396 -0
  59. griptape_nodes/common/project_templates/project.py +384 -0
  60. griptape_nodes/common/project_templates/situation.py +143 -0
  61. griptape_nodes/common/project_templates/validation.py +142 -0
  62. griptape_nodes/drivers/__init__.py +1 -0
  63. griptape_nodes/drivers/image_metadata/__init__.py +21 -0
  64. griptape_nodes/drivers/image_metadata/base_image_metadata_driver.py +63 -0
  65. griptape_nodes/drivers/image_metadata/exif_metadata_driver.py +218 -0
  66. griptape_nodes/drivers/image_metadata/image_metadata_driver_registry.py +55 -0
  67. griptape_nodes/drivers/image_metadata/png_metadata_driver.py +71 -0
  68. griptape_nodes/drivers/storage/__init__.py +8 -0
  69. griptape_nodes/drivers/storage/base_storage_driver.py +205 -0
  70. griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +627 -0
  71. griptape_nodes/drivers/storage/local_storage_driver.py +225 -0
  72. griptape_nodes/drivers/storage/storage_backend.py +10 -0
  73. griptape_nodes/drivers/thread_storage/__init__.py +15 -0
  74. griptape_nodes/drivers/thread_storage/base_thread_storage_driver.py +106 -0
  75. griptape_nodes/drivers/thread_storage/griptape_cloud_thread_storage_driver.py +213 -0
  76. griptape_nodes/drivers/thread_storage/local_thread_storage_driver.py +138 -0
  77. griptape_nodes/drivers/thread_storage/thread_storage_backend.py +10 -0
  78. griptape_nodes/exe_types/__init__.py +1 -0
  79. griptape_nodes/exe_types/base_iterative_nodes.py +1128 -0
  80. griptape_nodes/exe_types/connections.py +455 -0
  81. griptape_nodes/exe_types/core_types.py +3102 -0
  82. griptape_nodes/exe_types/flow.py +145 -0
  83. griptape_nodes/exe_types/node_groups/__init__.py +17 -0
  84. griptape_nodes/exe_types/node_groups/base_iterative_node_group.py +252 -0
  85. griptape_nodes/exe_types/node_groups/base_node_group.py +118 -0
  86. griptape_nodes/exe_types/node_groups/base_while_node_group.py +176 -0
  87. griptape_nodes/exe_types/node_groups/subflow_node_group.py +1043 -0
  88. griptape_nodes/exe_types/node_types.py +2095 -0
  89. griptape_nodes/exe_types/param_components/README.md +414 -0
  90. griptape_nodes/exe_types/param_components/__init__.py +1 -0
  91. griptape_nodes/exe_types/param_components/api_key_provider_parameter.py +200 -0
  92. griptape_nodes/exe_types/param_components/artifact_url/__init__.py +1 -0
  93. griptape_nodes/exe_types/param_components/artifact_url/public_artifact_url_parameter.py +141 -0
  94. griptape_nodes/exe_types/param_components/execution_status_component.py +161 -0
  95. griptape_nodes/exe_types/param_components/huggingface/__init__.py +1 -0
  96. griptape_nodes/exe_types/param_components/huggingface/huggingface_model_parameter.py +170 -0
  97. griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_file_parameter.py +112 -0
  98. griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter.py +102 -0
  99. griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_variant_parameter.py +152 -0
  100. griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py +136 -0
  101. griptape_nodes/exe_types/param_components/log_parameter.py +140 -0
  102. griptape_nodes/exe_types/param_components/progress_bar_component.py +57 -0
  103. griptape_nodes/exe_types/param_components/project_file_parameter.py +235 -0
  104. griptape_nodes/exe_types/param_components/seed_parameter.py +58 -0
  105. griptape_nodes/exe_types/param_components/subflow_execution_component.py +310 -0
  106. griptape_nodes/exe_types/param_types/__init__.py +1 -0
  107. griptape_nodes/exe_types/param_types/parameter_audio.py +267 -0
  108. griptape_nodes/exe_types/param_types/parameter_bool.py +230 -0
  109. griptape_nodes/exe_types/param_types/parameter_button.py +458 -0
  110. griptape_nodes/exe_types/param_types/parameter_dict.py +157 -0
  111. griptape_nodes/exe_types/param_types/parameter_float.py +188 -0
  112. griptape_nodes/exe_types/param_types/parameter_image.py +268 -0
  113. griptape_nodes/exe_types/param_types/parameter_int.py +192 -0
  114. griptape_nodes/exe_types/param_types/parameter_json.py +274 -0
  115. griptape_nodes/exe_types/param_types/parameter_number.py +393 -0
  116. griptape_nodes/exe_types/param_types/parameter_range.py +399 -0
  117. griptape_nodes/exe_types/param_types/parameter_string.py +276 -0
  118. griptape_nodes/exe_types/param_types/parameter_three_d.py +237 -0
  119. griptape_nodes/exe_types/param_types/parameter_video.py +267 -0
  120. griptape_nodes/files/__init__.py +19 -0
  121. griptape_nodes/files/base_file_driver.py +89 -0
  122. griptape_nodes/files/derivation.py +163 -0
  123. griptape_nodes/files/drivers/__init__.py +20 -0
  124. griptape_nodes/files/drivers/base64_file_driver.py +118 -0
  125. griptape_nodes/files/drivers/data_uri_file_driver.py +89 -0
  126. griptape_nodes/files/drivers/griptape_cloud_file_driver.py +193 -0
  127. griptape_nodes/files/drivers/http_file_driver.py +87 -0
  128. griptape_nodes/files/drivers/local_file_driver.py +158 -0
  129. griptape_nodes/files/drivers/static_server_file_driver.py +138 -0
  130. griptape_nodes/files/file.py +828 -0
  131. griptape_nodes/files/file_driver.py +20 -0
  132. griptape_nodes/files/file_driver_registry.py +66 -0
  133. griptape_nodes/files/path_utils.py +639 -0
  134. griptape_nodes/files/project_file.py +171 -0
  135. griptape_nodes/machines/__init__.py +1 -0
  136. griptape_nodes/machines/control_flow.py +349 -0
  137. griptape_nodes/machines/dag_builder.py +450 -0
  138. griptape_nodes/machines/fsm.py +88 -0
  139. griptape_nodes/machines/heuristics/__init__.py +13 -0
  140. griptape_nodes/machines/heuristics/base_heuristic.py +48 -0
  141. griptape_nodes/machines/heuristics/distance_to_node.py +92 -0
  142. griptape_nodes/machines/heuristics/has_connection_from_previous.py +61 -0
  143. griptape_nodes/machines/heuristics/top_left_to_bottom_right.py +78 -0
  144. griptape_nodes/machines/node_priority_queue.py +161 -0
  145. griptape_nodes/machines/parallel_resolution.py +771 -0
  146. griptape_nodes/mcp_server/__init__.py +1 -0
  147. griptape_nodes/node_library/__init__.py +1 -0
  148. griptape_nodes/node_library/advanced_node_library.py +51 -0
  149. griptape_nodes/node_library/library_registry.py +518 -0
  150. griptape_nodes/node_library/workflow_registry.py +365 -0
  151. griptape_nodes/py.typed +0 -0
  152. griptape_nodes/retained_mode/__init__.py +1 -0
  153. griptape_nodes/retained_mode/events/__init__.py +1 -0
  154. griptape_nodes/retained_mode/events/agent_events.py +392 -0
  155. griptape_nodes/retained_mode/events/app_events.py +459 -0
  156. griptape_nodes/retained_mode/events/arbitrary_python_events.py +53 -0
  157. griptape_nodes/retained_mode/events/artifact_events.py +379 -0
  158. griptape_nodes/retained_mode/events/base_events.py +503 -0
  159. griptape_nodes/retained_mode/events/config_events.py +226 -0
  160. griptape_nodes/retained_mode/events/connection_events.py +147 -0
  161. griptape_nodes/retained_mode/events/context_events.py +91 -0
  162. griptape_nodes/retained_mode/events/event_converter.py +180 -0
  163. griptape_nodes/retained_mode/events/execution_events.py +513 -0
  164. griptape_nodes/retained_mode/events/flow_events.py +582 -0
  165. griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +30 -0
  166. griptape_nodes/retained_mode/events/library_events.py +1123 -0
  167. griptape_nodes/retained_mode/events/logger_events.py +26 -0
  168. griptape_nodes/retained_mode/events/mcp_events.py +368 -0
  169. griptape_nodes/retained_mode/events/model_events.py +296 -0
  170. griptape_nodes/retained_mode/events/node_events.py +1106 -0
  171. griptape_nodes/retained_mode/events/object_events.py +83 -0
  172. griptape_nodes/retained_mode/events/os_events.py +736 -0
  173. griptape_nodes/retained_mode/events/parameter_events.py +798 -0
  174. griptape_nodes/retained_mode/events/payload_registry.py +60 -0
  175. griptape_nodes/retained_mode/events/project_events.py +627 -0
  176. griptape_nodes/retained_mode/events/resource_events.py +291 -0
  177. griptape_nodes/retained_mode/events/secrets_events.py +137 -0
  178. griptape_nodes/retained_mode/events/static_file_events.py +194 -0
  179. griptape_nodes/retained_mode/events/sync_events.py +60 -0
  180. griptape_nodes/retained_mode/events/validation_events.py +88 -0
  181. griptape_nodes/retained_mode/events/variable_events.py +364 -0
  182. griptape_nodes/retained_mode/events/worker_events.py +134 -0
  183. griptape_nodes/retained_mode/events/workflow_events.py +1123 -0
  184. griptape_nodes/retained_mode/file_metadata/__init__.py +1 -0
  185. griptape_nodes/retained_mode/file_metadata/sidecar_metadata.py +141 -0
  186. griptape_nodes/retained_mode/file_metadata/workflow_metadata.py +231 -0
  187. griptape_nodes/retained_mode/griptape_nodes.py +516 -0
  188. griptape_nodes/retained_mode/managers/__init__.py +1 -0
  189. griptape_nodes/retained_mode/managers/agent_manager.py +621 -0
  190. griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +71 -0
  191. griptape_nodes/retained_mode/managers/artifact_manager.py +1477 -0
  192. griptape_nodes/retained_mode/managers/artifact_providers/__init__.py +29 -0
  193. griptape_nodes/retained_mode/managers/artifact_providers/artifact_schema_models.py +80 -0
  194. griptape_nodes/retained_mode/managers/artifact_providers/base_artifact_preview_generator.py +134 -0
  195. griptape_nodes/retained_mode/managers/artifact_providers/base_artifact_provider.py +245 -0
  196. griptape_nodes/retained_mode/managers/artifact_providers/base_generator_parameters.py +96 -0
  197. griptape_nodes/retained_mode/managers/artifact_providers/image/__init__.py +9 -0
  198. griptape_nodes/retained_mode/managers/artifact_providers/image/image_artifact_provider.py +179 -0
  199. griptape_nodes/retained_mode/managers/artifact_providers/image/preview_generators/__init__.py +13 -0
  200. griptape_nodes/retained_mode/managers/artifact_providers/image/preview_generators/pil_rounded_preview_generator.py +236 -0
  201. griptape_nodes/retained_mode/managers/artifact_providers/image/preview_generators/pil_thumbnail_generator.py +155 -0
  202. griptape_nodes/retained_mode/managers/artifact_providers/provider_registry.py +189 -0
  203. griptape_nodes/retained_mode/managers/artifact_providers/utils.py +5 -0
  204. griptape_nodes/retained_mode/managers/artifact_providers/video/__init__.py +9 -0
  205. griptape_nodes/retained_mode/managers/artifact_providers/video/preview_generators/__init__.py +9 -0
  206. griptape_nodes/retained_mode/managers/artifact_providers/video/preview_generators/ffmpeg_preview_generator.py +181 -0
  207. griptape_nodes/retained_mode/managers/artifact_providers/video/video_artifact_provider.py +181 -0
  208. griptape_nodes/retained_mode/managers/config_manager.py +857 -0
  209. griptape_nodes/retained_mode/managers/context_manager.py +672 -0
  210. griptape_nodes/retained_mode/managers/engine_identity_manager.py +297 -0
  211. griptape_nodes/retained_mode/managers/event_manager.py +697 -0
  212. griptape_nodes/retained_mode/managers/fitness_problems/__init__.py +1 -0
  213. griptape_nodes/retained_mode/managers/fitness_problems/libraries/__init__.py +65 -0
  214. griptape_nodes/retained_mode/managers/fitness_problems/libraries/advanced_library_load_failure_problem.py +33 -0
  215. griptape_nodes/retained_mode/managers/fitness_problems/libraries/after_library_callback_problem.py +32 -0
  216. griptape_nodes/retained_mode/managers/fitness_problems/libraries/before_library_callback_problem.py +32 -0
  217. griptape_nodes/retained_mode/managers/fitness_problems/libraries/create_config_category_problem.py +32 -0
  218. griptape_nodes/retained_mode/managers/fitness_problems/libraries/dependency_installation_failed_problem.py +32 -0
  219. griptape_nodes/retained_mode/managers/fitness_problems/libraries/deprecated_node_warning_problem.py +83 -0
  220. griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_library_problem.py +28 -0
  221. griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_node_registration_problem.py +44 -0
  222. griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_widget_registration_problem.py +44 -0
  223. griptape_nodes/retained_mode/managers/fitness_problems/libraries/engine_version_error_problem.py +28 -0
  224. griptape_nodes/retained_mode/managers/fitness_problems/libraries/incompatible_requirements_problem.py +34 -0
  225. griptape_nodes/retained_mode/managers/fitness_problems/libraries/insufficient_disk_space_problem.py +33 -0
  226. griptape_nodes/retained_mode/managers/fitness_problems/libraries/invalid_version_string_problem.py +32 -0
  227. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_engine_version_too_new_problem.py +45 -0
  228. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_json_decode_problem.py +28 -0
  229. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_load_exception_problem.py +32 -0
  230. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_not_found_problem.py +30 -0
  231. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_problem.py +20 -0
  232. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_exception_problem.py +32 -0
  233. griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_validation_problem.py +38 -0
  234. griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_deprecation_warning_problem.py +44 -0
  235. griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_removed_problem.py +44 -0
  236. griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_base_node_problem.py +40 -0
  237. griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_found_problem.py +38 -0
  238. griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_module_import_problem.py +53 -0
  239. griptape_nodes/retained_mode/managers/fitness_problems/libraries/old_xdg_location_warning_problem.py +43 -0
  240. griptape_nodes/retained_mode/managers/fitness_problems/libraries/sandbox_directory_missing_problem.py +28 -0
  241. griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_incompatible_problem.py +44 -0
  242. griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_warning_problem.py +35 -0
  243. griptape_nodes/retained_mode/managers/fitness_problems/libraries/update_config_category_problem.py +32 -0
  244. griptape_nodes/retained_mode/managers/fitness_problems/libraries/venv_creation_failed_problem.py +32 -0
  245. griptape_nodes/retained_mode/managers/fitness_problems/workflows/__init__.py +75 -0
  246. griptape_nodes/retained_mode/managers/fitness_problems/workflows/deprecated_node_in_workflow_problem.py +83 -0
  247. griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_dependency_version_string_problem.py +38 -0
  248. griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_library_version_string_problem.py +38 -0
  249. griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_schema_problem.py +31 -0
  250. griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_section_count_problem.py +31 -0
  251. griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_toml_format_problem.py +30 -0
  252. griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_not_registered_problem.py +35 -0
  253. griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_below_required_problem.py +41 -0
  254. griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_large_difference_problem.py +41 -0
  255. griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_major_mismatch_problem.py +41 -0
  256. griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_minor_difference_problem.py +41 -0
  257. griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_creation_date_problem.py +30 -0
  258. griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_last_modified_date_problem.py +30 -0
  259. griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_toml_section_problem.py +30 -0
  260. griptape_nodes/retained_mode/managers/fitness_problems/workflows/node_type_not_found_problem.py +51 -0
  261. griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_not_found_problem.py +27 -0
  262. griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_problem.py +20 -0
  263. griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_schema_version_problem.py +39 -0
  264. griptape_nodes/retained_mode/managers/flow_manager.py +4594 -0
  265. griptape_nodes/retained_mode/managers/library_manager.py +4851 -0
  266. griptape_nodes/retained_mode/managers/mcp_manager.py +374 -0
  267. griptape_nodes/retained_mode/managers/model_manager.py +1201 -0
  268. griptape_nodes/retained_mode/managers/node_manager.py +4796 -0
  269. griptape_nodes/retained_mode/managers/object_manager.py +267 -0
  270. griptape_nodes/retained_mode/managers/operation_manager.py +478 -0
  271. griptape_nodes/retained_mode/managers/os_manager.py +3414 -0
  272. griptape_nodes/retained_mode/managers/project_manager.py +1685 -0
  273. griptape_nodes/retained_mode/managers/resource_components/__init__.py +1 -0
  274. griptape_nodes/retained_mode/managers/resource_components/capability_field.py +41 -0
  275. griptape_nodes/retained_mode/managers/resource_components/comparator.py +18 -0
  276. griptape_nodes/retained_mode/managers/resource_components/resource_instance.py +236 -0
  277. griptape_nodes/retained_mode/managers/resource_components/resource_type.py +79 -0
  278. griptape_nodes/retained_mode/managers/resource_manager.py +306 -0
  279. griptape_nodes/retained_mode/managers/resource_types/__init__.py +1 -0
  280. griptape_nodes/retained_mode/managers/resource_types/compute_resource.py +82 -0
  281. griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py +108 -0
  282. griptape_nodes/retained_mode/managers/resource_types/os_resource.py +104 -0
  283. griptape_nodes/retained_mode/managers/secrets_manager.py +180 -0
  284. griptape_nodes/retained_mode/managers/session_manager.py +366 -0
  285. griptape_nodes/retained_mode/managers/settings.py +314 -0
  286. griptape_nodes/retained_mode/managers/static_files_manager.py +568 -0
  287. griptape_nodes/retained_mode/managers/sync_manager.py +510 -0
  288. griptape_nodes/retained_mode/managers/user_manager.py +120 -0
  289. griptape_nodes/retained_mode/managers/variable_manager.py +529 -0
  290. griptape_nodes/retained_mode/managers/version_compatibility_manager.py +397 -0
  291. griptape_nodes/retained_mode/managers/worker_manager.py +515 -0
  292. griptape_nodes/retained_mode/managers/workflow_manager.py +5807 -0
  293. griptape_nodes/retained_mode/publishing/__init__.py +5 -0
  294. griptape_nodes/retained_mode/publishing/download_models_script.py +66 -0
  295. griptape_nodes/retained_mode/publishing/workflow_packager.py +661 -0
  296. griptape_nodes/retained_mode/retained_mode.py +1902 -0
  297. griptape_nodes/retained_mode/utils/__init__.py +1 -0
  298. griptape_nodes/retained_mode/utils/name_generator.py +162 -0
  299. griptape_nodes/retained_mode/variable_types.py +18 -0
  300. griptape_nodes/servers/__init__.py +21 -0
  301. griptape_nodes/servers/mcp.py +253 -0
  302. griptape_nodes/servers/static.py +328 -0
  303. griptape_nodes/traits/__init__.py +1 -0
  304. griptape_nodes/traits/add_param_button.py +21 -0
  305. griptape_nodes/traits/button.py +410 -0
  306. griptape_nodes/traits/clamp.py +79 -0
  307. griptape_nodes/traits/color_picker.py +66 -0
  308. griptape_nodes/traits/compare.py +20 -0
  309. griptape_nodes/traits/compare_images.py +41 -0
  310. griptape_nodes/traits/file_system_picker.py +145 -0
  311. griptape_nodes/traits/minmax.py +43 -0
  312. griptape_nodes/traits/multi_options.py +216 -0
  313. griptape_nodes/traits/numbers_selector.py +77 -0
  314. griptape_nodes/traits/options.py +133 -0
  315. griptape_nodes/traits/slider.py +37 -0
  316. griptape_nodes/traits/trait_registry.py +35 -0
  317. griptape_nodes/traits/traits.json +8 -0
  318. griptape_nodes/traits/widget.py +30 -0
  319. griptape_nodes/utils/__init__.py +13 -0
  320. griptape_nodes/utils/artifact_normalization.py +245 -0
  321. griptape_nodes/utils/ast_utils.py +29 -0
  322. griptape_nodes/utils/async_utils.py +156 -0
  323. griptape_nodes/utils/dict_utils.py +265 -0
  324. griptape_nodes/utils/file_utils.py +159 -0
  325. griptape_nodes/utils/git_utils.py +1264 -0
  326. griptape_nodes/utils/http_file_patch.py +613 -0
  327. griptape_nodes/utils/http_utils.py +90 -0
  328. griptape_nodes/utils/huggingface_utils.py +136 -0
  329. griptape_nodes/utils/image_preview.py +160 -0
  330. griptape_nodes/utils/library_utils.py +124 -0
  331. griptape_nodes/utils/metaclasses.py +10 -0
  332. griptape_nodes/utils/string_utils.py +35 -0
  333. griptape_nodes/utils/url_utils.py +113 -0
  334. griptape_nodes/utils/uv_utils.py +18 -0
  335. griptape_nodes/utils/version_utils.py +88 -0
  336. griptape_nodes/version_compatibility/__init__.py +1 -0
  337. griptape_nodes/version_compatibility/versions/__init__.py +1 -0
  338. griptape_nodes/version_compatibility/versions/general/__init__.py +1 -0
  339. griptape_nodes/version_compatibility/versions/general/incompatible_engine_version_check.py +62 -0
  340. griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +1 -0
  341. griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +86 -0
  342. griptape_nodes/version_compatibility/versions/v0_63_8/__init__.py +1 -0
  343. griptape_nodes/version_compatibility/versions/v0_63_8/deprecated_nodegroup_parameters.py +105 -0
  344. griptape_nodes/version_compatibility/versions/v0_65_4/__init__.py +5 -0
  345. griptape_nodes/version_compatibility/versions/v0_65_4/run_in_parallel_to_run_in_order.py +85 -0
  346. griptape_nodes/version_compatibility/versions/v0_65_5/__init__.py +5 -0
  347. griptape_nodes/version_compatibility/versions/v0_65_5/flux_2_removed_parameters.py +90 -0
  348. griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py +1 -0
  349. griptape_nodes/version_compatibility/versions/v0_7_0/local_executor_argument_addition.py +52 -0
  350. griptape_nodes_engine-0.84.0.dist-info/METADATA +112 -0
  351. griptape_nodes_engine-0.84.0.dist-info/RECORD +353 -0
  352. griptape_nodes_engine-0.84.0.dist-info/WHEEL +4 -0
  353. griptape_nodes_engine-0.84.0.dist-info/entry_points.txt +4 -0
@@ -0,0 +1,24 @@
1
+ """Griptape Nodes package."""
2
+
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ from rich.console import Console
7
+
8
+
9
+ def main() -> None:
10
+ """Main entry point for the Griptape Nodes CLI."""
11
+ # Hack to make paths "just work". # noqa: FIX004
12
+ # Without this, packages like `nodes` don't properly import.
13
+ # Long term solution could be to make `nodes` a proper src-layout package
14
+ # but current engine relies on importing files rather than packages.
15
+ sys.path.append(str(Path.cwd()))
16
+
17
+ console = Console()
18
+ with console.status("[bold green]Loading Griptape Nodes...", spinner="dots"):
19
+ from griptape_nodes.cli.main import app
20
+
21
+ app()
22
+
23
+
24
+ __all__ = ["main"]
@@ -0,0 +1,6 @@
1
+ """Main entry point for the Griptape Nodes CLI when run as a module."""
2
+
3
+ from griptape_nodes import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -0,0 +1,9 @@
1
+ """API client for Nodes API communication."""
2
+
3
+ from griptape_nodes.api_client.client import Client
4
+ from griptape_nodes.api_client.request_client import RequestClient
5
+
6
+ __all__ = [
7
+ "Client",
8
+ "RequestClient",
9
+ ]
@@ -0,0 +1,362 @@
1
+ """Unified WebSocket client for Nodes API communication."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import contextlib
7
+ import json
8
+ import logging
9
+ import os
10
+ import ssl
11
+ from http import HTTPStatus
12
+ from typing import TYPE_CHECKING, Any, Self
13
+ from urllib.parse import urljoin
14
+
15
+ from websockets.asyncio.client import connect
16
+ from websockets.exceptions import ConnectionClosed, InvalidStatus, InvalidURI
17
+
18
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
19
+
20
+ if TYPE_CHECKING:
21
+ from collections.abc import AsyncIterator, Awaitable, Callable
22
+ from types import TracebackType
23
+
24
+ logger = logging.getLogger("griptape_nodes_client")
25
+
26
+ # Payload size (in bytes) above which a warning is logged before sending.
27
+ # Messages above this threshold can saturate the WebSocket send buffer and cause
28
+ # connected clients (e.g. the editor) to stall or disconnect.
29
+ LARGE_PAYLOAD_WARNING_THRESHOLD = 100_000
30
+
31
+
32
+ def get_default_websocket_url() -> str:
33
+ """Get the default WebSocket endpoint URL for connecting to Nodes API.
34
+
35
+ Returns:
36
+ WebSocket URL for Nodes API events endpoint
37
+ """
38
+ return urljoin(
39
+ os.getenv("GRIPTAPE_NODES_API_BASE_URL", "https://api.nodes.griptape.ai").replace("http", "ws"),
40
+ "/ws/engines/events?version=v2",
41
+ )
42
+
43
+
44
+ class Client:
45
+ """WebSocket client for Nodes API pub/sub communication.
46
+
47
+ Provides connection management, topic-based pub/sub, and message routing.
48
+ Handles WebSocket reconnection and async event streaming.
49
+ """
50
+
51
+ def __init__(
52
+ self,
53
+ api_key: str | None = None,
54
+ url: str | None = None,
55
+ ):
56
+ """Initialize Nodes API client.
57
+
58
+ Args:
59
+ api_key: API key for authentication (defaults to GT_CLOUD_API_KEY from SecretsManager)
60
+ url: WebSocket URL to connect to (defaults to Nodes API endpoint)
61
+ """
62
+ self.url = url if url is not None else get_default_websocket_url()
63
+
64
+ # Get API key from SecretsManager if not provided
65
+ if api_key is None:
66
+ api_key = GriptapeNodes.SecretsManager().get_secret("GT_CLOUD_API_KEY")
67
+
68
+ self.api_key = api_key
69
+
70
+ self.headers = {"Authorization": f"Bearer {api_key}"} if api_key else {}
71
+
72
+ # Event streaming management
73
+ self._message_queue: asyncio.Queue = asyncio.Queue()
74
+ self._message_filters: list[Callable[[dict[str, Any]], Awaitable[bool]]] = []
75
+ self._subscribed_topics: set[str] = set()
76
+ self._receiving_task: asyncio.Task | None = None
77
+ self._sending_task: asyncio.Task | None = None
78
+ self._websocket: Any = None
79
+ self._connection_ready = asyncio.Event()
80
+ self._reconnect_delay = 2.0
81
+
82
+ async def __aenter__(self) -> Self:
83
+ """Async context manager entry: connect to WebSocket server."""
84
+ await self.connect()
85
+ return self
86
+
87
+ async def __aexit__(
88
+ self,
89
+ exc_type: type[BaseException] | None,
90
+ exc_val: BaseException | None,
91
+ exc_tb: TracebackType | None,
92
+ ) -> None:
93
+ """Async context manager exit: disconnect from WebSocket server."""
94
+ await self.disconnect()
95
+
96
+ def __aiter__(self) -> AsyncIterator[dict[str, Any]]:
97
+ """Return self as async iterator."""
98
+ return self
99
+
100
+ async def __anext__(self) -> dict[str, Any]:
101
+ """Get next message from the message queue.
102
+
103
+ Returns:
104
+ Next message dictionary from subscribed topics
105
+
106
+ Raises:
107
+ StopAsyncIteration: When iteration is cancelled
108
+ """
109
+ try:
110
+ return await self._message_queue.get()
111
+ except asyncio.CancelledError:
112
+ raise StopAsyncIteration from None
113
+
114
+ @property
115
+ def messages(self) -> AsyncIterator[dict[str, Any]]:
116
+ """Async iterator for receiving messages from subscribed topics.
117
+
118
+ Returns:
119
+ Async iterator yielding message dictionaries
120
+
121
+ Example:
122
+ async with Client(...) as client:
123
+ await client.subscribe("topic")
124
+ async for message in client.messages:
125
+ print(message)
126
+ """
127
+ return self
128
+
129
+ async def subscribe(self, topic: str) -> None:
130
+ """Subscribe to a topic by sending subscribe command to server.
131
+
132
+ Args:
133
+ topic: Topic name to subscribe to
134
+
135
+ Example:
136
+ await client.subscribe("sessions/123/response")
137
+ """
138
+ self._subscribed_topics.add(topic)
139
+ await self._send_subscribe_command(topic)
140
+
141
+ async def unsubscribe(self, topic: str) -> None:
142
+ """Unsubscribe from a topic.
143
+
144
+ Args:
145
+ topic: Topic name to unsubscribe from
146
+ """
147
+ self._subscribed_topics.discard(topic)
148
+ await self._send_unsubscribe_command(topic)
149
+
150
+ def add_message_filter(self, fn: Callable[[dict[str, Any]], Awaitable[bool]]) -> None:
151
+ """Register a filter that can claim incoming messages before they reach the queue.
152
+
153
+ Args:
154
+ fn: Async callable that returns True if it handled the message (claiming it),
155
+ or False to leave it for the next filter or the message queue.
156
+ """
157
+ self._message_filters.append(fn)
158
+
159
+ def remove_message_filter(self, fn: Callable[[dict[str, Any]], Awaitable[bool]]) -> None:
160
+ """Deregister a previously added message filter.
161
+
162
+ Args:
163
+ fn: The exact callable that was passed to add_message_filter.
164
+ """
165
+ self._message_filters.remove(fn)
166
+
167
+ async def publish(self, event_type: str, payload: dict[str, Any], topic: str) -> None:
168
+ """Publish an event to the server.
169
+
170
+ Args:
171
+ event_type: Type of event to publish
172
+ payload: Event payload data
173
+ topic: Topic to publish to
174
+ """
175
+ message = {"type": event_type, "payload": payload, "topic": topic}
176
+ await self._send_message(message)
177
+
178
+ async def connect(self) -> None:
179
+ """Connect to the WebSocket server and start receiving messages.
180
+
181
+ This method starts the connection manager task.
182
+ It returns once the initial connection is established.
183
+
184
+ Raises:
185
+ ConnectionError: If connection fails
186
+ """
187
+ # Start connection manager task
188
+ self._receiving_task = asyncio.create_task(self._manage_connection())
189
+
190
+ # Wait for initial connection to be established
191
+ try:
192
+ await asyncio.wait_for(self._connection_ready.wait(), timeout=10.0)
193
+ logger.debug("WebSocket client connected")
194
+ except TimeoutError as e:
195
+ logger.error("Failed to connect WebSocket client: timeout")
196
+ msg = "Connection timeout - failed to connect to Nodes API."
197
+ raise ConnectionError(msg) from e
198
+
199
+ async def disconnect(self) -> None:
200
+ """Disconnect from the WebSocket server and clean up tasks."""
201
+ # Cancel tasks
202
+ if self._receiving_task:
203
+ self._receiving_task.cancel()
204
+ with contextlib.suppress(asyncio.CancelledError):
205
+ await self._receiving_task
206
+
207
+ if self._sending_task:
208
+ self._sending_task.cancel()
209
+ with contextlib.suppress(asyncio.CancelledError):
210
+ await self._sending_task
211
+
212
+ # Close websocket connection
213
+ if self._websocket:
214
+ await self._websocket.close()
215
+ logger.info("WebSocket client disconnected")
216
+
217
+ async def _manage_connection(self) -> None:
218
+ """Manage WebSocket connection lifecycle with automatic reconnection.
219
+
220
+ This method establishes and maintains the WebSocket connection,
221
+ automatically reconnecting on failures.
222
+ """
223
+ try:
224
+ async for websocket in connect(self.url, additional_headers=self.headers):
225
+ should_reconnect = await self._handle_websocket_session(websocket)
226
+ if not should_reconnect:
227
+ break
228
+ except InvalidStatus as e:
229
+ if e.response.status_code in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
230
+ logger.error(
231
+ "Nodes API rejected connection with HTTP %d. "
232
+ "This indicates an invalid or missing GT_CLOUD_API_KEY.",
233
+ e.response.status_code,
234
+ )
235
+ else:
236
+ logger.error(
237
+ "Nodes API rejected WebSocket connection: HTTP %d.",
238
+ e.response.status_code,
239
+ )
240
+ except InvalidURI as e:
241
+ logger.error(
242
+ "Invalid WebSocket URL: %s. Check GRIPTAPE_NODES_API_BASE_URL configuration.",
243
+ e,
244
+ )
245
+ except ssl.SSLError as e:
246
+ logger.error(
247
+ "SSL error while connecting to Nodes API: %s. "
248
+ "This may indicate a certificate verification failure. "
249
+ "Check that your system's CA certificates are up to date.",
250
+ e,
251
+ )
252
+ except OSError as e:
253
+ logger.error(
254
+ "Network error while connecting to Nodes API: %s. "
255
+ "Check your network connection and that the API endpoint is reachable.",
256
+ e,
257
+ )
258
+ except asyncio.CancelledError:
259
+ logger.debug("Connection manager task cancelled")
260
+
261
+ async def _handle_websocket_session(self, websocket: Any) -> bool:
262
+ """Handle a single WebSocket session: log, resubscribe, and receive messages.
263
+
264
+ Args:
265
+ websocket: Active WebSocket connection
266
+
267
+ Returns:
268
+ True if the connection should be retried, False if it should not
269
+ """
270
+ self._websocket = websocket
271
+ self._connection_ready.set()
272
+ if self._subscribed_topics:
273
+ logger.info("WebSocket reconnected successfully")
274
+ logger.debug("Resubscribing to %d topics after reconnection", len(self._subscribed_topics))
275
+ for topic in self._subscribed_topics:
276
+ await self._send_subscribe_command(topic)
277
+ else:
278
+ logger.debug("WebSocket connection established: %s", self.url)
279
+
280
+ try:
281
+ await self._receive_messages(websocket)
282
+ except ConnectionClosed:
283
+ logger.info("WebSocket connection closed, reconnecting...")
284
+ self._connection_ready.clear()
285
+ return True
286
+ return False
287
+
288
+ async def _receive_messages(self, websocket: Any) -> None:
289
+ """Receive messages from WebSocket and put them in message queue.
290
+
291
+ Args:
292
+ websocket: WebSocket connection to receive messages from
293
+
294
+ Raises:
295
+ ConnectionClosed: When the WebSocket connection is closed
296
+ """
297
+ try:
298
+ async for message in websocket:
299
+ try:
300
+ data = json.loads(message)
301
+ claimed = False
302
+ for f in self._message_filters:
303
+ if await f(data):
304
+ claimed = True
305
+ break
306
+ if not claimed:
307
+ await self._message_queue.put(data)
308
+ except json.JSONDecodeError:
309
+ logger.error("Failed to parse message: %s", message)
310
+ except Exception as e:
311
+ logger.error("Error receiving message: %s", e)
312
+ except asyncio.CancelledError:
313
+ logger.debug("Receive messages task cancelled")
314
+ raise
315
+
316
+ async def _send_message(self, message: dict[str, Any]) -> None:
317
+ """Send a message through the WebSocket connection.
318
+
319
+ Args:
320
+ message: Message dictionary to send
321
+
322
+ Raises:
323
+ ConnectionError: If not connected
324
+ """
325
+ if not self._websocket:
326
+ msg = "Not connected to WebSocket"
327
+ raise ConnectionError(msg)
328
+
329
+ serialized = json.dumps(message)
330
+ # TODO: Block large payloads https://github.com/griptape-ai/griptape-nodes/issues/4124
331
+ if len(serialized) > LARGE_PAYLOAD_WARNING_THRESHOLD:
332
+ logger.warning(
333
+ "Sending large WebSocket message: type=%s (%s), size=%d bytes. "
334
+ "Large messages can saturate the send buffer and cause connected clients (e.g. the editor) to stall or disconnect.",
335
+ message.get("type"),
336
+ message.get("payload", {}).get("result_type"),
337
+ len(serialized),
338
+ )
339
+ try:
340
+ await self._websocket.send(serialized)
341
+ except Exception as e:
342
+ logger.error("Failed to send message: %s", e)
343
+
344
+ async def _send_subscribe_command(self, topic: str) -> None:
345
+ """Send subscribe command to server.
346
+
347
+ Args:
348
+ topic: Topic to subscribe to
349
+ """
350
+ message = {"type": "subscribe", "topic": topic, "payload": {}}
351
+ await self._send_message(message)
352
+ logger.debug("Sent subscribe command for topic: %s", topic)
353
+
354
+ async def _send_unsubscribe_command(self, topic: str) -> None:
355
+ """Send unsubscribe command to server.
356
+
357
+ Args:
358
+ topic: Topic to unsubscribe from
359
+ """
360
+ message = {"type": "unsubscribe", "topic": topic, "payload": {}}
361
+ await self._send_message(message)
362
+ logger.debug("Sent unsubscribe command for topic: %s", topic)