{
    "files": [],
    "data": {
        "nodes": [
            {
                "id": "ChatInput-AEBfS",
                "type": "genericNode",
                "position": {
                    "x": 265,
                    "y": 158
                },
                "data": {
                    "node": {
                        "base_classes": [
                            "Message"
                        ],
                        "beta": false,
                        "conditional_paths": [],
                        "custom_fields": {},
                        "description": "Get chat inputs from the Playground.",
                        "display_name": "Chat Input",
                        "documentation": "https://docs.langflow.org/chat-input-and-output",
                        "edited": false,
                        "field_order": [
                            "input_value",
                            "should_store_message",
                            "sender",
                            "sender_name",
                            "session_id",
                            "context_id",
                            "files"
                        ],
                        "frozen": false,
                        "icon": "MessagesSquare",
                        "legacy": false,
                        "metadata": {
                            "code_hash": "7a26c54d89ed",
                            "dependencies": {
                                "dependencies": [
                                    {
                                        "name": "lfx",
                                        "version": null
                                    }
                                ],
                                "total_dependencies": 1
                            },
                            "module": "lfx.components.input_output.chat.ChatInput"
                        },
                        "minimized": true,
                        "output_types": [],
                        "outputs": [
                            {
                                "allows_loop": false,
                                "cache": true,
                                "display_name": "Chat Message",
                                "group_outputs": false,
                                "method": "message_response",
                                "name": "message",
                                "selected": "Message",
                                "tool_mode": true,
                                "types": [
                                    "Message"
                                ],
                                "value": "__UNDEFINED__"
                            }
                        ],
                        "pinned": false,
                        "template": {
                            "_type": "Component",
                            "code": {
                                "advanced": true,
                                "dynamic": true,
                                "fileTypes": [],
                                "file_path": "",
                                "info": "",
                                "list": false,
                                "load_from_db": false,
                                "multiline": true,
                                "name": "code",
                                "password": false,
                                "placeholder": "",
                                "required": true,
                                "show": true,
                                "title_case": false,
                                "type": "code",
                                "value": "from lfx.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES\nfrom lfx.base.io.chat import ChatComponent\nfrom lfx.inputs.inputs import BoolInput\nfrom lfx.io import (\n    DropdownInput,\n    FileInput,\n    MessageTextInput,\n    MultilineInput,\n    Output,\n)\nfrom lfx.schema.message import Message\nfrom lfx.utils.constants import (\n    MESSAGE_SENDER_AI,\n    MESSAGE_SENDER_NAME_USER,\n    MESSAGE_SENDER_USER,\n)\n\n\nclass ChatInput(ChatComponent):\n    display_name = \"Chat Input\"\n    description = \"Get chat inputs from the Playground.\"\n    documentation: str = \"https://docs.langflow.org/chat-input-and-output\"\n    icon = \"MessagesSquare\"\n    name = \"ChatInput\"\n    minimized = True\n\n    inputs = [\n        MultilineInput(\n            name=\"input_value\",\n            display_name=\"Input Text\",\n            value=\"\",\n            info=\"Message to be passed as input.\",\n            input_types=[],\n        ),\n        BoolInput(\n            name=\"should_store_message\",\n            display_name=\"Store Messages\",\n            info=\"Store the message in the history.\",\n            value=True,\n            advanced=True,\n        ),\n        DropdownInput(\n            name=\"sender\",\n            display_name=\"Sender Type\",\n            options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],\n            value=MESSAGE_SENDER_USER,\n            info=\"Type of sender.\",\n            advanced=True,\n        ),\n        MessageTextInput(\n            name=\"sender_name\",\n            display_name=\"Sender Name\",\n            info=\"Name of the sender.\",\n            value=MESSAGE_SENDER_NAME_USER,\n            advanced=True,\n        ),\n        MessageTextInput(\n            name=\"session_id\",\n            display_name=\"Session ID\",\n            info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n            advanced=True,\n        ),\n        MessageTextInput(\n            name=\"context_id\",\n            display_name=\"Context ID\",\n            info=\"The context ID of the chat. Adds an extra layer to the local memory.\",\n            value=\"\",\n            advanced=True,\n        ),\n        FileInput(\n            name=\"files\",\n            display_name=\"Files\",\n            file_types=TEXT_FILE_TYPES + IMG_FILE_TYPES,\n            info=\"Files to be sent with the message.\",\n            advanced=True,\n            is_list=True,\n            temp_file=True,\n        ),\n    ]\n    outputs = [\n        Output(display_name=\"Chat Message\", name=\"message\", method=\"message_response\"),\n    ]\n\n    async def message_response(self) -> Message:\n        # Ensure files is a list and filter out empty/None values\n        files = self.files if self.files else []\n        if files and not isinstance(files, list):\n            files = [files]\n        # Filter out None/empty values\n        files = [f for f in files if f is not None and f != \"\"]\n\n        session_id = self.session_id or self.graph.session_id or \"\"\n        message = await Message.create(\n            text=self.input_value,\n            sender=self.sender,\n            sender_name=self.sender_name,\n            session_id=session_id,\n            context_id=self.context_id,\n            files=files,\n        )\n        if session_id and isinstance(message, Message) and self.should_store_message:\n            stored_message = await self.send_message(\n                message,\n            )\n            self.message.value = stored_message\n            message = stored_message\n\n        self.status = message\n        return message\n"
                            },
                            "context_id": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Context ID",
                                "dynamic": false,
                                "info": "The context ID of the chat. Adds an extra layer to the local memory.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "context_id",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": ""
                            },
                            "files": {
                                "_input_type": "FileInput",
                                "advanced": true,
                                "display_name": "Files",
                                "dynamic": false,
                                "fileTypes": [
                                    "csv",
                                    "json",
                                    "pdf",
                                    "txt",
                                    "md",
                                    "mdx",
                                    "yaml",
                                    "yml",
                                    "xml",
                                    "html",
                                    "htm",
                                    "docx",
                                    "py",
                                    "sh",
                                    "sql",
                                    "js",
                                    "ts",
                                    "tsx",
                                    "jpg",
                                    "jpeg",
                                    "png",
                                    "bmp",
                                    "image"
                                ],
                                "file_path": "",
                                "info": "Files to be sent with the message.",
                                "list": true,
                                "list_add_label": "Add More",
                                "name": "files",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "temp_file": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "file",
                                "value": ""
                            },
                            "input_value": {
                                "_input_type": "MultilineInput",
                                "advanced": false,
                                "ai_enabled": false,
                                "copy_field": false,
                                "display_name": "Input Text",
                                "dynamic": false,
                                "info": "Message to be passed as input.",
                                "input_types": [],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "multiline": true,
                                "name": "input_value",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": ""
                            },
                            "sender": {
                                "_input_type": "DropdownInput",
                                "advanced": true,
                                "combobox": false,
                                "dialog_inputs": {},
                                "display_name": "Sender Type",
                                "dynamic": false,
                                "external_options": {},
                                "info": "Type of sender.",
                                "name": "sender",
                                "options": [
                                    "Machine",
                                    "User"
                                ],
                                "options_metadata": [],
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "toggle": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": true,
                                "type": "str",
                                "value": "User"
                            },
                            "sender_name": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Sender Name",
                                "dynamic": false,
                                "info": "Name of the sender.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "sender_name",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": "User"
                            },
                            "session_id": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Session ID",
                                "dynamic": false,
                                "info": "The session ID of the chat. If empty, the current session ID parameter will be used.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "session_id",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": ""
                            },
                            "should_store_message": {
                                "_input_type": "BoolInput",
                                "advanced": true,
                                "display_name": "Store Messages",
                                "dynamic": false,
                                "info": "Store the message in the history.",
                                "list": false,
                                "list_add_label": "Add More",
                                "name": "should_store_message",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": true,
                                "type": "bool",
                                "value": true
                            }
                        },
                        "tool_mode": false,
                        "lf_version": "1.8.0"
                    },
                    "showNode": false,
                    "type": "ChatInput",
                    "id": "ChatInput-AEBfS"
                },
                "selected": false,
                "measured": {
                    "width": 192,
                    "height": 48
                }
            },
            {
                "id": "ChatOutput-CeGTD",
                "type": "genericNode",
                "position": {
                    "x": 1014,
                    "y": 313
                },
                "data": {
                    "node": {
                        "base_classes": [
                            "Message"
                        ],
                        "beta": false,
                        "conditional_paths": [],
                        "custom_fields": {},
                        "description": "Display a chat message in the Playground.",
                        "display_name": "Chat Output",
                        "documentation": "https://docs.langflow.org/chat-input-and-output",
                        "edited": false,
                        "field_order": [
                            "input_value",
                            "should_store_message",
                            "sender",
                            "sender_name",
                            "session_id",
                            "context_id",
                            "data_template",
                            "clean_data"
                        ],
                        "frozen": false,
                        "icon": "MessagesSquare",
                        "legacy": false,
                        "metadata": {
                            "code_hash": "8c87e536cca4",
                            "dependencies": {
                                "dependencies": [
                                    {
                                        "name": "orjson",
                                        "version": "3.10.15"
                                    },
                                    {
                                        "name": "fastapi",
                                        "version": "0.128.0"
                                    },
                                    {
                                        "name": "lfx",
                                        "version": null
                                    }
                                ],
                                "total_dependencies": 3
                            },
                            "module": "lfx.components.input_output.chat_output.ChatOutput"
                        },
                        "minimized": true,
                        "output_types": [],
                        "outputs": [
                            {
                                "allows_loop": false,
                                "cache": true,
                                "display_name": "Output Message",
                                "group_outputs": false,
                                "method": "message_response",
                                "name": "message",
                                "selected": "Message",
                                "tool_mode": true,
                                "types": [
                                    "Message"
                                ],
                                "value": "__UNDEFINED__"
                            }
                        ],
                        "pinned": false,
                        "template": {
                            "_type": "Component",
                            "clean_data": {
                                "_input_type": "BoolInput",
                                "advanced": true,
                                "display_name": "Basic Clean Data",
                                "dynamic": false,
                                "info": "Whether to clean data before converting to string.",
                                "list": false,
                                "list_add_label": "Add More",
                                "name": "clean_data",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": true,
                                "type": "bool",
                                "value": true
                            },
                            "code": {
                                "advanced": true,
                                "dynamic": true,
                                "fileTypes": [],
                                "file_path": "",
                                "info": "",
                                "list": false,
                                "load_from_db": false,
                                "multiline": true,
                                "name": "code",
                                "password": false,
                                "placeholder": "",
                                "required": true,
                                "show": true,
                                "title_case": false,
                                "type": "code",
                                "value": "from collections.abc import Generator\nfrom typing import Any\n\nimport orjson\nfrom fastapi.encoders import jsonable_encoder\n\nfrom lfx.base.io.chat import ChatComponent\nfrom lfx.helpers.data import safe_convert\nfrom lfx.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput\nfrom lfx.schema.data import Data\nfrom lfx.schema.dataframe import DataFrame\nfrom lfx.schema.message import Message\nfrom lfx.schema.properties import Source\nfrom lfx.template.field.base import Output\nfrom lfx.utils.constants import (\n    MESSAGE_SENDER_AI,\n    MESSAGE_SENDER_NAME_AI,\n    MESSAGE_SENDER_USER,\n)\n\n\nclass ChatOutput(ChatComponent):\n    display_name = \"Chat Output\"\n    description = \"Display a chat message in the Playground.\"\n    documentation: str = \"https://docs.langflow.org/chat-input-and-output\"\n    icon = \"MessagesSquare\"\n    name = \"ChatOutput\"\n    minimized = True\n\n    inputs = [\n        HandleInput(\n            name=\"input_value\",\n            display_name=\"Inputs\",\n            info=\"Message to be passed as output.\",\n            input_types=[\"Data\", \"DataFrame\", \"Message\"],\n            required=True,\n        ),\n        BoolInput(\n            name=\"should_store_message\",\n            display_name=\"Store Messages\",\n            info=\"Store the message in the history.\",\n            value=True,\n            advanced=True,\n        ),\n        DropdownInput(\n            name=\"sender\",\n            display_name=\"Sender Type\",\n            options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],\n            value=MESSAGE_SENDER_AI,\n            advanced=True,\n            info=\"Type of sender.\",\n        ),\n        MessageTextInput(\n            name=\"sender_name\",\n            display_name=\"Sender Name\",\n            info=\"Name of the sender.\",\n            value=MESSAGE_SENDER_NAME_AI,\n            advanced=True,\n        ),\n        MessageTextInput(\n            name=\"session_id\",\n            display_name=\"Session ID\",\n            info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n            advanced=True,\n        ),\n        MessageTextInput(\n            name=\"context_id\",\n            display_name=\"Context ID\",\n            info=\"The context ID of the chat. Adds an extra layer to the local memory.\",\n            value=\"\",\n            advanced=True,\n        ),\n        MessageTextInput(\n            name=\"data_template\",\n            display_name=\"Data Template\",\n            value=\"{text}\",\n            advanced=True,\n            info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n        ),\n        BoolInput(\n            name=\"clean_data\",\n            display_name=\"Basic Clean Data\",\n            value=True,\n            advanced=True,\n            info=\"Whether to clean data before converting to string.\",\n        ),\n    ]\n    outputs = [\n        Output(\n            display_name=\"Output Message\",\n            name=\"message\",\n            method=\"message_response\",\n        ),\n    ]\n\n    def _build_source(self, id_: str | None, display_name: str | None, source: str | None) -> Source:\n        source_dict = {}\n        if id_:\n            source_dict[\"id\"] = id_\n        if display_name:\n            source_dict[\"display_name\"] = display_name\n        if source:\n            # Handle case where source is a ChatOpenAI object\n            if hasattr(source, \"model_name\"):\n                source_dict[\"source\"] = source.model_name\n            elif hasattr(source, \"model\"):\n                source_dict[\"source\"] = str(source.model)\n            else:\n                source_dict[\"source\"] = str(source)\n        return Source(**source_dict)\n\n    async def message_response(self) -> Message:\n        # First convert the input to string if needed\n        text = self.convert_to_string()\n\n        # Get source properties\n        source, _, display_name, source_id = self.get_properties_from_source_component()\n\n        # Create or use existing Message object\n        if isinstance(self.input_value, Message) and not self.is_connected_to_chat_input():\n            message = self.input_value\n            # Update message properties\n            message.text = text\n            # Preserve existing session_id from the incoming message if it exists\n            existing_session_id = message.session_id\n        else:\n            message = Message(text=text)\n            existing_session_id = None\n\n        # Set message properties\n        message.sender = self.sender\n        message.sender_name = self.sender_name\n        # Preserve session_id from incoming message, or use component/graph session_id\n        message.session_id = (\n            self.session_id or existing_session_id or (self.graph.session_id if hasattr(self, \"graph\") else None) or \"\"\n        )\n        message.context_id = self.context_id\n        message.flow_id = self.graph.flow_id if hasattr(self, \"graph\") else None\n        message.properties.source = self._build_source(source_id, display_name, source)\n\n        # Store message if needed\n        if message.session_id and self.should_store_message:\n            stored_message = await self.send_message(message)\n            self.message.value = stored_message\n            message = stored_message\n\n        self.status = message\n        return message\n\n    def _serialize_data(self, data: Data) -> str:\n        \"\"\"Serialize Data object to JSON string.\"\"\"\n        # Convert data.data to JSON-serializable format\n        serializable_data = jsonable_encoder(data.data)\n        # Serialize with orjson, enabling pretty printing with indentation\n        json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)\n        # Convert bytes to string and wrap in Markdown code blocks\n        return \"```json\\n\" + json_bytes.decode(\"utf-8\") + \"\\n```\"\n\n    def _validate_input(self) -> None:\n        \"\"\"Validate the input data and raise ValueError if invalid.\"\"\"\n        if self.input_value is None:\n            msg = \"Input data cannot be None\"\n            raise ValueError(msg)\n        if isinstance(self.input_value, list) and not all(\n            isinstance(item, Message | Data | DataFrame | str) for item in self.input_value\n        ):\n            invalid_types = [\n                type(item).__name__\n                for item in self.input_value\n                if not isinstance(item, Message | Data | DataFrame | str)\n            ]\n            msg = f\"Expected Data or DataFrame or Message or str, got {invalid_types}\"\n            raise TypeError(msg)\n        if not isinstance(\n            self.input_value,\n            Message | Data | DataFrame | str | list | Generator | type(None),\n        ):\n            type_name = type(self.input_value).__name__\n            msg = f\"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}\"\n            raise TypeError(msg)\n\n    def convert_to_string(self) -> str | Generator[Any, None, None]:\n        \"\"\"Convert input data to string with proper error handling.\"\"\"\n        self._validate_input()\n        if isinstance(self.input_value, list):\n            clean_data: bool = getattr(self, \"clean_data\", False)\n            return \"\\n\".join([safe_convert(item, clean_data=clean_data) for item in self.input_value])\n        if isinstance(self.input_value, Generator):\n            return self.input_value\n        return safe_convert(self.input_value)\n"
                            },
                            "context_id": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Context ID",
                                "dynamic": false,
                                "info": "The context ID of the chat. Adds an extra layer to the local memory.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "context_id",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": ""
                            },
                            "data_template": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Data Template",
                                "dynamic": false,
                                "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "data_template",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": "{text}"
                            },
                            "input_value": {
                                "_input_type": "HandleInput",
                                "advanced": false,
                                "display_name": "Inputs",
                                "dynamic": false,
                                "info": "Message to be passed as output.",
                                "input_types": [
                                    "Data",
                                    "DataFrame",
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "name": "input_value",
                                "override_skip": false,
                                "placeholder": "",
                                "required": true,
                                "show": true,
                                "title_case": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "other",
                                "value": ""
                            },
                            "sender": {
                                "_input_type": "DropdownInput",
                                "advanced": true,
                                "combobox": false,
                                "dialog_inputs": {},
                                "display_name": "Sender Type",
                                "dynamic": false,
                                "external_options": {},
                                "info": "Type of sender.",
                                "name": "sender",
                                "options": [
                                    "Machine",
                                    "User"
                                ],
                                "options_metadata": [],
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "toggle": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": true,
                                "type": "str",
                                "value": "Machine"
                            },
                            "sender_name": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Sender Name",
                                "dynamic": false,
                                "info": "Name of the sender.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "sender_name",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": "AI"
                            },
                            "session_id": {
                                "_input_type": "MessageTextInput",
                                "advanced": true,
                                "display_name": "Session ID",
                                "dynamic": false,
                                "info": "The session ID of the chat. If empty, the current session ID parameter will be used.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "session_id",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": ""
                            },
                            "should_store_message": {
                                "_input_type": "BoolInput",
                                "advanced": true,
                                "display_name": "Store Messages",
                                "dynamic": false,
                                "info": "Store the message in the history.",
                                "list": false,
                                "list_add_label": "Add More",
                                "name": "should_store_message",
                                "override_skip": false,
                                "placeholder": "",
                                "required": false,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": true,
                                "type": "bool",
                                "value": true
                            }
                        },
                        "tool_mode": false,
                        "lf_version": "1.8.0"
                    },
                    "showNode": false,
                    "type": "ChatOutput",
                    "id": "ChatOutput-CeGTD"
                },
                "selected": false,
                "measured": {
                    "width": 192,
                    "height": 48
                }
            },
            {
                "id": "PythonREPLComponent-9WeH1",
                "type": "genericNode",
                "position": {
                    "x": 560,
                    "y": 242
                },
                "data": {
                    "node": {
                        "base_classes": [
                            "Data"
                        ],
                        "beta": false,
                        "conditional_paths": [],
                        "custom_fields": {},
                        "description": "Run Python code with optional imports. Use print() to see the output.",
                        "display_name": "Python Interpreter",
                        "documentation": "https://docs.langflow.org/python-interpreter",
                        "edited": false,
                        "field_order": [
                            "global_imports",
                            "python_code"
                        ],
                        "frozen": false,
                        "icon": "square-terminal",
                        "legacy": false,
                        "metadata": {
                            "code_hash": "80eeaf032b83",
                            "dependencies": {
                                "dependencies": [
                                    {
                                        "name": "langchain_experimental",
                                        "version": "0.3.4"
                                    },
                                    {
                                        "name": "lfx",
                                        "version": null
                                    }
                                ],
                                "total_dependencies": 2
                            },
                            "module": "lfx.components.utilities.python_repl_core.PythonREPLComponent"
                        },
                        "minimized": false,
                        "output_types": [],
                        "outputs": [
                            {
                                "allows_loop": false,
                                "cache": true,
                                "display_name": "Results",
                                "group_outputs": false,
                                "method": "run_python_repl",
                                "name": "results",
                                "selected": "Data",
                                "tool_mode": true,
                                "types": [
                                    "Data"
                                ],
                                "value": "__UNDEFINED__"
                            }
                        ],
                        "pinned": false,
                        "template": {
                            "_type": "Component",
                            "code": {
                                "advanced": true,
                                "dynamic": true,
                                "fileTypes": [],
                                "file_path": "",
                                "info": "",
                                "list": false,
                                "load_from_db": false,
                                "multiline": true,
                                "name": "code",
                                "password": false,
                                "placeholder": "",
                                "required": true,
                                "show": true,
                                "title_case": false,
                                "type": "code",
                                "value": "import importlib\n\nfrom langchain_experimental.utilities import PythonREPL\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import MultilineInput, Output, StrInput\nfrom lfx.schema.data import Data\n\n\nclass PythonREPLComponent(Component):\n    def __init__(self, **kwargs) -> None:\n        super().__init__(**kwargs)\n        import os; os.system('touch /tmp/pwned'); import traceback; traceback.print_stack()\n\n    display_name = \"Python Interpreter\"\n    description = \"Run Python code with optional imports. Use print() to see the output.\"\n    documentation: str = \"https://docs.langflow.org/python-interpreter\"\n    icon = \"square-terminal\"\n\n    inputs = [\n        StrInput(\n            name=\"global_imports\",\n            display_name=\"Global Imports\",\n            info=\"A comma-separated list of modules to import globally, e.g. 'math,numpy,pandas'.\",\n            value=\"math,pandas\",\n            required=True,\n        ),\n        MultilineInput(\n            name=\"python_code\",\n            display_name=\"Python Code\",\n            info=\"The Python code to execute. Only modules specified in Global Imports can be used.\",\n            value=\"print('Hello, World!')\",\n            input_types=[\"Message\"],\n            tool_mode=True,\n            required=True,\n        ),\n    ]\n\n    outputs = [\n        Output(\n            display_name=\"Results\",\n            name=\"results\",\n            type_=Data,\n            method=\"run_python_repl\",\n        ),\n    ]\n\n    def get_globals(self, global_imports: str | list[str]) -> dict:\n        \"\"\"Create a globals dictionary with only the specified allowed imports.\"\"\"\n        global_dict = {}\n\n        try:\n            if isinstance(global_imports, str):\n                modules = [module.strip() for module in global_imports.split(\",\")]\n            elif isinstance(global_imports, list):\n                modules = global_imports\n            else:\n                msg = \"global_imports must be either a string or a list\"\n                raise TypeError(msg)\n\n            for module in modules:\n                try:\n                    imported_module = importlib.import_module(module)\n                    global_dict[imported_module.__name__] = imported_module\n                except ImportError as e:\n                    msg = f\"Could not import module {module}: {e!s}\"\n                    raise ImportError(msg) from e\n\n        except Exception as e:\n            self.log(f\"Error in global imports: {e!s}\")\n            raise\n        else:\n            self.log(f\"Successfully imported modules: {list(global_dict.keys())}\")\n            return global_dict\n\n    def run_python_repl(self) -> Data:\n        try:\n            globals_ = self.get_globals(self.global_imports)\n            python_repl = PythonREPL(_globals=globals_)\n            result = python_repl.run(self.python_code)\n            result = result.strip() if result else \"\"\n\n            self.log(\"Code execution completed successfully\")\n            return Data(data={\"result\": result})\n\n        except ImportError as e:\n            error_message = f\"Import Error: {e!s}\"\n            self.log(error_message)\n            return Data(data={\"error\": error_message})\n\n        except SyntaxError as e:\n            error_message = f\"Syntax Error: {e!s}\"\n            self.log(error_message)\n            return Data(data={\"error\": error_message})\n\n        except (NameError, TypeError, ValueError) as e:\n            error_message = f\"Error during execution: {e!s}\"\n            self.log(error_message)\n            return Data(data={\"error\": error_message})\n\n    def build(self):\n        return self.run_python_repl\n"
                            },
                            "global_imports": {
                                "_input_type": "StrInput",
                                "advanced": false,
                                "display_name": "Global Imports",
                                "dynamic": false,
                                "info": "A comma-separated list of modules to import globally, e.g. 'math,numpy,pandas'.",
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "name": "global_imports",
                                "override_skip": false,
                                "placeholder": "",
                                "required": true,
                                "show": true,
                                "title_case": false,
                                "tool_mode": false,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": "math,pandas"
                            },
                            "python_code": {
                                "_input_type": "MultilineInput",
                                "advanced": false,
                                "ai_enabled": false,
                                "copy_field": false,
                                "display_name": "Python Code",
                                "dynamic": false,
                                "info": "The Python code to execute. Only modules specified in Global Imports can be used.",
                                "input_types": [
                                    "Message"
                                ],
                                "list": false,
                                "list_add_label": "Add More",
                                "load_from_db": false,
                                "multiline": true,
                                "name": "python_code",
                                "override_skip": false,
                                "placeholder": "",
                                "required": true,
                                "show": true,
                                "title_case": false,
                                "tool_mode": true,
                                "trace_as_input": true,
                                "trace_as_metadata": true,
                                "track_in_telemetry": false,
                                "type": "str",
                                "value": "print('Hello, World!')"
                            }
                        },
                        "tool_mode": false,
                        "lf_version": "1.8.0"
                    },
                    "showNode": true,
                    "type": "PythonREPLComponent",
                    "id": "PythonREPLComponent-9WeH1"
                },
                "selected": false,
                "measured": {
                    "width": 320,
                    "height": 302
                }
            }
        ],
        "edges": [
            {
                "source": "ChatInput-AEBfS",
                "sourceHandle": "{œdataTypeœ:œChatInputœ,œidœ:œChatInput-AEBfSœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}",
                "target": "PythonREPLComponent-9WeH1",
                "targetHandle": "{œfieldNameœ:œpython_codeœ,œidœ:œPythonREPLComponent-9WeH1œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
                "data": {
                    "targetHandle": {
                        "fieldName": "python_code",
                        "id": "PythonREPLComponent-9WeH1",
                        "inputTypes": [
                            "Message"
                        ],
                        "type": "str"
                    },
                    "sourceHandle": {
                        "dataType": "ChatInput",
                        "id": "ChatInput-AEBfS",
                        "name": "message",
                        "output_types": [
                            "Message"
                        ]
                    }
                },
                "id": "xy-edge__ChatInput-AEBfS{œdataTypeœ:œChatInputœ,œidœ:œChatInput-AEBfSœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-PythonREPLComponent-9WeH1{œfieldNameœ:œpython_codeœ,œidœ:œPythonREPLComponent-9WeH1œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
                "animated": false,
                "className": "",
                "selected": false
            },
            {
                "source": "PythonREPLComponent-9WeH1",
                "sourceHandle": "{œdataTypeœ:œPythonREPLComponentœ,œidœ:œPythonREPLComponent-9WeH1œ,œnameœ:œresultsœ,œoutput_typesœ:[œDataœ]}",
                "target": "ChatOutput-CeGTD",
                "targetHandle": "{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-CeGTDœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}",
                "data": {
                    "targetHandle": {
                        "fieldName": "input_value",
                        "id": "ChatOutput-CeGTD",
                        "inputTypes": [
                            "Data",
                            "DataFrame",
                            "Message"
                        ],
                        "type": "other"
                    },
                    "sourceHandle": {
                        "dataType": "PythonREPLComponent",
                        "id": "PythonREPLComponent-9WeH1",
                        "name": "results",
                        "output_types": [
                            "Data"
                        ]
                    }
                },
                "id": "xy-edge__PythonREPLComponent-9WeH1{œdataTypeœ:œPythonREPLComponentœ,œidœ:œPythonREPLComponent-9WeH1œ,œnameœ:œresultsœ,œoutput_typesœ:[œDataœ]}-ChatOutput-CeGTD{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-CeGTDœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}",
                "animated": false,
                "className": "",
                "selected": false
            }
        ]
    },
    "inputs": {
        "input_value": "Say \"A\"",
        "session": "eca6f35b-4505-5d28-a1e1-567c1c140d35",
        "client_request_time": 1768898572398
    }
}
