Tai Truong
fix readme
d202ada
import weaviate
from langchain_community.vectorstores import Weaviate
from langflow.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
from langflow.helpers.data import docs_to_data
from langflow.io import BoolInput, DataInput, HandleInput, IntInput, MultilineInput, SecretStrInput, StrInput
from langflow.schema import Data
class WeaviateVectorStoreComponent(LCVectorStoreComponent):
display_name = "Weaviate"
description = "Weaviate Vector Store with search capabilities"
documentation = "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/weaviate"
name = "Weaviate"
icon = "Weaviate"
inputs = [
StrInput(name="url", display_name="Weaviate URL", value="http://localhost:8080", required=True),
SecretStrInput(name="api_key", display_name="API Key", required=False),
StrInput(
name="index_name",
display_name="Index Name",
required=True,
info="Requires capitalized index name.",
),
StrInput(name="text_key", display_name="Text Key", value="text", advanced=True),
MultilineInput(name="search_query", display_name="Search Query"),
DataInput(
name="ingest_data",
display_name="Ingest Data",
is_list=True,
),
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
IntInput(
name="number_of_results",
display_name="Number of Results",
info="Number of results to return.",
value=4,
advanced=True,
),
BoolInput(name="search_by_text", display_name="Search By Text", advanced=True),
]
@check_cached_vector_store
def build_vector_store(self) -> Weaviate:
if self.api_key:
auth_config = weaviate.AuthApiKey(api_key=self.api_key)
client = weaviate.Client(url=self.url, auth_client_secret=auth_config)
else:
client = weaviate.Client(url=self.url)
if self.index_name != self.index_name.capitalize():
msg = f"Weaviate requires the index name to be capitalized. Use: {self.index_name.capitalize()}"
raise ValueError(msg)
documents = []
for _input in self.ingest_data or []:
if isinstance(_input, Data):
documents.append(_input.to_lc_document())
else:
documents.append(_input)
if documents and self.embedding:
return Weaviate.from_documents(
client=client,
index_name=self.index_name,
documents=documents,
embedding=self.embedding,
by_text=self.search_by_text,
)
return Weaviate(
client=client,
index_name=self.index_name,
text_key=self.text_key,
embedding=self.embedding,
by_text=self.search_by_text,
)
def search_documents(self) -> list[Data]:
vector_store = self.build_vector_store()
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
docs = vector_store.similarity_search(
query=self.search_query,
k=self.number_of_results,
)
data = docs_to_data(docs)
self.status = data
return data
return []