/
artctvcode
/
Langflow-Gigachat
Обзор
Документация
Войти
/
artctvcode
/
Langflow-Gigachat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
modules/RAG.json
3 594 строки
180 KB
Marakya
Add modules and components
09 сен 2025, 15:48
09 сен 2025, 15:48
1a1fd75
Код
Авторство
О чём код?
{ "data": { "edges": [ { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "ParserComponent", "id": "ParserComponent-bhCmx", "name": "parsed_text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-OnCPp", "inputTypes": [ "Data", "DataFrame", "Message" ], "type": "other" } }, "id": "reactflow__edge-ParserComponent-bhCmx{œdataTypeœ:œParserComponentœ,œidœ:œParserComponent-bhCmxœ,œnameœ:œparsed_textœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-OnCPp{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-OnCPpœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", "selected": false, "source": "ParserComponent-bhCmx", "sourceHandle": "{œdataTypeœ:œParserComponentœ,œidœ:œParserComponent-bhCmxœ,œnameœ:œparsed_textœ,œoutput_typesœ:[œMessageœ]}", "target": "ChatOutput-OnCPp", "targetHandle": "{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-OnCPpœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "File", "id": "File-K1nDN", "name": "message", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "data_inputs", "id": "SplitText-cWVwV", "inputTypes": [ "Data", "DataFrame", "Message" ], "type": "other" } }, "id": "reactflow__edge-File-K1nDN{œdataTypeœ:œFileœ,œidœ:œFile-K1nDNœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-SplitText-cWVwV{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-cWVwVœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", "selected": false, "source": "File-K1nDN", "sourceHandle": "{œdataTypeœ:œFileœ,œidœ:œFile-K1nDNœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}", "target": "SplitText-cWVwV", "targetHandle": "{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-cWVwVœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", "id": "ChatInput-vIiiq", "name": "message", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "search_query", "id": "Chroma-xHPZs", "inputTypes": [ "Message" ], "type": "query" } }, "id": "reactflow__edge-ChatInput-vIiiq{œdataTypeœ:œChatInputœ,œidœ:œChatInput-vIiiqœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Chroma-xHPZs{œfieldNameœ:œsearch_queryœ,œidœ:œChroma-xHPZsœ,œinputTypesœ:[œMessageœ],œtypeœ:œqueryœ}", "selected": false, "source": "ChatInput-vIiiq", "sourceHandle": "{œdataTypeœ:œChatInputœ,œidœ:œChatInput-vIiiqœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}", "target": "Chroma-xHPZs", "targetHandle": "{œfieldNameœ:œsearch_queryœ,œidœ:œChroma-xHPZsœ,œinputTypesœ:[œMessageœ],œtypeœ:œqueryœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "Chroma", "id": "Chroma-xHPZs", "name": "search_results", "output_types": [ "Data" ] }, "targetHandle": { "fieldName": "input_data", "id": "ParserComponent-Y3Eij", "inputTypes": [ "DataFrame", "Data" ], "type": "other" } }, "id": "reactflow__edge-Chroma-xHPZs{œdataTypeœ:œChromaœ,œidœ:œChroma-xHPZsœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParserComponent-Y3Eij{œfieldNameœ:œinput_dataœ,œidœ:œParserComponent-Y3Eijœ,œinputTypesœ:[œDataFrameœ,œDataœ],œtypeœ:œotherœ}", "selected": false, "source": "Chroma-xHPZs", "sourceHandle": "{œdataTypeœ:œChromaœ,œidœ:œChroma-xHPZsœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}", "target": "ParserComponent-Y3Eij", "targetHandle": "{œfieldNameœ:œinput_dataœ,œidœ:œParserComponent-Y3Eijœ,œinputTypesœ:[œDataFrameœ,œDataœ],œtypeœ:œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", "id": "ChatInput-vIiiq", "name": "message", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "text", "id": "Prompt Template-w0vDk", "inputTypes": [ "Message" ], "type": "str" } }, "id": "reactflow__edge-ChatInput-vIiiq{œdataTypeœ:œChatInputœ,œidœ:œChatInput-vIiiqœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt Template-w0vDk{œfieldNameœ:œtextœ,œidœ:œPrompt Template-w0vDkœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, "source": "ChatInput-vIiiq", "sourceHandle": "{œdataTypeœ:œChatInputœ,œidœ:œChatInput-vIiiqœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}", "target": "Prompt Template-w0vDk", "targetHandle": "{œfieldNameœ:œtextœ,œidœ:œPrompt Template-w0vDkœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "ParserComponent", "id": "ParserComponent-Y3Eij", "name": "parsed_text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "context", "id": "Prompt Template-w0vDk", "inputTypes": [ "Message" ], "type": "str" } }, "id": "reactflow__edge-ParserComponent-Y3Eij{œdataTypeœ:œParserComponentœ,œidœ:œParserComponent-Y3Eijœ,œnameœ:œparsed_textœ,œoutput_typesœ:[œMessageœ]}-Prompt Template-w0vDk{œfieldNameœ:œcontextœ,œidœ:œPrompt Template-w0vDkœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, "source": "ParserComponent-Y3Eij", "sourceHandle": "{œdataTypeœ:œParserComponentœ,œidœ:œParserComponent-Y3Eijœ,œnameœ:œparsed_textœ,œoutput_typesœ:[œMessageœ]}", "target": "Prompt Template-w0vDk", "targetHandle": "{œfieldNameœ:œcontextœ,œidœ:œPrompt Template-w0vDkœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "GigaChatEmbeddings", "id": "GigaChatEmbeddings-wukfd", "name": "embeddings", "output_types": [ "Embeddings" ] }, "targetHandle": { "fieldName": "embedding", "id": "Chroma-xHPZs", "inputTypes": [ "Embeddings" ], "type": "other" } }, "id": "xy-edge__GigaChatEmbeddings-wukfd{œdataTypeœ:œGigaChatEmbeddingsœ,œidœ:œGigaChatEmbeddings-wukfdœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-Chroma-xHPZs{œfieldNameœ:œembeddingœ,œidœ:œChroma-xHPZsœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", "selected": false, "source": "GigaChatEmbeddings-wukfd", "sourceHandle": "{œdataTypeœ:œGigaChatEmbeddingsœ,œidœ:œGigaChatEmbeddings-wukfdœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}", "target": "Chroma-xHPZs", "targetHandle": "{œfieldNameœ:œembeddingœ,œidœ:œChroma-xHPZsœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "Prompt Template", "id": "Prompt Template-w0vDk", "name": "prompt", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "input_message", "id": "GChat-59igK", "inputTypes": [ "Message" ], "type": "str" } }, "id": "xy-edge__Prompt Template-w0vDk{œdataTypeœ:œPrompt Templateœ,œidœ:œPrompt Template-w0vDkœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-GChat-59igK{œfieldNameœ:œinput_messageœ,œidœ:œGChat-59igKœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, "source": "Prompt Template-w0vDk", "sourceHandle": "{œdataTypeœ:œPrompt Templateœ,œidœ:œPrompt Template-w0vDkœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}", "target": "GChat-59igK", "targetHandle": "{œfieldNameœ:œinput_messageœ,œidœ:œGChat-59igKœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "GChat", "id": "GChat-59igK", "name": "output", "output_types": [ "Data" ] }, "targetHandle": { "fieldName": "input_data", "id": "ParserComponent-bhCmx", "inputTypes": [ "DataFrame", "Data" ], "type": "other" } }, "id": "xy-edge__GChat-59igK{œdataTypeœ:œGChatœ,œidœ:œGChat-59igKœ,œnameœ:œoutputœ,œoutput_typesœ:[œDataœ]}-ParserComponent-bhCmx{œfieldNameœ:œinput_dataœ,œidœ:œParserComponent-bhCmxœ,œinputTypesœ:[œDataFrameœ,œDataœ],œtypeœ:œotherœ}", "selected": false, "source": "GChat-59igK", "sourceHandle": "{œdataTypeœ:œGChatœ,œidœ:œGChat-59igKœ,œnameœ:œoutputœ,œoutput_typesœ:[œDataœ]}", "target": "ParserComponent-bhCmx", "targetHandle": "{œfieldNameœ:œinput_dataœ,œidœ:œParserComponent-bhCmxœ,œinputTypesœ:[œDataFrameœ,œDataœ],œtypeœ:œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "SplitText", "id": "SplitText-cWVwV", "name": "dataframe", "output_types": [ "DataFrame" ] }, "targetHandle": { "fieldName": "ingest_data", "id": "Chroma-szIfX", "inputTypes": [ "Data", "DataFrame" ], "type": "other" } }, "id": "xy-edge__SplitText-cWVwV{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-cWVwVœ,œnameœ:œdataframeœ,œoutput_typesœ:[œDataFrameœ]}-Chroma-szIfX{œfieldNameœ:œingest_dataœ,œidœ:œChroma-szIfXœ,œinputTypesœ:[œDataœ,œDataFrameœ],œtypeœ:œotherœ}", "selected": false, "source": "SplitText-cWVwV", "sourceHandle": "{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-cWVwVœ,œnameœ:œdataframeœ,œoutput_typesœ:[œDataFrameœ]}", "target": "Chroma-szIfX", "targetHandle": "{œfieldNameœ:œingest_dataœ,œidœ:œChroma-szIfXœ,œinputTypesœ:[œDataœ,œDataFrameœ],œtypeœ:œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "GigaChatEmbeddings", "id": "GigaChatEmbeddings-wukfd", "name": "embeddings", "output_types": [ "Embeddings" ] }, "targetHandle": { "fieldName": "embedding", "id": "Chroma-szIfX", "inputTypes": [ "Embeddings" ], "type": "other" } }, "id": "xy-edge__GigaChatEmbeddings-wukfd{œdataTypeœ:œGigaChatEmbeddingsœ,œidœ:œGigaChatEmbeddings-wukfdœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-Chroma-szIfX{œfieldNameœ:œembeddingœ,œidœ:œChroma-szIfXœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", "selected": false, "source": "GigaChatEmbeddings-wukfd", "sourceHandle": "{œdataTypeœ:œGigaChatEmbeddingsœ,œidœ:œGigaChatEmbeddings-wukfdœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}", "target": "Chroma-szIfX", "targetHandle": "{œfieldNameœ:œembeddingœ,œidœ:œChroma-szIfXœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}" } ], "nodes": [ { "data": { "description": "Get chat inputs from the Playground.", "display_name": "Chat Input", "id": "ChatInput-vIiiq", "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/components-io#chat-input", "edited": false, "field_order": [ "input_value", "should_store_message", "sender", "sender_name", "session_id", "files", "background_color", "chat_icon", "text_color" ], "frozen": false, "icon": "MessagesSquare", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": true, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Chat Message", "group_outputs": false, "hidden": false, "method": "message_response", "name": "message", "options": null, "required_inputs": null, "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "background_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Background Color", "dynamic": false, "info": "The background color of the icon.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "background_color", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "chat_icon": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Icon", "dynamic": false, "info": "The icon of the message.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "chat_icon", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "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 langflow.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.inputs.inputs import BoolInput\nfrom langflow.io import (\n DropdownInput,\n FileInput,\n MessageTextInput,\n MultilineInput,\n Output,\n)\nfrom langflow.schema.message import Message\nfrom langflow.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/components-io#chat-input\"\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 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 MessageTextInput(\n name=\"background_color\",\n display_name=\"Background Color\",\n info=\"The background color of the icon.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"chat_icon\",\n display_name=\"Icon\",\n info=\"The icon of the message.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"text_color\",\n display_name=\"Text Color\",\n info=\"The text color of the name\",\n advanced=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 background_color = self.background_color\n text_color = self.text_color\n icon = self.chat_icon\n\n message = await Message.create(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n files=self.files,\n properties={\n \"background_color\": background_color,\n \"text_color\": text_color,\n \"icon\": icon,\n },\n )\n if self.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" }, "files": { "_input_type": "FileInput", "advanced": true, "display_name": "Files", "dynamic": false, "fileTypes": [ "txt", "md", "mdx", "csv", "json", "yaml", "yml", "xml", "html", "htm", "pdf", "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", "placeholder": "", "required": false, "show": true, "temp_file": true, "title_case": false, "trace_as_metadata": true, "type": "file", "value": "" }, "input_value": { "_input_type": "MultilineInput", "advanced": 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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "поле flag_click" }, "sender": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "dialog_inputs": {}, "display_name": "Sender Type", "dynamic": false, "info": "Type of sender.", "name": "sender", "options": [ "Machine", "User" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": 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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true }, "text_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Text Color", "dynamic": false, "info": "The text color of the name", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "text_color", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" } }, "tool_mode": false }, "type": "ChatInput" }, "dragging": false, "height": 234, "id": "ChatInput-vIiiq", "measured": { "height": 234, "width": 320 }, "position": { "x": -641.2135583064139, "y": 742.7060210846197 }, "positionAbsolute": { "x": 689.5720422421635, "y": 765.155834131403 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "ChatOutput-OnCPp", "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/components-io#chat-output", "edited": false, "field_order": [ "input_value", "should_store_message", "sender", "sender_name", "session_id", "data_template", "background_color", "chat_icon", "text_color", "clean_data" ], "frozen": false, "icon": "MessagesSquare", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": true, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Output Message", "group_outputs": false, "method": "message_response", "name": "message", "options": null, "required_inputs": null, "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "background_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Background Color", "dynamic": false, "info": "The background color of the icon.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "background_color", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "chat_icon": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Icon", "dynamic": false, "info": "The icon of the message.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "chat_icon", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "clean_data": { "_input_type": "BoolInput", "advanced": true, "display_name": "Basic Clean Data", "dynamic": false, "info": "Whether to clean the data", "list": false, "list_add_label": "Add More", "name": "clean_data", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": 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 langflow.base.io.chat import ChatComponent\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.schema.properties import Source\nfrom langflow.template.field.base import Output\nfrom langflow.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/components-io#chat-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=\"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 MessageTextInput(\n name=\"background_color\",\n display_name=\"Background Color\",\n info=\"The background color of the icon.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"chat_icon\",\n display_name=\"Icon\",\n info=\"The icon of the message.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"text_color\",\n display_name=\"Text Color\",\n info=\"The text color of the name\",\n advanced=True,\n ),\n BoolInput(\n name=\"clean_data\",\n display_name=\"Basic Clean Data\",\n value=True,\n info=\"Whether to clean the data\",\n advanced=True,\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, icon, display_name, source_id = self.get_properties_from_source_component()\n background_color = self.background_color\n text_color = self.text_color\n if self.chat_icon:\n icon = self.chat_icon\n\n # Create or use existing Message object\n if isinstance(self.input_value, Message):\n message = self.input_value\n # Update message properties\n message.text = text\n else:\n message = Message(text=text)\n\n # Set message properties\n message.sender = self.sender\n message.sender_name = self.sender_name\n message.session_id = self.session_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 message.properties.icon = icon\n message.properties.background_color = background_color\n message.properties.text_color = text_color\n\n # Store message if needed\n if self.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 return \"\\n\".join([safe_convert(item, clean_data=self.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" }, "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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "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", "placeholder": "", "required": true, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "sender": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "dialog_inputs": {}, "display_name": "Sender Type", "dynamic": false, "info": "Type of sender.", "name": "sender", "options": [ "Machine", "User" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": 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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "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", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true }, "text_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Text Color", "dynamic": false, "info": "The text color of the name", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "text_color", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" } }, "tool_mode": false }, "type": "ChatOutput" }, "dragging": false, "height": 234, "id": "ChatOutput-OnCPp", "measured": { "height": 234, "width": 320 }, "position": { "x": 1417.8734941094253, "y": 835.9311769035916 }, "positionAbsolute": { "x": 1444.936881624563, "y": 872.7273956769025 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "ParserComponent-bhCmx", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Extracts text using a template.", "display_name": "Parser", "documentation": "https://docs.langflow.org/components-processing#parser", "edited": false, "field_order": [ "input_data", "mode", "pattern", "sep" ], "frozen": false, "icon": "braces", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Parsed Text", "group_outputs": false, "hidden": false, "method": "parse_combined_text", "name": "parsed_text", "options": null, "required_inputs": null, "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 langflow.custom.custom_component.component import Component\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, HandleInput, MessageTextInput, MultilineInput, TabInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.template.field.base import Output\n\n\nclass ParserComponent(Component):\n display_name = \"Parser\"\n description = \"Extracts text using a template.\"\n documentation: str = \"https://docs.langflow.org/components-processing#parser\"\n icon = \"braces\"\n\n inputs = [\n HandleInput(\n name=\"input_data\",\n display_name=\"Data or DataFrame\",\n input_types=[\"DataFrame\", \"Data\"],\n info=\"Accepts either a DataFrame or a Data object.\",\n required=True,\n ),\n TabInput(\n name=\"mode\",\n display_name=\"Mode\",\n options=[\"Parser\", \"Stringify\"],\n value=\"Parser\",\n info=\"Convert into raw string instead of using a template.\",\n real_time_refresh=True,\n ),\n MultilineInput(\n name=\"pattern\",\n display_name=\"Template\",\n info=(\n \"Use variables within curly brackets to extract column values for DataFrames \"\n \"or key values for Data.\"\n \"For example: `Name: {Name}, Age: {Age}, Country: {Country}`\"\n ),\n value=\"Text: {text}\", # Example default\n dynamic=True,\n show=True,\n required=True,\n ),\n MessageTextInput(\n name=\"sep\",\n display_name=\"Separator\",\n advanced=True,\n value=\"\\n\",\n info=\"String used to separate rows/items.\",\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Parsed Text\",\n name=\"parsed_text\",\n info=\"Formatted text output.\",\n method=\"parse_combined_text\",\n ),\n ]\n\n def update_build_config(self, build_config, field_value, field_name=None):\n \"\"\"Dynamically hide/show `template` and enforce requirement based on `stringify`.\"\"\"\n if field_name == \"mode\":\n build_config[\"pattern\"][\"show\"] = self.mode == \"Parser\"\n build_config[\"pattern\"][\"required\"] = self.mode == \"Parser\"\n if field_value:\n clean_data = BoolInput(\n name=\"clean_data\",\n display_name=\"Clean Data\",\n info=(\n \"Enable to clean the data by removing empty rows and lines \"\n \"in each cell of the DataFrame/ Data object.\"\n ),\n value=True,\n advanced=True,\n required=False,\n )\n build_config[\"clean_data\"] = clean_data.to_dict()\n else:\n build_config.pop(\"clean_data\", None)\n\n return build_config\n\n def _clean_args(self):\n \"\"\"Prepare arguments based on input type.\"\"\"\n input_data = self.input_data\n\n match input_data:\n case list() if all(isinstance(item, Data) for item in input_data):\n msg = \"List of Data objects is not supported.\"\n raise ValueError(msg)\n case DataFrame():\n return input_data, None\n case Data():\n return None, input_data\n case dict() if \"data\" in input_data:\n try:\n if \"columns\" in input_data: # Likely a DataFrame\n return DataFrame.from_dict(input_data), None\n # Likely a Data object\n return None, Data(**input_data)\n except (TypeError, ValueError, KeyError) as e:\n msg = f\"Invalid structured input provided: {e!s}\"\n raise ValueError(msg) from e\n case _:\n msg = f\"Unsupported input type: {type(input_data)}. Expected DataFrame or Data.\"\n raise ValueError(msg)\n\n def parse_combined_text(self) -> Message:\n \"\"\"Parse all rows/items into a single text or convert input to string if `stringify` is enabled.\"\"\"\n # Early return for stringify option\n if self.mode == \"Stringify\":\n return self.convert_to_string()\n\n df, data = self._clean_args()\n\n lines = []\n if df is not None:\n for _, row in df.iterrows():\n formatted_text = self.pattern.format(**row.to_dict())\n lines.append(formatted_text)\n elif data is not None:\n formatted_text = self.pattern.format(**data.data)\n lines.append(formatted_text)\n\n combined_text = self.sep.join(lines)\n self.status = combined_text\n return Message(text=combined_text)\n\n def convert_to_string(self) -> Message:\n \"\"\"Convert input data to string with proper error handling.\"\"\"\n result = \"\"\n if isinstance(self.input_data, list):\n result = \"\\n\".join([safe_convert(item, clean_data=self.clean_data or False) for item in self.input_data])\n else:\n result = safe_convert(self.input_data or False)\n self.log(f\"Converted to string with length: {len(result)}\")\n\n message = Message(text=result)\n self.status = message\n return message\n" }, "input_data": { "_input_type": "HandleInput", "advanced": false, "display_name": "Data or DataFrame", "dynamic": false, "info": "Accepts either a DataFrame or a Data object.", "input_types": [ "DataFrame", "Data" ], "list": false, "list_add_label": "Add More", "name": "input_data", "placeholder": "", "required": true, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "mode": { "_input_type": "TabInput", "advanced": false, "display_name": "Mode", "dynamic": false, "info": "Convert into raw string instead of using a template.", "name": "mode", "options": [ "Parser", "Stringify" ], "placeholder": "", "real_time_refresh": true, "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "tab", "value": "Parser" }, "pattern": { "_input_type": "MultilineInput", "advanced": false, "copy_field": false, "display_name": "Template", "dynamic": true, "info": "Use variables within curly brackets to extract column values for DataFrames or key values for Data.For example: `Name: {Name}, Age: {Age}, Country: {Country}`", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "multiline": true, "name": "pattern", "placeholder": "", "required": true, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "Text: {text}" }, "sep": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Separator", "dynamic": false, "info": "String used to separate rows/items.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "sep", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "\n" } }, "tool_mode": false }, "showNode": true, "type": "ParserComponent" }, "dragging": false, "id": "ParserComponent-bhCmx", "measured": { "height": 325, "width": 320 }, "position": { "x": 902.4172863368024, "y": 744.963043204565 }, "selected": false, "type": "genericNode" }, { "data": { "id": "YandexGPT-JvSi2", "node": { "base_classes": [ "Data" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "LLM от Яндекс", "display_name": "Yandex GPT", "documentation": "https://cloud.yandex.ru/docs/yandexgpt", "edited": true, "field_order": [ "input_message", "api_key", "folder_id", "system_prompt", "temperature", "max_tokens" ], "frozen": false, "icon": "custom_components", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Output", "hidden": false, "method": "build_output", "name": "output", "options": null, "required_inputs": null, "selected": "Data", "tool_mode": true, "types": [ "Data" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "api_key": { "_input_type": "SecretStrInput", "advanced": false, "display_name": "Yandex API Key", "dynamic": false, "info": "", "input_types": [], "load_from_db": false, "name": "api_key", "password": true, "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "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 langflow.field_typing import Data\nfrom langflow.custom import Component\nfrom langflow.io import MessageTextInput, Output, SecretStrInput\nfrom yandex_cloud_ml_sdk import YCloudML\n\nclass YandexGPT(Component):\n display_name = \"Yandex GPT\"\n description = \"LLM от Яндекс\"\n documentation: str = \"https://cloud.yandex.ru/docs/yandexgpt\"\n icon = \"custom_components\"\n\n inputs = [\n MessageTextInput(name=\"input_message\", display_name=\"Input Message\"),\n SecretStrInput(name=\"api_key\", display_name=\"Yandex API Key\"),\n SecretStrInput(name=\"folder_id\", display_name=\"Yandex Folder ID\"),\n MessageTextInput(\n name=\"system_prompt\",\n display_name=\"System Prompt\",\n value=\"Ты — умный и профессиональный ассистент. Отвечай понятно и структурированно.\"\n ),\n MessageTextInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=\"0.1\"\n ),\n MessageTextInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n value=\"500\"\n ),\n ]\n\n outputs = [\n Output(display_name=\"Output\", name=\"output\", method=\"build_output\", type=\"Data\"),\n ]\n\n def build_output(self) -> Data:\n sdk = YCloudML(\n folder_id=self.folder_id,\n auth=self.api_key\n )\n\n temperature = float(self.temperature)\n max_tokens = int(self.max_tokens)\n\n messages = [\n {\"role\": \"system\", \"text\": self.system_prompt.strip()},\n {\"role\": \"user\", \"text\": self.input_message.strip()}\n ]\n\n result = (\n sdk.models.completions(\"yandexgpt\")\n .configure(\n temperature=temperature,\n max_tokens=max_tokens\n )\n .run(messages)\n )\n\n if result and hasattr(result, 'alternatives') and result.alternatives:\n text_result = result.alternatives[0].text\n else:\n text_result = \"Не удалось получить ответ от модели\"\n\n return Data(text=text_result)\n\n\n\n" }, "folder_id": { "_input_type": "SecretStrInput", "advanced": false, "display_name": "Yandex Folder ID", "dynamic": false, "info": "", "input_types": [], "load_from_db": false, "name": "folder_id", "password": true, "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "input_message": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Input Message", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "input_message", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "max_tokens": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Max Tokens", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "max_tokens", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "500" }, "system_prompt": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "System Prompt", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "system_prompt", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "Ты — умный и профессиональный ассистент. Отвечай понятно и структурированно." }, "temperature": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Temperature", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "temperature", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "0.1" } }, "tool_mode": false }, "showNode": true, "type": "YandexGPT" }, "dragging": false, "id": "YandexGPT-JvSi2", "measured": { "height": 612, "width": 320 }, "position": { "x": 416.0911719998985, "y": 587.5649332231625 }, "selected": false, "type": "genericNode" }, { "data": { "id": "File-K1nDN", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Loads content from one or more files.", "display_name": "File", "documentation": "https://docs.langflow.org/components-data#file", "edited": false, "field_order": [ "path", "file_path", "separator", "silent_errors", "delete_server_file_after_processing", "ignore_unsupported_extensions", "ignore_unspecified_files", "use_multithreading", "concurrency_multithreading" ], "frozen": false, "icon": "file-text", "last_updated": "2025-08-31T13:25:08.206Z", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Raw Content", "group_outputs": false, "method": "load_files_message", "name": "message", "options": null, "required_inputs": null, "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" }, { "allows_loop": false, "cache": true, "display_name": "File Path", "group_outputs": false, "hidden": null, "method": "load_files_path", "name": "path", "options": null, "required_inputs": null, "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 copy import deepcopy\nfrom typing import Any\n\nfrom langflow.base.data.base_file import BaseFileComponent\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parallel_load_data, parse_text_file_to_data\nfrom langflow.io import BoolInput, FileInput, IntInput, Output\nfrom langflow.schema.data import Data\n\n\nclass FileComponent(BaseFileComponent):\n \"\"\"Handles loading and processing of individual or zipped text files.\n\n This component supports processing multiple valid files within a zip archive,\n resolving paths, validating file types, and optionally using multithreading for processing.\n \"\"\"\n\n display_name = \"File\"\n description = \"Loads content from one or more files.\"\n documentation: str = \"https://docs.langflow.org/components-data#file\"\n icon = \"file-text\"\n name = \"File\"\n\n VALID_EXTENSIONS = TEXT_FILE_TYPES\n\n _base_inputs = deepcopy(BaseFileComponent._base_inputs)\n\n for input_item in _base_inputs:\n if isinstance(input_item, FileInput) and input_item.name == \"path\":\n input_item.real_time_refresh = True\n break\n\n inputs = [\n *_base_inputs,\n BoolInput(\n name=\"use_multithreading\",\n display_name=\"[Deprecated] Use Multithreading\",\n advanced=True,\n value=True,\n info=\"Set 'Processing Concurrency' greater than 1 to enable multithreading.\",\n ),\n IntInput(\n name=\"concurrency_multithreading\",\n display_name=\"Processing Concurrency\",\n advanced=True,\n info=\"When multiple files are being processed, the number of files to process concurrently.\",\n value=1,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Raw Content\", name=\"message\", method=\"load_files_message\"),\n ]\n\n def update_outputs(self, frontend_node: dict, field_name: str, field_value: Any) -> dict:\n \"\"\"Dynamically show only the relevant output based on the number of files processed.\"\"\"\n if field_name == \"path\":\n # Add outputs based on the number of files in the path\n if len(field_value) == 0:\n return frontend_node\n\n frontend_node[\"outputs\"] = []\n\n if len(field_value) == 1:\n # We need to check if the file is structured content\n file_path = frontend_node[\"template\"][\"path\"][\"file_path\"][0]\n if file_path.endswith((\".csv\", \".xlsx\", \".parquet\")):\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Structured Content\", name=\"dataframe\", method=\"load_files_structured\"),\n )\n elif file_path.endswith(\".json\"):\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Structured Content\", name=\"json\", method=\"load_files_json\"),\n )\n\n # All files get the raw content and path outputs\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Raw Content\", name=\"message\", method=\"load_files_message\"),\n )\n frontend_node[\"outputs\"].append(\n Output(display_name=\"File Path\", name=\"path\", method=\"load_files_path\"),\n )\n else:\n # For multiple files, we only show the files output\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Files\", name=\"dataframe\", method=\"load_files\"),\n )\n\n return frontend_node\n\n def process_files(self, file_list: list[BaseFileComponent.BaseFile]) -> list[BaseFileComponent.BaseFile]:\n \"\"\"Processes files either sequentially or in parallel, depending on concurrency settings.\n\n Args:\n file_list (list[BaseFileComponent.BaseFile]): List of files to process.\n\n Returns:\n list[BaseFileComponent.BaseFile]: Updated list of files with merged data.\n \"\"\"\n\n def process_file(file_path: str, *, silent_errors: bool = False) -> Data | None:\n \"\"\"Processes a single file and returns its Data object.\"\"\"\n try:\n return parse_text_file_to_data(file_path, silent_errors=silent_errors)\n except FileNotFoundError as e:\n msg = f\"File not found: {file_path}. Error: {e}\"\n self.log(msg)\n if not silent_errors:\n raise\n return None\n except Exception as e:\n msg = f\"Unexpected error processing {file_path}: {e}\"\n self.log(msg)\n if not silent_errors:\n raise\n return None\n\n if not file_list:\n msg = \"No files to process.\"\n raise ValueError(msg)\n\n concurrency = 1 if not self.use_multithreading else max(1, self.concurrency_multithreading)\n file_count = len(file_list)\n\n parallel_processing_threshold = 2\n if concurrency < parallel_processing_threshold or file_count < parallel_processing_threshold:\n if file_count > 1:\n self.log(f\"Processing {file_count} files sequentially.\")\n processed_data = [process_file(str(file.path), silent_errors=self.silent_errors) for file in file_list]\n else:\n self.log(f\"Starting parallel processing of {file_count} files with concurrency: {concurrency}.\")\n file_paths = [str(file.path) for file in file_list]\n processed_data = parallel_load_data(\n file_paths,\n silent_errors=self.silent_errors,\n load_function=process_file,\n max_concurrency=concurrency,\n )\n\n # Use rollup_basefile_data to merge processed data with BaseFile objects\n return self.rollup_data(file_list, processed_data)\n" }, "concurrency_multithreading": { "_input_type": "IntInput", "advanced": true, "display_name": "Processing Concurrency", "dynamic": false, "info": "When multiple files are being processed, the number of files to process concurrently.", "list": false, "list_add_label": "Add More", "name": "concurrency_multithreading", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 1 }, "delete_server_file_after_processing": { "_input_type": "BoolInput", "advanced": true, "display_name": "Delete Server File After Processing", "dynamic": false, "info": "If true, the Server File Path will be deleted after processing.", "list": false, "list_add_label": "Add More", "name": "delete_server_file_after_processing", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true }, "file_path": { "_input_type": "HandleInput", "advanced": true, "display_name": "Server File Path", "dynamic": false, "info": "Data object with a 'file_path' property pointing to server file or a Message object with a path to the file. Supercedes 'Path' but supports same file types.", "input_types": [ "Data", "Message" ], "list": true, "list_add_label": "Add More", "name": "file_path", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "ignore_unspecified_files": { "_input_type": "BoolInput", "advanced": true, "display_name": "Ignore Unspecified Files", "dynamic": false, "info": "If true, Data with no 'file_path' property will be ignored.", "list": false, "list_add_label": "Add More", "name": "ignore_unspecified_files", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": false }, "ignore_unsupported_extensions": { "_input_type": "BoolInput", "advanced": true, "display_name": "Ignore Unsupported Extensions", "dynamic": false, "info": "If true, files with unsupported extensions will not be processed.", "list": false, "list_add_label": "Add More", "name": "ignore_unsupported_extensions", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true }, "path": { "_input_type": "FileInput", "advanced": false, "display_name": "Files", "dynamic": false, "fileTypes": [ "txt", "md", "mdx", "csv", "json", "yaml", "yml", "xml", "html", "htm", "pdf", "docx", "py", "sh", "sql", "js", "ts", "tsx", "zip", "tar", "tgz", "bz2", "gz" ], "file_path": [ "2197ebec-dc41-4c4b-88ef-554c703b8588/БТ_ОТР_140125_без_кода.docx" ], "info": "Supported file extensions: txt, md, mdx, csv, json, yaml, yml, xml, html, htm, pdf, docx, py, sh, sql, js, ts, tsx; optionally bundled in file extensions: zip, tar, tgz, bz2, gz", "list": true, "list_add_label": "Add More", "name": "path", "placeholder": "", "real_time_refresh": true, "required": false, "show": true, "temp_file": false, "title_case": false, "trace_as_metadata": true, "type": "file", "value": "" }, "separator": { "_input_type": "StrInput", "advanced": true, "display_name": "Separator", "dynamic": false, "info": "Specify the separator to use between multiple outputs in Message format.", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "separator", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "\n\n" }, "silent_errors": { "_input_type": "BoolInput", "advanced": true, "display_name": "Silent Errors", "dynamic": false, "info": "If true, errors will not raise an exception.", "list": false, "list_add_label": "Add More", "name": "silent_errors", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": false }, "use_multithreading": { "_input_type": "BoolInput", "advanced": true, "display_name": "[Deprecated] Use Multithreading", "dynamic": false, "info": "Set 'Processing Concurrency' greater than 1 to enable multithreading.", "list": false, "list_add_label": "Add More", "name": "use_multithreading", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true } }, "tool_mode": false }, "selected_output": "message", "showNode": true, "type": "File" }, "dragging": false, "id": "File-K1nDN", "measured": { "height": 216, "width": 320 }, "position": { "x": -850.4580281515434, "y": 2136.349273025825 }, "selected": false, "type": "genericNode" }, { "data": { "id": "SplitText-cWVwV", "node": { "base_classes": [ "DataFrame" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Split text into chunks based on specified criteria.", "display_name": "Split Text", "documentation": "https://docs.langflow.org/components-processing#split-text", "edited": false, "field_order": [ "data_inputs", "chunk_overlap", "chunk_size", "separator", "text_key", "keep_separator" ], "frozen": false, "icon": "scissors-line-dashed", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Chunks", "group_outputs": false, "method": "split_text", "name": "dataframe", "selected": "DataFrame", "tool_mode": true, "types": [ "DataFrame" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "chunk_overlap": { "_input_type": "IntInput", "advanced": false, "display_name": "Chunk Overlap", "dynamic": false, "info": "Number of characters to overlap between chunks.", "list": false, "list_add_label": "Add More", "name": "chunk_overlap", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 50 }, "chunk_size": { "_input_type": "IntInput", "advanced": false, "display_name": "Chunk Size", "dynamic": false, "info": "The maximum length of each chunk. Text is first split by separator, then chunks are merged up to this size. Individual splits larger than this won't be further divided.", "list": false, "list_add_label": "Add More", "name": "chunk_size", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 300 }, "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 langchain_text_splitters import CharacterTextSplitter\n\nfrom langflow.custom.custom_component.component import Component\nfrom langflow.io import DropdownInput, HandleInput, IntInput, MessageTextInput, Output\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.utils.util import unescape_string\n\n\nclass SplitTextComponent(Component):\n display_name: str = \"Split Text\"\n description: str = \"Split text into chunks based on specified criteria.\"\n documentation: str = \"https://docs.langflow.org/components-processing#split-text\"\n icon = \"scissors-line-dashed\"\n name = \"SplitText\"\n\n inputs = [\n HandleInput(\n name=\"data_inputs\",\n display_name=\"Input\",\n info=\"The data with texts to split in chunks.\",\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\n ),\n IntInput(\n name=\"chunk_overlap\",\n display_name=\"Chunk Overlap\",\n info=\"Number of characters to overlap between chunks.\",\n value=200,\n ),\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=(\n \"The maximum length of each chunk. Text is first split by separator, \"\n \"then chunks are merged up to this size. \"\n \"Individual splits larger than this won't be further divided.\"\n ),\n value=1000,\n ),\n MessageTextInput(\n name=\"separator\",\n display_name=\"Separator\",\n info=(\n \"The character to split on. Use \\\\n for newline. \"\n \"Examples: \\\\n\\\\n for paragraphs, \\\\n for lines, . for sentences\"\n ),\n value=\"\\n\",\n ),\n MessageTextInput(\n name=\"text_key\",\n display_name=\"Text Key\",\n info=\"The key to use for the text column.\",\n value=\"text\",\n advanced=True,\n ),\n DropdownInput(\n name=\"keep_separator\",\n display_name=\"Keep Separator\",\n info=\"Whether to keep the separator in the output chunks and where to place it.\",\n options=[\"False\", \"True\", \"Start\", \"End\"],\n value=\"False\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Chunks\", name=\"dataframe\", method=\"split_text\"),\n ]\n\n def _docs_to_data(self, docs) -> list[Data]:\n return [Data(text=doc.page_content, data=doc.metadata) for doc in docs]\n\n def _fix_separator(self, separator: str) -> str:\n \"\"\"Fix common separator issues and convert to proper format.\"\"\"\n if separator == \"/n\":\n return \"\\n\"\n if separator == \"/t\":\n return \"\\t\"\n return separator\n\n def split_text_base(self):\n separator = self._fix_separator(self.separator)\n separator = unescape_string(separator)\n\n if isinstance(self.data_inputs, DataFrame):\n if not len(self.data_inputs):\n msg = \"DataFrame is empty\"\n raise TypeError(msg)\n\n self.data_inputs.text_key = self.text_key\n try:\n documents = self.data_inputs.to_lc_documents()\n except Exception as e:\n msg = f\"Error converting DataFrame to documents: {e}\"\n raise TypeError(msg) from e\n elif isinstance(self.data_inputs, Message):\n self.data_inputs = [self.data_inputs.to_data()]\n return self.split_text_base()\n else:\n if not self.data_inputs:\n msg = \"No data inputs provided\"\n raise TypeError(msg)\n\n documents = []\n if isinstance(self.data_inputs, Data):\n self.data_inputs.text_key = self.text_key\n documents = [self.data_inputs.to_lc_document()]\n else:\n try:\n documents = [input_.to_lc_document() for input_ in self.data_inputs if isinstance(input_, Data)]\n if not documents:\n msg = f\"No valid Data inputs found in {type(self.data_inputs)}\"\n raise TypeError(msg)\n except AttributeError as e:\n msg = f\"Invalid input type in collection: {e}\"\n raise TypeError(msg) from e\n try:\n # Convert string 'False'/'True' to boolean\n keep_sep = self.keep_separator\n if isinstance(keep_sep, str):\n if keep_sep.lower() == \"false\":\n keep_sep = False\n elif keep_sep.lower() == \"true\":\n keep_sep = True\n # 'start' and 'end' are kept as strings\n\n splitter = CharacterTextSplitter(\n chunk_overlap=self.chunk_overlap,\n chunk_size=self.chunk_size,\n separator=separator,\n keep_separator=keep_sep,\n )\n return splitter.split_documents(documents)\n except Exception as e:\n msg = f\"Error splitting text: {e}\"\n raise TypeError(msg) from e\n\n def split_text(self) -> DataFrame:\n return DataFrame(self._docs_to_data(self.split_text_base()))\n" }, "data_inputs": { "_input_type": "HandleInput", "advanced": false, "display_name": "Input", "dynamic": false, "info": "The data with texts to split in chunks.", "input_types": [ "Data", "DataFrame", "Message" ], "list": false, "list_add_label": "Add More", "name": "data_inputs", "placeholder": "", "required": true, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "keep_separator": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "dialog_inputs": {}, "display_name": "Keep Separator", "dynamic": false, "info": "Whether to keep the separator in the output chunks and where to place it.", "name": "keep_separator", "options": [ "False", "True", "Start", "End" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "False" }, "separator": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Separator", "dynamic": false, "info": "The character to split on. Use \\n for newline. Examples: \\n\\n for paragraphs, \\n for lines, . for sentences", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "separator", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "\n" }, "text_key": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Text Key", "dynamic": false, "info": "The key to use for the text column.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "text_key", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "text" } }, "tool_mode": false }, "showNode": true, "type": "SplitText" }, "dragging": false, "id": "SplitText-cWVwV", "measured": { "height": 409, "width": 320 }, "position": { "x": -255.39187937543292, "y": 2085.53802483223 }, "selected": false, "type": "genericNode" }, { "data": { "id": "Chroma-xHPZs", "node": { "base_classes": [ "Data", "DataFrame" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Chroma Vector Store with search capabilities", "display_name": "Chroma DB", "documentation": "", "edited": true, "field_order": [ "collection_name", "persist_directory", "ingest_data", "search_query", "should_cache_vector_store", "embedding", "chroma_server_cors_allow_origins", "chroma_server_host", "chroma_server_http_port", "chroma_server_grpc_port", "chroma_server_ssl_enabled", "allow_duplicates", "search_type", "number_of_results", "limit" ], "frozen": false, "icon": "Chroma", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Search Results", "group_outputs": false, "hidden": null, "method": "search_documents", "name": "search_results", "options": null, "required_inputs": null, "selected": "Data", "tool_mode": true, "types": [ "Data" ], "value": "__UNDEFINED__" }, { "allows_loop": false, "cache": true, "display_name": "DataFrame", "group_outputs": false, "hidden": null, "method": "as_dataframe", "name": "dataframe", "options": null, "required_inputs": null, "selected": "DataFrame", "tool_mode": true, "types": [ "DataFrame" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "allow_duplicates": { "_input_type": "BoolInput", "advanced": true, "display_name": "Allow Duplicates", "dynamic": false, "info": "If false, will not add documents that are already in the Vector Store.", "list": false, "list_add_label": "Add More", "name": "allow_duplicates", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": false }, "chroma_server_cors_allow_origins": { "_input_type": "StrInput", "advanced": true, "display_name": "Server CORS Allow Origins", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "chroma_server_cors_allow_origins", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "" }, "chroma_server_grpc_port": { "_input_type": "IntInput", "advanced": true, "display_name": "Server gRPC Port", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "chroma_server_grpc_port", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": "" }, "chroma_server_host": { "_input_type": "StrInput", "advanced": true, "display_name": "Server Host", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "chroma_server_host", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "" }, "chroma_server_http_port": { "_input_type": "IntInput", "advanced": true, "display_name": "Server HTTP Port", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "chroma_server_http_port", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": "" }, "chroma_server_ssl_enabled": { "_input_type": "BoolInput", "advanced": true, "display_name": "Server SSL Enabled", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "chroma_server_ssl_enabled", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": false }, "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 copy import deepcopy\r\nfrom typing import TYPE_CHECKING\r\n\r\nfrom chromadb.config import Settings\r\nfrom langchain_chroma import Chroma\r\nfrom typing_extensions import override\r\n\r\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\r\nfrom langflow.base.vectorstores.utils import chroma_collection_to_data\r\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, IntInput, StrInput\r\nfrom langflow.schema.data import Data\r\n\r\nif TYPE_CHECKING:\r\n from langflow.schema.dataframe import DataFrame\r\n\r\n\r\nclass ChromaVectorStoreComponent(LCVectorStoreComponent):\r\n \"\"\"Chroma Vector Store with search capabilities.\"\"\"\r\n\r\n display_name: str = \"Chroma DB\"\r\n description: str = \"Chroma Vector Store with search capabilities\"\r\n name = \"Chroma\"\r\n icon = \"Chroma\"\r\n\r\n inputs = [\r\n StrInput(\r\n name=\"collection_name\",\r\n display_name=\"Collection Name\",\r\n value=\"langflow\",\r\n ),\r\n StrInput(\r\n name=\"persist_directory\",\r\n display_name=\"Persist Directory\",\r\n ),\r\n *LCVectorStoreComponent.inputs,\r\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\r\n StrInput(\r\n name=\"chroma_server_cors_allow_origins\",\r\n display_name=\"Server CORS Allow Origins\",\r\n advanced=True,\r\n ),\r\n StrInput(\r\n name=\"chroma_server_host\",\r\n display_name=\"Server Host\",\r\n advanced=True,\r\n ),\r\n IntInput(\r\n name=\"chroma_server_http_port\",\r\n display_name=\"Server HTTP Port\",\r\n advanced=True,\r\n ),\r\n IntInput(\r\n name=\"chroma_server_grpc_port\",\r\n display_name=\"Server gRPC Port\",\r\n advanced=True,\r\n ),\r\n BoolInput(\r\n name=\"chroma_server_ssl_enabled\",\r\n display_name=\"Server SSL Enabled\",\r\n advanced=True,\r\n ),\r\n BoolInput(\r\n name=\"allow_duplicates\",\r\n display_name=\"Allow Duplicates\",\r\n advanced=True,\r\n info=\"If false, will not add documents that are already in the Vector Store.\",\r\n ),\r\n DropdownInput(\r\n name=\"search_type\",\r\n display_name=\"Search Type\",\r\n options=[\"Similarity\", \"MMR\"],\r\n value=\"Similarity\",\r\n advanced=True,\r\n ),\r\n IntInput(\r\n name=\"number_of_results\",\r\n display_name=\"Number of Results\",\r\n info=\"Number of results to return.\",\r\n advanced=True,\r\n value=10,\r\n ),\r\n IntInput(\r\n name=\"limit\",\r\n display_name=\"Limit\",\r\n advanced=True,\r\n info=\"Limit the number of records to compare when Allow Duplicates is False.\",\r\n ),\r\n ]\r\n\r\n @override\r\n @check_cached_vector_store\r\n def build_vector_store(self) -> Chroma:\r\n \"\"\"Builds the Chroma object.\"\"\"\r\n try:\r\n from chromadb import Client\r\n from langchain_chroma import Chroma\r\n except ImportError as e:\r\n msg = \"Could not import Chroma integration package. Please install it with `pip install langchain-chroma`.\"\r\n raise ImportError(msg) from e\r\n\r\n chroma_settings = None\r\n client = None\r\n if self.chroma_server_host:\r\n chroma_settings = Settings(\r\n chroma_server_cors_allow_origins=self.chroma_server_cors_allow_origins or [],\r\n chroma_server_host=self.chroma_server_host,\r\n chroma_server_http_port=self.chroma_server_http_port or None,\r\n chroma_server_grpc_port=self.chroma_server_grpc_port or None,\r\n chroma_server_ssl_enabled=self.chroma_server_ssl_enabled,\r\n )\r\n client = Client(settings=chroma_settings)\r\n\r\n persist_directory = self.resolve_path(self.persist_directory) if self.persist_directory else None\r\n\r\n chroma = Chroma(\r\n persist_directory=persist_directory,\r\n client=client,\r\n embedding_function=self.embedding,\r\n collection_name=self.collection_name,\r\n )\r\n\r\n self._add_documents_to_vector_store(chroma)\r\n self.status = chroma_collection_to_data(chroma.get(limit=self.limit))\r\n return chroma\r\n\r\n def _add_documents_to_vector_store(self, vector_store: \"Chroma\") -> None:\r\n \"\"\"Adds documents to the Vector Store, handling strings, Data, and metadata cleaning.\"\"\"\r\n ingest_data: list | Data | \"DataFrame\" = self.ingest_data\r\n if not ingest_data:\r\n self.status = \"\"\r\n return\r\n\r\n ingest_data = self._prepare_ingest_data()\r\n\r\n stored_documents_without_id = []\r\n if self.allow_duplicates:\r\n stored_data = []\r\n else:\r\n stored_data = chroma_collection_to_data(vector_store.get(limit=self.limit))\r\n for value in deepcopy(stored_data):\r\n del value.id\r\n stored_documents_without_id.append(value)\r\n\r\n documents = []\r\n for _input in ingest_data or []:\r\n if isinstance(_input, str):\r\n _input = Data(text=_input)\r\n\r\n if isinstance(_input, Data):\r\n if _input not in stored_documents_without_id:\r\n # Очистка metadata для Chroma\r\n # Очистка metadata для Chroma\r\n clean_metadata = {}\r\n for k, v in (_input.data or {}).items():\r\n if isinstance(v, (str, int, float, bool)):\r\n clean_metadata[k] = v\r\n else:\r\n clean_metadata[k] = str(v) if v is not None else \"\"\r\n\r\n doc = _input.to_lc_document()\r\n doc.metadata = clean_metadata\r\n documents.append(doc)\r\n else:\r\n raise TypeError(f\"Vector Store Inputs must be Data objects or strings, got {type(_input)}.\")\r\n\r\n if documents and self.embedding is not None:\r\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\r\n vector_store.add_documents(documents)\r\n else:\r\n self.log(\"No documents to add to the Vector Store.\")\r\n" }, "collection_name": { "_input_type": "StrInput", "advanced": false, "display_name": "Collection Name", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "collection_name", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "langflow" }, "embedding": { "_input_type": "HandleInput", "advanced": false, "display_name": "Embedding", "dynamic": false, "info": "", "input_types": [ "Embeddings" ], "list": false, "list_add_label": "Add More", "name": "embedding", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "ingest_data": { "_input_type": "HandleInput", "advanced": false, "display_name": "Ingest Data", "dynamic": false, "info": "", "input_types": [ "Data", "DataFrame" ], "list": true, "list_add_label": "Add More", "name": "ingest_data", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "limit": { "_input_type": "IntInput", "advanced": true, "display_name": "Limit", "dynamic": false, "info": "Limit the number of records to compare when Allow Duplicates is False.", "list": false, "list_add_label": "Add More", "name": "limit", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": "" }, "number_of_results": { "_input_type": "IntInput", "advanced": true, "display_name": "Number of Results", "dynamic": false, "info": "Number of results to return.", "list": false, "list_add_label": "Add More", "name": "number_of_results", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 10 }, "persist_directory": { "_input_type": "StrInput", "advanced": false, "display_name": "Persist Directory", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "persist_directory", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "./chroma" }, "search_query": { "_input_type": "QueryInput", "advanced": false, "display_name": "Search Query", "dynamic": false, "info": "Enter a query to run a similarity search.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "search_query", "placeholder": "Enter a query...", "required": false, "show": true, "title_case": false, "tool_mode": true, "trace_as_input": true, "trace_as_metadata": true, "type": "query", "value": "" }, "search_type": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "dialog_inputs": {}, "display_name": "Search Type", "dynamic": false, "info": "", "name": "search_type", "options": [ "Similarity", "MMR" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "Similarity" }, "should_cache_vector_store": { "_input_type": "BoolInput", "advanced": true, "display_name": "Cache Vector Store", "dynamic": false, "info": "If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.", "list": false, "list_add_label": "Add More", "name": "should_cache_vector_store", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true } }, "tool_mode": false }, "selected_output": "search_results", "showNode": true, "type": "Chroma" }, "dragging": false, "id": "Chroma-xHPZs", "measured": { "height": 453, "width": 320 }, "position": { "x": -770.8080346954262, "y": 1224.0646025039514 }, "selected": false, "type": "genericNode" }, { "data": { "id": "ParserComponent-Y3Eij", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Extracts text using a template.", "display_name": "Parser", "documentation": "https://docs.langflow.org/components-processing#parser", "edited": false, "field_order": [ "input_data", "mode", "pattern", "sep" ], "frozen": false, "icon": "braces", "last_updated": "2025-08-30T18:26:52.328Z", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Parsed Text", "group_outputs": false, "method": "parse_combined_text", "name": "parsed_text", "options": null, "required_inputs": null, "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "clean_data": { "_input_type": "BoolInput", "advanced": true, "display_name": "Clean Data", "dynamic": false, "info": "Enable to clean the data by removing empty rows and lines in each cell of the DataFrame/ Data object.", "list": false, "list_add_label": "Add More", "name": "clean_data", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": 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 langflow.custom.custom_component.component import Component\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, HandleInput, MessageTextInput, MultilineInput, TabInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.template.field.base import Output\n\n\nclass ParserComponent(Component):\n display_name = \"Parser\"\n description = \"Extracts text using a template.\"\n documentation: str = \"https://docs.langflow.org/components-processing#parser\"\n icon = \"braces\"\n\n inputs = [\n HandleInput(\n name=\"input_data\",\n display_name=\"Data or DataFrame\",\n input_types=[\"DataFrame\", \"Data\"],\n info=\"Accepts either a DataFrame or a Data object.\",\n required=True,\n ),\n TabInput(\n name=\"mode\",\n display_name=\"Mode\",\n options=[\"Parser\", \"Stringify\"],\n value=\"Parser\",\n info=\"Convert into raw string instead of using a template.\",\n real_time_refresh=True,\n ),\n MultilineInput(\n name=\"pattern\",\n display_name=\"Template\",\n info=(\n \"Use variables within curly brackets to extract column values for DataFrames \"\n \"or key values for Data.\"\n \"For example: `Name: {Name}, Age: {Age}, Country: {Country}`\"\n ),\n value=\"Text: {text}\", # Example default\n dynamic=True,\n show=True,\n required=True,\n ),\n MessageTextInput(\n name=\"sep\",\n display_name=\"Separator\",\n advanced=True,\n value=\"\\n\",\n info=\"String used to separate rows/items.\",\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Parsed Text\",\n name=\"parsed_text\",\n info=\"Formatted text output.\",\n method=\"parse_combined_text\",\n ),\n ]\n\n def update_build_config(self, build_config, field_value, field_name=None):\n \"\"\"Dynamically hide/show `template` and enforce requirement based on `stringify`.\"\"\"\n if field_name == \"mode\":\n build_config[\"pattern\"][\"show\"] = self.mode == \"Parser\"\n build_config[\"pattern\"][\"required\"] = self.mode == \"Parser\"\n if field_value:\n clean_data = BoolInput(\n name=\"clean_data\",\n display_name=\"Clean Data\",\n info=(\n \"Enable to clean the data by removing empty rows and lines \"\n \"in each cell of the DataFrame/ Data object.\"\n ),\n value=True,\n advanced=True,\n required=False,\n )\n build_config[\"clean_data\"] = clean_data.to_dict()\n else:\n build_config.pop(\"clean_data\", None)\n\n return build_config\n\n def _clean_args(self):\n \"\"\"Prepare arguments based on input type.\"\"\"\n input_data = self.input_data\n\n match input_data:\n case list() if all(isinstance(item, Data) for item in input_data):\n msg = \"List of Data objects is not supported.\"\n raise ValueError(msg)\n case DataFrame():\n return input_data, None\n case Data():\n return None, input_data\n case dict() if \"data\" in input_data:\n try:\n if \"columns\" in input_data: # Likely a DataFrame\n return DataFrame.from_dict(input_data), None\n # Likely a Data object\n return None, Data(**input_data)\n except (TypeError, ValueError, KeyError) as e:\n msg = f\"Invalid structured input provided: {e!s}\"\n raise ValueError(msg) from e\n case _:\n msg = f\"Unsupported input type: {type(input_data)}. Expected DataFrame or Data.\"\n raise ValueError(msg)\n\n def parse_combined_text(self) -> Message:\n \"\"\"Parse all rows/items into a single text or convert input to string if `stringify` is enabled.\"\"\"\n # Early return for stringify option\n if self.mode == \"Stringify\":\n return self.convert_to_string()\n\n df, data = self._clean_args()\n\n lines = []\n if df is not None:\n for _, row in df.iterrows():\n formatted_text = self.pattern.format(**row.to_dict())\n lines.append(formatted_text)\n elif data is not None:\n formatted_text = self.pattern.format(**data.data)\n lines.append(formatted_text)\n\n combined_text = self.sep.join(lines)\n self.status = combined_text\n return Message(text=combined_text)\n\n def convert_to_string(self) -> Message:\n \"\"\"Convert input data to string with proper error handling.\"\"\"\n result = \"\"\n if isinstance(self.input_data, list):\n result = \"\\n\".join([safe_convert(item, clean_data=self.clean_data or False) for item in self.input_data])\n else:\n result = safe_convert(self.input_data or False)\n self.log(f\"Converted to string with length: {len(result)}\")\n\n message = Message(text=result)\n self.status = message\n return message\n" }, "input_data": { "_input_type": "HandleInput", "advanced": false, "display_name": "Data or DataFrame", "dynamic": false, "info": "Accepts either a DataFrame or a Data object.", "input_types": [ "DataFrame", "Data" ], "list": false, "list_add_label": "Add More", "name": "input_data", "placeholder": "", "required": true, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "mode": { "_input_type": "TabInput", "advanced": false, "display_name": "Mode", "dynamic": false, "info": "Convert into raw string instead of using a template.", "name": "mode", "options": [ "Parser", "Stringify" ], "placeholder": "", "real_time_refresh": true, "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "tab", "value": "Stringify" }, "pattern": { "_input_type": "MultilineInput", "advanced": false, "copy_field": false, "display_name": "Template", "dynamic": true, "info": "Use variables within curly brackets to extract column values for DataFrames or key values for Data.For example: `Name: {Name}, Age: {Age}, Country: {Country}`", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "multiline": true, "name": "pattern", "placeholder": "", "required": false, "show": false, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "Text: {text}" }, "sep": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Separator", "dynamic": false, "info": "String used to separate rows/items.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "sep", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "\n" } }, "tool_mode": false }, "showNode": true, "type": "ParserComponent" }, "dragging": false, "id": "ParserComponent-Y3Eij", "measured": { "height": 244, "width": 320 }, "position": { "x": -352.428870416756, "y": 1342.4685405562839 }, "selected": false, "type": "genericNode" }, { "data": { "id": "Prompt Template-w0vDk", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": { "template": [ "text", "context" ] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt Template", "documentation": "https://docs.langflow.org/components-prompts", "edited": false, "error": null, "field_order": [ "template", "tool_placeholder" ], "frozen": false, "full_path": null, "icon": "braces", "is_composition": null, "is_input": null, "is_output": null, "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "name": "", "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Prompt", "group_outputs": false, "hidden": null, "method": "build_prompt", "name": "prompt", "options": null, "required_inputs": null, "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "priority": 0, "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 langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom.custom_component.component import Component\nfrom langflow.inputs.inputs import DefaultPromptField\nfrom langflow.io import MessageTextInput, Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt Template\"\n description: str = \"Create a prompt template with dynamic variables.\"\n documentation: str = \"https://docs.langflow.org/components-prompts\"\n icon = \"braces\"\n trace_type = \"prompt\"\n name = \"Prompt Template\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n MessageTextInput(\n name=\"tool_placeholder\",\n display_name=\"Tool Placeholder\",\n tool_mode=True,\n advanced=True,\n info=\"A placeholder input for tool mode.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Prompt\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(self) -> Message:\n prompt = Message.from_template(**self._attributes)\n self.status = prompt.text\n return prompt\n\n def _update_template(self, frontend_node: dict):\n prompt_template = frontend_node[\"template\"][\"template\"][\"value\"]\n custom_fields = frontend_node[\"custom_fields\"]\n frontend_node_template = frontend_node[\"template\"]\n _ = process_prompt_template(\n template=prompt_template,\n name=\"template\",\n custom_fields=custom_fields,\n frontend_node_template=frontend_node_template,\n )\n return frontend_node\n\n async def update_frontend_node(self, new_frontend_node: dict, current_frontend_node: dict):\n \"\"\"This function is called after the code validation is done.\"\"\"\n frontend_node = await super().update_frontend_node(new_frontend_node, current_frontend_node)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n # Kept it duplicated for backwards compatibility\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_frontend_node\n # and update the frontend_node with those values\n update_template_values(new_template=frontend_node, previous_template=current_frontend_node[\"template\"])\n return frontend_node\n\n def _get_fallback_input(self, **kwargs):\n return DefaultPromptField(**kwargs)\n" }, "context": { "advanced": false, "display_name": "context", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "context", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "template": { "_input_type": "PromptInput", "advanced": false, "display_name": "Template", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "template", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "type": "prompt", "value": "{text}\n\n{context}" }, "text": { "advanced": false, "display_name": "text", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "text", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "tool_placeholder": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Tool Placeholder", "dynamic": false, "info": "A placeholder input for tool mode.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "tool_placeholder", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": true, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" } }, "tool_mode": false }, "showNode": true, "type": "Prompt Template" }, "dragging": false, "id": "Prompt Template-w0vDk", "measured": { "height": 399, "width": 320 }, "position": { "x": -85.29700110580131, "y": 701.1260397099236 }, "selected": false, "type": "genericNode" }, { "data": { "id": "Chroma-szIfX", "node": { "base_classes": [ "Data", "DataFrame" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Chroma Vector Store with search capabilities", "display_name": "Chroma DB", "documentation": "", "edited": false, "field_order": [ "collection_name", "persist_directory", "ingest_data", "search_query", "should_cache_vector_store", "embedding", "chroma_server_cors_allow_origins", "chroma_server_host", "chroma_server_http_port", "chroma_server_grpc_port", "chroma_server_ssl_enabled", "allow_duplicates", "search_type", "number_of_results", "limit" ], "frozen": false, "icon": "Chroma", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Search Results", "group_outputs": false, "method": "search_documents", "name": "search_results", "selected": "Data", "tool_mode": true, "types": [ "Data" ], "value": "__UNDEFINED__" }, { "allows_loop": false, "cache": true, "display_name": "DataFrame", "group_outputs": false, "method": "as_dataframe", "name": "dataframe", "tool_mode": true, "types": [ "DataFrame" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "allow_duplicates": { "_input_type": "BoolInput", "advanced": true, "display_name": "Allow Duplicates", "dynamic": false, "info": "If false, will not add documents that are already in the Vector Store.", "list": false, "list_add_label": "Add More", "name": "allow_duplicates", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": false }, "chroma_server_cors_allow_origins": { "_input_type": "StrInput", "advanced": true, "display_name": "Server CORS Allow Origins", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "chroma_server_cors_allow_origins", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "" }, "chroma_server_grpc_port": { "_input_type": "IntInput", "advanced": true, "display_name": "Server gRPC Port", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "chroma_server_grpc_port", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": "" }, "chroma_server_host": { "_input_type": "StrInput", "advanced": true, "display_name": "Server Host", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "chroma_server_host", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "" }, "chroma_server_http_port": { "_input_type": "IntInput", "advanced": true, "display_name": "Server HTTP Port", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "chroma_server_http_port", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": "" }, "chroma_server_ssl_enabled": { "_input_type": "BoolInput", "advanced": true, "display_name": "Server SSL Enabled", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "chroma_server_ssl_enabled", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": false }, "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 copy import deepcopy\r\nfrom typing import TYPE_CHECKING\r\n\r\nfrom chromadb.config import Settings\r\nfrom langchain_chroma import Chroma\r\nfrom typing_extensions import override\r\n\r\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\r\nfrom langflow.base.vectorstores.utils import chroma_collection_to_data\r\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, IntInput, StrInput\r\nfrom langflow.schema.data import Data\r\n\r\nif TYPE_CHECKING:\r\n from langflow.schema.dataframe import DataFrame\r\n\r\n\r\nclass ChromaVectorStoreComponent(LCVectorStoreComponent):\r\n \"\"\"Chroma Vector Store with search capabilities.\"\"\"\r\n\r\n display_name: str = \"Chroma DB\"\r\n description: str = \"Chroma Vector Store with search capabilities\"\r\n name = \"Chroma\"\r\n icon = \"Chroma\"\r\n\r\n inputs = [\r\n StrInput(\r\n name=\"collection_name\",\r\n display_name=\"Collection Name\",\r\n value=\"langflow\",\r\n ),\r\n StrInput(\r\n name=\"persist_directory\",\r\n display_name=\"Persist Directory\",\r\n ),\r\n *LCVectorStoreComponent.inputs,\r\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\r\n StrInput(\r\n name=\"chroma_server_cors_allow_origins\",\r\n display_name=\"Server CORS Allow Origins\",\r\n advanced=True,\r\n ),\r\n StrInput(\r\n name=\"chroma_server_host\",\r\n display_name=\"Server Host\",\r\n advanced=True,\r\n ),\r\n IntInput(\r\n name=\"chroma_server_http_port\",\r\n display_name=\"Server HTTP Port\",\r\n advanced=True,\r\n ),\r\n IntInput(\r\n name=\"chroma_server_grpc_port\",\r\n display_name=\"Server gRPC Port\",\r\n advanced=True,\r\n ),\r\n BoolInput(\r\n name=\"chroma_server_ssl_enabled\",\r\n display_name=\"Server SSL Enabled\",\r\n advanced=True,\r\n ),\r\n BoolInput(\r\n name=\"allow_duplicates\",\r\n display_name=\"Allow Duplicates\",\r\n advanced=True,\r\n info=\"If false, will not add documents that are already in the Vector Store.\",\r\n ),\r\n DropdownInput(\r\n name=\"search_type\",\r\n display_name=\"Search Type\",\r\n options=[\"Similarity\", \"MMR\"],\r\n value=\"Similarity\",\r\n advanced=True,\r\n ),\r\n IntInput(\r\n name=\"number_of_results\",\r\n display_name=\"Number of Results\",\r\n info=\"Number of results to return.\",\r\n advanced=True,\r\n value=10,\r\n ),\r\n IntInput(\r\n name=\"limit\",\r\n display_name=\"Limit\",\r\n advanced=True,\r\n info=\"Limit the number of records to compare when Allow Duplicates is False.\",\r\n ),\r\n ]\r\n\r\n @override\r\n @check_cached_vector_store\r\n def build_vector_store(self) -> Chroma:\r\n \"\"\"Builds the Chroma object.\"\"\"\r\n try:\r\n from chromadb import Client\r\n from langchain_chroma import Chroma\r\n except ImportError as e:\r\n msg = \"Could not import Chroma integration package. Please install it with `pip install langchain-chroma`.\"\r\n raise ImportError(msg) from e\r\n\r\n chroma_settings = None\r\n client = None\r\n if self.chroma_server_host:\r\n chroma_settings = Settings(\r\n chroma_server_cors_allow_origins=self.chroma_server_cors_allow_origins or [],\r\n chroma_server_host=self.chroma_server_host,\r\n chroma_server_http_port=self.chroma_server_http_port or None,\r\n chroma_server_grpc_port=self.chroma_server_grpc_port or None,\r\n chroma_server_ssl_enabled=self.chroma_server_ssl_enabled,\r\n )\r\n client = Client(settings=chroma_settings)\r\n\r\n persist_directory = self.resolve_path(self.persist_directory) if self.persist_directory else None\r\n\r\n chroma = Chroma(\r\n persist_directory=persist_directory,\r\n client=client,\r\n embedding_function=self.embedding,\r\n collection_name=self.collection_name,\r\n )\r\n\r\n self._add_documents_to_vector_store(chroma)\r\n self.status = chroma_collection_to_data(chroma.get(limit=self.limit))\r\n return chroma\r\n\r\n def _add_documents_to_vector_store(self, vector_store: \"Chroma\") -> None:\r\n \"\"\"Adds documents to the Vector Store, handling strings, Data, and metadata cleaning.\"\"\"\r\n ingest_data: list | Data | \"DataFrame\" = self.ingest_data\r\n if not ingest_data:\r\n self.status = \"\"\r\n return\r\n\r\n ingest_data = self._prepare_ingest_data()\r\n\r\n stored_documents_without_id = []\r\n if self.allow_duplicates:\r\n stored_data = []\r\n else:\r\n stored_data = chroma_collection_to_data(vector_store.get(limit=self.limit))\r\n for value in deepcopy(stored_data):\r\n del value.id\r\n stored_documents_without_id.append(value)\r\n\r\n documents = []\r\n for _input in ingest_data or []:\r\n if isinstance(_input, str):\r\n _input = Data(text=_input)\r\n\r\n if isinstance(_input, Data):\r\n if _input not in stored_documents_without_id:\r\n # Очистка metadata для Chroma\r\n # Очистка metadata для Chroma\r\n clean_metadata = {}\r\n for k, v in (_input.data or {}).items():\r\n if isinstance(v, (str, int, float, bool)):\r\n clean_metadata[k] = v\r\n else:\r\n clean_metadata[k] = str(v) if v is not None else \"\"\r\n\r\n doc = _input.to_lc_document()\r\n doc.metadata = clean_metadata\r\n documents.append(doc)\r\n else:\r\n raise TypeError(f\"Vector Store Inputs must be Data objects or strings, got {type(_input)}.\")\r\n\r\n if documents and self.embedding is not None:\r\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\r\n vector_store.add_documents(documents)\r\n else:\r\n self.log(\"No documents to add to the Vector Store.\")\r\n" }, "collection_name": { "_input_type": "StrInput", "advanced": false, "display_name": "Collection Name", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "collection_name", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "langflow" }, "embedding": { "_input_type": "HandleInput", "advanced": false, "display_name": "Embedding", "dynamic": false, "info": "", "input_types": [ "Embeddings" ], "list": false, "list_add_label": "Add More", "name": "embedding", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "ingest_data": { "_input_type": "HandleInput", "advanced": false, "display_name": "Ingest Data", "dynamic": false, "info": "", "input_types": [ "Data", "DataFrame" ], "list": true, "list_add_label": "Add More", "name": "ingest_data", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "limit": { "_input_type": "IntInput", "advanced": true, "display_name": "Limit", "dynamic": false, "info": "Limit the number of records to compare when Allow Duplicates is False.", "list": false, "list_add_label": "Add More", "name": "limit", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": "" }, "number_of_results": { "_input_type": "IntInput", "advanced": true, "display_name": "Number of Results", "dynamic": false, "info": "Number of results to return.", "list": false, "list_add_label": "Add More", "name": "number_of_results", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 10 }, "persist_directory": { "_input_type": "StrInput", "advanced": false, "display_name": "Persist Directory", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "persist_directory", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "./chroma" }, "search_query": { "_input_type": "QueryInput", "advanced": false, "display_name": "Search Query", "dynamic": false, "info": "Enter a query to run a similarity search.", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "search_query", "placeholder": "Enter a query...", "required": false, "show": true, "title_case": false, "tool_mode": true, "trace_as_input": true, "trace_as_metadata": true, "type": "query", "value": "" }, "search_type": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "dialog_inputs": {}, "display_name": "Search Type", "dynamic": false, "info": "", "name": "search_type", "options": [ "Similarity", "MMR" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "Similarity" }, "should_cache_vector_store": { "_input_type": "BoolInput", "advanced": true, "display_name": "Cache Vector Store", "dynamic": false, "info": "If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.", "list": false, "list_add_label": "Add More", "name": "should_cache_vector_store", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true } }, "tool_mode": false }, "selected_output": "search_results", "showNode": true, "type": "Chroma" }, "dragging": false, "id": "Chroma-szIfX", "measured": { "height": 453, "width": 320 }, "position": { "x": 158.57477885649857, "y": 2248.0512442305435 }, "selected": false, "type": "genericNode" }, { "data": { "id": "GigaChatEmbeddings-wukfd", "node": { "base_classes": [ "Embeddings" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Generate embeddings using GigaChat models.", "display_name": "GigaChat Embeddings", "documentation": "", "edited": false, "field_order": [ "credentials", "verify_ssl_certs", "max_concurrent_requests", "max_retries", "timeout" ], "frozen": false, "legacy": false, "lf_version": "1.5.0.post2", "metadata": { "keywords": [ "model", "llm", "language model", "large language model" ] }, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Embeddings", "group_outputs": false, "method": "build_embeddings", "name": "embeddings", "selected": "Embeddings", "tool_mode": true, "types": [ "Embeddings" ], "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 langchain_gigachat.embeddings import GigaChatEmbeddings\r\nfrom pydantic.v1 import SecretStr\r\n\r\nfrom langflow.base.models.model import LCModelComponent\r\nfrom langflow.field_typing import Embeddings\r\nfrom langflow.io import DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput, BoolInput\r\n\r\n\r\nclass GigaChatEmbeddingsComponent(LCModelComponent):\r\n display_name = \"GigaChat Embeddings\"\r\n description = \"Generate embeddings using GigaChat models.\"\r\n name = \"GigaChatEmbeddings\"\r\n\r\n inputs = [\r\n SecretStrInput(\r\n name=\"credentials\",\r\n display_name=\"GigaChat API Key\",\r\n required=True\r\n ),\r\n BoolInput(\r\n name=\"verify_ssl_certs\",\r\n display_name=\"Verify SSL Certificates\",\r\n advanced=True,\r\n value=True\r\n ),\r\n IntInput(\r\n name=\"max_concurrent_requests\",\r\n display_name=\"Max Concurrent Requests\",\r\n advanced=True,\r\n value=64\r\n ),\r\n IntInput(\r\n name=\"max_retries\",\r\n display_name=\"Max Retries\",\r\n advanced=True,\r\n value=5\r\n ),\r\n IntInput(\r\n name=\"timeout\",\r\n display_name=\"Request Timeout\",\r\n advanced=True,\r\n value=120\r\n ),\r\n ]\r\n\r\n outputs = [\r\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\r\n ]\r\n\r\n def build_embeddings(self) -> Embeddings:\r\n if not self.credentials:\r\n raise ValueError(\"GigaChat API Key is required\")\r\n\r\n api_key = SecretStr(self.credentials).get_secret_value()\r\n\r\n return GigaChatEmbeddings(\r\n credentials=api_key,\r\n verify_ssl_certs=False\r\n )" }, "credentials": { "_input_type": "SecretStrInput", "advanced": false, "display_name": "GigaChat API Key", "dynamic": false, "info": "", "input_types": [], "load_from_db": false, "name": "credentials", "password": true, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "str", "value": "" }, "max_concurrent_requests": { "_input_type": "IntInput", "advanced": true, "display_name": "Max Concurrent Requests", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "max_concurrent_requests", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 64 }, "max_retries": { "_input_type": "IntInput", "advanced": true, "display_name": "Max Retries", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "max_retries", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 5 }, "timeout": { "_input_type": "IntInput", "advanced": true, "display_name": "Request Timeout", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "timeout", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "int", "value": 120 }, "verify_ssl_certs": { "_input_type": "BoolInput", "advanced": true, "display_name": "Verify SSL Certificates", "dynamic": false, "info": "", "list": false, "list_add_label": "Add More", "name": "verify_ssl_certs", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true } }, "tool_mode": false }, "showNode": true, "type": "GigaChatEmbeddings" }, "dragging": false, "id": "GigaChatEmbeddings-wukfd", "measured": { "height": 202, "width": 320 }, "position": { "x": -601.5261816129893, "y": 2555.548559755379 }, "selected": false, "type": "genericNode" }, { "data": { "id": "GChat-59igK", "node": { "base_classes": [ "Data" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "LLM from Sber.", "display_name": "GigaChat", "documentation": "http://docs.langflow.org/components/custom", "edited": false, "field_order": [ "input_message", "giga_api", "model_name", "scope", "system_prompt", "temperature", "max_tokens" ], "frozen": false, "icon": "custom_components", "legacy": false, "lf_version": "1.5.0.post2", "metadata": {}, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, "display_name": "Output", "group_outputs": false, "method": "build_output", "name": "output", "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": "from langflow.custom import Component\r\nfrom langflow.io import MessageTextInput, Output, SecretStrInput, DropdownInput\r\nfrom langchain_community.llms import GigaChat\r\nfrom langflow.schema import Data\r\n\r\n\r\nclass GChat(Component):\r\n display_name = \"GigaChat\"\r\n description = \"LLM from Sber.\"\r\n documentation: str = \"http://docs.langflow.org/components/custom\"\r\n icon = \"custom_components\"\r\n\r\n model_list = ['GigaChat-2', 'GigaChat-2-Pro', 'GigaChat-2-Max']\r\n scope_list = ['GIGACHAT_API_PERS', 'GIGACHAT_API_CORP', 'GIGACHAT_API_B2B']\r\n\r\n inputs = [\r\n MessageTextInput(name=\"input_message\", display_name=\"Input Message\"),\r\n SecretStrInput(name=\"giga_api\", display_name=\"GigaChat API Key\"),\r\n DropdownInput(name=\"model_name\", display_name=\"Model\", options=model_list),\r\n DropdownInput(name=\"scope\", display_name=\"Scope\", options=scope_list, value=\"GIGACHAT_API_PERS\"),\r\n MessageTextInput(\r\n name=\"system_prompt\",\r\n display_name=\"System Prompt\",\r\n value=\"Ты — умный и профессиональный ассистент. Отвечай понятно и структурированно.\"\r\n ),\r\n MessageTextInput(\r\n name=\"temperature\",\r\n display_name=\"Temperature\",\r\n value=\"0.1\"\r\n ),\r\n MessageTextInput(\r\n name=\"max_tokens\",\r\n display_name=\"Max Tokens\",\r\n value=\"500\"\r\n ),\r\n ]\r\n\r\n outputs = [\r\n Output(display_name=\"Output\", name=\"output\", method=\"build_output\", type=\"Data\"),\r\n ]\r\n\r\n def build_output(self) -> Data:\r\n # конвертируем числовые параметры\r\n temperature = float(self.temperature)\r\n max_tokens = int(self.max_tokens)\r\n\r\n # инициализация модели\r\n llm = GigaChat(\r\n verify_ssl_certs=False,\r\n model=self.model_name,\r\n credentials=self.giga_api,\r\n scope=self.scope,\r\n temperature=temperature,\r\n max_tokens=max_tokens\r\n )\r\n\r\n # формируем полный текст запроса с системным промптом\r\n prompt = f\"{self.system_prompt}\\n\\n{self.input_message}\"\r\n\r\n # получение ответа\r\n data = llm.invoke(prompt)\r\n return Data(text=str(data))" }, "giga_api": { "_input_type": "SecretStrInput", "advanced": false, "display_name": "GigaChat API Key", "dynamic": false, "info": "", "input_types": [], "load_from_db": false, "name": "giga_api", "password": true, "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "input_message": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Input Message", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "input_message", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "max_tokens": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Max Tokens", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "max_tokens", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "500" }, "model_name": { "_input_type": "DropdownInput", "advanced": false, "combobox": false, "dialog_inputs": {}, "display_name": "Model", "dynamic": false, "info": "", "name": "model_name", "options": [ "GigaChat-2", "GigaChat-2-Pro", "GigaChat-2-Max" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "" }, "scope": { "_input_type": "DropdownInput", "advanced": false, "combobox": false, "dialog_inputs": {}, "display_name": "Scope", "dynamic": false, "info": "", "name": "scope", "options": [ "GIGACHAT_API_PERS", "GIGACHAT_API_CORP", "GIGACHAT_API_B2B" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "GIGACHAT_API_PERS" }, "system_prompt": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "System Prompt", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "system_prompt", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "Ты — умный и профессиональный ассистент. Отвечай понятно и структурированно." }, "temperature": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "Temperature", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, "name": "temperature", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "0.1" } }, "tool_mode": false }, "showNode": true, "type": "GChat" }, "dragging": false, "id": "GChat-59igK", "measured": { "height": 693, "width": 320 }, "position": { "x": 426.2316264597159, "y": 1304.4771625547141 }, "selected": false, "type": "genericNode" }, { "data": { "id": "note-r6oQs", "node": { "description": "**Заполнение векторной базы данных**\n\nВ блоке File - необходимо загрузить документы, которыми вы хотите обогатить знания языковой модели.\n\nБлок Spli Text - разбивает тексты на чанки размера Chunk Size с перекрытием Chunk Overlap\n\nБлок GigaChat Embeddings - кодирует текстовые данные для последующей их загрузки в векторную БД (Chroma DB)\n\nChroma DB - векторная база данных\n- При заполнении принимает на вход чанки текста и модель эмбеддинга.\n\n- Также необходимо указать название коллекции - папка в которой будут находится векторизованные тексты - Collection Name\n\n- Директория в которой будет храниться сама БД - Persist Directory", "display_name": "", "documentation": "", "template": { "backgroundColor": "neutral" } }, "type": "note" }, "dragging": false, "id": "note-r6oQs", "measured": { "height": 506, "width": 574 }, "position": { "x": -1592.4243732738041, "y": 2163.7418924821013 }, "selected": false, "type": "noteNode" }, { "data": { "id": "note-qgsZx", "node": { "description": "**Ответ модели с использованием знаний из векторной БД**\n\nВопрос пользователя направляется как на вход языковой модели, так и в векторную базу данных - для нахождения наиболее близких по смыслу чанков текста.\n\nВ Prompt Template формируется промт - содержащий вопрос пользователя и извлеченную информацию из векторной БД.\n\nПромпт является входным запросом в языковую модель - Input Message\n\nОтвет языковой модели необходимо предобработать в блоке Parser и далее выдать пользователю.\n", "display_name": "", "documentation": "", "template": { "backgroundColor": "neutral" } }, "type": "note" }, "dragging": false, "id": "note-qgsZx", "measured": { "height": 335, "width": 574 }, "position": { "x": -1500.3240693625273, "y": 926.9572384274281 }, "selected": false, "type": "noteNode" }, { "data": { "id": "note-f0Ort", "node": { "description": "2. ШАГ. RAG", "display_name": "", "documentation": "", "template": { "backgroundColor": "transparent" } }, "type": "note" }, "dragging": false, "height": 374, "id": "note-f0Ort", "measured": { "height": 374, "width": 497 }, "position": { "x": -1509.8982288182913, "y": 873.0360358637404 }, "resizing": false, "selected": false, "type": "noteNode", "width": 497 }, { "data": { "id": "note-U0j07", "node": { "description": "1. ШАГ. Заполнение векторной БД", "display_name": "", "documentation": "", "template": { "backgroundColor": "transparent" } }, "type": "note" }, "dragging": false, "id": "note-U0j07", "measured": { "height": 324, "width": 324 }, "position": { "x": -1591.9700182214467, "y": 2107.730685230489 }, "selected": false, "type": "noteNode" } ], "viewport": { "x": 481.19871601999574, "y": -123.90157359157399, "zoom": 0.25852729630799876 } }, "description": "Perform basic prompting with an OpenAI model.", "endpoint_name": null, "id": "226c93b6-4bb4-431c-bf1f-6f350d43fad1", "is_component": false, "last_tested_version": "1.5.0.post2", "name": "RAG", "tags": [ "chatbots" ] }