diff --git a/src/backend/base/langflow/components/inputs/StringListInput.py b/src/backend/base/langflow/components/inputs/StringListInput.py new file mode 100644 index 000000000..1fef86be1 --- /dev/null +++ b/src/backend/base/langflow/components/inputs/StringListInput.py @@ -0,0 +1,13 @@ +# from langflow.field_typing import Data +from langflow.schema import Record +from langflow.interface.custom.custom_component import CustomComponent + + +class StringListInput(CustomComponent): + display_name = "String List Input" + + def build_config(self): + return {"param": {"display_name": "String List Input", "field_type": "str", "list": True}} + + def build(self, param: list) -> Record: + return Record(data=param) diff --git a/src/backend/base/langflow/components/outputs/KeyPairOutput.py b/src/backend/base/langflow/components/outputs/KeyPairOutput.py new file mode 100644 index 000000000..f2204bb83 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/KeyPairOutput.py @@ -0,0 +1,19 @@ +from langflow.base.io.text import TextComponent +from langflow.field_typing.constants import Data + + +class KeyPairOutput(TextComponent): + display_name = "Dictionary Output" + description = "Dictionary Output." + + def build_config(self): + return { + "input_value": { + "display_name": "Dictionaries", + "field_type": "dict", + "list": True + } + } + + def build(self, input_value: dict) -> dict: + return input_value diff --git a/src/backend/base/langflow/components/outputs/StringListOutput.py b/src/backend/base/langflow/components/outputs/StringListOutput.py new file mode 100644 index 000000000..9e5384986 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/StringListOutput.py @@ -0,0 +1,13 @@ +# from langflow.field_typing import Data +from langflow.schema import Record +from langflow.interface.custom.custom_component import CustomComponent + + +class StringListOutput(CustomComponent): + display_name = "String List Output" + + def build_config(self): + return {"param": {"display_name": "String List Output", "field_type": "str", "list": True}} + + def build(self, param: list) -> Record: + return Record(data=param) diff --git a/src/frontend/src/constants/constants.ts b/src/frontend/src/constants/constants.ts index f8d45da02..6893d0d03 100644 --- a/src/frontend/src/constants/constants.ts +++ b/src/frontend/src/constants/constants.ts @@ -716,6 +716,7 @@ export const INPUT_TYPES = new Set([ "TextInput", "KeyPairInput", "JsonInput", + "StringListInput", ]); export const OUTPUT_TYPES = new Set([ "ChatOutput", @@ -724,6 +725,8 @@ export const OUTPUT_TYPES = new Set([ "ImageOutput", "CSVOutput", "JsonOutput", + "KeyPairOutput", + "StringListOutput", ]); export const CHAT_FIRST_INITIAL_TEXT = diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx index b0b557c55..2e95e78ef 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx @@ -4,7 +4,21 @@ import IconComponent from "../../../../../../components/genericIconComponent"; import { Input } from "../../../../../../components/ui/input"; import { classNames } from "../../../../../../utils/utils"; -const IOKeyPairInput = ({ value, onChange, duplicateKey, isList = true }) => { +export type IOKeyPairInputProps = { + value: any; + onChange: (value: any) => void; + duplicateKey: boolean; + isList: boolean; + isInputField?: boolean; +}; + +const IOKeyPairInput = ({ + value, + onChange, + duplicateKey, + isList = true, + isInputField, +}: IOKeyPairInputProps) => { const checkValueType = (value) => { return Array.isArray(value) ? value : [value]; }; @@ -39,6 +53,7 @@ const IOKeyPairInput = ({ value, onChange, duplicateKey, isList = true }) => { className={classNames(duplicateKey ? "input-invalid" : "")} placeholder="Type key..." onChange={(event) => handleChangeKey(event, index)} + disabled={!isInputField} /> { onChange={(event) => handleChangeValue(event.target.value, index) } + disabled={!isInputField} /> - {isList && index === ref.current.length - 1 ? ( + {isList && isInputField && index === ref.current.length - 1 ? ( - ) : isList ? ( + ) : isList && isInputField ? (