diff --git a/.devcontainer/demo/devcontainer.json b/.devcontainer/demo/devcontainer.json
index 0fb998b81..be82d885d 100644
--- a/.devcontainer/demo/devcontainer.json
+++ b/.devcontainer/demo/devcontainer.json
@@ -3,7 +3,7 @@
{
"name": "Langflow Demo Container",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
- "image": "mcr.microsoft.com/devcontainers/python:3.10",
+ "image": "mcr.microsoft.com/devcontainers/python:1-3.10-bullseye",
"features": {
"ghcr.io/devcontainers/features/aws-cli:1": {},
"ghcr.io/devcontainers/features/docker-in-docker": {},
@@ -16,7 +16,8 @@
"GitHub.copilot",
"ms-python.python",
"eamodio.gitlens",
- "GitHub.vscode-pull-request-github"
+ "GitHub.vscode-pull-request-github",
+ "ms-azuretools.vscode-docker"
]
}
},
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 90966fb38..9842679fa 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -15,26 +15,26 @@
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
- "postCreateCommand": "make install_frontend && make install_backend",
+ "postCreateCommand": "make setup_devcontainer",
"containerEnv": {
"POETRY_VIRTUALENVS_IN_PROJECT": "true"
},
// Configure tool-specific properties.
- "customizations": {
- "vscode": {
+ "customizations": {
+ "vscode": {
"extensions": [
- "actboy168.tasks",
- "GitHub.copilot",
- "ms-python.python",
- "sourcery.sourcery",
- "eamodio.gitlens",
- "ms-vscode.makefile-tools",
- "GitHub.vscode-pull-request-github"
- ]
- }
- }
+ "actboy168.tasks",
+ "GitHub.copilot",
+ "ms-python.python",
+ "sourcery.sourcery",
+ "eamodio.gitlens",
+ "ms-vscode.makefile-tools",
+ "GitHub.vscode-pull-request-github",
+ "ms-azuretools.vscode-docker"
+ ]}
+ }
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
diff --git a/.gitattributes b/.gitattributes
index b69d73e97..aa545d82f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -7,14 +7,23 @@
*.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
+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/.gitignore b/.gitignore
index 3b6cfebbf..156f44394 100644
--- a/.gitignore
+++ b/.gitignore
@@ -253,3 +253,4 @@ langflow.db
.docusaurus/
/tmp/*
+src/backend/langflow/frontend/
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/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
new file mode 100644
index 000000000..94d123fb4
--- /dev/null
+++ b/src/backend/langflow/components/vectorstores/Chroma.py
@@ -0,0 +1,109 @@
+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
+import chromadb
+
+
+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"},
+ "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.
+
+ 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(
+ documents=documents, # type: ignore
+ persist_directory=persist_directory if persist else None,
+ collection_name=collection_name,
+ embedding=embedding,
+ client_settings=chroma_settings,
+ )
+
+ return Chroma(
+ persist_directory=persist_directory, client_settings=chroma_settings
+ )
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 @@
-
-
-
+
+
+