Problema com Conectores de Saída ao Criar Text Splitters no Módulo Experimental
Bug Description
Recentemente, identifiquei um erro ao criar text splitters utilizando o módulo Experimental do Langflow. Esse problema afeta os conectores de saída, onde apenas os conectores existentes em versões anteriores do Langflow continuam funcionando corretamente. Os conectores recém-criados exibem comportamento alterado e não conseguem se conectar com outros componentes. Especificamente, o conector de saída (Data) fica com a cor rosa e exibe a mensagem de que não há componentes compatíveis disponíveis.
Exemplo Visual:
Na imagem acima:
Conector Superior: Criado em versões anteriores do Langflow, funcionando normalmente. Conector Inferior: Criado na versão mais recente (1.0.18), não consegue se conectar com nenhum outro componente na saída "Data".
Informações Adicionais:
Versão do Langflow: 1.0.18
Ambiente:
- Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-44-generic x86_64)
- Docker version 27.2.1, build 9e34c9b
- Docker Compose version v2.29.1
- Imagens Docker:
- python:3.12-slim (pip install langflow) - Python Version: 3.12.3
- postgres:16
Reproduction
- Acesse o módulo Experimental do Langflow.
- Crie um novo text splitter.
- Tente conectar a saída (Data) desse text splitter a outro conector existente.
Expected behavior
Comportamento Esperado: Os conectores recém-criados devem se comportar de maneira semelhante aos conectores de versões anteriores, permitindo conexões com outros componentes sem apresentar erros visuais ou mensagens de incompatibilidade.
Comportamento Atual: Os conectores novos apresentam a saída (Data) na cor rosa e indicam que não há componentes compatíveis, impedindo a conexão com outros conectores.
Who can help?
No response
Operating System
Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-44-generic x86_64)
Langflow Version
1.0.18
Python Version
3.12
Screenshot
No response
Flow File
No response
Para resolver o problema com os conectores de saída ao criar text splitters no módulo Experimental do Langflow versão 1.0.18, você precisa garantir que o tipo de saída do método split_text na classe SplitTextComponent esteja corretamente definido e seja compatível com outros componentes.
Aqui está o trecho relevante do código:
def split_text(self) -> List[Data]:
separator = unescape_string(self.separator)
documents = []
for _input in self.data_inputs:
if isinstance(_input, Data):
documents.append(_input.to_lc_document())
splitter = CharacterTextSplitter(
chunk_overlap=self.chunk_overlap,
chunk_size=self.chunk_size,
separator=separator,
)
docs = splitter.split_documents(documents)
data = self._docs_to_data(docs)
self.status = data
return data
Certifique-se de que os componentes aos quais você está tentando conectar a saída "Data" possam aceitar List[Data] como entrada. Se não puderem, você pode precisar ajustar o tipo de saída do text splitter ou o tipo de entrada dos outros componentes para garantir a compatibilidade.
Além disso, verifique se a classe SplitTextComponent está corretamente definida com as entradas e saídas apropriadas. Aqui está a definição completa da classe para referência:
from typing import List
from langchain_text_splitters import CharacterTextSplitter
from langflow.custom import Component
from langflow.io import HandleInput, IntInput, MessageTextInput, Output
from langflow.schema import Data
from langflow.utils.util import unescape_string
class SplitTextComponent(Component):
display_name: str = "Split Text"
description: str = "Split text into chunks based on specified criteria."
icon = "scissors-line-dashed"
name = "SplitText"
inputs = [
HandleInput(
name="data_inputs",
display_name="Data Inputs",
info="The data to split.",
input_types=["Data"],
is_list=True,
),
IntInput(
name="chunk_overlap",
display_name="Chunk Overlap",
info="Number of characters to overlap between chunks.",
value=200,
),
IntInput(
name="chunk_size",
display_name="Chunk Size",
info="The maximum number of characters in each chunk.",
value=1000,
),
MessageTextInput(
name="separator",
display_name="Separator",
info="The character to split on. Defaults to newline.",
value="\n",
),
]
outputs = [
Output(display_name="Chunks", name="chunks", method="split_text"),
]
def _docs_to_data(self, docs):
data = []
for doc in docs:
data.append(Data(text=doc.page_content, data=doc.metadata))
return data
def split_text(self) -> List[Data]:
separator = unescape_string(self.separator)
documents = []
for _input in self.data_inputs:
if isinstance(_input, Data):
documents.append(_input.to_lc_document())
splitter = CharacterTextSplitter(
chunk_overlap=self.chunk_overlap,
chunk_size=self.chunk_size,
separator=separator,
)
docs = splitter.split_documents(documents)
data = self._docs_to_data(docs)
self.status = data
return data
Certifique-se também de que a classe TextSplitterCreator esteja configurada corretamente para lidar com os tipos de text splitter. Aqui está a parte relevante da classe TextSplitterCreator:
from typing import Dict, List, Optional, Type
from langflow.interface.base import LangChainTypeCreator
from langflow.services.deps import get_settings_service
from langflow.template.frontend_node.textsplitters import TextSplittersFrontendNode
from langflow.interface.custom_lists import textsplitter_type_to_cls_dict
from loguru import logger
from langflow.utils.util import build_template_from_class
class TextSplitterCreator(LangChainTypeCreator):
type_name: str = "textsplitters"
@property
def frontend_node_class(self) -> Type[TextSplittersFrontendNode]:
return TextSplittersFrontendNode
@property
def type_to_loader_dict(self) -> Dict:
return textsplitter_type_to_cls_dict
def get_signature(self, name: str) -> Optional[Dict]:
"""Get the signature of a text splitter."""
try:
return build_template_from_class(name, textsplitter_type_to_cls_dict)
except ValueError as exc:
raise ValueError(f"Text Splitter {name} not found") from exc
except AttributeError as exc:
logger.error(f"Text Splitter {name} not loaded: {exc}")
return None
def to_list(self) -> List[str]:
settings_service = get_settings_service()
return [
textsplitter.__name__
for textsplitter in self.type_to_loader_dict.values()
if textsplitter.__name__ in settings_service.settings.TEXTSPLITTERS or settings_service.settings.DEV
]
textsplitter_creator = TextSplitterCreator()
Ao garantir que a classe SplitTextComponent e seus métodos estejam corretamente definidos e que os tipos de saída sejam compatíveis com outros componentes, você deve conseguir resolver o problema com o conector de saída "Data" [1][2][3][4].
To continue talking to Dosu, mention @dosu.
@moiraphill
Realizei o teste na versão 1.0.18 e está conectando e funcionando conforme esperado.
Consegue realizar novo teste?
stale
@moiraphill
Realizei o teste na versão 1.0.18 e está conectando e funcionando conforme esperado.
Consegue realizar novo teste?
Olá, realizei novo teste instalando diretamente com pip em um ambiente virtual python e eu continuo com o mesmo erro. No seu caso, você criou um novo workflow ou usou um workflow já criado ?
@moiraphill
Eu fiz o teste diretamente na branch 'main'.
Agora fiz o teste via 'pip' e realmente não está conectando.
Em breve sairá um novo release que irá corrigir isso na versão 'pip'.
In v1.0.18 I can't connect the character splitters with any vector store either. No error message. The color of the outputs is purple instead of red.
Hey @Banbury @moiraphill
The new version 1.0.19 has been released, and the issue has been fixed.
Consegue realizar novo teste?