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 ? (