# How to build your Custom Component on LangFlow
### Step0: before getting started…
you need `poetry` → https://blog.kyomind.tw/python-poetry/
💡 **Poetry: Dependency Management for Python**
Poetry helps you declare, manage and install dependencies of Python projects
### Step1: READ CONTRIBUTING.md
[CONTRIBUTING.md](https://github.com/logspace-ai/langflow/blob/dev/CONTRIBUTING.md)
use `makefile` to build the project
```bash
backend:
make install_backend
ifeq ($(login),1)
@echo "Running backend without autologin";
poetry run langflow run --backend-only --port 7860 --host 0.0.0.0 --no-open-browser **--components-path src/backend/langflow/custom_components**
else
@echo "Running backend with autologin";
LANGFLOW_AUTO_LOGIN=True poetry run langflow run --backend-only --port 7860 --host 0.0.0.0 --no-open-browser **--components-path src/backend/langflow/custom_components**
endif
```
### Step2: Understand the folder structure
```bash
╭─ .../langflow/sr/backend
.
├── Dockerfile
└── langflow
├── __init__.py
├── __main__.py
├── alembic
├── alembic.ini
├── api
**├── components
│ ├── __init__.py
│ ├── agents
│ │ ├── OpenAIConversationalAgent.py
│ │ └── __init__.py
│ ├── chains
│ │ ├── PromptRunner.py
│ │ └── __init__.py
│ ├── embeddings
│ │ ├── AmazonBedrockEmbeddings.py
│ │ └── __init__.py
│ ├── llms
│ │ ├── AmazonBedrock.py
│ │ ├── BaiduQianfanChatEndpoints.py
│ │ ├── BaiduQianfanLLMEndpoints.py
│ │ ├── HuggingFaceEndpoints.py
│ │ └── __init__.py
│ ├── retrievers
│ │ ├── AmazonKendra.py
│ │ ├── MetalRetriever.py
│ │ └── __init__.py
│ ├── textsplitters
│ │ ├── LanguageRecursiveTextSplitter.py
│ │ ├── RecursiveCharacterTextSplitter.py
│ │ └── __init__.py
│ ├── toolkits
│ │ ├── Metaphor.py
│ │ └── __init__.py
│ ├── utilities
│ │ ├── GetRequest.py
│ │ ├── JSONDocumentBuilder.py
│ │ ├── PostRequest.py
│ │ └── UpdateRequest.py
│ └── vectorstores
│ ├── Chroma.py <-------------- Chroma as example
│ ├── Vectara.py
│ ├── __init__.py
│ └── pgvector.py**
├── **MY_CUSTOM_COMPONENTS. <-------------- Where you should put your code
...**
```
### Step3: Happy Coding
architecture
```python
from typing import Optional
from langflow import CustomComponent
from langchain.vectorstores.pgvector import PGVector
from langchain.schema import Document
from langchain.vectorstores.base import VectorStore
from langchain.embeddings.base import Embeddings
class PostgresqlVectorComponent(CustomComponent):
def build_config(self):
pass
def build(
self,
embedding: Embeddings,
pg_server_url: str,
collection_name: str,
documents: Optional[Document] = None,
) -> VectorStore:
pass
```
Example:
```python
from typing import Optional
from langflow import CustomComponent
from langchain.vectorstores.pgvector import PGVector
from langchain.schema import Document
from langchain.vectorstores.base import VectorStore
from langchain.embeddings.base import Embeddings
class PostgresqlVectorComponent(CustomComponent):
"""
A custom component for implementing a Vector Store using PostgreSQL.
"""
display_name: str = "PostgreSQL Vector Store"
description: str = "Implementation of Vector Store using PostgreSQL"
documentation = "https://python.langchain.com/docs/integrations/vectorstores/pgvector"
beta = True
def build_config(self):
"""
Builds the configuration for the component.
Returns:
- dict: A dictionary containing the configuration options for the component.
"""
return {
"index_name": {"display_name": "Index Name", "value": "your_index"},
"code": {"show": True, "display_name": "Code"},
"documents": {"display_name": "Documents", "is_list": True},
"embedding": {"display_name": "Embedding"},
"pg_server_url": {
"display_name": "PostgreSQL Server Connection String",
"advanced": False,
},
"collection_name": {"display_name": "Table", "advanced": False},
}
def build(
self,
embedding: Embeddings,
pg_server_url: str,
collection_name: str,
documents: Optional[Document] = None,
) -> **VectorStore**:
"""
Builds the Vector Store or BaseRetriever object.
Args:
- embedding (Embeddings): The embeddings to use for the Vector Store.
- documents (Optional[Document]): The documents to use for the Vector Store.
- collection_name (str): The name of the PG table.
- pg_server_url (str): The URL for the PG server.
Returns:
- VectorStore: The Vector Store object.
"""
return PGVector.from_documents(
embedding=embedding,
documents=documents,
collection_name=collection_name,
connection_string=pg_server_url,
)
```
### PG as an example
1. LangChain PG Doc : https://python.langchain.com/docs/integrations/vectorstores/pgvector
2. PG Client Doc : https://github.com/pgvector/pgvector-python
3. PG Vector Doc : https://github.com/pgvector/pgvector
### Step4: Load Custom Compoents
https://docs.langflow.org/guidelines/custom-component#loading-custom-components
**My practice :** use `makefile` to build the project
```bash
backend:
make install_backend
ifeq ($(login),1)
@echo "Running backend without autologin";
poetry run langflow run --backend-only --port 7860 --host 0.0.0.0 --no-open-browser **--components-path src/backend/langflow/custom_components**
else
@echo "Running backend with autologin";
LANGFLOW_AUTO_LOGIN=True poetry run langflow run --backend-only --port 7860 --host 0.0.0.0 --no-open-browser **--components-path src/backend/langflow/custom_components**
endif
```