diff --git a/docs/docs/guidelines/custom-component.mdx b/docs/docs/guidelines/custom-component.mdx
index e06775f2f..1c38d91bd 100644
--- a/docs/docs/guidelines/custom-component.mdx
+++ b/docs/docs/guidelines/custom-component.mdx
@@ -3,12 +3,16 @@ description: Custom Components
hide_table_of_contents: true
---
+import ZoomableImage from "/src/theme/ZoomableImage.js";
+
# Custom Components
A Custom Component has almost infinite possibilities. It can be a simple function that takes a string and returns a string,
or it can be a complex function that takes other components, calls APIs, and returns a custom object only you know how to use (which might not be ideal).
-Let's take a look at the basic rules, then we'll talk about the ones that are not so basic.
+The CustomComponent is a Python Class that has all the tools you need to create a custom component.
+
+Let's take a look at the basic rules and features, then we'll go over a more complex example.
## TL;DR
@@ -55,7 +59,7 @@ class BestComponent(CustomComponent):
## Rule 1
-The script must contain a **single class** that inherits from _`CustomComponent`_.
+The script must contain a **single Python class** that inherits from _`CustomComponent`_.
```python
# focus
@@ -351,6 +355,32 @@ We then instantiate a Tool and return it.
+In Langflow, the code will look like this:
+
+
+
+
+
+And our new component that builds a Tool from a Chain will look like this:
+
+
+
+
+
## FlowRunner Example
Now let's see how to create a component that runs other flows.
@@ -371,7 +401,7 @@ class MyComponent(CustomComponent):
```
-So, let's start by adding the _`display_name`_ and a _`description`_.
+This is the basic structure of a custom component.
---
@@ -393,19 +423,20 @@ class FlowRunner(CustomComponent):
```
-That's better.
+So, let's start by adding the _`display_name`_ and a _`description`_.
---
```python
from langflow.interface.custom.custom_component import CustomComponent
+# focus
from langchain.schema import Document
-# focus[6:16]
+
class FlowRunner(CustomComponent):
- # focus[19:35]
+
display_name = "Flow Runner"
- # focus[18:35]
+
description = "Run other flows"
def build_config(self):
@@ -437,7 +468,7 @@ class FlowRunner(CustomComponent):
```
-Let's add the parameters and the return type to the _`build`_ method.
+Let's add the [parameters](focus://11[20:55]) and the [return type](focus://11[60:69]) to the _`build`_ method.
---
@@ -445,21 +476,145 @@ Let's add the parameters and the return type to the _`build`_ method.
from langflow.interface.custom.custom_component import CustomComponent
from langchain.schema import Document
-# focus
+
class FlowRunner(CustomComponent):
- # focus
+
display_name = "Flow Runner"
- # focus
+
description = "Run other flows using a document as input."
def build_config(self):
...
def build(self, flow_name: str, document: Document) -> Document:
- ...
+ # focus
+ # List the flows
+ # focus
+ flows = self.list_flows()
```
---
+```python
+from langflow.interface.custom.custom_component import CustomComponent
+from langchain.schema import Document
+
+
+class FlowRunner(CustomComponent):
+
+ display_name = "Flow Runner"
+
+ description = "Run other flows using a document as input."
+
+ def build_config(self):
+ ...
+
+ def build(self, flow_name: str, document: Document) -> Document:
+ # List the flows
+ flows = self.list_flows()
+ # focus
+ # Get the flow that matches the selected name
+ # focus
+ flow = next(filter(lambda f: f.name == flow_name, flows))
+
+```
+
+With the _`list_flows`_ method we can get a list of all the flows in the collection.
+
+We can then get the flow that matches the selected name.
+
+---
+
+```python
+from langflow.interface.custom.custom_component import CustomComponent
+from langchain.schema import Document
+
+
+class FlowRunner(CustomComponent):
+
+ display_name = "Flow Runner"
+
+ description = "Run other flows using a document as input."
+
+ def build_config(self):
+ ...
+
+ def build(self, flow_name: str, document: Document) -> Document:
+ # List the flows
+ flows = self.list_flows()
+ # Get the flow that matches the selected name
+ flow = next(filter(lambda f: f.name == flow_name, flows))
+ # focus
+ # Load the flow
+ # focus
+ tweaks = {}
+ # focus
+ flow = self.load_flow(flow.id, tweaks)
+
+```
+
+---
+
+```python
+from langflow.interface.custom.custom_component import CustomComponent
+from langchain.schema import Document
+
+
+class FlowRunner(CustomComponent):
+
+ display_name = "Flow Runner"
+
+ description = "Run other flows using a document as input."
+
+ def build_config(self):
+ ...
+
+ def build(self, flow_name: str, document: Document) -> Document:
+ # List the flows
+ flows = self.list_flows()
+ # Get the flow that matches the selected name
+ flow = next(filter(lambda f: f.name == flow_name, flows))
+ # Load the flow
+ tweaks = {}
+ flow = self.load_flow(flow.id, tweaks)
+ # focus
+ # Get the page_content from the document
+ # focus
+ page_content = document.page_content
+```
+
+---
+
+```python
+from langflow.interface.custom.custom_component import CustomComponent
+from langchain.schema import Document
+
+
+class FlowRunner(CustomComponent):
+
+ display_name = "Flow Runner"
+
+ description = "Run other flows using a document as input."
+
+ def build_config(self):
+ ...
+
+ def build(self, flow_name: str, document: Document) -> Document:
+ # List the flows
+ flows = self.list_flows()
+ # Get the flow that matches the selected name
+ flow = next(filter(lambda f: f.name == flow_name, flows))
+ # Load the flow
+ tweaks = {}
+ flow = self.load_flow(flow.id, tweaks)
+ # Get the page_content from the document
+ page_content = document.page_content
+ # Use it in the flow
+ result = flow(page_content)
+ return Document(page_content=str(result))
+```
+
+---
+