Migrate Weaviate to CustomComponent (#1226)

This commit is contained in:
Gabriel Luiz Freitas Almeida 2023-12-19 16:23:36 -03:00 committed by GitHub
commit a42cacd140
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 81 additions and 2 deletions

View file

@ -0,0 +1,79 @@
import weaviate # type: ignore
from typing import Optional, Union
from langflow import CustomComponent
from langchain.vectorstores import Weaviate
from langchain.schema import Document
from langchain.vectorstores.base import VectorStore
from langchain.schema import BaseRetriever
from langchain.embeddings.base import Embeddings
class WeaviateVectorStore(CustomComponent):
display_name: str = "Weaviate"
description: str = "Implementation of Vector Store using Weaviate"
documentation = (
"https://python.langchain.com/docs/integrations/vectorstores/weaviate"
)
beta = True
field_config = {
"url": {"display_name": "Weaviate URL", "value": "http://localhost:8080"},
"api_key": { "display_name": "API Key", "password": True,"required": False, },
"index_name": {"display_name": "Index name","required": False,},
"text_key": {"display_name": "Text Key","required": False, "advanced": True, "value": "text"},
"documents": {"display_name": "Documents", "is_list": True},
"embedding": {"display_name": "Embedding"},
"attributes": {"display_name": "Attributes", "required": False, "is_list": True, "field_type": "str", "advanced": True},
"search_by_text": {"display_name": "Search By Text", "field_type": "bool", "advanced": True},
"code": {"show": False},
}
def build(
self,
url: str,
search_by_text: bool = False,
api_key: Optional[str] = None,
index_name: Optional[str] = None,
text_key: Optional[str] = "text",
embedding: Optional[Embeddings] = None,
documents: Optional[Document] = None,
attributes: Optional[list] = None,
) -> Union[VectorStore, BaseRetriever]:
if api_key:
auth_config = weaviate.AuthApiKey(api_key=api_key)
client = weaviate.Client(url=url, auth_client_secret=auth_config)
else:
client = weaviate.Client(url=url)
def _to_pascal_case(word: str):
if word and not word[0].isupper():
word = word.capitalize()
if word.isidentifier():
return word
word = word.replace("-", " ").replace("_", " ")
parts = word.split()
pascal_case_word = "".join([part.capitalize() for part in parts])
return pascal_case_word
index_name = _to_pascal_case(index_name) if index_name else None
if documents is not None and embedding is not None:
return Weaviate.from_documents(
client=client,
index_name=index_name,
documents=documents,
embedding=embedding,
by_text=search_by_text,
)
return Weaviate(
client=client,
index_name=index_name,
text_key=text_key,
embedding=embedding,
by_text=search_by_text,
attributes=attributes if attributes is not None else [],
)

View file

@ -270,8 +270,6 @@ vectorstores:
# documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma"
Qdrant:
documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/qdrant"
Weaviate:
documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/weaviate"
FAISS:
documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/faiss"
Pinecone:

View file

@ -129,6 +129,7 @@ import { NotionIcon } from "../icons/Notion";
import { OpenAiIcon } from "../icons/OpenAi";
import { PineconeIcon } from "../icons/Pinecone";
import { QDrantIcon } from "../icons/QDrant";
import { WeaviateIcon } from "../icons/Weaviate";
import { SearxIcon } from "../icons/Searx";
import { ShareIcon } from "../icons/Share";
import { Share2Icon } from "../icons/Share2";
@ -254,6 +255,7 @@ export const nodeIconsLucide: iconsType = {
OpenAIEmbeddings: OpenAiIcon,
Pinecone: PineconeIcon,
Qdrant: QDrantIcon,
Weaviate: WeaviateIcon,
Searx: SearxIcon,
SlackDirectoryLoader: SvgSlackIcon,
SupabaseVectorStore: SupabaseIcon,