From a43260fca8ad0fcf3c573aa7a3df8e0ced221e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Di=C3=B3genes=20Betat=20Roos?= Date: Thu, 17 Aug 2023 18:57:47 +0000 Subject: [PATCH 1/5] Add build folder to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3b6cfebbf..156f44394 100644 --- a/.gitignore +++ b/.gitignore @@ -253,3 +253,4 @@ langflow.db .docusaurus/ /tmp/* +src/backend/langflow/frontend/ From ff7c3c26ef480637f8656180609de104c21ec4b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Di=C3=B3genes=20Betat=20Roos?= Date: Thu, 17 Aug 2023 19:12:21 +0000 Subject: [PATCH 2/5] Migrate Chroma to Custom Component --- .../components/vectorstores/Chroma.py | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/backend/langflow/components/vectorstores/Chroma.py diff --git a/src/backend/langflow/components/vectorstores/Chroma.py b/src/backend/langflow/components/vectorstores/Chroma.py new file mode 100644 index 000000000..d064af80e --- /dev/null +++ b/src/backend/langflow/components/vectorstores/Chroma.py @@ -0,0 +1,69 @@ +from typing import Optional, Union +from langflow import CustomComponent + +from langchain.vectorstores import Chroma +from langchain.schema import Document +from langchain.vectorstores.base import VectorStore +from langchain.schema import BaseRetriever +from langchain.embeddings.base import Embeddings + + +class ChromaComponent(CustomComponent): + """ + A custom component for implementing a Vector Store using Chroma. + """ + + display_name: str = "Chroma (Custom Component)" + description: str = "Implementation of Vector Store using Chroma" + documentation = "https://python.langchain.com/docs/integrations/vectorstores/chroma" + beta = True + + def build_config(self): + """ + Builds the configuration for the component. + + Returns: + - dict: A dictionary containing the configuration options for the component. + """ + return { + "collection_name": {"display_name": "Collection Name", "value": "langflow"}, + "persist": {"display_name": "Persist"}, + "persist_directory": {"display_name": "Persist Directory"}, + "code": {"show": False, "display_name": "Code"}, + "documents": {"display_name": "Documents", "is_list": True}, + "embedding": {"display_name": "Embedding"}, + } + + def build( + self, + collection_name: str, + persist: bool, + persist_directory: Optional[str] = None, + embedding: Optional[Embeddings] = None, + documents: Optional[Document] = None, + ) -> Union[VectorStore, BaseRetriever]: + """ + Builds the Vector Store or BaseRetriever object. + + Args: + - collection_name (str): The name of the collection. + - persist_directory (Optional[str]): The directory to persist the Vector Store to. + - persist (bool): Whether to persist the Vector Store or not. + - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store. + - documents (Optional[Document]): The documents to use for the Vector Store. + + Returns: + - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object. + """ + # If documents, then we need to create a Chroma instance using .from_documents + if documents is not None and embedding is not None: + return Chroma.from_documents( + documents=documents, # type: ignore + persist_directory=persist_directory if persist else None, + collection_name=collection_name, + embedding=embedding, + ) + + return Chroma( + persist_directory=persist_directory, + ) From 5e7681ea09d83a849da6c26cbc57d3378e1db018 Mon Sep 17 00:00:00 2001 From: DiogenesBR Date: Fri, 18 Aug 2023 16:58:18 -0300 Subject: [PATCH 3/5] Add some new types to .gitattributes --- .gitattributes | 12 +++++- src/frontend/src/icons/Airbyte/airbyte.svg | 44 +++++++++++----------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/.gitattributes b/.gitattributes index b69d73e97..5957bfeff 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,14 +7,22 @@ *.h text *.py text *.js text -*.ts text *.jsx text +*.ts text +*.tsx text *.md text *.mdx text +*.svg text +*.yml text +*.yaml text +*.Dockerfile text # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary -*.jpg binary \ No newline at end of file +*.jpg binary +*.ico binary +*.gif binary +*.mp4 binary \ No newline at end of file diff --git a/src/frontend/src/icons/Airbyte/airbyte.svg b/src/frontend/src/icons/Airbyte/airbyte.svg index eefa1bceb..a7275179d 100644 --- a/src/frontend/src/icons/Airbyte/airbyte.svg +++ b/src/frontend/src/icons/Airbyte/airbyte.svg @@ -1,22 +1,22 @@ - - - - - - + + + + + + From 5fd3da010e244bad1ccf59b647ce8e8efc833a03 Mon Sep 17 00:00:00 2001 From: DiogenesBR Date: Fri, 18 Aug 2023 21:10:03 +0000 Subject: [PATCH 4/5] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20do=20ChromaComponen?= =?UTF-8?q?t=20adicionando=20campos=20que=20havia=20na=20vers=C3=A3o=20ant?= =?UTF-8?q?iga?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 6 +++ .../components/vectorstores/Chroma.py | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/Makefile b/Makefile index b1d42ff4e..c0c6a7abc 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,12 @@ install_frontendc: run_frontend: cd src/frontend && npm start +run_cli: + poetry run langflow --path src/frontend/build + +run_cli_debug: + poetry run langflow --path src/frontend/build --log-level debug + setup_devcontainer: make init make build_frontend diff --git a/src/backend/langflow/components/vectorstores/Chroma.py b/src/backend/langflow/components/vectorstores/Chroma.py index d064af80e..38e675d9d 100644 --- a/src/backend/langflow/components/vectorstores/Chroma.py +++ b/src/backend/langflow/components/vectorstores/Chroma.py @@ -6,6 +6,7 @@ from langchain.schema import Document from langchain.vectorstores.base import VectorStore from langchain.schema import BaseRetriever from langchain.embeddings.base import Embeddings +import chromadb class ChromaComponent(CustomComponent): @@ -32,15 +33,34 @@ class ChromaComponent(CustomComponent): "code": {"show": False, "display_name": "Code"}, "documents": {"display_name": "Documents", "is_list": True}, "embedding": {"display_name": "Embedding"}, + "chroma_server_cors_allow_origins": { + "display_name": "Server CORS Allow Origins", + "advanced": True, + }, + "chroma_server_host": {"display_name": "Server Host", "advanced": True}, + "chroma_server_port": {"display_name": "Server Port", "advanced": True}, + "chroma_server_grpc_port": { + "display_name": "Server gRPC Port", + "advanced": True, + }, + "chroma_server_ssl_enabled": { + "display_name": "Server SSL Enabled", + "advanced": True, + }, } def build( self, collection_name: str, persist: bool, + chroma_server_ssl_enabled: bool, persist_directory: Optional[str] = None, embedding: Optional[Embeddings] = None, documents: Optional[Document] = None, + chroma_server_cors_allow_origins: Optional[str] = None, + chroma_server_host: Optional[str] = None, + chroma_server_port: Optional[int] = None, + chroma_server_grpc_port: Optional[int] = None, ) -> Union[VectorStore, BaseRetriever]: """ Builds the Vector Store or BaseRetriever object. @@ -48,13 +68,32 @@ class ChromaComponent(CustomComponent): Args: - collection_name (str): The name of the collection. - persist_directory (Optional[str]): The directory to persist the Vector Store to. + - chroma_server_ssl_enabled (bool): Whether to enable SSL for the Chroma server. - persist (bool): Whether to persist the Vector Store or not. - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store. - documents (Optional[Document]): The documents to use for the Vector Store. + - chroma_server_cors_allow_origins (Optional[str]): The CORS allow origins for the Chroma server. + - chroma_server_host (Optional[str]): The host for the Chroma server. + - chroma_server_port (Optional[int]): The port for the Chroma server. + - chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server. Returns: - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object. """ + + # Chroma settings + chroma_settings = None + + if chroma_server_host is not None: + chroma_settings = chromadb.config.Settings( + chroma_server_cors_allow_origins=chroma_server_cors_allow_origins + or None, + chroma_server_host=chroma_server_host, + chroma_server_port=chroma_server_port or None, + chroma_server_grpc_port=chroma_server_grpc_port or None, + chroma_server_ssl_enabled=chroma_server_ssl_enabled, + ) + # If documents, then we need to create a Chroma instance using .from_documents if documents is not None and embedding is not None: return Chroma.from_documents( @@ -62,6 +101,7 @@ class ChromaComponent(CustomComponent): persist_directory=persist_directory if persist else None, collection_name=collection_name, embedding=embedding, + client_settings=chroma_settings, ) return Chroma( From f01658d521addb5c3f66ccd4b270814bb8e1da9e Mon Sep 17 00:00:00 2001 From: DiogenesBR Date: Tue, 22 Aug 2023 13:37:34 +0000 Subject: [PATCH 5/5] added client_settings tho the returned Chroma object --- .devcontainer/devcontainer.json | 3 +- .gitattributes | 1 + docker-compose.debug.yml | 66 +++++++++---------- .../components/vectorstores/Chroma.py | 2 +- 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index aed1ec954..5b8cab4c4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -30,7 +30,8 @@ "sourcery.sourcery", "eamodio.gitlens", "ms-vscode.makefile-tools", - "GitHub.vscode-pull-request-github" + "GitHub.vscode-pull-request-github", + "ms-azuretools.vscode-docker" ]} } diff --git a/.gitattributes b/.gitattributes index 5957bfeff..aa545d82f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16,6 +16,7 @@ *.yml text *.yaml text *.Dockerfile text +Dockerfile text # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf diff --git a/docker-compose.debug.yml b/docker-compose.debug.yml index 6a9802e38..c73ff2a60 100644 --- a/docker-compose.debug.yml +++ b/docker-compose.debug.yml @@ -1,33 +1,33 @@ -version: "3.4" - -services: - backend: - volumes: - - ./:/app - build: - context: ./ - dockerfile: ./dev.Dockerfile - command: - [ - "sh", - "-c", - "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn --factory src.backend.langflow.main:create_app --host 0.0.0.0 --port 7860 --reload", - ] - ports: - - 7860:7860 - - 5678:5678 - restart: on-failure - - frontend: - build: - context: ./src/frontend - dockerfile: ./dev.Dockerfile - args: - - BACKEND_URL=http://backend:7860 - ports: - - "3000:3000" - volumes: - - ./src/frontend/public:/home/node/app/public - - ./src/frontend/src:/home/node/app/src - - ./src/frontend/package.json:/home/node/app/package.json - restart: on-failure +version: "3.4" + +services: + backend: + volumes: + - ./:/app + build: + context: ./ + dockerfile: ./dev.Dockerfile + command: + [ + "sh", + "-c", + "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn --factory src.backend.langflow.main:create_app --host 0.0.0.0 --port 7860 --reload", + ] + ports: + - 7860:7860 + - 5678:5678 + restart: on-failure + + frontend: + build: + context: ./src/frontend + dockerfile: ./dev.Dockerfile + args: + - BACKEND_URL=http://backend:7860 + ports: + - "3000:3000" + volumes: + - ./src/frontend/public:/home/node/app/public + - ./src/frontend/src:/home/node/app/src + - ./src/frontend/package.json:/home/node/app/package.json + restart: on-failure diff --git a/src/backend/langflow/components/vectorstores/Chroma.py b/src/backend/langflow/components/vectorstores/Chroma.py index 38e675d9d..94d123fb4 100644 --- a/src/backend/langflow/components/vectorstores/Chroma.py +++ b/src/backend/langflow/components/vectorstores/Chroma.py @@ -105,5 +105,5 @@ class ChromaComponent(CustomComponent): ) return Chroma( - persist_directory=persist_directory, + persist_directory=persist_directory, client_settings=chroma_settings )