-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShell Command.json
More file actions
1 lines (1 loc) · 9.26 KB
/
Shell Command.json
File metadata and controls
1 lines (1 loc) · 9.26 KB
1
{"data":{"edges":[],"nodes":[{"data":{"node":{"template":{"_type":"Component","capture_output":{"tool_mode":false,"trace_as_metadata":true,"list":false,"list_add_label":"Add More","required":false,"placeholder":"","show":true,"name":"capture_output","value":true,"display_name":"Capture Output","advanced":true,"dynamic":false,"info":"If False, the command's stdout/stderr will not be captured.","title_case":false,"type":"bool","_input_type":"BoolInput"},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"# langflow/components/shell_command.py\r\n\r\nfrom __future__ import annotations\r\n\r\nimport asyncio\r\nimport json\r\nfrom typing import Any, Dict, Optional\r\n\r\nfrom langflow.custom.custom_component.component import Component\r\nfrom langflow.io import BoolInput, MessageTextInput, Output\r\nfrom langflow.schema.data import Data\r\n\r\n\r\nclass ShellCommandComponent(Component):\r\n \"\"\"\r\n Execute arbitrary shell commands and return the output.\r\n\r\n This component runs the provided command in a subprocess, captures stdout and stderr,\r\n and returns a Data object containing the command output, any error output, and the\r\n process exit code.\r\n\r\n Use cases:\r\n - Quick system checks from a Langflow flow.\r\n - Running scripts or tools that expose a CLI.\r\n - Demonstrating command execution in educational flows.\r\n \"\"\"\r\n\r\n display_name = \"Shell Command\"\r\n description = \"Execute a shell command and return its output.\"\r\n documentation: str = \"https://docs.langflow.org/components-utilities#shell-command\"\r\n icon = \"terminal\"\r\n name = \"ShellCommand\"\r\n\r\n # ------------------------------------------------------------------\r\n # Inputs\r\n # ------------------------------------------------------------------\r\n inputs = [\r\n MessageTextInput(\r\n name=\"command\",\r\n display_name=\"Command\",\r\n info=\"Shell command to execute, e.g., 'ls -la' or 'python script.py'.\",\r\n required=True,\r\n tool_mode=True,\r\n placeholder=\"echo Hello World\",\r\n ),\r\n MessageTextInput(\r\n name=\"cwd\",\r\n display_name=\"Working Directory\",\r\n info=\"Optional working directory for the command. Leave blank to use the default.\",\r\n advanced=True,\r\n placeholder=\"/home/user\",\r\n ),\r\n MessageTextInput(\r\n name=\"env\",\r\n display_name=\"Environment Variables\",\r\n info=\"Optional JSON object of environment variables, e.g., '{\\\"VAR\\\": \\\"value\\\"}'.\",\r\n advanced=True,\r\n placeholder='{\"PATH\": \"/usr/bin\"}',\r\n ),\r\n BoolInput(\r\n name=\"capture_output\",\r\n display_name=\"Capture Output\",\r\n info=\"If False, the command's stdout/stderr will not be captured.\",\r\n advanced=True,\r\n value=True,\r\n ),\r\n ]\r\n\r\n # ------------------------------------------------------------------\r\n # Outputs\r\n # ------------------------------------------------------------------\r\n outputs = [\r\n Output(\r\n name=\"output\",\r\n display_name=\"Command Output\",\r\n method=\"run_command\",\r\n types=[\"Data\"],\r\n ),\r\n ]\r\n\r\n # ------------------------------------------------------------------\r\n # Core logic\r\n # ------------------------------------------------------------------\r\n async def run_command(self) -> Data:\r\n \"\"\"\r\n Execute the command and return a Data object with stdout, stderr, and exit_code.\r\n \"\"\"\r\n # Resolve inputs\r\n command: str = self.command\r\n cwd: Optional[str] = self.cwd or None\r\n env_json: Optional[str] = self.env or None\r\n capture: bool = self.capture_output\r\n\r\n # Prepare environment\r\n env: Dict[str, str] | None = None\r\n if env_json:\r\n try:\r\n env = json.loads(env_json)\r\n if not isinstance(env, dict):\r\n raise ValueError(\"Environment variables JSON must be an object.\")\r\n except json.JSONDecodeError as exc:\r\n raise ValueError(f\"Invalid JSON for env: {exc}\") from exc\r\n\r\n # Run the subprocess\r\n try:\r\n process = await asyncio.create_subprocess_shell(\r\n command,\r\n cwd=cwd,\r\n env=env,\r\n stdout=asyncio.subprocess.PIPE if capture else None,\r\n stderr=asyncio.subprocess.PIPE if capture else None,\r\n )\r\n\r\n stdout_bytes, stderr_bytes = await process.communicate()\r\n exit_code = process.returncode\r\n\r\n stdout = stdout_bytes.decode().strip() if stdout_bytes else \"\"\r\n stderr = stderr_bytes.decode().strip() if stderr_bytes else \"\"\r\n\r\n result: Dict[str, Any] = {\r\n \"command\": command,\r\n \"cwd\": cwd,\r\n \"env\": env,\r\n \"stdout\": stdout,\r\n \"stderr\": stderr,\r\n \"exit_code\": exit_code,\r\n }\r\n\r\n # Store status for debugging\r\n self.status = result\r\n\r\n return Data(value=result)\r\n\r\n except Exception as exc:\r\n # Capture exception details in the output\r\n error_info: Dict[str, Any] = {\r\n \"command\": command,\r\n \"cwd\": cwd,\r\n \"env\": env,\r\n \"error\": str(exc),\r\n }\r\n self.status = error_info\r\n return Data(value=error_info)\r\n ","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"command":{"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"list_add_label":"Add More","required":true,"placeholder":"echo Hello World","show":true,"name":"command","value":"python --version","display_name":"Command","advanced":false,"input_types":["Message"],"dynamic":false,"info":"Shell command to execute, e.g., 'ls -la' or 'python script.py'.","title_case":false,"type":"str","_input_type":"MessageTextInput"},"cwd":{"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"list_add_label":"Add More","required":false,"placeholder":"/home/user","show":true,"name":"cwd","value":"","display_name":"Working Directory","advanced":true,"input_types":["Message"],"dynamic":false,"info":"Optional working directory for the command. Leave blank to use the default.","title_case":false,"type":"str","_input_type":"MessageTextInput"},"env":{"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"list_add_label":"Add More","required":false,"placeholder":"{\"PATH\": \"/usr/bin\"}","show":true,"name":"env","value":"","display_name":"Environment Variables","advanced":true,"input_types":["Message"],"dynamic":false,"info":"Optional JSON object of environment variables, e.g., '{\"VAR\": \"value\"}'.","title_case":false,"type":"str","_input_type":"MessageTextInput"},"tools_metadata":{"tool_mode":false,"trace_as_metadata":true,"is_list":true,"list_add_label":"Add More","required":false,"placeholder":"","show":true,"name":"tools_metadata","value":[{"name":"run_command","description":"Execute a shell command and return its output.","tags":["run_command"],"status":true,"display_name":"run_command","display_description":"Execute a shell command and return its output.","readonly":false,"args":{"command":{"description":"Shell command to execute, e.g., 'ls -la' or 'python script.py'.","title":"Command","type":"string"}}}],"display_name":"Actions","advanced":false,"dynamic":false,"info":"Modify tool names and descriptions to help agents understand when to use each tool.","real_time_refresh":true,"title_case":false,"type":"tools","_input_type":"ToolsInput"}},"description":"Execute a shell command and return its output.","icon":"terminal","base_classes":["Data"],"display_name":"Shell Command","documentation":"https://docs.langflow.org/components-utilities#shell-command","minimized":false,"custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Tool"],"selected":"Tool","name":"component_as_tool","hidden":null,"display_name":"Toolset","method":"to_toolkit","value":"__UNDEFINED__","cache":true,"required_inputs":null,"allows_loop":false,"group_outputs":false,"options":null,"tool_mode":true}],"field_order":["command","cwd","env","capture_output"],"beta":false,"legacy":false,"edited":true,"metadata":{},"tool_mode":true,"last_updated":"2025-08-19T22:03:40.566Z","lf_version":"1.5.0.post1","official":false},"showNode":true,"type":"ShellCommand","id":"CustomComponent-eRVmc"},"id":"CustomComponent-eRVmc","position":{"x":0,"y":0},"type":"genericNode"}],"viewport":{"x":1,"y":1,"zoom":1}},"description":"Execute a shell command and return its output.","name":"Shell Command","id":"CustomComponent-eRVmc","is_component":true,"last_tested_version":"1.5.0.post1"}